1. 程式人生 > >【物聯網實訓專案】------(七)家庭智慧安防系統之人臉驗證

【物聯網實訓專案】------(七)家庭智慧安防系統之人臉驗證

主要是使用OpenCV和Python進行人臉面部的檢測。

1.在linux上安裝OpenCV等軟體

sudo apt-get update

sudo apt-get install  vim build-essential python-software-properties   

sudo apt-get install  python-opencv python-numpy python-scipy

sudo apt-get install  libopencv-dev  libopencv-contrib-dev

sudo apt-get install  python-picamera python-pil python-tk      

測試opencv的狀態

[email protected]:~$ python

Python 2.7.9 (default, Sep 17 2016, 20:26:04)

[GCC 4.9.2] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> import cv2

>>> print cv2.__version__

2.4.9.1

2.下載人臉檢測的Haar特徵分類器

  $ wget http://eclecti.cc/files/2008/03/haarcascade_frontalface_alt.xml

人臉的Haar特徵分類器就是一個XML檔案,該檔案會描述人臉的Haar的特徵值。Haar特徵的用途可不止可以用來描述人臉這一種,用來描述眼睛,嘴脣或是其它物體也是可以的。

當然OpenCV已經自帶了人臉的Haar特徵分類器。OpenCv安裝目錄中的\data\haarcascades目錄下的haarcascade_frontalface_alt.xml與haarcascade_frontalface_alt2.xml都是用來檢測人臉的Haar分類器。這個haarcascades目錄下還有人的全身,眼睛,嘴脣的Haar分類器。

3.檢查圖片中的人臉影象

(1)首先我們新建一個face目錄用來存放整個專案的資料和原始碼

(2)獲取原始影象

raspistill -o image.jpg

(3)對image.jpg原始影象進行人臉識別

jiance.py程式碼

import cv2



def detect(path):

    img = cv2.imread(path)

    cascade = cv2.CascadeClassifier("/home/pi/haarcascade_frontalface_alt.xml")

    rects = cascade.detectMultiScale(img, 1.3, 4, cv2.cv.CV_HAAR_SCALE_IMAGE, (20,20))



    if len(rects) == 0:

        return [], img

    rects[:, 2:] += rects[:, :2]

    return rects, img



def box(rects, img):

    for x1, y1, x2, y2 in rects:

        cv2.rectangle(img, (x1, y1), (x2, y2), (127, 255, 0), 2)

    cv2.imwrite('/home/pi/face/handle_data/image.jpg', img);



rects, img = detect("/home/pi/face/data/image.jpg")

box(rects, img)

(4)識別出的圖片儲存在handle_data中

4.對檢測出人臉的圖片進行裁剪,裁剪出人臉影象

(1)face.py程式碼

#-*-coding:utf8-*-

import os

import cv2

import time

import shutil



def getAllPath(dirpath, *suffix):

    PathArray = []

    for r, ds, fs in os.walk(dirpath):

        for fn in fs:

            if os.path.splitext(fn)[1] in suffix:

                fname = os.path.join(r, fn)

                PathArray.append(fname)

    return PathArray



#從源路徑中讀取所有圖片放入一個list,然後逐一進行檢查,把其中的臉扣下來,儲存到目標路徑中

