PaddleClas预训练模型ResNet50_vd_ssld精度突破84%

Posted 飞桨PaddlePaddle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PaddleClas预训练模型ResNet50_vd_ssld精度突破84%相关的知识,希望对你有一定的参考价值。

提到“野生动物非法贸易“大家一定不陌生,根据国际刑警组织的研究估算,每年和野生动物相关的非法贸易额高达200亿美元,是仅次于毒品和军火的全球第三大犯罪。打开这个潘多拉盒子,我们会发现这条血腥的产业链已经通过互联网(社交媒体、电商平台)从线下黑市走到了线上,交易触点越来越多,打击难度越来越大。

2020年“世界地球日”,百度与国际爱护动物基金会联合发布全球首个利用人工智能技术打击野生动物制品非法贸易的平台“濒危物种 AI 守护官“,对互联网上的野生动物图片实时监控,协助相关部门及时发现犯罪隐患。

PaddleClas预训练模型ResNet50_vd_ssld精度突破84%

这一有温度的工具,得益于百度飞桨工业应用级图像分类套件PaddleClas的加持。 2020年4月,飞桨正式开源PaddleClas,包含23个系列的分类网络以及117个预训练模型和性能评估 ,从数据增广、骨干网络设计、损失定义、优化器设计、知识蒸馏、特征迁移学习等不同的角度对图像分类问题进行深入探索,助力图像分类技术的产业落地。无论是濒危动物保护、零售商品分类、眼疾识别还是农作物品质分级,从理想到现实,通过开源的PaddleClas,您都可以实现!
     
那么在飞桨开源框架1.8版本中, PaddleClas又有哪些新变化呢?
PaddleClas预训练模型ResNet50_vd_ssld精度突破84%
1.8版本中PaddleClas增强了 SSLD知识蒸馏方案 (SSLD,Simple Semi-supervised Label Distillation)。实验证明,使用更大尺度的图像数据(标准为224,这里修改为320)对ResNet50_vd_ssld模型进行微调,在ImageNet1k验证集上的精度可达到 84.0% 。当前 ResNet50_vd_ssld预训练模型已经开源 ,即使开发者的数据数据量比较少,通过模型Finetune,也可实现高精度的图像分类。Github地址:
https://github.com/PaddlePaddle/PaddleClas

那么,84.0%的ResNet50_vd_ssld模型精度,PaddleClas是如何实现的呢?

众所周知,在数据量足够大的情况下,通过合理构建网络模型的方式增加其参数量,是可以显著改善模型性能。但是模型复杂度越高,意味着计算量越大,不单需要大量的计算资源,还会影响推理速度,影响产业应用。

这时大家开始思考,是否可以在不影响模型精度的情况下,减少其规模?

PaddleClas预训练模型ResNet50_vd_ssld精度突破84%
目前学术界有几种模型压缩方法可以减小模型的参数量,如:知识蒸馏、裁剪、量化等。知识蒸馏是指使用教师模型(精度更高、泛化能力强、模型相对复杂)去指导学生模型(参数量小、模型相对简单)学习特定任务,保证小模型在参数量不变的情况下,得到比较大的性能提升,甚至获得与大模型相似的精度指标。在传统的蒸馏方案中,使用了一定的标签信息,数据扩充的成本较高。PaddleClas融合目前常用的蒸馏方法,提出了一种简单的 半监督标签知识蒸馏方案SSLD ,其一大特色就是 无需使用图像的真值标签,可以任意扩展训练集的大小 。实验证明,基于ImageNet1k分类数据集,使用SSLD蒸馏策略后,ResNet_vd和MobileNet系列模型上的精度均有超过3%的精度提升,如下图所示。


SSLD蒸馏原理




SSLD蒸馏原理实现如下图所示,其核心策略为:大数据集训练+ImageNet1k蒸馏Finetune。

PaddleClas预训练模型ResNet50_vd_ssld精度突破84%

第一步:引入ImageNet 22K数据集。将ImageNet 22k数据集与ImageNet 1k验证集进行去重,防止训练集中掺杂验证集图像。ImageNet 22K数据集中包含1400万张图片。

第二步:提取数据,生成训练集。依据Top-k数据选择方法从其中挑选出400万张图片,与ImageNet-1k训练集整合在一起,得到一个新的包含500万张图片的数据集。

第三步:计算网络的损失函数。将教师模型和学生模型输出的soft label计算JS散度,作为蒸馏模型的损失函数(在训练时,固定教师模型的参数)。

第四步:ImageNet1k蒸馏Finetune。由于引入了额外的ImageNet22k数据集,导致ImageNet 1K训练集和验证集的数据分布发生了变化。在模型蒸馏结束之后,需要在ImageNet1k数据集上进行模型微调,恢复训练集与验证集的数据分布一致性。

关于Top-k数据选择方法的介绍可参考:
https://github.com/PaddlePaddle/PaddleClas/blob/master/docs/zh_CN/advanced_tutorials/distillation/distillation.md

如此高精度的预训练模型,代码实现会不会很复杂呢?

PaddleClas预训练模型ResNet50_vd_ssld精度突破84%


手把手实践




对于开发者来说,获取足够大的数据集进行模型训练是件非常困难的事情。PaddleClas的ResNet50_vd_ssld预训练模型的好处就在于,只少量数据,通过直接加载预训练模型进行微调,也可以获得高精度指标。下面我们以ResNet50_vd_ssld在图像分类迁移学习的应用为例,手把手教你如何使用PaddleClas。

