Quantcast
Channel: CAVEDU教育團隊技術部落格
Viewing all 678 articles
Browse latest View live

[ 教學技術文翻譯 ] 如何在 ubuntu 16.04或之後的版本,安裝 Tensorflow ?

$
0
0
作者/攝影

翻譯:宗諭

審閱:阿吉老師

主題圖片:翻攝自ubuntu及TensorFlow網站,特此致謝!

說明

原文請見,感謝TensorFlow團隊授權,特此致謝!

文章分類 教學技術文
材料表
  • ubuntu 16.04或之後的版本(64位元)

 

硬體需求:

1.從TensorFlow 1.6開始,執行檔使用AVX指令集,因此在較舊的CPU上,可能無法執行。

2.請先閱讀GPU支援說明,並在ubuntu上設定好能安裝CUDA的GPU。

 

Step1:請在您的系統上先安裝Python開發環境(需使用Python 3.4、3.5或3.6)。

請用以下指令來檢查:

python3 --version
pip3 --version
virtualenv --version

 

如果這些套件都已經安裝好了,請跳過下一步。若沒有安裝好的話,請安裝Pythonpip package managerVirtualenv

sudo apt update
sudo apt install python3-dev python3-pip
sudo pip3 install -U virtualenv  # system-wide install

 

Step2:建立虛擬環境(推薦)

Python virtual environments are used to isolate package installation from the system.

之所以要建立個別的Python虛擬環境,是為了從作業系統隔離不同版本的套件。

 

Create a new virtual environment by choosing a Python interpreter and making a ./venv directory to hold it:

1.藉由選擇一個Python直譯器並產生一個./venv目錄存放它,以建立一個新的虛擬環境。

virtualenv --system-site-packages -p python3 ./venv

 

2.使用shell指令來啟動虛擬環境。

source ./venv/bin/activate  # sh, bash, ksh, or zsh

 

When virtualenv is active, your shell prompt is prefixed with (venv).

3.當虛擬環境被啟動,您電腦上的提示符號的前面會多了一個(venv)。

 

Install packages within a virtual environment without affecting the host system setup. Start by upgrading pip:

4.在虛擬環境中安裝套件,不會影響主機系統的設定。讓我們先升級pip:

pip install --upgrade pip

pip list  # show packages installed within the virtual environment

 

5.如果您已經不需使用TensorFlow,請用以下命令離開虛擬環境:

deactivate  # don't exit until you're done using TensorFlow

 

Step3:安裝TensorFlow pip套件

 Choose one of the following TensorFlow packages to install from PyPI:

因為本文使用的作業系統是ubuntu,所以請根據您的電腦規格,從PyPI來安裝下列其中一個TensorFlow套件:

  • tensorflow– 當前版本,只支援CPU,推薦初學者安裝。
  • tensorflow-gpu– 當前版本,支援GPU(ubuntu和Windows)
  • tf-nightly – nightly版本,只支援CPU,不穩定。
  • tf-nightly-gpu–nightly版本,支援GPU,不穩定(ubuntu和Windows)

 

請在虛擬環境中輸入以下命令來安裝您所要的TensorFlow版本,例如:

pip install --upgrade tensorflow

 

接下來,驗證安裝:

python -c "import tensorflow as tf; tf.enable_eager_execution(); print(tf.reduce_sum(tf.random_normal([1000, 1000])))"

 

如果沒有看到錯誤訊息,就安裝完成了!接下來,讀者可以先閱讀一些教學文件,然後展開對TensorFlow的初體驗。

 

備註:如果想要購買人工智慧相關產品,歡迎洽詢機器人王國商城

 

相關文章


[ 介紹文 ] 2018.11.28- 進擊的Tank-Go!! V5.3 紅外線對戰坦克

$
0
0
撰文

Niko Yang

圖片

Niko Yang

說明

感謝網友Niko Yang撰稿,特此致謝!

 

玩坦克大戰是許多朋友年輕時期經歷過的美好回憶,無論是從任天堂紅白機或後續的電視遊樂器,坦克大戰皆是熱門的題材之一,也是與朋友或家人共享歡樂的好遊戲。在電視遊樂器之外,至各電商賣場搜尋「對戰坦克」,也有許多遙控坦克販賣,可見坦克類遊戲受歡迎的程度。

 

緣由

欣逢南科AI_ROBOT自造基地交流平台,於6月份在台南舉辦「自造機器人的一百種樣貌」研討會,由KEVIN WANG 對整個MINI-PLAN的進化與發展歷史進行分享。筆者也從研討會認識當前機器人的種類,以及對聯發科技的LinkIt 7697開發板有了第一次接觸。在那麼多的機器人中,最吸引筆者的莫過於TANK GO系列了。

圖1

 

令人驚喜的寶物

目前各種相容於Arduino 的開發板如雨後春筍般出現,有點讓人難以選擇,各家開發板各有千秋。研究各類開發板後,筆者選擇了LinkIt 76XX系列,除了它支援BLE藍芽外,也支援Wi-Fi控制,再加上由MINI-PLAN演進的ROBOT-SHIELD V2 擴充板於2017年10月開始販售,使LinkIt 7697如虎添翼,整體元件結合支援10組PWM及兩組DC馬達同時控制,也支援I2C介面擴充,並由兩顆 270F 2.7V 260mah電容器(Lithium Capacitor)提供電力,不需擔心電源過充或過放電力的問題。也因為是電容器,官方規格的深度循環可達3000次,相對於手機鋰電池的500次循環,連續使用多達六倍以上的時間,也不需擔心起火或爆炸問題。運用在坦克製作上,自然被筆者列為優先考慮的組合。

 

參考文章:

CAVEDU [LinkIt 7697] 認識LinkIt 7697,你會需要這一篇!

圖2

 

資源分享

得到第一把鑰匙後,從網站https://www.thingiverse.com/,看到SMARTS 系列的3D列印件有很大發展空間,同時在YouTube上看見由Chiou ShinWei(George)大神,分享3D列印件和完整的安裝流程,以及零件表和程式碼的分享,皆讓筆者在坦克製作上節省相當多時間。從3D列印領域至控制板,乃至於學生時代學習的知識都要一併用上。在聯發科技網頁上,有很詳細的介紹,以及工程師的技術問題回覆和支援。

 

ShinWei Chiou(George)

V4 版程式和3D模型檔案和零件清單

https://github.com/GeorgeChiou/Robot-Shield-V2.0

 

安裝說明和零件清單

https://youtu.be/rpaQaJ1GmJE

圖3

 

魔鬼藏在細節裡

筆者原以為萬事俱備,結果發現有些事情仍是要嘗試過才能瞭解箇中奧妙。第一個問題是戰車鋁帶元件使用PLA當承軸,但PLA遇到濕氣經過一至二星期後,有30%的PLA承軸斷裂,想拿金屬螺絲取代卻又太重。所以,最後筆者使用木質牙籤,並點上微量的瞬間接著劑在鋁帶元件內側稍做固定。或是由Mike Tsai 網友所建議,用PEG的3D線材取代也可以。

 

在砲台旋轉上,原本使用24AWG線材,但其表皮太硬,導致戰車砲塔旋轉會因線材而上下晃動,馬上更換舵機專用線給紅外線IRDA和紅外線接收IRM-3638N3連接線使用,解決了問題。

 

不用熱熔膠而使用UHU透明膠連接,避免3D列印零件因高溫而變形,以及日後需修改的拆裝;在N20馬達的齒輪本體也塗上田宮齒輪油,塗上後N20馬達瞬間耗電流下降許多,齒輪轉動聲音也慢慢變小。自造的迷人之處,就在於不斷有新挑戰出現,卻總能一一克服。

圖4

 

性能再強化

在筆者與家人玩TANK-GO一段時間後,收集了大家的建議進行一次修改及強化性能,於是便著手發展V5.3版的程式碼。首先在手機操控介面上,針對按鈕位置重新編列,以及針對功能進行調整,不僅操作便利更適合長時間使用。可惜聯發科技的 LRCONTROL 目前暫時只支援六種顏色(RC_ORANGE, RC_BLUE, RC_GREEN, RC_PINK, RC_GREY, RC_YELLOW)。

https://docs.labs.mediatek.com/resource/linkit7697-arduino/en/developer-guide/using-linkit-remote/lremote-control-classes

 

同時戰車砲塔旋轉角度的左右方向,也進行一致性調整;在MPFPLAYER 聲音按鍵上,也更改為每階2格度調整,並限制最大至28 (MAX:30),避免小的喇叭單體破音,以及夜間播放音樂聲量的細部調整。

 

朋友建議加上兩顆燈光(LED)做為彈藥用盡或生命值歸零的提醒,也避免因緊張一直按鈕卻無動作對應。經筆者考慮,除了LED作為狀態顯示外,也加入兩段系統語音,例如:補彈藥和修理進行提示。其他細節可參考GITHUB上的README完整說明。

 

Niko Yang V5.3 版修改軟體和電子零件焊接圖片

https://github.com/yangniko137/Tank-Go-V5?fbclid=IwAR0NseA_2R2cRFvZRvyqWwNXehPig6qMT5wTly-tnJPS84LIOpKXyL0n61k

圖5

 

未來發展

科技發展鮮少有停頓的時刻,在筆者看過「少女與戰車(GIRLS und PANZER)」影片後,發覺還有許多功能值得更新,例如生命值歸0後,升起投降用的白色旗子⋯⋯等等。

 

兩顆超大電容提供激烈對戰達40分鐘左右,但把戰車當成MP3播放器聽CD書,這時便需要插5V市電供應,也考慮以14650或18650電池和保護板供電,省去電線纏繞的困擾。

 

對戰時的遮蔽建築物連同戰車收納的盒子,也可考慮製做成組合式,並且各戰車語音可以男女分開⋯⋯等等。這些都是很好的建議,以及下一步更新的方向。

圖6

 

結論

舉一反三,除了坦克外也順便發展FPV加上攝像頭及圖傳,加上接收和螢幕就可在家中探險。自造除了腦力激盪外,也藉由製作過程認識新的學問及志同道合的朋友。因此,謹藉由本篇文章,感謝無私分享的Maker們。

圖7

 

備註:如果您想要購買 LinkIt 7697Robot Shield,歡迎洽詢機器人王國商城,謝謝。

 

相關文章

[ 翻譯 ] 2018.12.3- TensorFlow Lite專案分享:Jrobot無人四輪車

$
0
0
翻譯

宗諭

審閱

Joe Chen、CAVEDU教育團隊

專案作者

Joe Chen

感謝作者Joe Chen授權翻譯文字內容,以及播放影片,特此致謝!

主題圖片

Designed by Freepik,特此致謝!

 

Jrobot Self-Drive Powered by TensorFlow Lite

Jrobot無人四輪車的運作核心是TensorFlow Lite。

 

Previously, we used J-control to drive the Jrobot remotely, and this time we get rid of J-control and let Jrobot to do self-drive.

先前,我們運用J-control遠距驅動Jrobot,但這次我們不使用J-control,而讓Jrobot自行駕駛。

 

Jrobot Self Drive is another self-drive experiment based on machine learning, it is not a simulator, it is not a road vehicle, it is a footpath traveler. We built NVIDIA CNN self-drive model using Keras, collected training data, trained the model, and converted the trained model to TensorFlow Lite.

Jrobot無人四輪車是一項建基於機器學習的無人車實驗。Jrobot不是模擬器,也不是道路用車輛,而是一台小型的四輪車。我們運用Keras建構NVIDIA CNN自駕模型,然後收集訓練資料,訓練模型,最後將訓練好的模型轉換至TensorFlow Lite上。

 

TensorFlow Lite allows us to do inference on a mobile device and is the key part of this project. We added TensorFlow Lite to Jrobot Android app. When running, TensorFlow Lite is able to load the trained model, take a camera image as input and give a steering angle as output. Jrobot app runs on an Android phone (Xiaomi Mi5) sitting in the phone box on Jrobot car and control the movement of the Jrobot car through bluetooth connection with Arduino on the car.

運用TensorFlow Lite使我們可以在行動裝置上進行推論,所以TensorFlow Lite可說是這個專案的核心。我們把TensorFlow Lite加至Jrobot Android app中,當運作時,TensorFlow Lite能夠載入訓練好的模型,然後以照相機的圖像作輸入,並給出一個轉向角作輸出。Jrobot app在Android手機上運作,在下面的影片中,我們使用的手機是小米Mi5。當Jrobot準備行駛前,我們把手機放入Jrobot無人四輪車上的手機盒,並透過手機上的藍牙裝置連接四輪車上的Arduino開發板,以控制四輪車的行駛。

 

