PaddleClas/docs/zh_CN/application/mainbody_detection.md

8.1 KiB
Raw Blame History

主体检测

主体检测技术是目前应用非常广泛的一种检测技术,它指的是检测出图片中一个或者多个主体的坐标位置,然后将图像中的对应区域裁剪下来,进行识别,从而完成整个识别过程。主体检测是识别任务的前序步骤,可以有效提升识别精度。

本部分主要从数据集、模型训练2个方面对该部分内容进行介绍。

1. 数据集

在PaddleClas的识别任务中训练主体检测模型时主要用到了以下几个数据集。

数据集 数据量 主体检测任务中使用的数据量 场景 数据集地址
Objects365 170W 6k 通用场景 地址
COCO2017 12W 5k 通用场景 地址
iCartoonFace 2k 2k 动漫人脸检测 地址
LogoDet-3k 3k 2k Logo检测 地址
RPC 3k 3k 商品检测 地址

在实际训练的过程中,将所有数据集混合在一起。由于是主体检测,这里将所有标注出的检测框对应的类别都修改为"前景"的类别最终融合的数据集中只包含1个类别即前景。

2. 模型选择

目标检测方法种类繁多比较常用的有两阶段检测器如FasterRCNN系列等单阶段检测器如YOLO、SSD等anchor-free检测器如FCOS等

PP-YOLO由PaddleDetection提出从骨干网络、数据增广、正则化策略、损失函数、后处理等多个角度对yolov3模型进行深度优化最终在"速度-精度"方面达到了业界领先的水平。具体地,优化的策略如下。

更多关于PP-YOLO的详细介绍可以参考PP-YOLO 模型

在主体检测任务中为了保证检测效果我们使用ResNet50vd-DCN的骨干网络使用配置文件ppyolov2_r50vd_dcn_365e_coco.yml,更换为自定义的主体检测数据集,进行训练,最终得到检测模型。 主体检测模型的inference模型下载地址为链接

3. 模型训练

本节主要介绍怎样基于PaddleDetection基于自己的数据集训练主体检测模型。

3.1 环境准备

下载PaddleDetection代码安装requirements。

cd <path/to/clone/PaddleDetection>
git clone https://github.com/PaddlePaddle/PaddleDetection.git

cd PaddleDetection
# 安装其他依赖
pip install -r requirements.txt

更多安装教程,请参考: 安装文档

3.2 数据准备

对于自定义数据集首先需要将自己的数据集修改为COCO格式可以参考自定义检测数据集教程制作COCO格式的数据集。

主体检测任务中,所有的检测框均属于前景,在这里需要将标注文件中,检测框的category_id修改为1同时将整个标注文件中的categories映射表修改为下面的格式,即整个类别映射表中只包含前景类别。

[{u'id': 1, u'name': u'foreground', u'supercategory': u'foreground'}]

3.3 配置文件改动和说明

我们使用 configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml配置进行训练,配置文件摘要如下:

从上图看到 ppyolov2_r50vd_dcn_365e_coco.yml 配置需要依赖其他的配置文件,这些配置文件的含义如下:

coco_detection.yml主要说明了训练数据和验证数据的路径

runtime.yml主要说明了公共的运行参数比如是否使用GPU、每多少个epoch存储checkpoint等

optimizer_365e.yml主要说明了学习率和优化器的配置

ppyolov2_r50vd_dcn.yml主要说明模型和主干网络的情况

ppyolov2_reader.yml主要说明数据读取器配置如batch size并发加载子进程数等同时包含读取后预处理操作如resize、数据增强等等

在主体检测任务中,需要将datasets/coco_detection.yml中的num_classes参数修改为1只有1个前景类别同时将训练集和测试集的路径修改为自定义数据集的路径。

此外也可以根据实际情况修改上述文件比如如果显存溢出可以将batch size和学习率等比缩小等。

3.4 启动训练

PaddleDetection提供了单卡/多卡训练模式,满足用户多种训练需求。

  • GPU 单卡训练
# windows和Mac下不需要执行该命令
export CUDA_VISIBLE_DEVICES=0
python tools/train.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml
  • GPU多卡训练
export CUDA_VISIBLE_DEVICES=0,1,2,3
python -m paddle.distributed.launch --gpus 0,1,2,3 tools/train.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml --eval

--eval表示边训练边验证

  • 模型恢复训练

在日常训练过程中,有的用户由于一些原因导致训练中断,可以使用-r的命令恢复训练:

export CUDA_VISIBLE_DEVICES=0,1,2,3
python -m paddle.distributed.launch --gpus 0,1,2,3 tools/train.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml --eval -r output/ppyolov2_r50vd_dcn_365e_coco/10000

注意:如果遇到 "Out of memory error" 问题, 尝试在 ppyolov2_reader.yml 文件中调小batch_size

3.5 模型预测与调试

使用下面的命令完成PaddleDetection的预测过程。

export CUDA_VISIBLE_DEVICES=0
python tools/infer.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml --infer_img=your_image_path.jpg --output_dir=infer_output/ --draw_threshold=0.5 -o weights=output/ppyolov2_r50vd_dcn_365e_coco/model_final

--draw_threshold 是个可选参数. 根据 NMS 的计算,不同阈值会产生不同的结果 keep_top_k表示设置输出目标的最大数量默认值为100用户可以根据自己的实际情况进行设定。

3.6 模型导出与预测部署。

执行导出模型脚本:

python tools/export_model.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml --output_dir=./inference -o weights=output/ppyolov2_r50vd_dcn_365e_coco/model_final.pdparams

预测模型会导出到inference/ppyolov2_r50vd_dcn_365e_coco目录下,分别为infer_cfg.yml(预测不需要), model.pdiparams, model.pdiparams.info,model.pdmodel

注意:PaddleDetection导出的inference模型的文件格式为model.xxx这里如果希望与PaddleClas的inference模型文件格式保持一致需要将其model.xxx文件修改为inference.xxx文件,用于后续主体检测的预测部署。

更多模型导出教程,请参考:EXPORT_MODEL

导出模型之后在主体检测与识别任务中就可以将检测模型的路径更改为该inference模型路径完成预测。图像识别快速体验可以参考图像识别快速开始教程