人臉識別主要步驟:python
face_recognition 庫的安裝web
安裝此庫,首先須要安裝編譯dlib,此處咱們偷個懶,安裝軟件Anaconda(大牛繞過),此軟件預裝了dlib.算法
安裝好後,咱們直接經過pip 安裝face_recognition庫,命令以下flask
python -m pip install face_recognition
調用一下庫,檢查是否成功導入瀏覽器
沒報錯,就是安裝成功了。服務器
按照以上辦法在安裝numpy 和python-opencv 兩個庫就能夠了網絡
經過face_recognition庫實現人臉識別架構
代碼以下app
# -*- coding: UTF-8 -*- import face_recognition import cv2 import os # 這是一個超級簡單(但很慢)的例子,在你的網絡攝像頭上實時運行人臉識別 # PLEASE NOTE: This example requires OpenCV (the `cv2` library) to be installed only to read from your webcam. # 請注意:這個例子須要安裝OpenCV # 具體的演示。若是你安裝它有困難,試試其餘不須要它的演示。 # 獲得一個參考的攝像頭# 0(默認) video_capture = cv2.VideoCapture(0) # 加載示例圖片並學習如何識別它。 path ="images"#在同級目錄下的images文件中放須要被識別出的人物圖 total_image=[] total_image_name=[] total_face_encoding=[] for fn in os.listdir(path): #fn 表示的是文件名 total_face_encoding.append(face_recognition.face_encodings(face_recognition.load_image_file(path+"/"+fn))[0]) fn=fn[:(len(fn)-4)]#截取圖片名(這裏應該把images文件中的圖片名命名爲爲人物名) total_image_name.append(fn)#圖片名字列表 while True: # 抓取一幀視頻 ret, frame = video_capture.read() # 發如今視頻幀全部的臉和face_enqcodings face_locations = face_recognition.face_locations(frame) face_encodings = face_recognition.face_encodings(frame, face_locations) # 在這個視頻幀中循環遍歷每一個人臉 for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings): # 看看面部是否與已知人臉相匹配。 for i,v in enumerate(total_face_encoding): match = face_recognition.compare_faces([v], face_encoding,tolerance=0.5) name = "Unknown" if match[0]: name = total_image_name[i] break # 畫出一個框,框住臉 cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2) # 畫出一個帶名字的標籤,放在框下 cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED) font = cv2.FONT_HERSHEY_DUPLEX cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1) # 顯示結果圖像 cv2.imshow('Video', frame) # 按q退出 if cv2.waitKey(1) & 0xFF == ord('q'): break # 釋放攝像頭中的流 video_capture.release() cv2.destroyAllWindows()
其次還要準備一個images文件夾進行攝像頭的人臉比對框架
成功的效果圖我就不貼了。
私信小編01 02 03 04 便可獲取數十套PDF哦!
原理以下:
1.遍歷images文件中的圖片
2.提取特徵臉
3.攝像頭每幀提取圖片,提取特診臉
4.遍歷特徵列表,找出符合特徵臉
5.輸出名字
一、從特徵中找出圖片中的人臉
import face_recognition image = face_recognition.load_image_file("your_file.jpg") face_locations = face_recognition.face_locations(image)
二、找到而且控制圖像中的臉部特徵
import face_recognition image = face_recognition.load_image_file("your_file.jpg") face_landmarks_list = face_recognition.face_landmarks(image)
三、識別照片中的人臉
import face_recognition known_image = face_recognition.load_image_file("biden.jpg") unknown_image = face_recognition.load_image_file("unknown.jpg") biden_encoding = face_recognition.face_encodings(known_image) [0]unknown_encoding = face_recognition.face_encodings(unknown_image) [0]results = face_recognition.compare_faces([biden_encoding], unknown_encoding)
0×02 總結
總的來講,該開源庫使得人臉識別的普及實現再也不那麼的遙遠。調用該庫,只需幾行代碼,即可實現人臉識別。有什麼問題能夠在下面評論討論哦,各路大牛勿噴。
* 本文做者:淼淼兮與懷,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載
Python+樹莓派+YOLO打造一款人工智能相機
2018年1月2日 BY ALPHA_H4CK·PYTHON+樹莓派+YOLO打造一款人工智能相機
已關閉評論
不久以前,亞馬遜剛剛推出了DeepLens。這是一款專門面向開發人員的全球首個支持深度學習的攝像機,它所使用的機器學習算法不只能夠檢測物體活動和麪部表情,並且還能夠檢測相似彈吉他等複雜的活動。雖然DeepLens還未正式上市,但智能攝像機的概念已經誕生了。
今天,咱們將本身動手打造出一款基於深度學習的照相機,當小鳥出如今攝像頭畫面中時,它將能檢測到小鳥並自動進行拍照。最終成品所拍攝的畫面以下所示:
相機不傻,它能夠很機智
咱們不打算將一個深度學習模塊整合到相機中,相反,咱們準備將樹莓派「掛鉤」到攝像頭上,而後經過WiFi來發送照片。本着「一切從簡」(窮)爲核心出發,咱們今天只打算搞一個跟DeepLens相似的概念原型,感興趣的同窗能夠本身動手嘗試一下。
接下來,咱們將使用Python編寫一個Web服務器,樹莓派將使用這個Web服務器來向計算機發送照片,或進行行爲推斷和圖像檢測。
咱們這裏所使用的計算機其處理能力會更強,它會使用一種名叫YOLO的神經網絡架構來檢測輸入的圖像畫面,並判斷小鳥是否出如今了攝像頭畫面內。
咱們得先從YOLO架構開始,由於它是目前速度最快的檢測模型之一。該模型專門給Tensorflow(谷歌基於DistBelief進行研發的第二代人工智能學習系統)留了一個接口,因此咱們能夠輕鬆地在不一樣的平臺上安裝和運行這個模型。友情提示,若是你使用的是咱們本文所使用的迷你模型,你還能夠用CPU來進行檢測,而不僅是依賴於價格昂貴的GPU。
接下來回到咱們的概念原型上… 若是像框內檢測到了小鳥,那咱們就保存圖片並進行下一步分析。
檢測與拍照
正如咱們所說的,DeepLens的拍照功能是整合在計算機裏的,因此它能夠直接使用板載計算能力來進行基準檢測,並肯定圖像是否符合咱們的標準。
可是像樹莓派這樣的東西,咱們其實並不須要使用它的計算能力來進行實時計算。所以,咱們準備使用另外一臺計算機來推斷出如今圖像中的內容。
我使用的是一臺簡單的Linux計算機,它帶有一個攝像頭以及WiFi無線網卡(樹莓派3+攝像頭),而這個簡單的設備將做爲個人深度學習機器並進行圖像推斷。對我來講,這是目前最理想的解決方案了,這不只大大縮減了個人成本,並且還可讓我在臺式機上完成全部的計算。
固然了,若是你不想使用樹莓派視頻照相機的話,你也能夠選擇在樹莓派上安裝OpenCV 3來做爲方案B,具體的安裝方法請參考【這份文檔】。友情提示,安裝過程可謂是很是的麻煩!
接下來,咱們須要使用Flask來搭建Web服務器,這樣咱們就能夠從攝像頭那裏獲取圖像了。這裏我使用了MiguelGrinberg所開發的網絡攝像頭服務器代碼(Flask視頻流框架),並建立了一個簡單的jpg終端:
#!/usr/bin/envpython from import lib import import_module import os from flask import Flask, render_template, Response #uncomment below to use Raspberry Pi camera instead #from camera_pi import Camera #comment this out if you're not using USB webcam from camera_opencv import Camera app =Flask(__name__) @app.route('/') def index(): return "hello world!" def gen2(camera): """Returns a single imageframe""" frame = camera.get_frame() yield frame @app.route('/image.jpg') def image(): """Returns a single currentimage for the webcam""" return Response(gen2(Camera()),mimetype='image/jpeg') if __name__ == '__main__': app.run(host='0.0.0.0', threaded=True)
若是你使用的是樹莓派視頻照相機,請確保沒有註釋掉上述代碼中from camera_pi那一行,而後註釋掉from camera_opencv那一行。
你能夠直接使用命令python3 app.py或gunicorn來運行服務器,這跟Miguel在文檔中寫的方法是同樣的。若是咱們使用了多臺計算機來進行圖像推斷的話,咱們還能夠利用Miguel所開發的攝像頭管理方案來管理攝像頭以及計算線程。
當咱們啓動了樹莓派以後,首先須要根據IP地址來判斷服務器是否正常工做,而後嘗試經過Web瀏覽器來訪問服務器。
URL地址格式相似以下:
http://192.168.1.4:5000/image.jpg
在樹莓派中加載Web頁面及圖像來肯定服務器是否正常工做:
圖像導入及推斷
既然咱們已經設置好了終端來加載攝像頭當前的圖像內容,咱們就能夠構建一個腳原本捕捉圖像並推斷圖像中的內容了。
這裏咱們須要用到request庫(一個優秀的Python庫,用於從URL地址獲取文件資源)以及Darkflow(YOLO模型基於Tensorflow的實現)。
不幸的是,咱們沒辦法使用pip之類的方法來安裝Darkflow,因此咱們須要克隆整個代碼庫,而後本身動手完成項目的構建和安裝。安裝好Darkflow項目以後,咱們還須要下載一個YOLO模型。
由於我使用的是速度比較慢的計算機和板載CPU(而不是速度較快的GPU),因此我選擇使用YOLO v2迷你網絡。固然了,它的功能確定沒有完整的YOLO v2模型的推斷準確性高啦!
配置完成以後,咱們還須要在計算機中安裝Pillow、numpy和OpenCV。最後,咱們就能夠完全完成咱們的代碼,並進行圖像檢測了。
最終的代碼以下所示:
from darkflow.net.build import TFNet import cv2 from io import BytesIO import time import requests from PIL import Image import numpy as np options= {"model": "cfg/tiny-yolo-voc.cfg", "load":"bin/tiny-yolo-voc.weights", "threshold": 0.1} tfnet= TFNet(options) birdsSeen= 0 def handleBird(): pass whileTrue: r =requests.get('http://192.168.1.11:5000/image.jpg') # a bird yo curr_img = Image.open(BytesIO(r.content)) curr_img_cv2 =cv2.cvtColor(np.array(curr_img), cv2.COLOR_RGB2BGR) result = tfnet.return_predict(curr_img_cv2) print(result) for detection in result: if detection['label'] == 'bird': print("bird detected") birdsSeen += 1 curr_img.save('birds/%i.jpg' %birdsSeen) print('running again') time.sleep(4)
此時,咱們不只能夠在命令控制檯中查看到樹莓派所檢測到的內容,並且咱們還能夠直接在硬盤中查看保存下來的小鳥照片。接下來,咱們就可使用YOLO來標記圖片中的小鳥了。
假陽性跟假陰性之間的平衡
咱們在代碼的options字典中設置了一個threshold鍵,這個閾值表明的是咱們用於檢測圖像的某種成功率。在測試過程當中,咱們將其設爲了0.1,可是如此低的閾值會給咱們帶來是更高的假陽性以及誤報率。更糟的是,咱們所使用的迷你YOLO模型準確率跟完整的YOLO模型相比,差得太多了,但這也是須要考慮的一個平衡因素。
下降閾值意味着咱們能夠獲得更多的模型輸出(照片),在個人測試環境中,我閾值設置的比較低,由於我想獲得更多的小鳥照片,不過你們能夠根據本身的須要來調整閾值參數。