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. 比特币现金的第四次战役
  2. 网页中嵌套网页flush_如何修改网页中的内容?
  3. Flink异步io应用场景之流表join维表
  4. 紫皮java_java如果已知一个日期为2007/3/8,求10天后是哪一天,367天后呢
  5. 日本語の勉強の日記 十七回
  6. The last packet successfully received from the server was 39,900 milliseconds ago问题解决
  7. 数学建模——典型相关分析及相关SPSS操作
  8. CAN为什么会发送失败
  9. Excel表格自动填充、批量提取与组合数据
  10. Shell版本循环语句(if//for/while/case)
  11. 播放器地址抓取 php,PHP实现使用优酷土豆视频地址获取swf播放器分享地址
  12. 最新会声会影2023旗舰版更新了哪些功能?
  13. fd和FILE结构体
  14. 图书馆管理信息系统的用例图和类图
  15. [笔记]Centos/Ubuntu/Windows/Docker 安装使用Aria2及Aria2基本使用
  16. 阿里技术团队是如何打造的?
  17. javaweb开发数码产品推荐平台系统设计与实现计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  18. 罗斯蒙特流量计选用的误区
  19. CCF-CSP2021-12认证感受
  20. 不知道从多少开始的Qt(QML)学习之旅(01)

热门文章

  1. MFC用户名+密码登录程序设计
  2. Arduino:入门案例之莫尔斯码表 SOS
  3. 数据集大全之 披萨店销售含披萨配料、销售信息、订单信息(含数据集)
  4. html常用的特殊符号
  5. OpenFeign修改负载均衡策略
  6. linux下usb2.0更快,Linux平台PK:USB2.0与3.0闪存盘谁强?
  7. windows 7 下cuda 9.0 卸载、cuda8.0 安装
  8. 五、电脑来电自动开机方法设置
  9. Java 连接Access数据库
  10. 注册有礼 | 2022北京智源大会火热报名中,报名即享百份礼品