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