计算机系统应用教程网站

网站首页 > 技术文章 正文

109.人工智能——PULC超轻量级图像分类方案

btikc 2024-12-17 11:32:40 技术文章 26 ℃ 0 评论

图像分类是计算机视觉的基础算法之一,是企业应用中最常见的算法,也是许多 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%,即认为该张图中含有人。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表