Faster-rcnn源码解析1

1、从train_faster_rcnn_alt_opt.py文件开始,入口函数if __name__ =='__main__':

(1)首先,通过args = parse_args()函数从命令行读取参数,然后判断命令行参数cfg_file(配置文件),如果cfg_file是一个文件,那么利用cfg_from_file函数将cfg_file里面的数据合并到cofig.py文件中,实际上就是用cfg_file更新cofig.py里面的变量的默认值,如果cfg_file是一个列表,那么使用cfg_from_list函数去更新cofig.py

(2)创建一个进程,然后使用get_solvers(args.net_name)函数得到四部训练过程中的参数值prototxt文件、迭代次数、rpn_test.pt的绝对路径。

2、下面开始第一个阶段的训练:Stage 1 RPN, init from ImageNet model(假设使用的是voc2007数据集,基础网络是ZF网络)

配置训练函数train_rpn所需要的参数,然后将train_rpn放入进程中,下面来看train_rpn函数:

首先设置参数,其中cfg.TRAIN.PROPOSAL_METHOD ='gt',这个参数先注意一下,马上就可以用到:通过get_roidb(imdb_name),函数获取roidb和 imdb,下面进入get_roidb(imdb_name)函数看一下内部结构:


Faster-rcnn源码解析1_第1张图片

假设imdb_name为:voc_2007_trainval,进入get_imdb函数函数,发现get_imdb函数的返回值imdb是一个pascal_voc类,而且pascal_voc类是imdb类的一个子类,然后执行imdb的函数set_proposal_method,这里要注意:cfg.TRAIN.PROPOSAL_METHOD ='gt',进入set_proposal_method函数:发现这个函数最终的结果是:

self._roidb_handler = self.gt_roidb,而且self.gt_roidb也是一个函数,进入self.gt_roidb函数,发现这个函数做了两件事情:

第一,返回了gt_roidb,而且gt_roidb是一个列表,列表的长度是读取的图片的个数,列表中的每一个元素都是一个字典,字典的内容包括:'boxes' (num_objs行4列的矩阵,num_objs是图片中的物体数量,4列是每个物体左上角和右下角的坐标),'gt_classes'(包含num_objs个元素的一维矩阵,矩阵中每个元素的取值表示:物体所对应的类别号),'gt_overlaps'(num_objs行21列的矩阵,这个矩阵表示的是:每个物体的box和gt_box的IOU,由于这里本来就只有gt_box,所以IOU为1,因此这个矩阵的每一行中,只有这个物体所对应的类别号所在的列元素为1,其余都为0),'flipped'(有没有翻转,默认没有,所以取值为:False),'seg_areas'(包含num_objs个元素的一维矩阵,矩阵中每个元素的取值表示:这个物体的gt_box的面积)

第二,将得到的gt_roidb写入'voc_2007_trainval_gt_roidb.pkl'文件中。

这样,初步得到了roidb(即为:gt_roidb),下面通过get_training_roidb函数对刚才得到roidb做进一步的处理,下面进入get_training_roidb函数:


Faster-rcnn源码解析1_第2张图片

首先看到,这个函数的传入变量是我们上面得到的pascal_voc类,而且cfg.TRAIN.USE_FLIPPED的取值为:True,那么执行imdb.append_flipped_images()函数,这个函数做三件事:

第一,将roidb列表做一个copy,然后对copy的元素进行操作:(1)修改'boxes'的值(对图片做翻转,那么gt_box的坐标必然会发生变化)(2)修改'flipped'的值为:True(代表这张图片是经过翻转之后的图片)

第二,将修改后的copy数据添加到原来的roidb列表中,这样列表的长度翻倍

第三,将self._image_index(是一个列表,保存的是图片的名称)复制一份,并和原来的列表拼接在一块,这样self._image_index的长度也翻倍

然后,执行prepare_roidb(imdb)函数,这个函数主要是往roidb列表的每一个字典元素中增加更多的key和value:

roidb[i]['image']:每张图片的绝对路径

roidb[i]['width']:每张图片的宽度

roidb[i]['height']:每张图片的高度

roidb[i]['max_classes'] =gt_overlaps.argmax(axis=1):每张图片中包含的物体的类别号(是一个:一维向量)

roidb[i]['max_overlaps'] =gt_overlaps.max(axis=1):# 按照行求最大值,对于gt_box来说结果为np.ones(物体个数),是一个:一维向量,这里因为只有gt_box,所以取值为1

最后,返回get_roidb函数中,到这里,关于图片的原始数据的准备工作就结束了:roidb(gt_box)和imdb(pascal_voc类)。

这里总结一下roidb,roidb是一个列表,列表的长度是读取的图片文件个数的两倍(注意,经过了图片翻转),列表中的每一个元素都是一个字典,而且字典的key包括:'boxes' 、'gt_classes'、'gt_overlaps'、'flipped'(原始图片取值为:False,翻转之后的图片取值为:True)、'image'、'width'、'height'、'max_classes'、'max_overlaps'。

有个地方需要注意一下:对于gt_box来说,'gt_classes'和'max_classes'的取值是一样的。

你可能感兴趣的:(Faster-rcnn源码解析1)