caffe框架+faster rcnn 的MATLAB代码

  最近几天根据下面链接里关于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.









你可能感兴趣的:(Big,Data,AI)