最近几天根据下面链接里关于caffe框架的解析大致看了caffe主要的几个文件(也就主要看了博客提到的几个函数)
Caffe源码导读
MgLiu的专栏
接下来就是faster rcnn 的MATLAB代码了。下面是我根据看的几篇文章做的一些摘抄,fast rcnn部分里面的函数还没怎么去看.
faster rcnn matlab
./datasets:VOC数据集的存放路径
./experimenet:训练或者测试的入口函数
>script_faster_rcnn_VOC0712_VGG16.m
训练过程,采用VGG和VOC0712,RPN一共配置了三个参数model,dataset,conf_proposal(conf_fast_rcnn是 fast-RCNN的参数)
(1)model参数:
指定了RPN和fastRCNN两个阶段所需要的网络结构配置文件prototxt的路径。通过第一阶段的RPN熟悉其具体过程。
指定了VGG pre-trained模型及图像均值的路径。具体配置程序为同级的 +Model/VGG16_for_faster_RCNN_VOC0712.m的代码片段,只关注RPN第一阶段相关的代码。首先指定了基网络(VGG) 预训练模型和图像均值文件路径;然后指定了RPN相关prototxt文件路径;最后设置了RPN测试参数。
(2)dataset参数
具体实现数据集读取的文件为 experiments/+Dataset/voc0712_trainval.m和experiments/ +Dataset/voc0712_test(没有找到这个文件???)。首先获得数据集存储路径;然后将数据读入到imdb和roidb 文件。imdb文件是一个matlab的表结构,表的每一行是一幅图像,分别包含如下信息:图像的路径,编号,大小, groundtruth(位置及类标)等。
(3)conf_proposal参数:只关注RPN的conf_proposal,具体配置文件为:functions/rpn/proposal_config.m
RPN所需要的参数。其中值得注意的参数有
batch_size:[256]每幅图像中筛选使用的bg样本和fg样本的总个数
fg_fraction:[0.5]batch_size中fg样本的比例,如果fg样本个数不足,则添加bg样本
drop_boxes_runoff_image:[1]在训练阶段是否去掉超出图像边界的anchors
bg_thresh_hi:[0.3]被看做反例样本的anchor与groundtruth的最大IoU
bg_thresh_lo:[0]被看做反例样本的anchor与groundtruth的最小IoU
fg_thresh:[0.7]被看做正例样本的anchor与groundtruth的最小IoU
ims_per_batch:[1]训练时每次输入的图像个数,当前只支持每次输入一幅图像
scale:[600]短边缩放后最小值
max_size:[1000]长边缩放后最大值
feat_stride:[16]VGG中conv5_3相比于输入图像缩小了16倍,也就是相邻两个点之间的stride=16
anchors:不同长宽比和尺度的9个基本anchors
output_width_map:输入图像的宽度和conv5_3宽度的对应关系
output_height_map:输入图像的高度和conv5_3高度的对应关系
bg_weight:[1]计算损失时每个反例样本的权值,正例样本权值全为1
image_means: 图像均值
(4)产生anchor
proposal_prepare_anchors函数分为两部分。
>首先产生输入图像大小和conv5_3大小的对应关系map;
首先初始化RPN的测试网络;然后产生不同长宽的全零图像并进行前向传播;记录每个输入图像大小对应的conv5_3 大小;重置caffe。
>然后产生9个基本anchors。
设置最基准的anchor大小为16×16;保持面积不变,利用该m文件中ratio_jitter生成三个长宽比(0.5,1,2)的 anchors.通过该m文件中scale_jitter将不同长宽比的anchors放大到三个尺度(8,16,32)。一共生成9个anchors。
>最后将output_width_map,output_height_map以及anchors存入conf_proposal参数中。
(5)所有参数设置完成后开始训练。
do_proposal_train直接调用functions/rpn/proposal_train.m文件。
proposal_train.m主要分为init, making tran/val data和Training三个阶段
>init,初始化 主要设置缓存文件路径,读入caffe求解参数,读入caffe模型结构,读入预训练模型,初始化日 志文件,设置GPU模式。
>making tran/val data,将bbs的数据转换为regression的数据 ,调用到了proposal_prepare_image_roidb函数
rpn/proposal_prepare_image_roidb.m从imdb以及roidb中读入图像信息后,实现了:
图像中bbx的groundtruth 数据由[x1,y1,x2,y2]转换为[dx,dy,dw,dh],由faster-RCNN论文中的公式(2)实现;然 后对bg和fg样本进行筛选; 最后计算转换后的[dx,dy,dw,dh]均值和方差。
详细步骤为:
- 读入图像信息:将图像信息读入到image_roidb中。
- groundtruth数据转换:proposal_prepare_image_roidb.m中的append_bbox_regression_targets实现
- 获得所有anchors:通过proposal_locate_anchors.m获得图像的所有anchors以及图像需要缩放的比例
- 图像缩放比例:通过scale和max_size获得图像的缩放比例并记录缩放后图像大小
图像的最短边最小值为scale,最长边最大值为max_size
- **conv5_3特征层大小:**通过查表法获得缩放后图像对应的conv5_3的大小 (output_width_mapoutput_height_map)
- **网格化:**按照`feat_stride`将conv5_3的大小打成网格
- **所有anchors:**在网格每个节点上放入9个基本`anchors`,并获得其坐标。
- **挑选样本:**`proposal_prepare_image_roidb.m`文件中的`compute_targets`实现正例样本和反例样本的 选取
- **计算overlap**:所有anchors存入变量`ex_rois`,计算每个anchor和每个groundtruth的重叠率(IoU)
- **去掉超出范围的anchor**:将超出范围的anchor和groundtruth的重叠率置0.
- **筛选正例样本**:IoU最大的和IoU大于`fg_thresh`的anchor作为正例样本
- **筛选反例样本**:IoU介于`bg_thresh_hi`和`bg_thresh_lo`之间的作为反例样本
- **计算回归量**:通过文章中公式(2)计算每个正例样本的回归量`dx`,`dy`,`dw`,`dh`
- **新的groundtruth**:将正例样本的回归量作为正例样本的groundtruth(类标1),反例样本的回归量均 设为0(类标-1)。
- **计算均值方差**:计所有正例样本的回归量的均值和方差,并且标准化(减去均值,除以方差)
> Training,训练
1.打乱训练数据顺序 proposal_train.m中的generate_random_minibatch函数实现对训练数据的打乱,并返回打乱后的第一幅图像的标 号sub_db_inds。
2.准备一个训练数据 proposal_generate_minibatch.m实现。
- 正反例样本选取及权重设置:proposal_generate_minibatch.m中的sample_rois选取样本并且设置权重
- fg_inds:正例样本序号,如果不到batch_size的fg_fraction倍,则用反例样本补足。
- bg_inds:反例样本序号,反例样本一般都比较多,需要进行随机选取。
- label:对每个正例样本label置1,反例样本label置0.
- label_weights:样本类别损失的权重。正例样本置1,反例样本置bg_weight。
- bbox_targets:进行数据转换后的正反例样本窗口位置
- bbox_loss_weights:样本位置损失的权重。正例为1,反例为0
整合RPN输入blob:RPN输入的im_blob.RPN输入的labels_blob.RPN输入的label_weights_blob.RPN输入的bbox_targets_blob.RPN输入的bbox_loss_blob
3.迭代
./external:caffe的matlab接口。只需安装好caffe的依赖库,并不需要编译caffe源文件。
./fetch_date:下载数据集,预训练模型等文件的函数
./functions:训练数据处理相关的函数
>fast_rcnn
>rpn
1.proposal_generate_anchors一个产生anchors 的函数,我们称其产生的为base anchor.
2.proposal_locate_anchors在rpn训练的过程中,针对每一张样本图像的大小与网络,得到所有anchor。
>nms
非极大值抑制c代码mex之后的文件
./imdb:将VOC数据读入到imdb格式
./models:基网络(如VGG)的预训练模型;fast-RCNN,RPN网络结构prototxt及求解相关的参数prototxt文件
./utils:一些其它常用的函数
1.boxoverlap.m
用来计算两个boxes中box间的重叠系数。主要在选择产生的roi时用到,用于选择满足一定重叠系数的roi.
2.im_list_to_blob.m
输入元组ims,ims{i}为一张图片,将ims转换为blob(w,h,3,n)
3.prep_im_for_blob.m 根据输入图片,图片均值,目标尺寸,返回目标图片和缩放系数。
prep_im_for_blob_size.m 按输入图片的尺寸和目标尺寸,返回尺寸缩放系数。
4.RectLTRB2LTWH RectLTWH2LTRB 坐标标定的不同方式之间的转换。
5.输入一张图片,含多个box坐标信息的元组boxes,每个box对应的标签legends,对图片进行信息的标注。输出图片尺寸固定,要注意对应box坐标的缩放。
6.function tic_toc_print(fmt, varargin)
% Print only after 1 second has passed since the last print.
% Arguments are the same as for fprintf.