最近我準備在新房子里安裝一個門鈴時想到:為什么不讓我的門鈴告訴我誰在門口?
我自己動手做的大部分項目的成本都高于其它同等產品,即便我已經(jīng)把自己的時間價值定為每小時0美元。我想這可能是跟供應鏈和經(jīng)濟規(guī)模相關。但是我在自己制作這些東西的過程中得到了更多的樂趣。在這個項目中我攢了一個門口攝像頭,它不僅比我的Dropcam便宜而且還有一些真正有用的功能,由于某些原因這些功能我在市場還沒有見到過。

圖1 我的前門有一個門鈴、一個August鍵盤鎖和一個用于人臉識別的樹莓派。圖片由Lukas Biewald提供
我們會攢一個成本60美元的基于樹莓派的安全攝像頭裝置,用來拍攝照片并將其傳到云端然后進行人臉識別。你還可以將數(shù)據(jù)流上傳到Amazon S3,使其成為一個完整的Dropcam替代品。Nest為保存最近10天的視頻每年會收取100美元,但你可以只花費大約20美元在S3中保留一年的視頻文件。如果你使用Amazon Glacier,這筆費用將會降到4美元左右。
使用Amazon ReKognition進行機器學習
本教程會重點關注機器學習的部分——使用亞馬遜新的Rekogniction服務來對你的訪客進行人臉識別,然后將識別結果發(fā)送到你的Amazon Echo,這樣你就可以始終知道誰在你的門口了。為了構建可靠的服務,我們還會使用Amazon最酷、最有用的產品之一:Lambda。
組成部件:
Amazon Echo Dot(50美元)
樹莓派3代(38美元)(該項目也可以使用樹莓派2代加上無線USB網(wǎng)卡)
(16美元)
樹莓派保護殼(6美元)
(8美元)
總計:118美元
我們會使用Amazon的S3、 Lambda和Rekognition 服務來進行人臉匹配。這些服務開始是免費的,之后你每月僅花費幾分錢就可以識別在你門口成千上萬的訪客。
配置樹莓派系統(tǒng)
如果你已經(jīng)完成了我的任何一篇樹莓派教程,那么你將會很熟悉這篇教程的大部分內容。
首先從樹莓派基金會上下載Noobs,并按照安裝說明進行操作。這主要包括將Noobs復制到SD卡上,再將SD卡插到你的板子上,然后將鼠標、鍵盤和顯示器插到你的板子上并按照安裝說明操作。這些操作自從新的桌面環(huán)境Pixel推出以來就變得更容易了。

圖2 我桌子上連著微型顯示器和鍵盤的樹莓派。圖片由Lukas Biewald提供
然后將你的樹莓派系統(tǒng)命名成你可以記住的名字,以便你可以SSH訪問它。這在howtogeek上有很好的說明指南——你需要修改/etc/hosts和/etc/hostname文件并給你的樹莓派系統(tǒng)命名。我喜歡將所有的安保攝像頭樹莓派用我最喜歡的電視節(jié)目“費城總是晴朗”中的角色來命名,所以我將前門的攝像頭命名為“Dennis”。這意味著我不需要記住一個IP地址就可以隨時SSH訪問到dennis.local,即使重置了路由器也可以。
接下來你應該將攝像頭連接到樹莓派板子上。記住帶狀電纜正面應該面向以太網(wǎng)插孔——這個問題我可能已經(jīng)Google了一百次了。備注:如果你想要一個更廣的視野,你可以買一個廣角攝像頭;如果你想要增加夜視功能,你可以買一個紅外線攝像頭。

圖3 準備安裝的帶有攝像頭和外殼的樹莓派。圖片由Lukas Biewald提供
你可能也想把整個裝置都放在一個保護殼中,以保護它免受天氣的影響。你還需要將樹莓派通過微型USB電纜連接到電源。(我已經(jīng)在墻上鉆了一個小洞將我的Dropcam連接到室內電源插座上,所以我在合適的位置上已經(jīng)有了一個USB電纜。)
目前為止我已經(jīng)在房子周圍安裝了幾個這樣的裝置了。相機帶狀電纜很薄,你可以將樹莓派安裝在房間內部,并將電纜就像我在我的實驗室(車庫)里做的那樣從門上穿過。