def readPicSaveFace(sourcePath,targetPath,invalidPath,*suffix):

    try:

        ImagePaths=getAllPath(sourcePath, *suffix)



        #對list中圖片逐一進行檢查,找出其中的人臉然後寫到目標資料夾下

        count = 1

        # haarcascade_frontalface_alt.xml為庫訓練好的分類器檔案,下載opencv,安裝目錄中可找到

        face_cascade = cv2.CascadeClassifier('/home/pi/haarcascade_frontalface_alt.xml')

        for imagePath in ImagePaths:

            img = cv2.imread(imagePath)

            if type(img) != str:

                faces = face_cascade.detectMultiScale(img, 1.1, 5)

                if len(faces):

                    for (x, y, w, h) in faces:

                        # 設定人臉寬度大於128畫素,去除較小的人臉

                        if w>=128 and h>=128:

                            # 以時間戳和讀取的排序作為檔名稱

                            listStr = [str(int(time.time())), str(count)]

                            fileName = ''.join(listStr)

                            # 擴大圖片,可根據座標調整

                            X = int(x*1)

                            W = min(int((x + w)*1),img.shape[1])

                            Y = int(y*1)

                            H = min(int((y + h)*1),img.shape[0])



                            f = cv2.resize(img[Y:H, X:W], (W-X,H-Y))

                            cv2.imwrite(targetPath+os.sep+'%s.jpg' % fileName, f)

                            count += 1

                            print  imagePath + "have face"

                else:

                    shutil.move(imagePath, invalidPath)

    except IOError:

        print "Error"



    else:

        print 'Find '+str(count-1)+' faces to Destination '+targetPath



if __name__ == '__main__':

    invalidPath = r'/home/pi/face/haveNoPeople'

    sourcePath = r'/home/pi/face/data'

    targetPath = r'/home/pi/face/faceOfPeople'

    readPicSaveFace(sourcePath,targetPath,invalidPath,'.jpg','.JPG','png','PNG')

(2)裁剪出的人臉影象

5.在樹莓派上實現人臉識別驗證操作

在這裡我們利用Face++視覺服務平臺,將樹莓派作為硬體載體,使用Face++人臉識別雲平臺搭建一個人臉識別驗證的登入系統。

(1)face++的註冊與配置

首先登入face++的官方網站

點選右上角的註冊按鈕進入註冊介面,按步驟完成註冊資訊填寫並進行郵箱驗證。 在概覽介面可以看到快速開始欄,點選“填寫開發者資料”完善相關資料。之後按步驟進行API Key的建立,這是非常關鍵的一步。

其中型別一定要填寫試用,只有建立試用API Key才能使用 API 免費服務,並且一個使用者只能有一個免費API Key。免費服務是有一些限制的:

Face 儲存有上限:每個使用者使用免費服務只能建立 1000個 FaceSet,總計最多儲存 100 萬個人臉。

一個使用者只能有一個 API Key 使用免費服務,而且該 API Key 不能轉為正式 API Key。SDK 不提供免費使用或免費測試。

之後在應用管理-API Key介面就可以看到兩個非常關鍵的引數,API Key和API Secret,在所有的POST呼叫當中均需要這兩個引數。

(2)人臉識別的模組

文件中心https://console.faceplusplus.com.cn/documents/4888373

傳入圖片進行人臉檢測和人臉分析。

可以檢測圖片內的所有人臉,對於每個檢測出的人臉,會給出其唯一標識 face_token,可用於後續的人臉分析、人臉比對等操作。對於正式 API Key,支援指定圖片的某一區域進行人臉檢測。

如果您需要將檢測出的人臉用於後續的分析、比對等操作,建議將對應的 face_token 新增到 FaceSet 中。如果一個 face_token 在 72 小時內沒有存放在任一 FaceSet 中,則該 face_token 將會失效。

如果對同一張圖片進行多次人臉檢測,同一個人臉得到的 face_token 是不同的。

請求引數

是否必選

引數名

型別

引數說明

必選

api_key

String

呼叫此API的API Key

必選

api_secret

String

呼叫此API的API Secret

必選(三選一)

image_url

String

圖片的 URL。

注:在下載圖片時可能由於網路等原因導致下載圖片時間過長,建議使用 image_file 或 image_base64 引數直接上傳圖片。

image_file

File

一個圖片,二進位制檔案,需要用post multipart/form-data的方式上傳。

image_base64

String

base64 編碼的二進位制圖片資料

如果同時傳入了 image_url、image_file 和 image_base64 引數,本API使用順序為 image_file 優先,image_url 最低。

可選

