嵌入式系統(tǒng)綜合實踐
本項目以樹莓派model B為主板,編寫python程序?qū)崿F(xiàn)USB攝像頭自動拍照(如果攝像頭前沒有人臉會一直拍照下去),試圖開門者靠近攝像頭并讓其對自己正臉拍照,程序拍照后調(diào)用opencv與face++的API對照片進(jìn)行人臉識別并與本地權(quán)限人照片(擁有開門權(quán)限的有兩人)比較,以控制繼電器實現(xiàn)電子門鎖的開關(guān)(如若是擁有權(quán)限者試圖開門,繼電器由長閉一邊打到另一邊),所有試圖開門的記錄都存儲在樹莓派的數(shù)據(jù)庫mysql中,可以在自己編寫的安卓客戶端中查看所有記錄。
樹莓派+Python + Opencv + Face++ +數(shù)據(jù)庫Mysql + 基于JDBC的同一局域網(wǎng)下連接樹莓 派數(shù)據(jù)庫的app 1.樹莓派是一款基于ARM的微型電腦主板,以SD/MicroSD卡為內(nèi)存硬盤,卡片主板周圍有1/2/4個USB接口和一個10/100 以太網(wǎng)接口,可連接鍵盤、鼠標(biāo)和網(wǎng)線,同時擁有視頻模擬信號的電視輸出接口和HDMI高清視頻輸出接口,以上部件全部整合在一張僅比信用卡稍大的主板上。 2.考慮到python相較其他語言的簡潔性,樹莓派對python語言有很好的支持(最新版的樹莓派操作系統(tǒng)自帶python環(huán)境),而且face++官網(wǎng)只提供java與python兩種sdk包,選取python語言編寫樹莓派上運(yùn)行的程序。 3. OpenCV是一個基于(開源)發(fā)行的跨平臺計算機(jī)視覺庫,可以運(yùn)行在Linux、Windows和Mac OS操作系統(tǒng)上。它輕量級而且高效,同時提供了Python、Ruby、MATLAB等語言的接口,實現(xiàn)了圖像處理和計算機(jī)視覺方面的很多通用算法。選用opencv做人臉識別是較常用和成熟的技術(shù)。 4. Face++是北京曠視科技有限公司旗下的新型視覺服務(wù)平臺,F(xiàn)ace++平臺通過提供云端API、離線SDK、以及面向用戶的自主研發(fā)產(chǎn)品形式,將人臉識別技術(shù)廣泛應(yīng)用到互聯(lián)網(wǎng)及移動應(yīng)用場景中。Face++的API功能更加全面,人臉識別精度也要高于Opencv。 5.MySQL 是一個關(guān)系型數(shù)據(jù)庫,由瑞典 MySQL AB 公司開發(fā),目前屬于 Oracle 旗下公司。MySQL 所使用的 SQL 語言是用于訪問數(shù)據(jù)庫的最常用標(biāo)準(zhǔn)化語言。Mysql是輕量級的數(shù)據(jù)庫,支持遠(yuǎn)程連接,為制作客戶端提供了方便。 6. JDBC(Java Data Base Connectivity,java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的Java API,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成,可以用JDBC實現(xiàn)與樹莓派中的mysql遠(yuǎn)程連接。采取先在eclipse上建立java工程,調(diào)試核心代碼,再移植到android studio中的android工程中,在android studio中寫好app,直接用手機(jī)調(diào)試(用模擬器PC可能會卡),并生成apk放在手機(jī)上作為客戶端。 二.相關(guān)硬件 1、樹莓派主板:程序運(yùn)行的平臺 2、USB攝像頭:實現(xiàn)圖像的采集 3、其他模塊:電腦、網(wǎng)線(用于平時調(diào)試),360隨身wifi模塊(用于平時調(diào)試與最終演示) 三.相關(guān)軟件(下載到樹莓派中) 1、Raspbian系統(tǒng) Raspbian系統(tǒng)是基于Debian系統(tǒng)的Raspberry Pi的硬件優(yōu)化的免費操作系統(tǒng)。廣義的Debian是指一個致力于創(chuàng)建自由操作系統(tǒng)的合作組織及其作品,而Raspbian操作系統(tǒng)是一套基本的能使樹莓派運(yùn)行的程序和設(shè)備。Raspbian不僅僅是一個單純的操作系統(tǒng),它包涵了35000種適當(dāng)格式的工具包、預(yù)編譯軟件,而這些都是能夠非常容易地安裝在樹莓派上的 。 2、抓圖軟件fswebcam 實現(xiàn)USB攝像頭拍照功能 3、Python圖像處理庫、python-imaging、python-imaging-tk 4、opencv Python的視覺庫 5、face++的Python SDK 包 SDK包中包括通過網(wǎng)絡(luò)調(diào)用face++的API所必須的一些工具。 四.實踐流程 1.樹莓派基本操作和必要環(huán)境搭建 包括下載好所需系統(tǒng)鏡像并燒入microSD中、樹莓派上網(wǎng)的實現(xiàn)、360隨身wifi模塊插入樹莓派后相關(guān)的配置、登陸工具putty的下載、vncserver安裝、下載sftp工具用來傳輸數(shù)據(jù)。 2.基于face++的人臉識別與比較并控制繼電器開關(guān) (1)用putty登錄樹莓派進(jìn)入命令行界面,插入usb攝像頭,輸入指令lsusb查看是否被樹莓派識別(一般不需要,最新系統(tǒng)自動驅(qū)動usb攝像頭)。 (2)用命令行安裝fswebcamsudo apt-get install fswebcam#安裝fswebcam sudo fswebcam -d /dev/video0 -r 352x288 /home/pi/0.jpg#拍照嘗試一下 (3)用命令行安裝python相關(guān)庫 sudo apt-get install libjpeg8-dev zlib1g-dev libfreetype6-dev#安裝PIL依賴包 sudo apt-get install python-imaging#安裝python-imaging sudo apt-get install python-imaging-tk#安裝python-imaging-tk (4)進(jìn)入face++官網(wǎng),注冊face++賬號,在如下圖所示界面下載對應(yīng)Python的sdk包到PC端,再用文件傳輸工具傳入樹莓派中 (5)建立一個新應(yīng)用,將賬號的API_KEY和應(yīng)用的API_SECRET寫入下載好的SDK中的apikey.cfg文件和call.py文件中,用命令行運(yùn)行call.py文件,體驗人臉識別,并研究putty界面所可能顯示的python捕獲異常的信息,嘗試進(jìn)行程序的調(diào)試。 (6)仔細(xì)研究face++的API文檔,最終選定Detect API與Compare API(如下圖所示)實現(xiàn)所需功能。 (7)拍攝擁有開門權(quán)限者的照片并放入樹莓派本地,編寫程序完成系統(tǒng)的核心功能人臉識別與比較(見附錄程序1),并對拍照圖片進(jìn)行處理。(在對比開門者照片與權(quán)限者照片時所用到的是Compare API返回值之一的“比對結(jié)果置信度”confidence,前者的confidence為94.795,后者的confidence為56.607,所以將判斷的閥值定為70。) (8)將繼電器的正、負(fù)、in端分別接樹莓派GPIO的5V引腳、地引腳與11引腳,在程序中導(dǎo)入python的GPIO庫,寫入簡單的GPIO引腳高低電平控制程序,觀察繼電器的狀態(tài)。 import RPi.GPIO as GPIO#導(dǎo)入庫 GPIO.setmode(GPIO.BOARD) #配置IO口的標(biāo)號方式 GPIO.setup(11, GPIO.OUT)#將GPIO的11引腳設(shè)為輸出 GPIO.output(11, 1)# 讓GPIO的11引腳為高電平 GPIO.output(11, 0) # 讓GPIO的11引腳為低電平 3.樹莓派數(shù)據(jù)庫建立 用以下指令安裝數(shù)據(jù)庫mysql,在安裝過程中 sudo apt-get install mysql-server python-mysqldb 單獨建立一個.py文件用于數(shù)據(jù)庫相關(guān)代碼的測試,從建立一個數(shù)據(jù)庫出發(fā),再到插入一條記錄,調(diào)試無誤后,移植進(jìn)之前總的python程序中,實現(xiàn)每識別一次人臉,與本地權(quán)限者照片比較之外,插入一條試圖開門者的記錄。 由于記錄中需要有試圖開門這一動作發(fā)生的時間,需要獲取樹莓派當(dāng)前的時間,首先需要樹莓派每次重啟都通過網(wǎng)絡(luò)將其時間矯正為現(xiàn)實時間,有以下幾個步驟: 運(yùn)行以下命令,啟用NTP: sudo timedatectl set-ntp true 然后通過date命令來查看當(dāng)前時間,如果時間不對,使用以下命令修改本地時區(qū)sudo dpkg-reconfigure tzdata,在“Configuring tzdata”中,依次選擇Asia、Chongqing。 等樹莓派與現(xiàn)實時間同步,通過python的time模塊來獲取時間 import time localtime=time.strftime("%Y-%m-%d %X",time.localtime()) 此時已經(jīng)獲取了字符串格式的當(dāng)前時間local,同樣移植到總的python程序中。 4.自動拍照與opencv 可以寫個大循環(huán),在循環(huán)開頭進(jìn)行拍照,拍照代碼如下 import os command="sudo fswebcam -d /dev/video0 -r 600*600 /home/pi/python-sdk-master/python-sdk/photo.jpeg" 但不能每次拍完照都與本地權(quán)限者照片比較一下,那樣調(diào)用face++的API過于頻繁,一來造成累積的網(wǎng)絡(luò)延時過大,二來正式API應(yīng)用以調(diào)用次數(shù)收費(試用API也不能無限次調(diào)用,且網(wǎng)絡(luò)不穩(wěn)定,容易出問題),因此每次拍完照都要識別一下照片中有沒有人臉,如果有人臉再調(diào)用face++進(jìn)行人臉比較。但同樣的道理也不能用face++進(jìn)行人臉識別,綜上考慮,用opencv進(jìn)行識別。 首先用下列命令下載opencv庫 sudo apt-get install python-opencv 在GitHub上找到opencv軟件包到PC上,在其中找到haarcascade_frontalface_alt2.xml文件放在與總的python程序相同目錄下,就可以用如下代碼實現(xiàn)基于opencv的人臉識別 face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_alt2.xml') img = cv2.imread('photo.jpeg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.3, 5) faces若返回不為(),則為識別出了人臉。 考慮到降低延時,在最終的總的python程序中,去掉了之前用face++識別人臉對想要開門者照片處理的部分。 5.將權(quán)限者修改為兩人,得到最終程序(見附錄程序2)。 最終測試,從自動拍照到識別到驅(qū)動繼電器,整個過程工作良好。由于用opencv識別人臉精度較低,需要攝像頭離人臉一段距離并采光良好,但仍會偶爾發(fā)生長時間(高于6s,小于12s)無法識別人臉的情況(實際上,這可能更多是攝像頭的緣故,比如用藍(lán)色妖姬T3200攝像頭,雖然要調(diào)焦距,拍照指令也要在sudo fswebcam后加“-S 10”,但基本上沒有識別不了人臉的情況)。 6.基于JDBC和無線熱點的安卓客戶端 首先要建立必要的局域網(wǎng): 無線模塊插在樹莓派上并已進(jìn)行配置,手機(jī)開熱點,樹莓派連接該熱點,讓PC和預(yù)備下載客戶端的手機(jī)也連上同一熱點。此時PC可通過putty登陸樹莓派命令行界面。當(dāng)然也可讓樹莓派、電腦、手機(jī)連上同一wifi(對于相同wifi,無線設(shè)備每次被分配的ip地址固定)。 然后,必須對樹莓派進(jìn)行配置,開啟其數(shù)據(jù)庫mysql可供遠(yuǎn)程訪問的權(quán)限。 用sudo nano /etc/mysql/my.cnf修改/etc/mysql/my.cnf文件 找到下面這行,并用#注釋掉, bind-address = 127.0.0.1 或者修改為bind-address = 0.0.0.0 然后登錄mysql,輸入下面命令 mysql>grant all privileges on *.* to username@"%" identified by "password";(username一般是root,password是樹莓派mysql上root用戶的密碼) mysql> FLUSH PRIVILEGES; 安裝防火墻ufw apt-get installufw 啟用ufw ufw enable ufw default deny 開啟3306、22(ssh端口)端口 ufw allow 3306 ufw allow 22 (注意:如果不開啟22端口,下次啟動樹莓派時,系統(tǒng)的22端口會禁用,不能使用ssh登錄樹莓派) 然后關(guān)上防火墻,否則會禁止一切對樹莓派的外部連接(putty除外,但VNC不行) ufw disable 重啟mysql sudo service mysql restart; 這時嘗試在eclipse上建立java工程,書寫基于jdbc原理的代碼,嘗試與樹莓派中mysql數(shù)據(jù)庫建立連接(JDBC驅(qū)動包選用mysql-connector-java-5.1.22-bin.jar)。 如若連接不上,在PC端下載mysql workbench嘗試連接樹莓派尋找原因。 將java程序移植到android studio的android工程中,并完成整個工程 客戶端效果見下圖,填入(設(shè)計為自動填入默認(rèn)內(nèi)容)用戶名(第一行)、密碼(第二行)與樹莓派IP地址(第三行,雖然應(yīng)該封裝為用戶不可見),點擊“獲取記錄”按鈕,即可查看所有試圖開門的歷史記錄。 四.總結(jié)與收獲 這次嵌入式綜合實踐,歷時六周,從一開始的懵懂到最后完成系統(tǒng)的所有功能,收獲了很多很多。從拿到樹莓派大約兩周后,我們便開始準(zhǔn)備綜合實踐的相關(guān)內(nèi)容。從查資料確定大致的方案,到進(jìn)行最基礎(chǔ)的樹莓派操作和學(xué)習(xí)python的基本編程,慢慢進(jìn)步。 網(wǎng)上有較多的樹莓派人臉識別教程而無樹莓派人臉比較教程,這是一大難點。而很多人臉識別教程的代碼已經(jīng)過時,拿face++來說,其官網(wǎng)提供的sdk包便與幾年前并不一樣,API進(jìn)行了全面的更新,必須仔細(xì)研讀最新的API文檔并結(jié)合sdk包中提供的例程,一步步摸索,寫下并調(diào)試每一句代碼。 網(wǎng)上有一些關(guān)于樹莓派GPIO口、數(shù)據(jù)庫、opencv的程序,也不能直接拿來用,需要分析大概每一句代碼的含義,并且做長時間的調(diào)試。往往先寫“模塊”,再將“模塊”移植到總程序中。 安卓客戶端的制作,也是最難的部分之一,由于java和安卓的知識不夠,往往需要很長時間的摸索,請教很多人。用JDBC連接數(shù)據(jù)庫的java程序在網(wǎng)上很好找到,也很簡單,容易用eclipse進(jìn)行調(diào)試,但寫成android工程仍有很多地方要做。 我們分工明確,組里的每個人在做好自己工作的同時,也關(guān)注別人的進(jìn)展,及時溝通,為整個項目的完成付諸努力。 通過這次綜合實踐,我們對專業(yè)和項目開發(fā)有了更加深切和具體的認(rèn)識,體會到了寫程序的艱辛與復(fù)雜,但克服困難之后的喜悅也是巨大的。通過不斷地去解決問題,每個人的能力都有了很大的提高。 五.附錄 程序一 #-*- coding: utf-8 -*- #從PIL中引入Image和ImageDraw,讀出’/home/pi/photo.jpeg’并另存原始圖片為yuanshi.jpeg from PIL import Image from PIL import ImageDraw im = Image.open( './photo2.jpeg' ) im.save( './yuanshi2.jpeg' ) import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BOARD) GPIO.setup(15, GPIO.OUT) true=1 # 您需要先注冊一個App,并將得到的API key和API secret寫在這里。 # You need to register your App first, and enter you API key/secret. API_KEY = "iYsLwyCzinc_JnsoUSuuO2j7mTdnhLoA" API_SECRET = "863589RVqKDq3H-u3u57LZr1llDqmQv0" # Import system libraries and define helper functions # 導(dǎo)入系統(tǒng)庫并定義輔助函數(shù) from print import pformat def print_result(hit, result): def encode(obj): if type(obj) is unicode: return obj.encode('utf-8') if type(obj) is dict: return {encode(v): encode(k) for (v, k) in obj.iteritems()} if type(obj) is list: return [encode(i) for i in obj] return obj print hit result = encode(result) print '\n'.join(" " + i for i in pformat(result, width=75).split('\n')) # First import the API class from the SDK # 首先,導(dǎo)入SDK中的API類 from facepp import API, File #創(chuàng)建一個API對象,如果你是國際版用戶,代碼為:api = API(API_KEY, API_SECRET, srv=api_server_international) #Create a API object, if you are an international user,code: api = API(API_KEY, API_SECRET, srv=api_server_international) api = API(API_KEY, API_SECRET) #利用face++的detectAPI識別剛剛拍攝的照片中的人臉 detectresult = api.detect(api_key=API_KEY,api_secret=API_SECRET,image_file=File('./photo2.jpeg')) print '=' *60 #將結(jié)果輸出到打印到命令行界面上 print_result('Detect result:', detectresult) #調(diào)用face++的compareAPI將拍到的照片與兩張本地權(quán)限者照片做比較,confidence 表示拍到的照片與本地權(quán)限者照片是同一人的置信度 comparation=api.compare(api_key=API_KEY,api_secret=API_SECRET,image_file1=File('./zq3.jpeg'),image_file2=File('./photo2.jpeg')) confidence=comparation['confidence'] print confidence #獲取識別到的人臉及識別圖片實際高度和寬度 zt=detectresult["faces"][0]["face_rectangle"]["top"] zl=detectresult["faces"][0]["face_rectangle"]["left"] zw=detectresult["faces"][0]["face_rectangle"]["width"] zh=detectresult["faces"][0]["face_rectangle"]["height"] #打開photo圖 im = Image.open( './photo2.jpeg' ) draw = ImageDraw.Draw(im) draw.polygon([(zl,zt+zh),(zl+zw,zt+zh),(zl+zw,zt),(zl,zt)],outline=(0,255,0)) im.save( './photo1.jpeg' ) from PIL import ImageFont,ImageDraw ft = ImageFont.truetype( '/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', 18) draw = ImageDraw.Draw(im) #如果置信度不超過70,則在相應(yīng)人臉出標(biāo)注“stranger”;否則,標(biāo)注與該人臉有最大相似度的數(shù)據(jù)庫中的成員的名字 if confidence <=70: GPIO.output(15, 0) draw.text((zl+10,zt-30), 'stranger',fill=(255,0,0), font=ft) else: GPIO.output(15, 1) draw.text((zl+10,zt-30), 'Bu Honglong',fill=(255,0,0), font=ft) #保存修改后的photo圖片 im.save( './photo2.jpeg' ) 程序2(最終程序faceselect7.py) #-*- coding: utf-8 -*- from PIL import Image from PIL import ImageDraw import time#導(dǎo)入python的time模塊 localtime=time.strftime("%Y-%m-%d %X",time.localtime())#獲取當(dāng)前現(xiàn)實時間 import os#導(dǎo)入python的os模塊 command="sudo fswebcam -d /dev/video0 -r 600*600 /home/pi/python-sdk-master/python-sdk/photo.jpeg"#賦拍照指令的字符串給command import numpy as np#導(dǎo)入python的numpy模塊并更名為np import cv2#導(dǎo)入python的opencv模塊 import MySQLdb導(dǎo)入python的 MySQLdb模塊,用于數(shù)據(jù)庫操作 # 下面是與mysql建立連接,插入名為openperson的數(shù)據(jù)庫,并規(guī)范記錄格式 db_conn = MySQLdb.connect(host = 'localhost', user= 'root', passwd = '65498732') cursor = db_conn.cursor() cursor.execute("create database if not exists openperson") db_conn.select_db('openperson'); sql = """CREATE TABLE if not exists people( open_name CHAR(20) NOT NULL, time CHAR(20))""" try: cursor.execute(sql) except Exception, e: print "Error to create table:", e sql = """INSERT INTO people(open_name, time) VALUES ('%s', '%s')""" import RPi.GPIO as GPIO #導(dǎo)入RPi.GPIO模塊,并更名為GPIO GPIO.setmode(GPIO.BOARD) #配置IO口的標(biāo)號方式 GPIO.setup(11, GPIO.OUT) #將GPIO的11引腳設(shè)為輸出 # 您需要先注冊一個App,并將得到的API key和API secret寫在這里。 # You need to register your App first, and enter you API key/secret. API_KEY = "iYsLwyCzinc_JnsoUSuuO2j7mTdnhLoA" API_SECRET = "863589RVqKDq3H-u3u57LZr1llDqmQv0" # Import system libraries and define helper functions # 導(dǎo)入系統(tǒng)庫并定義輔助函數(shù) from print import pformat def print_result(hit, result): def encode(obj): if type(obj) is unicode: return obj.encode('utf-8') if type(obj) is dict: return {encode(v): encode(k) for (v, k) in obj.iteritems()} if type(obj) is list: return [encode(i) for i in obj] return obj print hit result = encode(result) print '\n'.join(" " + i for i in pformat(result, width=75).split('\n')) # First import the API class from the SDK # 首先,導(dǎo)入SDK中的API類 from facepp import API, File #創(chuàng)建一個API對象,如果你是國際版用戶,代碼為:api = API(API_KEY, API_SECRET, srv=api_server_international) #Create a API object, if you are an international user,code: api = API(API_KEY, API_SECRET, srv=api_server_international) api = API(API_KEY, API_SECRET) true=1 #下面進(jìn)入拍照循環(huán) while true: os.system(command)#執(zhí)行command所代表的指令,即拍照 time.sleep(1)#等待1s #下面是用opencv進(jìn)行人臉識別,識別出有人臉才進(jìn)行下一步人臉比較,否則一直拍照 face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_alt2.xml') img = cv2.imread('photo.jpeg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.3, 5) if faces!=(): #利用face++的detectAPI識別剛剛拍攝的照片中的人臉,其實這句調(diào)試時能看到不少信息,方便些,可以省略 detectresult=api.detect(api_key=API_KEY,api_secret=API_SECRET,image_file=File('./photo.jpeg')) #將結(jié)果輸出到打印到命令行界面上 print_result('Detect result:', detectresult) #調(diào)用face++的compareAPI將拍到的照片與兩張本地權(quán)限者照片做比較,confidence1 和confidence2表示拍到的照片與本地權(quán)限者照片是同一人的置信度 comparation1=api.compare(api_key=API_KEY,api_secret=API_SECRET,image_file1=File('./quanxianzhe1.jpeg'),image_file2=File('./photo.jpeg')) confidence1=comparation1['confidence'] comparation2=api.compare(api_key=API_KEY,api_secret=API_SECRET,image_file1=File('./quanxianzhe2.jpeg'),image_file2=File('./photo.jpeg')) confidence2=comparation2['confidence'] #如果置信度超過70時,則送對應(yīng)11號引腳高電平,改變繼電器狀態(tài),并給數(shù)據(jù)庫中送對應(yīng)權(quán)限人開門的記錄;否則,給數(shù)據(jù)庫中送陌生人想要開門的記錄,print1,print2,print3是調(diào)試需要,方便樹莓派沒連繼電器時在命令行界面也能查看程序運(yùn)行情況 if confidence1 >=70: GPIO.output(11, 1) time.sleep(2) GPIO.output(11, 0) print 1 peoples = ( {"open_name": "Bu Honglong", "time": localtime}, ) for people in peoples: cursor.execute(sql % (people["open_name"], \ people["time"])) db_conn.commit() elif confidence2 >=70: GPIO.output(11, 1) time.sleep(2) GPIO.output(11, 0) print 2 peoples = ( {"open_name": "Chenzhe", "time": localtime}, ) for people in peoples: cursor.execute(sql % (people["open_name"], \ people["time"])) db_conn.commit() else: GPIO.output(11, 0) time.sleep(1) print 3 peoples = ( {"open_name": "Stranger", "time": localtime}, ) for people in peoples: cursor.execute(sql % (people["open_name"], \ people["time"])) db_conn.commit() else: GPIO.output(11, 0) print "No one" 3 .face++ 的Detect API 版本 3.0 描述 調(diào)用者提供圖片文件或者圖片URL,進(jìn)行人臉檢測和人臉分析。識別出的人臉會給出face_token,用于后續(xù)的人臉比對等操作。請注意,只對人臉包圍盒面積最大的5個人臉進(jìn)行分析,其他人臉可以使用Face Analyze API進(jìn)行分析。如果您需要使用檢測出的人臉于后續(xù)操作,建議將對應(yīng)face_token添加到FaceSet中。如果一個face_token連續(xù)72小時沒有存放在任意FaceSet中,則該face_token將會失效。如果對同一張圖片進(jìn)行多次人臉檢測,同一個人臉得到的face_token是不同的。 圖片要求 圖片格式:JPG(JPEG),PNG
圖片像素尺寸:最小48*48像素,最大4096*4096像素
圖片文件大小:2MB
最小人臉像素尺寸: 系統(tǒng)能夠檢測到的人臉框為一個正方形,正方形邊長的最小值為圖像短邊長度的48分之一,最小值不低于48像素。 例如圖片為 4096*3200 像素,則最小人臉像素尺寸為 66*66 像素。 更新日志 2017年3月9日:人臉檢測算法升級;提供了眼睛狀態(tài)檢測替換是否戴眼鏡的檢測;人臉模糊檢測升級;提供了人種檢測。 2017年3月28日:支持base64編碼的圖片。 調(diào)用URL https://api-cn.faceplusplus點com/facepp/v3/detect 調(diào)用方法 POST 權(quán)限 不需要單獨申請權(quán)限。 請求參數(shù) 是否必選 | 參數(shù)名 | 類型 | 參數(shù)說明 | 必選 | api_key | String | 調(diào)用此API的API Key | 必選 | api_secret | String | 調(diào)用此API的API Secret | 必選(三選一) | image_url | String | 圖片的URL。 注:在下載圖片時可能由于網(wǎng)絡(luò)等原因?qū)е孪螺d圖片時間過長,建議使用image_file或image_base64參數(shù)直接上傳圖片。 | image_file | File | 一個圖片,二進(jìn)制文件,需要用post multipart/form-data的方式上傳。 | image_base64 | String | base64編碼的二進(jìn)制圖片數(shù)據(jù) 如果同時傳入了image_url、image_file和image_base64參數(shù),本API使用順序為image_file優(yōu)先,image_url最低。 | 可選 | return_landmark | Int | 是否檢測并返回人臉五官和輪廓的83個關(guān)鍵點。 1:檢測 0:不檢測 注:默認(rèn)值為0 | 可選 | return_attributes | String | 是否檢測并返回根據(jù)人臉特征判斷出的年齡,性別,微笑、人臉質(zhì)量等屬性,需要將需要檢測的屬性組織成一個用逗號分隔的字符串。目前支持:gender,age,smiling,headpose,facequality,blur,eyestatus,ethnicity 順序沒有要求。默認(rèn)值為 none ,表示不檢測屬性。 注:facequality(人臉質(zhì)量)是指圖像中的人臉是否適合進(jìn)行人臉比對,出現(xiàn)模糊、過亮、過暗、大側(cè)臉、不完整等情況會影響人臉質(zhì)量分?jǐn)?shù)。 由于提供了eyestatus 眼睛狀態(tài)監(jiān)測,所以glass 參數(shù)將于2017-4-30日失效,請盡快修改程序使用 eyestatus |
返回值說明 字段 | 類型 | 說明 | request_id | String | 用于區(qū)分每一次請求的唯一的字符串。 | faces | Array | 被檢測出的人臉數(shù)組 注:如果沒有檢測出人臉則為空數(shù)組 | image_id | String | 被檢測的圖片在系統(tǒng)中的標(biāo)識 | time_used | Int | 整個請求所花費的時間,單位為毫秒。 | error_message | String | 當(dāng)請求失敗時才會返回此字符串,具體返回內(nèi)容見后續(xù)錯誤信息章節(jié)。否則此字段不存在。 |
faces數(shù)組中單個元素的結(jié)構(gòu) 字段 | 類型 | 說明 | face_token | String | 人臉的標(biāo)識 | face_rectangle | Object | 人臉矩形框,坐標(biāo)數(shù)字為整數(shù),代表像素點坐標(biāo) top:左上角縱坐標(biāo) left:左上角橫坐標(biāo) width:寬度 height:高度 | landmark | Object | 人臉的83個關(guān)鍵點坐標(biāo)數(shù)組。 | attributes | Object | 人臉屬性特征,包括: gender:性別分析結(jié)果,value的值為Male/Female。Male 代表男性,F(xiàn)emale代表女性。 age:年齡分析結(jié)果,value的值為一個非負(fù)整數(shù),標(biāo)識估計的年齡。 smile:笑容分析結(jié)果,value的值為一個[0,100]的浮點數(shù),小數(shù)點后3位有效數(shù)字,數(shù)值大表示笑程度高。threshold代表笑容的閾值,超過該閾值認(rèn)為有笑容。 glass:是否佩戴眼鏡的分析結(jié)果,value的值為None/Dark/Normal。None代表不佩戴眼鏡,Dark代表佩戴墨鏡,Normal代表佩戴普通眼鏡。(請注意,motionblur 和 gaussianblur 將于2017-4-30日停止返回,請盡快停用) headpose:人臉姿勢分析結(jié)果,包括pitch_angle, roll_angle, yaw_angle,分別對應(yīng)抬頭,旋轉(zhuǎn)(平面旋轉(zhuǎn)),搖頭。單位為角度。 blur:人臉模糊分析結(jié)果,包括以下兩種分析(請注意,motionblur 和 gaussianblur 將于2017-4-30日停止返回,請盡快停用。目前兩個字段的值會與新的blurness值相同) - motionblur: 人臉移動模糊度分析結(jié)果,value的值為是一個浮點數(shù),范圍[0,100], 小數(shù)點后3位有效數(shù)字。threshold表示人臉模糊度是否影響辨識的閾值。
- gaussianblur:人臉高斯模糊度分析結(jié)果,value的值為是一個浮點數(shù),范圍[0,100], 小數(shù)點后3位有效數(shù)字。threshold表示人臉模糊度是否影響辨識的閾值。
- blurness:新的人臉模糊分析結(jié)果,value的值為是一個浮點數(shù),范圍[0,100], 小數(shù)點后3位有效數(shù)字,數(shù)值大表示人臉模糊。threshold表示人臉模糊度是否影響辨識的閾值。
eyestatus: 眼睛狀態(tài)信息 包括 left_eye_status,right_eye_status兩個對象,分別代表左眼和右眼的狀態(tài)。每個對象包括以下字段,值是一個浮點數(shù),范圍[0,100], 小數(shù)點后3位有效數(shù)字,總和等于100。 - occlusion:眼睛被遮擋的置信度
- no_glass_eye_open:不戴眼鏡且睜眼的置信度
- normal_glass_eye_close:佩戴普通眼鏡且閉眼的置信度
- normal_glass_eye_open:佩戴普通眼鏡且睜眼的置信度
- dark_glasses:佩戴墨鏡的置信度
- no_glass_eye_close:不戴眼鏡且閉眼的置信
facequality: 人臉質(zhì)量判斷結(jié)果,value值為人臉的質(zhì)量判斷的分?jǐn)?shù),是一個浮點數(shù),范圍[0,100], 小數(shù)點后3位有效數(shù)字,數(shù)值大代表人臉質(zhì)量高。threshold表示人臉質(zhì)量基本合格的一個閾值,超過該閾值的人臉適合用于人臉比對。 ethnicity: 人種分析結(jié)果,value的值為Asian/White/Black。Asian代表亞洲人,White代表白人,Black代表黑人。 |
人臉關(guān)鍵點landmark的詳細(xì)字段說明與圖示請參考文檔:
返回值示例 請求成功返回示例: { "image_id": "Dd2xUw9S/7yjr0oDHHSL/Q==", "request_id": "1470472868,dacf2ff1-ea45-4842-9c07-6e8418cea78b", "time_used": 752, "faces": [{ "landmark": { "mouth_upper_lip_left_contour2": { "y": 185, "x": 146 }, "contour_chin": { "y": 231, "x": 137 }, .............省略關(guān)鍵點信息 "right_eye_pupil": { "y": 146, "x": 205 }, "mouth_upper_lip_bottom": { "y": 195, "x": 159 } }, "attributes": { "gender": { "value": "Female" }, "age": { "value": 21 }, "glass": { "value": "None" }, "headpose": { "yaw_angle": -26.625063, "pitch_angle": 12.921974, "roll_angle": 22.814377 }, "smile": { "threshold": 30.1, "value": 2.566890001296997 } }, "face_rectangle": { "width": 140, "top": 89, "left": 104, "height": 141 }, "face_token": "ed319e807e039ae669a4d1af0922a0c8" }
請求失敗返回示例: { "time_used": 3, "error_message": "MISSING_ARGUMENTS: image_url, image_file, image_base64", "request_id": "1470378968,c6f50ec6-49bd-4838-9923-11db04c40f8d" }
當(dāng)前API特有的ERROR_MESSAGE HTTP狀態(tài)代碼 | 錯誤信息 | 說明 | 400 | IMAGE_ERROR_UNSUPPORTED_FORMAT:<param> | 參數(shù)<param>對應(yīng)的圖像無法正確解析,有可能不是一個圖像文件、或有數(shù)據(jù)破損。 | 400 | INVALID_IMAGE_SIZE:<param> | 客戶上傳的圖像像素尺寸太大或太小,圖片要求請參照本API描述。<param>對應(yīng)圖像太大的那個參數(shù)的名稱 | 400 | INVALID_IMAGE_URL | 無法從指定的image_url下載圖片,圖片URL錯誤或者無效 | 412 | IMAGE_DOWNLOAD_TIMEOUT | 下載圖片超時 |
通用的ERROR_MESSAGE HTTP 狀態(tài)代碼 | 錯誤信息 | 說明 | 401 | AUTHENTICATION_ERROR | api_key和api_secret不匹配。 | 403 | AUTHORIZATION_ERROR:<reason> | api_key沒有調(diào)用本API的權(quán)限,具體原因為:用戶自己禁止該api_key調(diào)用、管理員禁止該api_key調(diào)用、由于賬戶余額不足禁止調(diào)用。 目前的<reason>有: - Denied by Client(用戶自己禁止該api_key調(diào)用)
- Denied by Admin(管理員禁止該api_key調(diào)用)
- Insufficient Account Balance(由于賬戶余額不足禁止調(diào)用)
| 403 | CONCURRENCY_LIMIT_EXCEEDED | 并發(fā)數(shù)超過限制。 | 400 | MISSING_ARGUMENTS: <key> | 缺少某個必選參數(shù)。 | 400 | BAD_ARGUMENTS:<key> | 某個參數(shù)解析出錯(比如必須是數(shù)字,但是輸入的是非數(shù)字字符串; 或者長度過長,etc.) | 400 | COEXISTENCE_ARGUMENTS | 同時傳入了要求是二選一或多選一的參數(shù)。如有特殊說明則不返回此錯誤。 | 413 | Request Entity Too Large | 客戶發(fā)送的請求大小超過了2MB限制。該錯誤的返回格式為純文本,不是json格式。 | 404 | API_NOT_FOUND | 所調(diào)用的API不存在。 | 500 | INTERNAL_ERROR | 服務(wù)器內(nèi)部錯誤,當(dāng)此類錯誤發(fā)生時請再次請求,如果持續(xù)出現(xiàn)此類錯誤,請及時聯(lián)系技術(shù)支持團(tuán)隊。 |
調(diào)用示例 curl -X POST "https://api-cn.faceplusplus點com/facepp/v3/detect" -F "api_key=<api_key>" \ -F "api_secret=<api_secret>" \ -F "image_file=@image_file.jpg" \ -F "return_landmark=1" \ -F "return_attributes=gender,age"
4.face++的Compare API 版本 3.0 描述 將兩個人臉進(jìn)行比對,來判斷是否為同一個人。支持傳兩張圖片進(jìn)行比對,或者一張圖片與一個已知的face_token比對,也支持兩個face_token進(jìn)行比對。使用圖片進(jìn)行比對時會選取圖片中檢測到人臉尺寸最大的一個人臉。 圖片要求 圖片格式:JPG(JPEG),PNG
圖片像素尺寸:最小48*48像素,最大4096*4096像素
圖片文件大。2MB
最小人臉像素尺寸: 系統(tǒng)能夠檢測到的人臉框為一個正方形,正方形邊長的最小值為150像素。 更新日志 2017年3月28日:支持base64編碼的圖片。 調(diào)用URL https://api-cn.faceplusplus點com/facepp/v3/compare 調(diào)用方法 POST 權(quán)限 不需要單獨申請權(quán)限。 請求參數(shù) 是否必選 | 參數(shù)名 | 類型 | 參數(shù)說明 | 必選 | api_key | String | 調(diào)用此API的API Key | 必選 | api_secret | String | 調(diào)用此API的API Secret | 必選(四選一) | face_token1 | String | 第一個人臉標(biāo)識face_token,優(yōu)先使用本參數(shù)。 | image_url1 | String | 第一張圖片的URL | image_file1 | File | 第一張圖片,二進(jìn)制文件,需要用post multipart/form-data的方式上傳。 | image_base64_1 | String | base64編碼的二進(jìn)制圖片數(shù)據(jù) 如果同時傳入了image_url1、image_file1和image_base64_1參數(shù),本API使用順序為image_file1優(yōu)先,image_url1最低。 | 必選(四選一) | face_token2 | String | 第二個人臉標(biāo)識face_token,優(yōu)先使用本參數(shù)。 | image_url2 | String | 第二張圖片的URL | image_file2 | File | 第二張圖片,二進(jìn)制文件,需要用post multipart/form-data的方式上傳。 | image_base64_2 | String | base64編碼的二進(jìn)制圖片數(shù)據(jù) 如果同時傳入了image_url2、image_file2和image_base64_2參數(shù),本API使用順序為image_file2優(yōu)先,image_url2最低。 |
返回值說明 字段 | 類型 | 說明 | request_id | String | 用于區(qū)分每一次請求的唯一的字符串。 | confidence | Float | 比對結(jié)果置信度,范圍 [0,100],小數(shù)點后3位有效數(shù)字,數(shù)字越大表示兩個人臉越可能是同一個人。 注:如果傳入圖片但圖片中未檢測到人臉,則無法進(jìn)行比對,本字段不返回。 | thresholds | Object | 一組用于參考的置信度閾值,Object類型,包含三個字段,均為Float類型、取值[0,100],小數(shù)點后3位有效數(shù)字。如果置信值低于“千分之一”閾值則不建議認(rèn)為是同一個人,如果置信值超過“十萬分之一”閾值,則是同一個人的幾率非常高。 1e-3: 誤識率為千分之一的置信度閾值; 1e-4: 誤識率為萬分之一的置信度閾值; 1e-5: 誤識率為十萬分之一的置信度閾值; 請注意:閾值不是靜態(tài)的,每次比對返回的閾值不保證相同,所以沒有持久化保存閾值的必要,更不要將當(dāng)前調(diào)用返回的confidence與之前調(diào)用返回的閾值比較。 注:如果傳入圖片但圖片中未檢測到人臉,則無法進(jìn)行比對,本字段不返回。 | image_id1 | String | 被檢測的image_url1、image_file1或image_base64_1在系統(tǒng)中的標(biāo)識。 注:如果未使用image_url1、image_file1或image_base64_1傳入圖片,本字段不返回。 | image_id2 | String | 被檢測的image_url2、image_file2或image_base64_2在系統(tǒng)中的標(biāo)識。 注:如果未使用image_url2、image_file2或image_base64_2傳入圖片,本字段不返回。 | faces1 | Array | 從image_url1、image_file1或image_base64_1中檢測出的人臉數(shù)組,采用數(shù)組中的第一個人臉進(jìn)行人臉比對。 注:如果未使用image_url1、image_file1或image_base64_1傳入圖片,本字段不返回。如果沒有檢測出人臉則為空數(shù)組 | faces2 | Array | 從image_url2、image_file2或image_base64_2中檢測出的人臉數(shù)組,采用數(shù)組中的第一個人臉進(jìn)行人臉比對。 注:如果未使用image_url2、image_file2或image_base64_2傳入圖片,本字段不返回。如果沒有檢測出人臉則為空數(shù)組 | time_used | Int | 整個請求所花費的時間,單位為毫秒。 | error_message | String | 當(dāng)請求失敗時才會返回此字符串,具體返回內(nèi)容見后續(xù)錯誤信息章節(jié)。否則此字段不存在。 |
faces1和faces2數(shù)組中單個元素的結(jié)構(gòu) [td]字段 | 類型 | 說明 | face_token | String | 人臉的標(biāo)識 | face_rectangle | Object | 人臉矩形框,坐標(biāo)數(shù)字為整數(shù),代表像素點坐標(biāo) top:左上角縱坐標(biāo) left:左上角橫坐標(biāo) width:寬度 height:高度 |
收費規(guī)則 當(dāng)傳入2個face_token進(jìn)行比對時,收取人臉比對費用。 當(dāng)傳入圖片進(jìn)行比對時,收取人臉檢測費用,如果同時傳入2張圖片收取2次人臉檢測費用。當(dāng)傳入圖片都檢測到人臉的情況下,進(jìn)行人臉比對,收取人臉比對費用。 當(dāng)傳入圖片未檢測出人臉,無法進(jìn)行人臉比對時,只收取人臉檢測費用,不收取人臉比對費用。 返回值示例 成功請求返回值示例: { "time_used": 473, "confidence": 96.46, "thresholds": { "1e-3": 65.3, "1e-5": 76.5, "1e-4": 71.8 }, "request_id": "1469761507,07174361-027c-46e1-811f-ba0909760b18" }
失敗請求返回值示例: { "time_used": 5, "error_message": "INVALID_FACE_TOKEN:c2fc0ad7c8da3af5a34b9c70ff764da0", "request_id": "1469761051,ec285c20-8660-47d3-8b91-5dc2bffa0049" }
當(dāng)前API特有的ERROR_MESSAGE HTTP狀態(tài)代碼 | 錯誤信息 | 說明 | 400 | INVALID_FACE_TOKEN: <face_token> | 使用face_token作為參數(shù)時,所傳的face_token不存在。 | 400 | IMAGE_ERROR_UNSUPPORTED_FORMAT: <param> | 參數(shù)<param>對應(yīng)的圖像無法正確解析,有可能不是一個圖像文件、或有數(shù)據(jù)破損。 | 400 | INVALID_IMAGE_SIZE: <param> | 參數(shù)<param>對應(yīng)的客戶上傳的圖像像素尺寸太大或太小,圖片要求請參照本API描述。<param>對應(yīng)圖像太大的那個參數(shù)的名稱 | 400 | INVALID_IMAGE_URL: <param> | 無法從參數(shù)<param>對應(yīng)的image_url下載圖片,圖片URL錯誤或者無效 | 412 | IMAGE_DOWNLOAD_TIMEOUT: <param> | 下載圖片超時 |
通用的ERROR_MESSAGE HTTP 狀態(tài)代碼 | 錯誤信息 | 說明 | 401 | AUTHENTICATION_ERROR | api_key和api_secret不匹配。 | 403 | AUTHORIZATION_ERROR: <reason> | api_key沒有調(diào)用本API的權(quán)限,具體原因為:用戶自己禁止該api_key調(diào)用、管理員禁止該api_key調(diào)用、由于賬戶余額不足禁止調(diào)用。 目前的<reason>有: - Denied by Client(用戶自己禁止該api_key調(diào)用)
- Denied by Admin(管理員禁止該api_key調(diào)用)
- Insufficient Account Balance(由于賬戶余額不足禁止調(diào)用)
| 403 | CONCURRENCY_LIMIT_EXCEEDED | 并發(fā)數(shù)超過限制。 | 400 | MISSING_ARGUMENTS: <key> | 缺少某個必選參數(shù)。 | 400 | BAD_ARGUMENTS: <key> | 某個參數(shù)解析出錯(比如必須是數(shù)字,但是輸入的是非數(shù)字字符串; 或者長度過長,etc.) | 400 | COEXISTENCE_ARGUMENTS | 同時傳入了要求是二選一或多選一的參數(shù)。如有特殊說明則不返回此錯誤。 | 413 | Request Entity Too Large | 客戶發(fā)送的請求大小超過了2MB限制。該錯誤的返回格式為純文本,不是json格式。 | 404 | API_NOT_FOUND | 所調(diào)用的API不存在。 | 500 | INTERNAL_ERROR | 服務(wù)器內(nèi)部錯誤,當(dāng)此類錯誤發(fā)生時請再次請求,如果持續(xù)出現(xiàn)此類錯誤,請及時聯(lián)系技術(shù)支持團(tuán)隊。 |
調(diào)用示例 curl -X POST "https://api-cn.faceplusplus點com/facepp/v3/compare" \ -F "api_key=<api_key>" \ -F "api_secret=<api_secret>" \ -F "face_token1=c2fc0ad7c8da3af5a34b9c70ff764da0" \ -F "face_token2=ad248a809408b6320485ab4de13fe6a9"
本人初學(xué),僅供參考,存在錯誤和不足之處,請大家回帖多多指教,切勿照搬
以上圖文的Word格式文檔下載(內(nèi)容和本網(wǎng)頁上的一模一樣,方便大家保存):
嵌入式綜合實踐-組.docx
(1.27 MB, 下載次數(shù): 146)
2017-12-27 08:13 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|