Google工程師:教你用樹莓派+Arduino+TensorFlow搭建圖像識別小車

2020-12-17 雷鋒網

雷鋒網按:本文作者趙智沉,Google軟體工程師。來自知乎專欄:。雷鋒網獲授權轉載。趙智沉的作坊

從買第一個Arduino套裝開始,我接觸機器人有好幾年了,但直到最近才開始做完整的課題。期間有兩項技能為我打開了新世界的大門:Python和Linux。他們背後,是強大的開源社區。掌握了這兩樣工具的工具(元工具),你感覺網上遍地是趁手的兵器。

上周在公司內部編程培訓時,有一句話深得我心:我們是軟體工程師,不是程式設計師。我們的工作不是寫程序,而是合理使用工具解決問題。在Google,如果你覺得自己不得不從零開始寫某項功能,只是你還沒有找到相應的工具罷了。在開源社區更是如此。

這是一個遙控小車,通過紅外遙控或無線鍵盤可以控制小車的行動和攝像頭的角度。TensorFlow實時監測攝像頭拍攝到的畫面,語音讀出它識別出的物體。所有代碼都放在我的上。GitHub

這個想法不是我的原創,來自Lukas Biewald去年九月寫的。核心部分,TensorFlow識別攝像頭圖像並語音輸出,是我司人工智慧工程師Pete Warden的。和原博客不同的是,製作過程中我加入了Arduino作為機械總控,也了解了Arduino和樹莓派對話的方法(串口通信)。期間用到了許多有用的技能和工具,在這裡整理一下,歡迎同好們留言交流!這篇博客開源工作

整個課題在命令行環境完成,沒有圖形界面。如果你不懂Linux系統,可能有些吃力。但是,你都開始玩機器人了,怎麼能不學Linux呢?我是通過《》自學Linux的,後來又嘗試,終於克服在Windows系統環境長大產生的對命令行的抗拒心理。相信我,克服這個障礙,你將打開新世界的大門。何況,用命令行工作才顯得更酷更極客,不是嗎?除了Linux,你還要懂C++和Python來完成這個課題。鳥哥的Linux私房菜從原始碼搭建Linux

另外,這篇文章主要介紹電子部分,不講機械和美工。如你看到的,這個小車醜破了我的審美底線,我沒花心思在外觀上。我希望以後做一些兼具美學和功能的電子課題,或許會和設計師朋友們合作!

一、樹莓派

首先,你需要一個最新款的,安裝好定製的Linux系統,連上無線網。你還需要一個,並在樹莓派中。你可以將樹莓派通過HDMI連接到顯示器,但更方便的做法是ssh遠程登錄,這樣你就不用在調試過程中反覆地把樹莓派從小車上拔線、取下、連屏幕、然後安裝回小車了,你可以實時遠程修改小車的內核。甚至,我的Arduino程序也是通過樹莓派編寫、上傳、通信的,於是也免去了電腦連接Arduino的步驟,讓一切更流暢無縫。Raspberry Pi官配攝像頭設置為可用

樹莓派的Linux系統支持圖形桌面,你可以使用RealVNC(用於Windows)或TightVNC(用於Mac)遠程登錄圖形桌面。(這個課題裡不需要)

二、TensorFlow

這是課題的核心部分,反而操作起來最簡單,因為一切都在寫清楚了,按部就班就行。運行代碼在。這裡這裡

注意:這裡用了訓練好的模型,即TensorFlow中預先給定了訓練好的參數集,訓練圖片庫是。也就是說,小車識別出的物體只能是圖片庫裡包含的labels,也沒有「學習」的過程。ImageNet

三、小車

小車套件(robot chassis)很多,選你喜歡的一款。標準的套件包括一個基座,兩組馬達+輪子,一個萬向輪,一個電池盒。這個課題不需要四驅,而且之後要用到的馬達控制器可能只支持兩個馬達。我用的是張堯姐送給我的第一個DIY套件:一個戳了很多洞的木板和3D列印出來的輪子和連接部件。這個恐怕是蘿蔔太辣最早的套件,來自矽谷的創客空間。

現在,正式出品的「起源」套件已很完善,線上也有成熟的教學資源。這個課題裡用到的舵機和金屬連接部件都來自堯姐送給我的第二個套件——「起源」套件。但從感情上來講,那套粗糙的木板套件讓我更親近,符合「用最簡單的材料實現原型」的理念。蘿蔔太辣

