百度飞桨PaddleX初探-自定义商品品类识别

543 阅读5分钟

前几天去银座买水果,忽然注意到,商品放到秤上后,就可以自动识别出产品品类,感觉很是神奇,仔细看了看,发现在屏幕下方有个摄像头。嗯~这个思路确实很棒。再想到最近听朋友说,飞桨AI Studio每天都送A币,那还不赶快去试试。

本次分享主要通过飞桨PaddleX进行商品图片品类识别,复现之前购物场景,这里简化了下,使用手上要吃的水果代表商品。

产品图片如下

1.jpg 鸭梨

1.jpg

2.jpg 红富士

2.jpg

3.jpg 金帅

3.jpg

测试图片

单个识别

0.jpg

多个识别

00.jpg

前置准备

  1. 注册并登录百度AI Studio。
  2. 熟悉飞桨相关知识。
    • 项目:组织代码或者低代码的工程。
    • 应用:部署后的工程,一般可以通过API方式进行访问。
    • 产线:PaddleX特有概念,指包括从数据准备到模型训练、模型评估、模型部署的完整模型生产流程。在AI Studio云端,PaddleX模型产线以项目/模板项目的形式呈现。
    • 特征底库:机器学习中的名词,通过增加打了标签的自定义数据集,影响模型结果。

操作过程

本次分享属于商品识别场景,所以PaddleX 产线选择图片识别,对应通用图像识别系统PP-ShiTuV2。

PaddleX产线列表

建立项目

新建项目

登录AI Studio后,按照下图,选择Notebook项目。

image.png

如下图,录入项目名称,并选择VS CodeIDE(非必须,单纯因为最近我习惯VS Code的操作了)。

image.png

创建成功后跳转到项目详情页面。

image.png

启动项目

启动项目,选择免费的运行环境。

免费的配置较低,运行任务会较慢,如果大家有算力卡余额,可以选择更高配置。

但是注意PaddlePaddle环境需要选择对应的GPU版本进行安装。

image.png

启动后可以进入到开发环境,整体界面和VS Code相当接近,这样我们使用起来更加顺畅。

image.png

左侧直接接入的有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文件夹,如下。

image.png

新建脚本

新建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/")

运行结果

运行结果如下

image.png

输出的结果图片

drink_demo_image.jpeg

可以看到识别结果为“依云天然矿泉水”,因为演示索引中没有测试数据(康师傅矿物质水)这个产品。但是由于演示索引中有类似产品(依云天然矿泉水),所以出现了错误识别。

如果直接使用我们的测试图片,连标记框(红框)都不会有,因为没有苹果产品和类似产品。

接下来,我们会通过自定义特征底库让模型可以识别我们的产品。

运行过程中,以下两点警告和错误不影响结果。

  • UserWarning: No ccache found是一个加速编译工具,缺少也没有问题。
  • Please use PaddlePaddle with GPU version.应该是推荐使用GPU版本,不影响运行。

特征底库(自定义产品)

建立产品文件

新建dataset文件夹,其中gallery上传所有图片,gallery.txt放置图片标注文件。

文件结构如下:

image.png

构建自定义特征底库。

新建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/")

运行结果如下:

image.png

最终效果

单个商品识别效果:

0.jpg

多个商品识别效果:

00.jpg

总结

整体体验挺不错的,操作简单,代码易懂,比我以前使用paddlepaddle时,方便了许多。

之后再研究下,好像应用可以免费发布为外网可访问的服务,这对于平时的小需求来说,可以太好用了。