return_landmark

Int

是否檢測並返回人臉關鍵點。合法值為:

檢測。返回 106 個人臉關鍵點。

1

檢測。返回 83 個人臉關鍵點。

0

不檢測

注:本引數預設值為 0

可選

return_attributes

String

是否檢測並返回根據人臉特徵判斷出的年齡、性別、情緒等屬性。合法值為:

none

不檢測屬性

  • gender
  • age
  • smiling
  • headpose
  • facequality
  • blur
  • eyestatus
  • emotion
  • ethnicity
  • beauty
  • mouthstatus
  • eyegaze
  • skinstatus

希望檢測並返回的屬性。

需要將屬性組成一個用逗號分隔的字串,屬性之間的順序沒有要求。

關於各屬性的詳細描述,參見下文“返回值”說明的 "attributes" 部分。

注:由於提供了 eyestatus,所以 glass 引數將被移除(計劃時間 2017-9-30),請儘快修改程式使用 eyestatus

注:本引數預設值為 none

可選(僅正式 API Key 可以使用)

calculate_all

Int

是否檢測並返回所有人臉的人臉關鍵點和人臉屬性。如果不使用此功能,則本 API 只會對人臉面積最大的五個人臉分析人臉關鍵點和人臉屬性。合法值為:

1

0

注:本引數預設值為 0

可選(僅正式 API Key 可以使用)

face_rectangle

String

是否指定人臉框位置進行人臉檢測。

如果此引數傳入值為空,或不傳入此引數,則不使用此功能。本 API 會自動檢測圖片內所有區域的所有人臉。

如果使用正式 API Key 對此引數傳入符合格式要求的值,則使用此功能。需要傳入一個字串代表人臉框位置,系統會根據此座標對框內的影象進行人臉檢測,以及人臉關鍵點和人臉屬性等後續操作。系統返回的人臉矩形框位置會與傳入的 face_rectangle 完全一致。對於此人臉框之外的區域,系統不會進行人臉檢測,也不會返回任何其他的人臉資訊。

引數規格:四個正整數,用逗號分隔,依次代表人臉框左上角縱座標(top),左上角橫座標(left),人臉框寬度(width),人臉框高度(height)。例如:70,80,100,100

程式碼face_token.py用來獲取圖片的face_token的值

#coding=utf8

import cv2

import requests

import json



url = 'https://api-cn.faceplusplus.com/facepp/v3/detect'

files = {'image_file':open('owner.jpg', 'rb')}

payload = {'api_key': '**填入你的api值***',

           'api_secret': '**填寫你的api值**',

           'return_landmark': 0,

           'return_attributes':'gender,age,glass'}



r = requests.post(url,files=files,data=payload)

data=json.loads(r.text)

print r.text

width = data['faces'][0]['face_rectangle']['width']

top = data['faces'][0]['face_rectangle']['top']

height = data['faces'][0]['face_rectangle']['height']

left = data['faces'][0]['face_rectangle']['left']



img = cv2.imread("owner.jpg")

vis = img.copy()

cv2.rectangle(vis, (left, top), (left+width, top+height),(0, 255, 0), 2)

cv2.imshow("Image", vis)

cv2.waitKey (0)

獲取的face_token值,需儲存,後續要用。

(3)人臉集合建立的模組

文件中心:https://console.faceplusplus.com.cn/documents/4888391

建立一個人臉的集合FaceSet,用於儲存人臉標識face_token。一個FaceSet能夠儲存1,000個face_token。

請求引數

是否必選

引數名

型別

引數說明

必選

api_key

String

呼叫此 API 的 API Key

必選

api_secret

String

呼叫此 API 的 API Secret

可選

display_name

String

人臉集合的名字,最長256個字元,不能包括字元^@,&=*'"

可選

outer_id

String

賬號下全域性唯一的 FaceSet 自定義標識,可以用來管理 FaceSet 物件。最長255個字元,不能包括字元^@,&=*'"

