cv2.dnn.blobFromImage函数

深度学习中OpnenCV的blobFromImage是对输入图像做了什么呢?
在这里插入图片描述
在PyImageSearch有许多读者好奇,blobFromImage到底是对图像做了了什么样的处理 ?今天我就来告诉大家。

你也必定明白,为了从深度神经网络获得预测结果,你首先需要对你的数据进行预处理。

在深度学习和图像分类领域,预处理任务通常包含:
1.减均值(Mean subtraction)
2.按比例缩放(Scaling by some factor)
OpenCV新的神经网络模块dnn包含两个预处理函数,为通过预训练深度学习模型进行分类,做好准备。

今天的博文,我准备剖析OpenCV的cv2.dnn.blobFromImage和cv2.dnn.blobFromImages(一次多图片)预处理函数,理解他们是如何工作的。

OpenCV提供两个函数用来促进图像预处理,用于深度学习分类。

  cv2.dnn.blobFromImage

 cv2.dnn.blobFromImages

这两个函数执行:

 1.减均值

 2.缩放

 3.通道交换(可选)

下面我们有这些内容:

 1.研究减均值与缩放

 2.解释每个深度学习预处理函数的函数签名

 3.在细节上研究这些方法

 4.最后,对一副图像运用OpenCV的深度学习函数

深度学习的减均值

在这里插入图片描述
在我没有深入解释OpenCV深度学习预处理函数之前,我们首先需要理解减均值的作用。减均值帮助我们对抗输入图像的亮度变化,所以我们将减均值作为一个技术用来帮助我们的卷积神经网络。

在训练我们深度神经网络之前,我们首先计算像素平均值。我们计算训练集所有图像,在R,G,B三个通道。

这意味这我们最终我们得到三个值:
在这里插入图片描述
通常,结果是一个三元组,分别由红绿蓝通道的均值组成。

例如,在ImageNet训练集,R = 103.93 , G = 116.77, B = 123.68。如果你已经用过一个ImageNet的预训练网络,或许之前已经遇到过这些值。

然而,在某些情况下,红绿蓝的均值或许按通道计算的而不是按像素,结果就是一个MxN的矩阵。在这种情况下,输入图像在训练或者测试的时候,减去的就是这个MxN的矩阵。

这两种方法用于减均值都是完全有效的,我们常看到按像素的版本,它用的更多,尤其是对于大的数据集。

当我们准备传入一个图像到我们的网络,图像的每个通道减均值μ:

在这里插入图片描述
a的值可以是训练集上的标准偏差(从而将预处理步骤转换为标准分数/ z分数)。 但是,也可以手动设置a(相对计算)以将输入图像空间缩放到特定范围 - 它实际上取决于架构,网络如何训练以及作者所用的技术。

需要注意:不是所有的深度学习架构执行减均值和缩放!在预处理你的图像之前,一定要读你所使用网络的相关文献。

正如您在深入学习过程中所发现的,一些网络架构只执行平均减法(因此设置a=1)。其他架构执行减法和缩放。甚至其他架构不选择执行减法或缩放。总之,检查您正在实施/使用的网络相关出版物,以验证作者正在使用的技术。

非正式地,blob只是具有相同空间维度(即宽度和高度),相同深度(通道数)的图像(可能是集合),它们都以相同的方式被预处理。

cv2.dnn.blobFromImage 和 cv2.dnn.blobFromImages功能差不多,

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

1.image,这是传入的,需要进行处理的图像。

2.scalefactor,执行完减均值后,需要缩放图像,默认是1,需要注意,scalefactor = 1 / \sigma,这是真正乘上的值。

3.size,这是神经网络,真正支持输入的值。

4.mean,这是我们要减去的均值,可以是R,G,B均值三元组,或者是一个值,每个通道都减这值。如果执行减均值,通道顺序是R、G、B。 如果,输入图像通道顺序是B、G、R,那么请确保swapRB = True,交换通道。

5.swapRB,OpenCV认为图像 通道顺序是B、G、R,而减均值时顺序是R、G、B,为了解决这个矛盾,设置swapRB=True即可。

6.crop,如果crop裁剪为真,则调整输入图像的大小,使调整大小后的一侧等于相应的尺寸,另一侧等于或大于。然后,从中心进行裁剪。如果“裁剪”为“假”,则直接调整大小而不进行裁剪并保留纵横比。

7.ddepth, 输出blob的深度,选则CV_32F or CV_8U。

cv2.dnn.blobFromImage函数返回的blob是我们输入图像进行随意从中心裁剪,减均值、缩放和通道交换的结果。cv2.dnn.blobFromImages和cv2.dnn.blobFromImage不同在于,前者接受多张图像,后者接受一张图像。多张图像使用cv2.dnn.blobFromImages有更少的函数调用开销,你将能够更快批处理图像或帧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值