Smart_container/docs/readme_industry.md

17 KiB
Raw Blame History

袋鼯麻麻——智能零售购物平台

项目介绍

背景简介

目前,在零售行业的实际运营过程中,会产生巨大的人力成本,例如导购、保洁、结算等,而其中,尤其需要花费大量的人力成本和时间成本在商品识别并对其进行价格结算的过程中,并且在此过程中,顾客也因此而需要排队等待。这样一来零售行业人力成本较大、工作效率极低,二来也使得顾客的购物体验下降。

随着计算机视觉技术的发展以及无人化、自动化超市运营理念的提出利用图像识别技术及目标检测技术实现产品的自动识别及自动化结算的需求呼之欲出即自动结账系统Automatic checkout, ACO。基于计算机视觉的自动结账系统能有效降低零售行业的运营成本提高顾客结账效率从而进一步提升用户在购物过程中的体验感与幸福感。

适用场景

大型线下零售体验店

通点问题

  1. 结算效率要求极高:在大型线下零售体验店购物场景中,若顾客购买的商品较多,采用传统的条形码结算,效率较低,顾客购物体验较差;
  2. 品类更新极快:像新零售这种行业,新品几乎都是按小时级别在更新,每增加新的产品都要辛辛苦苦重新训练模型,仅靠单一模型想要跟上步伐,着实望尘莫及;
  3. 不同商品相似度极高:比如同一种饮料的不同口味,就很可能拥有非常类似的包装。而且即便对于同一件商品,在不同情况下所获得的商品图像都往往存在相当大的差异
  4. 商品类别数以万计:根本没法事先把所有类别都放入训练集。

解决方案

袋鼯麻麻——智能购物平台”具体实现在零售过程中对用户购买商品的自动结算。即利用PaddleClas团队开源的图像识别PP-ShiTu技术,精准地定位顾客购买的商品,并进行智能化、自动化的价格结算。当顾客将自己选购的商品放置在制定区域内时,“袋鼯麻麻——智能购物平台”能够精准地定位识别每一个商品,并且能够返回完整的购物清单及顾客应付的实际商品总价格。而当系统有新商品增加时,本系统只需更新检索库即可,无需重新训练模型。

模型工具简介

飞桨图像识别套件PaddleClas是飞桨为工业界和学术界所准备的一个图像识别任务的工具集助力使用者训练出更好的视觉模型和应用落地。

PP-ShiTu是一个实用的轻量级通用图像识别系统主要由主体检测、特征学习和向量检索三个模块组成。该系统从骨干网络选择和调整、损失函数的选择、数据增强、学习率变换策略、正则化参数选择、预训练模型使用以及模型裁剪量化8个方面采用多种策略对各个模块的模型进行优化最终得到在CPU上仅0.2s即可完成10w+库的图像识别的系统。


安装说明

环境要求

  • Python >= 3.6

  • PaddlePaddle >= 2.1

  • Linux 环境最佳

  • 安装PaddleClas

    • 克隆 PaddleClas
    git clone https://github.com/PaddlePaddle/PaddleClas.git -b release/2.3
    
    • 安装 Python 依赖库
      PaddleClas 的 Python 依赖库在 requirements.txt 中给出,可通过如下命令安装:
    pip install --upgrade -r requirements.txt -i https://mirror.baidu.com/pypi/simple
    

数据准备

数据集介绍

目前开源的商品识别方向的数据集

本项目数据集以上述数据集为背景,结合图片爬虫等,开源了一份新的更符合本项目背景的数据集,目前已在AIStudio平台开源.

商品部分list

东古酱油一品鲜
东古黄豆酱750G
东鹏特饮罐装
中华(硬)
中华(软)
乳酸菌600亿_2
乳酸菌600亿_3
乳酸菌600亿原味
乳酸菌600亿芒果
乳酸菌600亿芦荟
...

数据集格式

  • 训练集合train dataset用来训练模型使模型能够学习该集合的图像特征。
  • 底库数据集合gallery dataset用来提供图像检索任务中的底库数据该集合可与训练集或测试集相同也可以不同当与训练集相同时测试集的类别体系应与训练集的类别体系相同。
  • 测试数据集合query dataset用来测试模型的好坏通常要对测试集的每一张测试图片进行特征提取之后和底库数据的特征进行距离匹配得到识别结果后根据识别结果计算整个测试集的指标。

训练集、底库数据集和测试数据集均使用 txt 文件指定,训练数据集 train_list.txt 文件内容格式如下所示:

# 采用"空格"作为分隔符号
...
train/99/Ovenbird_0136_92859.jpg 99 2
...
train/99/Ovenbird_0128_93366.jpg 99 6
...

每行数据使用“空格”分割三列数据的含义分别是训练数据的路径、训练数据的label信息、训练数据的unique id。