可選

tags

String

FaceSet 自定義標籤組成的字串,用來對 FaceSet 分組。最長255個字元,多個 tag 用逗號分隔,每個 tag 不能包括字元^@,&=*'"

可選

face_tokens

String

人臉標識 face_token,可以是一個或者多個,用逗號分隔。最多不超過5個 face_token

可選

user_data

String

自定義使用者資訊,不大於16 KB,不能包括字元^@,&=*'"

可選

force_merge

Int

在傳入 outer_id 的情況下,如果 outer_id 已經存在,是否將 face_token 加入已經存在的 FaceSet 中

0:不將 face_tokens 加入已存在的 FaceSet 中,直接返回 FACESET_EXIST 錯誤

1:將 face_tokens 加入已存在的 FaceSet 中

預設值為0

face_tokens.py所需的程式碼

#coding=utf8

import requests

url = 'https://api-cn.faceplusplus.com/facepp/v3/faceset/create'

payload = {'api_key': '***申請的值****',

           'api_secret': '***申請的值***',

           'display_name':'jiankong_lcz',

           'outer_id':'jiankong_lcz',

           'face_tokens':'上一步圖片的face_token的值'

           }

r = requests.post(url,data=payload)

print r.text

返回的faceset_token值,也需要儲存

(4)人臉搜尋對比模組

在Faceset中找出與目標人臉最相似的一張或多張人臉。支援傳入face_token或者直接傳入圖片進行人臉搜尋。使用圖片進行比對時會選取圖片中檢測到人臉尺寸最大的一個人臉。

請求引數

是否必選

引數名

型別

引數說明

必選

api_key

String

呼叫此 API 的 API Key

必選

api_secret

String

呼叫此 API 的 API Secret

必選(四選一)

face_token

String

進行搜尋的目標人臉的 face_token,優先使用該引數

image_url

String

目標人臉所在的圖片的 URL

image_file

File

目標人臉所在的圖片,二進位制檔案,需要用 post multipart/form-data 的方式上傳。

image_base64

String

base64 編碼的二進位制圖片資料

如果同時傳入了 image_url、image_file 和 image_base64 引數,本 API 使用順序為 image_file 優先,image_url 最低。

必選(二選一)

faceset_token

String

用來搜尋的 FaceSet 的標識

outer_id

String

使用者自定義的 FaceSet 標識

可選

return_result_count

Int

控制返回比對置信度最高的結果的數量。合法值為一個範圍 [1,5] 的整數。預設值為 1

可選(僅正式 API Key 可以使用)

face_rectangle

String

當傳入圖片進行人臉檢測時,是否指定人臉框位置進行檢測。

如果此引數傳入值為空,或不傳入此引數,則不使用此功能。本 API 會自動檢測圖片內所有區域的所有人臉。

如果使用正式 API Key 對此引數傳入符合格式要求的值,則使用此功能。需要傳入一個字串代表人臉框位置,系統會根據此座標對框內的影象進行人臉檢測,以及人臉關鍵點和人臉屬性等後續操作。系統返回的人臉矩形框位置會與傳入的 face_rectangle 完全一致。對於此人臉框之外的區域,系統不會進行人臉檢測,也不會返回任何其他的人臉資訊。

引數規格:四個正整數,用逗號分隔,依次代表人臉框左上角縱座標(top),左上角橫座標(left),人臉框寬度(width),人臉框高度(height)。例如:70,80,100,100

注:只有在傳入 image_url、image_file 和 image_base64 三個引數中任意一個時,本引數才生效。

distinguish.py所需的程式碼:

#coding=utf8

import cv2

import cv2.cv as cv

import requests

import json

import picamera

import os



camera=picamera.PiCamera()

camera.capture("current_photo.jpg")

filename='current_photo.jpg'



url = 'https://api-cn.faceplusplus.com/facepp/v3/search'

