在opencv中使用DNN网络对图像进行处理。
**完整代码:https://github.com/YvanYan/image_processing/tree/master/dnn
**
流程:
1.加载已经训练好的DNN模型
2.图像预处理,使其满足DNN输入尺寸
3.使用DNN读取图像,进行前向传播预测
4.得到预测结果
1.加载已经训练好的DNN模型
# Caffe所需配置文件
net = cv2.dnn.readNetFromCaffe("bvlc_googlenet.prototxt",
"bvlc_googlenet.caffemodel")
这里使用的是caffe框架下的DNN网络,可以根据需要更换。
2.图像预处理,使其满足DNN输入尺寸
image = cv2.imread(imagePaths[0])
resized = cv2.resize(image, (224, 224))
需要将图像resize成需要的大小,这里DNN网络的输入是224*244。
3.使用DNN读取图像,进行前向传播预测
blob = cv2.dnn.blobFromImage(resized, 1, (224, 224), (104, 117, 123))
print("First Blob: {}".format(blob.shape))
net.setInput(blob)
preds = net.forward()
blobFromImage(image, scalefactor, size, mean, swapRB),主要是用来对图片进行预处理,包含两个主要过程:1.整体像素值减去平均值,2.通过缩放系数对图片像素值进行缩放。
image:输入到神经网络的图片。
scalefactor:在图片减去均值后,是否对剩下的像素值进行一定尺度的缩放。它的默认值是1,即不进行缩放。若为1/2,则表示全部缩小一半。
size :是神经网络在训练的时候要求输入的图片尺寸。
mean:图像的平均值。
swapRB:OpenCV中认为我们的图片通道顺序是BGR,但是我平均值假设的顺序是RGB,所以如果需要交换R和G,那么就要使swapRB=true。blobFromImages表示读取一个batch的图片。其中image参数表示一个图像的集合。
setInput:将处理好的图片放到网络中。
forward:表示采用前向传播,即得到神经网络的输出。
4.得到预测结果
idx = np.argsort(preds[0])[::-1][0]
text = "Label: {}, {:.2f}%".format(classes[idx],
preds[0][idx] * 100)
cv2.putText(image, text, (5, 25), cv2.FONT_HERSHEY_SIMPLEX,
0.7, (0, 0, 255), 2)
对结果中每个种类的概率进行排序,取最大概率的种类作为结果。