Tag Archives: microsoft

[微笑偵測器] 微軟辨識服務搭配Arduino

本文要介紹微軟辨識服務的Face API,可以偵測照片中的臉孔以及相關參數,包含年齡、性別、情緒、眼鏡、鬍子以及五官座標等。

作者/攝影 曾吉弘
時間  3小時
成本
難度 * * * * *
材料表
  • 個人電腦
  • Arduino Uno 或其他可執行 StandFirmata 之 Arduino相容板
  • LED x 3
  • 線材
  • 麵包板

本範例修改自微軟辨識服務Face API教學而來,您也可以在該頁面找到其他程式語言的教學。

微軟辨識服務

根據官方網站說法:Microsoft 辨識服務具備多種程式語言的API,可以透過自然的溝通方式看、聽、說,以及理解和解讀各種媒體素材,包然文字、語音、照片、影片與搜尋建議等等。分成五大類,每項又各自分成不同細項,本範例將使用辨識下的臉部API:

  1. 辨識
  2. 語音
  3. 語言
  4. 知識
  5. 搜尋

 

註冊Face API

註冊一個新的帳號,需要手機號碼認證與信用卡認證…

  • 這些步驟完成之後選擇您要的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:偵測圖片中雜訊與雜訊程度參數

 

在此用到的圖片是這位可愛的女生,您可以換成其他的圖片來測試

import httplib, urllib, base64, json

###############################################
#### Update or verify the following values. ###
###############################################

# Replace the subscription_key string value with your valid subscription key.
subscription_key = 'XXXX'   #填入Face API金鑰,任一組都可以

# Replace or verify the region.
#
# You must use the same region in your REST API call as you used to obtain your subscription keys.
# For example, if you obtained your subscription keys from the westus region, replace 
# "westcentralus" in the URI below with "westus".
#
# NOTE: Free trial subscription keys are generated in the westcentralus region, so if you are using
# a free trial subscription key, you should not need to change this region.
uri_base = 'westcentralus.api.cognitive.microsoft.com'

# Request headers.
headers = {
    'Content-Type': 'application/json',
    'Ocp-Apim-Subscription-Key': subscription_key,
}

# Request parameters.
params = urllib.urlencode({
    'returnFaceId': 'true',
    'returnFaceLandmarks': 'false',
    'returnFaceAttributes': 'age,gender,headPose,smile,facialHair,glasses,emotion,hair,makeup,occlusion,accessories,blur,exposure,noise',
})

# The URL of a JPEG image to analyze.
body = "{'url':'https://how-old.net/Images/faces2/main0011.jpg'}"

try:
    # Execute the REST API call and get the response.
    conn = httplib.HTTPSConnection('westcentralus.api.cognitive.microsoft.com')
    conn.request("POST", "/face/v1.0/detect?%s" % params, body, headers)
    response = conn.getresponse()
    data = response.read()

    # 'data' contains the JSON data. The following formats the JSON data for display.
    parsed = json.loads(data)
    print ("Response:")
    print (json.dumps(parsed, sort_keys=True, indent=2))
    print parsed[0]["faceAttributes"]["smile"]   #第一張臉的 smile 強度
    conn.close()

except Exception as e:
    print("[Errno {0}] {1}".format(e.errno, e.strerror))

 

根據Face API,一張照片最多可以辨識到64張臉,但這樣真的太多了… 在基礎練習最好使用單一臉孔來測試。熟悉之後可以加入更多臉孔甚至連續偵測

參考:[微軟認知服務] 串流影像之臉孔與年齡辨識

