From abfced465a2561b48c968be88a1f9164376d1588 Mon Sep 17 00:00:00 2001 From: dongshuilong Date: Wed, 8 Jun 2022 22:44:42 +0800 Subject: [PATCH] update mainbody and vector search doc --- docs/images/algorithm_introduction/hnsw.png | Bin 0 -> 74237 bytes .../mainbody_detection.md | 40 ++++++--- .../vector_search.md | 84 ++++++++++++------ 3 files changed, 82 insertions(+), 42 deletions(-) create mode 100644 docs/images/algorithm_introduction/hnsw.png diff --git a/docs/images/algorithm_introduction/hnsw.png b/docs/images/algorithm_introduction/hnsw.png new file mode 100644 index 0000000000000000000000000000000000000000..eeacd32bd31e690bca2363932ca7ab9d78750313 GIT binary patch literal 74237 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 + + ## 1. 数据集 @@ -37,7 +41,7 @@ 在实际训练的过程中,将所有数据集混合在一起。由于是主体检测,这里将所有标注出的检测框对应的类别都修改为 `前景` 的类别,最终融合的数据集中只包含 1 个类别,即前景。 - + ## 2. 模型选择 @@ -55,7 +59,7 @@ * 速度评测机器的 CPU 具体信息为:`Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz`,速度指标为开启 mkldnn,线程数设置为 10 测试得到。 * 主体检测的预处理过程较为耗时,平均每张图在上述机器上的时间在 40~55 ms 左右,没有包含在上述的预测耗时统计中。 - + ### 2.1 轻量级主体检测模型 @@ -72,7 +76,7 @@ PicoDet 由 [PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection) 在轻量级主体检测任务中,为了更好地兼顾检测速度与效果,我们使用 PPLCNet_x2_5 作为主体检测模型的骨干网络,同时将训练与预测的图像尺度修改为了 640x640,其余配置与 [picodet_lcnet_1_5x_416_coco.yml](https://github.com/PaddlePaddle/PaddleDetection/blob/develop/configs/picodet/more_config/picodet_lcnet_1_5x_416_coco.yml) 完全一致。将数据集更换为自定义的主体检测数据集,进行训练,最终得到检测模型。 - + ### 2.2 服务端主体检测模型 @@ -93,13 +97,13 @@ PP-YOLO 由 [PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection) 在服务端主体检测任务中,为了保证检测效果,我们使用 ResNet50vd-DCN 作为检测模型的骨干网络,使用配置文件 [ppyolov2_r50vd_dcn_365e_coco.yml](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml),更换为自定义的主体检测数据集,进行训练,最终得到检测模型。 - + ## 3. 模型训练 本节主要介绍怎样基于 PaddleDetection,基于自己的数据集,训练主体检测模型。 - + ### 3.1 环境准备 @@ -116,7 +120,7 @@ pip install -r requirements.txt 更多安装教程,请参考: [安装文档](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/docs/tutorials/INSTALL_cn.md) - + ### 3.2 数据准备 @@ -128,7 +132,7 @@ pip install -r requirements.txt [{u'id': 1, u'name': u'foreground', u'supercategory': u'foreground'}] ``` - + ### 3.3 配置文件改动和说明 @@ -154,7 +158,7 @@ ppyolov2_reader.yml:主要说明数据读取器配置,如 batch size,并 此外,也可以根据实际情况,修改上述文件,比如,如果显存溢出,可以将 batch size 和学习率等比缩小等。 - + ### 3.4 启动训练 @@ -198,7 +202,7 @@ python -m paddle.distributed.launch --gpus 0,1,2,3 tools/train.py -c configs/ppy 注意:如果遇到 "`Out of memory error`" 问题, 尝试在 `ppyolov2_reader.yml` 文件中调小 `batch_size`,同时等比例调小学习率。 - + ### 3.5 模型预测与调试 @@ -211,9 +215,11 @@ python tools/infer.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml --infer `--draw_threshold` 是个可选参数. 根据 [NMS](https://ieeexplore.ieee.org/document/1699659) 的计算,不同阈值会产生不同的结果 `keep_top_k` 表示设置输出目标的最大数量,默认值为 100,用户可以根据自己的实际情况进行设定。 - + +## 4. 模型推理部署 -### 3.6 模型导出与预测部署。 + +### 4.1 推理模型准备 执行导出模型脚本: @@ -225,15 +231,21 @@ python tools/export_model.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml 注意: `PaddleDetection` 导出的 inference 模型的文件格式为 `model.xxx`,这里如果希望与 PaddleClas 的 inference 模型文件格式保持一致,需要将其 `model.xxx` 文件修改为 `inference.xxx` 文件,用于后续主体检测的预测部署。 -更多模型导出教程,请参考: [EXPORT_MODEL](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/deploy/EXPORT_MODEL.md) +更多模型导出教程,请参考: [EXPORT_MODEL](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.4/deploy/EXPORT_MODEL.md) 最终,目录 `inference/ppyolov2_r50vd_dcn_365e_coco` 中包含 `inference.pdiparams`, `inference.pdiparams.info` 以及 `inference.pdmodel` 文件,其中 `inference.pdiparams` 为保存的 inference 模型权重文件,`inference.pdmodel` 为保存的 inference 模型结构文件。 + +### 4.2 基于python预测引擎推理 导出模型之后,在主体检测与识别任务中,就可以将检测模型的路径更改为该 inference 模型路径,完成预测。 以商品识别为例,其配置文件为 [inference_product.yaml](../../../deploy/configs/inference_product.yaml),修改其中的 `Global.det_inference_model_dir` 字段为导出的主体检测 inference 模型目录,参考[图像识别快速开始教程](../quick_start/quick_start_recognition.md),即可完成商品检测与识别过程。 + +### 4.3 其他推理方式 +其他推理方法,如C++推理部署、PaddleServing部署等请参考[检测模型推理部署](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.4/deploy/README.md)。 + ### FAQ diff --git a/docs/zh_CN/image_recognition_pipeline/vector_search.md b/docs/zh_CN/image_recognition_pipeline/vector_search.md index 6cf4d207..be0bf785 100644 --- a/docs/zh_CN/image_recognition_pipeline/vector_search.md +++ b/docs/zh_CN/image_recognition_pipeline/vector_search.md @@ -1,5 +1,21 @@ # 向量检索 +## 目录 + +- [1. 向量检索应用场景介绍](#1) +- [2. 向量检索算法介绍](#2) + - [2.1 HNSW](#2.1) + - [2.2 IVF](#2.2) + - [2.3 FLAT](#2.3) +- [3. 检索库安装](#3) +- [4. 使用及配置文档介绍](#4) + - [4.1 建库及配置文件参数](#4.1) + - [4.2 检索配置文件参数](#4.2) + + + +## 1. 向量检索应用场景介绍 + 向量检索技术在图像识别、图像检索中应用比较广泛。其主要目标是,对于给定的查询向量,在已经建立好的向量库中,与库中所有的待查询向量,进行特征向量的相似度或距离计算,得到相似度排序。在图像识别系统中,我们使用 [Faiss](https://github.com/facebookresearch/faiss) 对此部分进行支持,具体信息请详查 [Faiss 官网](https://github.com/facebookresearch/faiss)。`Faiss` 主要有以下优势 - 适配性好:支持 Windos、Linux、MacOS 系统 @@ -20,17 +36,33 @@ -------------------------- -## 目录 + +## 2. 使用的检索算法 + +目前 `PaddleClas` 中检索模块,支持三种检索算法**HNSW32**、**IVF**、**FLAT**。每种检索算法,满足不同场景。其中 `HNSW32` 为默认方法,此方法的检索精度、检索速度可以取得一个较好的平衡,具体算法介绍可以查看[官方文档](https://github.com/facebookresearch/faiss/wiki)。 + + +### 2.1 HNSW方法 + +此方法为图索引方法,如下图所示,在建立索引的时候,分为不同的层,所以检索精度较高,速度较快,但是特征库只支持添加图像功能,不支持删除图像特征功能。基于图的向量检索算法在向量检索的评测中性能都是比较优异的。如果比较在乎检索算法的效率,而且可以容忍一定的空间成本,多数场景下比较推荐基于图的检索算法。而HNSW是一种典型的,应用广泛的图算法,很多分布式检索引擎都对HNSW算法进行了分布式改造,以应用于高并发,大数据量的线上查询。此方法为默认方法。 +
+ +
+ + +### 2.2 IVF -- [1. 检索库安装](#1) -- [2. 使用的检索算法](#2) -- [3. 使用及配置文档介绍](#3) - - [3.1 建库及配置文件参数](#3.1) - - [3.2 检索配置文件参数](#3.2) +一种倒排索引检索方法。速度较快,但是精度略低。特征库支持增加、删除图像特征功能。IVF主要利用倒排的思想保存每个聚类中心下的向量,每次查询向量的时候找到最近的几个中心,分别搜索这几个中心下的向量。通过减小搜索范围,大大提升搜索效率。 - + +### 2.3 FLAT -## 1. 检索库安装 +暴力检索算法。精度最高,但是数据量大时,检索速度较慢。特征库支持增加、删除图像特征功能。 + + + + +## 3. 检索库安装 `Faiss` 具体安装方法如下: @@ -40,27 +72,16 @@ pip install faiss-cpu==1.7.1post2 若使用时,不能正常引用,则 `uninstall` 之后,重新 `install`,尤其是 `windows` 下。 - - -## 2. 使用的检索算法 - -目前 `PaddleClas` 中检索模块,支持如下三种检索算法 - -- **HNSW32**: 一种图索引方法。检索精度较高,速度较快。但是特征库只支持添加图像功能,不支持删除图像特征功能。(默认方法) -- **IVF**:倒排索引检索方法。速度较快,但是精度略低。特征库支持增加、删除图像特征功能。 -- **FLAT**: 暴力检索算法。精度最高,但是数据量大时,检索速度较慢。特征库支持增加、删除图像特征功能。 - -每种检索算法,满足不同场景。其中 `HNSW32` 为默认方法,此方法的检索精度、检索速度可以取得一个较好的平衡,具体算法介绍可以查看[官方文档](https://github.com/facebookresearch/faiss/wiki)。 - + -## 3. 使用及配置文档介绍 +## 4. 使用及配置文档介绍 -涉及检索模块配置文件位于:`deploy/configs/` 下,其中 `build_*.yaml` 是建立特征库的相关配置文件,`inference_*.yaml` 是检索或者分类的推理配置文件。 +涉及检索模块配置文件位于:`deploy/configs/` 下,其中 `inference_*.yaml` 是检索或者分类的推理配置文件,同时也是建立特征库的相关配置文件。 - + -### 3.1 建库及配置文件参数 +### 4.1 建库及配置文件参数 建库的具体操作如下: @@ -68,14 +89,14 @@ pip install faiss-cpu==1.7.1post2 # 进入 deploy 目录 cd deploy # yaml 文件根据需要改成自己所需的具体 yaml 文件 -python python/build_gallery.py -c configs/build_***.yaml +python python/build_gallery.py -c configs/inference_***.yaml ``` 其中 `yaml` 文件的建库的配置如下,在运行时,请根据实际情况进行修改。建库操作会将根据 `data_file` 的图像列表,将 `image_root` 下的图像进行特征提取,并在 `index_dir` 下进行存储,以待后续检索使用。 其中 `data_file` 文件存储的是图像文件的路径和标签,每一行的格式为:`image_path label`。中间间隔以 `yaml` 文件中 `delimiter` 参数作为间隔。 -关于特征提取的具体模型参数,可查看 `yaml` 文件。 +关于特征提取的具体模型参数,可查看 `yaml` 文件。注意下面的配置参数只列举了建立索引库相关部分。 ```yaml # indexing engine config @@ -88,6 +109,7 @@ IndexProcess: delimiter: "\t" dist_type: "IP" embedding_size: 512 + batch_size: 32 ``` - **index_method**:使用的检索算法。目前支持三种,HNSW32、IVF、Flat @@ -98,23 +120,29 @@ IndexProcess: - **delimiter**:**data_file** 中每一行的间隔符 - **dist_type**: 特征匹配过程中使用的相似度计算方式。例如 `IP` 内积相似度计算方式,`L2` 欧式距离计算方法 - **embedding_size**:特征维度 +- **batch_size**:建立特征库时,特征提取的`batch_size` - + + +### 4.2 检索配置文件参数 -### 3.2 检索配置文件参数 将检索的过程融合到 `PP-ShiTu` 的整体流程中,请参考 [README](../../../README_ch.md) 中 `PP-ShiTu 图像识别系统介绍` 部分。检索具体使用操作请参考[识别快速开始文档](../quick_start/quick_start_recognition.md)。 其中,检索部分配置如下,整体检索配置文件,请参考 `deploy/configs/inference_*.yaml` 文件。 +注意:此部分参数只是列举了离线检索相关部分参数。 + ```yaml IndexProcess: index_dir: "./recognition_demo_data_v1.1/gallery_logo/index/" return_k: 5 score_thres: 0.5 + hamming_radius: 100 ``` 与建库配置文件不同,新参数主要如下: - `return_k`: 检索结果返回 `k` 个结果 - `score_thres`: 检索匹配的阈值 +- `hamming_radius`: 汉明距离半径。此参数只有在使用二值特征模型,`dist_type`设置为`hamming`时才能生效。具体二值特征模型使用方法请参考[哈希编码](./deep_hashing.md) -- GitLab