建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版-->
设置昵称

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

确定
我再想想
标签
您还可以添加5个标签
  • 没有搜索到和“关键字”相关的标签
  • 云产品
  • 解决方案
  • 技术领域
  • 通用技术
  • 平台功能
取消

Jack20

角色:成员

话题:6

发消息
发表于2020年05月12日 12:09:16 6622
直达本楼层的链接
楼主
显示全部楼层
[参赛经验分享] 【开发者高校青年班】华为云开发者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%。

举报
分享

分享文章到朋友圈

分享文章到微博

cloud dream

角色:成员

话题:1

发消息
发表于2020年05月12日 12:20:01
直达本楼层的链接
沙发
显示全部楼层

总结的非常棒,感谢大佬的分享。


点赞2 评论 引用 举报

l番薯加奶

角色:成员

话题:0

发消息
发表于2020年06月11日 17:05:10
直达本楼层的链接
板凳
显示全部楼层

干货帖!学习了!

点赞 评论 引用 举报

游客

富文本
Markdown
您需要登录后才可以回帖 登录 | 立即注册