We did road test in 2 places in the neighborhood and the results show us the trained model works well. Even though it is not full self-drive, it makes human control so much easier, and opens up so many new options, which means there is so much more to do. Thank you!

我們在社區中的兩處地方進行道路測試,結果顯示訓練模型運作的相當好。即便Jrobot目前還不是完全自駕,卻使得人為控制容易許多,並且開啟了許多新選項,這也意味我們還有許多部分需要努力,謝謝。

 

接下來,請讀者們觀賞Jrobot無人四輪車的介紹影片,當中包括了兩次的道路測試(如果讀者想直接看道路測試,第一次道路測試從8:25開始,第二次道路測試從21:30開始):

 

備註:如果想要購買AI人工智慧相關產品,歡迎洽詢機器人王國商城

 

相關文章

 

[ 介紹文 ] 2018.12.04- 千呼萬喚終於始出來!!OpenCV 4.0發佈

$
0
0
撰文

Jack Omnixri

圖片

Jack Omnixri

主題圖片

freepik

說明

本文由作者Jack Omnixri授權轉載,特此致謝!原文網址為:http://ai-robot-stsp.tw/forums/topic/opencv-4-0千呼萬喚始出來/

 

有在玩電腦(機器)視覺的朋友,對開源電腦視覺函式庫「OpenCV」一定不陌生。從2000年發展至今已超過十八個年頭,中間歷經多次重大變革及分支,從2.2版開始支援C++,2.4版開始支援CUDA、OpenCL等加速工具,2.4.9版後本來進到3.0版,停止支援C語言只支援C++,但許多使用C語言的伙伴仍不離不棄,繼續將部份新增功能加入,於是劇情就展開成兩條支線,目前已來到2.4.13.6版,後續是否能繼續發展,實在令人擔憂。而3.0.0版於2015年正式推出,加入許多深度學習工具,3.3版後加入了更多深度學習框架及算法,如Caffe、Yolo⋯⋯等等。最近(2018年11月20日)正式推出4.0版更讓人眼睛一亮,在深度學習部份有了重大改革,實在值得花些時間好好研究。

圖1 OpenCV發展史(OmniXRI Jack整理製作)

 

以下就簡單把此次4.0版更新重點做點整理:

  1. 更完整支援C++11,去除大量OpenCV 1.x版留下的C API,要配合CMake 3.5.1之後版本編譯。

  2. 除原有CUDA、OpenCL支援平行演算外,另外新增大量以GPU繪圖加速計算的處理函式庫G-API。

  3. 在深度神經網路(DNN)模組中增加FP16支援,同時加入ONNX框架,使得各種模型能順利加入執行,如AlexNet、Inception v2、Resnet、VGG、Yolo、Tiny Yolo v2⋯⋯等等。

  4. 對DNN的改進,如Mask RCNN、Faster R-CNN。

  5. 在快速QR Code檢測、3D場場建構的Kinect Fusion、高質量密集光流算法也都有重大改進。

 

另外,Intel OpenVINO對OpenCV也是大力支援,同步推出更新版本,可支援更多的模型及算法,包括:

1. 支援低解析度(Int8)推論,以利Intel CPU及未來低階推論用AI晶片。
2. 加強支援TensorFlow、MXNet、ONNX等框架,以及R-FCN、Yolo v3、 OpenPose等模型算法。
3. 增加三種預訓練模型,以利人臉特徵點、人體姿態建立及將影像超解析度等應用。
4. 可下載ResNet-50、ResNet-101、ResNet-152、GoogleNet v3等模型參數。

 

更多預訓練模型可參考:
https://github.com/opencv/open_model_zoo

 

OpenCV 4.0及OpenVINO更完整的釋出說明可參考官網:
https://opencv.org/opencv-4-0-0.html
https://docs.opencv.org/4.0.0/index.html

 

相關文章

[ 翻譯 ] 2018.12.05- 根據樹莓派基金會,Raspberry Pi 3 Model A+會是3+平台的最終產品?!看快來看看他們的說明

$
0
0
翻譯

宗諭

審閱

CAVEDU教育團隊、Jenny

圖片

翻攝自樹莓派基金會網站,特此致謝!

說明

感謝英國樹莓派基金會授權翻譯,特此致謝!原文請見

 

我們(在此指英國樹莓派基金會)部落格的忠實讀者應該記得,在2014年,Raspberry Pi 1 Model A+緊接著在Raspberry Pi 1 Model B+後推出。藉由將RAM減低至256MB,並且移除USB集線器及乙太網路控制器,我們能把價格降至更低,並將Raspberry Pi 1 Model A+壓縮至一個HAT的大小。

 

雖然我們並未在Raspberry Pi 2或3推出A+的規格,但這已是其中一項,我們最常被詢問「到哪裡去了」的產品。現在,隨著Raspberry Pi 3 Model B+的批量發貨,我們終於能藉由推出Raspberry Pi 3 Model A+,填補上這個產品空缺。

 

Raspberry Pi 3 Model A+ incorporates most of the neat enhancements we made to its big brother, and features:

  • 1.4GHz 64-bit quad-core ARM Cortex-A53 CPU
  • 512MB LPDDR2 SDRAM
  • Dual-band 802.11ac wireless LAN and Bluetooth 4.2/BLE
  • Improved USB mass-storage booting
  • Improved thermal management

 

Raspberry Pi 3 Model A+ 融合了大部分我們為Raspberry Pi 3 Model B+所做的功能強化,並且具備以下特點:

  • 1.4GHz 64位元四核心ARM Cortex-A53 CPU

  • 512MB LPDDR2 SDRAM

  • 雙頻11ac無線LAN和藍牙4.2/BLE

  • 經過改善的USB大量儲存啟動

  • 經過改善的散熱管理

 

正如它的大哥Raspberry Pi 3 Model B+,Raspberry Pi 3 Model A+根據FCC的規定,其整塊電路板被認證為無線電模組。而這樣的經過認證,將大幅減低以樹莓派為基礎的產品進行符合性測試的成本。

 

就某方面而言,Raspberry Pi 3 Model A+對我們來說是個痛苦的產品。回朔至今年三月,我們解釋了為何3+這個平台會是「經典」樹莓派的最終迭代:因為不論我們接下做什麼,都必然不會是一種進化,因為再次進化需要新的核心晶片,並在新的製程上運用新的記憶體技術。所以,3A+算是一次瀟灑地收尾,既回應了其中一項顧客最常提出的詢問,同時也「清理了甲板」,讓我們可以開始認真思考接下來如何。

 

針對Raspberry Pi 3B、3B+及Raspberry Pi Zero,我們官方推出的機殼非常受歡迎,所以,我們當然想針對3A+推出機殼。然而,我們目前尚未準備好,但如下圖所示,機殼非常美觀,我們期待可以在12月初供應給大家,剛好作為送給朋友的聖誕小禮物。

圖1

 

備註:如果您想要購買樹莓派相關產品,歡迎洽詢機器人王國商城

 

相關文章

[ 翻譯 ] 2016.12.07- 部署機器學習模型更簡單!!如何使用TensorFlow Serving搭配Docker?

$
0
0
翻譯

宗諭

審閱

阿吉老師

主題圖片

Designed by Freepik

原文作者

Gautam Vasudevan與Abhijit Karmarkar,特此致謝!

說明

感謝TensorFlow團隊,特此致謝!原文請見

 

 

 

Serving machine learning models quickly and easily is one of the key challenges when moving from experimentation into production. Serving machine learning models is the process of taking a trained model and making it available to serve prediction requests. When serving in production, you want to make sure your environment is reproducible, enforces isolation, and is secure. To this end, one of the easiest ways to serve machine learning models is by using TensorFlow Serving with Docker. Docker is a tool that packages software into units called containers that include everything needed to run the software.

當從實驗階段移至生產階段,如何快速、簡單地部署機器學習模型,是其中一項關鍵性挑戰。部署機器學習模型,是取用一個訓練好的模型並使此模型能回應預測請求的過程。當把模型部署至實際生產時,使用者想要確保環境是可重現、獨立且安全的。至此,部署機器學習模型最簡單的方法之一,是使用TensorFlow Serving搭配Docker。什麼是Docker呢?Docker是一項把軟體打包成一個個單元的工具,而這樣的單元被稱作「容器」,它包含了運作該軟體的一切所需。

 

Since the release of TensorFlow Serving 1.8, we’ve been improving our support for Docker. We now provide Docker images for serving and development for both CPU and GPU models. To get a sense of how easy it is to deploy a model using TensorFlow Serving, let’s try putting the ResNet model into production. This model is trained on the ImageNet dataset and takes a JPEG image as input and returns the classification category of the image.

自TensorFlow Serving 1.8發佈以來,我們持續改善對Docker的支援。現在,我們提供了Docker 映像檔,讓使用者可針對CPU與GPU模型進行部署和開發。為讓讀者們了解,運用TensorFlow Serving部署模型到底有多簡單,讓我們試著使ResNet模型進行生產。這個模型是以ImageNet資料集來訓練,以JPEG圖像作為輸入,並會回傳此圖像的分類結果。

 

Our example will assume you’re running Linux, but it should work with little to no modification on macOS or Windows as well.

下面的實例假定您使用Linux,但只需要稍微修改(甚至不用),也能在macOS或Windows上運作。

 

Serving ResNet with TensorFlow Serving and Docker

The first step is to install Docker CE. This will provide you all the tools you need to run and manage Docker containers.

TensorFlow Serving uses the SavedModel format for its ML models. A SavedModel is a language-neutral, recoverable, hermetic serialization format that enables higher-level systems and tools to produce, consume, and transform TensorFlow models. There are several ways to export a SavedModel(including from Keras). For this exercise, we will simply download a pre-trained ResNet SavedModel:

運用TensorFlow Serving與Docker部署ResNet

第一步是安裝Docker CE,它將提供運作並管理Docker容器所需的工具。

針對其下各種機器學習模型,TensorFlow Serving使用SavedModel格式。SavedModel是一種語言中立、可回復、密閉序列化的格式,使高階系統和工具得以產生、運用並轉化TensorFlow模型。匯出SavedModel格式(包括Keras的模型)的方法相當多元,本範例將下載預先訓練好的ResNet SavedModel。

$ mkdir /tmp/resnet
$ curl -s https://storage.googleapis.com/download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp32_savedmodel_NHWC_jpg.tar.gz | tar --strip-components=2 -C /tmp/resnet -xvz

 

We should now have a folder inside /tmp/resnet that has our model. We can verify this by running:

現在,在/tmp/resnet中有一個資料夾,其中包含了我們的模型。請執行以下指令進行驗證:

$ ls /tmp/resnet
1538687457

 

Now that we have our model, serving it with Docker is as easy as pulling the latest released TensorFlow Serving serving environment image, and pointing it to the model:

有了模型之後,要運用Docker部署模型就簡單了,只要使用pull指令取得最新發佈的TensorFlow Serving的serving environment映像檔,並且將serving environment映像檔指向模型即可:

$ docker pull tensorflow/serving
$ docker run -p 8501:8501 --name tfserving_resnet \
--mount type=bind,source=/tmp/resnet,target=/models/resnet \
-e MODEL_NAME=resnet -t tensorflow/serving &
…
… main.cc:327] Running ModelServer at 0.0.0.0:8500…
… main.cc:337] Exporting HTTP/REST API at:localhost:8501 …

 

Breaking down the command line arguments, we are:

以下介紹各個命令列參數:

  • -p 8501:8501: Publishing the container’s port 8501 (where TF Serving responds to REST API requests) to the host’s port 8501

發佈容器埠8501(TensorFlow Serving在此回應REST API請求)對應到主機埠8501。

 

  • –name tfserving_resnet: Giving the container we are creating the name “tfserving_resnet” so we can refer to it later

幫容器命名為「tfserving_resnet」,後續才能參照到它。

 

  • –mount type=bind,source=/tmp/resnet,target=/models/resnet: Mounting the host’s local directory (/tmp/resnet) on the container (/models/resnet) so TF Serving can read the model from inside the container.