payload = {'api_key': '***填入你申請的key值****',

           'api_secret': '***填入你申請的key值****',

           'faceset_token':'**上一步你獲取對的faceset值**',

           }

files = {'image_file':open('current_photo.jpg', 'rb')}

r = requests.post(url,files=files,data=payload)

data=json.loads(r.text)

print r.text

if os.path.exists(filename):

    os.remove(filename)

if data["results"][0]["face_token"] == "***owner圖片的face_token值***" and data["results"][0]["confidence"]>=data["thresholds"]["1e-5"]:

    print'\n主人'

else:

    print '\n闖入者'

首先這個會呼叫樹莓派的攝像頭獲取當前影象,並截圖,截圖成功之後會將這張人臉圖片上傳至雲端進行對比並返回結果。

驗證結果:

相關推薦

聯網專案------家庭智慧系統人臉驗證

主要是使用OpenCV和Python進行人臉面部的檢測。 1.在linux上安裝OpenCV等軟體 sudo apt-get update sudo apt-get install  vim build-essential python-software-propert

聯網專案------家庭智慧系統智慧監控

1.Tomcat的操作 (1)tomcat2的安裝 sudo apt-get install apache2 (2)tomcat2的埠的修改 cd /etc/apache2 開啟埠配置檔案進行修改  vim ports.conf 將Listen的埠修改,這裡我修

Unity3D遊戲開發學習筆記上帝眼—第三人稱攝像機的簡單實現跟隨視角,自由視角

陸陸續續又開始更新自己的部落格,看來自我驅動能力還是不夠啊= =,廢話不多說了,之前的內容大概說了一下Unity的一些基礎知識,接下來我們將要對一些基本功能做一些學習。大家都知道,一個遊戲,少不了攝像機的參與(這不是廢話麼!沒攝像機怎麼玩!畫面都不呈現了好伐!)

SSM專案實戰--- 高併發秒殺系統DAO層

專案為慕課網上 搞定Java SSM框架開發的綜合案例–實現一個秒殺系統案例。 1.首先搭建專案 使用Maven構建來管理依賴項,pom.xml檔案: 此pom.xml可作為大多數ssm專案依賴的參考 <project xmlns="http:

專案銀行系統

