本文要介紹微軟辨識服務的Face API,可以偵測照片中的臉孔以及相關參數,包含年齡、性別、情緒、眼鏡、鬍子以及五官座標等。
| 作者/攝影 | 曾吉弘 |
| 時間 | 3小時 |
| 成本 | 無 |
| 難度 | * * * * * |
| 材料表 |
|
本範例修改自微軟辨識服務Face API教學而來,您也可以在該頁面找到其他程式語言的教學。
微軟辨識服務
根據官方網站說法:Microsoft 辨識服務具備多種程式語言的API,可以透過自然的溝通方式看、聽、說,以及理解和解讀各種媒體素材,包然文字、語音、照片、影片與搜尋建議等等。分成五大類,每項又各自分成不同細項,本範例將使用辨識下的臉部API:
- 辨識
- 語音
- 語言
- 知識
- 搜尋
註冊Face API
- 註冊帳號是一定要的,請到MS辨識服務首頁 https://azure.microsoft.com/zh-tw/services/cognitive-services/
註冊一個新的帳號,需要手機號碼認證與信用卡認證…
- 這些步驟完成之後選擇您要的API,即可取得金鑰(subscription key),每一個API各自會有自己的流量與次數限制,請注意。
- 下圖是 Face API 的兩組金鑰,使用任何一組都可以
在其頁面就可以看到效果,有一些範例圖片或者您可以自行上傳照片,右側就是偵測結果,格式是JSON,各主要程式語言對於JSON都有現成的函式庫來爬取。
範例程式
本範例是修改自 Face API 的 python 範例程式而來,使用 python 2.7。本範例會使用一張網路圖片(#37)送到 Face API之後取得其辨識結果。
程式#33可指定我們所要偵測的臉孔參數,包含以下:
- age:年齡
- gender:性別
- headPose:頭部姿態,回傳XYZ軸傾斜狀態
- smile:微笑(0~1之間小數,數字愈高代表微笑愈明顯)
- facialHair:臉部髮型,例如山羊鬍、八字鬍、鬢角
- glasses:偵測有無戴眼鏡
- emotion:情緒,包含生氣、滿足、害怕、驚訝與悲傷等等
- hair:髮型,包含禿頭、髮色等等
- makeup:偵測是否化妝
- occlusion:偵測是否閉合,例如眼睛、嘴巴
- accessories:配件
- blur:偵測圖片是否模糊,以及模糊程度參數
- exposure:偵測圖片曝光程度與曝光程參數
- noise:偵測圖片中雜訊與雜訊程度參數
在此用到的圖片是這位可愛的女生,您可以換成其他的圖片來測試
[pastacode lang=”markup” manual=”import%20httplib%2C%20urllib%2C%20base64%2C%20json%0A%0A%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%0A%23%23%23%23%20Update%20or%20verify%20the%20following%20values.%20%23%23%23%0A%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%0A%0A%23%20Replace%20the%20subscription_key%20string%20value%20with%20your%20valid%20subscription%20key.%0Asubscription_key%20%3D%20’XXXX’%20%20%20%23%E5%A1%AB%E5%85%A5Face%20API%E9%87%91%E9%91%B0%EF%BC%8C%E4%BB%BB%E4%B8%80%E7%B5%84%E9%83%BD%E5%8F%AF%E4%BB%A5%0A%0A%23%20Replace%20or%20verify%20the%20region.%0A%23%0A%23%20You%20must%20use%20the%20same%20region%20in%20your%20REST%20API%20call%20as%20you%20used%20to%20obtain%20your%20subscription%20keys.%0A%23%20For%20example%2C%20if%20you%20obtained%20your%20subscription%20keys%20from%20the%20westus%20region%2C%20replace%20%0A%23%20%22westcentralus%22%20in%20the%20URI%20below%20with%20%22westus%22.%0A%23%0A%23%20NOTE%3A%20Free%20trial%20subscription%20keys%20are%20generated%20in%20the%20westcentralus%20region%2C%20so%20if%20you%20are%20using%0A%23%20a%20free%20trial%20subscription%20key%2C%20you%20should%20not%20need%20to%20change%20this%20region.%0Auri_base%20%3D%20’westcentralus.api.cognitive.microsoft.com’%0A%0A%23%20Request%20headers.%0Aheaders%20%3D%20%7B%0A%20%20%20%20’Content-Type’%3A%20’application%2Fjson’%2C%0A%20%20%20%20’Ocp-Apim-Subscription-Key’%3A%20subscription_key%2C%0A%7D%0A%0A%23%20Request%20parameters.%0Aparams%20%3D%20urllib.urlencode(%7B%0A%20%20%20%20’returnFaceId’%3A%20’true’%2C%0A%20%20%20%20’returnFaceLandmarks’%3A%20’false’%2C%0A%20%20%20%20’returnFaceAttributes’%3A%20’age%2Cgender%2CheadPose%2Csmile%2CfacialHair%2Cglasses%2Cemotion%2Chair%2Cmakeup%2Cocclusion%2Caccessories%2Cblur%2Cexposure%2Cnoise’%2C%0A%7D)%0A%0A%23%20The%20URL%20of%20a%20JPEG%20image%20to%20analyze.%0Abody%20%3D%20%22%7B’url’%3A’https%3A%2F%2Fhow-old.net%2FImages%2Ffaces2%2Fmain0011.jpg’%7D%22%0A%0Atry%3A%0A%20%20%20%20%23%20Execute%20the%20REST%20API%20call%20and%20get%20the%20response.%0A%20%20%20%20conn%20%3D%20httplib.HTTPSConnection(‘westcentralus.api.cognitive.microsoft.com’)%0A%20%20%20%20conn.request(%22POST%22%2C%20%22%2Fface%2Fv1.0%2Fdetect%3F%25s%22%20%25%20params%2C%20body%2C%20headers)%0A%20%20%20%20response%20%3D%20conn.getresponse()%0A%20%20%20%20data%20%3D%20response.read()%0A%0A%20%20%20%20%23%20’data’%20contains%20the%20JSON%20data.%20The%20following%20formats%20the%20JSON%20data%20for%20display.%0A%20%20%20%20parsed%20%3D%20json.loads(data)%0A%20%20%20%20print%20(%22Response%3A%22)%0A%20%20%20%20print%20(json.dumps(parsed%2C%20sort_keys%3DTrue%2C%20indent%3D2))%0A%20%20%20%20print%20parsed%5B0%5D%5B%22faceAttributes%22%5D%5B%22smile%22%5D%20%20%20%23%E7%AC%AC%E4%B8%80%E5%BC%B5%E8%87%89%E7%9A%84%20smile%20%E5%BC%B7%E5%BA%A6%0A%20%20%20%20conn.close()%0A%0Aexcept%20Exception%20as%20e%3A%0A%20%20%20%20print(%22%5BErrno%20%7B0%7D%5D%20%7B1%7D%22.format(e.errno%2C%20e.strerror))%0A” message=”” highlight=”” provider=”manual”/]
根據Face API,一張照片最多可以辨識到64張臉,但這樣真的太多了… 在基礎練習最好使用單一臉孔來測試。熟悉之後可以加入更多臉孔甚至連續偵測
執行結果如下,本範例就是把所有JSON結果顯示出來(#50),但為了後續微笑偵測,我們在#51獨立把smile的強度抓出來了,如下圖的 1.0:
print parsed[0][“faceAttributes”][“smile”] #取得第一張臉的 smile 強度
上圖可愛小妹妹的完整偵測JSON結果如下,您可以慢慢檢視:
[pastacode lang=”markup” manual=”%5B%0A%20%20%7B%0A%20%20%20%20%22faceAttributes%22%3A%20%7B%0A%20%20%20%20%20%20%22accessories%22%3A%20%5B%5D%2C%20%0A%20%20%20%20%20%20%22age%22%3A%2021.6%2C%20%0A%20%20%20%20%20%20%22blur%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%22blurLevel%22%3A%20%22low%22%2C%20%0A%20%20%20%20%20%20%20%20%22value%22%3A%200.1%0A%20%20%20%20%20%20%7D%2C%20%0A%20%20%20%20%20%20%22emotion%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%22anger%22%3A%200.0%2C%20%0A%20%20%20%20%20%20%20%20%22contempt%22%3A%200.0%2C%20%0A%20%20%20%20%20%20%20%20%22disgust%22%3A%200.0%2C%20%0A%20%20%20%20%20%20%20%20%22fear%22%3A%200.0%2C%20%0A%20%20%20%20%20%20%20%20%22happiness%22%3A%201.0%2C%20%0A%20%20%20%20%20%20%20%20%22neutral%22%3A%200.0%2C%20%0A%20%20%20%20%20%20%20%20%22sadness%22%3A%200.0%2C%20%0A%20%20%20%20%20%20%20%20%22surprise%22%3A%200.0%0A%20%20%20%20%20%20%7D%2C%20%0A%20%20%20%20%20%20%22exposure%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%22exposureLevel%22%3A%20%22goodExposure%22%2C%20%0A%20%20%20%20%20%20%20%20%22value%22%3A%200.73%0A%20%20%20%20%20%20%7D%2C%20%0A%20%20%20%20%20%20%22facialHair%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%22beard%22%3A%200.0%2C%20%0A%20%20%20%20%20%20%20%20%22moustache%22%3A%200.0%2C%20%0A%20%20%20%20%20%20%20%20%22sideburns%22%3A%200.0%0A%20%20%20%20%20%20%7D%2C%20%0A%20%20%20%20%20%20%22gender%22%3A%20%22female%22%2C%20%0A%20%20%20%20%20%20%22glasses%22%3A%20%22NoGlasses%22%2C%20%0A%20%20%20%20%20%20%22hair%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%22bald%22%3A%200.03%2C%20%0A%20%20%20%20%20%20%20%20%22hairColor%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22color%22%3A%20%22brown%22%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%22confidence%22%3A%201.0%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%20%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22color%22%3A%20%22black%22%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%22confidence%22%3A%200.77%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%20%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22color%22%3A%20%22other%22%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%22confidence%22%3A%200.46%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%20%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22color%22%3A%20%22red%22%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%22confidence%22%3A%200.2%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%20%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22color%22%3A%20%22blond%22%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%22confidence%22%3A%200.06%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%20%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22color%22%3A%20%22gray%22%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%22confidence%22%3A%200.02%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%5D%2C%20%0A%20%20%20%20%20%20%20%20%22invisible%22%3A%20false%0A%20%20%20%20%20%20%7D%2C%20%0A%20%20%20%20%20%20%22headPose%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%22pitch%22%3A%200.0%2C%20%0A%20%20%20%20%20%20%20%20%22roll%22%3A%20-11.5%2C%20%0A%20%20%20%20%20%20%20%20%22yaw%22%3A%20-5.6%0A%20%20%20%20%20%20%7D%2C%20%0A%20%20%20%20%20%20%22makeup%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%22eyeMakeup%22%3A%20true%2C%20%0A%20%20%20%20%20%20%20%20%22lipMakeup%22%3A%20true%0A%20%20%20%20%20%20%7D%2C%20%0A%20%20%20%20%20%20%22noise%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%22noiseLevel%22%3A%20%22low%22%2C%20%0A%20%20%20%20%20%20%20%20%22value%22%3A%200.08%0A%20%20%20%20%20%20%7D%2C%20%0A%20%20%20%20%20%20%22occlusion%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%22eyeOccluded%22%3A%20false%2C%20%0A%20%20%20%20%20%20%20%20%22foreheadOccluded%22%3A%20false%2C%20%0A%20%20%20%20%20%20%20%20%22mouthOccluded%22%3A%20false%0A%20%20%20%20%20%20%7D%2C%20%0A%20%20%20%20%20%20%22smile%22%3A%201.0%0A%20%20%20%20%7D%2C%20%0A%20%20%20%20%22faceId%22%3A%20%22d87447bd-a4b3-4c87-b92d-736871e8e6d9%22%2C%20%0A%20%20%20%20%22faceRectangle%22%3A%20%7B%0A%20%20%20%20%20%20%22height%22%3A%20166%2C%20%0A%20%20%20%20%20%20%22left%22%3A%20175%2C%20%0A%20%20%20%20%20%20%22top%22%3A%20197%2C%20%0A%20%20%20%20%20%20%22width%22%3A%20166%0A%20%20%20%20%7D%0A%20%20%7D%0A%5D%0A1.0%20%20%20%23%E7%8D%A8%E7%AB%8B%E6%8A%93%E5%87%BA%E4%BE%86%E7%9A%84%20smile%20%E5%BC%B7%E5%BA%A6%0A” message=”” highlight=”” provider=”manual”/]您可以使用 jsoneditoronline.org 來檢視 json 結構,會比直接看原始資料來的清楚明暸。
pyfirmata
取得臉孔資訊之後就有很多東西可以玩了,例如本範例的微笑偵測器。或是找找看畫面中誰有戴眼鏡。如果是連續偵測的話,還能做到讓攝影鏡頭跟著你的臉孔中心移動(PTZ平台),總之太多應用啦!
pyfirmata 是python透過序列埠來與Arduino溝通的模組,Arduino端只要上傳(請先確認)StandardFirmata 這個程式就可以了,安裝完成請關閉Arduino IDE,後續用不到了~
請在 terminal 中使用以下指令來安裝 pyfirmata
pip install pyfirmata
Arduino端設定
python透過序列埠控制Arduino LED
本範例就是 python 版的 LED 閃爍,您可以比較一下兩者的差異,您只要確定COM port 邊與您電腦上的一致即可。如果是 MAC/ Linux,應該是 /dev/ttyUSB0 這樣的東西。如果是 Raspberry Pi 則應該是 /dev/ttyACM0
[pastacode lang=”markup” manual=”%23!%2Fusr%2Fbin%2Fpython%0A%20%0Aimport%20pyfirmata%0Aimport%20time%0Apin%20%3D%2013%0Aport%20%3D%20’COM5’%0Aboard%20%3D%20pyfirmata.Arduino(port)%20%20%20%23%E5%B0%8D%E6%8C%87%E5%AE%9A%E5%BA%8F%E5%88%97%E5%9F%A0%E9%96%8B%E5%95%9F%E9%80%9A%E8%A8%8A%0Awhile%20True%3A%0A%20%20%20%20%09board.digital%5Bpin%5D.write(1)%20%20%23%E8%A8%AD%E5%AE%9A%E6%8C%87%E5%AE%9A%E8%85%B3%E4%BD%8D%E9%AB%98%E9%9B%BB%E4%BD%8D%0A%20%20%20%20%09time.sleep(1)%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%E7%AD%89%E5%80%991%E7%A7%92%0A%20%20%20%20%09print%20%22ON%20%3A%20%25s%22%20%25%20time.ctime()%20%20%23%E9%A1%AF%E7%A4%BA%E7%9B%B8%E9%97%9C%E8%A8%8A%E6%81%AF%E8%88%87%E6%99%82%E9%96%93%0A%20%20%20%20%09board.digital%5Bpin%5D.write(0)%0A%20%20%20%20%09time.sleep(1)%0A%20%20%20%20%09print%20%22OFF%20%3A%20%25s%22%20%25%20time.ctime()%0A” message=”” highlight=”” provider=”manual”/]執行畫面如下圖,除了Arduino的 D13 會亮暗之外,在console上也有對應的訊息
Python結合Arduino微笑偵測應用
來看一下綜合運用吧!本範例會根據畫面中臉孔的微笑程度來決定LED亮起的數目。
[pastacode lang=”markup” manual=”import%20httplib%2C%20urllib%2C%20base64%2C%20json%2C%20pyfirmata%0Afrom%20time%20import%20sleep%0Aport%20%3D%20’COM5’%0A%0A%23%20Replace%20the%20subscription_key%20string%20value%20with%20your%20valid%20subscription%20key.%0Asubscription_key%20%3D%20’XXX’%20%20%20%23%E5%A1%AB%E5%85%A5Face%20API%E9%87%91%E9%91%B0%EF%BC%8C%E4%BB%BB%E4%B8%80%E7%B5%84%E9%83%BD%E5%8F%AF%E4%BB%A5%0A%0A%23%20NOTE%3A%20Free%20trial%20subscription%20keys%20are%20generated%20in%20the%20westcentralus%20region%2C%20so%20if%20you%20are%20using%0A%23%20a%20free%20trial%20subscription%20key%2C%20you%20should%20not%20need%20to%20change%20this%20region.%0Auri_base%20%3D%20’westcentralus.api.cognitive.microsoft.com’%0A%0A%23%20Request%20headers.%0Aheaders%20%3D%20%7B%0A%20%20%20%20’Content-Type’%3A%20’application%2Fjson’%2C%0A%20%20%20%20’Ocp-Apim-Subscription-Key’%3A%20subscription_key%2C%0A%7D%0A%0A%23%20Request%20parameters.%0Aparams%20%3D%20urllib.urlencode(%7B%0A%20%20%20%20’returnFaceId’%3A%20’true’%2C%0A%20%20%20%20’returnFaceLandmarks’%3A%20’false’%2C%0A%20%20%20%20’returnFaceAttributes’%3A%20’age%2Cgender%2Csmile%2Cemotion%2Cocclusion%2Caccessories%2Cexposure%2Cnoise’%2C%0A%20%20%20%20%23’returnFaceAttributes’%3A%20’age%2Cgender%2CheadPose%2Csmile%2CfacialHair%2Cglasses%2Cemotion%2Chair%2Cmakeup%2Cocclusion%2Caccessories%2Cblur%2Cexposure%2Cnoise’%2C%0A%7D)%0A%0A%23%20The%20URL%20of%20a%20JPEG%20image%20to%20analyze.%0Abody%20%3D%20%22%7B’url’%3A’https%3A%2F%2Fhow-old.net%2FImages%2Ffaces2%2Fmain002.jpg’%7D%22%0A%0A%23connect%20Arduino%0Aboard%20%3D%20pyfirmata.Arduino(port)%20%20%20%20%23%E5%B0%8D%E6%8C%87%E5%AE%9A%E5%BA%8F%E5%88%97%E5%9F%A0%E9%96%8B%E5%95%9F%E9%80%A3%E7%B7%9A%0Asleep(3)%20%20%20%20%20%20%23%E7%AD%89%E5%80%993%E7%A7%92%E4%BE%86%E9%96%8B%E5%95%9F%E5%BA%8F%E5%88%97%E9%80%A3%E7%B7%9A%0A%0Atry%3A%0A%20%20%20%20%23%20Execute%20the%20REST%20API%20call%20and%20get%20the%20response.%0A%20%20%20%20conn%20%3D%20httplib.HTTPSConnection(‘westcentralus.api.cognitive.microsoft.com’)%0A%20%20%20%20conn.request(%22POST%22%2C%20%22%2Fface%2Fv1.0%2Fdetect%3F%25s%22%20%25%20params%2C%20body%2C%20headers)%0A%20%20%20%20response%20%3D%20conn.getresponse()%0A%20%20%20%20data%20%3D%20response.read()%0A%20%20%20%20%23%20’data’%20contains%20the%20JSON%20data.%20The%20following%20formats%20the%20JSON%20data%20for%20display.%0A%20%20%20%20parsed%20%3D%20json.loads(data)%0A%20%20%20%20print%20(%22Response%3A%22)%0A%20%20%20%20print%20(json.dumps(parsed%2C%20sort_keys%3DTrue%2C%20indent%3D2))%20%20%23%E9%A1%AF%E7%A4%BA%E6%89%80%E6%9C%89%E8%B3%87%E6%96%99%0A%20%20%20%20a%20%3D%20parsed%5B0%5D%5B%22faceAttributes%22%5D%5B%22smile%22%5D%20%20%20%23%E9%A1%AF%E7%A4%BA%E5%BE%AE%E7%AC%91%E7%A8%8B%E5%BA%A6%0A%20%20%20%20conn.close()%0A%0Aexcept%20Exception%20as%20e%3A%0A%20%20%20%20print(%22%5BErrno%20%7B0%7D%5D%20%7B1%7D%22.format(e.errno%2C%20e.strerror))%0A%0Aprint%20%22smile%20value%20is%22%0Aprint%20a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%E9%A1%AF%E7%A4%BA%E5%BE%AE%E7%AC%91%E7%A8%8B%E5%BA%A6%0Aif%20a%20%3E%200.75%3A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%E4%BB%A5%E4%B8%8B%E5%88%86%E6%88%90%E4%B8%89%E5%80%8B%E5%8D%80%E9%96%93%E4%BE%86%E6%8E%A7%E5%88%B6LED%EF%BC%8C%E6%82%A8%E5%8F%AF%E4%BB%A5%E8%87%AA%E8%A1%8C%E4%BF%AE%E6%94%B9%0A%20%20%20%20board.digital%5B9%5D.write(1)%0A%20%20%20%20board.digital%5B10%5D.write(1)%0A%20%20%20%20board.digital%5B11%5D.write(1)%0A%20%20%20%20print%20111%0Aelif%20a%20%3C%200.25%3A%0A%20%20%20%20board.digital%5B9%5D.write(1)%0A%20%20%20%20board.digital%5B10%5D.write(0)%0A%20%20%20%20board.digital%5B11%5D.write(0)%0A%20%20%20%20print%20100%0Aelse%3A%0A%20%20%20%20board.digital%5B9%5D.write(1)%0A%20%20%20%20board.digital%5B10%5D.write(1)%0A%20%20%20%20board.digital%5B11%5D.write(0)%0A%20%20%20%20print%20110%0A” message=”” highlight=”” provider=”manual”/]
執行!
執行時,Moto GP 傳奇車手 Valentino Rossi~ https://moto7.tw/imgs/valentino-rossi-2015.jpg,也可以看到100代表只會亮起一個LED代表 Rossi 現在只有微笑或是沒表情。您可以切分更多條件或是修改Arduino端的呈現效果,一起來微笑吧!
延伸
請改用以下語法來將本機端圖檔上傳到FACE API來做辨識,請注意這個圖檔需要與 .py 放在同一個資料夾中,不然就需要指定絕對路徑。為了程式精簡,我們把 Arduino 端拿掉,您可以根據上續範例修改即可。
f = open(‘7688.jpg’, ‘rb’)
jpgdata = f.read()
f.close()
完整程式如下:
[pastacode lang=”markup” manual=”import%20httplib%2C%20urllib%2C%20base64%0Aimport%20json%0A%0Af%20%3D%20open(‘a006.jpg’%2C%20’rb’)%0Ajpgdata%20%3D%20f.read()%0Af.close()%0A%0A%23%20Request%20header%0Aheaders%20%3D%20%7B%0A%23%20Request%20headers%0A’Content-Type’%3A%20’application%2Foctet-stream’%2C%0A’Ocp-Apim-Subscription-Key’%3A%20’d3d138ceb1f4470286dcaba79f7d2de9’%2C%0A%7D%0A%0Aparams%20%3D%20urllib.urlencode(%7B%0A%23%20Request%20parameters%0A’returnFaceId’%3A%20’true’%2C%0A’returnFaceLandmarks’%3A%20’false’%2C%0A’returnFaceAttributes’%3A%20’age%2Cgender%2Csmile%2Cemotion%2Cglasses’%2C%0A%7D)%20%20%20%23%E5%8F%AA%E9%9C%80%E8%A6%81%E4%B8%8A%E8%BF%B0%E4%BA%94%E5%80%8B%E5%8F%83%E6%95%B8%0A%0A%0Abody%20%3D%20%7B%0A%7D%0A%0Atry%3A%0A%20%20%20%20conn%20%3D%20httplib.HTTPSConnection(‘api.projectoxford.ai’)%0A%20%20%20%20%23conn.request(%22POST%22%2C%20%22%2Fface%2Fv1.0%2Fdetect%3F%25s%22%20%25%20params%2C%20json.dumps(body)%2C%20headers)%0A%20%20%20%20conn.request(%22POST%22%2C%20%22%2Fface%2Fv1.0%2Fdetect%3F%25s%22%20%25%20params%2C%20jpgdata%2C%20headers)%0A%20%20%20%20response%20%3D%20conn.getresponse()%0A%20%20%20%20data%20%3D%20json.loads(response.read())%0A%20%20%20%20print(json.dumps(data%2C%20indent%3D2))%20%20%20%23%E9%A1%AF%E7%A4%BA%E6%89%80%E6%9C%89%E8%B3%87%E6%96%99%0A%20%20%20%20print%20data%5B0%5D%5B%22faceAttributes%22%5D%5B%22smile%22%5D%20%20%20%23%E9%A1%AF%E7%A4%BA%E5%BE%AE%E7%AC%91%E7%A8%8B%E5%BA%A6%0A%20%20%20%20conn.close()%0Aexcept%20Exception%20as%20e%3A%0A%20%20%20%20print(%22%5BErrno%20%7B0%7D%5D%20%7B1%7D%22.format(e.errno%2C%20e.strerror))%0A” message=”” highlight=”” provider=”manual”/]
相關文章:
-
[App Inventor教學] 上傳照片到微軟辨識服務Computer Vision API,使用 Makeblock CamVision
-
[微軟辨識服務] 串流影像之臉孔與年齡辨識(使用LinkIt 7688)














