1. 项目场景说明

在这里插入图片描述

在超市等无人零售场景中,目前主要是结算方式,主要有以下几种

  • 条形码方式
  • RFID等射频码
  • 称重方法

但是以上几种方法存在如下缺点:
1)针对条形码方式,对于成品包装的商品,较为成熟,但是对与生鲜产品等商品,并不能满足需求。
2)RFID等方式,虽然对生鲜等产品能够支持,但是额外生成标签,增加成本
3)称重方法,对于相同重量的山商品,不能很好的区分,同时重量称等精密仪器在长时间的负重和使用过程中,精度会发生变化,需要工作人员定期调教,以满足精度需求。

因此,如何选择一种既能大规模支持各种商品识别,又能方便管理,同时维护成本不高的识别系统,显得尤为重要。

深圳市银歌云技术有限公司基于飞桨的图像识别开发套件PaddleClas,提供了一套基于计算机视觉的完整生鲜品自主结算方案,其通过结算平台的摄像头拍摄的图像,自动的识别称上的商品,整个流程在1秒内完成,无需售卖人员的操作及称重。整个流程,实现了精度高、速度快,无需人工干预的自动结算效果。减少人工成本的同时,大大提高了效率和用户体验。

读者可以通过本项目熟悉AI项目的落地流程,了解解决问题的思路。如果能对大家今后的实际项目操作有一定启发,那我们就颇感欣慰了。😊
在此过程中,我们先来看一下项目面临的挑战

  • 物体形状千差万别,如何找到待检测的商品?
  • 商品及生鲜品种类繁多,如何准备的识别出对应种类?
  • 使用过程中,商品及生鲜品类迭代速度快,如何减少模型更新成本?

2. 技术方案选型

针对以上难点,我们的方案如下PP—ShiTuV2

在这里插入图片描述

如上图所示,针对以上问题,我们使用图中的PipeLine进行解决上述问题。整个PipeLine中,主要分为三部分

  1. 主体检测:检测出待识别的商品,去掉冗余的背景信息,提高生鲜品识别的精度
  2. 特征提取:将待识别的生鲜品图像,提取特征
  3. 检索模块:将待检索的特征与库中的生鲜品特征比对,得到待检索生鲜品的标签。

在此方案中,用户只需要训练一套模型,之后在应用过程中,只需要在检索库中,添加少量有代表性的新增生鲜品及商品类别图像,就能够很好的解决新增商品问题。同时,在使用的过程中,无需频繁重新训练模型,能够极大的降低用户使用成本。同时本套方案中,用户在后续使用中,无需添加辅助设备,降低了维护及使用成本。

3. 安装说明

环境要求

  • PaddlePaddle = 2.2.2
  • Python = 3.7
  • PaddleClas = 2.5
  • PaddleDetection = 2.3
# 安装PaddleClas
%cd ~
!git clone https://github.com/PaddlePaddle/PaddleClas.git
%cd PaddleClas
# 切换到2.5版本
!git checkout release/2.5
# 安装好相关依赖
!pip install -r requirements.txt
# 安装PaddleClas
!python setup.py install
%cd ..
# 安装PaddleDetection
%cd ~
!git clone https://github.com/PaddlePaddle/PaddleDetection.git
%cd PaddleDetection
!git checkout release/2.3
!pip install -r requirements.txt

4. 数据准备

4.1 主体检测数据准备

在PP-ShiTuV2中,主体检测训练数据集如下:

数据集 数据量 主体检测任务中使用的数据量 场景 数据集地址
Objects365 170W 6k 通用场景 地址
COCO2017 12W 5k 通用场景 地址
iCartoonFace 2k 2k 动漫人脸检测 地址
LogoDet-3k 3k 2k Logo 检测 地址
RPC 3k 3k 商品检测 地址

在PP-ShiTu中,使用上述数据集进行模型主体检测模型训练。在整个PP-ShiTu的Pipeline中,主体检测只是需要把待检测图像中的待检测物体检测出来,即需要区分物体的类别,只需要框出物体位置。因此,需要对下载的数据进行处理一下,将所有的检测数据集中物体都统一成一个类别,并修改成COCO数据集格式。具体操作可以根据自定义检测数据集教程进行操作。

在此文档中,我们准备了整理好的demo数据,位于~/work/data/detection_demo_dataset.tar

4.2 识别模型数据集准备

在PP-ShiTuV2中,识别模型训练数据集如下:

