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

歡迎訪問 生活随笔!

生活随笔

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

pytorch

基于Docker的交互式人脸识别应用

發布時間:2024/3/13 pytorch 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于Docker的交互式人脸识别应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文將介紹如何開發一個交互式應用程序,利用Adam Geitgey的人臉識別框架,從攝像頭或網絡攝像頭設備識別人臉。

為了創建一個交互式應用程序,我們將使用Tkinter,Docker將用于確保一個包含所有必要依賴項的隔離環境。本文可以作為你自己項目的起點,因為使用哪些框架和庫并不重要。

了解如何通過Docker創建一個利用攝像頭設備、GPU加速和深度學習框架的交互式應用程序有很多可能性。

如果只希望通過Docker運行GUI,我創建了本文,你可以按照以下內容進行操作:

https://towardsdatascience.com/empowering-docker-using-tkinter-gui-bf076d9e4974


如果你想立即運行應用程序,可以下載我的Github存儲庫,并按照本文末尾的“運行應用程序”部分進行操作。

閱讀教程

在本文中,將介紹應用程序中的腳本,之后將介紹運行應用程序的教程。文章將按照以下順序進行。

目錄

  • 環境

  • 應用程序概述

  • Docker

  • 編程

  • 攝像設備

  • 計算機視覺

  • Shell腳本

  • 運行應用程序

  • 結論


  • 環境

    此應用程序僅使用Linux進行了測試,但是,它的工作原理應該與其他操作系統類似,其中一些參數可能不同,例如在運行Docker時。

    對于先決條件,你應該安裝攝像頭或網絡攝像頭、Docker、CUDA和CuDNN。我已使用以下方法測試了應用程序:

    • Docker 20.10.8

    • CUDA 11.4

    • CuDNN 8.2.2

    • OS:Manjaro 21.1.2 Phavo

    • GPU:NVIDIA GeForce GTX 1080 Ti

    • 攝像頭設備:羅技網絡攝像頭C930e

    目錄結構

    本項目的目錄結構如下所示。你可以事先創建這些文件,或者直接從我的Github存儲庫下載所有文件。

    此外,你需要在dataset目錄中創建自己的目錄,并插入所需的圖像。在我的例子中,如下所示,我在Kasper目錄中添加了四個圖像。你在不同場景中為同一個人添加的圖像越多,你的預測就越可靠。關于腳本,本文將介紹它們的內容。

    注意:encodings.pkl將在以后自動生成。

    應用程序的目錄結構:


    應用程序概述

    該應用程序包含一個GUI,其中有一個用于顯示相機設備輸出的面板。此外,還有一個用于激活/禁用人臉識別的按鈕。

    當前打開人臉識別的應用程序。


    Docker

    為了創建一個安裝人臉識別、OpenCV、Dlib、Python等的隔離環境,使用了以下Docker代碼。

    Dockerfile創建隔離環境:

    FROM?nvidia/cuda:11.4.1-cudnn8-devel-ubuntu20.04ARG?DEBIAN_FRONTEND=noninteractive#?Install?dependencies RUN?apt-get?update?-y RUN?apt-get?install?-y?\git?\cmake?\libsm6?\libxext6?\libxrender-dev?\python3?\python3-pip?\gcc?\python3-tk?\ffmpeg?\libopenblas-dev?\?liblapack-dev#?Install?dlib RUN?git?clone?https://github.com/davisking/dlib.git?&&?\cd?dlib?&&?\mkdir?build?&&?\cd?build?&&?\cmake?..?-DDLIB_USE_CUDA=1?-DUSE_AVX_INSTRUCTIONS=1?&&?\cmake?--build?.?&&?\cd?..?&&?\python3?setup.py?install?#?Install?Face?Recognition?and?OpenCV RUN?pip3?install?face_recognition?opencv-pythonWORKDIR?/face_recognition/app

    Tkinter

    為了創建一個可由用戶控制的交互式GUI以啟用和禁用人臉識別,使用Tkinter庫。下面的代碼創建了先前顯示的GUI。

    主腳本,用于創建GUI并允許人臉識別。

    import?tkinter?as?tk from?src.facevision?import?FaceVision from?src.videostream?import?VideoStreamif?__name__?==?'__main__':#?Tkinter窗口root_window?=?tk.Tk()#?Window設置root_window.title('Face?Recognition')root_window.geometry('500x540')??#?widthxheight+x+yroot_window.configure(background='#353535')#?攝像頭可視化面板panel?=?tk.Label(root_window)panel.pack(side='top',?fill='none')#?FaceVision初始化face_vision?=?FaceVision()#?Webcam初始化vs?=?VideoStream(panel=panel,?face_vision=face_vision)vs.stream()#?人臉識別按鈕button_face_recognition?=?tk.Button(root_window,?text='Activate?Face?Recognition',?command=lambda:?face_vision.change_facerec_state(button_face_recognition))button_face_recognition.pack()#?主循環root_window.mainloop()

    攝像設備

    為了從相機設備獲取圖像并更新Tkinter GUI,可以使用以下腳本。

    在第7行中,它使用函數VideoCapture by OpenCV,其中的參數應與你的設備相對應。默認相機id通常為0,但是,如果不起作用,可以嘗試使用1或-1。

    如果你希望使用視頻,你應該能夠用視頻路徑替換設備id,但可能需要進行一些其他調整。在第26行,它在一毫秒后再次調用函數本身。

    import?cv2 from?PIL?import?Image,?ImageTkclass?VideoStream():def?__init__(self,?panel,?face_vision):self.cap?=?cv2.VideoCapture(0)?#?參數應該對應于你的設備self.panel?=?panelself.face_vision?=?face_visiondef?stream(self):#?從相機獲取圖像_,?frame?=?self.cap.read()img?=?cv2.cvtColor(frame,?cv2.COLOR_BGR2RGB)#?人臉識別img?=?self.face_vision.process_image(img=img)#?Tkinterimg?=?Image.fromarray(img)tk_img?=?ImageTk.PhotoImage(img)self.panel.imgtk?=?tk_imgself.panel.configure(image=tk_img)#?再次運行self.panel.after(ms=1,?func=self.stream)

    計算機視覺

    與大多數計算機視覺應用程序相反,在大多數計算機視覺應用程序中,你通過展示數百個類的示例來訓練模型以對所需類進行分類,而在人臉識別中,你可以使用深度度量學習。

    通過深度度量學習,你可以訓練模型來描述所需對象,而不是預測它是哪個類。在我們的例子中,我們使用它來提供一個特征向量,一種128維編碼,它使用實數來描述每個人臉。教授一個模型來描述人臉而不是預測一個特定的人是一個優勢,因為如果想要識別一個新的人,就不需要對模型進行再訓練。

    相反,我們應該簡單地保存模型可以訪問的新人的編碼。我們將在本文后面獲得這些編碼。使用框架人臉識別,我們不必從頭開始訓練模型,而是使用通過人臉識別提供的已經訓練過的模型。如果想要進一步探索人臉識別領域,《人臉識別框架》詳細闡述了這一主題:

    https://medium.com/@ageitgey/machine-learning-is-fun-part-4-modern-face-recognition-with-deep-learning-c3cffc121d78

    數據集與編碼器

    為了使模型能夠識別人臉,需要一個包含人臉編碼的pickle文件。要實現這一點,正如前面在“目錄結構”一節中提到的,你必須在目錄數據集中創建一個包含所需人員姓名的目錄。之后,編碼器應包含以下代碼。

    在這段代碼中,我們遞歸地獲取dataset目錄中每個人的所有圖像。通過使用人臉識別框架,我們定位人臉并為每幅圖像提取編碼。

    構造包含數據集編碼的pickle文件:

    import?face_recognition import?cv2 from?pathlib?import?Path import?pickleif?__name__?==?'__main__':print('Starting?Encoding..')data?=?{'names':?[],?'encodings':?[]}#?數據集路徑path?=?Path.cwd()?/?'./data/dataset/'#?瀏覽每一張圖片for?file_name?in?path.rglob('*.jpg'):#?從數據集讀取圖像img?=?cv2.imread(str(file_name))img?=?cv2.cvtColor(img,?cv2.COLOR_BGR2RGB)#?定位人臉face_location?=?face_recognition.face_locations(img,?number_of_times_to_upsample=1,?model='cnn')#?編碼的人臉encoding?=?face_recognition.face_encodings(face_image=img,?known_face_locations=face_location,?model='small')#?保存信息data['names'].append(file_name.parent.name)data['encodings'].append(encoding)#?在pickle文件中保存編碼with?open('./data/encodings.pkl',?'wb')?as?f:pickle.dump(data,?f)print('Completed?Encoding!')

    人臉識別

    為了識別人臉,將使用以下代碼。為了總結代碼,它使用來自我們的相機設備的圖像,檢測人臉,為每個人臉提取128維編碼,然后將新編碼與我們的編碼數據集進行比較。

    為了進行比較,它會檢查新編碼的特征與我們編碼的數據集之間的距離,如果特征的距離小于閾值參數,則該特征將獲得投票。為了找到最佳匹配,我們只需選擇得票最多的人。如果簡單的解決方案不夠,你可以實現更強大的分類器。

    更具體地說,視頻流為每一幀調用函數process_image,該函數完成了實現人臉識別所需的所有工作。在第43–45行中,可以調整比較的閾值參數。閾值越低,比較就越嚴格。此外,在第48-51行中,最高投票數也可以調整,以增加或減少嚴格程度。

    計算機視覺部分,基于人臉識別框架:

    import?face_recognition import?pickle import?cv2 import?numpy?as?npclass?FaceVision():def?__init__(self):#?加載編碼data?=?pickle.loads(open('./data/encodings.pkl',?'rb').read())self.encoded_data?=?data['encodings']self.name_data?=?data['names']self.use_face_recognition?=?Falsedef?process_image(self,?img):#?檢測和定位人臉face_locations?=?self.__locate_faces(img)#?如果沒有找到人臉,返回原始圖像if?not?face_locations:return?img#?編碼輸入圖像encodings?=?face_recognition.face_encodings(face_image=img,?known_face_locations=face_locations,?model='small')#?通過比較新的編碼和之前編碼的pickle文件來識別人臉self.__identify_faces(image=img,?face_locations=face_locations,?encodings=encodings)return?imgdef?__locate_faces(self,?image):if?self.use_face_recognition?is?True:#?檢測人臉并接收他們的位置face_locations?=?face_recognition.face_locations(img=image,?number_of_times_to_upsample=1,?model='cnn')return?face_locationsdef?__identify_faces(self,?image,?face_locations,?encodings):#?比較保存的編碼和新的編碼for?face_bbox,?encoding?in?zip(face_locations,?encodings):#?找到匹配matches?=?face_recognition.compare_faces(known_face_encodings=self.encoded_data,?face_encoding_to_check=encoding,?tolerance=0.01)#?計算投票并找到最佳匹配votes?=?[np.count_nonzero(m==True)?for?m?in?matches]highest_vote?=?max(votes)highest_vote_idx?=?votes.index(highest_vote)person_match?=?self.name_data[highest_vote_idx]#?投票閾值,如果沒有超過,投票的名字將是Unknownif?highest_vote?<?20:person_match?=?'Unknown'#?添加可視化圖像t,?r,?b,?l?=?face_bboxcv2.rectangle(image,?(l,?t),?(r,?b),?(0,?255,?0),?2)????????cv2.putText(image,?person_match,?(l,?t-10),?cv2.FONT_HERSHEY_SIMPLEX,?0.8,?(0,?255,?0),?1)def?change_facerec_state(self,?button):#?取反self.use_face_recognition?=?not?self.use_face_recognition#?改變按鈕的文本if?self.use_face_recognition?is?True:button.configure(text='Disable?Face?Recognition')else:button.configure(text='Activate?Face?Recognition')

    Shell腳本(警告)

    為了簡化操作,請創建一個shell腳本,該腳本使用以下參數運行xhost和Docker。

    對于xhost,啟用對所有人的訪問,然后在卸載Docker容器后禁用它。在這個Docker命令中,我們共享GPU,顯示GUI。

    警告:如果在本地運行,則使用xhost和這些Docker參數不應成為問題。但是,如果在生產中使用,則應增強安全性,這在此處是推薦的。

    自動啟用/禁用xhost并運行Docker容器:

    #!/bin/bash xhost?+ docker?run?--gpus?all?--device?/dev/nvidia0?--device?/dev/nvidia-uvm?--device?/dev/nvidia-uvm-tools?\--device?/dev/nvidiactl?\-it?\--rm?\-e?DISPLAY=$DISPLAY?\-v?/tmp/.X11-unix:/tmp/.X11-unix:rw?\-v?$(pwd):/face_recognition?\--device=/dev/video0:/dev/video0?\face_recognition xhost?-

    運行應用程序

  • 構建Docker鏡像:docker build -t facerecognition_gui

  • 使shell腳本可執行:chmod +x ./run.sh

  • 運行shell腳本:./run.sh

  • 在Docker容器中,創建編碼的數據集(確保圖像位于數據集目錄中的目錄中):python3 encoder.py

  • 運行應用程序:python3 gui.py

  • 現在可以啟用人臉識別。

  • 注意:要分離/退出Docker容器,請按ctrl-D

    結論

    在本文中,你已經了解了如何將GUI、攝像頭設備、GPU與Docker一起使用。了解如何結合這些,提供了許多可用于學術和商業目的的可能性。

    此外,使用相同的策略,通過Docker共享etc設備,你應該能夠利用其他庫和框架,而不必經歷環境問題。

    ☆ END ☆

    如果看到這里,說明你喜歡這篇文章,請轉發、點贊。微信搜索「uncle_pn」,歡迎添加小編微信「 woshicver」,每日朋友圈更新一篇高質量博文。

    掃描二維碼添加小編↓

    總結

    以上是生活随笔為你收集整理的基于Docker的交互式人脸识别应用的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 亚洲一区二区中文 | 老司机一区 | 色婷视频| 久久久久久国产精品免费免费 | 香蕉视频官网在线观看 | 久久久久亚洲AV成人无码国产 | 三级男人添奶爽爽爽视频 | 亚洲色图影院 | 欧美一区二区三区日韩 | 男人女人拔萝卜视频 | hd丰满圆润的女人hd | 久久免费片| 国产视频四区 | 免费淫片 | 裸尼姑熟蜜桃 | 国产一二三区精品 | 粉嫩小泬无遮挡久久久久久 | 亚洲在线免费观看视频 | 人人干人人舔 | 操夜夜操 | 精品人伦一区二区三区蜜桃免费 | 国产素人在线观看 | 色综合天天色综合 | 一个综合色 | 欧美午夜免费 | 午夜手机福利 | 黄色一级视频免费 | 亚洲免费在线观看视频 | 狠狠的日| 国产在线精品一区二区 | 免费无码又爽又黄又刺激网站 | 一区二区有码 | 久久久视频在线 | 国产精品亚洲а∨天堂免在线 | kk视频在线观看 | 青青操免费在线视频 | 欧美xxxx喷水 | 国产午夜一区二区 | 四虎成人精品永久免费av九九 | 俺来也在线视频 | 高潮毛片无遮挡免费看 | 亚洲色成人一区二区三区小说 | 少妇日韩 | 精品久久久中文字幕 | 丰满岳跪趴高撅肥臀尤物在线观看 | 久久精品久久久久久久 | 天天看片天天干 | 91中文字日产乱幕4区 | 关之琳三级做爰 | 清纯唯美亚洲 | 男人爽女人下面动态图 | 国产91在线视频观看 | 亚欧美一区二区三区 | 久草一本 | 麻豆久久久午夜一区二区 | 成人免费福利视频 | 中文字幕一区二区三区日韩精品 | 希岛婚前侵犯中文字幕在线 | 午夜精品久久久久久久无码 | 18国产免费视频 | 国产在线观看免费av | 欧美乱色 | 天天操夜夜欢 | 91黄色免费网站 | 亚洲天堂成人在线观看 | 麻豆一区产品精品蜜桃的特点 | 5个黑人躁我一个视频 | 日本大胆裸体做爰视频 | 国产91精品久久久久久久网曝门 | 亚洲大片免费看 | 一级免费在线 | 中文精品一区二区三区 | 色婷婷国产精品 | 亚洲第一福利视频 | 五月天婷婷丁香花 | 99精品欧美一区二区 | 人妻洗澡被强公日日澡电影 | 免费精品视频 | 国产美女一级视频 | 国产黄色片网站 | 91丝袜国产在线播放 | 天天躁日日躁狠狠躁 | 中国一级大黄大黄大色毛片 | 五月婷婷丁香综合 | 久久靠逼视频 | 欧美一区二区在线观看 | 日韩视频在线一区二区 | 小泽玛利亚在线 | 久久这里只有精品99 | 亚洲操图| 四虎午夜| 欧美成人免费在线视频 | 美女三级黄色片 | 国产女主播在线一区二区 | 亚洲福利社区 | 日韩精品一区二区不卡 | 激情偷拍| 国产chinasex对白videos麻豆 | 久久成人综合 |