【2020开发者高校青年班】华为云开发者AI青年班黑客松大赛——参赛方案和总结
赛事实践训练链接:华为云爱(AI)美食·美食图片分类
赛事介绍
美食数据包含10个类别,数据集共5000个图片,尺寸大小不一,类别分别均衡。需要自己划分训练集和验证集,竞赛数据来自真实的美食图片数据,包含中餐、西餐、甜点、粥类,每张图像中美食所占比例大于3/4,每张图片代表一类美食。 竞赛数据分为2个数据集:参赛选手可使用第1个数据集,第2个数据集作为评判用(参赛者不可见)。
主要思路
数据集划分
采用了8.5:1.5的比例将数据集划分为训练集和验证集
数据增强
对图片进行了一定的旋转处理()和尺寸处理,这里计算了一下所有照片的均值,方差 mean std = [0.6736, 0.5654, 0.4031],[0.1994, 0.2248, 0.2528],具体代码如下:
normalize = transforms.Normalize([0.6736, 0.5654, 0.4031],[0.1994, 0.2248, 0.2528]) train_transformer_ImageNet = transforms.Compose([ transforms.Resize((size,size)), transforms.RandomHorizontalFlip(), transforms.RandomAffine(degrees=3, translate=(0.05, 0.05), scale=(0.95, 1.05)), transforms.ToTensor(), normalize ]) val_transformer_ImageNet = transforms.Compose([ transforms.Resize((size,size)), #transforms.CenterCrop(224), transforms.ToTensor(), normalize ])
3.划分数据集和基础的图像预处理
色彩抖动,图像中有一个比较大的难点是背景干扰,在实际工程中为了消除图像在不同背景中存在的差异性,通常会做一些色彩抖动操作,扩充数据集合。色彩抖动主要是在图像的颜色方面做增强,主要调整的是图像的亮度,饱和度和对比度。工程中不是任何数据集都适用,通常如果不同背景的图像较多,加入色彩抖动操作会有很好的提升。
def randomColor(image, saturation=0, brightness=0, contrast=0, sharpness=0): if random.random() < saturation: random_factor = np.random.randint(0, 31) / 10. # 随机因子 image = ImageEnhance.Color(image).enhance(random_factor) # 调整图像的饱和度 if random.random() < brightness: random_factor = np.random.randint(10, 21) / 10. # 随机因子 image = ImageEnhance.Brightness(image).enhance(random_factor) # 调整图像的亮度 if random.random() < contrast: random_factor = np.random.randint(10, 21) / 10. # 随机因1子 image = ImageEnhance.Contrast(image).enhance(random_factor) # 调整图像对比度 if random.random() < sharpness: random_factor = np.random.randint(0, 31) / 10. # 随机因子 ImageEnhance.Sharpness(image).enhance(random_factor) # 调整图像锐度 return image
4.batch_size
一般设为8、16、32、64、128、256等2的幂次值,batch_size越小,梯度下降方向变化越大,可能导致训练不收敛,batch_size越大,梯度下降方向越稳,但是有如下几个缺点:
(1) 所需的内存和显存都越大,有可能撑爆机器;
(2) 由于计算好大一批数据才进行一次梯度下降,会导致达到相同精度所需的训练时间变长;
batch_size一般不影响最终精度,主要影响训练速度,每次做不同的训练任务,应该去尝试、总结合适的batch_size值,最后跑该类任务时就固定使用该batch_size=16
5. 预训练模型的选择
考虑到时间和精力的问题,在保证训练效果不错的基础上,将原有的resnet50神经网络结构训练模型换成了resnet101
6.学习率衰减调整
使用ReduceLROnPlateau学习调度器,如果三个epoch准确率没有提升,则减少学习率
exp_lr_scheduler = lr_scheduler.ReduceLROnPlateau(optimizer_ft,mode='max',patience=3,verbose=True)
7.通过训练中的实际情况对epochs做了点适当的微调以及推理文件的微调
最后模型性能
单模型,验证集上best acc为96.933%,提交到modelarts上,测试集的acc为98%。
后期进行修改后,使用多模型融合,提交到modelarts上,测试集的acc为99%。
附件里给大家分享了一个我用PyTorch写的baseline,结构很简单,方便大家学习,而且改进了运行时间,单模型跑下来只有25分钟左右,而且识别正确率很高!!
- 点赞
- 收藏
- 关注作者
评论(0)