当前位置: 首页 > news >正文

毕设分享 基于人工智能的图像分类算法研究与实现

文章目录

  • 0 简介
  • 1 常用的分类网络介绍
    • 1.1 CNN
    • 1.2 VGG
    • 1.3 GoogleNet
  • 2 图像分类部分代码实现
    • 2.1 环境依赖
    • 2.2 需要导入的包
    • 2.3 参数设置(路径,图像尺寸,数据集分割比例)
    • 2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)
    • 2.5 数据预处理
    • 2.6 训练分类模型
    • 2.7 模型训练效果
    • 2.8 模型性能评估
  • 3 1000种图像分类

0 简介

Hi,同学们好,今天学长想大家介绍基于人工智能的图像分类技术,涉及到的知识有:深度学习,opencv,卷积神经网络。

🧿选题指导, 项目分享:见文末

1 常用的分类网络介绍

1.1 CNN

传统CNN包含卷积层、全连接层等组件,并采用softmax多类别分类器和多类交叉熵损失函数。如下图:

  • 卷积层(convolution layer): 执行卷积操作提取底层到高层的特征,发掘出图片局部关联性质和空间不变性质。

  • 池化层(pooling layer): 执行降采样操作。通过取卷积输出特征图中局部区块的最大值(max-pooling)或者均值(avg-pooling)。降采样也是图像处理中常见的一种操作,可以过滤掉一些不重要的高频信息。

  • 全连接层(fully-connected layer,或者fc layer): 输入层到隐藏层的神经元是全部连接的。

  • 非线性变化: 卷积层、全连接层后面一般都会接非线性变化层,例如Sigmoid、Tanh、ReLu等来增强网络的表达能力,在CNN里最常使用的为ReLu激活函数。

  • Dropout : 在模型训练阶段随机让一些隐层节点权重不工作,提高网络的泛化能力,一定程度上防止过拟合

在CNN的训练过程总,由于每一层的参数都是不断更新的,会导致下一次输入分布发生变化,这样就需要在训练过程中花费时间去设计参数。在后续提出的BN算法中,由于每一层都做了归一化处理,使得每一层的分布相对稳定,而且实验证明该算法加速了模型的收敛过程,所以被广泛应用到较深的模型中。

1.2 VGG

VGG 模型是由牛津大学提出的(19层网络),该模型的特点是加宽加深了网络结构,核心是五组卷积操作,每两组之间做Max-Pooling空间降维。同一组内采用多次连续的3X3卷积,卷积核的数目由较浅组的64增多到最深组的512,同一组内的卷积核数目是一样的。卷积之后接两层全连接层,之后是分类层。该模型由于每组内卷积层的不同主要分为 11、13、16、19 这几种模型

增加网络深度和宽度,也就意味着巨量的参数,而巨量参数容易产生过拟合,也会大大增加计算量。

1.3 GoogleNet

GoogleNet模型由多组Inception模块组成,模型设计借鉴了NIN的一些思想.

NIN模型特点:

    1. 引入了多层感知卷积网络(Multi-Layer Perceptron Convolution, MLPconv)代替一层线性卷积网络。MLPconv是一个微小的多层卷积网络,即在线性卷积后面增加若干层1x1的卷积,这样可以提取出高度非线性特征。
  • 2)设计最后一层卷积层包含类别维度大小的特征图,然后采用全局均值池化(Avg-Pooling)替代全连接层,得到类别维度大小的向量,再进行分类。这种替代全连接层的方式有利于减少参数。

Inception 结构的主要思路是怎样用密集成分来近似最优的局部稀疏结构。

2 图像分类部分代码实现

2.1 环境依赖

python3.7jupyter-notebook:6.0.3cudatoolkit10.0.130cudnn7.6.5tensorflow-gpu2.0.0scikit-learn0.22.1numpy cv2 matplotlib

2.2 需要导入的包

importosimportcv2importnumpyasnpimportpandasaspdimporttensorflowastffromtensorflowimportkerasfromtensorflow.kerasimportlayers,modelsfromtensorflow.keras.modelsimportSequentialfromtensorflow.keras.optimizersimportAdamfromtensorflow.keras.callbacksimportCallbackfromtensorflow.keras.utilsimportto_categoricalfromtensorflow.keras.applicationsimportVGG19fromtensorflow.keras.modelsimportload_modelimportmatplotlib.pyplotaspltfromsklearn.preprocessingimportlabel_binarize tf.compat.v1.disable_eager_execution()os.environ['CUDA_VISIBLE_DEVICES']='0'#使用GPU

2.3 参数设置(路径,图像尺寸,数据集分割比例)

preprocessedFolder='.\\ClassificationData\\'#预处理文件夹outModelFileName=".\\outModelFileName\\"ImageWidth=512ImageHeight=320ImageNumChannels=3TrainingPercent=70#训练集比例ValidationPercent=15#验证集比例

2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)

