目录
1. 前言
2. MobileNet v2实现的茶叶病害分类
2.1 数据集
2.2 训练
2.3 训练结果
2.4 推理
3. 下载
1. 前言
MobileNet v2是一种卷积神经网络架构,专为高效的移动和嵌入式视觉应用而设计。它是MobileNet v1的升级版本,广泛用于图像分类、对象检测和语义分割等任务。
MobileNet v2的主要目标是在保持模型的效率和小尺寸的同时提供更好的准确性。它通过各种架构改进来实现这一点。一个关键的改进是使用瓶颈残差块,它由1x1和3x3深度可分离卷积的组合组成。这些块降低了计算成本,同时保留了模型的表示能力。
另一个改进是添加了线性瓶颈,它将线性激活函数应用于瓶颈层,而不是传统的非线性激活。这减少了模型中的参数数量,同时仍然保持了良好的性能。
MobileNet v2还引入了一种称为反向残差的功能,该功能使用残差连接来提高模型的表示能力。此功能允许更好的信息流,并增强了模型学习复杂特征的能力。
总体而言,MobileNet v2在准确性和效率之间提供了良好的权衡,使其非常适合智能手机和嵌入式系统等资源受限的设备。它已被广泛应用于各种应用中,并已被证明在现实世界中是有效的。
MobileNet V1不足:residual 残差模块的使用对网络的梯度更新很有帮助,可以加速网络的训练,以至于residual模块几乎成为了深度网络的标配。
因此,基于残差模块的优点,MobileNet V1 的第一个缺点就是没有引入residual block
其次很重要的是,经过实验证明,大部分训练出来的MobileNet V1里面的depthwise模块权重为零。这样不仅仅浪费了部分的资源,并且MobileNet V1本身参数量就很少, 权重为大部分为零对网络本身的性能也有影响。
并且,ReLU函数小于零的抑制性也会减少网络的参数。关于这部分的相关解释,因为depthwise深度卷积是单个2维的卷积核对单个channel进行卷积,所以可能忽略了空间尺度(channel)的信息。因为正常的卷积是3维的,这样包括了channel的信息,这样就类似于线性网络分类图像忽略了像素点的空间信息一样
关于MobileNet v2论文详细介绍:
MobileNet V2 图像分类_mobilenetv2 cifar10-CSDN博客
其中,MobileNet v2 网络结构如下:
2. MobileNet v2实现的茶叶病害分类
MobileNet v2实现的model部分代码如下面所示,这里如果采用官方预训练权重的话,会自动导入官方提供的最新版本的权重
mobilenet_v2(weights=m.MobileNet_V2_Weights.DEFAULT if weights else False,progress=True)
2.1 数据集
数据集文件如下:
标签如下:代码会自动生成
{"0": "Anthracnose","1": "algal leaf","2": "bird eye spot","3": "brown blight","4": "gray light","5": "healthy","6": "red leaf spot","7": "white spot"
}
其中,训练集的总数为623,验证集的总数为262
2.2 训练
训练的参数如下:
parser.add_argument("--model", default='mobileNet v2', type=str, help='mobileNet v2')parser.add_argument("--pretrained", default=True, type=bool) # 采用官方权重parser.add_argument("--freeze_layers", default=True, type=bool) # 冻结权重parser.add_argument("--batch-size", default=32, type=int)parser.add_argument("--epochs", default=100, type=int)parser.add_argument("--optim", default='SGD', type=str,help='SGD,Adam,AdamW') # 优化器选择parser.add_argument('--lr', default=0.01, type=float)parser.add_argument('--lrf',default=0.001,type=float) # 最终学习率 = lr * lrfparser.add_argument('--save_ret', default='runs', type=str) # 保存结果parser.add_argument('--data_train',default='./data/train',type=str) # 训练集路径parser.add_argument('--data_val',default='./data/val',type=str) # 测试集路径
网络分类的个数不需要指定,摆放好数据集后,代码会根据数据集自动生成!
2.3 训练结果
所有的结果都保存在 save_ret 目录下,这里是 runs :
weights 下有最好和最后的权重,在训练完成后控制台会打印最好的epoch
这里只展示部分结果:
训练日志:
"epoch:99": {"train info": {"accuracy": 0.8876404494239544,"Anthracnose": {"Precision": 0.8772,"Recall": 0.7143,"Specificity": 0.9873,"F1 score": 0.7874},"algal leaf": {"Precision": 0.9306,"Recall": 0.8375,"Specificity": 0.9908,"F1 score": 0.8816},"bird eye spot": {"Precision": 0.7174,"Recall": 0.9429,"Specificity": 0.953,"F1 score": 0.8148},"brown blight": {"Precision": 0.9079,"Recall": 0.8625,"Specificity": 0.9871,"F1 score": 0.8846},"gray light": {"Precision": 0.9032,"Recall": 0.8,"Specificity": 0.9892,"F1 score": 0.8485},"healthy": {"Precision": 1.0,"Recall": 1.0,"Specificity": 1.0,"F1 score": 1.0},"red leaf spot": {"Precision": 0.9902,"Recall": 1.0,"Specificity": 0.9981,"F1 score": 0.9951},"white spot": {"Precision": 0.8364,"Recall": 0.92,"Specificity": 0.9656,"F1 score": 0.8762},"mean precision": 0.8953625,"mean recall": 0.8846499999999999,"mean specificity": 0.9838875,"mean f1 score": 0.8860250000000001},"valid info": {"accuracy": 0.8053435114196433,"Anthracnose": {"Precision": 0.8889,"Recall": 0.5333,"Specificity": 0.9914,"F1 score": 0.6666},"algal leaf": {"Precision": 0.9231,"Recall": 0.7273,"Specificity": 0.9913,"F1 score": 0.8136},"bird eye spot": {"Precision": 0.7222,"Recall": 0.8667,"Specificity": 0.9569,"F1 score": 0.7879},"brown blight": {"Precision": 0.7742,"Recall": 0.7273,"Specificity": 0.9694,"F1 score": 0.75},"gray light": {"Precision": 0.6389,"Recall": 0.7667,"Specificity": 0.944,"F1 score": 0.697},"healthy": {"Precision": 1.0,"Recall": 0.9545,"Specificity": 1.0,"F1 score": 0.9767},"red leaf spot": {"Precision": 0.9762,"Recall": 0.9762,"Specificity": 0.9955,"F1 score": 0.9762},"white spot": {"Precision": 0.6923,"Recall": 0.8571,"Specificity": 0.9273,"F1 score": 0.7659},"mean precision": 0.8269750000000001,"mean recall": 0.8011375,"mean specificity": 0.9719749999999999,"mean f1 score": 0.8042374999999999}}
训练集和测试集的混淆矩阵:
2.4 推理
推理是指没有标签,只有图片数据的情况下对数据的预测,这里直接运行predict脚本即可
需要把待推理的数据放在 inference/img 下
3. 下载
关于本项目代码和数据集、训练结果的下载:
MobileNetV2网络实现的计算机视觉大项目:8种常见茶叶病害种类识别资源-CSDN文库
关于图像分类网络的改进可以参考:
改进系列_Ai 医学图像分割的博客-CSDN博客
图像分类网络改进_Ai 医学图像分割的博客-CSDN博客