---------------------------------------------------------------------------------------------------------------------------
1 .000001.xml数据中记录主要用到的是文件中的目标位置 x1 y1 x2 y2 。
----------------------------------------------------------------------------------------------------------------------------
2. Matlab调试C++过程,首先把当前的VS的DLL 工程附加到进程,然后设置好相应的断点再MATLAB 中全速运行就可以断点到VS中进行相关的调试和监测相应的内容。
-----------------------------------------------------------------------------------------------------------------------------
3. stage 1 rpn F:\---\debug_faster_rcnn\faster_rcnn-master\experiments\models\rpn_prototxts\ZF\solver_60k80k.prototxt----solver_def_file
F:\----\debug_faster_rcnn\faster_rcnn-master\experiments\models\rpn_prototxts\ZF\test.prototxt----test_net_def_file
F:\----\debug_faster_rcnn\faster_rcnn-master\experiments\models\pre_trained_models\ZF\ZF.caffemodel----init_net_file
-----------------------------------------------------------------------------------------------------------------------------
4.stage 1 fast rcnn
fullfile(pwd, 'models', 'fast_rcnn_prototxts', 'ZF', 'solver_30k40k.prototxt');
fullfile(pwd, 'models', 'fast_rcnn_prototxts', 'ZF', 'test.prototxt');
model.pre_trained_net_file;
---------------------------------------------------------------------
5. stage 2 rpn
fullfile(pwd, 'models', 'rpn_prototxts', 'ZF_fc6', 'solver_60k80k.prototxt');
fullfile(pwd, 'models', 'rpn_prototxts', 'ZF_fc6', 'test.prototxt');
---------------------------------------------------------
6. stage 2 fast rcnn
fullfile(pwd, 'models', 'fast_rcnn_prototxts', 'ZF_fc6', 'solver_30k40k.prototxt');
fullfile(pwd, 'models', 'fast_rcnn_prototxts', 'ZF_fc6', 'test.prototxt');
7 cache_base_proposal ='faster_rcnn_VOC2007_ZF';
8 创建数据部分 这里有两个一个是IMDB和roidb 两种数据的格式
读取
F:\-----\debug_faster_rcnn\faster_rcnn-master\experiments\datasets\VOCdevkit2007\VOC2007\ImageSets\Main 中的trainval.txt中的所以数据,样本一共5011张,MATLAB中是从1开始的 所以对应的索引值从1-5011这样的符合感觉的索引数值空间.
imdb_voc_2007_trainval.mat 这里存储的训练数据的宽高类别但是没有具体数据,还有一些是比较杂乱的数据比如类别数是20之类
roidb_voc_2007_trainval_easy.mat存储每张图像的感兴趣区域的坐标以及每类的标签,如果两个类之间有重叠需要给出重叠度。这里的标签是以矩阵的形式给出的
测试数据部分 :
读取TRAIN.TXT中的图片,一共是4952张图像作为测试图像来评价结果,imdb_voc_2007_test.mat中存储的是每张图像的高宽数据 ,形式同上 。
roidb_voc_2007_test_easy.mat 中存储的是测试数据对对应的标签和感兴趣区域,形式同上。
备注: 数据中有20*1是Cell功能的意思是用字符串来对应标签的一种格式
9:conf_proposal 这里主要是配置了相关的训练参数 +相关的测试参数
conf_fast_rcnn 这里主要配置的是相关的测试参数
10 对应的训练过程中需要的四个存储缓存的地方以及最后的训练模型的存放的地方
---------------------------------------------------------------------------------------------------------------------------
model.stage1_rpn.cache_name= faster_rcnn_VOC2007_ZF_stage1_rpn
model.stage1_fast_rcnn.cache_name=faster_rcnn_VOC2007_ZF_top-1_nms0_7_top2000_stage1_fast_rcnn
----------------------------------------------------------------------------------------------------------------------------
model.stage2_rpn.cache_name=faster_rcnn_VOC2007_ZF_top-1_nms0_7_top2000_stage2_rpn
model.stage2_fast_rcnn.cache_name
=faster_rcnn_VOC2007_ZF_top-1_nms0_7_top2000_stage2_fast_rcnn
---------------------------------------------------------
model.final_model.cache_name=faster_rcnn_VOC2007_ZF
11 RPN 层的输出相关,这里设置的tEST.prototx中输出的第五层卷积相关之后会分叉成两部分,一部分用来预策前景的概率 ,一部分用来预测框子的位置。
12.预先计算特征的宽高100 -1000这样的数据空间 也就是数据大小是1*3*n*n的情况下,对应不同的N 在卷基层为5 的情况下卷积产生的热图的大小
13. 训练第一个RPN 相关的网络 。
F:\------\debug_faster_rcnn\faster_rcnn-master\experiments\models\rpn_prototxts\ZF路径下的train_val 训练网络
加载相关的预训练模型,生成17901个候选区域 这数据是在600*800的图像上结果网络最后的输出51*39的热图上得到的,这里也可能图像比较大的时候,生成的图像可以51*60 这样的图像就比较大。
接着计算 ex_gt_overlaps =boxoverlap(ex_rois, gt_rois);这计算的是重合度,也就是具体位置的格子和生成的候选区域的重叠度计算。选取出最大的就可以,
计算得到回归的区域四个值得,计算得到目标区域四个参数的平均的均值和平均方差;
means = bsxfun(@rdivide, sums, class_counts);
stds = (bsxfun(@minus, bsxfun(@rdivide,squared_sums, class_counts), means.^2)).^0.5; 这里的评价是在5011个正样本上综合评价的,但是取出的是类别数大于0 的情况,也就是只有目标的区域才参与了计算。
这里涉及到一行 bbox_targets =sparse(bbox_targets);
这里是构造了稀疏表达,这里把稀疏表达去除,这样可以更加方便的观看数据的转换以及相关的变换过程 。
14 for i = 1:num_images
for j = 1:length(conf.scales)
targets = image_roidb(i).bbox_targets{j};
gt_inds = find(targets(:, 1)> 0);
if ~isempty(gt_inds)
class_counts = class_counts+ length(gt_inds);
sums = sums +sum(targets(gt_inds, 2:end), 1);
squared_sums =squared_sums + sum(targets(gt_inds, 2:end).^2, 1);
end
end
end
此段代码是计算了所有的垂直方向的和与平方和 存放在 sums squared_sums中
然后将所有的回归数据先减去均值,然后再除以方差 ,最后在进行归一化的操作。
15 测试数据的准备
在测试阶段就直接借用以前计算得到的均值和方差来计算 。测试时候同样计算出每个正样本的区域对用在大矩阵中的索引,负样本在大矩阵中的索引,和训练中的计算是一样的,只是没有在计算样本的均值和方差而已。
16 > 测试数据这里根据外界取出前500个样本来作为测试,一张图像上的负样本有好多个足以超过了500个样本的概念
17 》[shuffled_inds, sub_db_inds] =generate_random_minibatch(shuffled_inds, image_roidb_train,conf.ims_per_batch); 返回乱序之后的训练样本前一个是5010个后一个是一个,一共合起来是5011个数据
这段程序说明 if nargout > 1
% generate minibatch training data
sub_inds = shuffled_inds{1};
assert(length(sub_inds) ==ims_per_batch);
shuffled_inds(1) = [];
end
在经过一次数据之后就开始取出下一个数据,然后数据被清空之后就继续生成5011个数据,然后进行一个新的轮EPOCH 过程。
18.训种的RPN 是由于两种LOSS 共同驱动,所有的梯度值SPLIT 层的时候会有一个梯度的相加 ,这样所有的传递会得到一个分开的处,然后选择叠加,构成合力再反向传播,最一个交叉的节点得到一个反向梯度的融合。
19 这里设置了一个已经训练好的RPN 的 FINAL 模型直接加载之后来调试后面的程序过程。
20 根据训练出的模型来测试一下生成5011个样本的正确度怎么样?首先依据原始算法生成17901*4个样本坐标 ,计算出已经经过训练好的网络计算得到的17901*4个坐标,然后结合训练那部分的运算,计算得到新的坐标,作为最后的计算值。 pred_boxes(:,1:4:end) = pred_ctr_x - 0.5*(pred_w-1);
pred_boxes(:, 2:4:end) = pred_ctr_y -0.5*(pred_h-1);
pred_boxes(:, 3:4:end) = pred_ctr_x+ 0.5*(pred_w-1);
pred_boxes(:, 4:4:end) = pred_ctr_y+ 0.5*(pred_h-1);
为的是最后运算能够得到最后的pred_boxes的坐标。
1 得到的坐标需要返回到原始图像上的坐标,2 同时要加上得分选项 3 去除掉宽高小于16的选项,因为这些width+HEIGHT的目标不足以构成目标区域。
[boxes, scores,abox_deltas{i}, aanchors{i}, ascores{i}] = proposal_im_detect(conf, caffe_net,im);也就是这个函数最后得到的概率排序+对应的原始图像上的坐标的位置。
21 dataset.roidb_train= cellfun(@(x, y) Faster_RCNN_Train.do_proposal_test(conf_proposal,model.stage1_rpn, x, y), dataset.imdb_train, dataset.roidb_train, 'UniformOutput', false);
本程序最后返回的是训练图像中的 3+前2000的计算数值 : 原始位置+预测位置,以及最显眼的是OVERLAP 因为在计算之后会计算每一类对应的环境下,计算出所有的 预测BOX 与有的标注数据的重合度,具体情况可以查看数据就知道。下面为部分的监控数据。
第一行:gt: 3类(全是1 )+2000预测的
OVERLAP 预测的数据格子和原始的位置的重叠度
BOX 原始的位置+预测的位置的汇总
Class 对应的类别(具体是20类中的哪一类)
22 :测试阶段中
中间会存储一个文件,save(fullfile(cache_dir, ['proposal_boxes_' imdb.name opts.suffix]), 'aboxes', '-v7.3'); 这里一共对应五个数字:1
X1 Y1 X2 Y2 以及对应是前景概率的大小。然后存储在对应的预先设置的缓存空间中,每张图像有好多数字,这样对应的4952张图像的存储数据会有好几个G
23 :接着训练FAST RCNN 部分:
收集新的回归数据:
A: gt_rois =rois(gt_inds(gt_assignment), :);
B: ex_rois = rois(ex_inds, :);
左图是对应选取的预测的的前2000个目标中与实际目标重叠度比较大的,程序中设置的0.5的目标位置,这个坐标是原始图像中强制赋值出来的,第一张图像最后得到的是52个目标区域,右图是RPN 实际训练后能够得到的目标位置图,经过网络预测一次之后与原始位置之间做一个变换,从而得到一个回归值,维度为4.
最后强制转换到原始的类别+2003的数据中:
bbox_targets(ex_inds, :) =[max_labels(ex_inds), regression_label];
bbox_targets前几个类别的回归数据为零不是选中的正样本的数据为0 ,只有选中的前景目标才为零。
然后收集正负样本 : is_fg = max_overlaps >= conf.fg_thresh;
is_bg =max_overlaps < conf.bg_thresh_hi & max_overlaps >= conf.bg_thresh_lo;
数据 is_fg is_bg中也是类别数+2000维数的目标,is_fg对应前景为1 对应背景为0 ,而is_bg中的数据存放和IS_FG是相反的。
训练样本的选取一次是取出两张图像:
for i = 1:length(inds)
ind = inds(i);
cls = clss(ind);
targets_inds = (1+cls*4):((cls+1)*4);
bbox_targets(ind, targets_inds) =bbox_target_data(ind, 2:end);
bbox_loss_weights(ind, targets_inds) =1;
end
代码意味:只是设置了对应位置的数值,其实这里已经有着排序的意味,对于负样本而言是保持原始的数值为零不变化的。
24 接着用已经好的final 重新初始化相关的数据,按原始过程在走一遍第一次的rpn 的过程,,接着在走一遍FASTERRCNN过程,最后能得到两个模型,但是在最后判断的时候,前面的权重是相同的,?????这里设置的训练到底是什么规则有待研究,因为这里最后得到了两个模型,但是有一部分是共同的,RPN 的预测的卷积5层直接给了FASTER RCNN 层的输入,这里就节约了时间,实际上就相当于一个网络的部分,然后这里的训练是如何控制的。
备注:这里想训练那个部分,把对应缓存下的训练模型删除就可以,有模型就直接加载,没有模型就会出现重新训练的部分。
最后在一个日记中找到了权衡相等的部分,下图的红色部分,不需要进行反向运算,这样就保证了前面的权值是一样了,也就是固定了前面的权值。
25 到这里大致代码阅读有个小结部分。
26 是否进行反向运算的过程是通过文件中的LR_MULTI 当为零的时候就阻止了当前层的反向运算过程。
27 细分析第二级的训练过程:
这里设置的是每个CELL 的形式,一般是两幅图像作为一个BATCH 的提取的标准,一个BATCH =128 ;然后每张图像是64个,作者设置的前景数目:round(rois_per_image * conf.fg_fraction)=16 ,意味着:情景=16 ,背景数目为64-16=48张;
28 :下面一段是生成的程序返回方式:
Ims:代表了两张传入的图像600*800*3
function blob = im_list_to_blob(ims)
max_shape = max(cell2mat(cellfun(@size, ims(:), 'UniformOutput', false)), [], 1);
assert(all(cellfun(@(x) size(x, 3), ims, 'UniformOutput', true) == 3));
num_images = length(ims);
blob = zeros(max_shape(1), max_shape(2), 3,num_images, 'single');
for i = 1:length(ims)
im = ims{i};
blob(1:size(im, 1), 1:size(im, 2), :,i) = im;
end
end
-------------------------------------------------------------------------
max_shape(1)=600;max_shape(2)=800 ;对应的BLOB 600*800*3*2;
最后得到的标签计算,这里是一张一张计算的
[labels, ~, im_rois, bbox_targets,bbox_loss]= ...
sample_rois(conf, image_roidb(i),fg_rois_per_image, rois_per_image);
labels 对应选中的64个样本的类别数;
batch_ind = i *ones(size(feat_rois, 1), 1); 索引的第几张图像的收集的样本
im_rois 对应64个坐标的位置,维度为4;
bbox_targets 对应 64*84个位置的回归值,如果是15 就对应4*15 这个开始位置,取出五个值;
bbox_loss 目标为1 背景为0 设置的原则;
最后得到的数据:
im_blob 对应两张图像( 600*800*3*2 )
rois_blob 对应着五个维度的数据 1 图像号的索引 2 坐标( IND x1 y1 x2 y2 )
labels_blob 对应的图像片的标签 维度为1
bbox_targets_blob 64*84的矩阵
bbox_loss_blob 64*84的矩阵
本文详细介绍了Faster R-CNN的训练流程,包括RPN网络和Fast R-CNN网络的训练细节,涉及数据准备、模型调试、参数配置等方面,并探讨了如何利用Matlab进行C++代码的调试。
5194

被折叠的 条评论
为什么被折叠?