defread_dl_classifier_data_set(preprocessedFolder):num=0# 图片的总数量cnt_class=0#图片所属的类别label_list=[]# 存放每个图像的label,图像的类别img_list=[]#存放图片数据fordirectoryinos.listdir(preprocessedFolder):tmp_dir=preprocessedFolder+directory cnt_class+=1forimageinos.listdir(tmp_dir):num+=1tmp_img_filepath=tmp_dir+'\\'+image im=cv2.imread(tmp_img_filepath)# numpy.ndarrayim=cv2.resize(im,(ImageWidth,ImageHeight))# 重新设置图片的大小img_list.append(im)label_list.append(cnt_class)# 在标签中添加类别print("Picture "+str(num)+"Load "+tmp_img_filepath+"successfully")print("共有"+str(num)+"张图片")print("all"+str(num)+"picturs belong to "+str(cnt_class)+"classes")returnnp.array(img_list),np.array(label_list)all_data,all_label=read_dl_classifier_data_set(preprocessedFolder)

2.5 数据预处理

图像数据压缩, 标签数据进行独立热编码one-hot

defpreprocess_dl_Image(all_data,all_label):all_data=all_data.astype("float32")/255#把图像灰度值压缩到0--1.0便于神经网络训练all_label=to_categorical(all_label)#对标签数据进行独立热编码returnall_data,all_label all_data,all_label=preprocess_dl_Image(all_data,all_label)#处理后的数据

对数据及进行划分(训练集:验证集:测试集 = 0.7:0.15:0.15)

defsplit_dl_classifier_data_set(all_data,all_label,TrainingPercent,ValidationPercent):s=np.arange(all_data.shape[0])np.random.shuffle(s)#随机打乱顺序all_data=all_data[s]#打乱后的图像数据all_label=all_label[s]#打乱后的标签数据all_len=all_data.shape[0]train_len=int(all_len*TrainingPercent/100)#训练集长度valadation_len=int(all_len*ValidationPercent/100)#验证集长度temp_len=train_len+valadation_len train_data,train_label=all_data[0:train_len,:,:,:],all_label[0:train_len,:]#训练集valadation_data,valadation_label=all_data[train_len:temp_len,:,:,:],all_label[train_len:temp_len,:]#验证集test_data,test_label=all_data[temp_len:,:,:,:],all_label[temp_len:,:]#测试集returntrain_data,train_label,valadation_data,valadation_label,test_data,test_label train_data,train_label,valadation_data,valadation_label,test_data,test_label=split_dl_classifier_data_set(all_data,all_label,TrainingPercent,ValidationPercent)

2.6 训练分类模型

  • 使用迁移学习(基于VGG19)
  • epochs = 30
  • batch_size = 16
  • 使用 keras.callbacks.EarlyStopping 提前结束训练
deftrain_classifier(train_data,train_label,valadation_data,valadation_label,lr=1e-4):conv_base=VGG19(weights='imagenet',include_top=False,input_shape=(ImageHeight,ImageWidth,3))model=models.Sequential()model.add(conv_base)model.add(layers.Flatten())model.add(layers.Dense(30,activation='relu'))model.add(layers.Dense(6,activation='softmax'))#Dense: 全连接层。activation: 激励函数,‘linear’一般用在回归任务的输出层,而‘softmax’一般用在分类任务的输出层conv_base.trainable=Falsemodel.compile(loss='categorical_crossentropy',#loss: 拟合损失方法,这里用到了多分类损失函数交叉熵optimizer=Adam(lr=lr),#optimizer: 优化器,梯度下降的优化方法 #rmspropmetrics=['accuracy'])model.summary()#每个层中的输出形状和参数。early_stoping=tf.keras.callbacks.EarlyStopping(monitor="val_loss",min_delta=0,patience=5,verbose=0,baseline=None,restore_best_weights=True)history=model.fit(train_data,train_label,batch_size=16,#更新梯度的批数据的大小 iteration = epochs / batch_size,epochs=30,# 迭代次数validation_data=(valadation_data,valadation_label),# 验证集callbacks=[early_stoping])returnmodel,history model,history=train_classifier(train_data,train_label,valadation_data,valadation_label,)

2.7 模型训练效果

defplot_history(history):history_df=pd.DataFrame(history.history)history_df[['loss','val_loss']].plot()plt.title('Train and valadation loss')history_df=pd.DataFrame(history.history)history_df[['accuracy','val_accuracy']].plot()plt.title('Train and valadation accuracy')plot_history(history)

2.8 模型性能评估

  • 使用测试集进行评估
  • 输出分类报告和混淆矩阵
  • 绘制ROC和AUC曲线
fromsklearn.metricsimportclassification_reportfromsklearn.metricsimportconfusion_matrixfromsklearn.metricsimportaccuracy_scoreimportseabornassns Y_pred_tta=model.predict_classes(test_data)#模型对测试集数据进行预测Y_test=[np.argmax(one_hot)forone_hotintest_label]# 由one-hot转换为普通np数组Y_pred_tta=model.predict_classes(test_data)#模型对测试集进行预测Y_test=[np.argmax(one_hot)forone_hotintest_label]# 由one-hot转换为普通np数组print('验证集分类报告:\n',classification_report(Y_test,Y_pred_tta))confusion_mc=confusion_matrix(Y_test,Y_pred_tta)#混淆矩阵df_cm=pd.DataFrame(confusion_mc)plt.figure(figsize=(10,7))sns.heatmap(df_cm,annot=True,cmap="BuPu",linewidths=1.0,fmt="d")plt.title('PipeLine accuracy:{0:.3f}'.format(accuracy_score(Y_test,Y_pred_tta)),fontsize=20)plt.ylabel('True label',fontsize=20)plt.xlabel('Predicted label',fontsize=20)

