Python呼叫Face++人臉檢測API
阿新 • • 發佈:2019-01-01
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
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