caffe2学习笔记一:图像预处理

Facebook的caffe2是caffe的升级版,相较于caffe的主要不同是将layer替换成了更为强大灵活的operator以及添加了类似matlab中的工作区概念的workspace,基本数据结构blob和net保持不变。

关于caffe2的教程,英语好的人可以看官方教程,英语不好的朋友可以看caffe2教程入门(python版),也是基于官方教程整理出来的,整理的也比较好。下面是我对“caffe2教程入门”中未详细介绍的Image Pre-Processing的一些总结,目的是巩固所学,方便日后回顾。

Caffe2图像预处理阶段主要用到的python库是skimage

1 颜色通道顺序问题 RGB to BGR

由于caffe底层的图像处理是基于OpenCV的,所以其使用的颜色通道顺序与OpenCV一样都是BGR(Blue-Green-Red),而日常生活中的图片颜色通道顺序是RGB,这一点要注意。在Python中,将RGB顺序的图像转成BGR顺序,只要调整channel dimension的各颜色通道顺序即可。

img = skimage.img_as_float(skimage.io.imread(IMAGE_LOCATION)).astype(np.float32)
imgBGR = img[:, :, (2, 1, 0)] # 0,1,2分别代表R,G,B

2 图像数组维度顺序 HWC to CHW

H指高度(height,图像垂直边长),W指宽度(width,图像水平边长),C指颜色通道(channel)。
对于CPU处理而言,顺序一般是HWC,但对于GPU处理而言,这个顺序需要是CHW(由于cuDNN的原因,貌似这样的顺序能处理得更快)。而caffe2倾向使用CHW的顺序。在Python中,将HWC顺序的图像转换成CWH顺序,可以使用numpy的swapaxes()函数。

img = skimage.img_as_float(skimage.io.imread(IMAGE_LOCATION)).astype(np.float32) # 一般图像img是HWC顺序
imgCHW = img.swapaxes(1,2).swapaxes(0,1) # 先W和C互换维度,再将H和C互换维度

3 旋转和镜像

旋转
e.g imgRotated = np.rot90(img) # 逆时针旋转90度
镜像
e.g imgMirror = np.fliplr(img) # 左右镜像翻转

4 缩放Resizing

Caffe2中能处理的图像应该是正方形的,且应该缩放到标准的尺寸(通常比图像原始尺寸要小)。主要有两种缩放方式:强行缩放到标准尺寸(Sizing)和等比例缩放(Rescaling)再Crop到标准尺寸。

Sizing简单,但会对非方形的原始图像造成一定程度的形变。
e.g img224 = skimage.transform.resize(img,(224,224))

Rescaling要根据原始图像的宽高比和短边去计算rescale后的图像宽高。
假定原始图像的宽高比ratio=W0/H0

  • 高为短边:如风光图片(wide image),以高为基准rescale。即选定rescale后的高H1,按W1=ratio*H1计算宽
  • 宽为短边:如肖像图片(tall image),以宽为基准rescale。即选定rescale后的宽,按H1=W1/ratio计算高
    总结来说,就是以缩放后的短边为基准,利用宽高比计算缩放后的另一条边。下面是相关计算的代码段:
aspect = img.shape[1]/float(img.shape[0])
print("Orginal aspect ratio: " + str(aspect))
if(aspect>1):
    # landscape orientation - wide image
    res = int(aspect * input_height)
    imgScaled = skimage.transform.resize(img, (input_height, res))
if(aspect<1):
    # portrait orientation - tall image
    res = int(input_width/aspect)
    imgScaled = skimage.transform.resize(img, (res, input_width))
if(aspect == 1):
    imgScaled = skimage.transform.resize(img, (input_height, input_width))

注:有时需要放大(上采样upscaling)图像,也可以使用skimage.trasform.resize(),resize函数会默认使用双线性插值填充像素,但要注意图像数组维度顺序是平常的HWC顺序的,因为resize函数默认只对图像前两维度操作。

5 裁剪Cropping

经常使用的是中心裁剪,有三种裁剪策略:

  1. 直接对原图进行中心裁剪
  2. 将原图缩放成正方形后再进行中心裁剪
  3. 将原图等比例缩放后再进行中心裁剪

中心裁剪的函数代码如下:

def crop_center(img,cropx,cropy):
    y,x,c = img.shape
    startx = x//2-(cropx//2) # '//'在python2中表示floor除法
    starty = y//2-(cropy//2)    
    return img[starty:starty+cropy,startx:startx+cropx]

三种裁剪策略的效果图如下:
这里写图片描述

6 Batch项

添加Batch项一般是caffe2图像预处理的最后一步,在经过前面RGB->BGR,几何变换(旋转、镜像、缩放、裁剪等)以及HWC->CHW后,还需要在CHW前添加一个第四维N以跟踪图像样本数量(即batchsize),所以最终送入caffe的图像格式为(N,C,H,W),其中颜色通道C的顺序是BGR。

参考资料:
1. caffe2 tutorials: Image Loading and Processing

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值