如何用100美元和TensorFlow來造一個能“看”東西的機器人

OReillyData發表於2016-10-20

編者注:想了解如何使用TensorFlow來執行你的機器學習工作流,請關注谷歌的伊萊·比克斯比和艾米·昂魯在2016年11月1到2日於舊金山舉辦的培訓課程。

物體識別是現在機器學習領域的熱點之一。相當長的時間裡,計算機已經能相當可靠地識別人臉或者貓。但在更大的圖片中去識別一個指定的物體還是人工智慧領域的“聖盃”。人類的大腦能非常好地識別物體。我們可以毫無困難地把從物體上反射出來的具有不同頻率的光子轉化為關於我們周邊世界的極度豐富的資訊集。而機器學習還依然在為了完成這個簡單的任務而奮鬥。不過近幾年,機器學習已經取得了相當不錯的進步。

深度學習演算法和一個超大的公共訓練資料集(稱為ImageNet)共同促成了物體識別領域的一系列令人映像深刻的進步。TensorFlow是一個廣為人知的框架,它讓在多種架構上實現深度學習演算法變得很容易。TensorFlow善於利用GPU的運算能力,從而使得它非常適合執行深度學習的演算法。

造我自己的機器人

我想造一個能自己識別物體的機器人。多年的開發程式和測試的經驗已經把我塑造成了害怕和實際物體打交道。現實世界裡,測試一個有缺陷的物理裝置可能會把房子燒了,或是燒燬引擎,並讓你等很多天才能拿到替換的零件。

640?wx_fmt=jpeg

圖1 能識別物體的機器人的架構。圖片由Lukas Biewald授權使用

而新的第三代樹莓派板是完成這個專案的最佳選擇。在亞馬孫上它僅售36美元,還帶有無線功能、一個四核的CPU、1G的記憶體。加上一個報價6美元的迷你SD卡就可以載入一個基於DebianRaspberian作業系統。圖1顯示了所有這些部件是怎麼組合在一起的。而圖2則是這塊板子的照片。

640?wx_fmt=jpeg

圖2 執行在我車庫裡的樹莓派板。圖片由Lukas Biewald授權使用

我很喜歡SainSmart製造的只用11美元的機器人底盤。這個底盤可以控制不同輪子採用不同的轉速,運轉的令人驚訝得好(見圖3)。

640?wx_fmt=jpeg

圖3 機器人底盤。圖片由Lukas Biewald授權使用

唯一讓我在有更便宜的選擇的時候還多花錢的東西就是這個Adafruit製造的電機擴充套件板(見圖4)。這個直流電機的執行電壓超過了樹莓派板子可以提供的電壓。所以單獨的控制器就成為必須。而Adafruit電機擴充套件板極其方便好用。使用這個電機擴充套件板是會要做一點焊接,但這個裝置是極度的容錯。而且Adafruit還提供了一個很好的庫和教程來讓你通過i2C匯流排來控制電機。我一開始用的是一個便宜的電機控制器,但不小心把我的樹莓派板給燒掉了,所以我決定買一個質量好一點的替代品。

640?wx_fmt=jpeg

圖4 已經安裝了攝像頭和電機的樹莓派板。圖片由Lukas Biewald授權使用

一個標價15美元的攝像頭正好能裝在樹莓派板上,它能提供實時的視訊來作為物體識別的輸入。攝像頭的選擇就太多了。我選了一個帶紅外功能的攝像頭,這樣就可以讓我的機器人有夜視功能了。

樹莓派板需要大概2安培的電源,但3安培電流對於我要裝的揚聲器是一個更保險的選擇。iPhone的充電寶是這一任務的理想選擇。更低安培的充電寶一般不能產生足夠的電流,從而會導致一些問題。不過這個Lumsing power bank的充電寶卻很不錯,而且只用18美元。

這幾個HC-SR04型的聲吶感測器可以讓機器人免於撞車。11美元就能買到5個。

