主体检测技术是目前应用非常广泛的一种检测技术,它指的是检测出图片中一个或者多个主体的坐标位置,然后将图像中的对应区域裁剪下来,进行识别,从而完成整个识别过程。主体检测是识别任务的前序步骤,可以有效提升识别精度。
本部分主要从数据集、模型选择和模型训练 3 个方面对该部分内容进行介绍。
在 PaddleClas 的识别任务中,训练主体检测模型时主要用到了以下几个数据集。
数据集 | 数据量 | 主体检测任务中使用的数据量 | 场景 | 数据集地址 |
---|---|---|---|---|
Objects365 | 170W | 6k | 通用场景 | 地址 |
COCO2017 | 12W | 5k | 通用场景 | 地址 |
iCartoonFace | 2k | 2k | 动漫人脸检测 | 地址 |
LogoDet-3k | 3k | 2k | Logo 检测 | 地址 |
RPC | 3k | 3k | 商品检测 | 地址 |
在实际训练的过程中,将所有数据集混合在一起。由于是主体检测,这里将所有标注出的检测框对应的类别都修改为 前景
的类别,最终融合的数据集中只包含 1 个类别,即前景。
目标检测方法种类繁多,比较常用的有两阶段检测器(如 FasterRCNN 系列等);单阶段检测器(如 YOLO、SSD 等);anchor-free 检测器(如 PicoDet、FCOS 等)。在主体检测中,我们使用PicoDet系列模型,其在CPU端与移动端,速度较快、精度较好,处于较为领先的业界水平。
基于上述研究,PaddleClas 中提供了 1 个通用主体检测模型,既轻量级主体检测模型,分别适用于端侧场景以及服务端场景。下面的表格中给出了在上述 5 个数据集上的平均 mAP 以及它们的模型大小、预测速度对比信息。
模型 | 模型结构 | 预训练模型下载地址 | inference 模型下载地址 | mAP | inference 模型大小(MB) |
---|---|---|---|---|---|
轻量级主体检测模型 | PicoDet | 地址 | tar 格式文件地址 zip 格式文件地址 | 41.5% | 30.1 |
tar
格式文件时存在问题,建议非命令行用户下载 zip
格式文件并解压。tar
格式文件建议使用命令 tar xf xxx.tar
解压。Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz
,速度指标为开启 mkldnn,线程数设置为 10 测试得到。PicoDet 由 PaddleDetection 提出,是一个适用于 CPU 或者移动端场景的目标检测算法。具体地,它融合了下面一系列优化算法。
更多关于 PicoDet 的优化细节与 benchmark 可以参考 PicoDet 系列模型介绍。
在轻量级主体检测任务中,为了更好地兼顾检测速度与效果,我们使用 PPLCNet_x2_5 作为主体检测模型的骨干网络,同时将训练与预测的图像尺度修改为了 640x640,其余配置与 picodet_l_416_coco.yml 完全一致。将数据集更换为自定义的主体检测数据集,进行训练,最终得到检测模型。
本节主要介绍怎样基于 PaddleDetection,基于自己的数据集,训练主体检测模型。
下载 PaddleDetection 代码,安装 requirements。
cd <path/to/clone/PaddleDetection>
git clone https://github.com/PaddlePaddle/PaddleDetection.git
cd PaddleDetection
# 切换到2.3分支
git checkout release/2.3
# 安装其他依赖
pip install -r requirements.txt
更多安装教程,请参考: 安装文档
对于自定义数据集,首先需要将自己的数据集修改为 COCO 格式,可以参考自定义检测数据集教程制作 COCO 格式的数据集。
主体检测任务中,所有的检测框均属于前景,在这里需要将标注文件中,检测框的 category_id
修改为 1,同时将整个标注文件中的 categories
映射表修改为下面的格式,即整个类别映射表中只包含前景
类别。
[{u'id': 1, u'name': u'foreground', u'supercategory': u'foreground'}]
我们使用 mainbody_detection/picodet_lcnet_x2_5_640_mainbody.yml 配置进行训练,配置文件摘要如下:
从上图看到 mainbody_detection/picodet_lcnet_x2_5_640_mainbody.yml
配置需要依赖其他的配置文件,这些配置文件的含义如下:
runtime.yml:主要说明了公共的运行参数,比如是否使用 GPU、每多少个 epoch 存储 checkpoint 等
optimizer_100e.yml:主要说明了学习率和优化器的配置
picodet_esnet.yml:主要说明模型和主干网络的情况
picodet_640_reader.yml:主要说明数据读取器配置,如 batch size,并发加载子进程数等,同时包含读取后预处理操作,如 resize、数据增强等等
在主体检测任务中,需要将 datasets/coco_detection.yml
中的 num_classes
参数修改为 1(只有 1 个前景类别),同时将训练集和测试集的路径修改为自定义数据集的路径。
此外,也可以根据实际情况,修改上述文件,比如,如果显存溢出,可以将 batch size 和学习率等比缩小等。
PaddleDetection 提供了单卡/多卡训练模式,满足用户多种训练需求。
# windows 和 Mac 下不需要执行该命令
export CUDA_VISIBLE_DEVICES=0
python tools/train.py -c configs/picodet/application/mainbody_detection/picodet_lcnet_x2_5_640_mainbody.yml
export CUDA_VISIBLE_DEVICES=0,1,2,3
python -m paddle.distributed.launch --gpus 0,1,2,3 tools/train.py -c configs/picodet/legacy_model/mainbody_detection/picodet_lcnet_x2_5_640_mainbody.yml --eval
--eval:表示边训练边验证。
export CUDA_VISIBLE_DEVICES=0
# 指定 pretrain_weights 参数,加载通用的主体检测预训练模型
python tools/train.py -c configs/picodet/application/mainbody_detection/picodet_lcnet_x2_5_640_mainbody.yml -o pretrain_weights=https://paddledet.bj.bcebos.com/models/picodet_lcnet_x2_5_640_mainbody.pdparams
在日常训练过程中,有的用户由于一些原因导致训练中断,可以使用 -r
的命令恢复训练:
export CUDA_VISIBLE_DEVICES=0,1,2,3
python -m paddle.distributed.launch --gpus 0,1,2,3 tools/train.py -c configs/picodet/application/mainbody_detection/picodet_lcnet_x2_5_640_mainbody.yml --eval -r output/picodet_lcnet_x2_5_640_mainbody/20
注意:
-r
命令中最后20
表示从第20个epoch保存的权重开始训练,使用时确保20.pdparams 20.pdopt
文件存在。请根据实际自行修改
如果遇到 "Out of memory error
" 问题, 尝试在 picodet_640_reader.yml
文件中调小 batch_size
,同时等比例调小学习率。
使用下面的命令完成 PaddleDetection 的预测过程。
export CUDA_VISIBLE_DEVICES=0
python tools/infer.py -c configs/picodet/application/mainbody_detection/picodet_lcnet_x2_5_640_mainbody.yml --infer_img=your_image_path.jpg --output_dir=infer_output/ --draw_threshold=0.5 -o weights=output/picodet_lcnet_x2_5_640_mainbody/model_final
--draw_threshold
是个可选参数. 根据 NMS 的计算,不同阈值会产生不同的结果 keep_top_k
表示设置输出目标的最大数量,默认值为 100,用户可以根据自己的实际情况进行设定。
执行导出模型脚本:
python tools/export_model.py -c configs/picodet/application/mainbody_detection/picodet_lcnet_x2_5_640_mainbody.yml --output_dir=./inference -o weights=output/picodet_lcnet_x2_5_640_mainbody/model_final.pdparams
预测模型会导出到 inference/picodet_lcnet_x2_5_640_mainbody
目录下,分别为 infer_cfg.yml
(预测不需要), model.pdiparams
, model.pdiparams.info
, model.pdmodel
。
注意: PaddleDetection
导出的 inference 模型的文件格式为 model.xxx
,这里如果希望与 PaddleClas 的 inference 模型文件格式保持一致,需要将其 model.xxx
文件修改为 inference.xxx
文件,用于后续主体检测的预测部署。
更多模型导出教程,请参考: EXPORT_MODEL
最终,目录 inference/picodet_lcnet_x2_5_640_mainbody
中包含 inference.pdiparams
, inference.pdiparams.info
以及 inference.pdmodel
文件,其中 inference.pdiparams
为保存的 inference 模型权重文件,inference.pdmodel
为保存的 inference 模型结构文件。
导出模型之后,在主体检测与识别任务中,就可以将检测模型的路径更改为该 inference 模型路径,完成预测。
以商品识别为例,其配置文件为 inference_product.yaml,修改其中的 Global.det_inference_model_dir
字段为导出的主体检测 inference 模型目录,参考图像识别快速开始教程,即可完成商品检测与识别过程。
其他推理方法,如C++推理部署、PaddleServing部署等请参考检测模型推理部署。
640x640
的分辨率去训练的,因此预测的时候也是默认使用 640x640
的分辨率进行预测,使用其他分辨率预测的话,精度会有所降低。此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。