1. 程式人生 > >Python呼叫Face++人臉檢測API

Python呼叫Face++人臉檢測API

1.緣起

機緣巧合,去年加了個計算機視覺的QQ群,現在趕上校招,偶然看見了曠視的公告。多虧南京研發中心的魏秀參博士推薦,再投遞簡歷的第二天就收到了面試通知,後天面試曠視科技。瞭解一家公司的辦法之一就是使用這家公司的產品,於是利用午休的時間申請了個開發者賬號,然後體驗了一把Face++的API,真的好強。

2.鋪墊

怎麼申請就不多說了,就是註冊個賬號那麼簡單。介面使用的是HTTP協議,各種平臺各種語言只要能解析HTTP,就能使用。金鑰有一對,公鑰和私鑰。下面我使用在Pycharm的IDE裡,使用Python的request和opencv來進行試驗。

3.配置opencv

很簡單,把opencv\build\python\2.7\x64\cv2.pyd這個檔案拷貝到C:\Python27\Lib\site-packages資料夾下即可。



4.程式碼

# -*- coding: utf-8 -*-
import urllib2
import urllib
import ssl
import time
import cv2
http_url='https://api-cn.faceplusplus.com/facepp/v3/detect'
key = "89W9C9NTm0Je9BBGZbro2fmnit41ajT7"
secret = "j0dCqm5hwKcNy1xhu0z1XIO1hFix4LzP"
filepath = r"./they.jpg"
boundary = '----------%s' % hex(int(time.time() * 1000))
data = []
data.append('--%s' % boundary)
data.append('Content-Disposition: form-data; name="%s"\r\n' % 'api_key')
data.append(key)
data.append('--%s' % boundary)
data.append('Content-Disposition: form-data; name="%s"\r\n' % 'api_secret')
data.append(secret)
data.append('--%s' % boundary)
fr=open(filepath,'rb')
data.append('Content-Disposition: form-data; name="%s"; filename=" "' % 'image_file')
data.append('Content-Type: %s\r\n' % 'application/octet-stream')
data.append(fr.read())
fr.close()
data.append('--%s--\r\n' % boundary)
img  = cv2.imread('they.jpg')
cv2.imshow('img1',img)
http_body='\r\n'.join(data)
#buld http request
req=urllib2.Request(http_url)
#header
req.add_header('Content-Type', 'multipart/form-data; boundary=%s' % boundary)
req.add_data(http_body)
try:
    # req.add_header('Referer','http://remotserver.com/')
    context = ssl._create_unverified_context()
    resp = urllib2.urlopen(req, timeout=5, context=context)
    # get response
    qrcont = resp.read()
    print qrcont
    dict = eval(qrcont)
    faces = dict['faces']
    print len(faces)
    for i in range(len(faces)):
        face_rectangle = faces[i]['face_rectangle']
        width = face_rectangle['width']
        top = face_rectangle['top']
        left = face_rectangle['left']
        height = face_rectangle['height']
        start = (left, top)
        end = (left + width, top + height)
        color = (55, 255, 155)
        thickness = 3
        cv2.rectangle(img, start, end, color, thickness)
    cv2.namedWindow("img2")
    cv2.imshow("img2", img)

    cv2.waitKey(0)
    cv2.destroyAllWindows()
except urllib2.HTTPError as e:
    print e.read()


5.執行結果


6.可能會踩的坑

face++官方是給了Python呼叫的例子的,但是Python升級到 2.7.9 之後引入了一個新特性,當使用urllib.urlopen開啟一個 https 連結時,會驗證一次 SSL 證書。所以很可能在

resp = urllib2.urlopen(req, timeout=5)
的時候,出現sll證書認證失敗的情況。
URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
這個時候有兩種解決辦法 1. 使用ssl建立未經驗證的上下文,在urlopen中傳入上下文引數 import ssl
import urllib2

context = ssl._create_unverified_context() resp = urllib2.urlopen(req, timeout=5, context=context)

2. 全域性取消證書驗證

import sslimport urllib2 ssl._create_default_https_context = ssl._create_unverified_context