数据集 数据量 类别数 场景 数据集地址
Aliproduct 2498771 50030 商品 地址
GLDv2 1580470 81313 地标 地址
VeRI-Wild 277797 30671 车辆 地址
LogoDet-3K 155427 3000 Logo 地址
SOP 59551 11318 商品 地址
Inshop 25882 3997 商品 地址
bird400 58388 400 鸟类 地址
104flows 12753 104 花类 地址
Cars 58315 112 车辆 地址
Fashion Product Images 44441 47 商品 地址
flowerrecognition 24123 59 花类 地址
food-101 101000 101 食物 地址
fruits-262 225639 262 水果 地址
inaturalist 265213 1010 自然 地址
indoor-scenes 15588 67 室内 地址
Products-10k 141931 9691 商品 地址
CompCars 16016 431 车辆 地址
Total 6M 192K - -

为了保证识别模型的通用特征能力,我们使用上述16个公开数据集,覆盖商品、地标、车辆、logo、植物、动物等多种场景。因为训练数据丰富多样,在实际使用场景,可以直接使用我们公开的预训练模型,就能得到一个比较好的效果。在下载完成数据集后,需要对数据集进行整理,并同时生成image_list.txt的文件,文件中每一行格式如下:

image_path imagel_label_id

在本实验中,我们也准备了整理好的demo数据,位置在~/work/data/rec_demo_dataset.tar

5. 模型选择

5.1 主体检测模型选择

PaddleDetection 提供了非常丰富的目标检测模型,但是我们需要从项目实际情况出发,选择适合部署条件的模型。项目要求模型体积小、精度高、速度达标,因此我们将候选模型锁定在PP-PicoDet上。
我们先来看一下 PicoDet 的性能指标对比:在这里插入图片描述

如图所示,PicoDet无论从速度和精度都有较明显的优势。同时为了能够较好的兼顾兼顾速度与精度,我们使用PP-LCNet2.5x作为backbone的Picodet_m_640模型。

5.2 识别模型选择

Model Params(M) FLOPs(M) Top-1 Acc(%) Top-5 Acc(%) Latency(ms)
MobileNetV3_Large_x1_25 7.4 714 76.4 93.00 5.19
PPLCNetV1_x2_5 9 906 76.60 93.00 7.25
PPLCNetV2_base 6.6 604 77.04 93.27 4.32
PPLCNetV2_base_ssld 6.6 604 80.07 94.87 4.32

在PP-ShiTuV1中,使用PP-LCNetV1_x2_5作为backbone,而PP-ShiTuV2使用了PP-LCNetV2作为Backbone。在不使用额外数据的前提下,PPLCNetV2_base 模型在图像分类 ImageNet 数据集上能够取得超过 77% 的 Top1 Acc,同时在 Intel CPU 平台的推理时间在 4.4 ms 以下,如下表所示,其中推理时间基于 Intel® Xeon® Gold 6271C CPU @ 2.60GHz 硬件平台,OpenVINO 推理平台。

此外,在PP—LCNetV2_base作为backbone的基础上,我们又加了一些其他的策略,如Last Stride=1BNNeckThripletAngularMarginLoss等,进一步提升模型精度

6. 主体检测模型训练、评测及模型导出

6.1 主体检测模型训练

主体检测模型配置文件位于PaddleDetection/configs/picodet/application/mainbody_detection/picodet_lcnetv2_base_640_mainbody.yml,主要内容如下
在这里插入图片描述

用户在实际使用过程中,可以适当修改其中参数,如根据显存的大小,修改batch_size等参数,同时不要忘记等比例扩大或者缩小learning_rate
同时在实际使用过程中,建议将pretrain_weights修改为https://paddledet.bj.bcebos.com/models/picodet_lcnet_x2_5_640_mainbody.pdparams,即使用我们训练好的模型进行finetune
具体的训练过程请参考主体检测训练文档

# 解压数据集
%cd ~/PaddleDetection/dataset/
%cp ../../work/data/detection_demo_dataset.tar .
!tar -xf detection_demo_dataset.tar
!ln -s detection_demo_dataset mainbody
%cd ..

# 微调coco数据代码
%cd ppdet/data/source
%cp ../../../../work/data/coco.py .
%cd ../../../

# 注意,在开始训练的时候,请对yaml文件做好适配,如修改好训练集、测试集的路径
# 此时需要打开终端,修改好yaml文件中对应的配置

# 开始训练,单卡训练
%cd ~/PaddleDetection
!python tools/train.py -c configs/picodet/application/mainbody_detection/picodet_lcnet_x2_5_640_mainbody.yml -o pretrain_weights=https://paddledet.bj.bcebos.com/models/picodet_lcnet_x2_5_640_mainbody.pdparams TrainReader.batch_size=28

