PP-ShiTu V2商品识别系统(01.简介)
PP-ShiTuV2 是基于 PP-ShiTuV1 改进的一个实用轻量级通用图像识别系统,由主体检测、特征提取、向量检索三个模块构成,相比 PP-ShiTuV1 具有更高的识别精度、更强的泛化能力以及相近的推理速度*。主要针对训练数据集、特征提取两个部分进行优化,使用了更优的骨干网络、损失函数与训练策略,使得 PP-ShiTuV2 在多个实际应用场景上的检索性能有显著提升。
环境搭建
使用PP-ShiTu V2之前需要搭建所需环境:
1.paddle环境搭建,参见:飞桨PaddlePaddle安装
2.paddleclas环境搭建,参见:飞桨图像识别套件PaddleClas安装
paddleclas代码结构说明
conda环境下找到paddleclas包,结构如下:
python目录下就是用于推理的代码(文本主要使用python推理)
- predict_det.py:目标检测代码
- predict_rec.py:目标特征提取代码
- predict_system:目标检测和目标识别代码(使用了以上2个代码)
商品识别流程说明
系统进行商品识别主要流程是:
- 训练检测模型(paddleclas提供默认训练好的模型,自己也可以训练)
- 训练特征模型(paddleclas提供默认训练好的模型,自己也可以训练)
- 目标商品注册
- 准备需要识别的商品图片
- 使用paddleclas提供的工具进行图片注册
- 全图进行目标检测,获取到商品坐标框
- 通过获取到的坐标框在全图中抠取商品的图片
- 用抠取的商品图片进行特征提取
- 提取到的特征进行相似度检索(TopN)
- 返回最相似商品名称
商品检测
1)模型
主体检测是目前应用非常广泛的一种检测技术,它指的是检测出图片中一个或者多个主体的坐标位置,然后将图像中的对应区域裁剪下来进行识别。主体检测是识别任务的前序步骤,输入图像经过主体检测后再进行识别,可以过滤复杂背景,有效提升识别精度。
考虑到检测速度、模型大小、检测精度等因素,最终选择 PaddleDetection 自研的轻量级模型 PicoDet-LCNet_x2_5 作为 PP-ShiTuV2 的主体检测模型
picodet_PPLCNet_x2_5_mainbody_lite_v1.0_infer
2)配置
检测器的配置文件可以在这里找到:
内容如下:
Global:
det_inference_model_dir: "./data/models/picodet_PPLCNet_x2_5_mainbody_lite_v1.0_infer"
batch_size: 1
image_shape: [3, 640, 640]
threshold: 0.45
max_det_results: 20
label_list:
- foreground
# inference engine config
use_gpu: False
enable_mkldnn: True
cpu_num_threads: 10
enable_benchmark: True
use_fp16: False
ir_optim: True
use_tensorrt: False
gpu_mem: 8000
enable_profile: False
DetPreProcess:
transform_ops:
- DetResize:
interp: 2
keep_ratio: false
target_size: [640, 640]
- DetNormalizeImage:
is_scale: true
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
- DetPermute: {}
DetPostProcess: {}
- det_inference_model_dir:模型文件目录
- threshold:检测阈值
- max_det_results:最多检测出多少个目标
- use_gpu:是否使用GPU
3)检测结果说明
检测返回结果如下:
{
"count": 3,
"data": [
{
"bbox": {
"x1": 169,
"y1": 57,
"x2": 349,
"y2": 508
},
"score": "0.77"
},
{
"bbox": {
"x1": 379,
"y1": 429,
"x2": 524,
"y2": 517
},
"score": "0.66"
},
{
"bbox": {
"x1": 0,
"y1": 152,
"x2": 166,
"y2": 430
},
"score": "0.64"
}
]
}
返回目标数组,其中包括目标在图片中的坐标值和置信分
商品识别
1)特征提取
特征提取是图像识别中的关键一环,它的作用是将输入的图片转化为固定维度的特征向量,用于后续的 向量检索 。考虑到特征提取模型的速度、模型大小、特征提取性能等因素,最终选择 PaddleClas 自研的 PPLCNetV2_base 作为特征提取网络。相比 PP-ShiTuV1 所使用的 PPLCNet_x2_5, PPLCNetV2_base 基本保持了较高的分类精度,并减少了40%的推理时间*。
general_PPLCNetV2_base_pretrained_v1.0_infer
2)向量检索
向量检索技术在图像识别、图像检索中应用比较广泛。其主要目标是对于给定的查询向量,在已经建立好的向量库中进行特征向量的相似度或距离计算,返回候选向量的相似度排序结果。
在 PP-ShiTuV2 识别系统中,使用Faiss 向量检索开源库对此部分进行支持,其具有适配性好、安装方便、算法丰富、同时支持CPU与GPU的优点。
3)配置
识别的配置文件可以在这里找到:
内容如下:
Global:
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"
rec_nms_thresold: 0.05
batch_size: 1
image_shape: [3, 640, 640]
threshold: 0.2
max_det_results: 5
label_list:
- foreground
use_gpu: True
enable_mkldnn: True
cpu_num_threads: 10
enable_benchmark: True
use_fp16: False
ir_optim: True
use_tensorrt: False
gpu_mem: 8000
enable_profile: False
DetPreProcess:
transform_ops:
- DetResize:
interp: 2
keep_ratio: false
target_size: [640, 640]
- DetNormalizeImage:
is_scale: true
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
- DetPermute: {}
DetPostProcess: {}
RecPreProcess:
transform_ops:
- ResizeImage:
size: [224, 224]
return_numpy: False
interpolation: bilinear
backend: cv2
- NormalizeImage:
scale: 1.0/255.0
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
order: hwc
- ToCHWImage:
RecPostProcess: null
# indexing engine config
IndexProcess:
index_method: "HNSW32" # supported: HNSW32, IVF, Flat
image_root: "./drink_dataset_v2.0/gallery/"
index_dir: "./drink_dataset_v2.0/index"
data_file: "./drink_dataset_v2.0/gallery/drink_label.txt"
index_operation: "new" # suported: "append", "remove", "new"
delimiter: "\t"
dist_type: "IP"
embedding_size: 512
batch_size: 32
return_k: 5
score_thres: 0.5
- Global.det_inference_model_dir:检测模型目录
- Global.rec_inference_model_dir:特征模型目录
- DetPreProcess.xxx:检测相关配置
- RecPreProcess.xxx:特征相关配置
- IndexProcess.xxx:向量召回相关配置
- image_root:注册图片目录
- index_dir:Faiss 索引目录
- data_file:标注文件
4)识别结果说明
识别返回结果如下:
{
"count": 1,
"data": [
{
"bbox": {
"x1": 328,
"y1": 7,
"x2": 467,
"y2": 272
},
"rec_scores": "0.65",
"rec_docs": "达能脉动维生素饮料青柠口味瓶装600ml"
}
]
}
返回目标数组,其中包括目标在图片中的坐标值、置信分、商品名称(注册时候定义的)