OpenCV 的 blobFromImage 是如何工作的?
在本文中,我们将尝试了解 OpenCV 库中 dnn 模块中的 blobfromImage函数如何工作以及何时使用它。
blobfromImage()函数
它为输入图像返回一个 4 维数组/blob。您还可以使用它来预处理图像以匹配您的输入要求。您可以使用它的不同参数来转换图像,所以让我们讨论它的所有参数:
Syntax: blob = cv2.dnn.blobFromImage(image, scalefactor=1.0, size, mean, swapRB=True)
Parameters:
- image – This is the image that we want to preprocess (for our model)
- scalefactor– scale factor basically multiplies(scales) our image channels. And remember that it scales it down by a factor of 1/n, where n is the scalefactor you provided.
- size – this is the target size that we want our image to become. Most common CNNs use 224×224 or 229×229 pixels as their input image array, but you can set it to meet your model requirements.
- mean– this is the mean subtracting values. You can input a single value or a 3-item tuple for each channel RGB, it will basically subtract the mean value from all the channels accordingly, this is done to normalize our pixel values. Note: mean argument utilizes the RGB sequence
- swapRB- OpenCV by default reads an image in BGR format, but as I mentioned above that the mean argument takes in the values in RGB sequence, so to prevent any disruption this function, as the name implies swaps the red and blue channels. ( i.e why its default value is True)
示例 1:缩放和匹配目标大小
大多数情况下,您是模型输入,您必须在 0-1 而不是 0-255 之间缩小图像像素值,即您可以在其中使用scalefactor参数 - 并且还可以更改图像的目标大小:
Python3
import cv2
import numpy as np
# change the image path to your image
image = cv2.imread('ad.png')
# let's say this is the required size
size = (640, 720)
# let's print the image pixel values
print(image)
print(f'Image Shape : {np.array(image).shape}')
blob = cv2.dnn.blobFromImage(image,
scalefactor=1/255,
size=size,
swapRB=True)
# let's see our transformed image- blob
print(blob)
print(f'Blob Shape : {np.array(blob).shape}')
输出:
[[[255 255 255]
[255 255 255]
[255 255 255]
...
...
[255 255 255]
[255 255 255]
[255 255 255]]]
Image Shape : (817, 861, 3)
[[[[1. 1. 1. ... 1. 1. 1.]
[1. 1. 1. ... 1. 1. 1.]
[1. 1. 1. ... 1. 1. 1.]
...
...
[1. 1. 1. ... 1. 1. 1.]
[1. 1. 1. ... 1. 1. 1.]
[1. 1. 1. ... 1. 1. 1.]]]]
Blob Shape : (1, 3, 720, 640)
如您所见,所有开始时为 255 的值都转换为 1,这是因为我们的比例因子是 1/255。而且我们最终的 blob 大小为 720,640,这正是我们想要的。
示例 2:将其与模型一起使用以创建输入图像
您使用什么比例因子或您使用什么目标大小或您标准化的平均值,这一切都取决于所使用的模型。如果您使用框架中的预训练模型,请阅读他们的文档以了解输入图像的所有要求。
例如:如果我正在创建一个性别分类器程序,然后我决定使用 caffe 模型,
#——Model Files———–#
genderProto=”Models/gender_deploy.prototxt”
genderModel=”Models/gender_net.caffemodel”
#############———–Blob Variables—————###################
scalefactor = 1.0
MODEL_MEAN_VALUES=(78.4263377603, 87.7689143744, 114.895847746) #mean values
size = (227,227)
#############———————————————-##############
#classes in our model ——–> Required for predictions
ageList=[‘(0-2)’, ‘(4-6)’, ‘(8-12)’, ‘(15-20)’, ‘(25-32)’, ‘(38-43)’, ‘(48-53)’, ‘(60-100)’]
genderList=[‘Male’,’Female’]
这些是使用该模型创建我们的博客所需的所有值或数据,因此:
blob=cv2.dnn.blobFromImage(face, scalefactor=scalefactor, size=size, MODEL_MEAN_VALUES, swapRB=True)
这是 blob 现在被转换为直接作为输入传递给我们的模型。
如果您使用预训练模型并希望转换图像以适应模型要求,这是基本过程。
接下来是什么?
尝试使用来自 TensorFlow 和 PyTorch 等框架的预训练模型来创建计算机视觉程序。