diff --git a/docs/readme_industry.md b/docs/readme_industry.md index 9ef65f2..854ec69 100644 --- a/docs/readme_industry.md +++ b/docs/readme_industry.md @@ -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指标结果 + + ### 测试代码 ### 测试效果图