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 imageres = int(aspect * input_height)imgScaled = skimage.transform.resize(img, (input_height, res))
if(aspect<1):# portrait orientation - tall imageres = 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.shapestartx = 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

caffe2学习笔记一:图像预处理相关推荐

  1. 【CV学习笔记】图像预处理warpaffine-cuda加速

    1.前言 在上个学习笔记中学习warpaffine,并且在opencv下面实现了图像的预处理,而warpaffine可以很好的利用cuda加速来实现,于是基于手写AI的项目,又学习了warpaffie ...

  2. 【CV学习笔记】图像预处理warpaffine

    1.前言 在学习图像预处理的时候发现,之前用的图像预处理方法一般为 resize和letter box,这两种方法比较低效,后来在手写AI中接触到了warpaffine,只需要一步就能够对图像进行预处 ...

  3. 《南溪的目标检测学习笔记》——图像预处理的学习笔记

    1 致谢 感谢PaddleDetection对开源社区的分享以及在目标检测领域做出的贡献! 2 Letterbox--YOLO家族使用的预处理方法 代码链接:yolov5-letterbox

  4. 《南溪的目标检测学习笔记》——模型预处理的学习笔记

    1 介绍 在目标检测任务中,模型预处理分为两个步骤: 图像预处理:基于图像处理算法 数值预处理:基于机器学习理论 关于图像预处理,请参考<南溪的目标检测学习笔记>--图像预处理的学习笔记 ...

  5. Caffe学习笔记4图像特征进行可视化

    Caffe学习笔记4图像特征进行可视化 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hit201 ...

  6. rem和em学习笔记及CSS预处理

    rem和em学习笔记及CSS预处理 1.当元素A的字体单位是n rem时,它将根据根元素(html)的font-size的大小作为基准,比如  View Code parent-div中的em-div ...

  7. C++下opencv学习笔记(一)(图像的简单读取丶显示与存储)

    C++下opencv学习笔记(一)(图像的简单读取丶显示与存储) 前言 学习C++ OpenCV,第一需要具备面向对象语言的基础,第二要对图像处理机器学习有基础了解,容易入门.觉得自己基础已经有了可以 ...

  8. OpenCV学习笔记(九)——图像轮廓(下)

    <OpenCV轻松入门:面向Python>学习笔记(九) 1-3 查找并绘制轮廓.矩特性及Hu矩 4-5 轮廓拟合及凸包 6. 利用形状场景算法比较轮廓 6.1 计算形状场景距离 6.2 ...

  9. Opencv学习笔记(八) -- 图像色彩空间转换

    1.常见图像色彩空间 RGB RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道 ...

最新文章

  1. /home/appleyuchi主目录迁移到新磁盘中
  2. js重新渲染div_前端工程师必备:从浏览器的渲染到性能优化
  3. Jmter操作数据库
  4. shiro学习(24):Spring的transaction-manager的用法
  5. 何为真正的 FaaS ?阿里舜天平台做了四大创新
  6. c# mvvm模式获取当前窗口_对Vue中的MVVM原理解析和实现
  7. linux home目录重装,Linux/centos 卸载重装
  8. 树的平衡之AVL树——错过文末你会后悔,信我
  9. 久未更 ~ 四之 —— Vsftpd出现 Failed to start Vsftpd ftp daemon错误
  10. NFinal 控制器—URL
  11. 先进科技计算机视觉,CEEC科技Corner第四期开讲:《3D计算机视觉技术发展与应用》...
  12. 网站换服务器会降权,网站更换IP地址,对SEO有什么影响?
  13. android启用hdcp_如何在Google Android模拟器中启用Android Market
  14. 稚晖君_瀚文机械键盘
  15. 格兰富Grundfos CM3-2 A-R-A-E-AVBE F-A-A-N
  16. 广西行政村数据shp_全国 shp 矢量数据汇总(四):全国行政区划基础矢量数据(精确到乡镇级别)...
  17. 使用CSS样式设置文本超出2行显示为省略号
  18. 1135: 算菜价 C语言
  19. 我希望逢着一个丁香一样地结着愁怨的姑娘
  20. (三)Java的基本程序结构(二)---数据输入、控制流、大数、数组

热门文章

  1. LuckyFrame测试平台了解一下
  2. Ubuntu系统安装ifort编译器
  3. 深度学习 Day 9——浅知有关GAN训练与预测
  4. 【小小demo】微信机器人开放接口对接
  5. c语言用printf画熊猫,STM32重定向printf()和scanf()到UART
  6. 9-Linux_系统介绍
  7. 判断一个 9x9 的数独是否有效的解题方法整理
  8. 点云处理算法整理(超详细教程)十大点云数据处理技术梳理
  9. C#NPOI Excel设置单元格边框、单元格文字居中、设置打印尺寸、设置页脚、行高列宽
  10. 2020-10-19。小白自学:飞机大战源码改造。(新手入门,学习总结。从零开始,步步为营。不同版本,独立运行。完整代码,感谢原著。)