fromsklearn.metricsimportprecision_recall_curvefromsklearn.metricsimportaverage_precision_scorefromsklearn.metricsimportroc_curvefromsklearnimportmetricsimportmatplotlibasmpl# 计算属于各个类别的概率,返回值的shape = [n_samples, n_classes]y_score=model.predict_proba(test_data)# 1、调用函数计算验证集的AUCprint('调用函数auc:',metrics.roc_auc_score(test_label,y_score,average='micro'))# 2、手动计算验证集的AUC#首先将矩阵test_label和y_score展开,然后计算假正例率FPR和真正例率TPRfpr,tpr,thresholds=metrics.roc_curve(test_label.ravel(),y_score.ravel())auc=metrics.auc(fpr,tpr)print('手动计算auc:',auc)mpl.rcParams['font.sans-serif']=u'SimHei'mpl.rcParams['axes.unicode_minus']=False#FPR就是横坐标,TPR就是纵坐标plt.figure(figsize=(10,7))plt.plot(fpr,tpr,c='r',lw=2,alpha=0.7,label=u'AUC=%.3f'%auc)plt.plot((0,1),(0,1),c='#808080',lw=1,ls='--',alpha=0.7)plt.xlim((-0.01,1.02))plt.ylim((-0.01,1.02))plt.xticks(np.arange(0,1.1,0.1))plt.yticks(np.arange(0,1.1,0.1))plt.xlabel('False Positive Rate',fontsize=16)plt.ylabel('True Positive Rate',fontsize=16)plt.grid(b=True,ls=':')plt.legend(loc='lower right',fancybox=True,framealpha=0.8,fontsize=12)plt.title('37个验证集分类后的ROC和AUC',fontsize=18)plt.show()

3 1000种图像分类

这是学长训练的能识别1000种类目标的图像分类模型,演示效果如下

🧿 项目分享:大家可自取用于参考学习,获取方式见文末!

http://www.jsqmd.com/news/143747/

相关文章:

  • Open-AutoGLM macOS配置避坑大全(专家级优化技巧首次公开)
  • 2025别墅岩板品牌TOP5权威推荐:天然vs人造/耐污vs普通怎么选? - mypinpai
  • 百度自研PaddlePaddle为何能成为国产深度学习标杆?
  • Open-AutoGLM网页怎么用(新手必看教程):从入门到精通的完整路径
  • PaddlePaddle游戏NPC对话生成系统
  • 2025年度实验型过滤洗涤干燥三合一设备厂家排行榜 - myqiye
  • 2025年推荐恒温槽厂家排名,不错的恒温槽工厂全解析 - 工业推荐榜
  • PaddlePaddle镜像支持ONNX导出吗?模型转换实测分享
  • 探索式测试:在面试中展现批判性思维的七维策略
  • 【大模型开发者必看】:Open-AutoGLM独立后5大关键技术红利全解析
  • 2025年靠谱数字展厅建设排行榜,新测评精选盛世笔特公司推荐 - 工业品牌热点
  • 测试用例设计终极指南:等价类、边界值与错误猜测的深层逻辑
  • 为什么顶尖团队都在关注Open-AutoGLM?揭秘其架构设计的三大黑科技
  • 接口管理工具Apifox在测试工作流中的角色定位
  • Open-AutoGLM Python代码报错怎么办:3步快速定位并解决异常问题
  • 【光子AI】提示词:开发一个类似 Notion 这样的 AI 写作平台,但是要超过 Notion (在 MultiAgent 体系、智能提示词生成、写作 Plan-Execute 智能工作流生成等)
  • AI开发者必看:PaddlePaddle镜像如何提升研发效率
  • 视觉AI测试工具应用:从Airtest到SikuliX的深度思考
  • 2025继续教育必备!9个降AI率工具测评榜单
  • 【深度解读】可视化拆解AIIData数据中台白皮书
  • vue 表格 vxe-table 树结构实现单元格复制粘贴功能,实现树层级节点复制功能
  • PaddlePaddle保险条款解读AI助手
  • 用AI生成高覆盖率的测试用例
  • 如何用Open-AutoGLM实现零代码AI建模?工业级案例详解
  • 企业级AI开发首选:PaddlePaddle镜像带来的效率革命
  • 生物制药VS食品加工:中试冻干机功能选配的“行业定制术” - 品牌推荐大师
  • PaddlePaddle影视剧本生成AI模型
  • 2025 MBA必备!10个AI论文工具深度测评与推荐
  • 为什么选择PaddlePaddle镜像?中文NLP与CV任务的最佳实践
  • 2025工业分散机实力厂商TOP5权威推荐:聚焦技术创新与效能突破 - mypinpai