Faster_rcnn

本文详细介绍了Faster R-CNN的训练流程,包括RPN网络和Fast R-CNN网络的训练细节,涉及数据准备、模型调试、参数配置等方面,并探讨了如何利用Matlab进行C++代码的调试。

---------------------------------------------------------------------------------------------------------------------------

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 得到的坐标需要返回到原始图像上的坐标同时要加上得分选项  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)=600max_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目标检测算法介绍 Faster R-CNN是一种高效的目标检测框架,在继承自R-CNN系列的基础上进行了显著改进[^1]。该模型由两个主要组件构成:区域提议网络(Region Proposal Network, RPN)和地区感知的卷积层(Region of Interest Pooling Layer)。这些特性使得Faster R-CNN能够更加快速有效地处理大规模数据集。 #### 区域提议网络 (RPN) 为了提高效率并减少对外部候选框生成工具如Selective Search的依赖,Faster R-CNN引入了专门设计用于内部生成高质量候选区的模块&mdash;&mdash;RPN。此网络负责在整个输入图片的不同尺度上滑动,并输出一系列矩形对象建议及其置信度得分。值得注意的是,RPN共享全图特征映射以加速计算过程[^2]。 #### 地区感知池化层 (RoI Pooling Layer) 一旦获得了候选区域列表之后,则需进一步分析每个区域内是否存在特定类别实例。为此目的而设定了固定大小的空间窗口来裁剪感兴趣部分;然而由于不同物体具有各异的比例关系,因此采用了一种称为ROI pooling的技术来进行标准化操作。它能确保无论原始尺寸如何变化都能获得统一规格的感受野作为后续分类器输入[^3]。 ### 实现代码示例 下面给出一段简单的Python代码片段展示如何利用PyTorch库构建基本版Faster R-CNN架构: ```python import torch from torchvision.models.detection import fasterrcnn_resnet50_fpn from PIL import Image from torchvision.transforms.functional import to_tensor def load_image(image_path): image = Image.open(image_path).convert(&#39;RGB&#39;) return to_tensor(image) model = fasterrcnn_resnet50_fpn(pretrained=True) model.eval() image_path = &#39;path_to_your_test_image.jpg&#39; input_tensor = [load_image(image_path)] with torch.no_grad(): predictions = model(input_tensor)[0] for box, label, score in zip(predictions[&#39;boxes&#39;], predictions[&#39;labels&#39;], predictions[&#39;scores&#39;]): if score &gt; 0.8: # Confidence threshold print(f&quot;Detected object {label} with confidence {score:.2f}&quot;) ``` 这段程序加载了一个预训练好的ResNet-50 FPN版本的Faster R-CNN模型,并对其执行推理任务。对于给定测试图像路径中的每张照片,都会返回可能存在的物体边界框坐标、标签编号以及相应的概率值。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值