模型选择

主体检测

主体检测技术是目前应用非常广泛的一种检测技术,它指的是检测出图片中一个或者多个主体的坐标位置,然后将图像中的对应区域裁剪下来,进行识别,从而完成整个识别过程。主体检测是识别任务的前序步骤,可以有效提升识别精度。

考虑到商品识别实际应用场景中,需要快速准确地获得识别结果,故本项目选取轻量级主体检测模型PicoDet作为本项目主体检测部分的模型。此模型inference模型大小(MB)仅30.1MBmAP可达40.1%,在cpu下单张图片预测耗时仅29.8ms【具体模型参评标准请见PicoDet系列模型介绍】,完美符合本项目实际落地需求。

特征提取

特征提取是图像识别中的关键一环它的作用是将输入的图片转化为固定维度的特征向量用于后续的向量检索。好的特征需要具备相似度保持性即在特征空间中相似度高的图片对其特征相似度要比较高距离比较近相似度低的图片对其特征相似度要比较小距离比较远。Deep Metric Learning用以研究如何通过深度学习的方法获得具有强表征能力的特征。

考虑到本项目的真实落地的场景中,推理速度及预测准确率是考量模型好坏的重要指标,所以本项目采用 PP_LCNet_x2_5 作为骨干网络,并结合度量学习arcmargin算法,对高相似物体的区分效果远超单一模型,能更好地适应 Intel CPU不仅准确率超越大模型ResNet50预测速度还能快3倍。

向量检索

向量检索技术在图像识别、图像检索中应用比较广泛。其主要目标是,对于给定的查询向量,在已经建立好的向量库中,与库中所有的待查询向量,进行特征向量的相似度或距离计算,得到相似度排序。在图像识别系统中,本项目使用 Faiss 对此部分进行支持。在此过程中,本项目选取 HNSW32 为检索算法,使得检索精度、检索速度能够取得较好的平衡,更为贴切本项目实际应用场景的使用需求。

模型训练

训练流程

  1. 数据准备

首先,需要基于任务定制自己的数据集。数据集格式参见格式说明。在启动模型训练之前,需要在配置文件中修改数据配置相关的内容, 主要包括数据集的地址以及类别数量。对应到配置文件中的位置如下所示:

  Head:
    name: ArcMargin
    embedding_size: 512
    class_num: 185341    #此处表示类别数
  Train:
    dataset:
      name: ImageNetDataset
      image_root: ./dataset/     #此处表示train数据所在的目录
      cls_label_path: ./dataset/train_reg_all_data.txt  #此处表示train数据集label文件的地址
   Query:
     dataset:
       name: VeriWild
       image_root: ./dataset/Aliproduct/.    #此处表示query数据集所在的目录
       cls_label_path: ./dataset/Aliproduct/val_list.txt.    #此处表示query数据集label文件的地址
   Gallery:
     dataset:
       name: VeriWild
       image_root: ./dataset/Aliproduct/    #此处表示gallery数据集所在的目录
       cls_label_path: ./dataset/Aliproduct/val_list.txt.   #此处表示gallery数据集label文件的地址
  1. 模型训练
  • 单机单卡训练
python tools/train.py -c ppcls/configs/ResNet50_vd_SOP.yaml
  • 单机多卡训练
python -m paddle.distributed.launch 
    --gpus="0,1,2,3" tools/train.py 
    -c ppcls/configs/ResNet50_vd_SOP.yaml

训练完成之后,会在output目录下生成best_model模型文件。

  1. 模型评估
  • 单卡评估
python tools/eval.py -c ppcls/configs/ResNet50_vd_SOP.yaml -o Global.pretrained_model="output/RecModel/best_model"
  • 多卡评估
python -m paddle.distributed.launch 
    --gpus="0,1,2,3" tools/eval.py 
    -c  ppcls/configs/ResNet50_vd_SOP.yaml
    -o  Global.pretrained_model="output/RecModel/best_model"
  1. 模型推理

推理过程包括两个步骤: 1)导出推理模型, 2)获取特征向量

  • 导出推理模型
python tools/export_model -c ppcls/configs/ResNet50_vd_SOP.yaml -o Global.pretrained_model="output/RecModel/best_model"

生成的推理模型位于inference目录,名字为inference.pd*

  • 获取特征向量
cd deploy
python python/predict_rec.py -c configs/inference_rec.yaml  -o Global.rec_inference_model_dir="../inference"

bsseline指标结果

测试代码

测试效果图

模型优化

模型优化思路

调参方案及结果

最优模型方案

模型部署

在项目中为用户提供了基于服务器的部署Demo方案。用户可根据实际情况自行参考。

具体部署方式可以参考:袋鼯麻麻——智能购物平台