faster rcn固定输入图片尺寸(一)

一.问题的产生


随着对于faster rcnn研究的深入,我们或许想要改变网络的整体结构,如将全连接层变为全卷积层来实验更好的分类方式,又或者会想要将多层的特征图进行融合或反卷积操作。但是如果只是修改网络配置文件train.prototxt和test.prototxt,结果有可能会报错,大意就是某一层blob的实际大小与我们设计的大小不匹配所导致的。而我们从文章和代码浅层来看(文章给出的caffe-python源码),它是使用两个参数scale和maxsize来固定了输入图片大小的。

        # data blob: holds a batch of N images, each with 3 channels
        idx = 0
        top[idx].reshape(cfg.TRAIN.IMS_PER_BATCH, 3,
            max(cfg.TRAIN.SCALES), cfg.TRAIN.MAX_SIZE)
        self._name_to_top_map['data'] = idx
        idx += 1

上面的代码来自roi_data_layer的layer.py。主要作用就是在网络起始阶段固定好输入的data的数据维度。reshape()函数中第一个参数表示的这个blob中数据的数量,在使用RPN时,必须要求IMS_PER_BATCH为1,即必须在一个bacth中只能使用一张图片中样本(后面解释为什么)。3是RBG图像的通道数目,后面两个参数似乎是图片的宽和长。可以看到这里将宽设定为max(cfg.TRAIN.SCALES)即设定图像金字塔的最大尺度(600),将长设定为cfg.TRAIN.MAX_SIZE(1000)。但是实际上,我们可以接下来看看获取每一个batch的数据的实际的情况

def prep_im_for_blob(im, pixel_means, target_size, max_size):
    """Mean subtract and scale an image for use in a blob."""
    im = im.astype(np.float32, copy=False)
    im -= pixel_means
    im_shape = im.shape
    im_size_min = np.min(im_shape[0:2])#短边
    im_size_max = np.max(im_shape[0:2])#长边
    im_scale = float(target_size) / float(im_size_min)# scale/短边
    # Prevent the biggest axis from being more than MAX_SIZE
    if np.round(im_scale * im_size_max) > max_size:#计算得到的目标长不应该超过设定的max_size(1000)
        im_scale = float(max_size) / float(im_size_max)#万一出现就以max_size为目标计算im_scale
    im = cv2.resize(im, None, None, fx=im_scale, fy=im_scale,
                    interpolation=cv2.INTER_LINEAR)

    return im, im_scale

在这里,我们看到在将图片进行resize时,对于fx,fy使用了同一个im_scale进行放缩。这样可以保持图片的纵横比不变。这里的im_scale是来自于短边与scale的比值,但一但通过就这种方法计算出来的长边超过了上设置的max_size之后我们就要以max_size为目标计算im_scale.
所以有这段代码来看,我之前的理解是错的, max(cfg.TRAIN.SCALES), cfg.TRAIN.MAX_SIZE 这两个参数并不是分别表示长和宽,他的参数意义就是其字面意义cfg.TRAIN.SCALES表示理想的输入尺度, cfg.TRAIN.MAX_SIZE则是设定输入图片的阈值,边长不可以超过的最大长度。这样我们可以知道,对于整个数据集,我们的图片的纵横比和大小并不是完全一致的,那么有些bolb之间存在大小不匹配就不奇怪了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值