第7章:基于EfficientNet v2网络实现的迁移学习图像分类任务:人体皮肤病识别
目录
1. 前言
2. EfficientNet v2
3. 人体皮肤病识别
3.1 数据集
3.2 训练
3.3 训练结果
3.4 推理
4. 下载
1. 前言
针对EfficientNet V1 ,作者提出了以下的三个缺点
当训练图像的size很大时,网络中传递的特征图尺寸就会很大,这样训练就会慢得多。当降低了图像的尺寸,可以使用更大的batch size,这对于BN层来说是更好的
浅层的dw卷积速度很慢,这里采用Fuse-MBConv卷积
超参数按照相同的比例,改变网络深度或者宽度效果不是那么好
关于EfficientNet v1版本的分类任务:第5章:基于EfficientNet 网络实现的图像分类任务:104种花种类识别-CSDN博客
2. EfficientNet v2
最重要的是渐进的学习方法吧,根据体系的尺寸动态的正则化
对于不同的图像大小保持相同的正则化并不理想:对于相同的网络,较小的图像大小导致较小的网络容量,因此需要弱正则化;反之亦然,较大的图像尺寸需要更强的正则化来对抗过拟合。
我们提出了一种改进的渐进式学习方法:在早期训练阶段,我们用小图像大小和弱正则化(例如,dropout和数据增强)训练网络,然后我们逐渐增加图像大小并添加更强的正则化。建立在逐步调整大小的基础上,但通过动态调整正则化,我们的方法可以在不导致准确性下降的情况下加速训练。
3. 人体皮肤病识别
EfficientNet v2实现的model部分代码如下面所示,这里如果采用官方预训练权重的话,会自动导入官方提供的最新版本的权重
这里提供了三种网络结构,分别对应efficientnet v2的 small、medium、lagrge
net = m.efficientnet_v2_s(weights=m.EfficientNet_V2_S_Weights.DEFAULT if weights else False,progress=True)
net = m.efficientnet_v2_m(weights=m.EfficientNet_V2_M_Weights.DEFAULT if weights else False,progress=True)
net = m.efficientnet_v2_l(weights=m.EfficientNet_V2_L_Weights.DEFAULT if weights else False,progress=True)
3.1 数据集
数据集文件如下:
标签如下:
{
"0": "Actinic keratosis",
"1": "Basal cell carcinoma",
"2": "Benign keratosis",
"3": "Dermatofibroma",
"4": "Melanoma",
"5": "None of the above",
"6": "Squamous cell carcinoma",
"7": "Vascular lesion"
}
其中,训练集的总数为17736,验证集的总数为7595
3.2 训练
训练的参数如下:
parser = argparse.ArgumentParser(description="classification")
parser.add_argument("--model", default='s', type=str,help='s,m,l')
parser.add_argument("--pretrained", default=True, type=bool) # 采用官方权重
parser.add_argument("--freeze_layers", default=True, type=bool) # 冻结权重
parser.add_argument("--batch-size", default=16, type=int)
parser.add_argument("--epochs", default=50, 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 * lrf
parser.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) # 测试集路径
网络分类的个数不需要指定,摆放好数据集后,代码会根据数据集自动生成!
网络模型信息如下:
"train parameters": {
"model": "s",
"pretrained": true,
"freeze_layers": true,
"batch_size": 16,
"epochs": 50,
"optim": "SGD",
"lr": 0.01,
"lrf": 0.001,
"save_folder": "runs"
},
"dataset": {
"trainset number": 17736,
"valset number": 7595,
"number classes": 8
},
"model": {
"total parameters": 20187736.0,
"train parameters": 10248,
"flops": 2900665408.0
3.3 训练结果
所有的结果都保存在 save_ret 目录下,这里是 runs :
weights 下有最好和最后的权重,在训练完成后控制台会打印最好的epoch
这里只展示部分结果:
训练日志:
"epoch:42": {
"train info": {
"accuracy": 0.6573635543523583,
"Actinic keratosis": {
"Precision": 0.4215,
"Recall": 0.168,
"Specificity": 0.9918,
"F1 score": 0.2402
},
"Basal cell carcinoma": {
"Precision": 0.5685,
"Recall": 0.6691,
"Specificity": 0.9233,
"F1 score": 0.6147
},
"Benign keratosis": {
"Precision": 0.5133,
"Recall": 0.2515,
"Specificity": 0.9725,
"F1 score": 0.3376
},
"Dermatofibroma": {
"Precision": 0.5357,
"Recall": 0.0893,
"Specificity": 0.9993,
"F1 score": 0.1531
},
"Melanoma": {
"Precision": 0.5531,
"Recall": 0.3819,
"Specificity": 0.9329,
"F1 score": 0.4518
},
"None of the above": {
"Precision": 0.715,
"Recall": 0.9076,
"Specificity": 0.6263,
"F1 score": 0.7999
},
"Squamous cell carcinoma": {
"Precision": 0.5119,
"Recall": 0.0977,
"Specificity": 0.9976,
"F1 score": 0.1641
},
"Vascular lesion": {
"Precision": 0.7778,
"Recall": 0.5112,
"Specificity": 0.9985,
"F1 score": 0.6169
},
"mean precision": 0.5746,
"mean recall": 0.38453750000000003,
"mean specificity": 0.930275,
"mean f1 score": 0.4222874999999999
},
"valid info": {
"accuracy": 0.4501645819612243,
"Actinic keratosis": {
"Precision": 0.3115,
"Recall": 0.0731,
"Specificity": 0.9943,
"F1 score": 0.1184
},
"Basal cell carcinoma": {
"Precision": 0.144,
"Recall": 0.1044,
"Specificity": 0.9063,
"F1 score": 0.121
},
"Benign keratosis": {
"Precision": 0.1241,
"Recall": 0.0457,
"Specificity": 0.9627,
"F1 score": 0.0668
},
"Dermatofibroma": {
"Precision": 0.1429,
"Recall": 0.0141,
"Specificity": 0.9992,
"F1 score": 0.0257
},
"Melanoma": {
"Precision": 0.2386,
"Recall": 0.1195,
"Specificity": 0.9171,
"F1 score": 0.1592
},
"None of the above": {
"Precision": 0.5322,
"Recall": 0.7944,
"Specificity": 0.2775,
"F1 score": 0.6374
},
"Squamous cell carcinoma": {
"Precision": 0.3636,
"Recall": 0.0426,
"Specificity": 0.9981,
"F1 score": 0.0763
},
"Vascular lesion": {
"Precision": 0.4286,
"Recall": 0.28,
"Specificity": 0.9963,
"F1 score": 0.3387
},
"mean precision": 0.2856875,
"mean recall": 0.184225,
"mean specificity": 0.8814375,
"mean f1 score": 0.1929375
}
},
训练集和测试集的混淆矩阵:
3.4 推理
推理是指没有标签,只有图片数据的情况下对数据的预测,这里直接运行predict脚本即可
需要把待推理的数据放在 inference/img 下
4. 下载
关于本项目代码和数据集、训练结果的下载:基于EfficientNetv2轻量级网络实现的图像识别实战:8种人体常见皮肤病识别资源-CSDN文库
关于图像分类网络的改进可以参考:
改进系列_Ai 医学图像分割的博客-CSDN博客
图像分类网络改进_Ai 医学图像分割的博客-CSDN博客