网站首页 > 技术文章 正文
图像分类是计算机视觉的基础算法之一,是企业应用中最常见的算法,也是许多 CV 应用的重要组成部分。近年来,骨干网络模型发展迅速,ImageNet 的精度纪录被不断刷新。然而,这些模型在实用场景的表现有时却不尽如人意。一方面,精度高的模型往往体积大,运算慢,常常难以满足实际部署需求;另一方面,选择了合适的模型之后,往往还需要经验丰富的工程师进行调参,费时费力。PaddleClas 为了解决企业应用难题,让分类模型的训练和调参更加容易,总结推出了实用轻量图像分类解决方案(PULC, Practical Ultra Lightweight Classification)。PULC融合了骨干网络、数据增广、蒸馏等多种前沿算法,可以自动训练得到轻量且高精度的图像分类模型。
PULC 方案在人、车、OCR等方向的多个场景中均验证有效,用超轻量模型就可实现与 SwinTransformer 模型接近的精度,预测速度提高 40+ 倍。
方案主要包括 4 部分,分别是:PP-LCNet轻量级骨干网络、SSLD预训练权重、数据增强策略集成(EDA)和 SKL-UGI 知识蒸馏算法。
1、使用标准分类配置进行训练(骨干网络PP-LCNet),训练得到的模型精度对比如下表。
模型 | Tpr(%) | 延时(ms) | 存储(M) | 策略 |
SwinTranformer_tiny | 95.69 | 95.30 | 107 | 使用 ImageNet 预训练模型 |
MobileNetV3_small_x0_35 | 68.25 | 2.85 | 1.6 | 使用 ImageNet 预训练模型 |
PPLCNet_x1_0 | 89.57 | 2.12 | 6.5 | 使用 ImageNet 预训练模型 |
从中可以看出,PP-LCNet 的速度比 SwinTransformer 快很多,但是精度也略低。下面我们通过一系列优化来提高 PP-LCNet 模型的精度。
2、SSLD预训练权重
SSLD 是百度自研的半监督蒸馏算法,在 ImageNet 数据集上,模型精度可以提升 3-7 个点,使用SSLD预训练权重,可以有效提升应用分类模型的精度。此外,在训练中使用更小的分辨率,可以有效提升模型精度。同时,也对学习率进行了优化。 基于以上三点改进,训练得到模型精度为 92.1%,提升 2.6%。
3、 EDA数据增强策略
数据增强是视觉算法中常用的优化策略,可以对模型精度有明显提升。除了传统的 RandomCrop,RandomFlip 等方法之外,还应用了 RandomAugment 和 RandomErasing。 由于这两种数据增强对图片的修改较大,使分类任务变难,在一些小数据集上可能会导致模型欠拟合,将提前设置好这两种方法启用的概率。 基于以上改进,我们训练得到模型精度为 93.43%,提升 1.3%。
4、SKL-UGI模型蒸馏
模型蒸馏是一种可以有效提升小模型精度的方法,选择 ResNet101_vd 作为教师模型进行蒸馏。为了适应蒸馏过程,在此也对网络不同 stage 的学习率进行了调整。基于以上改进,训练得到模型精度为 95.6%,提升 1.4%。
总结
经过以上方法优化,PP-LCNet最终精度达到 95.6%,达到了大模型的精度水平。将实验结果总结如下表:
模型 | Tpr(%) | 延时(ms) | 存储(M) | 策略 |
SwinTranformer_tiny | 95.69 | 95.30 | 107 | 使用 ImageNet 预训练模型 |
MobileNetV3_small_x0_35 | 68.25 | 2.85 | 1.6 | 使用 ImageNet 预训练模型 |
PPLCNet_x1_0 | 89.57 | 2.12 | 6.5 | 使用 ImageNet 预训练模型 |
PPLCNet_x1_0 | 92.10 | 2.12 | 6.5 | 使用 SSLD 预训练模型 |
PPLCNet_x1_0 | 93.43 | 2.12 | 6.5 | 使用 SSLD 预训练模型+EDA 策略 |
PPLCNet_x1_0 | 95.60 | 2.12 | 6.5 | 使用 SSLD 预训练模型+EDA 策略+SKL-UGI 知识蒸馏策略 |
快速体验PULC
# 模型名称 模型简介
# person_exists PULC有人/无人分类模型
# person_attribute PULC人体属性识别模型
# safety_helmet PULC佩戴安全帽分类模型
# traffic_sign PULC交通标志分类模型
# vehicle_attribute PULC车辆属性识别模型
# car_exists PULC有车/无车分类模型
# text_image_orientation PULC含文字图像方向分类模型
# textline_orientation PULC文本行方向分类模型
# language_classification PULC语种分类模型
import paddleclas
import os
imgpath=["objects365_01780782.jpg","objects365_00001507.jpeg","objects365_00001521.jpeg"]
model=paddleclas.PaddleClas(model_name="person_exists")
result=model.predict(os.path.join("img",imgpath[0]))
#model.predict() 为可迭代对象(generator),因此需要使用 next() 函数或 for 循环对其迭代调用
for res in result:
print(res)
图一结果:[{'class_ids': [0], 'scores': [0.9955421243794262], 'label_names': ['nobody'], 'filename': 'img\\objects365_01780782.jpg'}]
图二结果:[{'class_ids': [1], 'scores': [0.99995756], 'label_names': ['someone'], 'filename': 'img\\objects365_00001507.jpeg'}]
图三结果:[{'class_ids': [0], 'scores': [0.9078112244606018], 'label_names': ['nobody'], 'filename': 'img\\objects365_00001521.jpeg'}]
图三中我们是可以看到人的,但预测结果是:nobody。这里看一下:有人和无人定义:如果某张图含有“人”的标签,且这个框的面积在整张图中的比例大于 10%,即认为该张图中含有人。
猜你喜欢
- 2024-12-17 AMD透露性能数据:锐龙7 8840U全面领先酷睿Ultra 7 155H
- 2024-12-17 田有文教授等:基于改进YOLOv8的田间复杂环境下蓝莓成熟度检测
- 2024-12-17 再升级!PP-OCRv4多场景平均精度提升5%!
- 2024-12-17 Google Meet 背景模糊功能 谷歌会议背景模糊
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)