如何用100美元和TensorFlow來造一個能“看”東西的機器人
物體識別是現在機器學習領域的熱點之一。相當長的時間裏,計算機已經能相當可靠地識別人臉或者貓。但在更大的圖片中去識別一個指定的物體還是人工智能領域的“聖杯”。人類的大腦能非常好地識別物體。我們可以毫無困難地把從物體上反射出來的具有不同頻率的光子轉化為關於我們周邊世界的極度豐富的信息集。而機器學習還依然在為了完成這個簡單的任務而奮鬥。不過近幾年,機器學習已經取得了相當不錯的進步。
深度學習算法和一個超大的公共訓練數據集(稱為ImageNet)共同促成了物體識別領域的一係列令人映像深刻的進步。TensorFlow是一個廣為人知的框架,它讓在多種架構上實現深度學習算法變得很容易。TensorFlow善於利用GPU的運算能力,從而使得它非常適合運行深度學習的算法。
◆ ◆ ◆
造我自己的機器人
我想造一個能自己識別物體的機器人。多年的開發程序和測試的經驗已經把我塑造成了害怕和實際物體打交道。現實世界裏,測試一個有缺陷的物理設備可能會把房子燒了,或是燒毀引擎,並讓你等很多天才能拿到替換的零件。
圖1 能識別物體的機器人的架構。圖片由Lukas Biewald授權使用
而新的第三代樹莓派板是完成這個項目的最佳選擇。在亞馬孫上它僅售36美元,還帶有無線功能、一個四核的CPU、1G的內存。加上一個報價6美元的迷你SD卡就可以載入一個基於Debian的Raspberian操作係統。圖1顯示了所有這些部件是怎麼組合在一起的。而圖2則是這塊板子的照片。
圖2 運行在我車庫裏的樹莓派板。圖片由Lukas Biewald授權使用
我很喜歡SainSmart製造的隻用11美元的機器人底盤。這個底盤可以控製不同輪子采用不同的轉速,運轉的令人驚訝得好(見圖3)。
圖3 機器人底盤。圖片由Lukas Biewald授權使用
唯一讓我在有更便宜的選擇的時候還多花錢的東西就是這個Adafruit製造的電機擴展板(見圖4)。這個直流電機的運行電壓超過了樹莓派板子可以提供的電壓。所以單獨的控製器就成為必須。而Adafruit電機擴展板極其方便好用。使用這個電機擴展板是會要做一點焊接,但這個設備是極度的容錯。而且Adafruit還提供了一個很好的庫和教程來讓你通過i2C總線來控製電機。我一開始用的是一個便宜的電機控製器,但不小心把我的樹莓派板給燒掉了,所以我決定買一個質量好一點的替代品。
圖4 已經安裝了攝像頭和電機的樹莓派板。圖片由Lukas Biewald授權使用
一個標價15美元的攝像頭正好能裝在樹莓派板上,它能提供實時的視頻來作為物體識別的輸入。攝像頭的選擇就太多了。我選了一個帶紅外功能的攝像頭,這樣就可以讓我的機器人有夜視功能了。
樹莓派板需要大概2安培的電源,但3安培電流對於我要裝的揚聲器是一個更保險的選擇。iPhone的充電寶是這一任務的理想選擇。更低安培的充電寶一般不能產生足夠的電流,從而會導致一些問題。不過這個Lumsing power bank的充電寶卻很不錯,而且隻用18美元。
這幾個HC-SR04型的聲呐傳感器可以讓機器人免於撞車。11美元就能買到5個。
我還買了我能找到的最便宜的USB揚聲器,然後用了一堆的膠帶、熱膠和泡沫板來把所有的東西粘到一起。作為廢物利用,我還把一些電子設備的包裝材料給剪了,並在上麵畫了一些東西來給這個機器人增加一點點人性。這裏我要說的是,我實際上造了兩個機器人(見圖5),因為我實驗了不同的底盤、攝像頭、聲呐、軟件和其他的東西。結果加在一起發現足夠造兩個版本的機器人了。
圖5 我的四驅動機器人(右邊的)和他的兩驅動機器人妹妹。圖片由Lukas Biewald授權使用
把機器人組裝好了之後,就該讓它變聰明了。網上有海量的教程教你如何使用樹莓派。如果你曾用過Linux,樹莓派的一切對你而言就都很熟悉了。
如果你想把攝像頭的視頻記錄下來,RPi Cam Web接口能很好地勝任。它非常容易配置。默認是把來自攝像頭的最新的畫麵存放在RAM磁盤的/dev/shm/mjpeg/cam.jpg裏。
如果你想把攝像頭的數據發布到網頁裏(這對調試是非常有幫助的),你可以用Nginx,一個極度快的開源網頁服務器。我把Nginx配成對攝像頭畫麵的網頁請求直接指向上麵文件的地址,而其他的請求都發送到網頁服務器。
http {
server {
location / {
proxy_pass https://unix:/home/pi/drive.sock;
}
location /cam.jpg {
root /dev/shm/mjpeg;
}
}
}
我隨後開發了一個簡單的Python 網站服務器,可以接收鍵盤的指令來轉動機器人的輪子。控製鍵盤本來是一個的遙控汽車的。
另外要說的是,利用聲呐和駕駛係統來控製機器人的行駛路線從而讓它能避開物體是一件非常有趣的事。
◆ ◆ ◆
給我的機器人開發程序
終於,是時候安裝TensorFlow了。安裝TensorFlow有很多種方法,但TensorFlow提供了makefile命令,從而能針對你特定的操作係統進行編譯。這一步驟花費了我幾個小時,並需要一些依賴包,但總體來說還算順利。
TensorFlow自帶了一個預建好的模型,叫inception。它可以完成物體識別。這是如何使用運行它的教程。
對一張來自攝像頭的畫麵運行tensorflow/contrib/pi_examples/label_image/gen/bin/label_image命令,TensorFlow會返回5個可能物體的猜測。這個模型對於相當多的東西的識別都非常好,但是它也很明顯地缺少一個確定的“先驗條件”,即它不知道將會看到的東西是什麼。它的訓練數據裏也明顯漏掉了不少物品。比如,它能很好的識別我的筆記本,即使是從很特殊的角度看。但當讓它看我的裝一堆電線的籃子的時候,它就一直認為這是個烤麵包機。當攝像頭被遮擋,拍到的圖像為黑屏或是比較模煳的時候,它就會認為是在看一些線蟲。很明顯線蟲是它的訓練數據裏的東西。
圖6 接著鍵盤和顯示器的機器人。圖片由Lukas Biewald授權使用
最後我采用Flite開源軟件包來作為機器人的輸出部分,把文字變成語音。這樣機器人就可以說出它看到的物體了(見圖6)。
原文發布時間為:2016-10-22
本文來自雲棲社區合作夥伴“大數據文摘”,了解相關信息可以關注“BigDataDigest”微信公眾號
最後更新:2017-06-01 13:32:27