PaddleDetection是由百度推出的目标检测开源模型库;
Python版本:[PaddlePaddle/PaddleDetection],关于PaddleDetection兼容的python版本,需要到其repo中去查看安装说明;
PaddlePaddle版本:[PaddlePaddle/PaddleDetection],也需要到安装说明中查看,一般是在满足最低版本要求后安装最新的稳定版本;
# 预测
python tools/infer.py -c configs/faster_rcnn_r50_1x.yml --infer_img=demo/000000570688.jpg
# 在CPU上进行推理
python tools/infer.py -c configs/ppyolo/ppyolo_r50vd_dcn_1x_coco.yml -o use_gpu=false weights=https://paddledet.bj.bcebos.com/models/ppyolo_r50vd_dcn_1x_coco.pdparams --infer_img=demo/000000014439.jpg
# CPU推理需要显式指定:use_gpu=false
# demo/000000014439.jpg已经内置在PaddleDetection的repo文件夹中
Note:在output
目录下生成的同名的测试文件会被替换。
在PaddleDetection使用model.yml来配置模型的结构,配置文件的路径一般如下所示:
PaddleDetection/configs/model/model_***_coco.yml
模型参数:
PostProcess
:后处理操作,(仅用于“CornerNet”模型)参数 | 描述 |
---|---|
TrainReader.batch_size | 每张卡上的batch-size |
ppdet/optimizer.py
包含了PaddleDetection优化器的设置代码;
Class | Description |
---|---|
OptimizerBuilder |
根据config的设置构建优化器 |
用于进行图像的预测
import os, sys
# add python path of PadleDetection to sys.path
parent_path = os.path.abspath(os.path.join(__file__, *(['..'] * 2)))
if parent_path not in sys.path:
sys.path.append(parent_path)
# 使用sys.path.append添加环境变量,在脚本执行完成之后则会失效
用于目标检测的后处理;
用于CornerNet的后处理函数;
参数:
results
:bbox
: 检测框信息,包含类别和坐标信息im_id
: 图像iddef corner_post_process(results, config, num_classes):
detections = results['bbox'][0]
keep_inds = (detections[:, 1] > -1)
detections = detections[keep_inds]
labels = detections[:, 0]
scores = detections[:, 1]
boxes = detections[:, 2:6]
cls_boxes = get_nms_result(
boxes, scores, config, num_classes, background_label=-1, labels=labels)
results.update({'bbox': (cls_boxes, [[len(cls_boxes)]])})
关于PP-YOLOE的论文学习笔记,请参考《PP-YOLOE的译读笔记》;
学习资料:
Paddle目标检测算法课程——PPYOLOE
Paddle目标检测算法课程——PPYOLOE | PPT
技术一览表:
名称 | 超参数 |
---|---|
Input size | 640 |
Down sample | AdaptiveAvgPool2d (目前是在Head部分的代码中看到此算子作为下采样的方式) |
Act | Swish (SiLU) |
Head | PPYOLOEHead |
Optimizer | SGD with momentum and L2-regularization |
Weight decay | 0.0005 |
关于这个repo的说明文档,请参阅《PPYOLO、PPYOLOv2、PPYOLOE的pytorch实现三合一!尽在miemiedetection!》;
关于PP-YOLOE对bias项weight_decay的处理,请参考[PaddleDetection | backbones/cspresnet.py];
总的来说,就是对BN层的所有参数不使用weight_decay,即:
self.bn = nn.BatchNorm2D(
ch_out,
weight_attr=ParamAttr(regularizer=L2Decay(0.0)),
bias_attr=ParamAttr(regularizer=L2Decay(0.0)))
这里我们参考的是[miemie2013/miemiedetection]的实现方法:[miemiedetection]是从[mmdetection]中移植过来的,这里继承了mmdetection的书写方式[code – add_param_group]:
这里的model.add_param_group调用的是模型的.add_param_group()方法[ppyoloe.py – add_param_group()];
Paddle文档:《自定义C++算子-PaddlePaddle文档 | 支持多种数据类型》