Faster-RCNN Pytorch实现的minibatch包装

   2023-02-09 学习力876
核心提示:实际上faster-rcnn对于输入的图片是有resize操作的,在resize的图片基础上提取feature map,而后generate一定数量的RoI。我想首先去掉这个resize的操作,对每张图都是在原始图片基础上进行识别,所以要找到它到底在哪里resize了图片。直接搜 grep 'resize' ./

实际上faster-rcnn对于输入的图片是有resize操作的,在resize的图片基础上提取feature map,而后generate一定数量的RoI。

我想首先去掉这个resize的操作,对每张图都是在原始图片基础上进行识别,所以要找到它到底在哪里resize了图片。

直接搜 grep 'resize' ./lib/ -r

./lib/crnn/utils.py: v.data.resize_(data.size()).copy_(data)
./lib/model/config.py:# Option to set if max-pooling is appended after crop_and_resize.
./lib/model/config.py:# if true, the region will be resized to a square of 2xPOOLING_SIZE,
./lib/model/config.py:# resized to a square of POOLING_SIZE
./lib/model/test.py: im = cv2.resize(im_orig, None, None, fx=im_scale, fy=im_scale,
./lib/nets/network.py:from scipy.misc import imresize
./lib/nets/network.py: image = imresize(image[0], self._im_info[:2] / self._im_info[2])
./lib/utils/blob.py: im = cv2.resize(im, None, None, fx=im_scale, fy=im_scale,

这里在training过程中应当是调用了./lib/utils/blob.py,

该文件包含了两个函数:

 1 def im_list_to_blob(ims):
 2   """Convert a list of images into a network input.
 3   Assumes images are already prepared (means subtracted, BGR order, ...).
 4   """
 5   max_shape = np.array([im.shape for im in ims]).max(axis=0)
 6   num_images = len(ims)
 7   blob = np.zeros((num_images, max_shape[0], max_shape[1], 3),
 8                   dtype=np.float32)
 9   for i in range(num_images):
10     im = ims[i]
11     blob[i, 0:im.shape[0], 0:im.shape[1], :] = im
12 
13   return blob
14 
15 
16 def prep_im_for_blob(im, pixel_means, target_size, max_size):
17   """Mean subtract and scale an image for use in a blob."""
18   im = im.astype(np.float32, copy=False)
19   im -= pixel_means
20   im_shape = im.shape
21   im_size_min = np.min(im_shape[0:2])
22   im_size_max = np.max(im_shape[0:2])
23   im_scale = float(target_size) / float(im_size_min)
24   # Prevent the biggest axis from being more than MAX_SIZE
25   if np.round(im_scale * im_size_max) > max_size:
26     im_scale = float(max_size) / float(im_size_max)
27   im = cv2.resize(im, None, None, fx=im_scale, fy=im_scale,
28                   interpolation=cv2.INTER_LINEAR)
29 
30   return im, im_scale

而这两个函数都是在./lib/roi_data_layer/minibatch.py 下被调用的。

而该文件也定义了两个函数,其中get_minibatch() 调用了另一个子函数_get_image_blob()。

 1 def get_minibatch(roidb, num_classes):
 2   """Given a roidb, construct a minibatch sampled from it."""
 3   num_images = len(roidb)
 4   # Sample random scales to use for each image in this batch
 5   random_scale_inds = npr.randint(0, high=len(cfg.TRAIN.SCALES),
 6                   size=num_images)
 7   assert(cfg.TRAIN.BATCH_SIZE % num_images == 0), \
 8     'num_images ({}) must divide BATCH_SIZE ({})'. \
 9     format(num_images, cfg.TRAIN.BATCH_SIZE)
10 
11   # Get the input image blob, formatted for caffe
12   im_blob, im_scales = _get_image_blob(roidb, random_scale_inds)
13 
14   blobs = {'data': im_blob}
15 
16   assert len(im_scales) == 1, "Single batch only"
17   assert len(roidb) == 1, "Single batch only"
18   
19   # gt boxes: (x1, y1, x2, y2, cls)
20   if cfg.TRAIN.USE_ALL_GT:
21     # Include all ground truth boxes
22     gt_inds = np.where(roidb[0]['gt_classes'] != 0)[0]
23   else:
24     # For the COCO ground truth boxes, exclude the ones that are ''iscrowd'' 
25     gt_inds = np.where(roidb[0]['gt_classes'] != 0 & np.all(roidb[0]['gt_overlaps'].toarray() > -1.0, axis=1))[0]
26   gt_boxes = np.empty((len(gt_inds), 5), dtype=np.float32)
27   gt_boxes[:, 0:4] = roidb[0]['boxes'][gt_inds, :] * im_scales[0]
28   gt_boxes[:, 4] = roidb[0]['gt_classes'][gt_inds]
29   blobs['gt_boxes'] = gt_boxes
30   blobs['im_info'] = np.array(
31     [im_blob.shape[1], im_blob.shape[2], im_scales[0]],
32     dtype=np.float32)
33 
34   return blobs
35 
36 def _get_image_blob(roidb, scale_inds):
37   """Builds an input blob from the images in the roidb at the specified
38   scales.
39   """
40   num_images = len(roidb)
41   processed_ims = []
42   im_scales = []
43   for i in range(num_images):
44     im = cv2.imread(roidb[i]['image'])
45     if roidb[i]['flipped']:
46       im = im[:, ::-1, :]
47     target_size = cfg.TRAIN.SCALES[scale_inds[i]]
48     im, im_scale = prep_im_for_blob(im, cfg.PIXEL_MEANS, target_size,
49                     cfg.TRAIN.MAX_SIZE)
50     im_scales.append(im_scale)
51     processed_ims.append(im)
52 
53   # Create a blob to hold the input images
54   blob = im_list_to_blob(processed_ims)
55 
56   return blob, im_scales

get_minibatch()又是被./lib/roi_data_layer/layer.py中的类RoIDataLayer的一个方法forward()中调用的另一个方法_get_next_minibatch()调用的。

至此,由于RoIDataLayer类在类Network中被调用,终于把这些都接起来了。

faster-RCNN的代码实在是冗杂,来来回回定义了很多完全可以用一个函数实现的很多很多个函数。我佛了!

 

 
反对 0举报 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 基于pytorch框架的图像分类实践(CIFAR-10数据集)
    基于pytorch框架的图像分类实践(CIFAR-10数据集
    在学习pytorch的过程中我找到了关于图像分类的很浅显的一个教程上一次做的是pytorch的手写数字图片识别是灰度图片,这次是彩色图片的分类,觉得对于像我这样的刚刚开始入门pytorch的小白来说很有意义,今天写篇关于这个图像分类的博客.收获的知识1.torchvison
    03-08
  • 今天来捋一捋pytorch官方Faster R-CNN代码
    今天来捋一捋pytorch官方Faster R-CNN代码
    AI编辑:我是小将本文作者:白裳https://zhuanlan.zhihu.com/p/145842317本文已由原作者授权 目前 pytorch 已经在 torchvision 模块集成了 FasterRCNN 和 MaskRCNN 代码。考虑到帮助各位小伙伴理解模型细节问题,本文分析一下 FasterRCNN 代码,帮助新手理解
    03-08
  • 从零搭建Pytorch模型教程(三)搭建Transformer网络
    从零搭建Pytorch模型教程(三)搭建Transformer
    ​前言 本文介绍了Transformer的基本流程,分块的两种实现方式,Position Emebdding的几种实现方式,Encoder的实现方式,最后分类的两种方式,以及最重要的数据格式的介绍。 本文来自公众号CV技术指南的技术总结系列欢迎关注公众号CV技术指南,专注于计算机
    03-08
  • 几种网络LeNet、VGG Net、ResNet原理及PyTorch实现
    几种网络LeNet、VGG Net、ResNet原理及PyTorch
    LeNet比较经典,就从LeNet开始,其PyTorch实现比较简单,通过LeNet为基础引出下面的VGG-Net和ResNet。LeNetLeNet比较经典的一张图如下图LeNet-5共有7层,不包含输入,每层都包含可训练参数;每个层有多个Feature Map,每个FeatureMap通过一种卷积滤波器提取输
    03-08
  • Focal Loss 的Pytorch 实现以及实验
    Focal Loss 的Pytorch 实现以及实验
     Focal loss 是 文章 Focal Loss for Dense Object Detection 中提出对简单样本的进行decay的一种损失函数。是对标准的Cross Entropy Loss 的一种改进。 F L对于简单样本(p比较大)回应较小的loss。如论文中的图1, 在p=0.6时, 标准的CE然后又较大的loss
    03-08
  • Pytorch-基础入门之ANN pytorch零基础入门
    在这部分中来介绍下ANN的Pytorch,这里的ANN具有三个隐含层。这一块的话与上一篇逻辑斯蒂回归使用的是相同的数据集MNIST。第一部分:构造模型# Import Librariesimport torchimport torch.nn as nnfrom torch.autograd import Variable# Create ANN Modelclas
    03-08
  • 分享一个PyTorch医学图像分割开源库 python医学图像处理dicom
    分享一个PyTorch医学图像分割开源库 python医学
    昨天点击上方↑↑↑“OpenCV学堂”关注我来源:公众号 我爱计算机视觉授权  分享一位52CV粉丝Ellis开发的基于PyTorch的专注于医学图像分割的开源库,其支持模型丰富,方便易用。其可算为torchio的一个实例,作者将其综合起来,包含众多经典算法,实用性比
    03-08
  • 搞懂Transformer结构,看这篇PyTorch实现就够了
    搞懂Transformer结构,看这篇PyTorch实现就够了
    搞懂Transformer结构,看这篇PyTorch实现就够了昨天下面分享一篇实验室翻译的来自哈佛大学一篇关于Transformer的详细博文。"Attention is All You Need"[1] 一文中提出的Transformer网络结构最近引起了很多人的关注。Transformer不仅能够明显地提升翻译质量,
    03-08
  • 行人重识别(ReID) ——基于MGN-pytorch进行可视化展示
    行人重识别(ReID) ——基于MGN-pytorch进行可视
    https://github.com/seathiefwang/MGN-pytorch下载Market1501数据集:http://www.liangzheng.org/Project/project_reid.html模型训练,修改demo.sh,将 --datadir修改已下载的Market1501数据集地址,将修改CUDA_VISIBLE_DEVICES=2,3自己的GPU设备ID,将修改--
    03-08
  • Pytorch:通过pytorch实现逻辑回归
    Pytorch:通过pytorch实现逻辑回归
    logistic regression逻辑回归是线性的二分类模型(与线性回归的区别:线性回归是回归问题,而逻辑回归是线性回归+激活函数sigmoid=分类问题)模型表达式:f(x)称为sigmoid函数,也称为logistic函数,能将所有值映射到[0,1]区间,恰好符合概率分布,如下图所示
    03-08
点击排行