YoloV3的优势 ,
1.YOLO网络:单步的目标检测算法,适合目标的实时检测,推算速度较快。丧失部分精度,将图片端到端的进行目标检测,也引入了rcnn的Anchor框体系大幅提升mAP。因为没有进行区域采样,所以对全局信息有较好的表现,前两代网络在小目标检测上表现稍差(一般定义为像素尺寸小于32 * 32的目标或是长宽远小于原图像尺寸的0.1的目标)。但不妨碍成熟的YOLOv3经过种种改进可以适应绝大部分目标检测任务(不同的改进增强版都已收录到PaddleDetection中)
——PaddleDetection中提供了相当多的YOLOv3增强版算法,适合作为最初的尝试
2.SSD网络:单步的目标检测算法,调试过程非常依赖经验,设计之初是为了结合YOLO的速度和RCNN的精度,相比于RCNN消除了边界框候选以及特征上采样的过程,相比于YOLO取消了全连接层,采用了全卷积网络结构。但是由于其优点已经被YOLOv3后来赶上,而小目标检测不力也被YOLOv3中新增的上采样所加强,所以个人感觉使用起来效果不如YOLOv3
3.RCNN网络:多步的目标检测算法,追求更高的精度,在小目标检测方面表现更好,但缺点就是速度较慢
下面已模型参数为例详解:
tools/train.py
tools/eval.py
tools/infer.py
,可通过-c
参数指定配置文件进行一键式训练,yolov3_darknet
模型的训练权重默认存储于/home/aistudio/output/yolov3_darknet
目录,下面以一个适用于VOC和一个适用于COCO数据集的模型配置来介绍PaddleDetection的参数设置和相应意义architecture: YOLOv3 # 网络主体【首先确认自己选取的网络的大框架】
use_gpu: true # 是否使用GPU【建议使用,训练速度大幅提升(使用高级版)】
max_iters: 100000 # 最大训练batch数【根据需求和模型收敛、稳定的速度更改】
log_smooth_window: 20
save_dir: output
snapshot_iter: 2000 # 每多少个batch进行一次模型存储(如果是在eval模式下会同时保存mAP最优模型)【过小会导致保存的模型占据较多空间、项目加载启动时间变长甚至卡死;过大会导致模型保存不及时,错失最优模型。建议设置为最大训练batch数除以50,即总共保存50个模型】
metric: COCO # 数据集格式
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/DarkNet53_pretrained.tar # 预训练模型
weights: output/yolov3_darknet/model_final # 模型权重文件地址(预测的时候的模型文件)
num_classes: 80 # 目标种类数【务必要改!如果背景需要认为是单独的标签则要在目标种类数的基础上加1,与后面的“with_background”同步设置!!!】
use_fine_grained_loss: false # 细粒度损失,在目标类别非常相近(例如任务为分辨狗的种类)的时候设为True
YOLOv3: # 网络配置部分【模块化设计方便用户进行主干特征提取网络与头网络的各种组合尝试】
backbone: DarkNet # 主干特征提取网络:(存放地址:PaddleDetection/ppdet/modeling/backbones/darknet.py)
yolo_head: YOLOv3Head # yolo_head函数:(存放地址:PaddleDetection/ppdet/modeling/anchor_heads/yolo_head.py)
DarkNet: # 主干特征提取网络的配置【不建议修改!】
norm_type: sync_bn
norm_decay: 0.
depth: 53
YOLOv3Head: # yolo_head的配置【不建议修改!】
anchor_masks: [[6, 7, 8], [3, 4, 5], [0, 1, 2]]
anchors: [[10, 13], [16, 30], [33, 23],
[30, 61], [62, 45], [59, 119],
[116, 90], [156, 198], [373, 326]]
norm_decay: 0.
yolo_loss: YOLOv3Loss
nms: # 非极大抑制相关设置
background_label: -1
keep_top_k: 100
nms_threshold: 0.45
nms_top_k: 1000
normalized: false
score_threshold: 0.01
YOLOv3Loss: # 损失函数的计算
# batch_size here is only used for fine grained loss, not used
# for training batch_size setting, training batch_size setting
# is in configs/yolov3_reader.yml TrainReader.batch_size, batch
# size here should be set as same value as TrainReader.batch_size
batch_size: 8 # batchsize大小【根据自己的需求更改,需要和 'yolov3_reader.yml'中保持一致!】
ignore_thresh: 0.7 # 忽略iou小于多少的候选框
label_smooth: true
LearningRate: #【根据自己的需求更改】
base_lr: 0.001 # 初始学习率【根据自己的需求更改】
schedulers:
- !PiecewiseDecay
gamma: 0.1 # 衰减率
milestones: # 里程碑(每到一个里程碑学习率会在原有基础上乘以衰减率gamma)
- 55000
- 80000
- !LinearWarmup # 学习率预热
start_factor: 0. # 起始学习率
steps: 1000 # 多少个batch后到达base_lr(初始学习率)
OptimizerBuilder: # 优化器配置【不建议修改!】
optimizer:
momentum: 0.9
type: Momentum
regularizer:
factor: 0.0005
type: L2
_READER_: 'yolov3_reader.yml' # 数据读取配置文件【!!!与Example2中不同,必须要到'yolov3_reader.yml'中更改相应配置以确保模型能正确推算!!!】
TrainReader: # 训练集读取器定义
inputs_def:
fields: ['image', 'gt_bbox', 'gt_class', 'gt_score'] # 输入项类别,不用动
num_max_boxes: 50 # 输入最多目标框数
dataset:
!COCODataSet
image_dir: images # 图片文件夹地址(相对于下面的'dataset_dir'的地址)
anno_path: annotations/train2017.json # 训练集描述文件地址(相对于下面的'dataset_dir'的地址!!!)
dataset_dir: /home/aistudio/PaddleDetection/dataset/redgreen_COCO # 数据集绝对地址
with_background: false # 背景是否算作一个标签【需要与网络配置文件中的“num_classes”是否加1同步设置(不算单独标签的话就不加1)!!!】
sample_transforms: # 设置各种图像增强方法!!!
- !DecodeImage # 解码图像设置
to_rgb: True # 是否训练前转换为RGB格式【不用改】
with_mixup: True # 是否使用图像增强'mix_up'(具体增强方式可自行百度,很好理解)
- !MixupImage
alpha: 1.5
beta: 1.5
- !ColorDistort {} # 颜色失真图像增强
- !RandomExpand # 随机扩展图像增强
fill_value: [123.675, 116.28, 103.53]
- !RandomCrop {} # 随机裁剪
- !RandomFlipImage
is_normalized: false
- !NormalizeBox {}
- !PadBox
num_max_boxes: 50
- !BboxXYXY2XYWH {} # 标志框标注格式转换(由XYXY格式转为XYWH格式)
batch_transforms:
- !RandomShape
sizes: [320, 352, 384, 416, 448, 480, 512, 544, 576, 608] # 随机改变图像分辨率
random_inter: True
- !NormalizeImage
mean: [0.485, 0.456, 0.406] # 图像归一化,这个参数和下面那行参数均为
std: [0.229, 0.224, 0.225] # ImageNet(百万张图片统计得出)的均值和标准差,可根据自己的训练集修改
is_scale: True
is_channel_first: false
- !Permute
to_bgr: false
channel_first: True
# Gt2YoloTarget is only used when use_fine_grained_loss set as true,
# this operator will be deleted automatically if use_fine_grained_loss
# is set as false
- !Gt2YoloTarget
anchor_masks: [[6, 7, 8], [3, 4, 5], [0, 1, 2]] # 锚框【不建议修改!】
anchors: [[10, 13], [16, 30], [33, 23],
[30, 61], [62, 45], [59, 119],
[116, 90], [156, 198], [373, 326]] # 锚框尺寸【不建议修改!要和图像尺寸相配!】
downsample_ratios: [32, 16, 8] # 下采样(图片压缩)比例【不建议修改!】
batch_size: 8 # batchsize大小【根据自己的需求更改,需要和 'yolov3_darknet.yml'中保持一致!】
shuffle: true
mixup_epoch: 250 # 使用mixup的轮数
drop_last: true # 如何处理数据集长度除于batch_size余下的数据:True就抛弃,否则保留。
worker_num: 8 # 【在AiStudio上用GPU运行不修改!】
bufsize: 16 # 缓冲区设置【在性能允许的前提下设置大一点】
use_process: true
EvalReader: # 基本同上,不再注释
inputs_def:
fields: ['image', 'im_size', 'im_id']
num_max_boxes: 50
dataset:
!COCODataSet
image_dir: val2017
anno_path: annotations/instances_val2017.json
dataset_dir: dataset/coco
with_background: false
sample_transforms:
- !DecodeImage
to_rgb: True
- !ResizeImage
target_size: 608 # 将图像压缩到608*608进行输入
interp: 2
- !NormalizeImage
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
is_scale: True
is_channel_first: false
- !PadBox
num_max_boxes: 50
- !Permute
to_bgr: false
channel_first: True
batch_size: 8
drop_empty: false
worker_num: 8
bufsize: 16
TestReader:
inputs_def:
image_shape: [3, 608, 608] # 图像为三通道,尺寸为608*608
fields: ['image', 'im_size', 'im_id']
dataset:
!ImageFolder
anno_path: annotations/instances_val2017.json
with_background: false
sample_transforms:
- !DecodeImage
to_rgb: True
- !ResizeImage
target_size: 608
interp: 2
- !NormalizeImage
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
is_scale: True
is_channel_first: false
- !Permute
to_bgr: false
channel_first: True
batch_size: 1 # test的时候batchsize要设置为1
Example2:
architecture: YOLOv3 # 网络主体
use_gpu: true # 是否使用GPU训练
max_iters: 80000 # 最大训练batch数
log_smooth_window: 20
save_dir: output
snapshot_iter: 2000 # 每多少个batch进行一次模型存储(如果是在eval模式下会同时保存mAP最优模型)
metric: VOC # 数据集格式
map_type: 11point # mAP的评判标准
pretrain_weights: https://paddle-imagenet-models-name.bj.bcebos.com/ResNet34_pretrained.tar # 预训练模型
weights: output/yolov3_r34_voc/model_final # 模型权重文件地址(预测的时候的模型文件)
num_classes: 20 # 目标种类数【务必要改!如果背景需要认为是单独的标签则要在目标种类数的基础上加1,与后面的“with_background”同步设置!!!】
use_fine_grained_loss: false
YOLOv3:
backbone: ResNet # 主干特征提取网络:(存放地址:PaddleDetection/ppdet/modeling/backbones/resnet.py)
yolo_head: YOLOv3Head # yolo_head函数:(存放地址:PaddleDetection/ppdet/modeling/anchor_heads/yolo_head.py)
ResNet: # 主干特征提取网络的配置【不建议修改!】
norm_type: sync_bn
freeze_at: 0
freeze_norm: false
norm_decay: 0.
depth: 34
feature_maps: [3, 4, 5]
YOLOv3Head: # yolo_head的配置【不建议修改!】
anchor_masks: [[6, 7, 8], [3, 4, 5], [0, 1, 2]]
anchors: [[10, 13], [16, 30], [33, 23],
[30, 61], [62, 45], [59, 119],
[116, 90], [156, 198], [373, 326]]
norm_decay: 0.
yolo_loss: YOLOv3Loss
nms:
background_label: -1
keep_top_k: 100
nms_threshold: 0.45
nms_top_k: 1000
normalized: false
score_threshold: 0.01
YOLOv3Loss: # 损失函数的计算
# batch_size here is only used for fine grained loss, not used
# for training batch_size setting, training batch_size setting
# is in configs/yolov3_reader.yml TrainReader.batch_size, batch
# size here should be set as same value as TrainReader.batch_size
batch_size: 8 # batchsize大小【根据自己的需求更改,需要和 'yolov3_reader.yml'中保持一致!】
ignore_thresh: 0.7 # 忽略iou小于多少的候选框
label_smooth: false
LearningRate: #【根据自己的需求更改】
base_lr: 0.001 # 初始学习率【根据自己的需求更改】
schedulers:
- !PiecewiseDecay
gamma: 0.1 # 衰减率
milestones: # 里程碑(每到一个里程碑学习率会在原有基础上乘以衰减率gamma)
- 55000
- 62000
- !LinearWarmup # 学习率预热
start_factor: 0. # 起始学习率
steps: 1000 # 多少个batch后到达base_lr(初始学习率)
OptimizerBuilder: # 优化器配置【不建议修改!】
optimizer:
momentum: 0.9
type: Momentum
regularizer:
factor: 0.0005
type: L2
_READER_: 'yolov3_reader.yml' # 数据读取配置文件【需要到'yolov3_reader.yml'中修改batch_size和bufsize】
TrainReader: # 训练集信息
dataset:
!VOCDataSet
dataset_dir: dataset/voc # 数据集存放目录【务必要改!建议使用绝对路径(以"/home/aistudio/"开头)】
anno_path: trainval.txt # 索引文件【务必要改!一定要改成相对"dataset_dir"的路径!!!】
use_default_label: true # 是否使用默认标签【务必要改!训练自己的数据集一定要改成false!!!】
with_background: false # 背景是否算作一个标签【需要与前面的“num_classes”是否加1同步设置!!!】
EvalReader: # 验证集信息
inputs_def:
fields: ['image', 'im_size', 'im_id', 'gt_bbox', 'gt_class', 'is_difficult']
num_max_boxes: 50 # 一幅图上最多有多少个目标
dataset:
!VOCDataSet
dataset_dir: dataset/voc # 数据集存放目录【务必要改!建议使用绝对路径(以"/home/aistudio/"开头)】
anno_path: test.txt # 索引文件【务必要改!一定要改成相对"dataset_dir"的路径!!!】
use_default_label: true # 是否使用默认标签【务必要改!训练自己的数据集一定要改成false!!!】
with_background: false # 背景是否算作一个标签【需要与前面的“num_classes”是否加1同步设置!!!】
TestReader:
dataset:
!ImageFolder
use_default_label: true # 是否使用默认标签【务必要改!训练自己的数据集一定要改成false!!!】
with_background: false # 背景是否算作一个标签【需要与前面的“num_classes”是否加1同步设置!!!】