# 如果有多张卡,可以进行多卡训练
# export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
# python -m paddle.distributed.launch --gpus="0,1,2,3,4,5,6,7" tools/train.py -c configs/picodet/application/mainbody_detection/picodet_lcnet_x2_5_640_mainbody.yml  -o pretrain_weights=https://paddledet.bj.bcebos.com/models/picodet_lcnet_x2_5_640_mainbody.pdparams

6.2 主体检测模型评估

训练好主体检测模型后,就需要对其进行评估

# 单卡GPU评估
!export CUDA_VISIBLE_DEVICES=0
!python tools/eval.py -c configs/picodet/application/mainbody_detection/picodet_lcnet_x2_5_640_mainbody.yml -o weights=output/picodet_lcnet_x2_5_640_mainbody/model_final

6.3 主体检测模型导出

训练完成后,可以将模型导出为inference model,具体操作如下,其中模型导出后,存储在PaddleDetection/inference_model/picodet_lcnet_x2_5_640_mainbody下,默认生成文件格式如下

infer_cfg.yml
model.pdiparams
model.pdiparams.info
model.pdmodel

将文件经过下面语句重命名后,就可以进行PP-ShiTuV2的部署了

!python tools/export_model.py -c configs/picodet/application/mainbody_detection/picodet_lcnet_x2_5_640_mainbody.yml --output_dir=./inference_model -o weights=output/picodet_lcnet_x2_5_640_mainbody/model_final.pdparams
# 将inference model重新命名,生成变成PP—ShiTu的应用格式
%cd inference_model/picodet_lcnet_x2_5_640_mainbody
%mv model.pdiparams inference.pdiparams
%mv model.pdmodel inference.pdmodel

7 识别模型训练、评估及模型导出

7.1 识别模型训练

识别模型配置文件位于PaddleClas/ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml,其中包括了训练所需的所有配置信息,主要有:

  • Global模块:模型存储、日志、训练方式等辅助训练信息
  • AMP:混合精度训练模块
  • Arch:具体模型信息
    • Backbone
    • Neck
    • Head
  • Loss: 损失函数信息
  • Optimizer: 优化器
  • DataLoader: 数据信息
    • Train
    • Eval
      • Query
      • Gallery
  • Metric: 评价指标

用户在实际使用过程中,可以适当修改其中参数,如根据显存的大小,修改batch_size等参数,同时不要忘记等比例扩大或者缩小learning_rate。同时将Global.pretrained_model,设置为https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/pretrain/PPShiTuV2/general_PPLCNetV2_base_pretrained_v1.0.pdparams,即在自己的数据集上进行微调。
具体模型训练、评估等可以参考识别模型文档

