中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用python opencv制作人臉識別窗口的方法

發布時間:2021-06-16 11:09:37 來源:億速云 閱讀:315 作者:chen 欄目:編程語言

這篇文章主要講解了“利用python opencv制作人臉識別的窗口的方法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“利用python opencv制作人臉識別的窗口的方法”吧!

人臉檢測,看似要使用深度學習,覺得很高大牛逼,其實通過opencv就可以制作人臉識別的窗口。


今天,Runsen教大家將構建一個簡單的Python腳本來處理圖像中的人臉,使在OpenCV庫中兩種方法 。

首先,我們將使用haar級聯分類器,這對初學者來說是一種簡單的方法(也不太準確),也是最方便的方法。

其次是單發多盒檢測器(或簡稱SSD),這是一種深度神經網絡檢測圖像中對象的方法。

使用Haar級聯進行人臉檢測

基于haar特征的級聯分類器的,OpenCV已經為我們提供了一些分類器參數,因此我們無需訓練任何模型,直接使用。

opencv的安裝

pip install opencv-python

我們首先導入OpenCV:

import cv2

下面對示例圖像進行測試,我找來了兩個漂亮美女的圖像:

利用python opencv制作人臉識別窗口的方法

利用python opencv制作人臉識別窗口的方法

image = cv2.imread("beauty.jpg")

函數imread()從指定的文件加載圖像,并將其作為numpy的 N維數組返回。

在檢測圖像中的面部之前,我們首先需要將圖像轉換為灰度圖:

image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

下面,因為要初始化人臉識別器(默認的人臉haar級聯),需要下載對應的參數xml文件,

這里選擇最初的haarcascade_frontalface_default.xml

利用python opencv制作人臉識別窗口的方法

下面代碼就是加載使用人臉識別器

face_cascade = cv2.CascadeClassifier("haarcascade_fontalface_default.xml")

現在讓我們檢測圖像中的所有面孔:

# 檢測圖像中的所有人臉 faces = face_cascade.detectMultiScale(image_gray) print(f"{len(faces)} faces detected in the image.")

detectMultiScale() 函數將圖像作為參數并將不同大小的對象檢測為矩形列表,因此我們繪制矩形,同樣有rectangle方法提供

#為每個人臉繪制一個藍色矩形 for x, y, width, height in faces:  # 這里的color是 藍 黃 紅,與rgb相反,thickness設置寬度  cv2.rectangle(image, (x, y), (x + width, y + height), color=(255, 0, 0), thickness=2)

最后,讓我們保存新圖像:

cv2.imwrite("beauty_detected.jpg", image)

基于haar特征的級聯分類器的結果圖

利用python opencv制作人臉識別窗口的方法

我們驚奇的發現圖片1是沒有設備出來的,這是因為存在障礙物,

利用python opencv制作人臉識別窗口的方法

我們驚奇的發現圖片2是竟然設別出來了兩個窗口。

Haar級聯結合攝像頭

使用Haar級聯進行人臉檢測可以說是opencv最基礎的效果,下面我們利用攝像頭將Haar級聯進行合并,這樣就可以達到開頭的效果。

import cv2  #創建新的cam對象 cap = cv2.VideoCapture(0) #初始化人臉識別器(默認的人臉haar級聯) face_cascade = cv2.CascadeClassifier("haarcascade_fontalface_default.xml")  while True:     # 從攝像頭讀取圖像     _, image = cap.read()     # 轉換為灰度     image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)     # 檢測圖像中的所有人臉     faces = face_cascade.detectMultiScale(image_gray, 1.3, 5)     # 為每個人臉繪制一個藍色矩形     for x, y, width, height in faces:         cv2.rectangle(image, (x, y), (x + width, y + height), color=(255, 0, 0), thickness=2)     cv2.imshow("image", image)     if cv2.waitKey(1) == ord("q"):         break  cap.release() cv2.destroyAllWindows()

使用SSD的人臉檢測

上面的效果是已經過時了,但是OpenCV為我們提供了包裝中dnn模塊cv2,從而可以直接加載經過預訓練的深度學習模型。

2015年底有人提出了一個實時對象檢測網絡Single Shot MultiBox Detector縮寫為SSD

利用python opencv制作人臉識別窗口的方法

SSD對象檢測的Model

SSD對象檢測網絡簡單說可以分為三個部分:

  • 基礎網絡(backbone) 這里為VGG16

  • 特征提取Neck,構建多尺度特征

  • 檢測頭 – 非最大抑制與輸出

要開始使用SSD在OpenCV中,需要下載RESNET人臉檢測模型和其預訓練的權重,然后將其保存到代碼weights工作目錄:

利用python opencv制作人臉識別窗口的方法

RESNET人臉檢測模型和權重

import cv2 import numpy as np  # 下載鏈接:https://raw.githubusercontent.com/opencv/opencv/master/samples/dnn/face_detector/deploy.prototxt prototxt_path = "weights/deploy.prototxt.txt" # 下載鏈接:https://raw.githubusercontent.com/opencv/opencv_3rdparty/dnn_samples_face_detector_20180205_fp16/res10_300x300_ssd_iter_140000_fp16.caffemodel  model_path = "weights/res10_300x300_ssd_iter_140000_fp16.caffemodel" # 加載Caffe model model = cv2.dnn.readNetFromCaffe(prototxt_path, model_path) # 讀取所需圖像 image = cv2.imread("beauty.jpg") # 獲取圖像的寬度和高度 h, w = image.shape[:2]

現在,需要這個圖像傳遞到神經網絡中,由于下載的模型是(300, 300) px的。

