前几天去银座买水果,忽然注意到,商品放到秤上后,就可以自动识别出产品品类,感觉很是神奇,仔细看了看,发现在屏幕下方有个摄像头。嗯~这个思路确实很棒。再想到最近听朋友说,飞桨AI Studio每天都送A币,那还不赶快去试试。
本次分享主要通过飞桨PaddleX进行商品图片品类识别,复现之前购物场景,这里简化了下,使用手上要吃的水果代表商品。
产品图片如下:
1.jpg 鸭梨
2.jpg 红富士
3.jpg 金帅
测试图片:
单个识别
多个识别
前置准备
- 注册并登录百度AI Studio。
- 熟悉飞桨相关知识。
- 项目:组织代码或者低代码的工程。
- 应用:部署后的工程,一般可以通过API方式进行访问。
- 产线:PaddleX特有概念,指包括从数据准备到模型训练、模型评估、模型部署的完整模型生产流程。在AI Studio云端,PaddleX模型产线以项目/模板项目的形式呈现。
- 特征底库:机器学习中的名词,通过增加打了标签的自定义数据集,影响模型结果。
操作过程
本次分享属于商品识别场景,所以PaddleX 产线选择图片识别,对应通用图像识别系统PP-ShiTuV2。
建立项目
新建项目
登录AI Studio后,按照下图,选择Notebook项目。
如下图,录入项目名称,并选择VS CodeIDE(非必须,单纯因为最近我习惯VS Code的操作了)。
创建成功后跳转到项目详情页面。
启动项目
启动项目,选择免费的运行环境。
免费的配置较低,运行任务会较慢,如果大家有算力卡余额,可以选择更高配置。
但是注意PaddlePaddle环境需要选择对应的GPU版本进行安装。
启动后可以进入到开发环境,整体界面和VS Code相当接近,这样我们使用起来更加顺畅。
左侧直接接入的有Baidu Comate智能助手,可以直接使用。
搭建环境
和VS Code快捷键一样,调出终端,通过以下命令安装环境。
# paddle cpu版本
python -m pip install paddlepaddle==3.0.0b2 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/
# paddlex
pip install paddlex==3.0.0b2 --user
安装paddlex如果不增加--user,则会出现如下错误:
ERROR: Could not install packages due to an OSError: [Errno 13] Permission denied: 'RECORD'
Consider using the --user option or check the permissions.
注意事项:
- python使用3.8-3.10(本地搭建的话需要注意,线上环境默认满足)
- 根据前面选择的运行环境选择paddlepaddle版本
- paddlepaddle和paddlex版本尽量保持一致(未经过大量反例验证)
快速体验
本次分享的所有代码都在主文件夹/home/aistudio中,该章节直接使用最基本的示例代码体验下。
下载示例索引库。
wget https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/index.tar
tar -xf index.tar
执行后,会在主文件夹下生成index文件夹,如下。
新建脚本
新建hello.py。
from paddlex import create_pipeline
# 创建通用图像识别系统PP-ShiTuV2产线
pipeline = create_pipeline(pipeline="PP-ShiTuV2")
# 加载要预测的图片和上一步下载的索引库
output = pipeline.predict("https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/drink_demo_image.jpeg", index='./index')
for res in output:
res.print()
res.save_to_img("/home/aistudio/output/")
运行结果
运行结果如下:
输出的结果图片:
可以看到识别结果为“依云天然矿泉水”,因为演示索引中没有测试数据(康师傅矿物质水)这个产品。但是由于演示索引中有类似产品(依云天然矿泉水),所以出现了错误识别。
如果直接使用我们的测试图片,连标记框(红框)都不会有,因为没有苹果产品和类似产品。
接下来,我们会通过自定义特征底库让模型可以识别我们的产品。
运行过程中,以下两点警告和错误不影响结果。
UserWarning: No ccache found是一个加速编译工具,缺少也没有问题。Please use PaddlePaddle with GPU version.应该是推荐使用GPU版本,不影响运行。
特征底库(自定义产品)
建立产品文件
新建dataset文件夹,其中gallery上传所有图片,gallery.txt放置图片标注文件。
文件结构如下:
构建自定义特征底库。
新建main.py。
from paddlex import create_pipeline
# 创建通用图像识别系统PP-ShiTuV2产线
pipeline = create_pipeline(pipeline="PP-ShiTuV2")
# gallery_imgs:底库图片根目录, gallery_label:标注文件
index_data = pipeline.build_index(gallery_imgs="/home/aistudio/dataset/", gallery_label="/home/aistudio/dataset/gallery.txt")
# 保存特征底库
index_data.save("shuiguo_index")
上述脚本会在主文件夹下新建shuiguo_index目录,存放根据自定义产品生成的索引。
特征底库的操作(引申)
PaddleX 提供了简单的特征底库调整命令,drink_dataset_v2.0是示例中的数据集。
- 添加图像到特征底库中,可以调用
append_index方法; - 删除索引则可以调用
remove_index方法。
pipeline = create_pipeline("PP-ShiTuV2")
# 构建
index_data = pipeline.build_index(gallery_imgs="./drink_dataset_v2.0/", gallery_label="./drink_dataset_v2.0/gallery.txt", index_type="Flat")
index_data.save("drink_index_base")
# 增加
index_data = pipeline.append_index(gallery_imgs="./drink_dataset_v2.0/", gallery_label="./drink_dataset_v2.0/kangshifu.txt", index="drink_index_base")
index_data.save("drink_index_add")
# 删除
index_data = pipeline.remove_index(remove_ids="./drink_dataset_v2.0/remove_ids.txt", index="drink_index_add")
index_data.save("drink_index_del")
识别
此时,main.py完整代码如下,使用自己构建的特征底库进行识别。
from paddlex import create_pipeline
# 创建通用图像识别系统PP-ShiTuV2产线
pipeline = create_pipeline(pipeline="PP-ShiTuV2")
# gallery_imgs:底库图片根目录, gallery_label:标注文件
index_data = pipeline.build_index(gallery_imgs="/home/aistudio/dataset/", gallery_label="/home/aistudio/dataset/gallery.txt")
# 保存特征底库
index_data.save("shuiguo_index")
# 加载要预测的图片和本地索引库
output = pipeline.predict("/home/aistudio/dataset/gallery/00.jpg", index='shuiguo_index')
for res in output:
res.print()
res.save_to_img("/home/aistudio/output/")
运行结果如下:
最终效果
单个商品识别效果:
多个商品识别效果:
总结
整体体验挺不错的,操作简单,代码易懂,比我以前使用paddlepaddle时,方便了许多。
之后再研究下,好像应用可以免费发布为外网可访问的服务,这对于平时的小需求来说,可以太好用了。