%cd ~/PaddleClas/
# 拷贝好数据集
%cd dataset/
%cp -r ../../work/data/rec_demo_dataset.tar .
!tar -xf rec_demo_dataset.tar
%cp rec_demo_dataset/* .
%mv rec_demo_dataset Aliproduct
%cd ..

# 打开终端,修改好yaml文件中对应训练、测试数据集路径

# 单卡训练
%cd ~/PaddleClas
!export CUDA_VISIBLE_DEVICES=0
!python tools/train.py -c ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml -o Global.pretrained_model=https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/pretrain/PPShiTuV2/general_PPLCNetV2_base_pretrained_v1.0.pdparams -o DataLoader.Train.sampler.batch_size=64

# 多卡训练
# export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
# python -m paddle.distributed.launch --gpus="0,1,2,3,4,5,6,7" tools/train.py -c ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml -o Global.pretrained_model=https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/pretrain/PPShiTuV2/general_PPLCNetV2_base_pretrained_v1.0.pdparams

7.2 识别模型评测

# 单卡GPU评估
!export CUDA_VISIBLE_DEVICES=0
!python tools/eval.py -c ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml -o Global.pretrained_model=output/RecModel/best

7.3 识别模型导出inference model

模型导出后,默认存储在PaddleClas/inference下,生成文件如下:

inference.pdiparams
inference.pdiparams.info
inference.pdmodel

生成inference model后,就可以进行PP-ShiTu部署使用了

!python tools/export.py -c ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml -o Global.pretrained_model=output/RecModel/best

8 模型部署

此项目最终部署在rk3566开发板上, 其搭载了A55架构arm处理器,同时搭载G52图形处理器,能够支持NPU加速。基于arm的部署可以体验PP-ShiTuV2 的安卓demo,可以下载体验,预装饮商品检索库,同时支持加库等操作
在这里插入图片描述

在本此展示中,以python inference 为例,展示整个PipeLine的运行结果,具体请参考python inference部署文档
实际部署过程中,为了达到更好的速度,可以使用C++inference 部署,请参考PP-ShiTu C++ inference 部署文档

%cd ~/PaddleClas/deploy/

# 下载相应的inference model
%mkdir models
%cd models
!wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/picodet_PPLCNet_x2_5_mainbody_lite_v1.0_infer.tar
!tar -xf picodet_PPLCNet_x2_5_mainbody_lite_v1.0_infer.tar
!wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/PP-ShiTuV2/general_PPLCNetV2_base_pretrained_v1.0_infer.tar
!tar -xf general_PPLCNetV2_base_pretrained_v1.0_infer.tar
%cd ..

# 下载对应的数据集
!wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/PP-ShiTuV2_application_dataset/Veg200.tar
!tar -xf Veg200.tar

# 下载的数据集中已经生成了对应的index索引文件
# 如需重新生成对应的index文件 请参考8.1

8.1 生成index文件

在上述代码中,已经生成好了对应的检索库文件,用户如果想要重新生成库文件,需要对配置文件进行修改适配,配置文件位于~/work/PaddleClas/deploy/configs/inference_general.yaml
首先需修改模型路径部分,修改如下:

Global:
  infer_imgs: './Veg/Query'
  det_inference_model_dir: './models/picodet_PPLCNet_x2_5_mainbody_lite_v1.0_infer'
  rec_inference_model_dir: './models/general_PPLCNetV2_base_pretrained_v1.0_infer'

另外Index等参数配置如下:

IndexProcess:
  index_method: "HNSW32" # supported: HNSW32, IVF, Flat
  image_root: "./Veg200/Gallery/"
  index_dir: "./Veg200/Index"
  data_file: "./Veg200/gallery_list.txt"
  index_operation: "new" # suported: "append", "remove", "new"
  delimiter: " "
  dist_type: "IP"
  embedding_size: 512
  batch_size: 32
  return_k: 5
  score_thres: 0.5

需要修改的部分包括:

  • image_root: 库图像存储目录
  • index_dir: 生成index的存储目录
  • data_file: 图像的list文件
  • delimiter: 图像list文件中每行的分隔符。根据不同list修改

如需重新生成index文件,则需如下操作

# 进行操作目录
%cd d ~/work/PaddleClas/deploy/
# 生成index文件
!python python/build_gallery.py -c configs/inference_general.yaml

8.2 推理部署

生成好对应的index文件后,可进行推理部署,代码如下

# 此代码是将文件夹下所有的图像进行预测
!python python/predict_system.py -c configs/inference_general.yaml -o Global.infer_imgs=Veg200/Query/

# 如果只是预测单张图像,则可以如下操作
!python python/predict_system.py -c configs/inference_general.yaml -o Global.infer_imgs=Veg200/Query/allium_v_15_04_0019.jpg

9 检索库调优

在PP-ShiTu中,挑选具有代表性的检索库,是非常重要的,这对模型的效果有着巨大的影响,因此用户可以通过手动调节生成index库的图像,来进一步调节模型精度。
在PP-ShiTuV2中,提供了可视化的库管理工具,具体可以查看库管理工具文档
其中界面如下:
在这里插入图片描述

注意:此工具需要在有界面的系统中打开,在AiStudio中无法展示。
用户可以根据对图像进行增删改查,制作高质量的index库,提升模型效果。

10 总结

本案例旨在通过一个实际的项目带大家熟悉从数据集建立、到模型训练优化、到最终部署的完整的快速落地流程,并在这个过程中了解分析问题、解决问题的思路。结合飞桨提供的全生态的AI套件提升项目的实践体验和效率。
值得一提的是,在数据准备阶段,需要的是耐心。在模型优化阶段需要的是大胆的尝试。在部署阶段需要的是细心。希望这些经验能对大家今后的实际项目操作有所帮助。
具体方案链接:https://gitee.com/yingeo-pro/yingeo-ai

11 企业介绍

深圳市银歌云技术有限公司
深圳市银歌云技术有限公司是国内商业信息化、数字门店、数字餐厅及智能化设备方案提供商与践行者,专注零售餐饮信息化创新应用,系统整合了商业大数据、智能设备、生态流量,推出银歌云商计划。用智能技术“新引擎”赋能零售商,以科技服务市场,AI视觉结算、刷脸支付、自助收银、会员画像、AI互动等技术产品带给消费者全新的购物体验,塑造科技零售美好生活。

公司官网:https://www.yingeo.com/

此文章为搬运
原项目链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