Cascade R-CNN训练自己的数据

传送门:

  1. 《Cascade R-CNN: Delving into High Quality Object Detection》论文笔记
  2. Cascade R-CNN Python测试脚本

1. 前言

Cascade RCNN是目标检测非常不错的一种方法,没有过分强调主干网络,而是采用层叠的方式提高IOU阈值来提纯样本,对不同的主干网络都能取得2~4个点的提升。这里使用的是Cascade RCNN example下的vgg-9s-600-rpn-cascade模型,这里的9s代表的是有9个anchor,600代表短边的尺寸,这里记录在使用这个代码训练自己的数据的过程,这里需要的目标检测的类别是2,在加上一个背景类就是3。
代码地址:Cascade RCNN

2. 数据准备

2.1 训练集(trainval.txt)与测试集(test.txt)

这里的标注数据是存储在txt文件中的,这里拿出一个标注节点来进行说明,每个人标注的形式都不一样,这里就不给代码了,理解了之后按照这个格式进行制作数据集就行了。

# 0 # 图像的编号ID,从0开始
JPEGImages/A3_B1_17_3_1.jpg # 图像的路径,与prototxt中的source参数一同设置
3 # 图像的channel数
1440 # 图像的高度
1080 # 图像的宽度
8 # 图片中标注框的数目
# 标注示例:label_id ignore difficult x1 y1 x2 y2
2 0 0 776 604 940 651
2 0 0 767 652 973 710
2 0 0 776 724 977 766
2 0 0 777 792 980 829
2 0 0 778 846 974 890
2 0 0 563 1254 847 1303
2 0 0 561 1317 847 1379
1 0 0 394 26 688 68
0 # num_roni_windows

2.2 test_name_size.txt制作

这个文件的作用就是记录测试图片的尺寸信息,其标注的格式为:

# 示例:图片的名字 图像的高度 图像的宽度
000127 375 500

3. 步骤

Step 1: train.prototxt设置输入图片的尺寸,最好是32的倍数。

short_size: 608
long_size: 832

Step 2: 修改网络中的分类数目,设置为检测的目标数加背景类,根据我的需求这里就设置为3,把img_width和img_height全部变成你的short_size。
Cascade R-CNN训练自己的数据_第1张图片
Step 3: 因为cascade训练第一步需要找iou>0.5的,如果你的目标太小,可能需要考虑增加anchor的数量或是修改anchor的值,如下是根据实际情况设置的anchor size:Cascade R-CNN训练自己的数据_第2张图片
那么在出现field_w与fiel_h的地方也要根据anchor的值进行修改:
Cascade R-CNN训练自己的数据_第3张图片
Step 4: 记得在test.prototxt与deploy.prototxt中也要做相对与train的修改。
Step 5: 在做测试的时候,检测代码也要修改short_size 和 long_size。测试代码后序整理贴出。

4. 问题与解决

1)作者的网络配置文件是采用long_size和short_size的方式,这要求输入图像是矩形,但是对于正方形的输入,long_size和short_size就不是很合适了。这时候,可以采用 resize_width 和 resize_height 进行设置

long_size: 800
short_size: 1312

修改为

resize_width: 640
resize_height: 640

这里我们一般希望长宽都是 32 的倍数关系,如果不希望拉伸,最好这里设置的长宽和图片实际长宽一致。
2) 如果在训练的时候出现 “F0930 05:55:49.924599 32355 decode_bbox_layer.cpp:110] Check failed: keep_num > 0 (0 vs. 0)”,这可能是proposal boxes 数量不足,或者是网路跑飞了,可以通过以下两个地方修改:
a) 降低 “BoxGroupOutput” 层中的 fg_thr,增加proposal boxes 的数量。
b) 如果降低了还是出现类似的错误,那就降低 base_lr。

你可能感兴趣的:([1],程序设计)