日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

【机器学习】 - 使用dlib进行人脸定位,人脸检测,给人脸图片戴口罩

發布時間:2023/12/10 pytorch 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【机器学习】 - 使用dlib进行人脸定位,人脸检测,给人脸图片戴口罩 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

detector = dlib.get_frontal_face_detector()


功能:人臉檢測畫框
參數:無
返回值:默認的人臉檢測器

faces = detector(img_gray, 0)


功能:對圖像畫人臉框
參數:img_gray:輸入的圖片
返回值:人臉檢測矩形框4點坐標。坐標為[(x1, y1) (x2, y2)]。可以通過函數的left,right,top,bottom方法分別獲取對應的x1, x2, y1, y2值。(cv里的矩陣和C++的那種一樣,左上角是(0,0)點,水平為x方向,豎直為y方向,類似笛卡爾系(區別是y軸正方向不同),所以top的y坐標 < bottom的y坐標。matplotlib是相反的。)

后面那個參數代表將原始圖像是否進行放大,1表示放大1倍再檢查,提高小人臉的檢測效果。

? ? ? ? ? ? ? ? ? ? ? ?

左圖是參數為0的檢測情況,右圖是參數為1的檢測情況。

上述例子參考自鏈接:http://blog.sina.com.cn/s/blog_49b3ba190102yvl9.html

?

?

注意dlib只能對灰度圖進行檢測:

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

注意更改當前文件運行目錄 為 程序執行文件路徑 的方法:

https://www.jb51.net/article/138980.htm

?

下面進行代碼實戰:

原圖地址

代碼實戰1:人臉檢測

import numpy import dlib import cv2 import sys import os# 修改執行目錄為該.py文件所在目錄 #dirname, filename = os.path.split(os.path.abspath(sys.argv[0])) dirname, filename = os.path.split(sys.argv[0]) # print(dirname,filename) # path = os.getcwd() os.chdir(dirname) print(os.getcwd())# 人臉檢測 detector = dlib.get_frontal_face_detector()# 人臉關鍵點標注。 predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat' ) img = cv2.imread('sdtw2.jpg')gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #這樣也可以灰度圖但是不建議用:im2 = cv2.imread('tfboys.jpg',flags = 0)faces = detector(gray,0)# 第二個參數越大,代表講原圖放大多少倍在進行檢測,提高小人臉的檢測效果。for face in faces:#左上角(x1,y1),右下角(x2,y2)x1, y1, x2, y2 = face.left(), face.top(), face.right(), face.bottom()print(x1,y1,x2,y2)cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.imshow("image", img) cv2.waitKey(0)

運行結果:

?

代碼實戰2:人臉關鍵點標注


?

import numpy import dlib import cv2 import sys import os#dirname, filename = os.path.split(os.path.abspath(sys.argv[0])) dirname, filename = os.path.split(sys.argv[0]) # print(dirname,filename) # path = os.getcwd() os.chdir(dirname) print(os.getcwd())# 人臉檢測 detector = dlib.get_frontal_face_detector()# 人臉關鍵點標注。 predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat' ) img = cv2.imread('sdtw2.jpg')gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #這樣也可以灰度圖但是不建議用:im2 = cv2.imread('tfboys.jpg',flags = 0)dets = detector(gray,0)# 第二個參數越大,代表講原圖放大多少倍在進行檢測,提高小人臉的檢測效果。for d in dets:# 使用predictor進行人臉關鍵點檢測 shape為返回的結果shape = predictor(gray, d)for index, pt in enumerate(shape.parts()):print('Part {}: {}'.format(index, pt))pt_pos = (pt.x, pt.y)cv2.circle(img, pt_pos, 1, (255, 0, 0), 2) #利用cv2.putText標注序號font = cv2.FONT_HERSHEY_SIMPLEXcv2.putText(img, str(index+1),pt_pos,font, 0.3, (0, 0, 255), 1, cv2.LINE_AA) cv2.imshow("image", img) cv2.waitKey(0) cv2.destroyAllWindows()

?

實驗結果:

人臉關鍵點:

附標號:

?

代碼實戰3:佩戴口罩

我們取2,8,14,28作為口罩關鍵點,即下圖3,9,15,29,放入points_key中

對于待測圖片的每一個人臉框,按照對應points_key來檢測邊界,將口罩圖片進行縮放,填入對應區域。

注意對下載后的口罩要進行背景去除,這里可以用一些在線處理網站,或者ps等等。(本項目使用已去除背景的口罩已上傳到github)

?

注意實現的時候,有個問題就是透明度的問題,不然會出現下面這個問題:

為了方便講解,我們將口罩區域分成口罩圖像區域,和口罩真實區域。

在代碼實現的時候,剛開始只是想著分攤像素值,比如對口罩圖像區域,讓他80%保留原圖像素值,20%來自口罩圖像,這樣進行merge。但是效果并不是期待的那樣。

發現其實口罩部分還是要口罩占主體,所以換成了20%保留原圖像素值,80%來自口罩圖像,如下圖。

剩下的就是透明度的問題了,這里我采用的是二值化方法,把像素值較小的背景部分隱去,像素值較大的是口罩真實區域,采用口罩圖80%和人臉圖20%進行merge。

閾值設置為80,表現良好。

此項目代碼對應代碼和實驗所用到的圖像均放到了github:https://github.com/xuanweiace/put_a_mask_on_the_face/

歡迎下載和star。

?

項目中是用二值化的方法來實驗背景透明的功能,cv2中也自帶了一個功能可以實現透明化處理,感興趣的同學可以搜一下:

透明度覆蓋:

img_mix = cv2.addWeighted(img1, 1, img2,1, 0) #合并,其中參數1表示透明度,第一個1表示img1不透明,第二個1表示img1不透明,如果改成0.5表示合并的時候已多少透明度覆蓋。

?

相關拓展鏈接:

識別戴口罩的人臉的四種方法:https://blog.csdn.net/qq_23670601/article/details/104344917

總結

以上是生活随笔為你收集整理的【机器学习】 - 使用dlib进行人脸定位,人脸检测,给人脸图片戴口罩的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。