運用mount命令,將主機的本地目錄(/tmp/resnet)掛載至容器上(/models/resnet)。這樣,TensorFlow Serving可從容器內讀取模型。

 

  • -e MODEL_NAME=resnet: Telling TensorFlow Serving to load the model named “resnet”

告訴TensorFlow Serving,載入名稱為「resnet」的模型。

 

  • -t tensorflow/serving: Running a Docker container based on the serving image “tensorflow/serving”

根據部署映像檔「tensorflow/serving」來運作Docker容器。

 

Next, let’s download the python client script, which will send the served model images and get back predictions. We will also measure server response times.

接著,讓我們下載python客戶端腳本,這個腳本將傳送部署模型的映像檔,並且取回預測結果。我們也將ˋ計算伺服器的回應時間。

$ curl -o /tmp/resnet/resnet_client.py https://raw.githubusercontent.com/tensorflow/serving/master/tensorflow_serving/example/resnet_client.py

 

This script will download an image of a cat and send it to the server repeatedly while measuring response times, as seen in the main loop of the script:

這個腳本將下載一張貓咪的圖像,並且重複傳送這張圖像至伺服器並計算回應時間,如腳本中的主迴圈所示:

# The server URL specifies the endpoint of your server running the ResNet
# model with the name "resnet" and using the predict interface.
SERVER_URL = 'http://localhost:8501/v1/models/resnet:predict'

...

# Send few actual requests and time average latency.                                                                                                                                                                   
total_time = 0
num_requests = 10
for _ in xrange(num_requests):
    response = requests.post(SERVER_URL, data=predict_request)
response.raise_for_status()
total_time += response.elapsed.total_seconds()
prediction = response.json()['predictions'][0]

print('Prediction class: {}, avg latency: {} ms'.format(
prediction['classes'], (total_time*1000)/num_requests))

 

This script uses the requests module, so you’ll need to install it if you haven’t already. By running this script, you should see output that looks like:

這個腳本使用requests模組,所以如果讀者尚未安裝這個模組,將需要安裝它。執行後應該會看到類似下面的輸出結果:

$ python /tmp/resnet/resnet_client.py
Prediction class: 282, avg latency: 185.644 ms

 

As you can see, bringing up a model using TensorFlow Serving and Docker is pretty straight forward. You can even create your own custom Docker imagethat has your model embedded, for even easier deployment.

從上面的實例可知,運用TensorFlow Serving與Docker部署模型十分直接。讀者甚至可以建置自己的客製Docker映像檔,其中內嵌您的模型,部署起來更加容易。

 

Improving performance by building an optimized serving binary

Now that we have a model being served in Docker, you may have noticed a log message from TensorFlow Serving that looks like:

藉由建置最佳化的部署二元檔來改善效能

既然我們已將模型部署至Docker中,讀者可能已經注意到一則來自TensorFlow Serving的log訊息,如下:

Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA

 

The published Docker images for TensorFlow Serving are intended to work on as many CPU architectures as possible, and so some optimizations are left out to maximize compatibility. If you don’t see this message, your binary is likely already optimized for your CPU.

針對TensorFlow Serving已發佈的Docker映像檔,其目的是盡可能在更多CPU架構上運作,所以會放棄某些最佳化措施來提高相容性。如果您並未看見上述訊息,代表您的二元檔案可能已針對您的CPU進行了最佳化。

 

Depending on the operations your model performs, these optimizations may have a significant effect on your serving performance. Thankfully, putting together your own optimized serving image is straightforward.

取決於您的模型所執行的運算,這些最佳化措施對您模型的部署效能可能有相當顯著的影響。好在,要把最佳化後的部署映像檔組合起來相當簡單。

 

First, we’ll want to build an optimized version of TensorFlow Serving. The easiest way to do this is to build the official Tensorflow Serving development environment Docker image. This has the nice property of automatically generating an optimized TensorFlow Serving binary for the system the image is building on. To distinguish our created images from the official images, we’ll be prepending $USER/ to the image names. Let’s call this development image we’re building $USER/tensorflow-serving-devel:

首先,我們要建置一個TensorFlow Serving經過最佳化的版本。最簡單的方式,是建置官方的TensorFlow Serving開發環境的Docker映像檔。這個映像檔有個很棒的屬性,就是可針對映像檔立基的系統,自動產生一個經過最佳化的TensorFlow二元檔。為區分我們自己建置的映像檔和官方的映像檔,我們將在自己建置的映像檔名稱前加上「$USER/」,讓我們把它命名為「$USER/tensorflow-serving-devel」:

$ docker build -t $USER/tensorflow-serving-devel \
-f Dockerfile.devel \ 
https://github.com/tensorflow/serving.git#:tensorflow_serving/tools/docker

 

Building the TensorFlow Serving development image may take a while, depending on the speed of your machine. Once it’s done, let’s build a new serving image with our optimized binary and call it $USER/tensorflow-serving:

建置自己的TensorFlow Serving開發映像檔根據您的電腦規格可能會花上一段時間。一旦建置完成,就能運用最佳化後的二元檔來建置一個新的部署映像檔,並將它命名為「$USER/tensorflow-serving」:

$ docker build -t $USER/tensorflow-serving \
--build-arg TF_SERVING_BUILD_IMAGE=$USER/tensorflow-serving-devel \ https://github.com/tensorflow/serving.git#:tensorflow_serving/tools/docker

 

Now that we have our new serving image, let’s start the server again:

既然我們已經擁有自己的部署映像檔了,再次啟動伺服器:

$ docker kill tfserving_resnet
$ docker run -p 8501:8501 --name tfserving_resnet \
  --mount type=bind,source=/tmp/resnet,target=/models/resnet \
  -e MODEL_NAME=resnet -t $USER/tensorflow-serving &

 

And finally run our client:

最後,運作前面提到的python客戶端腳本:

$ python /tmp/resnet/resnet_client.py
Prediction class: 282, avg latency: 84.8849 ms

 

On our machine, we saw a speedup of over 100ms (119%) on average per prediction with our native optimized binary. Depending on your machine (and model), you may see different results.

在我們的電腦上運用原生的最佳化二元檔,每次預測的時間平均提升了100ms以上(119%)。不過取決於您的電腦和模型,結果也許不盡相同。

 

Finally, feel free to kill the TensorFlow Serving container:

最後,請用「kill」指令來終止TensorFlow Serving容器:

$ docker kill tfserving_resnet

 

Now that you have TensorFlow Serving running with Docker, you can deploy your machine learning models in containers easily while maximizing ease of deployment and performance.

既然,您已讓TensorFlow Serving與Docker一同運作,自然能輕鬆地部署機器學習模型至容器內,不但能輕鬆部署,效能也能最大化。

 

Please read our Using TensorFlow Serving via Docker documentation for more details, and star our GitHub project to stay up to date.

如果想了解更多細節,請閱讀我們的教學文件,並關注我們的GitHub專案來得到最新訊息。

 

備註:如果想要選購AI人工智慧相關產品,歡迎洽詢機器人王國商城

 

相關文章

 

 

MCS雲服務推出可自定義的 Functional Data Channel

$
0
0

MCS雲服務推出可自定義的 Functional Data Channel

聯發科技實驗室旗下的 Mediatek Cloud Sandbox(本文後簡稱MCS) 最近推出了可讓使用者自行透過 JavaScript 來自定義的[資料運算(functional)]通道,根據MCS網站說法,本通道的特色如下:

  1. 可節省 IoT 裝置的電池電力
  2. 不再只顯示原始資料,可以顯示運算後的結果(例如電流感測器的數值,經過計算之後可以換為電費,對使用者來說更直觀。這當然也可以在裝置端做,但能在雲端做更好囉)
  3. 程式碼某些情況下(非全部)可直接在 MCS Function Data Channel 的定義中修改,不需要碰到實體裝置。 (思考一下如果您的裝置已經佈建在天花板上…要再次燒錄程式就很麻煩。當然也可以透過FOTA,但總是多一個方式)

請登入 MCS 之後建立一個原型,點選新增資料通道之後會看到以下畫面:

可以看到多一個[資料運算]通道選項,今天的主角就是他!請點選[新增]

當然也是有相關限制的:

  1. javascript 程式碼大小限制 < 5000 字元
  2. 不允許使用外部函式庫。
  3. 處理時間限制為每個資料點調用 < 20 毫秒。
  4. 運算結果可以傳到裝置內其他非資料運算型態的資料通道, 傳回值的時間戳記與上傳的資料戳的時間戳記相同。

目前支援的語言只有JavaScript,並有一段簡單的範例程式:

以下是MCS提供的範例程式提供的範例程式,其中只有一筆是來自裝置的真實資料 (context.value) 也就是華氏溫度,但以下程式碼中做了攝氏與華氏的溫度轉換,並顯示在兩個獨立的資料通道中。

var fahrenheit = context.value;
var celsius = (fahrenheit - 32) / 1.8;
return {
   dataChnId1: fahrenheit,
   dataChnId2: celsius
};

我們進一步用另一個範例來看看,請新增三個開關型顯示器通道,分別叫做remote1, remote2, remote3,這樣加上原本的functional data channel 就有四個。funtional 會根據本身收到的數值範圍來點亮三個開關顯示器的其中一個:

var tempf = context.value;
var tempc = (tempf - 32) / 1.8;

if (tempf<30){
   return {
      remote:1,
      remote2:0,
      remote3:0
};
}else if(tempf>70){
   return {
      remote:0,
      remote2:0,
      remote3:1
}; 
}else{
   return {
      remote:0,
      remote2:1,
      remote3:0
}; 
}

[教學技術文] 如何(不要)弄壞樹莓派

$
0
0
分類技術教學文
撰寫/攝影腦波弱老闆
時間看我們賣樹莓派有多久
成本用肝指數與血壓堆積而成
難度弄壞不難,找出原因就很挑戰
材料表綠色乖乖與靠得住

大家好,我是腦波弱老闆
在業界服務這麼久,深深體會『夜路走多了,什麼鬼都會遇到』跟『凡是有在用的東西,就會有壞掉的時候』。最近又適逢期末,從各種管道來報修的朋友就給他很踴躍。雖然比較起來,樹莓派不算是很貴,但如果在期末報告前,或是老闆/客戶要看展示/驗收時,樹莓派突然不想理你,真的會讓人覺得各種心酸與難過。

為了節省大家寶貴的時間,以及延長本公司同仁的肝臟的使用年限,以下幾項心得就先跟各位分享:

1.連接或更動GPIO線路時,請先關機斷電,避免損毀、短路。接線要快,這你知、我知、隔壁老王也知道,但萬萬不要在有電的情況之下接線或是拔線。
線路先都接好,並再三檢查,尤其注意電源與接地是否正確,再來開機送電。

2. 注意絕緣,樹莓派是一片裸露在外的電路板,你永遠不知道會碰到什麼東西,為保障你的心血結晶,避免發生無法預測的短路,請幫樹莓派加上外殼,或最少把它放在確定不會導電的地方,並避免任何有導電嫌疑的物品附近。

原廠外殼購物連結請點我,不想花錢買也可以上Thingiverse 下載各種設計款外殼

3. 樹苺派完全關機之後,再斷電,不要直接關閉電源或拔除micro USB電源線。通常這樣會讓作業系統或是micro SD卡比較容易往生,偶而也會有因此把樹莓派的micro USB接頭弄壞的。

