深度学习中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有更少的函数调用开销,你将能够更快批处理图像或帧。