執行結果如下,本範例就是把所有JSON結果顯示出來(#50),但為了後續微笑偵測,我們在#51獨立把smile的強度抓出來了,如下圖的 1.0

print parsed[0][“faceAttributes”][“smile”] #取得第一張臉的 smile 強度

上圖可愛小妹妹的完整偵測JSON結果如下,您可以慢慢檢視:

[
  {
    "faceAttributes": {
      "accessories": [], 
      "age": 21.6, 
      "blur": {
        "blurLevel": "low", 
        "value": 0.1
      }, 
      "emotion": {
        "anger": 0.0, 
        "contempt": 0.0, 
        "disgust": 0.0, 
        "fear": 0.0, 
        "happiness": 1.0, 
        "neutral": 0.0, 
        "sadness": 0.0, 
        "surprise": 0.0
      }, 
      "exposure": {
        "exposureLevel": "goodExposure", 
        "value": 0.73
      }, 
      "facialHair": {
        "beard": 0.0, 
        "moustache": 0.0, 
        "sideburns": 0.0
      }, 
      "gender": "female", 
      "glasses": "NoGlasses", 
      "hair": {
        "bald": 0.03, 
        "hairColor": [
          {
            "color": "brown", 
            "confidence": 1.0
          }, 
          {
            "color": "black", 
            "confidence": 0.77
          }, 
          {
            "color": "other", 
            "confidence": 0.46
          }, 
          {
            "color": "red", 
            "confidence": 0.2
          }, 
          {
            "color": "blond", 
            "confidence": 0.06
          }, 
          {
            "color": "gray", 
            "confidence": 0.02
          }
        ], 
        "invisible": false
      }, 
      "headPose": {
        "pitch": 0.0, 
        "roll": -11.5, 
        "yaw": -5.6
      }, 
      "makeup": {
        "eyeMakeup": true, 
        "lipMakeup": true
      }, 
      "noise": {
        "noiseLevel": "low", 
        "value": 0.08
      }, 
      "occlusion": {
        "eyeOccluded": false, 
        "foreheadOccluded": false, 
        "mouthOccluded": false
      }, 
      "smile": 1.0
    }, 
    "faceId": "d87447bd-a4b3-4c87-b92d-736871e8e6d9", 
    "faceRectangle": {
      "height": 166, 
      "left": 175, 
      "top": 197, 
      "width": 166
    }
  }
]
1.0   #獨立抓出來的 smile 強度

您可以使用 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

#!/usr/bin/python
 
import pyfirmata
import time
pin = 13
port = 'COM5'
board = pyfirmata.Arduino(port)   #對指定序列埠開啟通訊
while True:
    	board.digital[pin].write(1)  #設定指定腳位高電位
    	time.sleep(1)                    #等候1秒
    	print "ON : %s" % time.ctime()  #顯示相關訊息與時間
    	board.digital[pin].write(0)
    	time.sleep(1)
    	print "OFF : %s" % time.ctime()

執行畫面如下圖,除了Arduino D13 會亮暗之外,在console上也有對應的訊息

Python結合Arduino微笑偵測應用

來看一下綜合運用吧!本範例會根據畫面中臉孔的微笑程度來決定LED亮起的數目。

import httplib, urllib, base64, json, pyfirmata
from time import sleep
port = 'COM5'

# Replace the subscription_key string value with your valid subscription key.
subscription_key = 'XXX'   #填入Face API金鑰,任一組都可以

# NOTE: Free trial subscription keys are generated in the westcentralus region, so if you are using
# a free trial subscription key, you should not need to change this region.
uri_base = 'westcentralus.api.cognitive.microsoft.com'

# Request headers.
headers = {
    'Content-Type': 'application/json',
    'Ocp-Apim-Subscription-Key': subscription_key,
}

# Request parameters.
params = urllib.urlencode({
    'returnFaceId': 'true',
    'returnFaceLandmarks': 'false',
    'returnFaceAttributes': 'age,gender,smile,emotion,occlusion,accessories,exposure,noise',
    #'returnFaceAttributes': 'age,gender,headPose,smile,facialHair,glasses,emotion,hair,makeup,occlusion,accessories,blur,exposure,noise',
})

# The URL of a JPEG image to analyze.
body = "{'url':'https://how-old.net/Images/faces2/main002.jpg'}"

#connect Arduino
board = pyfirmata.Arduino(port)    #對指定序列埠開啟連線
sleep(3)      #等候3秒來開啟序列連線

try:
    # Execute the REST API call and get the response.
    conn = httplib.HTTPSConnection('westcentralus.api.cognitive.microsoft.com')
    conn.request("POST", "/face/v1.0/detect?%s" % params, body, headers)
    response = conn.getresponse()
    data = response.read()
    # 'data' contains the JSON data. The following formats the JSON data for display.
    parsed = json.loads(data)
    print ("Response:")
    print (json.dumps(parsed, sort_keys=True, indent=2))  #顯示所有資料
    a = parsed[0]["faceAttributes"]["smile"]   #顯示微笑程度
    conn.close()

except Exception as e:
    print("[Errno {0}] {1}".format(e.errno, e.strerror))

print "smile value is"
print a                                #顯示微笑程度
if a > 0.75:                         #以下分成三個區間來控制LED,您可以自行修改
    board.digital[9].write(1)
    board.digital[10].write(1)
    board.digital[11].write(1)
    print 111
elif a < 0.25:
    board.digital[9].write(1)
    board.digital[10].write(0)
    board.digital[11].write(0)
    print 100
else:
    board.digital[9].write(1)
    board.digital[10].write(1)
    board.digital[11].write(0)
    print 110

 

執行!

執行時,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()

 

完整程式如下:

import httplib, urllib, base64
import json

f = open('a006.jpg', 'rb')
jpgdata = f.read()
f.close()

# Request header
headers = {
# Request headers
'Content-Type': 'application/octet-stream',
'Ocp-Apim-Subscription-Key': 'd3d138ceb1f4470286dcaba79f7d2de9',
}

params = urllib.urlencode({
# Request parameters
'returnFaceId': 'true',
'returnFaceLandmarks': 'false',
'returnFaceAttributes': 'age,gender,smile,emotion,glasses',
})   #只需要上述五個參數


body = {
}

try:
    conn = httplib.HTTPSConnection('api.projectoxford.ai')
    #conn.request("POST", "/face/v1.0/detect?%s" % params, json.dumps(body), headers)
    conn.request("POST", "/face/v1.0/detect?%s" % params, jpgdata, headers)
    response = conn.getresponse()
    data = json.loads(response.read())
    print(json.dumps(data, indent=2))   #顯示所有資料
    print data[0]["faceAttributes"]["smile"]   #顯示微笑程度
    conn.close()
except Exception as e:
    print("[Errno {0}] {1}".format(e.errno, e.strerror))

 

相關文章:

 

 

 

[微軟認知服務] 串流影像之臉孔與年齡辨識

本範例要介紹如何使用 LinkIt Smart 7688 Duo(7688也可以)結合微軟認知服務下的Face API,您連到7688的影像串流IP之後會不斷偵測畫面中是否辨識到人臉,並將相關資訊(年齡)呈現在網頁上。本範例感謝台灣微軟同仁與 CAVEDU 講師袁佑緣協助。

例如前陣子幾乎人人都玩過的How-Old.net就是運用這類技術來判斷照片中是否有人臉以及年齡判斷等等。更多微軟認知服務的資訊與教學,請參考原廠網站:https://www.microsoft.com/cognitive-services/en-us/apis

10-1
微軟認知服務首頁
10-2
目前可用的API

延伸閱讀

[App Inventor教學] 上傳照片到微軟認知服務Computer Vision API,使用 Makeblock CamVision

 

取得Face 與Emotion API金鑰

請登入您的Microsoft帳號(我的@msn.com還可用呢!):https://www.microsoft.com/cognitive-services/en-us/face-api

點選APIàFace API,找到頁面下方的Get started for free,如下圖

10-3
點選Get started for free

 

接著會列出可選用的API以及使用方案,以本範例的 Face 與Emotion API 來說,兩者的流量限制都是每個月執行30,000次,每分鐘20次。請勾選Face選項與Emotion選項,再點選頁面最下方的Subscribe即可。

10-4
勾選Face與Emotion選項

接著會進到以下頁面,您可在此看到這個產品所產生的Key,屆時就是要把這組Key輸入在本專案的 cognitive.js 與 index.html中。您也可點選 Show Quota 看一下已用掉幾次呼叫。

10-5
您目前啟用的服務列表

Continue reading

[App Inventor教學] 上傳照片到微軟認知服務Computer Vision API,使用 Makeblock CamVision

本範例可將所拍攝的照片上傳到微軟認知服務Computer Vision API,經辨識之後可取得以下資料:

  • 照片說明(text)
  • 前景主色(text)
  • 背景主色(text)
  • 相片標籤(list)

使用 Makeblock 所開發的 CamVision extension 檔,另外也有控制其 mBot 機器人平台的 extension,我們也在測試中喔

注意:

  1. 經實測只能使用在 MIT 所提供之測試伺服器,正式伺服器匯入時會有問題
  2. 點選 Prepare 按鍵時,會把相機開起來(這時並沒有跳到拍攝預覽畫面,但的確已經開啟),因此其他會用到相機的程式,例如條碼掃描程式(下載 apk 用) 會無法使用。請先關閉本程式再使用其他相機程式。

 aia 與 apk 下載請點我(App Inventor中文學習網)

使用的照片:

img20160917130103

辨識結果如下圖:

  • 照片說明(a cat laying on a bed)
  • 前景主色(灰色)
  • 背景主色(灰色)
  • 相片標籤(indoor, cat, wall, laying)
screenshot_2016-09-17-13-47-41-29

Continue reading

Inventec AVATAR開發板 (微軟Azure IoT認證裝置與 Qualcomm 四核心處理器)

還記得前幾年水果拼盤(各類型 Raspberry Pi 相容板、有香蕉橘子蓮霧鳳梨喔) 開始流行的時候,光有板子就很開心了,但現在大家的胃口被養大了,光有板子是不夠的,有沒有什麼更方便的應用呢?例如,直接打通了某些雲服務,聽起來就很吸引我。

最近英業達 Inventec 有一片 Avatar (阿凡達?) 出來了,主打項目應該是 Microsoft Azure IoT Certificate 與採用 Qualcomm 四核心處理器

085

 

目前 Inventec 在 hackster.io 所放上的專題應用有智慧小玩具、居家助手與監控攝影機等三個專題。也提供了完整的作法,就等拿到板子之後來玩玩看囉。

最後是目前可看到的規格

  • CPU:Quad Cortex-A7, up to 1.094 GHz / Qualcomm APQ8009
  • Memory:8GB eMMC + 1GB LPDDR2
  • Communications:Dual-band 2×2 802.11ac + Bluetooth 4.1 / Qualcomm QCA6174A
  • Audio Codec:Standalone Hi-Fi audio codec IC / Qualcomm WCD9326
  • Speaker AMP:Class-D smart speaker AMP up to 2W/8Ω / WSA8810
  • Microphone:-38dB, Wide bandwidth, Low noise-38dB / A-Mic
  • Camera:1/2.9″ color CMOS 1080p HDR HD image sensor / OmniVision OV2718
  • GPU:O.S. Support

比較令我感興趣的是這個:Microsoft Azure Certified for IoT。不知道可以幫開發者省掉哪些步驟呢?如果只要登入之後就可以直接使用一些範例程式就太棒啦(許願中…)

160818 19 微軟物聯網專案實作體驗營,7月底報名只要$3500

2016年8月18, 19日 共兩天,有微軟原廠舉辦的物聯網專案實作體驗營,地點在恆逸資訊教育訓練中心(台北市松山區復興北路99號14樓)。原價 $5000,七月底特價$3500,對於微軟 Azure IoT有興趣的朋友,千萬別錯過啦!

報名連結請按我

以下是課程介紹與內容:

Continue reading

[新書預報] 物聯網雲端應用大全 – 使用 LinkIt Smart 7688 Duo

如果可以的話,就讓我們順利把這本書完成吧~  去年寫了 LinkIt ONE 的書之後,一轉眼一年已過,很感謝各位師長好友的支持,我們的 7688 新書終於有樣子啦,一本書裡面要把四種雲寫進去真的很不容易,所以希望大家多多支持囉

2016-07-18 21.56.28
寫到很悶就來玩樂高,結果貓在旁邊睡覺啊…

Continue reading

[5/29 物聯網應用發表會有什麼?]微軟 Cognitive Services 應用大全集

5/29 星期天下午的物聯網應用發表會,您報名了嗎?

微軟物聯網小組會在 5/29 當天展示 Cognitive Services 的應用大全集。對於微軟提供的相關服務有興趣的朋友,請千萬別錯過。當天還有 Amazon AWS IoT 的智慧小屋IBM Bluemix 聯發科 LinkIt 家族等面對面分享,一定要來喔!

由下圖可看到可分成 Vision、Speech、Language、Knowledge 與 Search 等五大項,有興趣的朋友可點下圖來進入各 API來看看如何上手。
未命名

在 Maker Fairte Taipei 2016 的微軟攤位上,展示 Raspberry Pi 結合 Cognitive Services 來辨識使用者的狀態,只需要一台聯網的 Raspberry Pi 就搞定啦。(技術協力為 Webduino)。下圖為LASS 開源環境監測計畫 LASS 的哈爸,從圖中可以看到有偵測臉部、笑容百分比、預估年齡(剛滿40歲喔~) 以及是否有眼鏡等等。

延伸閱讀:微軟 Cognitive Services 的 How-old.net app 

IMG20160508130854

採用 Raspberry Pi + 官方的相機模組,實際上用任何一款 webcam 都沒問題

IMG20160508130929

來看看微軟的 Cognitive Services 介紹影片

Microsoft Azure IoT 各種可用的開發板與套件包

就雲服務廠商的角度來說,當然是海納百川,大家的板子都來連到我的雲吧。但站在使用者的立場而言,還是有一套標準的套件搭配新手村攻略會比較輕鬆一點。否則通通都可以有時候也等於通通都不行啊…

別忘了報名 5/29 的物聯網應用發表會喔!

拿 Seeed 來說吧,大概90%開發板的 starter kit 都是他們家做的吧(連板子順便一起做囉~), 例如聯發科的 LinkIt 家族、Raspberry Pi、Intel Edison 等等很多啦…  畢竟只有板子沒有周邊也是沒戲唱。今天讓我們來看看微軟針對 Azure IoT  所推薦的 IoT 新手包吧 (以下文字部分翻譯自原廠網頁,再加上一點阿吉老師的意見)

Adafruit Raspberry Pi Kit

由Windows 10加持之後,Pi 就能做到 PC 一樣的事情了喔,試算表、文字處理甚至播影片都可以(本來就可以了啊…)。本套件提供了 Pi 搭配 Azure IoT 所需的各種感測器與元件。

Buy | Get started

Adafruit Feather M0 Kit

Feather 是 Adafruit 的新款開發板,當然是因為這片板子又薄又輕的關係囉。Adafruit 設計 Feather 開發板使用於可攜式微控制器的新標準。這款 Adafruit Feather M0 WiFi 可說是完整相容於 Arduino,高速,WiFi 穩定而且有內建 USB 與電池供電。

Buy | Get started

Adafruit Huzzah Feather ESP8266 Kit

針對想入手 Adafruit 新款的低價 Feather HUZZAH 開發板與 ESP8266 WiFi 微控制器所設計,Adafruit 表示這款套件用來入門 Azure IoT 相當合適。本套件不需要 Arduino 或其他微控制器。

Buy | Get started

Seeed – Intel Edison Kit

針對專業 maker、企業家、以及工業級 IoT 應用,Intel® Edison 模組針對一系列的原型或商用級專案提供了相當簡易的開發環境。

Buy | Get started

SparkFun Thing Dev Kit

以 ESP8266 為核心,這款 Thing Dev 開發板的C/P值相當高,且 Wi-Fi 的穩定度也很不錯。本套件包提供了 ThingDev 微控制器 搭配 Azure IoT 所需的各種感測器與元件。

Buy | Get started