我還買了我能找到的最便宜的USB揚聲器,然後用了一堆的膠帶、熱膠和泡沫板來把所有的東西粘到一起。作為廢物利用,我還把一些電子裝置的包裝材料給剪了,並在上面畫了一些東西來給這個機器人增加一點點人性。這裡我要說的是,我實際上造了兩個機器人(見圖5),因為我實驗了不同的底盤、攝像頭、聲吶、軟體和其他的東西。結果加在一起發現足夠造兩個版本的機器人了。

640?wx_fmt=jpeg

圖5 我的四驅動機器人(右邊的)和他的兩驅動機器人妹妹。圖片由Lukas Biewald授權使用

把機器人組裝好了之後,就該讓它變聰明瞭。網上有海量的教程教你如何使用樹莓派。如果你曾用過Linux,樹莓派的一切對你而言就都很熟悉了。

如果你想把攝像頭的視訊記錄下來,RPi Cam Web介面能很好地勝任。它非常容易配置。預設是把來自攝像頭的最新的畫面存放在RAM磁碟的/dev/shm/mjpeg/cam.jpg裡。

如果你想把攝像頭的資料釋出到網頁裡(這對除錯是非常有幫助的),你可以用Nginx,一個極度快的開源網頁伺服器。我把Nginx配成對攝像頭畫面的網頁請求直接指向上面檔案的地址,而其他的請求都傳送到網頁伺服器。

http {

server {

location / {

proxy_pass http://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個可能物體的猜測。這個模型對於相當多的東西的識別都非常好,但是它也很明顯地缺少一個確定的“先驗條件”,即它不知道將會看到的東西是什麼。它的訓練資料裡也明顯漏掉了不少物品。比如,它能很好的識別我的筆記本,即使是從很特殊的角度看。但當讓它看我的裝一堆電線的籃子的時候,它就一直認為這是個烤麵包機。當攝像頭被遮擋,拍到的影象為黑屏或是比較模糊的時候,它就會認為是在看一些線蟲。很明顯線蟲是它的訓練資料裡的東西。

640?wx_fmt=jpeg

圖6 接著鍵盤和顯示器的機器人。圖片由Lukas Biewald授權使用

最後我採用Flite開源軟體包來作為機器人的輸出部分,把文字變成語音。這樣機器人就可以說出它看到的物體了(見圖6)。

測試我的機器人

看,這裡就是我自制的兩個可以使用深度學習進行物體識別的機器人。

最後的一些想法

2003到2005期間,我在史丹佛機器人實驗室工作。那時候的機器人一般會要花費幾十萬美元,而且物體識別的能力也比不上我現在的這個機器人。我很希望能把這個軟體裝入我的無人機裡,這樣就再也不用我自己找鑰匙了。

這裡我也希望感謝在這個專案裡幫助過我的人。我的鄰居克里斯·馮·達克、施魯蒂·甘地帶給了我的機器人的友好的人性。我的朋友艾德·麥克洛大大提升了硬體部分的設計,並教會我使用熱膠和泡沫板。工作在谷歌的皮蒂·沃頓幫助我在樹莓派上很好地編譯了TensorFlow,並提供了非常棒的客戶支援。


640?wx_fmt=jpeg

Lukas Biewald

Lukas Biewald是CrowdFlower的創始人兼CEO。CrowdFlower始於2009年,是一個資料增強的平臺,可以幫助企業獲得隨需的人力來收集、產生訓練資料,以及參與人-機器學習迴圈的工作。 在從史丹佛大學拿到數學學士和電腦科學碩士學位後,Lukas領導了雅虎日本的搜尋相關團隊。隨後他去了Powerset,作為一個資深資料科學家進行工作。2008年Powerset被微軟收購。Lukas還被《公司》雜誌評選為30位30歲以下的著名人士。 Lukas還是一位專家級的圍棋選手。

640?wx_fmt=png

相關文章