因此,我們需要將圖像調整為的(300, 300)px形狀:

# 預處理圖像:調整大小并執行平均減法。104.0, 177.0, 123.0 表示b通道的值-104,g-177,r-123   # 在深度學習中通過減去數人臉據集的圖像均值而不是當前圖像均值來對圖像進行歸一化,因此這里寫死了 blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300),(104.0, 177.0, 123.0))

將此blob對象用作神經網絡的輸入,獲取檢測到的面部:

# 將圖像輸入神經網絡 model.setInput(blob) # 得到結果 output = np.squeeze(model.forward())

輸出對象output 具有所有檢測到的對象,在這種情況下一般都是人臉,讓我們遍歷output,并在取一個置信度大于50%的判斷條件:

font_scale = 1.0 # output.shape ==(200, 7) for i in range(0, output.shape[0]):     # 置信度      confidence = output[i, 2]     # 如果置信度高于50%,則繪制周圍的方框     if confidence > 0.5:         # 之前將圖片變成300*300,接下來提取檢測到的對象的模型的置信度后,我們得到周圍的框 output[i, 3:7],然后將其width與height原始圖像的和相乘,以獲得正確的框坐標         box = output[i, 3:7] * np.array([w, h, w, h])         # 轉換為整數         start_x, start_y, end_x, end_y = box.astype(np.int)         # 繪制矩形         cv2.rectangle(image, (start_x, start_y), (end_x, end_y), color=(255, 0, 0), thickness=2)         # 添加文本         cv2.putText(image, f"{confidence*100:.2f}%", (start_x, start_y-5), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (255, 0, 0), 2)

最后我們展示并保存新圖像:

cv2.imshow("image", image) cv2.waitKey(0) cv2.imwrite("beauty_detected.jpg", image)

 利用python opencv制作人臉識別窗口的方法

利用python opencv制作人臉識別窗口的方法

下面是完整代碼

import cv2 import numpy as np # 下載鏈接:https://raw.githubusercontent.com/opencv/opencv/master/samples/dnn/face_detector/deploy.prototxt prototxt_path = "weights/deploy.prototxt.txt" # 下載鏈接:https://raw.githubusercontent.com/opencv/opencv_3rdparty/dnn_samples_face_detector_20180205_fp16/res10_300x300_ssd_iter_140000_fp16.caffemodel  model_path = "weights/res10_300x300_ssd_iter_140000_fp16.caffemodel" model = cv2.dnn.readNetFromCaffe(prototxt_path, model_path) image = cv2.imread("beauty.jpg") h, w = image.shape[:2] blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300),(104.0, 177.0, 123.0)) model.setInput(blob) output = np.squeeze(model.forward()) font_scale = 1.0 for i in range(0, output.shape[0]):     confidence = output[i, 2]     if confidence > 0.5:         box = output[i, 3:7] * np.array([w, h, w, h])         start_x, start_y, end_x, end_y = box.astype(np.int)         cv2.rectangle(image, (start_x, start_y), (end_x, end_y), color=(255, 0, 0), thickness=2)         cv2.putText(image, f"{confidence*100:.2f}%", (start_x, start_y-5), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (255, 0, 0), 2) cv2.imshow("image", image) cv2.waitKey(0) cv2.imwrite("beauty_detected.jpg", image)

SSD結合攝像頭的人臉檢測

SSD結合攝像頭的人臉檢測方法更好,更準確,但是每秒傳輸幀數FPS方面可能低,因為它不如Haar級聯方法快,但這問題并不大。

下面是SSD結合攝像頭的人臉檢測的全部代碼

import cv2 import numpy as np prototxt_path = "weights/deploy.prototxt.txt" model_path = "weights/res10_300x300_ssd_iter_140000_fp16.caffemodel" model = cv2.dnn.readNetFromCaffe(prototxt_path, model_path) cap = cv2.VideoCapture(0) while True:     _, image = cap.read()     h, w = image.shape[:2]     blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300), (104.0, 177.0, 123.0))     model.setInput(blob)     output = np.squeeze(model.forward())     font_scale = 1.0     for i in range(0, output.shape[0]):         confidence = output[i, 2]         if confidence > 0.5:             box = output[i, 3:7] * np.array([w, h, w, h])             start_x, start_y, end_x, end_y = box.astype(np.int)             cv2.rectangle(image, (start_x, start_y), (end_x, end_y), color=(255, 0, 0), thickness=2)             cv2.putText(image, f"{confidence*100:.2f}%", (start_x, start_y-5), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (255, 0, 0), 2)     cv2.imshow("image", image)     if cv2.waitKey(1) == ord("q"):         break cv2.destroyAllWindows() cap.release()

利用python opencv制作人臉識別窗口的方法

感謝各位的閱讀,以上就是“利用python opencv制作人臉識別的窗口的方法”的內容了,經過本文的學習后,相信大家對利用python opencv制作人臉識別的窗口的方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鹰潭市| 鲜城| 文山县| 株洲县| 古浪县| 依安县| 永泰县| 通榆县| 兴化市| 峨边| 莱阳市| 尚义县| 洪雅县| 惠安县| 平安县| 资兴市| 巩留县| 阜南县| 师宗县| 博客| 延寿县| 浠水县| 淳化县| 疏附县| 搜索| 专栏| 东丽区| 酒泉市| 泸水县| 民丰县| 郁南县| 洞口县| 临邑县| 咸宁市| 大石桥市| 新绛县| 榆中县| 洛扎县| 乐平市| 游戏| 嫩江县|