使用 OpenCV DNN 模組與 Res10 SSD 進行人臉偵測
使用 OpenCV DNN 模組與 Res10 SSD 進行人臉偵測教學
OpenCV 提供了強大的 DNN 模組,讓我們能輕鬆載入深度學習預訓練模型並進行物件偵測。本教學將示範如何使用 Res10 SSD 模型對圖片中的人臉進行偵測,並詳細解說核心程式碼與座標換算邏輯。
一、教學目標與環境準備
- 使用 OpenCV DNN 模組載入 Res10 SSD 人臉偵測模型
- 從圖片中偵測人臉位置
- 在圖片中繪製偵測到的人臉方框
- 深入解析模型輸出座標如何轉換成像素座標
需準備:
- OpenCV(建議版本4.x以上)
- Res10 SSD 模型權重檔
res10_300x300_ssd_iter_140000_fp16.caffemodel - 模型配置檔
deploy.prototxt - 測試圖片(如
faces2.jpg)
二、完整程式碼範例
import cv2
model_path = r"ch03/models/Res10_ssd/res10_300x300_ssd_iter_140000_fp16.caffemodel"
config_path = r"ch03/models/Res10_ssd/deploy.prototxt"
model = cv2.dnn.readNet(model=model_path, config=config_path, framework='Caffe')
image = cv2.imread(r"ch03/images/faces2.jpg")
image_height, image_width, _ = image.shape
blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300), (104.0, 177))
model.setInput(blob)
detections = model.forward()
for face in detections[0][0]:
face_confidence = face[2]
print(face_confidence)
if face_confidence > 0.5:
x1 = int(face[3] * image_width)
y1 = int(face[4] * image_height)
x2 = int(face[5] * image_width)
y2 = int(face[6] * image_height)
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
三、程式碼詳解
1. 載入模型
使用 cv2.dnn.readNet 讀取 Caffe 格式模型與網路結構,準備進行推論。
2. 圖片讀取與尺寸取得
透過 cv2.imread 載入圖片,並用 image.shape 取得圖片的高度與寬度,方便後續座標換算。
3. 建立輸入 Blob
函式 cv2.dnn.blobFromImage 將圖片縮放至模型需求大小(300×300),並做均值移除等前處理,產生符合模型輸入的 4D 張量。
4. 模型推論
設置模型輸入後使用 forward() 執行推論,取得偵測結果 detections。
5. 模型輸出格式與座標換算
模型輸出是一個多維陣列,每個偵測結果中包含:
face[0]:影像索引(通常為0)face[1]:類別 IDface[2]:置信度(confidence)face[3]:偵測框左上角 x 座標(比例值,介於0~1)face[4]:偵測框左上角 y 座標(比例值,介於0~1)face[5]:偵測框右下角 x 座標(比例值,介於0~1)face[6]:偵測框右下角 y 座標(比例值,介於0~1)
將模型輸出的相對比例座標轉換成實際圖片像素座標,是使用這段關鍵程式碼完成的:
x1 = int(face[3] * image_width)
y1 = int(face[4] * image_height)
x2 = int(face[5] * image_width)
y2 = int(face[6] * image_height)
說明如下:
- 模型回傳的邊界框座標是相對於輸入圖片的比例值,取值介於 0 到 1 之間。
- 乘以圖片的寬度或高度後,即可取得該偵測框在原始圖片中的絕對像素位置。
- 使用
int()取整數是因為繪圖函式需要整數座標。
此轉換確保方框能準確顯示在圖片上的偵測位置。
6. 繪製偵測框
利用 OpenCV 的 cv2.rectangle 在圖片上以綠色框標示出偵測到的人臉位置。
四、總結
本教學示範了如何使用 OpenCV DNN 模組搭配 Res10 SSD 模型,快速完成圖片中人臉的偵測。特別強調了模型輸出座標的「比例轉換為像素座標」的流程,這是理解物件偵測結果並正確繪製框選的關鍵。

留言
張貼留言