基于paddleDetect的半監督目標檢測實戰
- 前言
- 相關介紹
- 前提條件
- 實驗環境
- 安裝環境
- 項目地址
- 使用paddleDetect的半監督方法訓練自己的數據集
- 準備數據
- 分割數據集
- 配置參數文件
- PaddleDetection-2.7.0/configs/semi_det/denseteacher/denseteacher_ppyoloe_plus_crn_l_coco_semi010.yml
- PaddleDetection-2.7.0/configs/semi_det/\_base_/coco_detection_percent_10.yml
- 訓練
- 預測
- 導出
- 推理
- 參考文獻
前言
- 由于本人水平有限,難免出現錯漏,敬請批評改正。
- 更多精彩內容,可點擊進入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_modelepochs: &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.0unsup_weight: 1.0loss_weight: {distill_loss_cls: 1.0, distill_loss_iou: 2.5, distill_loss_dfl: 0., distill_loss_contrast: 0.1}contrast_loss:temperature: 0.2alpha: 0.9smooth_iter: 100concat_sup_data: Truesuppress: linearratio: 0.01test_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_boxesweak_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_sizeunsup_batch_size: *batch_sizeshuffle: Truedrop_last: Truecollate_batch: TrueEvalReader: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: 2TestReader: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: CSPResNetneck: CustomCSPPANyolo_head: PPYOLOEHeadpost_process: ~eval_size: ~ # means None, but not str 'None'
PPYOLOEHead:fpn_strides: [32, 16, 8]grid_cell_scale: 5.0grid_cell_offset: 0.5static_assigner_epoch: -1 #use_varifocal_loss: Trueloss_weight: {class: 1.0, iou: 2.5, dfl: 0.5}static_assigner:name: ATSSAssignertopk: 9assigner:name: TaskAlignedAssignertopk: 13alpha: 1.0beta: 6.0nms:name: MultiClassNMSnms_top_k: 1000keep_top_k: 300score_threshold: 0.01nms_threshold: 0.7### other config
epoch: *epochs
LearningRate:base_lr: 0.01schedulers:- !CosineDecaymax_epochs: *cosine_epochsuse_warmup: *use_warmup- !LinearWarmupstart_factor: 0.001epochs: 3OptimizerBuilder:optimizer:momentum: 0.9type: Momentumregularizer:factor: 0.0005 # dt-fcos 0.0001type: L2clip_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:!SemiCOCODataSetimage_dir: JPEGImagesanno_path: train.jsondataset_dir: ./trainning_dataset/coco/data_fields: ['image', 'gt_bbox', 'gt_class', 'is_crowd']# partial unlabeled COCO, use `SemiCOCODataSet` rather than `COCODataSet`
UnsupTrainDataset:!SemiCOCODataSetimage_dir: JPEGImagesanno_path: test.jsondataset_dir: ./trainning_dataset/coco/data_fields: ['image']supervised: FalseEvalDataset:!COCODataSetimage_dir: JPEGImagesanno_path: val.jsondataset_dir: ./trainning_dataset/coco/allow_empty: trueTestDataset:!ImageFolderanno_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 paddleDetectexport 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 paddleDetectexport 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 paddleDetectpython 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 paddleDetectexport 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開源項目