也可以考慮購賣附有開關的microUSB線(購物連結https://www.robotkingdom.com.tw/product/micro-usb-switch-30cm/),或是把電源插在有附帶開關的延長線上。

4. 樹苺派的micro SD卡,不要經常插拔。樹苺派的micro SD插槽不是設計來多次重覆插拔用的,經常插拔SD卡容易造成插槽或SD卡的損傷。如果要抽換micro SD卡,請先關機關好再來。

其實,以上幾點也可以完全不理,只要多買幾片備用就可以(機器人王國購物傳送門),腦波弱老闆會很感激您的。


2009 – 2019,CAVEDU的十年挑戰(一)緣起與深耕機器人,2009~2012

$
0
0

最近很多朋友在Facebook分享2009 – 2019的十年挑戰,那我也來分享一下好了,只是不是我個人的照片,而是CAVEDU的出版史。認真算一下從我2008年退伍(也是CAVEDU成立)之後到2009寫出第一本書,到現在2019年初的所有著作與譯作,一共是47本。可以看出台灣科技教育關鍵字的變化呢。為了騙文章篇數,我打算將這十年分成三篇文,第一篇是2009到2012年:緣起與深耕機器人,2009~2012

千里之行,始於足下。只記得快退伍時(2026菜逼八),突然有個想法想寫一本樂高機器人的書(當年只會這個),待退老兵就是時間多,所以有很多時間可以慢慢想。週末放假回家就開始寫 (如果沒洞八的話,心情會比較好) ,也感謝非常多師長前輩們給予很多意見。

真的記得在星光部隊時也在想要怎麼寫 2008@官田

當時的機器人教學平台主流就是樂高NXT,雖然單價偏高但其他的選擇不多(當時Arduino在台灣還沒開始,當然有TI/利基等單晶片系統),我當時的想法真的很簡單:

我沒有辦法影響樂高的售價,但我希望能延伸它的使用壽命。

當時,很多熱心網友針對NXT的韌體進行改寫,首先推出的是BricxCC,後續接著leJOSRobotC (CMU 機器人學院)等等,都是根據NXT原廠韌體或直接換韌體來強化其功能。當年可以很快寫出leJOS結合樂高NXT,要感謝林祥瑞大大,當年他還在念高中的時候就很厲害了,後續到了Android / Linux / App Inventor / AI 相關開發上都仰賴他大力幫忙。對了,App Inventor的EV3元件,就是他做的喔。還記得也是在差不多的時候認識研發養成所的Bridan大哥,還有chlego大哥。跟著前輩請益的日子非常快樂。

由於樂高從RCX時代的圖控軟體Robolab是與 美國Tufts大學的 Chris Rogers教授合作,使用NI LabVIEW作為底層 (記得2009年還專程和宗翰去新加坡研討會上它的大師班呢)。所以NI原廠後來也跳出來說:使用LabVIEW搭配樂高的話,可以讓機器人更厲害。當年NI還有開過短期付費課程,針對樂高周邊開發商如何使用LabVIEW打包成NXT-G指令。這樣一來,CAVEDU對於NXT主機上的各種五花八門的變化大致上摸過一遍了。

到了2011年,正是Android崛起的時候,HTC大打機海戰術。我的第一支Android是HTC Wildfire(多點觸控只支援兩點,ROM 256MB,要裝什麼軟體都要先刪掉其他軟體,哈哈)。其實智慧型手機對於機器人來說是非常有吸引力的,請看以下的圖是我在演講時常用的:

在2010年 Google App Inventor 推出之後,由於Lego NXT有Direct Command因此在機器人端是不用寫程式的,手機(或PC)直接發送對應格式的位元陣列就可以控制樂高機器人 (EV3當然也可以這麼做,只是兩者的direct commnad格式不同)。所以2010~2011國內很多手機遙控機器人的競賽都是使用App Inventor + Lego NXT來進行。

2012寫出了台灣第一本App Inventor的書~得意

本文想特別題的書當然是我的第一本書 「機器人新視界 NXC & NXT」 。萬事起頭難,當年也面臨到小作者找不到出版社願意出版的問題。在熱心老師(就不點名了)的引薦之下,第一本書終於在2009年出版了,其中作者之一謝宗翰現在在MIT Media lab念博士呢。

現在回頭看這本書,裡面當然有很多的不成熟,甚至在遣詞用句上也很多表示興奮的語助詞。但不論如何,我清楚記得當年在寫每一個字的喜悅。我沒有很在意是否會賣,我單純覺得這個主題很好,我應該寫一點東西來給有需要的讀者(如果有的話):

我想要寫一本書

之後寫書就變成一種自虐的習慣:想寫 – 很煩 – 終於開工 – 反覆修正 – 所有人都耐性磨光大爆炸 – 磨磨磨 – 出版很開心 – 繼續想下一本要寫什麼

2009 ~ 2012出版/翻譯書籍如下:


延伸閱讀:阿吉老師的寫書小感

空氣品質檢測,使用LinkIt 7697開發板與MCS雲服務

$
0
0
撰寫/攝影 薛皓云/薛皓云
時間1小時
成本3700元
難度*** (1~10)
材料表 LinkIt 7697開發版 1個
RK IOT EXShield擴充版 1個
5V1A變壓器 1個
G3 PM2.5 sensor G3003/G5003
Grove VOC and eCO2感測模組
Grove 溫溼度感測器
Grove 繼電器
Grove OLED顯示器0.96”
Grove 光感測器

電路接線

燒錄程式之前,我們需要將感測器與7697透過跳線相接起來。

以下為腳位對應表:

DHT11溫溼度感測器 7697
1 5V
2 P7
4 GND
Grove光感測器 7697
sig P14(A0)
VCC 5V
GND GND
G3 PM2.5 感測器 G3003 7697
1 5V
2 GND
4 P3
5 P2
Grove VOC and eCO2感測模組 7697
SCL P8
SDA P9
VCC 5V
GND GND
Grove OLED顯示器0.96” 7697
SCL P8
SDA P9
VCC 5V
GND GND
Grove 繼電器 7697
Sig P4
VCC 5V
GND GND

腳位圖

程式燒錄

若尚未安裝Blockly環境的人,可以參考這篇<[LinkIt 7697開發板教學]BlocklyDuino圖形化介面 – 環境建置與介面>。首先開啟BlocklyDuino 程式,開啟完畢後,在右上角的位置點選「開啟舊檔」

選擇「LASS_7697_Blockly」範例並按下確定

開啟完畢後,將7697接至電腦上,確認完序列埠沒問題後,將程式燒錄至7697裡

將程式燒錄完畢後,即可在OLED上看到PM25數值、相對光強度、溫度以及濕度!

進階運用-MCS雲服務

在成功顯示感測器數值在OLED上後,我們可以將感測器的數值上傳至MCS上,實現遠端監控的功能。請在MCS(https://mcs.mediatek.com)上建立一個新的產品原型,內容可參考下圖:

創建完畢後,緊接著要新增資料通道。一共有5個顯示通道,1個控制通道。別忘了,要填入程式中的是通道ID而非通道名稱喔

  • 新增顯示通道名稱為「PM25」,通道ID為「PM25」,資料型態為「浮點數」,單位為「μg/m3」。
  • 新增顯示通道名稱為「CO2」,通道ID為「CO2」,資料型態為「整數」,單位為「ppm」。
  • 新增顯示通道名稱為「光強度」,通道id為「light」,資料型態為「整數」,單位為「%」。
  • 新增顯示通道名稱為「溫度」,通道id為「Temp」,資料型態為「浮點數」,單位為「°C」。
  • 新增顯示通道名稱為「濕度」,通道id為「Humi」,資料型態為「浮點數」,單位為「%」。
  • 新增控制通道名稱為「開關」,通道ID為「sw」,資料型態為「開關」。詳細如下六張圖

完成後如下圖

原型完成之後,請在頁面於右上方點擊新增測試裝置,輸入任意名稱之後點選創建,就可以了。在測試裝置頁面右上角會看到 DeviceId / DeviceKey,都要填入程式裡面喔

回到BlocklyDuino開啟範例,開啟”Lass_7697_MCS_Blockly“這個範例。

燒錄程式之前,要先修改程式內容,就是WiFi帳密與MCS相關資訊。在「初始化」>「連線到Wi-Fi AP」方塊中「Wi-Fi ID」以及「Wi-Fi密碼」。請將文字方塊中的RobotKingdom以及0223062900更改成自己的Wi-Fi ID以及Wi-Fi密碼,一定要注意大小寫。


在「初始化」>「連線到MCS」方塊中的「DeviceID」以及「DeviceKey」 將文字方塊中的亂碼改成自己的MCS的DeviceID以及DeviceKey

改完成後,就可以將程式燒錄製7697上囉!開啟MCS看看資料有沒有傳上去吧~

相關文章

Bit Kit micro:car – micro:bit小車 程式編寫

$
0
0

市面上搭配micro:bit 的機器人周邊套件相當多,先前已經寫過
Seeed Studio的 Grove zero kit 的 micro:car 開箱文,今天要介紹bit car在makecode程式環境中如何安裝擴充指令以及指令簡介。

Grove Zero Bit Kit micro: car 購買連結請按我

請開啟熟悉的makecode程式環境,畫面中央找到最下面的進階(Advanced) --> 添加套件 (extensions)。搜尋 “grove” 之後會看到以下畫面:

點選中間選項,就可以看到 “BitKit”指令集了,這樣就匯入完成了!指令分成車體 (Chassis) 與 顏色循線 (Color Line Follower)

接下來看看車體的動作指令:

在此可選擇基礎行為,有前後左右與順時鐘,逆時鐘旋轉
也有直接指定馬達電力的方式,比較進階的玩家應該會喜歡這種設定

再來是循跡指令,由於micro car的循跡模組有五顆光感測器,所以在循跡上可以有相當細緻的設定。


以下是設定哪一顆光感測器碰到線了:最左 / 左 / 中 / 右 / 最右與遺失等六種狀況
根據所看到的顏色來判斷,但這邊的顏色還是以光反射的強度來判斷,所以也只是個參考值。
也可以把偵測到的值顯示在micro bit 的LED矩陣上喔!

回顧一下可愛的 micro car吧:

Bit car 的主要構成元件

Seeed Grove Zero套件使用磁力來連接,真的相當有巧思

Seeed Grove Zero套件

190228 AI小車車聚@Fablab Taipei

$
0
0

2/28連假,許多好朋友在Fablab Taipei 碰頭,一起聊一下最近相當熱門的 AI 視覺辨識小車。當天非常熱鬧啊,有 Donkey Car 的李翼大哥、台灣樹莓派的sosorry 許大哥、Fablab Taipei創辦人的Ted等人,CAVEDU也是全軍出動喔!

車子還不會動沒關係,擺出來好看就先贏一半

當天大家針對技術上的細節做了很多交流,不管是小鴨車、小驢車,可愛的名字底下都是很多基礎演算法的討論。並且車子要實際下場跑,就有機構、電源與配置的實際問題,這點絕對不是模擬環境可以做到的。

光是車體要怎麼選,大家就把露天、蝦皮還有淘寶上的各種店家都逛過一遍了。由於遙控車產業很成熟,不同價位車體上的硬體等級都差不多。所以大家結論傾向於根據需求去找適合的車體,而不是從頭改到尾。

回想2016年,CAVEDU曾經舉辦過動力奔馳自造松,感謝台灣優質遙控載具製造商雷虎科技贊助 Kaiser XS 1/8 吉普車車體,當時是搭配 LinkIt Smart 7688 來製作第一人稱視角的遙控車賽。車子跑非常快,轉彎也很細膩呢。

CAVEDU一定會找出更適合上課的模組化車體的!敬請期待喔

預計4月初會再辦一次車聚,歡迎大家一起來觀摩

參考資料:

臉部識別打卡鐘-樹莓單機版

$
0
0
撰寫/攝影 CH.Tseng
部落格https://chtseng.wordpress.com/
Facebookhttps://www.facebook.com/chenghsun.tseng

以往…當週遭的親朋好友們聽到上班的公司不用打卡時,總會露出欽羨的表情,認為這才是美式作風的信任與自由,但是隨著向下的薪資漲幅曲線與老闆嘴唇的微笑曲線呈現死亡交叉之後,大家才猛地發覺原來上下班強制刷卡才是保障員工福利、反映實際工時的好方法,於是勞基法也要求公司必須提供並妥善保存員工每日的打卡記錄。

為了要打卡,一張張被戲稱為狗牌的RFID卡片成了上班族的標準配飾,有的人掛在脖子、有的人別在胸前、有的人放在褲袋或皮包,但無論怎麼擺放,還是不像悠遊卡放在身上那麼讓人心甘情願。有鑑於目前各種開源的臉部識別軟體這麼盛行,我們何不DIY一台臉部識別刷卡機來取代刷卡呢?只要一台樹莓派加上LCD螢幕,一支Movidius神經運算棒,再加上兩支web camera,就能完成一台辨識速度和準確率足敷所需的人臉辨識打卡機了,就算忘了帶識別卡片也沒關係。

單機板與Edge版

文中所謂的樹莓派單機板,代表所有的影像處理與辨識推論都在樹莓派本機上完成(僅最後的刷卡登錄及開門動作是送出指令由後端機器執行),未來我們也將試作如下的Edge版本,以便適合多台刷卡鐘情境的建置。

樹莓派單機版樹莓派Edge版

材料及組裝:

首先準備下列的材料:

  1. Intel Movidius Stick一代。
  2. 樹莓派3 B
  3. 樹莓派官方7” 觸控LCD
  4. Web Camera二支。建議HD畫質,本範例用的是Logitech C270 HD。
  5. USB 3.0 HUB,接多個USB裝置使用。
  6. 隨身碟(儲存相片)、按鈕、音源增益模組+揚聲器(也可以直接用喇叭)。
  7. LED燈+繼電器模組。補光用,如果現場環境夠亮可不需要。

材料使用的補充說明

樹莓派官方版七吋觸控LCD

官方所出的觸控LCD套件,安裝簡單使用方便且不需額外的driver。只是要注意這個板子裝到樹莓派後,整體需要的電量極大,至少要2.5A以上的USB電源轉換器才能正常驅動。

將排線接到樹莓派的MIPI DSI display port,另外再接上5V及GND就完工了。

兩支USB web camera

如果僅使用一支web camera來拍攝臉孔進行辨識,那麼我們要非常擔心使用者可能直接用平面的相片或手機畫面來矇騙過關,是故,我們同時使用兩支camera來拍攝不同角度的臉孔,應可避免這個問題。

本刷卡系統設計為同時拍攝兩張不同角度的人臉相片來析,除了正面的鏡頭外,另一支鏡頭的角度您可自行選擇從半側面、上方或下方來拍攝。

使用隨身碟或網路磁碟儲存

由於希望將所有資訊,包含使用者在辨識時所拍的相片、使用記錄等都要儲存下來,以利後續追蹤改善並提供人事單位備查,因此IO的讀寫會很頻繁,使用外接儲存方式將所有資訊存在隨身碟或直接傳送到網路硬碟,以避免直接儲存到樹莓的OS SD disk是比較理想的作法。

加入語音功能

由於希望使用者在操作時能有語音的輔助,因此設計讓系統在每個步驟前唸出提示。使用音源增益模組(如GF1002)加上揚聲器,可避免使用體積較大的喇叭,且GF1002的聲音品質及音量在可接受範圍內。

使用USB HUB擴充樹莓的USB介面

Movidius Neural Stick體積相當大,插到樹莓派後會發現除了本身佔用一個還會佔據左右側的空間,因此原本四個USB插槽只剩二個可使用,此時若想再接USB keyboard、mouse、web cam、以及外接儲存用的隨身碟,勢必得加上USB HUB擴充才行。

所有的材料及零件的連接方式就如同下圖。

Button繼電器
功能說明按下後開始辨識開始拍照時開啟LED
GPIO腳位1518

最後使用3D printer列印外殼

外殼設計重點:

  1. 希望可吊掛於牆上。
  2. 內部空間可放置LCD、樹莓派、Movidius StickUSB HUB、音源模組等。
  3. Web camera可固定於上下方。
  4. 可放置一個按鈕用來進行辨識。

左側為前方外殼,右側為固定於牆壁的後殼。

組裝完成外觀

您可從https://github.com/ch-tseng/RPI_Facenet_Movidius_V1/raw/master/face.stl 與https://github.com/ch-tseng/RPI_Facenet_Movidius_V1/blob/master/wall.stl下載該3D stl檔來列印。

樹莓與Intel Movidius Stick的安裝設定

Movidius的NCAPPZOO提供了Tensorflow版本的Facenet model sample,執行起來速度相當不錯。請先下載並安裝最新版的Raspbian OS之後,再將Neural Compute Stick插到USB,開始在樹莓派進行NCSDK安裝。

步驟:

1.安裝下列套件:(可將下列內容放置於shell檔中一次執行比較方便)

sudo apt-get update

sudo apt-get upgrade –y

sudo apt install python-pip python3-pip

sudo apt-get install -y libusb-1.0-0-dev libprotobuf-dev

sudo apt-get install -y libleveldb-dev libsnappy-dev

sudo apt-get install -y libopencv-dev

sudo apt-get install -y libhdf5-serial-dev protobuf-compiler

sudo apt-get install -y libatlas-base-dev git automake

sudo apt-get install -y byacc lsb-release cmake

sudo apt-get install -y libgflags-dev libgoogle-glog-dev

sudo apt-get install -y liblmdb-dev swig3.0 graphviz

sudo apt-get install -y libxslt-dev libxml2-dev

sudo apt-get install -y gfortran

sudo apt-get install -y python3-dev python-pip python3-pip

sudo apt-get install -y python3-setuptools python3-markdown

sudo apt-get install -y python3-pillow python3-yaml python3-pygraphviz

sudo apt-get install -y python3-h5py python3-nose python3-lxml

sudo apt-get install -y python3-matplotlib python3-numpy

sudo apt-get install -y python3-protobuf python3-dateutil

sudo apt-get install -y python3-skimage python3-scipy

sudo apt-get install -y python3-six python3-networkx

sudo pip3 install opencv_contrib_python

sudo apt-get install -y libatlas-base-dev

sudo apt-get install -y libjasper-dev

sudo apt-get install -y libqtgui4

sudo apt-get install -y libqt4-test

sudo apt-get install -y python3-pyqt5

sudo pip3 install imutils

sudo apt install -y cython

sudo -H pip3 install cython

sudo -H pip3 install numpy

sudo -H pip3 install pillow

sudo pip3 uninstall tensorflow

wget https://github.com/lhelontra/tensorflow-on-arm/releases/download/v1.7.0/tensorflow-1.7.0-cp35-none-linux_armv7l.whl

sudo pip3 install tensorflow-1.7.0-cp35-none-linux_armv7l.whl

rm tensorflow-1.7.0-cp35-none-linux_armv7l.whl

確認OpenCV及Tensorflow的安裝是否完成:

python3

>>> import cv2

>>> import tensorflow

2.加大swap size:

sudo nano /etc/dphys-swapfile

將CONF_SWAPSIZE由預設的100(MB)增加為1024(MB)以上。接著重啟dphys-swapfile service。

sudo /etc/init.d/dphys-swapfile restart

3. 安裝NCSDK:

cd ~; git clone -b ncsdk2 http://github.com/Movidius/ncsdk

cd ncsdk/

nano ncsdk.conf → 將#MAKE_NJOBS=1前方的mark #移除

sudo make install

這個install的過程在樹莓派上相當久,約需要 2-3小時。之後,會看到如下方的訊息,即安裝完成。

修改sudo nano /etc/dphys-swapfile

將CONF_SWAPSIZE還原為預設的100(MB)再重啟dphys-swapfile service。

sudo /etc/init.d/dphys-swapfile restart

4.測試是否work

cd ~/ncsdk/examples/apps/hello_ncs_py/

make run

使用模式設計

為了方便各種使用情境,該刷臉系統設計了三種使用模式,以及一個管理者使用的新增user模式,預設為模式二。

使用模式一:輸入工號&全公司人臉比對

使用者按鈕刷臉後接著輸入自己的工號,系統便將拍攝者的臉孔與全公司臉孔進行比對,取得最接近且低於門檻值的工號,若該工號與使用者輸入的工號一致,則認定為該員工本人無誤。

使用模式二:輸入工號&比對該工號人臉

使用者按鈕刷臉後接著輸入自己的工號,系統便開始比對系統中該工號的臉孔與拍攝者的臉孔是否一致且低於門檻值,若是的話則認定為該員工本人無誤。

使用模式三:不需輸入工號 & 比對全公司人臉

使用者按鈕刷臉後不需要輸入工號,系統便開始比對全公司的臉孔與拍攝者的臉孔,取出最相近者並檢查相似度是否低於門檻值,若是的話則認定拍攝者為該員工。

安全性:

模式一 > 模式二 > 模式三

  1. 模式一要求使用者的臉孔與輸入的員工工號,必須與全公司臉孔最相似的那位員工ID一樣,不單單只要低於相似門檻值即可,因此在這三種模式中是安全性最高的。
  2. 模式二不比對全公司員工,在使用者輸入工號之後,系統僅會比對該臉孔與拍攝者的臉孔其相似度是否低於門檻值,是的話則通過認定。
  3. 模式三僅要求使用者刷臉而不需輸入工號,系統抓取全公司員工的臉孔與拍攝者的臉孔進行比對,取得最相似的那一張且其相似度低於設定的門檻,則通過認定。

方便性:

模式三 > 模式二 > 模式一

對於使用者來說,模式三是最簡單方便的,因為只要按鈕刷臉即可,若通過驗證就會自動刷卡開門。模式二與模式一皆需要刷臉與輸入工號,因此對使用者來說操作上並沒有差別。

使用者刷臉打卡開門的時間:

模式一 > 模式三 > 模式二

模式一與三都需要進行全公司人臉比對,但模式三不需要輸入工號,因此省了工號輸入的操作時間。模式二雖然也要輸入工號,但僅比對拍攝者的工號與臉孔是否相符,對使用者來說模式二所需要的等待時間最少。

V: necessary  O: time

模式一模式二模式三
輸入工號
比對所有人臉
對使用者方便操作OOOOOOO
使用者打卡所需時間OOOOOOO

對於資源有限的樹莓派來說,模式二是折衷後最佳的選擇。

給管理者的新增模式

本模式提供給管理員使用,當管理員透過臉卡辨識成功後,若在10秒鐘內再次按下辨識鈕則進入新增模式,可開始輸入員工工號註冊或增加比對用的臉孔相片。

使用情境及注意事項

1.給使用者一些在鏡頭前的準備時間,避免使用者還沒擺好pose或還在移動中,系統就已經偵測並取得臉孔開始辨識。

  • 改善方式:使用者按下按鈕並顯示預覽畫面之後,讓系統等待指定的秒數後才開始偵測臉孔,可讓使用者在預覽畫面中先調整好角度姿勢。

2.某些偵測到臉孔位於影像邊緣,可能導致部份偵測到的臉孔是不完全的。

  • 改善方式:設定偵測時臉部中心點不可超過影像中心點週圍的設定範圍內。

3.畫面中除了使用者,背後還有其它非相干的臉孔一同入鏡。

  • 改善方式:設定只取最大的那張臉孔,且其尺寸必須大於設定的大小。

4.不同角度的camera計算出的差異程度不同:

  • 改善方式:兩支camera所拍攝的角度不同,其通過辨識的分數也不同,因cam0與cam1應分別有不同的threshold值,而非共用相同的值。


0.2581734 / 0.8671345
Pass / Failed
0.1392377 / 0.8281625
Pass / Failed

5.由於使用者移動造成取得的影像模糊,影響辨識結果:

  • 改善方式:使用OpenCV提供的cv2.Laplacian再取其變異數,如:cv2.Laplacian(gray, cv2.CV_64F).var(),其值愈高代表圖片愈清楚。

6.某個使用者經常發生辨識失敗的情況:

  • 改善方式:辨識時,系統會依序讀取該工號資料夾中的人臉相片與目前拍攝者的相片進行比對,若其差異度低於threshold值則認定為同一人。因此,同一位使用者可以有多張臉部相片供比對,例如,有戴眼鏡與摘下眼鏡、有戴口罩與未戴口罩、張嘴與閉著嘴等。

7.系統很難detect到face:

  • 改善方式:注意現場環境光源,無論整體夠不夠亮,只要是背光的環境,無論快速的Haar Cascade、強悍的Dlib或深度學習的MTCNN,都很難偵測到臉孔甚至容易誤判,因此視環境需求來打光是必要的。

Facenet的使用及辨識計算

此部份請參考另一篇知識文件的介紹:「Facenet介紹與使用」

主程式放置於:https://github.com/ch-tseng/RPI_Facenet_Movidius_V2.git,請如前述將硬體組裝好並安裝NCSDK之後,git clone程式下來,確認並修改下列參數後,執行python3 main.py便可執行。

參數說明:

#要使用何種臉部偵測技術?四種可選:dlib / cascade / mtcnn / mtcnn2,MTCNN與MTCNN2的差別在於,MTCNN是修改自https://github.com/ipazc/mtcnn,而mtcnn2是修改自ncappzoo

faceDetect = "cascade"

#本系統是否只淮許在上班時間運作?

onlyWorkDay = True

#若只淮許在上班時間運作,請設定下方的休假日期

notWorkDay = [ "2/4", "2/5", "2/6", "2/7", "2/8", "2/28", "3/1", "4/4", "4/5", "5/1", "6/7", "9/13", "10/10", "10/11" ]

#系統的執行模式,如上文所述,有三種模式。

runMode = 2

#隨身碟的路徑

topDIR ="/media/pi/3A72-2DE1/"

#拍攝的相片要放置於本機的webroot下,提供透過URL來讀取. (請安裝apache2或lighthttpd)

toWebserver = "/var/www/html/door/"

#設定logging記錄檔

logging.basicConfig(level=logging.INFO, filename=topDIR+'logging.txt')

#for Movidius Stick的Facenet model

GRAPH_FILENAME = "facenet_celeb_ncs.graph"

#語音wav檔的path

WAV_FOLDER = "/home/pi/works/door_face/wav/"

#cam0 的分數要低於多少才算通過辨識

FACE_MATCH_THRESHOLD_cam0 = 0.35

#cam1 的分數要低於多少才算通過辨識

FACE_MATCH_THRESHOLD_cam1 = 0.35

#cam0與cam1 的平均分數要低於多少才算通過辨識

FACE_MATCH_THRESHOLD_avg = 0.35

#設定相機所拍攝的解析度

webcam_size = ( 640,480)

#拍攝的相片是否要旋轉?

cam1_rotate = 0

cam2_rotate = 0

#開始辨識按鍵的GPIO腳位

btnCheckin = 15

#打開LED補光燈的GPIO腳位

pinLight = 18  #LED燈pin

#有權限進入管理模式的工號(使用此工號登入可進行新使用者的註冊)

adm_users = [200999]

#等待幾秒再開始辨識, 免得使用者還沒準備好就拍了相片並辨識了

wait_to_detectFace = 6

#拍照時,cam0的中心要在紅框中間多大的距離內才行

offsetFaceBox = (10,10)

#拍照時間超過幾秒沒有動作,則回到等待狀態

captureTime = 60

#相片是否清楚的threshold,高於此值才算清楚,否則會繼續detect face

blurRate = 120  # higher is more clear, lower is more blurly

#所有拍攝到的臉部相片, 都會放置於此path

historyPicPath = topDIR+"history/"   #for those face is pass the required size and will be check

#存放有註冊使用者供比對的人臉相片

validPicPath = topDIR+"valid/"

#OpenCV Haar Cascade file的path,如果你並非使用Cascade Haar來detect face則可忽略

face_cascade = cv2.CascadeClassifier('cascade/haarcascade_frontalface_default.xml')

#設定Cascade Haar的參數 

cascade_scale = 1.1

cascade_neighbors = 8

minFaceSize = (120,120)

#cam0與cam1臉部area尺寸最小不可低於

minFaceSize1 = (120, 120)

minFaceSize2 = (90, 90)

#設定DLIB detect face的偵測比率,如果你並非使用DLIB detect face則可忽略

dlib_detectorRatio = 0

#後端打卡記錄的Post URL

posturl="http://api.sunplusit.com/api/DoorFaceDetection"

後端系統動作

當使用者執行刷臉完畢後,樹莓派便會運行Facenet透過Movidius stick計算其Embedding features與登記在系統中的臉孔圖片差距,若低於threshold則認定刷卡成功,否則失敗。無論成功或失敗,這項刷卡記錄皆會透過URL Post給後端的web server,儲存到資料庫中。這部份感謝公司的負責web的大神Vincent大力協助。

若刷卡成功,web server會同時publish開門訊息給MQTT server,負責控制大門口開關的裝置(也是樹莓派)收到後,便會把門打開讓刷卡者進來。整個刷卡過程的相片皆會儲存到資料庫中,因此人事部門的同仁可即時的在網頁上查詢到刷卡記錄,包含刷卡當時所拍攝的臉孔相片。

人臉辨識刷卡的執行示範

想了解更多CH.Tseng,可以點此連結劉瀏覽更多文章喔~

Google Coral AI平台發布:單板電腦與USB加速器

$
0
0

Google 最近推出了自家的 AI 平台,叫做 Coral,有分成開發板USB加速器兩種規格。前者在規格上類似於 Raspberry Pi,而USB加速器很明顯就是劍指 Intel Movidius 神經運算棒

Coral網站上提供了預先訓練好的模型,針對常見用途(影像分類、物件偵測)都可以直接下載來玩玩看,非常方便。Mouser網站已經可以購買了(但目前不出貨到台灣…)

Google Coral Dev Board 149.99美金

先來看看開發板的規格,Coral網站上也有簡易教學 (開發板 / USB加速器搭配Pi):

Edge TPU 模組規格

CPUNXP i.MX 8M SOC (quad Cortex-A53, Cortex-M4F)
GPUIntegrated GC7000 Lite Graphics
ML acceleratorGoogle Edge TPU coprocessor
RAM1 GB LPDDR4
Flash memory8 GB eMMC
WirelessWi-Fi 2×2 MIMO (802.11b/g/n/ac 2.4/5GHz)
Bluetooth 4.1
Dimensions48mm x 40mm x 5mm

開發板規格

Flash memoryMicroSD slot
USBType-C OTG Type-C power Type-A 3.0 host Micro-B serial console
LANGigabit Ethernet port
Audio3.5mm audio jack (CTIA compliant) Digital PDM microphone (x2) 2.54mm 4-pin terminal for stereo speakers
VideoHDMI 2.0a (full size) 39-pin FFC connector for MIPI-DSI display (4-lane) 24-pin FFC connector for MIPI-CSI2 camera (4-lane)
GPIO3.3V power rail 40 – 255 ohms programmable impedance ~82 mA max current
Power5V DC (USB Type-C)
Dimensions88 mm x 60 mm x 24mm (Pi 3 85mm x 54mm)

也有 USB 加速器的型態,價格74.99美金。

Google Coral USB Accelerator – 74.99 美金

USB加速器如果要接在 Raspberry Pi 的話,適用 USB 2.0 port 的速度。作業系統支援Debian Linux,並可執行TensorFlow Lite

ML acceleratorGoogle Edge TPU coprocessor
ConnectorUSB Type-C* (data/power)
Dimensions65 mm x 30 mm

最後則列出 FAQ 頁面上的簡易數據比較,效果相當驚人啊!但官方也表示不同的平台、模型與執行機器還是會影響實際結果,大家參考看看囉:

Model architectureDesktop CPU*Desktop CPU *
+ USB Accelerator (USB 3.0)

with Edge TPU
Embedded CPU **Dev Board †
with Edge TPU
MobileNet v147 ms2.2 ms179 ms2.2 ms
MobileNet v245 ms2.3 ms150 ms2.5 ms
Inception v192 ms3.6 ms406 ms3.9 ms
Inception v4792 ms100 ms3,463 ms100 ms

相關文章:https://hackaday.com/2019/03/05/google-launches-ai-platform-that-looks-remarkably-like-a-raspberry-pi/

https://hackaday.com/2019/03/05/google-launches-ai-platform-that-looks-remarkably-like-a-raspberry-pi/

從運算思維到運算行動 – MIT Hal Abelson演說影片

$
0
0

2018年 MIT App Inventor 團隊的Hal Abelson教授受邀赴師大參加ICCSM 2018研討會,有1小時的專題演講:”From Computational Thinking to Computational Action“。談到他如何受到 Seymour Papert 教授的影響、進入MIT任教、與Google創立App Inventor,以及為何要提出 “運算行動 (Computational Action)”一詞

Hal 還有聊到當年(1960-70)與 Seymour Papert 教授進行logo計劃但被所有人笑是瘋子的故事,但到了西元2000年之後,家家都有電腦,小朋友也能以合理價格取得合理價位的可程式控制機器人。我2016年去MIT參加 master traniner program時,親耳聽到當年一套logo機器人要價6000美金!40年之後,只要50美金的Arduino或任何MCU機器人的功能已經遠非當年可比。
Youtube影片在本文最末,大家可以搭配投影片慢慢看。


其中有一句話讓我相當感動:

電腦革命實際上是對於我們思考方式以及我們表達自身想法的革命。The computer revolution is a revolution in the way we think and in the way we express what we think. – Hal Abelson / Gerald Sussman(很愛喝烏龍茶) / Julie Sussman

很高興有機會帶 Hal 台北各處走走,也希望以後多有機會去 MIT 玩~


NVIDIA Jetson AGX Xavier Developer kit 開箱開機!

$
0
0

NVIDIA Jetson系列自2014 首發 TX1以來就是針對專業開發者的超級電腦,鎖定虛擬實境、機器人、車用等專業嵌入式用途提供穩定的系統與強大的運算效能。2017年接續推出了第二代Jetson TX2,一直到去年2018年底針對機器人與自動化平台所推出的Jetson Xavier。根據NVIDIA原廠說明,Xavier比上一代 TX2 相比,可提供 20 倍以上的效能以及 10 倍以上的能源效率。

NVIDIA Jetson系列規格表(引用自NVIDIA原廠網站)

我2018年底還在MIT CSAIL擔任訪問學者時,也特別去看 MIT race car課程的期末demo。本課程由NVIDIA贊助每組一套 TX1(好羨慕啊)搭配1/10的遙控車身來打造一台自動駕駛車。

不過,馬兒快也要好配備(周邊裝置)以及優秀騎士(軟體與課程)才能相得益彰,所以由下圖可以看到,有相當豪華的周邊裝置來搭起一台自動駕駛車的所需功能。您可以到課程網頁看更詳細的說明。

MIT race car課程

1. Jetson Xavier 開箱

來看看今天的主角吧!從TX1以來就是同色系的紙盒與外包,簡單幾個字說明了裡頭的不平凡(好像是相機開箱文的語氣)。

開箱之後看到以下配備,相當精簡:Jetson Xavier模組、USB type-C傳輸線、USB A-C轉接線與電源線。

近一點看看今天的主角吧!非常夠份量的黑色本體上有金屬散熱”體”(這種大小已經不能說是散熱片了),底下還有一個相當大的風扇。說明了Xavier 即便標榜是較低的功耗,但熱力依然驚人。開機操作一下Ubuntu就可以感覺到金屬的溫度變得溫溫的了

Xavier既然是一台標榜高效能的嵌入式主機,當然需要直接與週邊裝置溝通,所以各式接頭算是相當完整。

但常用的USB介面第一眼只有一個 USB typeA,所以光是鍵盤滑鼠就不夠用了… 這時候才知道盒裝裡面的 USB A-C轉接線是用來幹嘛的。立馬去買一個 USB hub!其他各角度寫真就請大家欣賞囉。

另一個角度則是GPIO pin 與另一個 USB type C port。由此可以寫個小程式來電子元件了,如以下網友範例。當然,如果大費周章弄了一台Xavier只是做這個… 不如用Raspberry Pi 或 Arduino比較快,所以我們著眼點在於其高效能所能帶來的體驗與擴充彈性。

也有外接CAN BUS的網友範例,很棒!

開箱到此完畢,開機吧!

2. Jetson Xavier 開機

由於本身安裝好了Ubuntu 18.04,Xavier開機相當簡單,請先接好鍵盤滑鼠,就可以接上電源了。開機之後會進入 terminal 介面並要求您安裝 Ubuntu,請用以下指令安裝即可,螢幕上也都有寫。預設的帳號密碼都是nvidia,後續可以自行修改。

cd ~/NVIDIA-INSTALL
sudo ./installer.sh
sudo reboot (重新開機)

重新開機之後就會看到橘紫色的Ubuntu桌面。由於Xavier本身沒有無線網路,所以需要用實體網路線來連上網路,這樣下一步Host主機才能對 Xavier 安裝 Jetpack。可以用 ifconfig指令來查詢一下是否正確連上網路。

3. Host主機設定

根據原廠文件,需要另外準備一台Ubuntu 16.04以上的電腦,如果您手邊沒有Ubuntu作業系統電腦的話,可以用 VirtualBox這類虛擬主機軟體來掛載Ubuntu作業系統也是可以做到的,請參考我們的教學

Ubuntu電腦搞定之後,請用此電腦下載 NVIDIA JetPack SDK (本文後簡稱JetPack來對Xavier刷機,這是為了安裝最新的軟體套件,包括驅動、CUDA Toolkit、cuDNN、TensorRT、opencv等AI常見的工具包。請由此下載JetPack,目前支援Xavier的最新版本為 JetPack 4.1.1 DP,下載完成如下圖。如果您手邊的機器為TX2或TX1的話,請下載 JetPack 3.3

修改檔案權限:

chmod +x JetPack-L4T-4.1-linux-x64_b5.run

使用本指令開始安裝,安裝過程請參閱以下各圖:

./JetPack-L4T-4.1-linux-x64_b5.run

完成之後,要開始對Xavier安裝Jetpack了。系統提供了兩種方式,在此選用透過USB type C的線來連接 Host 主機與您的 Xavier。如果選用以下方式的話,需要Host主機與Xavier都在同一個網段之下。

選擇網路卡

終於可以開始刷機了,按下Next

這時會啟動一個終端機畫面。這時需要把Xavier 設定為 recovery mode:1. 先把Xavier關機並確實拔除電源。2. 接好網路線。3. 拿出 USB type C傳輸線連接 Xavier 與 Host 主機,type C 接頭要接到 Xavier 靠近顯示燈附近的那個 type C接頭。4. Xavier開機並按著 Recovery 鍵不鬆開,再按一下Reset鍵後放開,等兩秒之後再放開Recovery鍵。這樣就能讓 Xavier 進入 recovery mode。引用 NVIDIA原廠文件,如下圖:

如果您的Ubuntu是執行於虛擬機(如本篇做法),需要設定 USB filter。

確認Xavier確實是在 recovery mode也接上host了,這時請在上述所出現的終端機畫面按下 enter。就會開始安裝,細部說明如下各圖:

關閉這個 terminal 並按下Finish 來關閉 installer。

完成了!真的不容易呢。接下來會和大家分享各種有趣的專題應用,如文中有錯誤也請大家不吝指正。

心得

終於拿到 Xavier了,這款平台從當初一發佈就很想入手來玩玩看,感謝 NVIDIA Taiwan。

不過在設定方面總是覺得有點卡。以安裝Jetpack來說,如果是常用套件的話,希望NVIDIA可以幫使用者先裝好,後續再透過指令更新即可。開機即用應該是大家最開心的事情吧!

CAVEDU 常常到各大專院校辦研習,按照上述步驟在操作時,其實並非所有人都熟悉Linux介面與指令,做起來一定卡卡,更別說多台Xavier同時下載這麼大的檔案對整體網路的負擔了呢。

NVIDIA 超級震撼彈!Jetson nano,低功耗且超平價AI電腦

$
0
0

NVIDIA 近年在AI領域可說是是叱吒風雲啊,不論是前陣子上市的RTX8000/6000/5000系列顯卡(最高規價格近達10000美金),以及專門為機器人或車用等嵌入式平台的Jetson系列(最新推出的 Xavier 開發套件 (開箱文請點我) ,原廠定價1299美金),標榜的都是有目共睹的超高效能。當然隨著就是相當驚人的售價,對於一般使用者來說,不太容易入手啊。

NVIDIA 對於單板電腦的新定義

上述狀況在今天有了驚人的發展。針對邊緣裝置以及maker族群對於運算能力的殷殷期盼,NVIDIA推出了Jetson nano 與 Jetson nano 開發套件,價格分別只要$129與$99美金!

Jetson nano 要進軍這個價格區間,又要扛著 NVIDIA 一直以來對於運算能力的自豪。可以看出在規格與定位上的細細思量。一舉改寫了150美金這個價格區間的運算能力定義。而Jetson nano 開發套件如同老大哥 Xavier一樣,常用的接頭都已經做出來了。就當作是一台更快且可執行完整 Ubuntu系統的單板電腦吧。主打亮點如下:

Jetson nano Jetson nano開發套件
核心數128 CUDA core / 4 core CPU同左
記憶體4GB同左
運算速度
GFLOPS =
每秒浮點運算10億次
472 GFLOPS 同左
耗電5W / 10W同左
I/O接頭常用接頭已完備

深度學習推論速度

至於大家最關心也是 NVIDIA 主打的 “AI to Edge“,那就要來看看各主流神經網路模型在Jetson Nano上跑起來的速度如何。也請到NVIDIA官方頁面看看與其他平台像是Google Coral、Raspberry Pi (QQ,怎麼拿我來比啦…) 的效能比較:

看數字也可以看影片,來看看 Jetson Nano 同時進行8隻影像中物件偵測的效果吧!這樣的應用真的超多的啊!

https://youtu.be/Y43W04sMK7I

JetBot AI 機器人

NIVIDA 也推出了以ROS作業系統為主的 Jetbot 機器人套件 (wiki),價格為$250美金。 Jetson nano 最低5W的功耗對於機器人玩家來說是大好消息,因為機器人的重量/移動速度/電源功率可說是息息相關。愈耗電的平台就需要愈大顆的電源,機器人總不能拉一條線到插座吧,但電源變大會讓機器人變胖變重,至終移動速度一定快不起來。牽一髮動全身啊!


CAVEDU的看法:NVIDIA給入門學習者的一份大禮

對CAVEDU來說,Jetson nano無疑是NVIDIA給入門學習者的一份大禮。回顧當年Raspberry Pi的各式相容板(我笑稱為水果大戰),已經讓大家知道硬體效能好只是基本款,重點是軟體環境是否整合以及教學資源是否豐富。因為對教學場域來說,不一定有時間或有能力去處理複雜的環境安裝與套件的相容性問題。而教學上如果老是卡卡的,至終也會影響到教學者對於這個平台的信心。放心,NVIDIA 提供了 “Two Days to a Demo” 帶大家如何趕快上手Jetson平台。

我看到了一個很棒的地方,就是Jetson nano的Jetpack SDK 已經整合了ROS (Xavier就沒有事先裝好,相當可惜)。這樣一來對於機器人玩家或相關教學者 (國內很多機電領域的大學實驗室都在用ROS進行相關研究)來說,ROS的諸多好用功能就是信手捻來,而不用再安裝到天荒地老。而上層也提供了諸多實用的模組:包括深度偵測、物件偵測、姿態手勢辨識與路徑規劃等等,每一個對於機器人應用來說都是非常關鍵的功能。對於NVIDIA這個做法,要很衷心地說聲:感謝!

Jetson Nano 規格一覽

GPU128-core Maxwell
CPUQuad-core ARM A57 @ 1.43 GHz
Memory4 GB 64-bit LPDDR4 25.6 GB/s
StoragemicroSD (not included)
Video Encode4K @ 30 | 4x 1080p @ 30 | 9x 720p @ 30 (H.264/H.265)
Video Decode4K @ 60 | 2x 4K @ 30 | 8x 1080p @ 30 | 18x 720p @ 30 (H.264/H.265)
Camera1x MIPI CSI-2 DPHY lanes
ConnectivityGigabit Ethernet, M.2 Key E
DisplayHDMI 2.0 and eDP 1.4
USB4x USB 3.0, USB 2.0 Micro-B
OthersGPIO, I2C, I2S, SPI, UART
Mechanical100 mm x 80 mm x 29 mm

Jetson Nano 開發套件 I/O 接頭

看圖說故事,Jetson Nano的 GPIO 腳位與 Raspberry Pi 3 應該是一樣的,這樣代表Pi的擴充板也可以用於 Jetson Nano嗎?拿到之後要趕快試試看。

USB4x USB 3.0 A (Host) | USB 2.0 Micro B (Device)
CameraMIPI CSI-2 x2 (15-position Flex Connector)
DisplayHDMI | DisplayPort
NetworkingGigabit Ethernet (RJ45)
WirelessM.2 Key-E with PCIe x1
StorageMicroSD card (16GB UHS-1 recommended minimum)
Other I/O(3x) I2C | (2x) SPI | UART | I2S | GPIOs

使用Intel® Movidius™神經運算棒 2 & OpenVINO-在樹莓派上跑自駕車

$
0
0
作者袁佑緣、林祥瑞
時間二十分鐘
難度***
材料表電腦/筆記型電腦/
RK-樹莓派神經網路自走車套件
Intel® Movidius™神經運算棒 2


在本篇文章中,我們將使用第二代的NCS, 並搭配全新的函式庫OpenVINO來實做。

CAVEDU團隊之前曾經使用樹莓派結合NCS來實作自駕車,課程推出後受到大家的熱烈迴響,感謝大家的熱情參與, 我們之前上課所使用的NCS為一代的版本
下圖是我們是我們在微軟的課程畫面

機器人第一視角影片(https://www.youtube.com/watch?v=-VaDUODWxHA)h

安裝 OpenVINO

  1. 準備樹莓派,並灌好Raspbian作業系統。 您可以在去樹莓派的官網下載最新的映像檔(https://www.raspberrypi.org/downloads/raspbian/) 下載完的映像檔,可以用Etcher(https://www.balena.io/etcher/) 來燒錄到SD卡中來開機。如果您使用的是”RK-樹莓派神經網路自走車套件”,可以直接開啟終端機下載套件包。
  2. 樹莓派開機,接上網路,打開終端機
  3. 數入以下指令下載OpenVINO套件包 請注意,隨著版本更新,套件包的版號也會變,本範例所使用的版本為”2018.5.445″。
cd $HOME
wget https://download.01.org/openvinotoolkit/2018_R5/packages/l_openvino_toolkit_ie_p_2018.5.445.tgz
  • Step4:解壓縮套件包
 tar -xvf l_openvino_toolkit_ie_p_2018.5.445.tgz

解壓縮完成後,您將會看到有一個資料夾”inference_engine_vpu_arm”出現在加目錄當中

 ls -l

Step5:接下來請執行以下的指令來修改setupvars.sh中的參數,待會設定環境參數實會用到。

sed -i "s|<INSTALLDIR>|$(pwd)/inference_engine_vpu_arm|" inference_engine_vpu_arm/bin/setupvars.sh

Step6: 環境參數設定
輸入以下的指令來啟動自動設定OpenVINO的環境參數。

 echo "source $HOME/inference_engine_vpu_arm/bin/setupvars.sh" >> $HOME/.bashrc

第一次設定完,請重新登入一次shell或者是重新打開終端機才會生效。

 bash

成功啟動環境的話,您將會看到”[setupvars.sh] OpenVINO environment initialized”的字樣。

Step7:為了使樹莓派能夠認得NCS,必須再額外設定USB Rules
將現在的使用者加入users的群組

 sudo usermod -a -G users "$(whoami)"

加入完成後,並須登出後再重新登入。

 logout

安裝udev rules

./inference_engine_vpu_arm/install_dependencies/install_NCS_udev_rules.sh

當終端機出現 “[setupvars.sh] OpenVINO environment initialized”時,表示您已經在樹莓派上成功安裝OpenVINO了,此版本的OpenVINO只有Inference Engine而已,只能做辨識。 為了要能夠將訓練完的模型編譯成NCS看得懂的格式,我們必須在電腦上安裝完整版的OpenVINO Toolkit,相關資料補充於本文章的附註中。

搭配RK -樹莓派神經網路自走車套件

如果您有"RK-樹莓派神經網路自走車套件 (機器人王國-聯絡我們)"可以搭配範例(ai-car-openvino.zip)使用以下指令啟動。

請先將 RK-樹莓派神經網路自走車套件 提供的檔案下載至樹莓派,並解壓縮檔案

unzip  ai-car-openvino.zip

將樹莓派接上Movidius2(產品連結),接下來我們將使用預錄好的影片來測試訓練過的模型。

cd ~/ai-car-openvino/tf_openvino_source
python3 ./movidius_video.py --model-file ../tf_openvino_model/mo2_model/saved_model.xml --weights-file ../tf_openvino_model/mo2_model/saved_model.bin --video-type file --source ../sample_video/example_1.mp4

小提醒:按下ctrl+c可以停掉程式。

以下是跑出來的測試結果,辨識一幀圖片大概需要花0.014秒左右

如果讀者想要看到實際的畫面的話,可以在指令的尾端加上–gui。

python3 ./movidius_video.py --model-file ../tf_openvino_model/mo2_model/saved_model.xml --weights-file ../tf_openvino_model/mo2_model/saved_model.bin --video-type file --source ../sample_video/example_1.mp4 --gui

同樣的範例,我們也可以用來跑在NCS一代上面,跑出來的結果如下

可以看到在表現上輸了NCS二代一些,處理單張影像的時間來到了0.026秒左右,差不多是快兩倍的時間呢!

附註

Q1:可以用本範例來辨識攝影機的影像嗎?
A1:可以的,一樣使用上面的指令,但是就不指定為使用影片檔。

python3 ./movidius_video.py --model-file ../tf_openvino_model/mo2_model/saved_model.xml --weights-file ../tf_openvino_model/mo2_model/saved_model.bin --gui

Q2: 那如果我有一台自走車,上面有馬達跟攝影機,該怎麼跑這個範例讓機器人動起來?
A2:以我們之前上課的機器人套件為例

可以執行以下的指令來讓機器人根據攝影機的影像來判斷交通號誌,並且控制馬達做出對應的動作,例如轉彎、前進、停止等。

python3 ./movidius_car.py --model-file ../tf_openvino_model/mo2_model/saved_model.xml --weights-file ../tf_openvino_model/mo2_model/saved_model.bin

Q3:那如果我有自己的資料然後想要自己訓練模型呢?

A3:這個問題比較複雜,首先樹莓派本身並沒有足夠的算力可以做深度學習的訓練, 所以我們會建議找一台電腦來做訓練這件事情。
關於訓練模型,首先我們必須在電腦上先安裝好python及tensorflow的環境, 然後執行以下的指令來做訓練。
其中,model-base-dir代表訓練完的模型要放在哪裡,data-dir則代表訓練用的資料集的位置。

python3 ./train_tensorflow_model.py --model-base-dir tf_model --data-dir $HOME/dataset

因為我們在樹莓派上面安裝的OpenVINO只有Inference Engine而已,只能做辨識而已。 為了要能夠將訓練完的模型編譯成NCS看得懂的格式,我們必須在電腦上安裝完整版的OpenVINO Toolkit。

詳細的安裝說明,請參考Intel官方的安裝教學:

Windows(https://software.intel.com/en-us/articles/OpenVINO-Install-Windows)

Linux(https://software.intel.com/en-us/articles/OpenVINO-Install-Linux)

安裝完後,請輸入以下的指令來編譯模型

```bash
source /opt/intel/computer_vision_sdk/bin/setupvars.sh
mo_tf.py <span class="hljs-comment">--saved_model_dir tf_model/XXXXXXXXXX \</span>
         <span class="hljs-comment">--output_dir mo2_model \</span>
         <span class="hljs-comment">--input_shape "[1,48,48,3]" \</span>
         <span class="hljs-comment">--input input_image \</span>
         <span class="hljs-comment">--output probabilities \</span>
         <span class="hljs-comment">--data_type FP16</span>
```

其中的XXXXXXXXXX 請依據實際路徑填寫(全部都是數字),編譯完的模型時會輸出到mo2_model資料夾中。

相關文章

NVIDIA Jetson Nano 實際使用難不難?從入手到安裝系統、開機與遠端連線

$
0
0

作者徐豐智
時間60分鐘
難度***
材料表電腦/筆記型電腦/
Nvidia JETSON NANO X1
5V3A變壓器 X1
64GB Samsung micro SD卡 X1
外接螢幕(HDMI接頭) X1
VGA轉HDMI轉接線 X1
USB Wi-Fi dongle / 有線網路 X1
USB 鍵盤 / 滑鼠 X1

單板電腦從RaspberryPi 系列 (包含Banana Pi、ASUS的Tinker board以及研揚的Upboard 到最近Google Coral 以及 NVIDIA Jetson Nano (本文後簡稱Jetson nano),一台看起來比一台厲害。但大家同時都關心一件事,這個使用起來難不難?

CAVEDU在拿到Jetson Nano之後,也要來試試看安裝系統到開機的過程是否順暢。我發現大部分時間只是等電腦安裝,操作步驟不太難,一起來看看吧。

這台機器開起來會不會很燙阿?實際開機執行一段時間後,我們用紅外線測溫槍量出來的結果如下:43.5

從安裝系統到遠端連線有這幾個步驟(原文資料請看這裡):

  1. 安裝作業系統:燒錄image檔案到SD卡
  2. JETSON NANO開機
  3. 與Wi-Fi連線
    SSH遠端連線 JETSON NANO

Step1:安裝作業系統:燒錄image檔案到SD卡

在此步驟與Raspberry Pi一樣,將作業系統映像檔燒錄到SD卡之後開機。請準備SD卡讀卡機,如果是筆記型電腦應該有內建的讀卡器。本次使用的是原文資料建議的64GB Micro SD卡。

請下載Nvidia Github提供的映像檔,壓縮檔大小約6.7GB,並解壓縮檔案。(NVIDIA 映像檔下載請按我)

接著安裝映像檔燒錄軟體,使用balenaEtcher,您也可以使用另一套常用的Win32Diskimager,請按照您電腦使用的作業系統安裝匹配版本的軟體,這裡使用的是Windows x64 安裝版。

開啟軟體後,先點擊”Select image“,選擇剛剛下載的Jetbot Image檔案。

將SD卡插入讀卡機,在軟體中點擊”Select drive“,選擇SD卡的磁碟機編號,點擊”Continue“後,再點擊”Flash“就開始在SD卡安裝作業系統。

如果點擊 “Flash“後一直無法燒錄,請到Windows Defender允許使用
balenaEtcher ,您若不希望更改設定,也可以使用Win32DiskImager。

Step2:JETSON NANO開機

JETSON NANO有兩種供電方式,使用下圖左邊的DC接頭變壓器,可支援的規格最高為5V4A,另一種是使用右邊的MicroUSB Host,最低規格需要5V2A,本次使用CAVEDU常用於Raspberry Pi 的 5V3A變壓器。

JETSON NANO 正面
樹莓派5V3A MicroUSB電源供應器

接上安裝好作業系統的SD卡,JETSON NANO的SD卡插槽是彈跳式的,插入SD卡後不會凸出來。希望之後接在車子上不會跑一跑,SD卡飛出來。

接上HDMI的螢幕、USB鍵盤、滑鼠與Wi-Fi dongle,最後接上MicroUSB的電源供應器,機器就會自動開機。JETSON NANO開機與樹莓派一樣,只要接上電源供應器就會開機了,不需要額外的開機鍵。

請注意:在原文資料中,有提到像PiOLED這種由GPIO供電的裝置,建議先開機成功之後再裝上去。

開機成功後會進入Ubuntu作業系統畫面,登入帳號密碼都是:jetbot

Step3:與Wi-Fi連線

Jetson Nano可以外接Wi-Fi USB dongle 來無線上網,這樣會方便許多。我們在開機之前已經接上Wi-Fi Dongle了,您也可以使用網路線讓它上網。請在Ubuntu作業系統的右上角選擇要連線的Wi-Fi熱點。

連上網際網路後,您可以看到桌面上有兩個Nvidia的捷徑:Nvidia Jetson Developer ZoneNvidia Jetson Support Forums。點擊後可以看到許多關於JETSON NANO的相關資料。

Step4:與JETSON NANO遠端連線

我的電腦與JETSON NANO連在同一個Wi-Fi熱點,您可以在JETSON NANO查詢自己連線的IP,首先點選螢幕左上角第一個捷徑”Search“,搜尋””Terminal”,開啟Terminal(終端機)。

在Terminal(終端機)輸入指令,會顯示JETSON NANO現在的IP,在wlan0指的是透過Wi-Fi熱點得到的IP,現在得到的IP是192.168.2.123

ifconfig

我可以透過筆電用SSH連線,常用的SSH連線軟體是Putty,以及CAVEDU 上課常用的MobaXterm,輸入JETSON NANO的IP以及使用者帳號密碼 (都是 jetbot )即可連線。

JETSON NANO另外有好用的網路瀏覽器遠端連線,使用的是AI課程常用的JupyterNotebook,您只要在筆電的網頁上輸入”https://<JETSON NANO的IP>:8888“,輸入密碼後(密碼:jetbot),即可遠端連線JETSON NANO。

今天分享到這邊,感謝大家支持CAVEDU,我們有好多的設備要測試呢!如果您喜歡JETSON NANO的相關文章,請多多與我們反應,我們會依照大家的反應/需求程度(長官的謎之聲:看訂單數量,不然怎麼養活這群活員工),盡快推出更多 JETSON NANO相關文章,謝謝大家。

相關文章:


[ 教學技術文 ] 輸送帶專案製作心得分享

$
0
0

本篇為業配文,請小心使用

撰寫/攝影 腦波弱老闆/CAVEDU教育團隊
時間   第一次前後搞了大概一個月,第二次大概二週,再做一個應該五天可以好。
成本不含攝影機大約30,000
難度 看了本篇就不難,如果還是覺得難,但還是想要一套,付錢給我們也可以解決(洽 yean@robotkingdom.com.tw 鄭經理)
材料表 樂高積木(購買連結,請點我)
樂高Power Function 8883馬達5顆(購買連結,請點我)
Linkit 7697(購買連結,請點我)
Linkit 7697 nano擴充板(購買連結,請點我)
馬達驅動模組(購買連結,請點我)
SG90伺服機(購買連結,請點我)
紅外線感應器(購買連結,請點我)
*變壓器
*利凌的攝影機

本次的專案由利凌企業股份有限公司(http://www.meritlilin.com/tw/)委託。

業主需求:以樂高積木為素材,打造一個可以展示利凌攝影機辨識能力的輸送帶系統。

第一段:確認材料類型與預估數量

共分為五段輸送帶(A~E)、撥桿、電控、視覺辨識等八個子系統,視覺辨識是利凌的強項,反正他們就設好攝影機,看到特定的QR Code就會發出一個數位訊號給我們,我們就不在這邊處理如何辨識圖像了。

本案用到最多的零件就是履帶片了,而且,履帶片不太好買。雖然我們是專業賣樂高科技系列零件的,但要準備四百多片履帶片也是不太容易。不過,貴單位如果已經有很多套45544,這個問題應該很好處理,上課通常不太會用到履帶片,但學生很愛拿來玩,串起來當項鍊、皇冠,我還有看過弄成吊帶褲造型的(到底是有多抖M),剛好藉機通通收起來,剩下的材料就沒有很難搞定了。

控制器就用Linkit 7697來擔綱了。

第二段:組裝模型

這個作品雖然看起來不小,但其實大多是同樣的模組重複使用,因為使用了一些非樂高的材料,透過3D列印來解決。

  1. 支撐柱:模組化不解釋請看照片。(照片中的肚子不是我的)
  1. 履帶輪:

除了45544內附的十齒履帶輪之外,還會用到一些六齒的履帶輪,來調整輸送帶的坡度。為了讓箱子順暢的轉到另一段輸送帶,借用地心引力來幫忙(工業工程沒有白念)。

  • 以3D列印製作固定非樂高的零件:

這次我們使用方便好用又免錢的DesignSpark Mechanical設計,並以優質台灣製造的3D印表機-印匠 86Duino ENJOY 3D印表機製作了Linkit 7697 nano擴充板L298N馬達驅動模組、端子台接頭的固定件,讓它們可以固定在樂高底板上。有興趣的朋友,這裡是下載連結,歡迎使用。

小型伺服機的樂高連接件是從Thingiverse下載的。

第三段:電控系統

這次的輸出入需求不是很複雜,攝影機辨識到想要的小箱子,會送一個數位訊號出來,撥桿就會啟動,讓這個小箱子走中間的輸送帶。

控制器只要控制五顆LEGO PF馬達與一顆小伺服機,所以我們選用了Linkit 7697為控制器。一方面當然是我們跟Linkit 7697相處的很有感情了,拿Linkit 7697來開發也算是得心應手,另外,也許那天我覺得我們家工程師太閒,就可以加上Linkit Remote來做手機控制版App,或是把機台狀態上傳到雲端,用MCS架個使用介面,就可以來個大數據之工業4.0。

攝影機的自己有電源供應器,Linkit 7697的5V電源,就透過L298N馬達驅動模組降壓提供,所以只要準備一個9V的變壓器供電就可以了。

後記

收集零件不難,難的是收集到一樣顏色的零件。

樂高很好用,但箱子偶爾會卡到,要動作穩定性很高的作品,請不要選用樂高,但如果是要打樣、驗證概念、需要保留作品修改或擴充性,我還沒有想到比樂高更合適的材料。

要製作與樂高相接的零件時,印匠是可靠的好朋友,圖面尺寸跟成品尺寸一致,不用考慮縮率。

以為很難的部分,其實都沒有花太多精力,動手做就對了。 過程中沒有人員受傷(傷心不算)。

相關文章:

[教學文]想自己動手做藍牙遙控車?就是這一篇了!

[物聯網屋專題實作計畫]用LEGO®製作物聯網屋

[ 老闆推坑開箱文] SPINBOX傻瓜唱機,你的第一台黑膠唱機

Viewing all 678 articles
Browse latest View live