main.cpp /*********************************************************** * 版權所有 (C)2015, Lingle * * 檔名稱: main.cpp * 檔案標識:無 * 內容摘要:主檔案。開啟銀行系

聯網雲端對接-4通過MQTT協議與百度雲進行雲端通信

src 發布 訂閱 操作 websocket 編寫 通用 頁面 開發 百度雲的天工物聯網服務目前包括:物接入、物解析、物管理、時序數據庫和規則引擎等5大部分,本篇文章僅介紹物接入。 天工物聯網的物接入,從開發者的角度來說相對有些復雜,需要多步操作才能實現一個雲設備的創建,

CC2530強化02普通延時函數實現按鍵的長按與短按

掃描 -- 技術 unsigned int 切換 pan code count 【CC2530強化實訓02】普通延時函數實現按鍵的長按與短按 【題目要求】 用一個按鍵實現單擊與雙擊的功能已經是很多嵌入式產品的常用手法。使用定時器的間隔定時來計算按鍵按下的時間是通用

CC2530強化03定時器間隔定時實現按鍵N連擊

eight -- del 周期 sta 通用 學院 處理 char 【CC2530強化實訓03】定時器間隔定時實現按鍵N連擊 【題目要求】 2018年全國職業院校技能大賽“物聯網技術應用”國賽(高職組)中關於感知層開發的難度陡然增大,三個題目均在Zigbee協議棧

CC2530強化03定時器間隔定時實現按鍵長按與短按

【題目要求】       雖然用普通的延時函式能夠實現按鍵長按與短按的判別,但是在實際的工程應用和專案開發中並不好用也不靈活。更多得是藉助定時器的間隔定時來計算按鍵從按下到鬆開的時間間隔,然後通過判斷該時間值來區分按鍵長按與短按的狀態。       在新大陸國賽裝置的黑色

聯網雲端對接-4通過MQTT協議與百度雲進行雲端通訊

百度雲的天工物聯網服務目前包括:物接入、物解析、物管理、時序資料庫和規則引擎等5大部分,本篇文章僅介紹物接入。天工物聯網的物接入,從開發者的角度來說相對有些複雜,需要多步操作才能實現一個雲裝置的建立,下面我們將詳細介紹一下相關的步驟:第一步:建立例項(類似工程中的專案概念)支

720科技springmvc-知識點彙總

關鍵詞:springmvc 常見知識點知識來源:720科技實訓課1.什麼是spring mvc?    Spring MVC基於模型-檢視-控制器模式實現.     M----Model 模型     V ----View  檢視     C----Controller

聯網雲端對接-1 通過HTTP協議與微軟Azure IoT hub進行雲端通訊

在2015年曾寫過一篇文章《從微軟build 2015,展望微軟未來發展》,提到了微軟的Azure和Windows 10 IoT,那算是初次接觸微軟物聯網技術。比較幸運的是在後續的時間裡,有幸和微軟相關部門進行了深入合作,對微軟的Azure雲及Windows 10 IoT有了

CC2530強化02普通延時函式實現按鍵的單擊與雙擊

【題目要求】       用一個按鍵實現單擊與雙擊的功能已經是很多嵌入式產品的常用手法。使用定時器的間隔定時來計算按鍵按下的時間是通用的做法,然而,使用普通的延時函式實現按鍵單擊與雙擊的區分也是一個快速的處理手段。按鍵SW1單擊的時候,切換D3燈的開關狀態;按鍵SW1雙擊的

ASP.NET Core快速入門準備CentOS和Nginx環境

正常 b- 進入 運行 ins 輸入 最小 我們 -128 基本軟件 VMware虛擬機 centos:http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1708.iso

ASP.NET Core快速入門在CentOS上安裝.NET Core運行時、部署到CentOS

ati libunwind serve code api cal 之前 prompt conn 下載.NET Core SDK 下載地址:https://www.microsoft.com/net/download/windows 第一步:Add the dotne

ASP.NET Core快速入門 RoutingMiddleware介紹以及MVC引入

pre configure onf mvc tin 常用 esp red 引入 前言 前面我們介紹了使用app.Map來配置路由,但是對於一般不是特別大的項目來說,我們不使用Map來進行路由配置。 配置路由 我們首先需要在Startup.cs文件中的Configu

vue開發問題-解決方法vue Element UI使用中.$scopedSlots.default is not a function 報錯

判斷 元素 技術分享 error: class 解決 nbsp AR peer 當使用elementUI中v-if來判斷顯示元素時,會報錯。 vue.js:600 [Vue warn]: Error in render: "TypeError: l.$scopedSl

vue開發問題-解決方法vue Element UI 日期選擇器獲取日期格式問題 t.getTime is not a function

format PE man UNC cti bubuko 圖片 orm ID 現有一表單需要填寫日期,采用了elementUI中日期選擇器,但是獲取到的數據格式是 Mon Jun 18 2018 00:00:00 GMT+0800 (中國標準時間) 而我需要的數

ASP.NET Core快速入門部署到IIS

圖片 cor .com servers 訪問 publish img 控制臺 -m 原文:【ASP.NET Core快速入門】(二)部署到IIS配置IIS模塊 ASP.NET Core Module載地址:https://docs.microsoft.com/en-us/

序列專一hdu薛貓貓1005思維

題目: Problem Description 小Z是一個專一的人,他希望能把一個序列裡面的數也能夠唯一(即元素之間各不相同)。因為序列剛開始可能會有重複的數,所以他需要進行一些操作。每次操作可從序列中取出兩個數x,y,把max(x+y-1,max(x,y)-min(x,y)+2)放入序