【2020开发者高校青年班】华为云开发者AI青年班黑客松大赛——参赛方案和总结

举报
Jack20 发表于 2020/07/04 15:11:09 2020/07/04
【摘要】 华为云开发者AI青年班黑客松大赛——参赛方案和总结,采用pytorch框架,应用ModelArts的Notebook进行开发

赛事实践训练链接:华为云爱(AI)美食·美食图片分类

赛事介绍 

美食数据包含10个类别,数据集共5000个图片,尺寸大小不一,类别分别均衡。需要自己划分训练集和验证集,竞赛数据来自真实的美食图片数据,包含中餐、西餐、甜点、粥类,每张图像中美食所占比例大于3/4,每张图片代表一类美食。  竞赛数据分为2个数据集:参赛选手可使用第1个数据集,第2个数据集作为评判用(参赛者不可见)。

主要思路

  1. 数据集划分

        采用了8.5:1.5的比例将数据集划分为训练集和验证集

  2. 数据增强
    对图片进行了一定的旋转处理()和尺寸处理,这里计算了一下所有照片的均值,方差 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
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。