深度学习:Opencv的blobFromImage是如何工作的

说明

本文翻译自作者** Adrian Rosebrock**的一篇文章。
原文链接:Deep learning: How OpenCV’s blobFromImage works

介绍

在这里插入图片描述
之前有PyImageSearch 的读者在前几期的深度学习课程评论里想了解Opencv的blobFromImage的工作机制,所以特意写了此篇博文。

如你所见,为了从深度神经网络获得(正确的)预测,首先需要预处理你的数据。

在深度学习和图像分类的背景下,这些预处理通常包括:
1.均值减法(Mean subtraction)
2.缩放(scaling)
(PS:专业名词劝退系列,不过后面有详细解释)
OpenCV的深度神经网络(dnn)模块包含了两个方法,可以用来预处理图像,也可以通过已训练的深度学习模型为物体分类做准备。

在今天的博文中,我们将剖析opencv的cv2.dnn.blobFromImagecv2.dnn.blobFromImages预处理函数,并了解它们是如何工作的。

想要了解更多的opencv深度学习的图像预处理的内容,请继续阅读(链接

blobFromImage 的工作流程

前面提到过,opencv提供了两种方法进行图像的预处理:

cv2.dnn.blobFromImage
cv2.dnn.blobFromImages

这两个方法的作用是:
1.均值减法(Mean subtraction)
2.缩放(scaling)
3.可选的频道交换

接下来的部分,我们将:
1.探索均值减法和缩放
2.了解每个深度学习预处理函数的参数
3.学习这些方法的细节
4.最后,举例。

让我们开始吧

深度学习和均值减法

在这里插入图片描述
图片描述:均值减法直观点,就是左边图像的RGB减去中间的值后得到后边的值

在解释opencv的预处理功能之前,我们首先需要了解均值减法。在预处理的图片中,均值减法用来适应光照的变换(combat illumination changes)。因此,我们可以将均值减法视为一种协助卷积神经网络的技术。

在开始训练我们自己的深度神经网络之前,需要计算我们要训练的图片中RGB三个通道的平均像素(average pixel)。我们会得到三个变量:
在这里插入图片描述
每个变量是一个通道的平均值。总共三个通道也就是三个变量。

比如,ImageNet的均值为R=103.93, G=116.77,和 B=123.68(如果你使用过ImageNet,那你可能清楚这些值)

不过,在某些情况下,红色、绿色和蓝色的均值可能是按通道计算的,而不是按像素计算的,这会产生一个MxN矩阵。在这种情况下,处于训练或测试阶段的图片就减去每个通道值的MxN矩阵。

这两种方法(就是基于通道计算和像素计算)都是均值减法的形式,不过我们更看重基于像素的方式,尤其是数据多的情况下。

当我们准备好通过网络传递图片时(无论是为了训练还是测试),我们要将每个图片的每个通道的值减掉平均值。
在这里插入图片描述
我们还有一个缩放(scaling )的因子sigma,用来规范化。
在这里插入图片描述

sigma的值也许是训练过程中设置的均方差(也叫标准差)。不过,也可以手动设置sigma值将图片缩放到特定比例。
(PS:下面公式来自百度百科,标准差能反映一个数据集的离散程度。
例如,两组数的集合{0,5,9,14}和{5,6,8,9}其平均值都是7,但第二个集合具有较小的标准差。(百度百科))
在这里插入图片描述

重点要注意,并非所有的深度学习框架都有均值减法和缩放。所以在你预处理图片前,要了解你使用的深度神经网络。正如你在深度学习杂志上发现的那样,有些框架只有均值减法(将sigma设为了1),有些框架都有,有些都没有。

blobFromImage 和 blobFromImages

让我们首先参考opencv官方文档关于cv2.dnn.blobFromImage的说明。
(PS:可能需要的知识点blob概念

在这里插入图片描述

【blobFromImage】为图片创建了一个4维数组的blob。可以设置图片大小,并从图片中心进行剪切,减去均值,进行缩放,交换B和R通道

cv2.dnn.blobFromImagecv2.dnn.blobFromImages方法几乎相同。

让我们先看看cv2.dnn.blobFromImage方法的参数:

blob = cv2.dnn.blobFromImage(image, scalefactor=1.0, size, mean, swapRB=True)

每个参数的作用:
1.image:我们想要预处理的图片,之后会将图片放入深度神经网络来分类。
2.scalefactor:在均值减法处理后,我们可以用这个参数对图片进行缩放。这个参数默认为1。
3.size:设置卷积神经网络训练时输入的图片的大小。当前比较好的神经网络一般设置为224×224, 227×227, 299×299。
4.mean:这是均值减法中的均值,可以是3通道RGB的均值也可以是每个通道的均值,若是每个通道的均值需要用图片的每个通道减掉每个通道的均值。要确保通道顺序是RGB,尤其是swapRB=True时。
5.swapRB:opencv设定的图片是BGR通道顺序,然而,均值减法中要求我们使用RGB顺序。为了解决这个冲突,将该参数设为Ture,将R和B通道调换。该参数默认为Ture

cv2.dnn.blobFromImage方法在经过均值减法、标准化(PS:应该就是缩放)和通道交换后返回一个blob。

cv2.dnn.blobFromImages方法的参数是一样的。

<
  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值