注意:本操作过程需要在GPU环境下运行(可以在百度AI Stuido蹭个GPU算力)

1. 安装飞桨(建议使用最新的1.8版本)。

2. 下载PaddleClas代码库并设置环境变量。

  
    
    
  
git  clone https://github.com/PaddlePaddle/PaddleClas.git
cd PaddleClas
export PYTHONPATH= $PWD: $PYTHONPATH

3. 下载预训练模型。为了验证模型精度提升效果,需要下载ResNet50_vd和ResNet50_vd_ssld两个预训练模型。

  
    
    
  
python tools/download.py -a ResNet50_vd -p ./pretrained -d  1
python tools/download.py -a ResNet50_vd_ssld_v2 -p ./pretrained -d  1

4. 下载并解压Flowers102数据集,大约300M左右。

  
    
    
  
cd dataset/flowers102
wget https://paddlemodels.bj.bcebos.com/flowers/102flowers.tgz
wget https://paddlemodels.bj.bcebos.com/flowers/imagelabels.mat
wget https://paddlemodels.bj.bcebos.com/flowers/setid.mat
tar -xf 102flowers.tgz

5. 制作数据标签文件并返回PaddleClas根目录。

  
    
    
  
python generate_flowers102_list.py jpg train > train_list.txt
python generate_flowers102_list.py jpg valid > val_list.txt
cd ../../

6. 对ResNet50_vd预训练模型进行微调。

  
    
    
  
export CUDA_VISIBLE_DEVICES=0
python -m paddle.distributed.launch 
    --selected_gpus= "0" 
    tools/train.py 
        -c ./configs/quick_start/ResNet50_vd_finetune.yaml

最终输出验证集精度(Top-1 Acc)为93.33%

PaddleClas预训练模型ResNet50_vd_ssld精度突破84%

7. 对ResNet50_vd_ssld预训练模型进行微调。

  
    
    
  
export CUDA_VISIBLE_DEVICES= 0
python -m paddle.distributed.launch 
    --selected_gpus= "0" 
    tools/train.py 
        -c ./configs/quick_start/ResNet50_vd_ssld_finetune.yaml 
    -o pretrained_model=. /pretrained/ResNet50_vd_ssld_v2_pretrained/

最终输出验证集精度为94.61%。

PaddleClas预训练模型ResNet50_vd_ssld精度突破84%

通过两个预训练模型在相同数据集的测试精度对比可以发现,在其参数相同的情况下, ResNet50_vd_ssld预训练模型精度可提升1.3%。 (说明:该数据集较小,因此在训练时,指标可能会有少许波动)。

实现过程是不是很简单,这就是1.8版本PaddleClas为小伙伴们开源的 ResNet50_vd_ssld预训练模型。

此外在目标检测任务上,飞桨提出了一种面向服务器端实用的目标检测方案PSS-DET(Practical Server Side Detection),它的图像分类部分应用了ResNet50_vd_ssld预训练模型。实验证明,基于COCO2017目标检测数据集,V100单卡预测速度为为61FPS时, COCO mAP可达41.6%; 预测速度为20FPS时, COCO mAP可达47.8%。

感兴趣的同学可以参考:
https://github.com/PaddlePaddle/PaddleDetection/blob/master/configs/rcnn_enhance/README.md

随着AI技术的不断成熟和算力的发展,越来越多的深度学习方案会走出实验室,实现产业应用,比如:垃圾分类、工业质检、眼疾筛查等等。你有想法,飞桨有技术,希望小伙伴们天马行空的创意能越来越多的在飞桨中实现。

Join us:飞桨为深度学习爱好者提供了多个实习生岗位,如果您具有图像处理、计算机视觉等科研背景,并愿意与飞桨携手,一起圆梦人工智能的未来,期待您的加入。


如在使用过程中有问题,可加入飞桨官方QQ群进行交流: 703252161

如果您想详细了解更多飞桨的相关内容,请参阅以下文档。

飞桨 PaddleClas 项目地址:
GitHub: https://github.com/PaddlePaddle/PaddleClas
Gitee: https://gitee.com/paddlepaddle/PaddleClas

PaddleClas文档地址:
https://paddleclas.readthedocs.io

30分钟玩转PaddleClas:
https://paddleclas.readthedocs.io/zh_CN/latest/tutorials/quick_start.html

PaddleClas 快速体验aistudio地址:
https://aistudio.baidu.com/aistudio/projectdetail/428501

官网地址:
https://www.paddlepaddle.org.cn

飞桨开源框架项目地址:
GitHub:
https://github.com/PaddlePaddle/Paddle
Gitee: 
https://gitee.com/paddlepaddle/Paddle

END


以上是关于PaddleClas预训练模型ResNet50_vd_ssld精度突破84%的主要内容,如果未能解决你的问题,请参考以下文章

为啥 SHAP 的 Deep Explainer 在 ResNet-50 预训练模型上失败?

手把手写深度学习(13):如何利用官方预训练模型做微调/迁移学习?(以Resnet50提取图像特征为例)

手把手写深度学习(14):如何利用官方预训练模型做微调/迁移学习?(以Resnet50提取图像特征为例)

23个系列分类网络,10万分类预训练模型,这是飞桨PaddleClas百宝箱

[Pytorch系列-43]:工具集 - torchvision预训练模型参数的导入(以ResNet为例)

Pytorch加载预训练模型前n层