本篇博客不计入作业
目标检测任务简介
目标检测的主要目的是让计算机可以自动识别图片或者视频帧中所有目标的类别,并在该目标周围绘制边界框,标示出每个目标的位置,如下图所示。
图(a)是图像分类任务,只需识别出这是一张斑马的图片。 图(b)是目标检测任务,不仅要识别出这是一张斑马的图片,还要标出图中斑马的位置。
目标检测是计算机视觉的主要方向之一,同时也是实例分割,人脸检测,关键点检测等视觉任务的基础,目标检测应用场景广泛,下面列举了一些常见的应用场景。
目标检测任务的挑战
对于目标检测任务,主要存在以下挑战:
- 数据有限(Limited data)
目标检测的样本标注比图像分类要难很多,所以很难有像ImageNet这样的超大数据集用于训练,而数据量对模型非常重要,因此在目标检测中数据增强是十分重要的。 - 定位/识别任务双优先级(Dual priority)
目标检测涉及定位和识别两个子任务,高效地在两个子任务中都取得很好的效果,不同算法有不同的效果,不同场景需要不同的侧重。 - 多尺度(Multiple spatial scales and aspect ratios)
目标检测中存在多尺度的情况,比如狗和小黄鸭,尺度相差很大,框的长宽比也有差异。 - 类别不均衡(Class imbalance)
不同类别样本数差异大的问题,两条腿的人到处都是,四条腿的熊猫只能去动物园找到,类别的不均衡也会加大目标检测任务的难度。 - 实时检测需求(Speed for real-time detection)
不少应用场景对目标检测的实时性要求很高。
PaddleDetection简介
PaddleDetection是飞桨推出的端到端目标检测开发套件,旨在帮助开发者更快更好地完成检测模型的训练、精度速度优化到部署全流程。PaddleDetection以模块化的设计实现了多种主流目标检测算法,并且提供了丰富的数据增强、网络组件、损失函数等模块,集成了模型压缩和跨平台高性能部署能力。目前基于PaddleDetection已经完成落地的项目涉及工业质检、遥感图像检测、无人巡检等多个领域。
PaddleDetection具备以下四大优势:
- 模型丰富:PaddleDetection提供了丰富的模型,包含目标检测、实例分割、人脸检测等100+个预训练模型,10+算法,持续推出针对服务器端和移动端、嵌入式等的增强模型,涵盖多种数据集竞赛冠军方案,并提供适合云端/边缘端设备部署的检测方案。
- 高灵活度:PaddleDetection通过模块化设计来解耦各个组件,模型网络结构和数据处理均可定制,基于配置文件可以轻松地搭建各种检测模型。
- 易部署:PaddleDetection的模型中使用的核心算子均通过C++或CUDA实现,提供跨平台推理引擎,实现了模型训练到部署的无缝衔接,同时内置集成了一键式压缩和部署能力。
- 高性能:基于飞桨框架的高性能内核,实现了模型的高效训练和推理。例如,YOLOv3的训练速度快于其他框架,在Tesla V100 16GB环境下,Mask-RCNN(ResNet50)可以单卡Batch Size可以达到4 (甚至到5)。
PaddleDetection模型库概览
PaddleDetection模块式地提供YOLOv3,EfficientDet等10余种目标检测算法、ResNet-vd,MobileNetV3等10余种backbone,以及sync batch norm, IoU Loss、可变性卷积等多个扩展模块,这些模块可以定制化地自由组合,灵活配置;同时预置提供100余种训练好的检测模型。
服务器端增强模型
PaddleDetection不仅复现了常见的目标检测模型,还对模型的进行了图像增强、骨干网络优化、DropBlock,IoU Loss IoUAware等一系列深度优化。同时,内置集成模型压缩能力,提供了一键式剪裁,蒸馏,量化的脚本,大大提高模型精度和速度,并减小模型体积。
- 单阶段目标检测模型YOLOv3
- 两阶段目标检测模型FasterRCNN-ResNet50vd-FPN
- 模型压缩
端侧轻量化增强模型
对于移动端,嵌入式这些端侧的设备,一般算力比较低,内存较小,所以对运算量和模型大小要求比较高,同时端侧的设备种类也比较多,有早起的低端CPU,也有近年来推出的骁龙855,麒零980等性能较好的CPU,还有更优一些嵌入式的GPU,NPU等。PaddleDetection针对这种情况,推出了三组模型:
- 对于低算力的设备,推出SSDLite及其量化模型,通过模型增强,SSDLite在骁龙845芯片上推理时延达到41ms。
- 对于需要兼顾速度和精度的应用场景,推出YOLOv3剪裁+蒸馏的压缩模型,在100ms左右推理时延上能在COCO数据集上达到25左右的精度。
- 对于算力比较高的设备,推出Cascade Faster RCNN模型,最高能在COCO数据集上达到30.2的精度。
通过这三组增强模型,可以根据自己的设备算力来选择合适的端上模型,下图是三组模型的增强效果。
PaddleDetection配置文件
如前文所述,PaddleDetection是飞桨推出的端到端目标检测开发套件,旨在帮助开发者更快更好地完成检测模型的训练、精度速度优化到部署全流程。支持现有的RCNN、SSD、YOLO等系列模型、支持 ResNet、ResNet-VD、ResNeXt、ResNeXt-VD、SENet、MobileNet、DarkNet等主干网络。而快速完成不同模型的训练体验,就是通过配置文件的切换。
亮点:一键式训练/推理/部署
PaddleDetection提供所有模型、算法、扩展模块的配置脚本,同时提供一键式训练、评估、推理、模型导出等脚本,从而帮助开发者完成不同模型的快速体验。
亮点:一键式模型增强
PaddleDetection以组件式形式提供模型的所有优化方法,只需要修改对应配置文件的参数配置,就能一键式模型增强。
PaddleDetection配置文件目录
PaddleDetection
├── configs # 提供所有模型、算法、扩展模块的配置脚本
├── contrib
├── dataset
├── demo
├── deploy # 提供C++端和python端使用飞桨预测库进行推理部署的详细指导
├── docs
├── ppdet
├── slim
├── tools # 一键式训练、评估、推理、模型导出train.py
eval.py
infer.py
export_model.py
├── .gitignore
├── .pre-commit-config.yaml
├── .style.yapf
├── .travis.yml
├── LICENSE
├── README.md
├── README_en.md
├── requirements.txt # 列出了PaddleDetection的所有依赖库
常用命令
在命令提示符下输入命令时,一定避免输入多余的空格。比如,weights=后面出现了一个多的空格,导致模型文件读不到。
-c
: 指定配置文件进行一键式训练
--eval
:训练中使用评估
-o use_gpu=False
:使用CPU训练。不建议在CPU下训练模型,若只能使用CPU运行PaddleDetection,需指定。
这里以 faster_rcnn_r50_1x.yml
举例,展示配置文件的使用方法。
设置PYTHONPATH路径
export PYTHONPATH=$PYTHONPATH:.
GPU训练 支持单卡,多卡训练,通过CUDA_VISIBLE_DEVICES指定卡号
export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
python tools/train.py -c configs/faster_rcnn_r50_1x.yml
GPU评估
export CUDA_VISIBLE_DEVICES=0
python tools/eval.py -c configs/faster_rcnn_r50_1x.yml
预测
python tools/infer.py -c configs/faster_rcnn_r50_1x.yml --infer_img=demo/000000570688.jpg
常用参数设置
训练配置文件需要着重关注的参数如下:(需要根据自己的不同数据集进行训练)
- 最大迭代步数:max_iters
- 预训练模型的来源:pretrain_weights
- 数据路径:dataset_dir
- Batch_size的大小:batch_size
- 数据集类别:num_classes
- 学习率:LearningRate.base_lr
下文”十分钟入门,玩转视频的目标检测”,使用PaddleDetection提供的一键式脚本,带你快速完成视频流的目标检测任务。
十分钟入门,玩转视频的目标检测
以YOLOv3_darknet模型为例,介绍如何使用PaddleDetection进行目标检测模型的训练和部署,以及对视频流进行目标检测。
注意事项
请使用AI Studio的”高级版”运行本节相关程序,如下图所示。
模型训练期间,需要确保此网页不关闭、电脑屏幕未锁定,否则训练将中断。
除”数据集”和”文件夹 > Work”目录外,其他输出文件在重启环境时将被清空。如果希望本次实验任务用到的文件在下次进入环境时仍然存在,可以选择保存到这两个地方。
环境准备
PaddleDetection下载
可以通过如下 git clone
命令下载PaddleDetection目标检测库,由于在AIStudio上通过 git clone
下载比较慢,本项目在 work
目录下提供下载好的PaddleDetection压缩包,也可直接解压使用。
%cd data
!git clone https://github.com/PaddlePaddle/PaddleDetection # 下载PaddleDetection目标检测库
#! tar xf ../work/PaddleDetection.tar -C . # 解压work目录下已下载好的PaddleDetection压缩包
!unzip -o /home/aistudio/work/PaddleDetection.zip
安装PaddleDetection依赖库
通过如下方式安装PaddleDetection依赖,并设置环境变量。
%cd PaddleDetection
!pip install -r requirements.txt # requirements.txt列出了PaddleDetection的所有依赖库
!pip install Cython pycocotools
%env PYTHONPATH=.:$PYTHONPATH
%env CUDA_VISIBLE_DEVICES=0
数据准备
PaddleDetection提供了COCO、VOC等数据集下载脚本如 dataset/coco/download.py
,通过此脚本可自动下载对应数据集。但由于COCO数据集下载比较耗时,本项目已上传COCO2017数据集,可直接解压获取。
COCO的
train
数据集较大,解压比较耗时,本项目仅使用val
数据集。
! python dataset/coco/download_coco.py # coco数据集下载脚本
! unzip -q /home/aistudio/data/data7122/annotations_trainval2017.zip -d dataset/coco # 解压数据集
! unzip -q /home/aistudio/data/data7122/val2017.zip -d dataset/coco
! unzip /home/aistudio/data/data7122/train2017.zip -d dataset/coco
undefined
一键式模型训练
本项目选取 yolov3_darknet.yml
作为本项目的训练配置文件。该配置文件选取的是YOLOv3_darknet模型,骨干网络为 DarkNet
,yolo_head为 YOLOv3Head
。
本项目演示使用COCO的 val
数据集训练,对配置文件做如下修改(使用 train
数据集不需要做以下修改,可以直接一键式启动训练), work
目录下提供了一个修改好的配置文件,也可在 configs
目录(即 data/PaddleDetection/configs
目录)下按照如下方式自行修改 yolov3_darknet.yml
和 yolov3_reader.yml
。
1.本次项目将训练轮数 max_iters
减小到 50000
, 减少 PiecewiseDecay
的 milestones
到 [40000, 45000]
。
2.修改 TrainReader.dataset
的 anno_path
和 image_dir
为 val
数据集路径, mixup_epoch
修改为 0
。
3.由于使用单卡训练,将 LearningRate.base_lr
减少8倍到 0.000125
。
yolov3_darknet.yml
文件配置好之后,就可以进行一键式模型训练。
常见的训练命令:
-c configs/yolov3_darknet.yml:用来指定模型配置文件 –use_tb:是否使用tb-paddle记录数据,进而在TensorBoard中显示,默认值是False –tb_log_dir:指定 tb-paddle 记录数据的存储路径 –eval:是否边训练边测试,在训练中交替执行评估, 评估在每个snapshot_iter时开始。每次评估后还会评出最佳mAP模型保存到best_model文件夹下,建议训练时候使用该参数,可以使得完成训练后快速找到最好的模型。
此处仅展示一键式训练,训练完成比较耗时(4小时左右)。如果想压缩训练时间,可以在
yolov3_darknet.yml
中将训练轮数max_iters
调小,后续使用PaddleDetection发布的权重(yolov3_darknet
模型的训练权重默认存储于output/yolov3_darknet
目录)进行推理。
! python tools/train.py -c ../../work/yolov3_darknet.yml --use_vdl=True --vdl_log_dir=/home/aistudio/log --eval # 启动模型训练
output/yolov3_darknet/model_final-o weights=output# ! python tools/infer.py -c ../../work/yolov3_darknet.yml --infer_img=../../work/dog.jpg
! python tools/infer.py -c ../../work/yolov3_darknet.yml --infer_img=../../work/dog.jpg -o weights=https://paddlemodels.bj.bcebos.com/object_detection/yolov3_darknet.tar%matplotlib inline
import matplotlib.pyplot as plt
import cv2
infer_img = cv2.imread("output/dog.jpg")
plt.figure(figsize=(15,10))
plt.imshow(cv2.cvtColor(infer_img, cv2.COLOR_BGR2RGB))
plt.show()tools/export_model.pyyolov3_darknetoutput/yolov3_darknet! python tools/export_model.py -c configs/yolov3_darknet.yml -o weights=https://paddlemodels.bj.bcebos.com/object_detection/yolov3_darknet.tardeploy/python! python deploy/python/infer.py --model_dir=output/yolov3_darknet/ --image_file=../../work/dog.jpg --use_gpu=True%matplotlib inline
import matplotlib.pyplot as plt
import cv2
infer_img = cv2.imread("output/dog.jpg")
plt.figure(figsize=(15,10))
plt.imshow(cv2.cvtColor(infer_img, cv2.COLOR_BGR2RGB))
plt.show()deploy/python/infer.pydata/PaddleDetection/output--thresh=0.2score >= 0.2! python deploy/python/infer.py --model_dir=output/yolov3_darknet/ --video_file=../../work/test.mp4 --use_gpu=True --thresh=0.2from IPython.display import HTML
bilibili
HTML(' ')ppdet/data/
├── reader.py # 数据处理模块的总接口
├── shared_queue # 共享内存管理模块
│ ├── queue.py # 定义共享内存队列
│ ├── sharedmemory.py # 负责分配内存
├── source # 数据源管理模块
│ ├── dataset.py # 定义数据源基类,各类数据集继承于此
│ ├── coco.py # COCO数据集解析与格式化数据
│ ├── voc.py # Pascal VOC数据集解析与格式化数据
│ ├── widerface.py # WIDER-FACE数据集解析与格式化数据
├── tests # 单元测试模块
│ ├── test_dataset.py # 对数据集解析、加载等进行单元测试
│ │ ...
├── tools # 一些有用的工具
│ ├── x2coco.py # 将其他数据集转换为COCO数据集格式
├── transform # 数据预处理模块
│ ├── batch_operators.py # 定义各类基于批量数据的预处理算子
│ ├── op_helper.py # 预处理算子的辅助函数
│ ├── operators.py # 定义各类基于单张图片的预处理算子
├── parallel_map.py # 在多进程/多线程模式中对数据预处理操作进行加速
export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
python -u tools/train.py -c configs/yolov3_darknet.yml \
-o use_fine_grained_loss=true
python -m paddle.distributed.launch --selected_gpus 0,1,2,3,4,5,6,7 tools/train.py --fp16 -c configs/faster_rcnn_r50_fpn_1x.yml
Original: https://blog.csdn.net/tegddhdrhdd/article/details/121328678
Author: 魏振川
Title: PaddleDetection目标检测任务简介和概述
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/681298/
转载文章受原作者版权保护。转载请注明原作者出处!