電源:樹莓派需要5V、2A電源,放在小車上的話需要一個電流足夠大的充電寶。連接樹莓派和Arduino的連接線同時也為Arduino供電。但是,馬達我用了外部電源(電池盒)。你會發現即使沒有外部電源,充電寶依然可以帶動馬達(儘管很慢)。但是,好的習慣是機械部分獨立供電;邏輯電路部分由充電寶提供。

下一步,操控小車。這裡有兩個方案,第一個不需要Arduino。我使用的是第二個。

3.1 樹莓派作為機械總控

我認為單片機的精髓,不是尺寸小,而是豐富的GPIO(General Purpose Input-Output),它們是程序與外部世界對話的窗口。你看到的各種電子部件、探頭、焊接、麵包板,都是在和GPIO打交道。你需要了解基本的電路知識,也需要知道它們在單片機上的。樹莓派有一個非常好用的GPIO Python庫:,使用方法一目了然。排布gpiozero

通常用四個埠控制馬達,分別連接兩個馬達的正負級,通過每個馬達的正向/逆向旋轉來實現小車的前進/後退/轉向。實現雙向電流的標準電路模型是H橋接。你可以選購一款最基本的H-bridge模塊。

因為我手頭沒有,所以這個方案我沒有實現。H橋接

3.2 Arduino作為機械總控

我沒有H橋接,但有一個用於Arduino的Motor stacking shield,即Arduino上的H橋接。於是我乾脆用Arduino負責機械(馬達+舵機),相當於身體;樹莓派只負責圖像識別,相當於大腦。

Arduino不是Linux系統,不能直接ssh進去寫程序,需要在外寫好後編譯上傳。我用數據線連接了樹莓派和Arduino,在樹莓派上寫好程序後上傳。我發現一個非常好用的命令行IDE:PlatformIO(也有很棒的圖形界面編輯器)。Linux上的基於Python 2.7。你需要一些初始化,如果像我一樣是Arduino Uno主板,輸入以下命令即可:安裝過程

pio init -b uno

Arduino的C++原始碼在。進入後,輸入以下命令即可上傳:這裡這個文件夾

pio run –target upload

後來我發現PlatformIO對於Arduino主板好像不支持C++11,如果你有這個需要,可以考慮。inotool

四、無線遙控

同樣有兩個方案:無線鍵盤,紅外遙控。兩個方案我都實現了。

4.1 無線鍵盤

如果你在上一步用了3.1,無線鍵盤操控模塊就可以直接嵌入到機械操控代碼中(我沒有實現)。如果你在上一步用了3.2,那麼需要在樹莓派上將按鍵操作轉為機械控制信號(文本形式),通過串口通信(Serial Port)操控Arduino。

python代碼在,用到了我,用來檢測鍵盤按鍵。這個庫將單次按鍵匹配到前進/後退/轉/停止等行為;但我希望實現的是長按鍵前進/後退/轉,不按鍵時停止。但我始終沒有找到現成的庫(Update:據說在PyGame裡有)。這裡自己寫的庫

後來我試著通過背景線程(threading)和系統延時的方法,但效果不太理想,系統延時和程序運行時間帶來的誤差總是匹配不好,就放棄了。現在代碼裡用的是單次按鍵行動/停止的方案。如果讀者有好的庫,請推薦!寫了一個庫

有一點要注意,使用串口通信前需要disable login(既然你已經ssh遠程登錄了),解釋比較清楚。這篇

4.2 紅外遙控

紅外的長按返回的是一個單獨的值(REPEAT),這點就可以讓我很容易實現「長按-車動,不按-車停」。此外,紅外遙控的代碼直接寫在Arduino的C++代碼裡,不需要通過樹莓派和串口通信,更符合Arduino作為機械總控的設計原則。

PlatformIO不自帶紅外的庫,我用的是。PlatformIO使用第三方庫實在太簡單了,不需要下載安裝,直接在配置裡加上GitHub連結即可,參考我的。這個配置文件

還有一點,每一個紅外遙控都不一樣。家裡的電視機、音響、空調遙控都可以用,你只需要在使用前匹配好按鍵和對應的碼。我在裡define的一堆KEY只適用於我的遙控器。你可以用來獲得鍵碼。注意:紅外遙控有幾種模式,我的遙控用的是最常見的NEC模式,如果你匹配出來一堆亂碼,可以考慮庫裡的其他幾個模式。代碼這個代碼

對了,如果你用紅外遙控,你還需要在車上裝一個IR Receiver。我裝在Arduino上,用8號埠。

如果你用了方案3.1,你也可以直接將IR Receiver裝在樹莓派的GPIO上。

五、其他