圖4 樹莓派上的攝像頭從我的車庫門上穿出來。 圖片由Lukas Biewald提供
接下來你需要安裝RPi-Cam-Web界面。這是一個非常有用的軟件,它通過http協(xié)議從攝像頭中提供連續(xù)的數(shù)據(jù)流。請遵循安裝說明,并選擇NGINX作為Web服務器。在/etc/raspimjpeg中有一個非常有用的配置文件可以用來配置大量選項。
配置Amazon S3和Amazon Rekognition
如果你尚未創(chuàng)建AWS賬號,則需要現(xiàn)在創(chuàng)建。你應該先創(chuàng)建一個IAM用戶,并讓該用戶可以訪問S3、Rekognition和Lambda(稍后我們會使用Lambda)。
安裝AWS命令行界面:
sudo apt install awscli
將你的樹莓派的地區(qū)設置為美東(截止本文撰寫時間,Rekognition僅在此區(qū)域可用)
創(chuàng)建一個人臉識別組:
aws create-collection –collection-id friends
你可以使用我寫的unix shell腳本來快速添加你朋友的人臉圖片:
aws s3 cp $1 s3://doorcamera > output
aws rekognition index-faces \
–image “{\”S3Object\”:{\”Bucket\”:\”doorcamera\”,\”Name\”:\”$1\”}}” \
–collection-id “friends” –detection-attributes “ALL” \
–external-image-id “$2”
將其復制到一個文件中作為shell腳本。或者在命令行里輸入它,并將$1替換成你朋友圖片的本地文件名,把$2換成你朋友的名字。
Amazon的 Rekognition服務使用機器學習來得到人臉圖片上點與點之間的距離,然后使用這些點來匹配其索引中的人臉圖像。因此你可以僅使用你朋友的一張圖像來訓練系統(tǒng)就可能得到很好的結果。
現(xiàn)在你可以用類似的腳本來測試這個人臉識別系統(tǒng):
aws s3 cp $1 s3://doorcamera > output
aws rekognition search-faces-by-image –collection-id “friends” \
–image “{\”S3Object\”:{\”Bucket\”:\”doorcamera\”,\”Name\”:\”$2\”}}”
你會得到返回的一個很大的JSON文件,其中不僅僅有匹配結果,還有圖像的其它方面信息,包括性別、表情、面部毛發(fā)和一堆其它有趣的東西。
{
“FaceRecords”: [
{
“FaceDetail”: {
“Confidence”: 99.99991607666016,
“Eyeglasses”: {
“Confidence”: 99.99878692626953,
“Value”: false
},
“Sunglasses”: {
…
接下來我們可以編寫一個Python腳本從我們的樹莓派攝像機中下載一個圖片并檢查其中的臉部。實際上我用了第二臺樹莓派來實現(xiàn)這一功能,但是運行在同一臺機器上會更容易。只需要查看/dev/shm/mjepg/cam.jpg文件,你就會知道一個所對應的攝像頭的圖像文件。
無論哪種方式,我們需要在Web服務器中暴露此接口功能以供后面使用。我使用Flask作為我的Web服務器。
from flask import Flask, request
import cameras as c
app = Flask(__name__)
@app.route(‘/faces/<path:camera>’)
def face_camera(camera):
data = c.face_camera(camera)
return “,”.join(data)
if __name__ == ‘__main__’:
app.run(host=’0.0.0.0′, port=5000)
我把解析代碼(以及本文提到的所有其它代碼)都放在了github.com/lukas/facerec上。
如果你已經(jīng)操作到了這一步,你已經(jīng)能有一些非常有趣的可以用來玩的東西了。我發(fā)現(xiàn)Amazon服務在識別我朋友的方面是極好的。唯一看起來有些麻煩的地方就是識別我的情緒(盡管這可能更多的是我的問題而不是Amazon)。
實際上我將其中一個樹莓派攝像頭縫進了一個毛絨玩具里,并把一個非常令人毛骨悚然的能進行人臉識別的泰迪熊哨兵放在了我的桌上。

圖5 可人臉識別的泰迪熊Freya。圖片由Lukas Biewald提供
人臉識別攝像頭跟Amazon Echo搭配使用
Amazon的Echo使得高品質的語音命令變得非常簡單,并且對這種項目來說有著完美的接口。不幸的是,使用Echo的最好方式是讓它跟一個穩(wěn)定的Web服務進行直接通信,但是我們想把樹莓派攝像頭放在路由器防火墻后面的本地網(wǎng)絡——這使得配置有點棘手。
我們將Echo連接到一個AWS Lambda服務上,它會通過SSH通道跟我們的樹莓派系統(tǒng)通信。這可能有點復雜,但這是最簡單的方法。

圖6 架構圖。圖片由Lukas Biewald提供
通過SSH 通道暴露HTTP 人臉識別API接口
到目前為止我們已經(jīng)構建了一個用于人臉識別的小網(wǎng)絡應用,我們還需要讓外部世界可以訪問它。只要我們在某個地方有一個Web服務器,我們就可以配置一個SSH通道。不過有一個叫做localtunnel的甜美小應用程序為我們做了這一切,你可以輕松地安裝它:
npm install -g localtunnel
我喜歡用一個小腳本來包裝一下它,使其處于活動狀態(tài)防止它掛掉。請把MYDOMAIN改為對你有意義的內容:
until lt –port 5000 -s MYDOMAIN; do
echo ‘lt crashed… respawning…’
sleep 1
done
現(xiàn)在你可以通過訪問http://MYDOMAIN.localtunnel.me 來ping一下你的服務器。
創(chuàng)建一個Alexa Skill
要使用我們的Echo,我們需要創(chuàng)建一個新的Alexa Skill。Amazon有一個很好的入門指南,或者你可以直接訪問Alexa開發(fā)者門戶網(wǎng)站。
首先我們需要設定一個intent:
{
“intents”: [
{
“intent”: “PersonCameraIntent”,
“slots”: [
{
“name”: “camera”,
“type”: “LIST_OF_CAMERAS”
}
]
}]}
然后我們給Alexa一些樣例Utterance:
PersonCameraIntent tell me who {camera} is seeing
PersonCameraIntent who is {camera} seeing
PersonCameraIntent who is {camera} looking at
PersonCameraIntent who does {camera} see
接下我們需要給Alexa一個結束點,為此我們將使用一個Lambda函數(shù)。
配置一個Lambda函數(shù)
如果你從未使用過Lambda的函數(shù),那本文讓你賺到了!Lambda函數(shù)是一種在Amazon服務器上為一個簡單函數(shù)定義一個統(tǒng)一API的簡單方法,并只有在調用時才會付費。
Alexa Skill 是Lambda函數(shù)的完美用例,所以Amazon已經(jīng)配置了一個可用的用于Alexa Skill的模板。當Alexa與我們列出的PersonCameraIntents的其中一項匹配時,它將會調用我們的Lambda函數(shù)。將MYDOMAIN改為你的本地通道腳本中使用的域名,這樣一切就會運行的很好。
你還可以使用Amazon Rekognition發(fā)送的元數(shù)據(jù)中的其它有趣之處。例如,它可以猜測面部表情,所以我通過它去判斷在我門口的是一位開心的訪客還是一個生氣的訪客。你還可以讓Echo告訴你訪客是否有胡子、戴太陽眼鏡和其它一些特征:
def face_camera(intent, session):
card_title = “Face Camera”
if ‘camera’ in intent[‘slots’]:
robot = intent[‘slots’][‘camera’][‘value’]
try:
response = urlopen(‘http://MYDOMAIN.localtunnel.me/faces/%s’ % robot)
data = response.read()
if (data== “Not Found”):
speech_output = “%s didn’t see a face” % robot
else:
person, gender, emotion = data.split(“,”)
if person == “” or person is None:
speech_output = “%s didn’t recognize the person, but ” % robot
else:
speech_output = “%s recognized %s and ” % (robot, person)
if gender == “Male”:
speech_output += “he ”
else:
speech_output += “she ”
speech_output += “seems %s” % emotion.lower()
except URLError as e:
speech_output = “Strange, I couldn’t wake up %s” % robot
except socket.timeout, e:
speech_output = “The Optics Lab Timed out”
else:
speech_output = “I don’t know what robot you’re talking about”
should_end_session = False
return build_response({}, build_speechlet_response(
card_title, speech_output, None, should_end_session))
當你與Alexa通話時,它實際上會解析你的語音以找到一個Intent并運行一個Lambda函數(shù)。該函數(shù)會調用一個外部服務器并通過SSH通道跟你的樹莓派通信。樹莓派會從攝像機中拿到一張圖片并上傳到S3中,然后運行一個深度學習推理算法來跟你朋友的臉部圖片進行匹配,并將解析結果發(fā)送到你的Echo上。然后Echo會跟你講話。但是這整個過程發(fā)生的非???!為了讓你自己親眼見證,請看我的視頻:
你可以采用相同的技術,并將其應用或擴展到很多很酷的方面。例如,我將我的“機器人樹莓派/TensorFlow 項目”中的代碼放到我的機器人上?,F(xiàn)在他們可以跟我對話,并告訴我他們在看什么。我也考慮將利用這個GitHub項目將樹莓派連接到我的August鎖上,這樣我的門就會為我的朋友自動打開,或者對一個在門口憤怒的訪客自動鎖上。
Lukas Biewald
Lukas Biewald是CrowdFlower的創(chuàng)始人兼CEO。CrowdFlower始于2009年,是一個數(shù)據(jù)增強的平臺,可以幫助企業(yè)獲得隨需的人力來收集、產生訓練數(shù)據(jù),以及參與人-機器學習循環(huán)的工作。在從斯坦福大學拿到數(shù)學學士和計算機科學碩士學位后,Lukas領導了雅虎日本的搜索相關團隊。隨后他去了Powerset,作為一個資深數(shù)據(jù)科學家進行工作。2008年Powerset被微軟收購。盧卡斯還被《公司》雜志評選為30位30歲以下的著名人士。Lukas還是一位專家級的圍棋選手。

