PaddleClas初体验
该包是由百度PaddlePaddle组织下开源的项目,主要用于图像分类,图像搜索等相关任务。
项目地址:
- https://github.com/PaddlePaddle/PaddleClas
- https://pypi.org/project/paddleclas
主要构件:
- PP-ShiTu: 图像识别(包含图像检测与图像搜索)
- PULC:超轻量图像分类
PP-ShiTu
PP-ShiTu对原数据集进行了Gallery
库和Query
库划分,并生成了对应的Index
索引库,具体应用场景介绍和下载地址如下表所示。
类别 | 场景 | 场景简介 | Recall@1 | 场景库下载地址 | 原数据集下载地址 |
---|---|---|---|---|---|
动植物 | 花 | 104种花细分类识别 | 0.9788 | 104flowers | 原数据下载地址 |
动植物 | 蝴蝶 | 75种蝴蝶细分类识别 | 0.9360 | 下载地址 | 原数据下载地址 |
动植物 | 野外植物 | 32种野外植物识别,包括雏菊、蒲公英等 | 0.9758 | 下载地址 | 原数据下载地址 |
动植物 | 动物 | 90种动物识别,包括斑马、羚羊等 | 0.9078 | AnimalImageDataset | 原数据下载地址 |
动植物 | 狗识别 | 69种狗细分类识别,包括柴犬等 | 0.9606 | 下载地址 | 原数据下载地址 |
动植物 | 鸟类 | 400种各种姿态的鸟细分类识别 | 0.9673 | 下载地址 | 原数据下载地址 |
商品 | 坚果 | 10种坚果种类识别,包括开心果、核桃、腰果等 | 0.9412 | 下载地址 | 原数据下载地址 |
商品 | 蔬菜 | 116种蔬菜识别,包括菠菜、胡萝卜、玉米等 | 0.8929 | 下载地址 | 原数据下载地址 |
商品 | 时装 | 23种时尚商品识别,包括首饰、挎包、化妆品等 | 0.9555 | FashionProductImageSmall | 原数据下载地址 |
商品 | 鞋子 | 6种鞋子识别,包括靴子、足球鞋等 | 0.9000 | 下载地址 | 原数据下载地址 |
商品 | 乐器 | 30种不同乐器种类识别 | 0.9467 | 下载地址 | 原数据下载地址 |
商品 | 宝石 | 27种宝石识别,包括萤石、翡翠等 | 0.9653 | 下载地址 | 原数据下载地址 |
商品 | 球类 | 26种球型物体识别,包括弹珠、足球等 | 0.9769 | Balls | 原数据下载地址 |
交通 | 交通工具 | 9种交通工具粗分类识别,包括车、船等 | 0.9307 | Vechicles | 原数据下载地址 |
交通 | 船 | 6种船种类识别,包括游轮、帆船等 | 0.9242 | 下载地址 | 原数据下载地址 |
交通 | 航拍场景 | 30种航拍场景识别,如机场、火车站等 | 0.9797 | 下载地址 | 原数据下载地址 |
其他 | 巴黎建筑 | 11个巴黎建筑识别,如:巴黎铁塔、圣母院等 | 1.000 | 下载地址 | 原数据下载地址 |
其他 | 天气 | 10种天气场景识别,如:雨天、打雷、下雪等 | 0.9924 | 下载地址 | 原数据下载地址 |
其他 | 垃圾 | 12种垃圾分类识别 | 0.9845 | 下载地址 | 原数据下载地址 |
其他 | 运动种类 | 100种运动图像识别 | 0.9413 | 下载地址 | 原数据下载地址 |
其他 | 宝可梦 | 150种宝可梦神奇宝贝识别,包括皮卡丘、喷火龙等 | 0.9236 | 下载地址 | 原数据下载地址 |
实用案例
- 基于PP-ShiTuV2的生鲜品自助结算: 点击这里
- 基于PP-ShiTu 的智慧商超商品识别:点击这里
- 基于PP-ShiTu电梯内电瓶车入室识别:点击这里
PULC
模型名称 | 使用介绍 | 模型介绍 | 模型精度 | 模型大小 | 推理耗时 | 下载地址 |
---|---|---|---|---|---|---|
person_exists | PULC有人/无人分类 | 判断图片中是否有人 | 96.23 | 7.0M | 2.58ms | 推理模型 / 预训练模型 |
person_attribute | PULC人体属性识别 | 人体属性识别,可以识别行人性别、年龄、朝向、配饰、包、服装风格等 | 78.59 | 7.2M | 2.01ms | 推理模型 / 预训练模型 |
safety_helmet | PULC佩戴安全帽分类 | 判断图片中的人脸是否佩戴安全帽 | 99.38 | 7.1M | 2.03ms | 推理模型 / 预训练模型 |
traffic_sign | PULC交通标志分类 | 常见交通标志分类,共232类别 | 98.35 | 8.2M | 2.10ms | 推理模型 / 预训练模型 |
vehicle_attribute | PULC车辆属性识别 | 车辆属性识别,可以识别车辆的颜色和车型 | 90.81 | 7.2M | 2.36ms | 推理模型 / 预训练模型 |
car_exists | PULC有车/无车分类 | 判断图片中是否有车 | 95.92 | 7.1M | 2.38ms | 推理模型 / 预训练模型 |
text_image_orientation | PULC含文字图像方向分类 | 判断含文字的图片的方向,可以区分0度、90度、180度、270度 | 99.06 | 7.1M | 2.16ms | 推理模型 / 预训练模型 |
textline_orientation | PULC文本行方向分类 | 判断文本行的方向,可以区分0度、180度 | 96.01 | 7.0M | 2.72ms | 推理模型 / 预训练模型 |
language_classification | PULC语种分类 | 判断文本行的语种,可以区分10种常见的语种 | 99.26 | 7.1M | 2.58ms | 推理模型 / 预训练模型 |
table_attribute | PULC表格属性识别 | 表格属性识别,可以识别表格是否为拍照、表格数量、表格颜色、表格清晰度、表格有无干扰、表格角度6个属性 | 88.1 | 7.1M | 2.58ms | 推理模型 / 预训练模型 |
实用案例:
- 基于PULC人员出入视频管理: 点击这里
实践
这里主要使用PULC分类算法完成分类任务:
环境准备:
# GPU环境安装paddlepaddle
python3 -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
# CPU环境安装paddlepaddle
python3 -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
# 安装paddleclas
pip3 install paddleclas
- 使用公开的模型:
使用person_exists模型
import paddleclas
model = paddleclas.PaddleClas(model_name="person_exists")
result = model.predict(input_data="pulc_demo_imgs/person_exists/objects365_01780782.jpg")
print(next(result))
注意:
model.predict()
为可迭代对象(generator
),因此需要使用next()
函数或for
循环对其迭代调用。每次调用将以batch_size
为单位进行一次预测,并返回预测结果, 默认batch_size
为 1,如果需要更改batch_size
,实例化模型时,需要指定batch_size
,如model = paddleclas.PaddleClas(model_name="person_exists", batch_size=2)
, 使用默认的代码返回结果示例如下:
>>> result
[{'class_ids': [0], 'scores': [0.9955421453341842], 'label_names': ['nobody'], 'filename': 'pulc_demo_imgs/person_exists/objects365_01780782.jpg'}]
- 使用自训练的模型
训练过程可以参考官方项目的训练过程:https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5/docs/zh_CN/models/PULC/PULC_person_exists.md
这里讲解下如何将训练完成的模型文件按照上面的方式进行封装直接调用:
当模型训练好后并转化为infer模型后,如果想用上面的方式进行封装就需要有一些小的细节:
- 最好保持文件模型名称与官方公布的几个模型任务名称一致,或者是更改源码中的可支持的模型列表:
PaddleClas/paddleclas.py
中的PULC_MODELS
PULC_MODELS = [ "car_exists", "language_classification", "person_attribute", "person_exists", "safety_helmet", "text_image_orientation", "textline_orientation", "traffic_sign", "vehicle_attribute" ]
- 使用已转换好的infer文件替换掉对应的目录下的模型文件
- 官方下载的路径是
~/.paddleclas/inference_model/PULC/person_exists
- 官方下载的路径是
- 更改config文件以保证预测出的标签跟训练的config文件标签一致
condaenv-name/lib/python3.8/site-packages/paddleclas/deploy/configs/PULC/person_exists
然后就可以愉快的调用去以上述的方式调用,而不用封装delpoy/predict_cls.py
文件了:
import paddleclas
model = paddleclas.PaddleClas(model_name="person_exists")
result = model.predict(input_data="pulc_demo_imgs/person_exists/idcard.jpg")
print(next(result))
[{'class_ids': [0], 'scores': [0.9989118406083435], 'label_names': ['idcard'], 'filename': '.pulc_demo_imgs/person_exists/idcard.jpg'}]
可以看到虽然名称一致,但实现的功能和预期的一样,区分idcard及其他。
参考
- https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5/paddleclas.py
- https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5/docs/zh_CN/models/PULC/PULC_person_exists.md
- https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5/docs/zh_CN/models/PULC/PULC_text_image_orientation.md
- https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5/docs/zh_CN/training/PP-ShiTu/deep_hashing.md