基于paddleDetect的半监督目标检测实战
前言
- 由于本人水平有限,难免出现错漏,敬请批评改正。
- 更多精彩内容,可点击进入Python日常小操作专栏、OpenCV-Python小应用专栏、YOLO系列专栏、自然语言处理专栏、人工智能混合编程实践专栏或我的个人主页查看
- 人工智能混合编程实践:C++调用Python ONNX进行YOLOv8推理
- 人工智能混合编程实践:C++调用封装好的DLL进行YOLOv8实例分割
- 人工智能混合编程实践:C++调用Python ONNX进行图像超分重建
- 人工智能混合编程实践:C++调用Python AgentOCR进行文本识别
- 通过计算实例简单地理解PatchCore异常检测
- Python将YOLO格式实例分割数据集转换为COCO格式实例分割数据集
- YOLOv8 Ultralytics:使用Ultralytics框架训练RT-DETR实时目标检测模型
- 基于DETR的人脸伪装检测
- YOLOv7训练自己的数据集(口罩检测)
- YOLOv8训练自己的数据集(足球检测)
- YOLOv5:TensorRT加速YOLOv5模型推理
- YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU
- 玩转Jetson Nano(五):TensorRT加速YOLOv5目标检测
- YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制
- YOLOv5:yolov5s.yaml配置文件解读、增加小目标检测层
- Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集
- YOLOv5:使用7.0版本训练自己的实例分割模型(车辆、行人、路标、车道线等实例分割)
- 使用Kaggle GPU资源免费体验Stable Diffusion开源项目
相关介绍
PaddleDetection是一个基于PaddlePaddle的目标检测端到端开发套件,在提供丰富的模型组件和测试基准的同时,注重端到端的产业落地应用,通过打造产业级特色模型|工具、建设产业应用范例等手段,帮助开发者实现数据准备、模型选型、模型训练、模型部署的全流程打通,快速进行落地应用。
主要模型效果示例如下(点击标题可快速跳转):
通用目标检测 | 小目标检测 | 旋转框检测 | 3D目标物检测 |
---|---|---|---|
![]() |
![]() |
![]() |
![]() |
人脸检测 | 2D关键点检测 | 多目标追踪 | 实例分割 |
![]() |
![]() |
![]() |
![]() |
车辆分析——车牌识别 | 车辆分析——车流统计 | 车辆分析——违章检测 | 车辆分析——属性分析 |
![]() |
![]() |
![]() |
![]() |
行人分析——闯入分析 | 行人分析——行为分析 | 行人分析——属性分析 | 行人分析——人流统计 |
![]() |
![]() |
![]() |
![]() |
同时,PaddleDetection提供了模型的在线体验功能,用户可以选择自己的数据进行在线推理。
前提条件
- 熟悉Python
实验环境
Package Version Editable project location
---------------------- ------------- -----------------------------------------------
albumentations 1.3.1
matplotlib 3.7.1
numba 0.56.4
numpy 1.23.5
onnx 1.14.0
opencv-python 4.5.5.64
opencv-python-headless 4.11.0.86
packaging 23.1
paddle-bfloat 0.1.7
paddle2onnx 1.0.6
paddleclas 2.5.1
paddledet 0.0.0
paddlepaddle-gpu 2.4.2.post116
paddleseg 2.8.0
paddleslim 1.1.1
paddlex 1.3.7
pandas 2.0.1
Pillow 9.5.0
pip 23.0.1
protobuf 3.20.0
pycocotools 2.0.7
scikit-image 0.22.0
scikit-learn 1.2.2
scipy 1.10.1
setuptools 66.0.0
torch 1.10.1
torchvision 0.11.2
安装环境
- 具体安装步骤,请查阅官方安装文档:https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.8.1/docs/tutorials/INSTALL_cn.md
项目地址
- PaddleDetection 源代码地址:https://github.com/PaddlePaddle/PaddleDetection.git
git clone --branch v2.7.0 https://github.com/PaddlePaddle/PaddleDetection.git
cd PaddleDetection-2.7.0
使用paddleDetect的半监督方法训练自己的数据集
准备数据
准备一个所需要训练的coco格式数据集。
分割数据集
paddlex --split_dataset --format COCO --dataset_dir ./trainning_dataset/coco/ --val_value 0.05 --test_value 0.05
- –dataset_dir:coco数据集所在的文件夹路径。
配置参数文件
PaddleDetection-2.7.0/configs/semi_det/denseteacher/denseteacher_ppyoloe_plus_crn_l_coco_semi010.yml
可根据实际情况修改参数,一般不需要修改,直接使用默认参数即可。
_BASE_: [
'../../ppyoloe/ppyoloe_plus_crn_l_80e_coco.yml',
'../_base_/coco_detection_percent_10.yml',
]
log_iter: 50
snapshot_epoch: 5
# weights: output/denseteacher_ppyoloe_plus_crn_l_coco_semi010/model_final
weights: output/best_model
epochs: &epochs 200
cosine_epochs: &cosine_epochs 240
### pretrain and warmup config, choose one and comment another
pretrain_weights: https://bj.bcebos.com/v1/paddledet/models/ppyoloe_plus_crn_l_80e_coco_sup010.pdparams # mAP=45.7
semi_start_iters: 0
ema_start_iters: 0
use_warmup: &use_warmup False
# pretrain_weights: https://bj.bcebos.com/v1/paddledet/models/pretrained/ppyoloe_crn_l_obj365_pretrained.pdparams
# semi_start_iters: 5000
# ema_start_iters: 3000
# use_warmup: &use_warmup True
### global config
use_simple_ema: True
ema_decay: 0.9996
ssod_method: DenseTeacher
DenseTeacher:
train_cfg:
sup_weight: 1.0
unsup_weight: 1.0
loss_weight: {distill_loss_cls: 1.0, distill_loss_iou: 2.5, distill_loss_dfl: 0., distill_loss_contrast: 0.1}
contrast_loss:
temperature: 0.2
alpha: 0.9
smooth_iter: 100
concat_sup_data: True
suppress: linear
ratio: 0.01
test_cfg:
inference_on: teacher
### reader config
batch_size: &batch_size 8
worker_num: 2
SemiTrainReader:
sample_transforms:
- Decode: {}
- RandomDistort: {}
- RandomExpand: {fill_value: [123.675, 116.28, 103.53]}
- RandomFlip: {}
- RandomCrop: {} # unsup will be fake gt_boxes
weak_aug:
- NormalizeImage: {mean: [0., 0., 0.], std: [1., 1., 1.], is_scale: true, norm_type: none}
strong_aug:
- StrongAugImage: {transforms: [
RandomColorJitter: {prob: 0.8, brightness: 0.4, contrast: 0.4, saturation: 0.4, hue: 0.1},
RandomErasingCrop: {},
RandomGaussianBlur: {prob: 0.5, sigma: [0.1, 2.0]},
RandomGrayscale: {prob: 0.2},
]}
- NormalizeImage: {mean: [0., 0., 0.], std: [1., 1., 1.], is_scale: true, norm_type: none}
sup_batch_transforms:
- BatchRandomResize: {target_size: [640], random_size: True, random_interp: True, keep_ratio: False}
- Permute: {}
- PadGT: {}
unsup_batch_transforms:
- BatchRandomResize: {target_size: [640], random_size: True, random_interp: True, keep_ratio: False}
- Permute: {}
sup_batch_size: *batch_size
unsup_batch_size: *batch_size
shuffle: True
drop_last: True
collate_batch: True
EvalReader:
sample_transforms:
- Decode: {}
- Resize: {target_size: [640, 640], keep_ratio: False, interp: 2}
- NormalizeImage: {mean: [0., 0., 0.], std: [1., 1., 1.], norm_type: none}
- Permute: {}
batch_size: 2
TestReader:
inputs_def:
image_shape: [3, 640, 640]
sample_transforms:
- Decode: {}
- Resize: {target_size: [640, 640], keep_ratio: False, interp: 2}
- NormalizeImage: {mean: [0., 0., 0.], std: [1., 1., 1.], norm_type: none}
- Permute: {}
batch_size: 1
### model config
architecture: PPYOLOE
norm_type: sync_bn
ema_black_list: ['proj_conv.weight']
custom_black_list: ['reduce_mean']
PPYOLOE:
backbone: CSPResNet
neck: CustomCSPPAN
yolo_head: PPYOLOEHead
post_process: ~
eval_size: ~ # means None, but not str 'None'
PPYOLOEHead:
fpn_strides: [32, 16, 8]
grid_cell_scale: 5.0
grid_cell_offset: 0.5
static_assigner_epoch: -1 #
use_varifocal_loss: True
loss_weight: {class: 1.0, iou: 2.5, dfl: 0.5}
static_assigner:
name: ATSSAssigner
topk: 9
assigner:
name: TaskAlignedAssigner
topk: 13
alpha: 1.0
beta: 6.0
nms:
name: MultiClassNMS
nms_top_k: 1000
keep_top_k: 300
score_threshold: 0.01
nms_threshold: 0.7
### other config
epoch: *epochs
LearningRate:
base_lr: 0.01
schedulers:
- !CosineDecay
max_epochs: *cosine_epochs
use_warmup: *use_warmup
- !LinearWarmup
start_factor: 0.001
epochs: 3
OptimizerBuilder:
optimizer:
momentum: 0.9
type: Momentum
regularizer:
factor: 0.0005 # dt-fcos 0.0001
type: L2
clip_grad_by_norm: 1.0 # dt-fcos clip_grad_by_value
PaddleDetection-2.7.0/configs/semi_det/_base_/coco_detection_percent_10.yml
这里要修改对应数据集的路径,以及数据集的类别数
- num_classes: 1(数据集的类别数)
- image_dir: JPEGImages
- anno_path: train.json
- dataset_dir: ./trainning_dataset/coco/
metric: COCO
num_classes: 1
# partial labeled COCO, use `SemiCOCODataSet` rather than `COCODataSet`
TrainDataset:
!SemiCOCODataSet
image_dir: JPEGImages
anno_path: train.json
dataset_dir: ./trainning_dataset/coco/
data_fields: ['image', 'gt_bbox', 'gt_class', 'is_crowd']
# partial unlabeled COCO, use `SemiCOCODataSet` rather than `COCODataSet`
UnsupTrainDataset:
!SemiCOCODataSet
image_dir: JPEGImages
anno_path: test.json
dataset_dir: ./trainning_dataset/coco/
data_fields: ['image']
supervised: False
EvalDataset:
!COCODataSet
image_dir: JPEGImages
anno_path: val.json
dataset_dir: ./trainning_dataset/coco/
allow_empty: true
TestDataset:
!ImageFolder
anno_path: annotations/instances_val2017.json # also support txt (like VOC's label_list.txt)
dataset_dir: dataset/coco # if set, anno_path will be 'dataset_dir/anno_path'
训练
conda activate paddleDetect
export CUDA_VISIBLE_DEVICES=0 # 设置1张可用的卡
nohup python PaddleDetection-2.7.0/tools/train.py -c PaddleDetection-2.7.0/configs/semi_det/denseteacher/denseteacher_ppyoloe_plus_crn_l_coco_semi010.yml -o use_gpu=true --eval --amp &
训练的权重会保存在./output文件夹里。
预测
conda activate paddleDetect
export CUDA_VISIBLE_DEVICES=0 # 设置1张可用的卡
python PaddleDetection-2.7.0/tools/infer.py -c PaddleDetection-2.7.0/configs/semi_det/denseteacher/denseteacher_ppyoloe_plus_crn_l_coco_semi010.yml -o weights=output/best_model.pdparams --infer_dir=test_imgs/ --output_dir infer_output
预测出来的图片会保存在./infer_output文件夹里。
导出
conda activate paddleDetect
python PaddleDetection-2.7.0/tools/export_model.py -c PaddleDetection-2.7.0/configs/semi_det/denseteacher/denseteacher_ppyoloe_plus_crn_l_coco_semi010.yml -o weights=output/best_model.pdparams -o trt=True
导出的权重会保存在./output_inference文件夹里。
推理
conda activate paddleDetect
export CUDA_VISIBLE_DEVICES=0 # 设置1张可用的卡
python PaddleDetection-2.7.0/deploy/python/infer.py --model_dir=./output_inference/denseteacher_ppyoloe_plus_crn_l_coco_semi010/ --image_dir=test_imgs/ --output_dir=infer_output_pdimodel --device=GPU
推理出来的图片会保存在./infer_output_pdimodel文件夹里。
参考文献
[1] PaddleDetection 源代码地址:https://github.com/PaddlePaddle/PaddleDetection.git
[2] https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.8.1/configs/ppyoloe/README_cn.md
[3] https://github.com/PaddlePaddle/PaddleDetection/tree/release/2.8.1/configs/semi_det
[4] https://github.com/Megvii-BaseDetection/DenseTeacher
[5] https://arxiv.org/abs/2207.02541v2
- 由于本人水平有限,难免出现错漏,敬请批评改正。
- 更多精彩内容,可点击进入Python日常小操作专栏、OpenCV-Python小应用专栏、YOLO系列专栏、自然语言处理专栏、人工智能混合编程实践专栏或我的个人主页查看
- 人工智能混合编程实践:C++调用Python ONNX进行YOLOv8推理
- 人工智能混合编程实践:C++调用封装好的DLL进行YOLOv8实例分割
- 人工智能混合编程实践:C++调用Python ONNX进行图像超分重建
- 人工智能混合编程实践:C++调用Python AgentOCR进行文本识别
- 通过计算实例简单地理解PatchCore异常检测
- Python将YOLO格式实例分割数据集转换为COCO格式实例分割数据集
- YOLOv8 Ultralytics:使用Ultralytics框架训练RT-DETR实时目标检测模型
- 基于DETR的人脸伪装检测
- YOLOv7训练自己的数据集(口罩检测)
- YOLOv8训练自己的数据集(足球检测)
- YOLOv5:TensorRT加速YOLOv5模型推理
- YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU
- 玩转Jetson Nano(五):TensorRT加速YOLOv5目标检测
- YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制
- YOLOv5:yolov5s.yaml配置文件解读、增加小目标检测层
- Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集
- YOLOv5:使用7.0版本训练自己的实例分割模型(车辆、行人、路标、车道线等实例分割)
- 使用Kaggle GPU资源免费体验Stable Diffusion开源项目