【2020开发者高校青年班】华为云开发者AI青年班黑客松大赛——参赛方案和总结
【摘要】
华为云开发者AI青年班黑客松大赛——参赛方案和总结,采用pytorch框架,应用ModelArts的Notebook进行开发
赛事实践训练链接:华为云爱(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分钟左右,而且识别正确率很高!!
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
一舞魅倾城2020/07/15 08:15:501楼编辑删除举报