Update readme_industry.md

pull/1/head
thomas-yanxin 2021-12-19 02:38:54 +08:00 committed by GitHub
parent e3943dc932
commit 6f49317abc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 133 additions and 8 deletions

View File

@ -65,33 +65,158 @@
### 数据集介绍 ### 数据集介绍
#### 数据Demo 目前开源的商品识别方向的数据集
- [Products-10K Large Scale Product Recognition Dataset](https://www.kaggle.com/c/products-10k/data?select=train.csv) :数据集中的所有图片均来自京东商城。数据集中共包含 1 万个经常购买的 SKU。所有 SKU 组织成一个层次结构。总共有近 19 万张图片。在实际应用场景中,图像量的分布是不均衡的。所有图像都由生产专家团队手工检查/标记。
- [RP2K: A Large-Scale Retail Product Dataset for Fine-Grained Image Classification](https://arxiv.org/abs/2006.12634) :收集了超过 500,000 张货架上零售产品的图像,属于 2000 种不同的产品。所有图片均在实体零售店人工拍摄,自然采光,符合实际应用场景。
本项目数据集以上述数据集为背景,结合图片爬虫等,开源了一份新的更符合本项目背景的数据集,目前已在[AIStudio平台](https://aistudio.baidu.com/aistudio/datasetdetail/113685)开源.
#### 商品部分list
> 东古酱油一品鲜
东古黄豆酱750G
东鹏特饮罐装
中华(硬)
中华(软)
乳酸菌600亿_2
乳酸菌600亿_3
乳酸菌600亿原味
乳酸菌600亿芒果
乳酸菌600亿芦荟
...
#### 数据集格式 #### 数据集格式
* 训练集合train dataset用来训练模型使模型能够学习该集合的图像特征。
* 底库数据集合gallery dataset用来提供图像检索任务中的底库数据该集合可与训练集或测试集相同也可以不同当与训练集相同时测试集的类别体系应与训练集的类别体系相同。
* 测试数据集合query dataset用来测试模型的好坏通常要对测试集的每一张测试图片进行特征提取之后和底库数据的特征进行距离匹配得到识别结果后根据识别结果计算整个测试集的指标。
训练集、底库数据集和测试数据集均使用 `txt` 文件指定,以 `CUB_200_2011` 数据集为例,训练数据集 `train_list.txt` 文件内容格式如下所示:
```shell
# 采用"空格"作为分隔符号
...
train/99/Ovenbird_0136_92859.jpg 99 2
...
train/99/Ovenbird_0128_93366.jpg 99 6
...
```
验证数据集(`CUB_200_2011`中既是gallery dataset也是query dataset) `test_list.txt` 文件内容格式如下所示:
```shell
# 采用"空格"作为分隔符号
...
test/200/Common_Yellowthroat_0126_190407.jpg 200 1
...
test/200/Common_Yellowthroat_0114_190501.jpg 200 6
...
```
每行数据使用“空格”分割三列数据的含义分别是训练数据的路径、训练数据的label信息、训练数据的unique id。
## 模型选择 ## 模型选择
### 套件选择 ### 主体检测
### 模型及选择思路 主体检测技术是目前应用非常广泛的一种检测技术,它指的是检测出图片中一个或者多个主体的坐标位置,然后将图像中的对应区域裁剪下来,进行识别,从而完成整个识别过程。主体检测是识别任务的前序步骤,可以有效提升识别精度。
考虑到商品识别实际应用场景中,需要快速准确地获得识别结果,故本项目选取**轻量级主体检测模型**[PicoDet](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/pretrain/picodet_PPLCNet_x2_5_mainbody_lite_v1.0_pretrained.pdparams)作为本项目主体检测部分的模型。此模型inference模型大小(MB)仅**30.1MB**mAP可达**40.1%**,在**cpu**下单张图片预测耗时仅**29.8ms**(具体模型参评标准请见[PicoDet系列模型介绍](https://github.com/PaddlePaddle/PaddleDetection/blob/develop/configs/picodet/README.md)),完美符合本项目实际落地需求。
### 特征提取
特征提取是图像识别中的关键一环它的作用是将输入的图片转化为固定维度的特征向量用于后续的向量检索。好的特征需要具备相似度保持性即在特征空间中相似度高的图片对其特征相似度要比较高距离比较近相似度低的图片对其特征相似度要比较小距离比较远。Deep Metric Learning用以研究如何通过深度学习的方法获得具有强表征能力的特征。
考虑到本项目的真实落地的场景中,推理速度才是考量模型好坏的重要指标,所以本项目采用 [PP_LCNet_x2_5](https://github.com/PaddlePaddle/PaddleClas/blob/release/2.3/docs/zh_CN/models/PP-LCNet.md) 作为骨干网络,从而更好地适应 Intel CPU有速度更快、准确率更高的使用体验。
### 向量检索
向量检索技术在图像识别、图像检索中应用比较广泛。其主要目标是,对于给定的查询向量,在已经建立好的向量库中,与库中所有的待查询向量,进行特征向量的相似度或距离计算,得到相似度排序。在图像识别系统中,本项目使用 [Faiss](https://github.com/facebookresearch/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文件的地址
```
2. 模型训练
## 模型评估和预测 - 单机单卡训练
```
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`模型文件。
### 评估方法介绍 3. 模型评估
### 评估代码 - 单卡评估
```
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"
```
4. 模型推理
推理过程包括两个步骤: 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指标结果 ### bsseline指标结果
### 测试代码 ### 测试代码
### 测试效果图 ### 测试效果图