2024年03月11日

2024-03-11 15:15:12
标签: paddle python

作者: Sam(甄峰) sam_code@hotmail.com

 

0. 简介:

PaddleDetection是一个基于PaddlePaddle的目标检测开发套件。提供了从数据准备、模型训练、模型评估、模型导出到模型部署的全流程工具。

 

PaddleDetection将检测模型解耦成不同的模块组件,通过自定义模块组件组合,用户可以便捷高效地完成检测模型的搭建. 例如:backbone,neck,loss等。

 

PaddleDetection提供了兼顾精度和速度的模型和工具箱。如:

PP-YOLOE高精度目标检测模型, PP-YOLOE-R 高性能旋转框检测模型, PP-YOLOE-SOD高精度小目标检测模型, PP-PicoDet超轻量级目标检测模型,PP-Tracking实时多目标跟踪模型, PP-TinyPose人体骨骼关键点识别, PP-Human行人分析工具,PP-Vehicle实时车辆分析工具。

 0.1 模型结构:

0.1.1:模型结构配置:

PaddleDetection中的诶一中模型对应一个目录。在configs目录中,可以看到不同的模型。包括:caseade_rcnn, centernet, convnext...ppyolo, ppyoloe,picodet等。

以Picodet为例:

在 configs/picodet目录,可以看到一些总配置文件:

例如:

picodet_s_320_coco_lcnet.yaml

这个文件名表达的涵义是:

picodet模型,采用small(0.75), 输入320x320, coco数据格式, backbone为lcnet.

内容详解:

_BASE_: [

  '../datasets/coco_detection.yml',     数据集配置文件

  '../runtime.yml',    运行时相关配置

  '_base_/picodet_v2.yml',  picodet网络结构配置文件

  '_base_/optimizer_300e.yml',   优化器相关配置

  '_base_/picodet_320_reader.yml',  Reader相关配置

]

# 定义在此处的相关配置可以覆盖上述文件中的同名配置

pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x0_75_pretrained.pdparams

weights: output/picodet_s_320_coco/best_model

find_unused_parameters: True

use_ema: true

epoch: 300

snapshot_epoch: 10

LCNet:

  scale: 0.75   #这里是channels 系数。l(Large)为2.  m为1. s为0.75. xs为0.35

  feature_maps: [3, 4, 5]

LCPAN:

  out_channels: 96

PicoHeadV2:

  conv_feat:

    name: PicoFeat

    feat_in: 96

    feat_out: 96

    num_convs: 2

    num_fpn_stride: 4

    norm_type: bn

    share_cls_reg: True

    use_se: True

  feat_in_chan: 96

TrainReader:

  batch_size: 64

LearningRate:

  base_lr: 0.32

  schedulers:

  - !CosineDecay

    max_epochs: 300

  - !LinearWarmup

    start_factor: 0.1

    steps: 300

0.1.2:网络结构配置:

可以看到picodet的网络结构配置文件为: __base__/picodet_v2.yml

主要内容为:

architecture: PicoDet

pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/LCNet_x1_5_pretrained.pdparams

PicoDet:

  backbone: LCNet

  neck: LCPAN

  head: PicoHeadV2

而LCNet, LCPAN,PicoHeadV2 这些网络机构在哪里呢?

PaddleDetection的网络机构代码在ppdet/modeling中。所有网络结构以组件的形式进行定义个组合。

其中:

backbones目录放置所有主干网络,并在backbones/__init__.py 中加入。

necks目录存放特征融合模块。并在necks/__init__.py中加入。

heads目录存放Head模块。并在heads/__init__.py中加入。

Architecture目录存放完整网络,它可以组合backbones,necks,heads等组成一个网络。

Architecture中的网络,即可以在picodet_v2.yml这样的网络结构配置文件中使用了。

 

1. PaddleDetection安装:

1.1: Paddle安装。(https://blog.sina.com.cn/s/blog_602f87700102ynws.html)

1.2: PaddleDeteciton下载

git clone https://gitee.com/paddlepaddle/PaddleDetection.git

cd PaddleDetection

pip install -r requirements.txt

测试是否成功:

python ppdet/modeling/tests/test_architectures.py

 

2. 训练:

2.1:数据准备

目前PaddleDetection支持:COCO VOC WiderFace, MOT四种数据格式

 

2.1.1:目标检测的数据格式:

目标检测的数据比较复杂,在图像中,需要标记出哥哥目标区域的位置和类别。

目标区域用一个矩形框来表示,通常由3中表达方式:

方式1:x1,y1,x2,y2。 其中(x1,y1)为左上角坐标,(x2,y2)为右下角坐标。 Pascal VOC格式采用这个方式。

方式2:x1,y1,w,h 。 其中(x1,y1)为左上角坐标,w为目标区域宽度,h为目标区域高度。COCO采用这个方式。

方式3:xc,yc,w,h(xc,yc)为目标区域中心坐标,w为目标区域宽度,h为目标区域高度。 Darknet yolo就用这个方式。

 

2.1.2:VOC数据介绍:

VOC数据是每个图像文件对应一个同名的xml文件,xml文件中标记物体框的坐标和类别等信息。例如图像2007_002055.jpg

图片对应的xml文件内包含对应图片的基本信息,比如文件名、来源、图像尺寸以及图像中包含的物体区域信息和类别信息等。

xml文件中包含以下字段:

· 

filename,表示图像名称。

· 

· 

size,表示图像尺寸。包括:图像宽度、图像高度、图像深度。

· 

 

object字段,表示每个物体。包括:

 

name:物体类别名称

pose:关于目标物体姿态描述(非必须字段)

truncated:如果物体的遮挡超过15-20%并且位于边界框之外,请标记为truncated(非必须字段)

difficult:难以识别的物体标记为difficult(非必须字段)

bndbox子标签

(xmin,ymin) 左上角坐标,(xmax,ymax) 右下角坐标。

 

Sam将训练数据处理成VOC格式。jpg和xml文件相对应。

并构建了train.txt, vaild.txt, label_list.txt

# label_list.txt 是类别名称列表,

 label_list.txt

classname1

classname2...

 

# train.txt 是训练数据文件列表

./images/xxx1.jpg ./annotations/xxx1.xml

./images/xxx2.jpg ./annotations/xxx2.xml...

 

# valid.txt 是验证数据文件列表

./images/xxx3.jpg ./annotations/xxx3.xml

 

 

 

 

Sam的目标是:

1. 使用PaddleDetection 训练目标检测模型。

2. 把模型部署到嵌入式平台上(利用PaddleLite)

 

 

附1:backbone, head,neck.

计算机视觉有四大任务: 分类,定位,检测,分割。不同的网络擅长的内容并不相同。 分类网络擅长做特征提取。比如VGG, ResNet,这些网络已经证明了在分类等任务中的特征提取能力是很强的。但这些特征提取网络对目标的位置并不敏感。所以在Object Detection中需要对物体定位时,只用这些网络就不恰当了。

Backbone通常由深度卷积神经网络(CNN)组成,用于从输入图像中提取高层次、语义丰富的特征

 

但这些分类网络可以很好的提取特征,于是以他们作为主干网络(backbone),作为特征提取器,后续用其它网络(Detection head)从这些提取的特征中,检测目标的位置和类别。

 

于是就有了主干网络--

backbone(提取特征)和head(处理特征,得到定位信息)。

 

head是模型的输出部分,负责最终的任务预测。对于目标检测任务,head通常包括分类head(用于预测目标类别)和回归head(用于预测目标框的位置)。对于图像分割任务,head通常是一个分割网络,输出每个像素的类别标签。

在不同的尺度(实际上就是不同大小的feature map)上去提取不同尺度的信息,并进行融合,充分利用好backbone提取的所有的特征信息,从而让网络能够更好地检测物体。有了FPN,backbone提取出的信息可以被利用的更加充分,使得detector能够很好地应对多尺度情况——图像中,目标的大小不一,大的、中等的、小的,都有,尤其是小物体,几乎成为了目标检测这一块的单独研究点。

除了FPN这种新颖的结构,还有诸如ASFF、RFB、SPP等好用的模块,都可以插在backbone和detection head之间。由于其插入的位置的微妙,故而将其称之为“neck”。

neck是介于骨干网络和头部之间的中间层。它的作用是在骨干网络提取的特征基础上进一步进行特征融合、上下文增强等操作。neck的结构通常包括卷积层、池化层、注意力机制等。它的设计可以帮助网络在不同尺度上感知目标,并且提供更多的上下文信息。

 

完整的目标检测网络主要由三部分构成:

detector=backbone+neck+head

这种模块化的设计提高了灵活性,使得模型的各个部分可以独立设计和替换。将目标检测任务分成三个模块,使得整个网络的结构更容易理解。每个模块的功能更加明确,有助于解释网络的每个部分在任务中的作用。这对于研究人员和工程师来说非常重要,因为他们可以更好地理解模型的行为,进而进行调整和优化。


阅读(0) 收藏(0) 转载(0) 举报/Report
相关阅读

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有