這些已經夠你開車上路了。我在車上裝了舵機(Servo),控制攝像頭的上下轉動。操作很直觀,看代碼就能理解。我沒有裝超聲探頭,這個可以幫助你檢測障礙,在撞牆前強行停止。

如果你想遠程看攝像頭的實時畫面,VNC不能勝任。可以考慮。但這樣的話TensorFlow就不能再用攝像頭了。應該有一個共用的方案,我沒有探究。這個方案

差不多就這些了,我的代碼沒有太多注釋,等有空往上加。如果你有疑問,可以留言問我。

福利:有一個延時攝影的簡單程序,我在crontab裡設置為每隔一分鐘拍一張照,然後每天半夜將當天拍的照轉成錄像。下周打算帶到公司裡,找個風景好的位置,放幾天,拍紐約的24小時風景。這裡

相關焦點

  • 【官方教程】TensorFlow在圖像識別中的應用
    人們毫不費力地就能區分出獅子和美洲虎,閱讀符號,或是識別面孔。但是這些任務對於計算機而言卻是一個大難題:它們之所以看上去簡單,是因為我們的大腦有著超乎想像的能力來理解圖像。在過去幾年裡,機器學習在解決這些難題方面取得了巨大的進步。其中,我們發現一種稱為深度卷積神經網絡的模型在困難的視覺識別任務中取得了理想的效果 —— 達到人類水平,在某些領域甚至超過。
  • 我用Paddle Lite在樹莓派3b+上從零開始搭建「實時表情識別」項目
    本項目搭建的表情識別系統,是包含了多門學科知識的深度學習應用。在實際生活中,表情識別在人機互動、安全、機器人製造、無人駕駛和醫療都有著一定的作用。本項目實踐的是基於嵌入式系統的表情識別系統的設計方法,將圖像採集、人臉檢測、表情識別和結果輸出整合到樹莓派中。
  • 如何利用TensorFlow.js部署簡單的AI版「你畫我猜」圖像識別應用
    本文創建了一個簡單的工具來識別手繪圖像,並且輸出當前圖像的名稱。該應用無需安裝任何額外的插件,可直接在瀏覽器上運行。作者使用谷歌 Colab 來訓練模型,並使用 TensorFlow.js 將它部署到瀏覽器上。
  • TensorFlow開發者證書 中文手冊
    考試流程TensorFlow Certificate 官方網站:https://tensorflow.google.cn/certificate?hl=vi搭建自然語言處理系統準備模型使用的文本數據使用二分類搭建模型識別文本片段使用多分類搭建模型識別文本片段在你的模型中使用詞向量
  • Tensorflow官方語音識別入門教程 | 附Google新語音指令數據集
    這個數據集由Google TensorFlow團隊和AIY團隊共同推出的,AIY就是之前推出樹莓派DIY智能音箱的那個團隊:所以說,也別指望用這個數據集訓練模型然後做個App什麼的,它其實和那個DIY的音箱差不多,主要供初學者/愛好者練手用。
  • TensorFlow圖像分類教程
    在這個由兩部分組成的系列中,我將講述如何快速的創建一個應用於圖像識別的卷積神經網絡。TensorFlow計算步驟是並行的,可對其配置進行逐幀視頻分析,也可對其擴展進行時間感知視頻分析。本系列文章直接切入關鍵的部分,只需要對命令行和Python有最基本的了解,就可以在家快速地創建一些令你激動不已的項目。
  • 手把手教你用TensorFlow搭建圖像識別系統(一)|...
    這只是一篇詳細描述如何開始搭建一個機器學習系統,並讓它可以識別所看到圖像的文章。作者Wolfgang Beyer目前現在正在學習人工智慧和機器學習的內容。他認為最好的學習方式不是僅僅閱讀各類材料,而是要真正地去動手搭建一個系統。這就是雷鋒網翻譯本文的目的,也是作者要向你介紹的。
  • 程式設計師奶爸用 Tensorflow、樹莓派 DIY 嬰兒監護儀
    注意,在此示例中,我將展示如何使用聲音檢測來識別嬰兒的哭聲,你也可以使用相同的方法來檢測任何類型的聲音,只要聲音足夠長即可(例如警報聲或鄰居的聲音),而且聲源必須比背景噪音更大。這個值越小,則持續時間越短的聲音效果越好,但是如果聲音較長,則捕獲的片段可能沒有足夠的信息來可靠地識別聲音。除了micmon-datagen腳本之外,你也可以製作自己的腳本,通過我提供的micmonAPI生成數據集。
  • MobileNet教程(2):用TensorFlow搭建安卓手機上的圖像分類App
    建立項目如果你還沒有準備好,可以從TensorFlow的repository下載這個Android示例項目:git clone https://github.com/tensorflow/tensorflow.git --depth 1具體的文件夾是tensorflow/examples/android。
  • TensorFlow 資源大全中文版
    TensorFlow 是一個採用數據流圖(data flow graphs),用於數值計算的開源軟體庫。節點(Nodes)在圖中表示數學操作,圖中的線(edges)則表示在節點間相互聯繫的多維數據數組,即張量(tensor)。它靈活的架構讓你可以在多種平臺上展開計算,例如臺式計算機中的一個或多個CPU(或GPU)、伺服器、行動裝置等等。
  • 計算機圖形學遇上深度學習,針對3D圖像的TensorFlowGraphics面世
    地址 https://colab.sandbox.google.com/github/tensorflow/graphics/blob/master/tensorflow_graphics/notebooks/6dof_alignment.ipynb這項任務是很多應用的核心,包括聚焦於與其環境進行交互的機器人。
  • 手把手教你用TensorFlow搭建圖像識別系統(三)|...
    TensorFlow構建圖像識別系統的第三部分。關於前兩部分,可以參看《機器學習零基礎?手把手教你用TensorFlow搭建圖像識別系統》(一)和(二)。用常數定義每個圖像的像素數(32 x 32 x 3)和不同圖像類別的數量。
  • 機器學習進階筆記| 利用TensorFlow實現智能數字識別
    近年來,人工智慧技術在圖像(物體識別、人臉識別)、自然語言(語音識別、翻譯、對話機器人)、智能醫療、智能推薦(廣告、新聞、視頻)等領域取得了飛速的發展。在圖像識別領域,當前人類社會的信息量已成幾何級數增長,如果對圖像的識別還僅靠肉眼判斷,那龐大的工作量對於人類來說將是一項不可能完成的任務。
  • 谷歌雲官方:一小時掌握深度學習和 TensorFlow(視頻+50PPT)
    來源:cloud.google.com譯者:劉小芹、胡祥傑、王楠【新智元導讀】谷歌雲官方博客今日更新,雲平臺開發支持人員 Martin Görner 發文,分享快速掌握深度學習和 TensorFlow 的貼心教程。
  • 可能是史上最全的Tensorflow學習資源匯總
    ,一步步帶你從入門到精通,是初學者學習Tensorflow的最佳教程。2)從Tensorflow基礎知識到有趣的項目應用:https://github.com/pkmital/tensorflow_tutorials同樣是適合新手的教程,從安裝到項目實戰,教你搭建一個屬於自己的神經網絡。
  • 玩轉TensorFlow?你需要知道這30功能
    2)TensorFlow hub如果你想在小型數據集上訓練你的模型,或者提高泛化能力,你會需要使用遷移學習。11)KerasKeras 如今直接集成在 TF 中,也就是 tf.keras。這意味著,如果不想使用低階的模型,那仍然可以用高階 API 的用戶友好性來實現圖形+模型的構建。2.0 版本將會有更多的功能!網址:https://www.tensorflow.org/guide/keras
  • 使用Python+Tensorflow的CNN技術快速識別驗證碼
    北京 上海巡迴站 | NVIDIA DLI深度學習培訓NVIDIA 深度學習學院 帶你快速進入火熱的DL領域正文共2929個字,17張圖,預計閱讀時間:8分鐘。近年來,機器學習變得愈加火熱,中國選手柯潔與AlphaGo的人機大戰更是引起熱議。目前,在圖像識別和視覺分析研究中,卷積神經網絡(CNN)技術的使用越來越多。
  • OpenCV+Tensorflow實現實時人臉識別演示
    微信公眾號:OpenCV學堂關注獲取更多計算機視覺與深度學習知識覺得文章對你有用
  • TensorFlow極速入門
    一、前言目前,深度學習已經廣泛應用於各個領域,比如圖像識別,圖形定位與檢測,語音識別,機器翻譯等等,對於這個神奇的領域,很多童鞋想要一探究竟,這裡拋磚引玉的簡單介紹下最火的深度學習開源框架 tensorflow。
  • tensorflow極速入門
    一、前言目前,深度學習已經廣泛應用於各個領域,比如圖像識別,圖形定位與檢測,語音識別,機器翻譯等等,對於這個神奇的領域,很多童鞋想要一探究竟,這裡拋磚引玉的簡單介紹下最火的深度學習開源框架 tensorflow。本教程不是 cookbook,所以不會將所有的東西都事無巨細的講到,所有的示例都將使用 python。那麼本篇教程會講到什麼?