深度学习:Opencv的BlobfromImage如何工作
深度學習:Opencv的BlobfromImage如何工作
- 1. 原理
- 1.2 均值減法是什么
- 1.3 cv2.dnn.BlogFromImage
- 2. 源碼
- 參考
想要從深度神經網絡獲取正確的預測,首先需要預處理數據。 在深度學習、圖像分類中,通常會用到:
- 均值減法
- 按一定比例因子縮放
OpenCV的新神經網絡(DNN deep nerual network)模塊包含兩個功能,可用于預處理圖像并通過預先接受訓練的深度學習模型對它們進行分類。
這篇博客將使用并介紹OpenCV的 cv2.dnn.BlobFromImage 和 cv2.dnn.BlobFromImages 是如何工作的。
1. 原理
OpenCV提供了倆個方法,可以對圖像預處理進行深度學習分類:
- cv2.dnn.BlobFromImage
- cv2.dnn.BlobFromImages
這兩個功能包括
- 均值減法(rgb顏色通道均值,分別用各通道減去均值)
- 縮放(然后應用一個比例因子進行歸一化處理);
- 可選的通道交換
均值: , ,
均值減法: , ,
比例因子: 以促進歸一化, , ,
1.2 均值減法是什么
均值減法用于幫助對數據集中輸入圖像的照明變換進行均衡。因此可以將均值減法視為用于幫助卷積神經網絡的技術。
預處理的方法不只均值減法、縮放,還有歸一化等;
1.3 cv2.dnn.BlogFromImage
該方法返回一個blob,寬度高度深度的圖像
blob = cv2.dnn.blobFromImage(image, scalefactor=1.0, size, mean, swapRB=True)
image: 想要預處理的輸入圖像
saclefactor: 比例因子,執行均值減法后,可通過某種因子來擴展圖像。默認為“1.0”(即,不縮放),但也可以提供另一個值。標記Scalefactor也很重要應該是1
/ sigma,因為實際乘以Scalefactor的輸入通道(平均減法)。size:卷積神經網絡期望的空間尺寸。對于大多數最新的最先進的神經網絡,這是224×224,227×227或299×299。
mean: 均值減法值。可以是RGB的3元組,也可以是單個值。在這種情況下,從圖像的每個通道值中減去提供的值。當SwapRB = TRUE時,確保該值為“(R,G,B)” 3元組
swaprb:OpenCV假定圖像處于BGR通道順序;但是,“均值”假定正在使用RGB通道數據,要解決此差異,需要在圖像中交換R和B通道。通過將此值設置為
true。默認情況下,OpenCV會執行RB通道交換;
blob = cv2.dnn.blobFromImages(images, scalefactor=1.0, size, mean, swapRB=True) 差別只是入參可以是多個圖片,多張圖片的處理調用該方法可降低處理開銷。
2. 源碼
# 導入必要的包
from imutils import paths
import numpy as np
import cv2# 從磁盤加載標簽類
rows = open("synset_words.txt").read().strip().split("\n")
classes = [r[r.find(" ") + 1:].split(",")[0] for r in rows]# 從磁盤加載序列化的模型
net = cv2.dnn.readNetFromCaffe("bvlc_googlenet.prototxt","bvlc_googlenet.caffemodel")# 獲取輸入圖片的路徑
imagePaths = sorted(list(paths.list_images("images/")))# 從磁盤加載第一張照片
# 預處理圖片:縮放到224*224,通過預先訓練的網絡構造一個可以通過的斑點
image = cv2.imread(imagePaths[0])
resized = cv2.resize(image, (224, 224))
blob = cv2.dnn.blobFromImage(resized, 1, (224, 224), (104, 117, 123))
print("First Blob: {}".format(blob.shape))# 設置blob為深度學習網絡預訓練的input
# 獲取1000種類中,預測的可能輸出結果及可能性
net.setInput(blob)
preds = net.forward()# 倒序排序可能性,獲取預測可能最高的類標簽,繪制在輸入圖像上
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)# 展示輸出圖像
cv2.imshow("Image", image)
cv2.waitKey(0)# 初始化照片列表,之后會傳給網絡
images = []# 遍歷輸入圖像(過濾掉第一張,因為已經分類過),預處理每張圖像,并更新圖像列表
for p in imagePaths[1:]:image = cv2.imread(p)image = cv2.resize(image, (224, 224))images.append(image)# 轉換圖像list為opencv可編譯的blob
blob = cv2.dnn.blobFromImages(images, 1, (224, 224), (104, 117, 123))
print("Second Blob: {}".format(blob.shape))# 設置blob為深度學習網絡預訓練的input
# 獲取1000種類中,預測的可能輸出結果及可能性
net.setInput(blob)
preds = net.forward()# 遍歷輸入圖像
for (i, p) in enumerate(imagePaths[1:]):# 從磁盤加載圖像image = cv2.imread(p)# 尋找可能性最高的預測分類,并繪制標簽到圖像上idx = np.argsort(preds[i])[::-1][0]text = "Label: {}, {:.2f}%".format(classes[idx],preds[i][idx] * 100)cv2.putText(image, text, (5, 25), cv2.FONT_HERSHEY_SIMPLEX,0.7, (0, 0, 255), 2)# 展示輸出圖像cv2.imshow("Image", image)cv2.waitKey(0)
參考
- https://www.pyimagesearch.com/2017/11/06/deep-learning-opencvs-blobfromimage-works/
總結
以上是生活随笔為你收集整理的深度学习:Opencv的BlobfromImage如何工作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Python,OpenCV实现简单的
- 下一篇: Python写的代码打包成.exe可执行