在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何使用Python+OpenCV為人臉生成口罩?

新機器視覺 ? 來源:新機器視覺 ? 作者:新機器視覺 ? 2021-01-07 13:55 ? 次閱讀

口罩已經被證明是防止COVID-19傳播的最好的防御措施之一,然而,這也導致了基于面部特征(包括鼻子、嘴和下巴線)的面部識別算法的失效。 在全球有傳染病之前,面部識別系統通過對檢測到的不同面部特征進行比較測量來驗證兩幅圖像中的人臉。當一個人的鼻子、嘴和臉頰上戴上口罩,大大減少了通常用來識別他/她的身份的信息。 將需要重新訓練或重新設計有效的識別系統,以識別受管制地區的口罩臉。為了做到這一點,需要一個大的口罩數據集來訓練深度學習模型,以檢測戴口罩的人和不戴口罩的人。 目前,可用于訓練和評估人臉識別系統的圖像數據集是有限的。據報道,美國國家標準與技術研究所(NIST)的研究通過將口罩(各種顏色、大小和位置)疊加在沒有帶口罩人臉的圖像上來解決這個問題。

這篇文章試圖用OpenCV和dlib庫來實現這個過程,在這里我們綜合生成5種類型的口罩來繪制人臉圖像。圖1顯示了生成的5種口罩類型。

安裝所需的軟件包

使用Python3.7創建一個新的虛擬環境并安裝依賴項。所需的庫如下:

#requirements_facemask.txt numpy == 1.18.5 pip == 20.2.2 imutils == 0.5.3 python 》=3.7 dlib == 19.21.0 cmake == 3.18.0 opencv-python == 4.4.0 由于此腳本需要dlib庫,因此在開始運行該腳本之前需要安裝dlib,你可以通過以下鏈接了解如何使用Python綁定安裝dlib:https://www.pyimagesearch.com/2017/03/27/how-to-install-dlib/ Dlib是一個高級的機器學習庫,它是為解決復雜的現實世界問題而創建的。這個庫是用C++編程語言創建的,它可以使用C/C++、Python和java等語言。

導入庫

我們從導入所需的庫開始:OpenCV、dlib、numpy、os和imutils。

# 必要的導入 import cv2 import dlib import numpy as np import os import imutils 下一步是設置口罩的顏色,并設置要從中導入圖像的目錄和路徑,OpenCV的顏色空間按BGR順序而不是RGB。# 設置目錄 os.chdir(‘PATH_TO_DIR’) path = ‘IMAGE_PATH’ # 初始化顏色 [color_type] = (Blue, Green, Red) color_blue = (239,207,137) color_cyan = (255,200,0) color_black = (0, 0, 0) 下面的鏈接讓你可以立即從視覺上探索顏色,它可以用于將顏色從十六進制轉換為RGB,反之亦然:https://www.rgbtohex.net/rgb/

圖像預處理

接下來,我們通過OpenCV加載我們的輸入圖像,然后通過調整大小使其具有500像素的寬度并將其轉換為灰度來預處理圖像。

# 加載圖像并調整大小,將其轉換為灰度 img= cv2.imread(‘image_path’) img = imutils.resize(img, width = 500) gray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

使用dlib、OpenCV和Python檢測和提取人臉關鍵點

為了覆蓋口罩,我們需要進行人臉檢測,有許多方法可用于執行此任務我們可以使用OpenCV內置的Haar Cascade XML文件,甚至TensorFlow或使用Keras。在這篇文章中,我們使用的是dlib的人臉檢測器。 dlib中的正面人臉檢測器是基于方向梯度直方圖(HOG)和線性SVM的。

我們使用dlib的正面人臉檢測來首先檢測人臉,然后使用面部標志點預測器dlib.shape_predictor檢測人臉關鍵點。

人臉關鍵點檢測被定義為檢測臉上的關鍵標志點并跟蹤它們(對由于頭部運動和面部表情而導致的剛性和非剛性面部變形具有魯棒性)[來源]

什么是人臉關鍵點?

人臉關鍵點是用于定位和表示面部的顯著區域,如眼睛、眉毛、鼻子、下顎線、嘴巴等,應用于人臉對齊、頭部姿態估計、換臉、眨眼檢測、困倦檢測等領域。 在人臉關鍵點下,利用形狀預測方法對人臉上重要的面部結構進行檢測是非常必要的。面部標志點檢測包括兩個步驟:

定位圖像中檢測到的人臉。

面部關鍵點的檢測

如前所述,我們可以通過多種方式執行人臉檢測,但每種方法都試圖定位和標記以下面部區域:

鼻子

下顎線

左眼和右眼

左右眉

在這篇文章中,我們使用了基于深度學習的人臉定位算法,該算法還用于圖像中人臉的檢測。我們將通過某種方法獲得面邊界框,其中我們分別使用圖像中人臉的(x,y)坐標。一旦人臉區域被檢測到并被限定,我們進入下一步檢測臉部區域中的關鍵點。 我們正在使用的dlib庫中包含的預訓練人臉關鍵點探測器,這是Kazemi和Sullivan(2014)用回歸樹集合論文實現的1毫秒人臉對齊算法,其中估計了映射到人臉結構的68個(x,y)坐標的位置。我們可以使用下圖顯示68個坐標或點的索引

53228ebe-503c-11eb-8b86-12bb97331649.jpg

從圖3可以通過不同的點集[起點,終點]來評估面部特征的位置:

左眼:點[42,47]

嘴:點[48,67]

左眉:點[22,26]

鼻子:點[27,34]

右眉:點[17,21]

右眼:點[36,41]

下顎線:點[0,16]

請注意,標志點從0開始 dlib人臉關鍵點檢測器就是在這個數據集上訓練的:https://ibug.doc.ic.ac.uk/resources/facial-point-annotations/

人臉檢測與人臉關鍵點檢測

下一步是對dlib的預訓練人臉檢測器進行初始化,該檢測器是基于Histogram of Oriented Gradients + Linear SVM method](https://pyimagesearch.com/2014/11/10/histogram-oriented-gradients-object-detection/) 。此檢測器會進行圖像中人臉邊界框的檢測。 檢測器的第一個參數是我們的灰度圖像。(此方法也適用于彩色圖像)。 第二個參數是在應用檢測器之前對圖像進行放大時要應用的圖像金字塔層的數量。在人臉檢測之前增加輸入圖像的分辨率的好處是可以讓我們在圖像中檢測到更多的人臉,但其缺點是,輸入圖像越大,計算開銷越大,檢測速度越慢。 我們還打印出邊界框的坐標以及檢測到的人臉數。我們也可以使用cv2在檢測到的面部周圍使用for循環繪制邊界框。

# 初始化dlib的人臉檢測器 detector = dlib.get_frontal_face_detector() “”“ 在灰度圖像中檢測人臉并創建一個對象-存儲邊界矩形的坐標列表 第二個參數中的“1”表示應該向上采樣圖像1次。 這會使圖像變得更大,并允許我們檢測更多的面孔 ”“” faces = detector(gray, 1) # 打印邊界矩形的坐標 print(faces) print(“Number of faces detected: ”, len(faces)) “”“ # 使用for循環來提取特定坐標(x1,x2,y1,y2) for face in faces: x1 = face.left() y1 = face.top() x2 = face.right() y2 = face.bottom() # 在檢測到的臉部周圍畫一個矩形 cv2.rectangle(img, (x1,y1), (x2,y2),(0,255,0),3) cv2.imshow(”image“, img) cv2.waitKey(0) cv2.destroyAllWindows() ”“” 為了檢測人臉關鍵點,我們需要從dlib庫下載人臉關鍵點預測器dlib.shape_predictor。 我們的預測方法需要一個名為“shape_predictor_68_face_landmarks.dat”的文件,可從以下鏈接

需要強調的是,這個模型文件是專為dlib的HOG人臉檢測器設計的,不應該用于dlib的基于CNN的人臉檢測器,原因是它期望人臉檢測器的邊界框按照dlib的HOG人臉檢測器的方式對齊。 當與另一個產生不同對齊框的人臉檢測器(如基于CNN的mmod_human_face_detector.dat )一起使用時,結果不會很好。# 文件路徑 p = “shape_predictor_68_face_landmarks.dat” # 初始化dlib的預測器 predictor = dlib.shape_predictor(p) # 使用預測器獲取外形 for face in faces: landmarks = predictor(gray, face) # for n in range(0,68): # x = landmarks.part(n).x # y = landmarks.part(n).y # img_landmark = cv2.circle(img, (x, y), 4, (0, 0, 255), -1) 下載檢測器后,我們可以初始化檢測器,以便在輸入圖像中檢測到的每個人臉上檢測到人臉關鍵點。 一旦檢測到人臉關鍵點,我們就可以開始“繪圖”了,通過使用OpenCV中的繪圖功能連接所需的點,將口罩覆蓋在臉上:https://docs.opencv.org/master/dc/da5/tutorial_py_drawing_functions.html

Dlib口罩方法

下面的步驟包括識別繪制不同類型口罩所需的點。我們復制的口罩類型由NIST研究報告附錄A中提到的不同點集定義:https://doi.org/10.6028/NIST.IR.8311。視覺效果見圖。

53445e7c-503c-11eb-8b86-12bb97331649.png

我們將通過連接附錄A中定義的標志點來定義口罩的形狀。例如,為了形成寬覆蓋和中覆蓋口罩,我們將用29點的標志點坐標連接(繪制)下顎線[0,16]的標志點。 可以使用OpenCV中橢圓和其他三種規則形狀函數繪制口罩輪廓。然后我們可以使用cv2.fillpoly函數將繪制的口罩填充顏色。

points = [] for i in range(1, 16): point = [landmarks.part(i).x, landmarks.part(i).y] points.append(point) # print(points) # 寬,高覆蓋口罩 mask_a = [((landmarks.part(42).x), (landmarks.part(15).y)), ((landmarks.part(27).x), (landmarks.part(27).y)), ((landmarks.part(39).x), (landmarks.part(1).y))] # 寬,中覆蓋口罩 mask_c = [((landmarks.part(29).x), (landmarks.part(29).y))] # 寬、低覆蓋口罩 mask_e = [((landmarks.part(35).x), (landmarks.part(35).y)), ((landmarks.part(34).x), (landmarks.part(34).y)), ((landmarks.part(33).x), (landmarks.part(33).y)), ((landmarks.part(32).x), (landmarks.part(32).y)), ((landmarks.part(31).x), (landmarks.part(31).y))] fmask_a = points + mask_a fmask_c = points + mask_c fmask_e = points + mask_e # mask_type = {1: fmask_a, 2: fmask_c, 3: fmask_e} # mask_type[choice2] # 使用Python OpenCV - cv2.polylines()方法為[mask_type]繪制口罩輪廓: # fmask_a = wide, high coverage mask, # fmask_c = wide, medium coverage mask, # fmask_e = wide, low coverage mask fmask_a = np.array(fmask_a, dtype=np.int32) fmask_c = np.array(fmask_c, dtype=np.int32) fmask_e = np.array(fmask_e, dtype=np.int32) mask_type = {1: fmask_a, 2: fmask_c, 3: fmask_e} mask_type[choice2] # 更改參數[mask_type]和color_type用于各種組合 img2 = cv2.polylines(img, [mask_type[choice2]], True, choice1, thickness=2, lineType=cv2.LINE_8) # 使用Python OpenCV - cv2.fillPoly()

方法填充口罩 # 更改參數[mask_type]和color_type用于各種組合 img3 = cv2.fillPoly(img2, [mask_type[choice2]], choice1, lineType=cv2.LINE_AA) # cv2.imshow(“image with mask outline”, img2) cv2.imshow(“image with mask”, img3) # 為測試保存輸出文件 outputNameofImage = “output/imagetest.jpg” print(“Saving output image to”, outputNameofImage) cv2.imwrite(outputNameofImage, img3) points = [] for i in range(1, 16): point = [landmarks.part(i).x, landmarks.part(i).y] points.append(point) # print(points) # 橢圓參數為高,圓形是覆蓋口罩 top_ellipse = landmarks.part(27).y + (landmarks.part(28).y - landmarks.part(27).y) / 2 centre_x = landmarks.part(28).x centre_y = landmarks.part(8).y - ((landmarks.part(8).y - (top_ellipse)) / 2) # 橢圓高度 axis_major = (landmarks.part(8).y - top_ellipse) / 2 # 橢圓寬度 axis_minor = ((landmarks.part(13).x - landmarks.part(3).x) * 0.8) / 2 centre_x = int(round(centre_x)) centre_y = int(round(centre_y)) axis_major = int(round(axis_major)) axis_minor = int(round(axis_minor)) centre = (centre_x, centre_y) axes = (axis_major, axis_minor) # 使用Python OpenCV - cv2.ellipse()

方法繪制口罩輪廓 # 更改最后一個參數- line thickness和color_type為各種組合 img_2 = cv2.ellipse(img, centre, axes, 0, 0, 360, color_type, thickness=2) # 使用Python OpenCV - cv2.ellipse()方法繪制口罩輪廓 # 更改最后一個參數-line thickness為負數用于填充,color_type用于各種組合 img_3 = cv2.ellipse(img, centre, axes, 0, 0, 360, color_type, thickness=-1) # cv2.imshow(“image with mask outline”, img_2) cv2.imshow(“image with mask”, img_3) 在圖像檢測開始之前,用戶可以選擇預先確定口罩的顏色和類型。我們預先選擇了兩種顏色的口罩-藍色和黑色# 使用input()函數根據用戶需求獲取口罩類型和口罩顏色 choice1 = input(“Please select the choice of mask color Enter 1 for blue Enter 2 for black: ”) choice1 = int(choice1) if choice1 == 1: choice1 = color_blue print(‘You selected mask color = blue’) elif choice1 == 2: choice1 = color_black print(‘You selected mask color = black’) else: print(“invalid selection, please select again.”) input(“Please select the choice of mask color Enter 1 for blue Enter 2 for black : ”) choice2 = input(“Please enter choice of mask type coverage Enter 1 for high Enter 2 for medium Enter 3 for low : ”) choice2 = int(choice2) if choice2 == 1: # choice2 = fmask_a print(f‘You chosen wide, high coverage mask’) elif choice2 == 2: # choice2 = fmask_c print(f‘You chosen wide, medium coverage mask’) elif choice2 == 3: # choice2 = fmask_e print(f‘You chosen wide, low coverage mask’) else: print(“invalid selection, please select again.”) input(“Please enter choice of mask type coverage Enter 1 for high Enter 2 for medium Enter 3 for low : ”) # print(choice2)

結果

圖5顯示了原始輸入圖像(Barack Obama的圖像)與使用腳本生成了口罩的輸出圖像之間的比較。我們也可以在人群鏡頭使用這個腳本。如圖6所示,在著名的Ellen‘s wefie拍攝中,在檢測到的人臉上疊加口罩的結果。 我們能夠成功地復制生成5種不同類型的口罩的過程(詳見附錄A),這些口罩可以使用dlib和OpenCV疊加在未帶口罩的人臉的圖像上。 圖7到圖9顯示了在不直接看相機的臉上的更多示例。

結論

該腳本能夠在檢測到的人臉上生成合成口罩臉,輸出圖像可用于測試或驗證其他面向應用的ML網絡,如室內考勤系統的人臉識別、口罩檢測等。

原文標題:使用Python+OpenCV+dlib為人臉生成口罩

文章出處:【微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • OpenCV
    +關注

    關注

    31

    文章

    635

    瀏覽量

    41445
  • python
    +關注

    關注

    56

    文章

    4804

    瀏覽量

    84910

原文標題:使用Python+OpenCV+dlib為人臉生成口罩

文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    使用Python+OpenCV處理圖片

    如果給你一張圖片作為背景,另外一張圖片中的物體作為前景圖,要把前景圖中的物體疊加布置到背景圖的中間位置,并且前景圖中的物體需要在背景圖中有旋轉和投影,怎么處理?
    的頭像 發表于 12-23 15:54 ?239次閱讀

    【AI實戰項目】基于OpenCV的“顏色識別項目”完整操作過程

    適用于哪些場景,然后通過Python編寫代碼來實現這些算法,并應用于實際項目中,實現圖像的檢測、識別、分類、定位、測量等目標。華清遠見【python+OpenCV
    的頭像 發表于 12-09 16:42 ?455次閱讀
    【AI實戰項目】基于<b class='flag-5'>OpenCV</b>的“顏色識別項目”完整操作過程

    RK3568 + OpenCV 會碰撞出什么火花?案例詳解:2-1 基于OpenCV的畫線實驗

    一系列 C 函數和少量 C++ 類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。 OpenCV具有以下特點: 不管是科學研究,還是商業
    發表于 12-03 14:09

    一個月速成python+OpenCV圖像處理

    OpenCV是一個廣受歡迎且極為流行的計算機視覺庫,它因其強大的功能、靈活性和開源特性而在開發者和研究者中備受青睞。學習OpenCV主要就是學習里面的計算機視覺算法。要學習這些算法的原理,知道它們
    的頭像 發表于 11-29 18:27 ?181次閱讀
    一個月速成<b class='flag-5'>python+OpenCV</b>圖像處理

    《DNK210使用指南 -CanMV版 V1.0》第四十二章 人臉口罩佩戴檢測實驗

    第四十二章 人臉口罩佩戴檢測實驗 在上一章節中,介紹了利用maix.KPU模塊實現YOLO2的物體檢測,本章將繼續介紹利用maix.KPU模塊實現的人臉口罩佩戴檢測。通過本章的學習,讀
    發表于 11-18 09:28

    如何用OpenCV的相機捕捉視頻進行人臉檢測--基于米爾NXP i.MX93開發板

    : breakvideo.release()cv2.destroyAllWindows() 保存后執行”python3 opencv_test.py OpenCV裝好后,可以為后面的人臉
    發表于 11-15 17:58

    基于OPENCV的相機捕捉視頻進行人臉檢測--米爾NXP i.MX93開發板

    本文將介紹基于米爾電子MYD-LMX93開發板(米爾基于NXPi.MX93開發板)的基于OpenCV人臉檢測方案測試。OpenCV提供了一個非常簡單的接口,用于相機捕捉一個視頻(我用的電腦內置
    的頭像 發表于 11-07 09:03 ?1138次閱讀
    基于<b class='flag-5'>OPENCV</b>的相機捕捉視頻進行<b class='flag-5'>人臉</b>檢測--米爾NXP i.MX93開發板

    opencv-pythonopencv一樣嗎

    不一樣。OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和機器學習軟件庫,它提供了大量的圖像和視頻處理功能。OpenCV-Python
    的頭像 發表于 07-16 10:38 ?1322次閱讀

    基于Python的深度學習人臉識別方法

    基于Python的深度學習人臉識別方法是一個涉及多個技術領域的復雜話題,包括計算機視覺、深度學習、以及圖像處理等。在這里,我將概述一個基本的流程,包括數據準備、模型選擇、訓練過程、以及測試與評估,并附上簡單的代碼示例。
    的頭像 發表于 07-14 11:52 ?1305次閱讀

    基于OpenCV人臉識別系統設計

    基于OpenCV人臉識別系統是一個復雜但功能強大的系統,廣泛應用于安全監控、人機交互、智能家居等多個領域。下面將詳細介紹基于OpenCV人臉識別系統的基本原理、實現步驟,并附上具體
    的頭像 發表于 07-11 15:37 ?1.3w次閱讀

    人臉檢測模型的精確度怎么算

    檢測是計算機視覺領域的一個重要研究方向,其目的是在圖像或視頻中快速準確地定位人臉的位置。人臉檢測模型通常包括兩個主要步驟:人臉候選區域的生成人臉
    的頭像 發表于 07-04 09:14 ?591次閱讀

    口罩佩戴檢測算法

    口罩佩戴檢測算法基于YOLOv5在圖像識別檢測領域的優異性能,本文研究基于基于YOLOv5的口罩佩自動戴檢測方法。首先從網絡和真實生活中中尋找并采集不同場景人群口罩佩戴的圖片約500張并自建數據集
    的頭像 發表于 07-01 20:20 ?345次閱讀
    <b class='flag-5'>口罩</b>佩戴檢測算法

    STM32MP135如何使用opencv-python或v4l2-ctl打開攝像頭,并保存為圖片?

    行。 但是官方的例程中,直接用v4l推送到media上,直接顯示的又是可以的。 請問我該如何使用opencv-python 或v4l2-ctl打開攝像頭,并保存為圖片?
    發表于 05-30 06:16

    如何使用Python生成四位隨機數字

    為了實現這些目標,Python 為我們提供了random() 模塊。random() 是一個內置的 Python 模塊,用于生成隨機數。
    的頭像 發表于 04-15 12:47 ?721次閱讀

    itop-RK3588開發板機器視覺開發OpenCV-Python的安裝

    itop-RK3588開發板機器視覺開發OpenCV-Python的安裝
    的頭像 發表于 01-26 15:18 ?4255次閱讀
    itop-RK3588開發板機器視覺開發<b class='flag-5'>OpenCV-Python</b>的安裝
    主站蜘蛛池模板: 国产精品主播在线| 国产三及| 香蕉黄色网| 国产美女精品一区二区三区| 热久久久| 亚洲一卡二卡三卡| 五月婷婷在线视频| 日韩成人免费一级毛片| 日本高清色视频www| 九九美剧| 97国产影院| 奇米影视五月天| 4455vw亚洲毛片| 色播四房间| 性视频一区| 欧美xxxxxbbbb| 国产伦子一区二区三区四区| 亚洲热热久久九九精品| 久久精品免费看| 中文字幕一区在线观看视频| 国产精品久久久久久久久kt| 高清国产在线| 色日韩在线| 成人亚洲网站www在线观看| 看免费视频| 中国一级黄色毛片| 日韩色影视| 国产精品毛片一区二区三区| 在线免费看黄的网站| 九色视频网| 亚洲一区二区三区四区五区六区| 淫婷婷| 日本免费黄色| 国产三级毛片视频| 天天草天天爽| 欧美黄网站| 性夜影院爽黄e爽在线观看| 亚洲精品二区中文字幕| 亚洲高清毛片| 可以免费观看的黄色网址| 一级免费视频|