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

NVIDIA Jetson Nano 如何執行深度學習範例?分類模型辨識北極熊與即時影像人臉辨識

$
0
0
開發者袁佑緣
時間包含燒錄系統70分鐘
難度***
電腦/筆記型電腦/SD讀卡機
外接螢幕(HDMI接頭/ VGA轉HDMI轉接線 ) X1
USB 鍵盤 / 滑鼠 X1
Jetson Nano™ Developer Kit (全配)X1
Nvidia JETSON NANO X1
5V3A變壓器 X1
64GB Samsung micro SD卡 X1
羅技C270 HD 網路攝影機 X1
USB Wi-Fi dongle + 90度轉接頭 / 有線網路 X1

小編感謝大家對JETSON NANO熱烈回應,這次與大家分享如何“執行”NVIDIA原廠為JETSON NANO準備的範例,範例為分類辨識、人臉偵測。

安裝作業系統的部分,請參考: NVIDIA Jetson Nano 實際使用難不難?從入手到安裝系統、開機與遠端連線

請注意!!執行本文章範例”目前”需要寫入Jetson Download Center的映像檔-映像檔連結,目前JETBOT專案的映像檔無法執行範例,已回報狀況給NVIDIA。此映像檔的作業系統需要自行設定使用者名稱與密碼,遠端連線時也會使用您設定的使用者名稱與密碼。

第一個範例是辨識圖片中的動物,下圖是執行範例後,將辨識結果印在圖片上,辨識圖片中的動物為"北極熊",辨識信心指數為100%

信心指數100%的北極熊辨識結果

本文章分為三個階段分享:

  1. 軟體環境安裝
  2. 執行深度學習範例-分類應用
  3. 物件偵測應用-人臉辨識

1、軟體環境安裝

Step1:JETSON NANO開機之後,點選左上角的圖示搜尋Terminal。

開啟後就會看一個終端機的介面,接下來的指令都會在這個介面裡面做操作。

Step2: 輸入以下的指令安裝git、cmake套件。

sudo apt-get install git cmake

Step3:下載jetson-inference專案程式

git clone https://github.com/dusty-nv/jetson-inference

由於在這個repo裡面會用到 jetson-utils 這個額外的submodule,所以要
一併把它載下來

cd jetson-inference
git submodule update --init

Step4: 使用CMake來準備編譯所需的相依套件

mkdir build && cd build
cmake ../

過程中會呼叫一個叫CMakePrebuild.sh的腳本,其中會需要超級使用者的權限(sudo), Jetson Nano中預設使用者就有sudo的權限,請直接輸入使用者的密碼即可。

接下來程式就會自動下載各種相依的函式庫跟一些訓練完的模型,如下圖(下載googlenet.caffemodel中)。

由於要下載的模型眾多,整個過程會花上不少時間, 所以在一步可以先讓機器跑一陣子再回來看。

Step5: 使用make編譯程式碼

make

編譯完成!

執行make install,最後完整的輸出檔案將會在 jetson-inference/build/aarch64 這個資料夾中, 接下來所有要執行的範例程式都能夠在 jetson-inference/build/aarch64/bin 資料夾中找到。

make install

執行深度學習範例

2、分類應用

我們先來試跑一些基本的分類問題。

Step1:我們先將工作目錄移到以下的資料夾中

cd ~/jetson-inference/build/aarch64/bin

Step2:呼叫imagenet的範例來做辨識

比如說我們想要辨識一張北極熊的圖片polar_bear.jpg, 然後辨識完的結果叫做 polar_bear_inferenced.jpg。

./imagenet-console polar_bear.jpg polar_bear_inferenced.jpg

第一次跑的話,您可能會發現畫面會卡在下面那張圖, 這是因為TensorRT會花上些許的時間來最佳化這個網路,請耐心等候,之後跑的話就會快很多了。

原圖

辨識結果:北極熊

3、物件偵測應用-人臉辨識

Step1:修改攝影機設置

Jetson Nano可以使用RaspberryPi的鏡頭, 範例預設連結內建的CSI Camera, 本次分享如何在範例中更改使用的鏡頭,本次使用為Logitech的C270, 需要對程式做一些小修改。

請輸入以下的指令將視訊的裝置指定為 /dev/video0, 也就是一般預設的USB Camera的裝置位置。

sed -i 's/DEFAULT_CAMERA\s* -1/DEFAULT_CAMERA 0/' ~/jetson-inference/detectnet-camera/detectnet-camera.cpp

Step2:編譯範例

接下來我們需要重新編譯一次程式, 先將工作目錄切換到 ~/jetson-inference/build , 然後重新編譯 detectnet-camera 一次。

cd ~/jetson-inference/build
make detectnet-camera

重新編譯完後,我們把工作目錄切換回 ~/jetson-inference/build/aarch64/bin , 然後跑facenet的模型來執行人臉辨識。

cd ~/jetson-inference/build/aarch64/bin
./detectnet-camera facenet

成功執行人臉辨識!

今天分享到這邊,感謝大家支持CAVEDU,如果您喜歡JETSON NANO的相關文章,請多多與我們反應。


NVIDIA Jetson nano Donkey Car –香港網友作品分享Fei Cheung

$
0
0

原文[Getting started with Jetson Nano and Donkey car aka Autonomous Car],感謝 Fei Cheung 兄賜文~ 以下原文翻譯開始,也請參考機器人王國非強制購買連結

Jetson Nano是一款針對AI邊緣運算 (注意這個詞最近有點氾濫) 的效能強大又經濟實惠的單板電腦。它只要USD 99,就能讓 maker 社群得以運用機器學習的強大威力。

我用 Raspberry Pi 來玩 Donkey car 有一段時間了。我真的很喜歡 Pi 也感謝社群所做的貢獻。我試過用它來訓練簡易CNN,但要加上更多感測器(例如IMU、Lidar) 之後,Pi的運算能力就明顯不足了。如果是需要大量運算的神經網路模型,在 Pi 上的 FPS就不會太好,甚至根本無法執行。我需要更強大但不能太貴的東西 😛 看看能否在 USD 100以下囉。

左:加裝了Lidar與IMU;右:標準Donkey car配置

Jetson Nano來的正是時候。與Raspberry Pi不同,Jetson Nano 大概在一個月前發布,相關的教學與專案也很少。我花了很大一番功夫才把Jetson nano和Donkey car設定完成,所以決定要寫(也是我第一篇啦😆) 一篇教學,和大家分享如何設定。開始吧。

Jetson Nano方面只需要Jetson Nano主板、micro SD卡與Wi-Fi USB dongle

板子上沒有Wi-Fi 與藍牙讓我有點訝異。我根據 Nvidia的教學 來燒錄映像檔到 SD卡,並購買了建議的 Wi-Fi USB dongle:Edimax EW-7811Un

您只要跟著 NIVIDA原廠教學操作就可以開機了。看到歡迎畫面了嗎?恭喜!

Image credit: Nivida

不過… 在測試時,Wi-Fi 每幾分鐘就會斷線,這樣根本沒辦法下載必要的套件。我花了整整兩天 😕 來找答案,下列指令就是解答:

echo “blacklist rtl8192cu” | sudo tee -a /etc/modprobe.d/blacklist.conf

上述指令會關掉一些討厭的驅動程式,Wi-Fi 之後就正常了。另一個比較好的做法是重新編譯驅動程式,請參考本說明

安裝套件

NVIDIA Jetson nano是一款為了機器學習而生的嵌入式系統,因此當然要安裝機器學習的框架!以下內容也可在 NVIDIA論壇中找到。

先從Tensorflow開始吧!

請在terminal中輸入以下指令:

sudo apt-get install python3-pip libhdf5-serial-dev hdf5-tools

pip3 install --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42 tensorflow-gpu==1.13.1+nv19.3 --user

這需要一段時間,機器看起來像是卡住一樣,我的nano花了大概45分鐘。裝完之後別忘了測試一下,確認沒有任何錯誤訊息。

donkey@donkey-desktop:~$ python3
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>>

Pytorch也一起裝好吧

請在terminal中輸入以下指令:

wget https://nvidia.box.com/shared/static/veo87trfaawj5pfwuqvhl6mzc5b55fbj.whl -O torch-1.1.0a0+b457266-cp36-cp36m-linux_aarch64.whl
pip3 install numpy torch-1.1.0a0+b457266-cp36-cp36m-linux_aarch64.whl

再次檢查看看有沒有裝好

donkey@donkey-desktop:~$ python3
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> print(torch.__version__)
1.1.0a0+b457266
>>> print('CUDA available: ' + str(torch.cuda.is_available()))
CUDA available: True
>>>

最後安裝Keras,Donkey car會用到

我用apt-get 而非 pip,請在終端機輸入以下指令:

sudo apt-get install python3-scipy
sudo apt-get install python3-keras

測試:

donkey@donkey-desktop:~$ python3
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import keras
Using TensorFlow backend.
>>>

軟體差不多完成了,來看看硬體吧。

硬體設定

在此不會介紹Donkey car的逐步安裝過程,請參考Donkey Car網站教學,這邊只會介紹幾個關鍵步驟:

  1. PCA9685 PWM driver
  2. Camera

更新GPIO函式庫

NVIDIA 已提供了GPIO函式庫,並且與RPi.GPIO的API是一樣的,超棒!所以要從RPi函式庫轉移到Jetson Nano幾乎不用改什麼東西。請根據NVIDIA GitHub說明安裝好函式庫之後就可以開始測試GPIO腳位了。

安裝 PCA9685伺服機模組函式庫,用於控制方向盤與油門

pip3 install Adafruit_PCA9685

請將 PCA9685 接上 Jetson nano。請參考板子上的腳位編號即可:

PCA9685Raspberry Pi GPIO
VCC3.3V
SDLSDL(3)
SCLSCL(5)
GNDGND

一如往常,測試接線是否正常。請在終端機中輸入以下指令:

donkey@donkey-desktop:/opt/nvidia$ sudo i2cdetect -y -r 1
0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: 70 -- -- -- -- -- -- --

請看到位址0x40,這就是PCA9685。更多關於I2C通訊協定請參考本說明

您的使用者帳號需要加入I2C群組才能存取I2C頻道。設定好之後,請將Pi重新開機才可以使用。請在終端機中輸入以下指令:

sudo usermod -a -G i2c username
sudo reboot

檢查使用者的群組設定:

donkey@donkey-desktop:~$ groups
i2c adm cdrom sudo audio dip video plugdev lpadmin gdm sambashare gpio

搞定。還ok嗎?下一步是設定攝影機。壞消息是 Pi camera 1 無法用於 Jetson Nano。我常用的廣角相機也不行。

左到右:Pi Camera 2 / Pi camera 2 載板搭配廣角鏡頭 / 舊款 Pi 廣角鏡頭
魔術方塊只是比例尺 ;P

重點在於不要選晶片型號為 OV5647 的攝影機,要選用晶片型號為 IMX219 的款式。IMX219驅動程式已經包含在映像檔中。

Jetson nano 的 CSI 接頭

拉開卡楯 ,把相機排線整齊插入之後再把卡楯插回。請注意排線的方向,兩邊金屬接頭要在同一側。接好之後接上電源應該就沒問題了,攝影機請參考本文

執行臉部辨識範例,由於使用廣角鏡頭所以偵測效果不算太理想

最後一步:安裝Donkeycar模組

我 fork 了 original donkey car repo 再做了一些修改。您可從我的 repo 下載 Donkey car 函式庫並開始安裝。請在終端機輸入以下指令:

git clone https://github.com/feicccccccc/donkeycar.git
cd donkeycar
pip3 install -e .

有興趣深入了解的話,我做的修改如下:

  1. Add a new camera class
  2. Add a default bus to Actuator parts
  3. Add Int typecasting in Keras.py for a variable to make training works

設定所需的套件大約要45分鐘,請用以下指令建立您的小車資料夾:

donkey@donkey-desktop:~/sandbox$ donkey createcar d2

修改 manag.py 來使用新的攝影機。

#from donkeycar.parts.camera import PiCamera
from donkeycar.parts.camera import CSICamera

設定新的攝影機

#cam = PiCamera(resolution=cfg.CAMERA_RESOLUTION)    
#V.add(cam, outputs=['cam/image_array'], threaded=True)
cam = CSICamera(resolution=cfg.CAMERA_RESOLUTION)
V.add(cam, outputs=['cam/image_array'], threaded=False)

差不多都完成了,您可以根據自己的資料集來玩車子了!

donkey@donkey-desktop:~/sandbox/d2$ python3 manage.py drive

請用遠端連線登入 Jetson nano 來控制車子。最酷的地方是可以直接在 Jetson Nano上訓練模型喔!

訓練過程的SSH畫面,使用 Tegra X1 from Jetson Nano.

開心玩吧!

使用PS4手把來控制Jetson nano小車。懶得把 Pi 拆下來 😜

心得

  1. 在寫本篇文章時,我在垃圾箱找到一個USB Bluetooth dongle。插上 Jetson Nano 居然可以直接用!不需要額外設定就可以連到我的 PS4手把,讚!請根據本文來設定手把。合適的手把在取得資料集時非常方便。
  2. 方向盤與油門好像會彼此干擾,原因應該是Jetson Nano與馬達都很耗電的緣故。瞬間電流過大所導致的壓降會影響ESC訊號。解法有二:對PCA9685伺服機驅動板使用獨立的電源或加上一個較大的電容來避免壓降。我個人喜歡第二種作法,但當時手邊也沒有電容。所以由下圖可看到我剪了一條USB傳輸線並焊了兩條跳線上去,最後再接到 PCA9685伺服機驅動板。
Extra power to V+ and V- on PCA9685

3. 如果需要完整SD卡映像檔的話,請和我說!(或留言在CAVEDU本文)。很多人要的話我就會放上來 XD

Micro:bit雲端IoT應用:使用圖形化網頁編輯程式,上傳溫度資料到雲端

$
0
0
作者 郭俊廷
時間 60分鐘
難度 ***
材料表 電腦/筆記型電腦/
Gravity IoT Starter Kit for micro:bit X1

今天我們要介紹的是DFROBOT的Gravity IoT Starter Kit for micro:bit
以下是盒子的外觀,上面有寫到開始你的第一個真實世界IoT的應用

內盒裡的內容圖片,如外盒裡所說有許多IoT應用元件跟OBLOQ Wi-Fi模組

裡面包含了一份快速入門指南,還有一個micro:bit主板跟一個Micro:Mate擴充版跟OBLOQ Wi-Fi模組。接著包含著許多物聯網的感測器及應用元件,有數位 紅外線動作感測器、類比聲音感測器、類比電容式土壤濕度感測器、數位揚聲器模組、數位防水溫度感測器、微伺服機、數位繼電器模組。最後還有一條連接電腦跟micro:bit的Micro USB線。

接著就要開始使用DFROBOT的IoT平台Easy IoT來使用你的IoT服務

從開始註冊到實際應用範例有以下幾個步驟
1.註冊IoT帳號且新增IoT裝置
2.進入microbit網頁編輯程式
3.連接micro:bit的板子且燒入程式
4.OBLOQ的WIFI模組連接且功能測試
5.使用DFRobot裡面附贈的防水型溫度感測器KIT0021來實際應用

Step1:註冊IoT帳號且新增IoT裝置

首先我們到Easy IoT註冊你的帳號

http://iot.dfrobot.com/

按右上角的註冊

登入之後進入工作間新增你的設備 點添加新的設備
這裡的新增的設備可以在Step2編寫程式使用,所以可以自己任意設定名字

在工作間這裡有顯示使用者Iot的ID跟密碼
因為要測試可否連線至Wi-Fi,所以我們新增一個名字叫WIFI的設備。
新增的WIFI裝置有個Topic
使用者Iot的ID跟密碼,還有裝置的Topic是用來使用待會Step2編寫程式時Wi-Fi設定要用到的。
你裝置的Topic是對應你寫的程式,會顯示內容所對應的裝置,Step2將會編寫程式顯示Hello在這個裝置上。

點擊眼睛圖案可以顯示使用者Iot的ID跟密碼

Step2:進入microbit網頁編輯程式

接著就要開始進行程式編輯,我們要設計一個程式透過Wi-Fi每一秒鐘都傳送一個Hello到裝置上。
接著進入microbit網頁進行程式編輯

https://makecode.microbit.org/v0

一開始畫面如下圖

因為我們是使用OBLOQ的Wi-Fi模組 所以我們需要新增OBLOQ套件
點擊進階裡的添加套件

搜尋OBLOQ套件並點擊添加

添加之後即可使用OBLOQ套件

使用Obloq套件裡的Obloq mqtt初始設置
並設定當啟動時Obloq mqtt初始設置

設定自己的Wi-Fi名稱跟密碼,還有自己Iot的ID跟密碼,還有你裝置的Topic(這裡要注意的是Wi-Fi名稱的大小寫要注意要完全相同,Iot的ID跟密碼裝置的Topic則是使用Step1所註冊新增的)
並且服務器選擇全球

接著編寫程式每一秒鐘都傳送一個Hello到裝置上 設定每隔一秒送出Hello到topic_0且重複執行

開始下載程式到你的micro:bit板子上
首先記得存檔按右下角的存檔圖案

然後按下載即會產生一個HEX檔,我們產生的是microbit-WIFIstarted.hex

Step3:連接micro:bit的板子且燒入程式

接著開始連接micro:bit的板子和燒入程式
這裡我們先講解如何把micro:bit的板子跟Micro:Mate擴充板連結一起
如下圖原本是兩個板子加上兩顆螺帽

把右邊的擴充板放到micro:bit板子上用螺帽鎖緊之後就會變成下圖

反過來才是正面顯示LED圖案的地方

接下來把電腦裡的USB線插入micro:bit主板MicroUSB孔(這裡要注意不要插錯插到擴充板上)

這時候電腦會跳出一個micro:bit的硬碟,把自己的HEX檔複製進去即可燒入完成

燒入完成時這時候LED顯示XX請不要擔心,因為OBLOQ的WIFI模組還沒裝上去

Step4:OBLOQ的WIFI模組連接且功能測試

這裡我們開始連接OBLOQ的WIFI模組跟程式功能測試
OBLOQ的WIFI模組有四條線如下圖有四條線紅黑綠藍

紅的是電源線
黑的是接地線
綠線我們把他設定連接到P1 pin
藍線我們把他設定連接到P2 pin
接到Micro:Mate擴充板接法如下圖

接著把電源插入Micro:Mate擴充板即可看到OBLOQ WIFI模組由藍燈轉為綠燈,並且燈號顯示打勾即代表你的WIFI設定沒問題程式功能一切正常。
注意紅框所框起來的部分有顯示燈號

燈號影片:
接著要看看我們在Step2寫的Hello程式有無傳送成功
在工作間自己的裝置點查看詳情

拉至底部的最新消息即可看到Hello傳送成功,每隔一秒即接收到一次Hello
這樣即代表你的硬體接線、Wi-Fi設定、程式都沒問題。

Step5:使用DFRobot裡面附贈的防水型溫度感測器KIT0021來實際應用

接著我們要開始利用OBLOQ WIFI模組來實際應用
我們使用套件組裡面附的DFRobot KIT0021防水型的溫度感測器來實際應用
以下就是防水型的溫度感測器,先把它組合完成,輸出直接接轉接頭,溫度計部分A接黃線、B接紅線、C接黑線。

接著把它連接到Micro:Mate擴充板上
紅線接電源,黑線接地,綠線接P0 pin

接著開始設計讀取溫度計的程式
因為需要用到溫度計的套件所以再新增一個套件(這裡我們用到Step2裡用到的進階裡的添加套件)

添加套件不只可以使用搜尋的方法也可以從別人寫好的github網址裡新增套件
由以下網址新增ds18b20溫度計模組

https://github.com/DFRobot/pxt-ds18b20

新增之後可以使用ds18b20溫度計模組
原先的網路設定要留著才有網路功能,接著把重複無限次改成發送消息PIN0讀取的溫度(字串)到topic_0,並且設定每隔五秒接收一次溫度。

程式寫好之後根據Step3的步驟將程式燒入到板子上,即可去裝置查看詳情查看溫度有無每隔五秒就接收到。
每隔五秒都有接收到溫度,代表程式、接線都沒問題。

以上就是我們的DFROBOT的Gravity IoT Starter Kit for micro:bit套件組的介紹與實際應用的範例謝謝大家觀看。

Thermal Stereo Cam,VR影像、紅外線鏡頭還有 YOLO 偵測!

$
0
0

話說咱們機器人王國福利社老闆五月初去參加日本京都Maker Faire的時候,在現場看到了一個很有趣的專題。很高興對方同意我們翻譯之後刊載於CAVEDU部落格,原文請點我

專題名稱:Thermal Stereo Cam

開發者:Iwao Watanabe / Takeshi Ono,W&T/Toyo Trading Co.

簡述:Thermal Stereo Cam 可透過 iPhone app 來顯示 VR影像與點雲深度影像,會用到兩組 FLIR Lepton 3.5 熱成像攝影機模組與相關電路板

狀態:開發中原型

專題簡述:請看看本影片

阿吉老師註:影片中可以看到熱成像、點雲深度偵測以及使用 tiny Yolo 來偵測他們太謙虛了,以下補充影片截圖:

 

專題最初是從 Takeshi Ono 先生的 Lepton(80X60) 搭配 ESP8266(ESP-WROOM-02) 的系統開始的,這個系統可以發送資料給 iPhone。後來 Ono 先生碰到了 Watanabe,W 希望 O 改用 Lepton 3 來開發,這樣不但能提高解析度了,還可以裝上無人機呢。自此之後,W 與 O 就攜手來開發 Thermal Stereo Cam 系統了。

他們從 Lepton (80×60) 開始,能在 iPhone 上顯示 160 x 120 像素的畫面, 後來改用 Lepton 3 (160×120) 就可顯示 320 x 240 像素的畫面。由於本套系統需要處理原始資料(4-折疊內插運算),,因此不考慮 FPV 第一人稱影像 (NTSC 或 PAL) .  最終,用 Lepton (80×60) 的效果還不錯,但是 LEPTON 3 的資料傳輸量是原本的四倍,這讓他們很頭痛。系統在室內運作時很正常,但到了室外就不太行了,因為 Lepton 3 用掉了ESP8266 85% 以上的 RAM,使得系統不穩定且不斷重新開機。

反覆測試七個多月之後,他們終於可以讓系統更穩定,fps 達到 8-9,ESP8266 與 iPhone 的傳輸距離也達到了 100 公尺。他們榨乾了 ESP8266 的容量(約90%),另外 Lepton 3 為基礎的系統也上市了。去年他們又加入了 Thermal Stereo Cam 來支援兩組 LEPTON 3。現在搭配了 Lepton 3.5 之後,只需要更少程式碼就能取得更準確的溫度資料。他們還在 NVIDIA TX2 開發板上安裝了 openFrameworks

不過,兩片 ESP8266 會彼此干擾,且在 30 公尺左右就會開始干擾到無人機系統,所以他們還在努力搞定這些問題。另外,他們也積極在開發其他以 Lepton 為基礎的酷炫專案,最新進度請點我

想玩這套系統嗎?您需要一台 iPhone、W&T Thermal Cam iPhone app、一組(應該是兩個) Lepton 3 熱成像攝影機、兩片 ESP8266 與相關電子零件 。雖然 iPhone app 還沒有上架 App Store,但歡迎寫信到 wiwao@toyoco.jp。 雖然英文不算太好 (阿吉老師註:他們太謙虛了),但一定全力協助。

兩位開發者對這套系統相當自豪,也很高興作品能被收錄在 Lepton Makers’ Community Showcase註:即原文出處)。夥伴們,繼續創作吧!

超級比一比:Google Coral Edge TPU v.s. NVIDIA Jetson Nano

$
0
0

找到一篇關於 Google Coral Edge TPU 與 NVIDIA Jetson Nano 的硬體規格比較,取得作者同意之後翻譯刊載。原文 [ Google Coral Edge TPU Board Vs NVIDIA Jetson Nano Dev board — Hardware Comparison ,作者 Manu Suryavansh ],以下是翻譯後文章:


    NVIDIA 與 Google 兩家公司最近都針對 邊緣人工智能 (Edge AI) 推出了自家的開發板,並且把價格降到相當不錯的區間來吸引開發者、maker 與業餘玩家。兩款板子的主要用途都在於推論,但在一定程度上也能做到 transfer learning re-training。Google Edge TPU 透過 weight imprinting 技術來支援 transfer learning training。兩者都具備了 SOM (System-on-Module),具備各式接頭:USB、Ethernet 與 microSD 卡槽等。本文為兩款開發板的硬體比較,但請注意是以單板電腦的角度而非 USB 加速棒 (Edge TPU USB)。

    如果沒時間整篇讀完的話,可以先做個結論:我個人認為就價格來說,Coral Edge 開發板較有優勢且包含了必要的通訊功能 (Wi-Fi / 藍牙),但就軟體支援性(INT8 與 FP16 推論) 來說,Jetson Nano 是比較好的。

Coral Edge TPU 開發板

    開發板尺寸為  88 x 60 x 22 mm,而 SOM (USB 加速棒) 的大小只有  48 x 40 x 5 mm。所以使用者可以自行設計不同大小的基板,再外接 SOM 即可。開發板上有 u-boot bootloader,而USB加速棒則可載入類似 Mendel linux 的映像檔

Coral SOM 上的 NXP iMXM 處理器還有一個 Vivante GC7000 lite graphics GPU ,不過,可以用在圖像以外的事情上嗎?目前未知。

圖片來源: https://coral.withgoogle.com/products/dev-board/

NVIDIA Jetson Nano 開發板

    與 coral開發板類似 (在基板上加裝 SOM),Jetson 的 SOM 稍微大了點: 69.6  x 45 mm。這片板子是以 Ubuntu 18.04 作為預設的作業系統。

硬體規格比較

效能

Nvidia原廠提供了與其他SBC (例如 Raspberry Pi 3、Pi 3 + Intel NCS2 加速棒、Google Coral Edge TPU板) 的效能比較:https://devblogs.nvidia.com/jetson-nano-ai-computing/

資料來源: https://devblogs.nvidia.com/jetson-nano-ai-computing/

註:阿吉老師補充另一份NVIDIA的原廠資料,大家可以比較一下:

Coral Edge TPU 開發板的資料不太多,因為它無法執行未經 quantization aware training 的預先訓練模型。以上表格中,Jetson 採用 FP16 precision。其他參考資料:

結論

我個人偏好 Coral Edge TPU 開發板,原因在於:

  1. Coral dev board 售價 $149 美金,比 Jetson Nano ($99) 來得貴一點,但前者有 Wi-Fi 與Bluetooth,而 Jetson Nano 都沒有要另外買 Wi-Fi dongle才行。.
  2. coral board 上的 NXP iMX8 SOC 具備 Video processing unit 與 Vivante GC700 lite GPU,可進行傳統的影像與影片處理。 coral board 還有一顆 Cortex-M4F 低功耗微處理器,可用於連接其他感測器,例如溫度、環境光感測器等等。更多可用感測器請參考 — http://lightsensors.blogspot.com/2014/09/collection-of-various-sensors.html
  3. Jetson nano也有影像編碼器與解碼器,對於其他深度學框架 (例如Pytorch, MXNet) 的支援程度也較好,它還支援 NVidia TensorRT 加速器函式庫來進行 FP16 推論與 INT8 推論。Edge TPU board 只支援 8位元 quantized Tensorflow lite 模型,且必須用到 quantization aware training

我喜歡在各類邊緣裝置上進行深度學習應用,歡迎看看我的專題

ROS for Windows 安裝流程

$
0
0

ROS機器人作業系統終於完整支援Windows作業系統了,網路上有很多安裝教學,今天我們也來跟著做一次。操作過程參考了 ROS 官網Microsoft Gituhub

Windows作業系統

  • ROS1 for Windows 需要 64位元的 Windows 10 Desktop 或 Windows 10 IoT Enterprise.
  • ROS1 目前無法執行於 Windows 10 IoT Core.

預留安裝空間

  • 在C: 下建立一個名為 opt 的資料夾,這就是後續安裝的路徑。

  • C: 要保留大約 10GB 的空間

安裝Visual Studio 2017

建立一個Visual Studio 的系統管理員命令提示字元:

    • 在C:\opt 資料夾下,點擊滑鼠右鍵,新增一個捷徑
    • 如下圖,請根據您所使用的 VS版本,輸入以下內容:

      • VS Community:
        C:\Windows\System32\cmd.exe /k "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\VsDevCmd.bat" -arch=amd64 -host_arch=amd64
        VS community
      • VS Professional:
        C:\Windows\System32\cmd.exe /k "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\Tools\VsDevCmd.bat" -arch=amd64 -host_arch=amd64
        VS Professional
      • VS Enterprise:
        C:\Windows\System32\cmd.exe /k "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=amd64 -host_arch=amd64
        VS Enterprise
        
        

    • 將本捷徑命名為 “ROS
    • 將本捷徑權限設定為系統管理員
      • 對本捷徑點擊滑鼠右鍵,選擇 “屬性
      • 在跳出視窗中,點選 “捷徑” 標籤,同一視窗中點選下方的 “進階” 按鈕,如下圖

      • 勾選 “以系統管理員身分執行“,接著連按兩次OK就完成。如下圖:

安裝 Chocolatey

Chocolatey 是一個 Windows 套件管理器,類似於 Linux 的 apt-get,方便安裝各種ROS所需的工具與函式庫。請由Chocolately網站下載對應的套件包並安裝完成。後續就可使用 choco install 等語法來安裝所需的套件。

  • Chocolatey安裝完成之後,開啟上一步所完成的 ROS命令提示字元,並輸入以下指令:
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
  • 將上述內容貼入命令提示字元並按 Enter,有相關詢問請都同意。完成之後請關閉這個 ROS命令提示字元:

安裝 Git

Git 的功能不用多說了吧,方便我們取得許多套件以及網路上的範例。請在ROS命令提示字元中輸入以下指令:

choco install git -y
install git

 

安裝ROS for Windows

   ROS官方文件建議安裝 desktop_full metapackage,是所需套件的集合,包含了機器人建置、執行、除錯與視覺化等相關功能。

  • 請在ROS命令提示字元中輸入以下指令,在此需要一些時間:
choco source add -n=ros-win -s="https://roswin.azurewebsites.net/api/v2" --priority=1 
choco upgrade ros-melodic-desktop_full -y

ROS 2 並存

    如果需要使用 ROS2,可以建立一個獨立的空間再指到這裡。例如以下指令就是指到 c:\opt\chocolately

mkdir c:\opt\chocolatey 
set ChocolateyInstall=c:\opt\chocolatey 
choco source add -n=ros-win -s="https://roswin.azurewebsites.net/api/v2" --priority=1 
choco upgrade ros-melodic-desktop -y
後續可用以下指令來更新:
set ChocolateyInstall=c:\opt\chocolatey 
choco upgrade ros-melodic-desktop -y

操作 ROS on Windows

ROS 操作幾乎都是在命令提示字元下完成的,且常常需要開啟多個。

  • 在ROS命令提示字元中執行 ROS setup script:
c:\opt\ros\melodic\x64\setup.bat
ROS setup.bat
  • 如果未出現錯誤,就可以執行常用的 ROS 指令,建置節點,一起來玩吧!相關ROS comand line 指令請點我

執行常用ROS指令

  • 相關ROS comand line 指令請點我,各 ROS 命令提示字元開啟之後都要執行一次,或者可以在加入 “&&c:\opt\ros\melodic\x64\setup.bat“,這樣就不用每次都輸入了。如下圖:

  • 首先先執行 roscore:

  • 執行 rostopic list,看看可用的 topic:

  • 執行 rosrun roscpp_tutorials talker

註:

如果出現 qt 相關錯誤時,可以手動安裝 qt (https://www.qt.io/download)

Micro:bit雲端IoT應用:雲端風扇,使用BOSON Wi-Fi模組

$
0
0

 

作者 郭俊廷
時間 60分鐘
難度 ***
材料表 電腦/筆記型電腦/

BBC micro:bit 微控制板x1

Boson擴充板 for micro:bitX1

BOSON風扇、濕度感測器X1

Micro USB線

本篇文章分別以Makecode舊版、新版介面做教學,舊版與新版MakeCode差異請看此篇-連結

BOSON套件

BOSON套件可以與Micro:Bit連結Wi-Fi模組上網,使用雲端服務,也可以連結LinkIt7697開發板,也能不寫程式接線使用,相當方便,Micro:bit、LinkIt7697相關實做與教學資料正在陸續充實,可以參考BOSON Gitbook:https://cavedu.gitbook.io/boson/

 

BOSON設計創意勞作難不難?請看此影片

 

BOSON是否各種創意發想?請看以下12播放影片

接線與註冊雲端帳戶

接下來看看DFROBOT BOSON套件裡的Obloq IoT模組,今天我們將此模組結合上BOSON套件裡的濕度感測器還有迷你風扇,實現在雲端上資料讀取和控制。

模組上有兩個3PIN接口,RX是接收端,TX是發送端,還有一個RESET重置鈕跟UPGRADE硬體升級鈕。

把它跟我們的micro:bit控制板擴充板連接,RX接到P0,TX接到P1

使用dfrobot的物聯網雲端服務平台Easy IoT

http://iot.dfrobot.com/

沒有帳號的人點右上角註冊一個帳號,輸入信箱、密碼,完成註冊後登入

接著我們把視窗切換到WorkShop工作間,可以知道自己的Iot ID跟密碼

並且按Add a new device新增一個通道名稱:Obloq IoT模組

新增後會得到一個Topic(之後程式會用到)

舊版本MakeCode

接下來使用Microsoft的makecode來編輯我們Micro:bit的程式

https://makecode.microbit.org/v0

一開始先新增一個OBLOQ套件,點進階裡的添加套件

搜尋OBLOQ即可看到我們所要新增的套件

選擇Obloq裡的Obloq mqtt 初始設置

設定當啟動時Obloq mqtt 初始設置,接收數據選擇P1、發送數據選擇P0

Wi-Fi名稱跟密碼要注意大小寫不要寫錯

Iot ID與密碼請使用剛剛在Obloq IoT模組得到的Topic複製貼上

服務器請改成全球

接著是濕度感測器的部分,我們把濕度感測器接在P2

並在重複無限次的地方設定把

1、P2讀取到類比信號÷10設為變數hum

2、因為BOSON濕度感測器是十進制的,若要得到百分比要除以十

3、再來從Obolq使用MQTT發送消息至我們設定的topic_0

4、因為發送的消息只能以字串型態傳送所以我們把變數hum用字串組合成字串

5、設定暫停五秒來每五秒傳送訊息一次

新版本MakeCode

這裡提醒一下如果使用新版的MakeCode編輯器Obloq模組會找不到,請依照以下步驟操作

https://makecode.microbit.org/#editor

新版的添加套件名稱改為擴展

一開始會找不到OBLOQ的套件

這時候不用擔心,直接使用github的網址來新增Obloq的擴展

https://github.com/DFRobot/pxt-ObloqV1

如果你是舊版轉新版的人記得也一樣新增新的擴展更新掉舊的套件,這樣WiFi才能運作

新版的當啟動時的Qbloq mqtt設定

重複無限次是濕度感測器的部分

 

執行

把濕度感測器接在P2

接著把程式燒入進Micro:bit裡面,測試Obolq IoT模組功能有無正常

一開始的紅燈代表功能沒有正常運作,如果Obolq IoT模組一直亮紅燈可能是你的Wi-Fi設定有誤,或是接腳接錯、接腳設定錯誤

亮藍燈代表正在連接Wi-Fi當中

最後Obolq IoT模組亮綠燈,Micro:bit有出現打勾且Obolq IoT模組綠燈恆亮,代表Wi-Fi功能正常,資料開始傳送中,如果亮綠燈之後,又跳回亮紅燈或藍燈或是紫燈,代表可能是你的Wi-Fi訊號不良,或是設定有誤,麻煩請你檢查一下你的網路環境。

接著查看雲端上接收到的資料,按View details即可查看最新接收到的資料

這裡可以看到每隔五秒就接收到一次濕度的百分比

也有以折線圖方式顯示的介面

接著在雲端輸入ON、OFF控制風扇開關

把風扇連接在P8,Obolq使用在topic_0收到message時運行

如果訊息是ON,Micro:bit給P8腳位高電位,風扇轉動。訊息是OFF,Micro:bit給P8腳位低電位,風扇停止

接著透過Obolq IoT模組MQTT接收雲端的訊息控制我們的風扇

首先先按Send msg傳送訊息

送出ON的時候風扇就會啟動

送出OFF的時候風扇就會關閉

以上就是我們DFROBOT BOSON套件的Obloq IoT模組實際測試跟應用,還有很多感測器跟輸出可以結合跟使用,大家可以自己動手試試看結合更多BOSON的輸入跟輸出模組來做應用。

AWS DeepRacer 競賽@2019 AWS台北高峰會

$
0
0

6/12 13兩天是 2019 AWS 高峰會,其中讓我們很感興趣的是 AWS Deepracer 賽車課程與競賽(原廠介紹請點我)。參賽者運用AWS 上的強化學習架構 (阿吉老師有翻譯一本強化學習的書喔) ,訓練出一個足以跑完環形場地的視覺辨識模型,可以先在模擬環境中來試車,最後再把訓練好的模型放在1/18比例的賽車中下場比賽。

當然啦,模擬和實車就是不一樣,太多東西要考慮了。所以這次的活動一定要來參加。本車規格列於本文最後,Amazon說7月可出貨,有興趣就買一台來玩吧

搭一個背景台就是不一樣啊

會場有教學課程,報名參加之後會詳細介紹AWS 上的 RL強化平台如何搭配 AWS DeepRacer,您就可以開始訓練模型。如果想直接參加比賽也可以,現場有三種預設的模型:

1. 追蹤中線:激勵車子盡可能靠近軌道中央,不要使用到整個軌道。使車子盡量保持在車道中央,但也有可能讓車子無法找到最佳路徑。

2. 轉向懲罰:激勵車子使用整個賽道並對過度轉向進行懲罰。目標是找出最佳路徑,但有可能會在轉彎處偏離軌道。

3. 油門懲罰:激勵車子愈快愈好,目標是以最短時間完成一圈。但很有可能因為跑太快而出界。

請看這個影片是實際操作的過程,會給操作者一個 ipad 來操作,可以看到車子的即時影像(根本沒時間看),但現場網路不錯,影像不太lag。接著就是四個動作:啟動車子,停止車子,加速與減速,速度是分成0~100的百分比。

車子出界的話會由工作人員把車子放回原本的出界處繼續跑(不停錶),出界次數太多就不算完賽。現場最忙碌的就是這兩位帥哥美女一直在撿車…

整備台實況:要檢查車子硬體、充電,對下一組選手進行教學,很忙碌呢

來看看外殼與內裝。要能夠在機器端執行推論,至少也要是一片Raspberry Pi 3等級以上的單板電腦,但根據規格(請拉到最下面) 只知道是一個 Intel Atom處理器/4G ram,OS為 Ubuntu 16 的神秘傢伙,到時候到貨就知道嚕。

 

獎品台:最終排名前十名可以帶一台DeepRacer實車回家,羨慕啊~  完賽就有Tshirt或帽子,我們是6/12參加所以拿了T shrit

另外場中的其他展示:

Sumerian蘇美人 AR/MR/XR 服務

自動倉儲的撿貨機器人,別忘了Amazon歷年都有舉辦機器人撿貨比賽喔

Robomaker機器人服務,現場使用常見的turtlebot 來示範,聲稱與ROS有相當好的整合

 

AWS DeepRacer規格 (AWS re:Invent 2018影片)

車體 18th scale 4WD with monster truck chassis
CPU Intel Atom™ Processor
記憶體 4GB RAM
儲存 32GB Memory (可擴充)
Wi-Fi 802.11ac
Camera 4 MP camera with MJPEG
軟體 Ubuntu OS 16.04.3 LTS, Intel® OpenVINO™ toolkit, ROS Kinetic

 

驅動電池 7.4V/1100mAh lithium polymer
運算電池 13600mAh USB-C PD
接口 4x USB-A, 1x USB-C, 1x Micro-USB, 1x HDMI
感測器 整合式加速度計與陀螺儀
保固條約 一年有限保固. Use of the AWS DeepRacer device is subject to the terms found here.
美國加州居民 Click here for Proposition 65 warning.

NVida Jetson Nano 初體驗(一)安裝與測試

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

Nvidia Jetson是Nvidia為Embedded system所量身打造的運算平台,包含了TK1、TX1、TX2、AGX Xavier以及最新也最小的「Nano」開發板。這一系列的Jetson平台皆包含了一顆NVidia為隨身裝置所開發,內含ARM CPU、NVida GPU、RAM、南北橋等,代號為Tegra的SoC處理器。

Jetson家族比較

TK1 TX1 TX2 AGX Xavier Nano
GPU cores 192 Core 256 Core 256 Core 512 Core 128 Core
CPU 4 core 4 core 6 core 8 core 4 core
Memory 2GB DDR3 4GB DDR4 4GB DDR48GB DDR4

二種版本

16GB DDR4 4GB DDR4
Storage 16GB eMMC 16GB eMMC 32GB eMMC 32GB eMMC SD(開發板)16GB eMMC

(二種版本)

Video Encode 1080p@30 4K@30 (3x) 4K@30 (4x) 4Kp60 / (8x) 4Kp30 4K@30
Video Decode 1080p@60 4K@60 (2x) 4K@60 (2x) 8Kp30 / (6x) 4Kp60 4K@60
WI-FI O O O O X
Bluetooth X O O O X
Power 5W 10W / 15W 7.5W / 15W 10W / 15W / 30W 10W
USB USB 3.0 USB 3.0 + USB 2.0 USB 3.0 + USB 2.0 USB 3.0 + USB 2.0 USB 3.0 + USB 2.0

 

Jetson Nano & Raspberry Pi

下圖可見Jetson Nano與樹莓派在尺寸上差異,雖然兩者都面向maker市場,但功能及配備上有著不小的差異。樹莓派雖然在運算效能上遠遠落後,但是內建WIFI、Bluetooh、Audio,更為小巧的體積及電源耗用,在較為嚴苛的環境仍有其優勢。

Jetson Nano Raspberry Pi
CPU 64-bit Quad-core ARM A57 (1.43 GHz) 1.4 GHz 64-bit quad-core ARM Cortex-A53
GPU 128-Core Nvidia Maxwell Broadcom VideoCore IV
RAM 4GB DDR4 1GB DDR2
WIFI X 802.11ac
Bluetooth X LE 4.2
Ethernet Gigbit Gigbit (300Mbps max)
GPIO 40 pin 40 pin
USB USB 2.0 x 3USB 3.0 x 1 USB 2.0 x 4
Audio X Audio jack
Power 5~10W 400 mA (2.0W)
Price $99 $35
算力 472 Gflops 24 Gflop

 

Jetson Nano的電源供應

目前網路上已經有不少的開箱文及影片了,因此就略過不提。不過,如果您在購買時沒有額外購買電源供應器,僅透過一般PC上的USB port來供電,那麼當Jetson Nano在執行較多的運算或程式時,有極高的機率會直接當機或開不起來。官方建議是Adafruit此款2.5A電源供應器(USD $7.5):https://www.adafruit.com/product/1995

5V 2.5A Switching Power Supply with 20AWG MicroUSB Cable

我在露天找到此款便宜又大碗的4A電源僅TWD $240(接頭為5.5 x 2.1-2.5mm),目前用起來還沒有什麼問題:

Jetson Nano的Power jack可支援到5V 4A的輸入,因此改用Power jack而不使用Micro-USB,在電源供應上會比較穩定,也讓你的Jetson Nano執行起來比較讓人放心,不過記得J48要插上jumper後才會轉為由Power jack來供電(如下圖紅圈)。

下載Image檔及開機

請準備一片16GB以上的SD卡,接著從此URL下載官方的image檔:https://developer.nvidia.com/embedded/dlc/jetson-nano-dev-kit-sd-card-image,約有8G大小。下載後使用Win32 Disk Imager寫入SD卡,插入Jetson Nano後開機便可直接使用了。

SD卡從下圖方向插入,跟樹莓派的前代一樣有彈簧卡榫,但並不會有不小心按到彈出的缺點。

開機後的一些設定畫面,由於網路上教學已經很多,因此在此先略過不提。

目前NVidia Jetson系列所使用的Linux OS稱為Linux4Tegra,源碼是修改自Ubuntu 18.04版並針對Nvidia硬體作優化,預裝好了JetPack、cuda、cudnn、openc等軟體,不需要另行安裝。

Virtualenv安裝及設定

sudo apt-get install virtualenv -y

mkdir envs; cd envs

virtualenv –p python3 AI

source ~/envs/AI/bin/activate

echo ' source ~/envs/AI/bin/activate ' >> ~/.bashrc

設定OpenCV

已內建安裝了OpenCV,因此並不需要重新安裝,但是需要在python virtual environment中link到site-packages。

sudo find / -name "cv2*"

[sudo] password for pi:

find: ‘/run/user/1000/gvfs’: Permission denied

/usr/lib/python2.7/dist-packages/cv2.so

/usr/lib/python3.6/dist-packages/cv2.cpython-36m-aarch64-linux-gnu.so

cd ~/envs/AI/lib/python3.6/site-packages/

ln -s /usr/lib/python3.6/dist-packages/cv2.cpython-36m-aarch64-linux-gnu.so

測試看看:

看來OpenCV預裝的3.3.1版本不太新,且該版本未支援Deep Neural Networks的DNN模組,不過由於NVidia GPU也尚未支援OpenCV DNN,因此影響不大。

安裝常用的模組

sudo apt-get update

sudo apt-get upgrade

sudo apt-get install libfreetype6-dev pkg-config -y

sudo apt-get install zlib1g-dev zip libjpeg8-dev libhdf5-dev -y

sudo apt-get install libssl-dev libffi-dev python3-dev -y

sudo apt-get install libhdf5-serial-dev hdf5-tools -y

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

sudo apt-get install build-essential cmake libgtk-3-dev libboost-all-dev -y

sudo apt-get install nano -y

pip install matplotlib

pip install scikit-build

pip install imutils

pip install pillow

安裝Scipy, Scikit-learn, Keras, Jupyter notebook

想到能夠在GPU上執行這些常用的AI軟體就非常興奮,雖然只是在小小的Jetson Nano上。

pip install scipy

pip install keras

pip install scikit-learn

pip install jupyter notebook

安裝Tensorflow

查看目前支援的Tensorflow版本:https://developer.nvidia.com/embedded/downloads#?search=TensorFlow

pip install --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42 tensorflow-gpu==1.13.1+nv19.4

測試看看,版本為1.13.1:

開啟SWAP

預設並沒有設定SWAP,所以Jetson Nano一run超過記憶體就立即當機了。

先輸入下方的指令看看,顯示沒有設定任何的SWAP:

sudo swapon –show

一般idle情況下就只有2.6G可用。

SD卡空間目前剩下約17G可用。

理想的SWAP size應是RAM的二倍,但由於SD空間不是很充裕,先設定4G SWAP。

sudo fallocate -l 4G /swapfile

sudo chmod 600 /swapfile

ls -lh /swapfile

建立並啟用SWAP。

sudo mkswap /swapfile

sudo swapon /swapfile

sudo swapon –show

輸入free -h確認已經有4G SWAP空間了。

free –h

由於重開機後SWAP設定便會跑掉,因此,把SWAP加到fstab設定檔中。

sudo cp /etc/fstab /etc/fstab.bak

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

安裝DLIB

讓我們也能在Jetson GPU上使用Dlib的機器學習、計算機視覺、圖像處理等函式庫。

您可採用下列的方式從source安裝,亦可簡單的透過 php install dlib來安裝,但注意使用pip此法安裝無法使用到GPU。

mkdir temp; cd temp

git clone https://github.com/davisking/dlib.git

cd dlib

mkdir build; cd build

cmake .. -DDLIB_USE_CUDA=1 -DUSE_AVX_INSTRUCTIONS=1

cmake --build .

cd..

python setup.py install

sudo ldconfig

安裝過程中,DLIB會自動偵測已安裝的CUDA版本(Nnao為10.0)。

如果過程中有碰到如下的error:

fatal error: Python.h: No such file or directory 的error message

請找到Python.h的path後,再設定CPLUS_INCLUDE_PATH環境變數,重新安裝即可。

sudo find / -name “Python.h”

/usr/include/python3.6m/Python.h

/usr/include/python2.7/Python.h

export CPLUS_INCLUDE_PATH=/usr/include/python3.6m

安裝Darknet

Darknet framework,讓Jetson Nano可訓練或透過Darknet推論YOLO model。

將下列兩行加到 ~/.bashrc後方

export PATH=${PATH}:/usr/local/cuda/bin

export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda/lib64

git clone https://github.com/pjreddie/darknet

cd darknet/

nano Makefile

將Makefile中的下列參數內容更改為1

GPU=1

CUDNN=1

OPENCV=1

更改後存檔,執行 make 即完成。

安裝YOLO3-4-Py

讓Jetson Nano可透過Python在GPU推論YOLO model。

export GPU=1

pip install yolo34py-gpu

安裝Jetson.GPIO

讓我們能透過Python操控Jetson Nano上的40組GPIO接腳。

pip install Jetson.GPIO

sudo groupadd -f -r gpio

#請將下方的pi改為你自己的account

cd practicesudo usermod -a -G gpio pi

sudo cp /opt/nvidia/jetson-gpio/etc/99-gpio.rules /etc/udev/rules.d/

最後,請重開機或執行

sudo udevadm control --reload-rules && sudo udevadm trigger

安裝Jetson stats

這是一套非常好用、針對NVIDIA Jetson系列所開發的資源監控工具。

git clone https://github.com/rbonghi/jetson_stats.git

cd jetson_stats/

執行ntop,可看到CPU、GPU、memory、Disk的耗用情況、以及電量、溫度等資訊。

執行jetson_release可顯示本環境中所安裝的NVIDIA Jetson各項版本資訊。

 

使用Keras+Jupyter notebook訓練 CIFAR 10

訓練時Jetson Nano的GPU使用率約在60~80%之間,每個epoch執行時間約30秒,訓練過程及結果請參考:https://github.com/ch-tseng/jetson_nano_test/blob/master/CIFAR10-Training-on-a-Jetson_Nano.ipynb 。

CIFAR10 訓練時的資源秏用:

坦白說,這速度並不很讓人滿意,使用i7 7600K每個epoch的速度約8秒,仍遠勝Jetson Nano的128 GPU Cores,看來將Nano用來作為training用途是不太實際的想法。

執行Tensorflow models

TensorRT是NVidia推出專用於模型推理的一種神經網路推理加速器,可透過優化模型來加速推論時的速度,尤其應用於Jetsosn系列,速度可提昇至8~15倍以上。不過,為了實際感受Jetson Nano 128 Core GPU的速度,在下方的範例我都沒有使用TensorRT而是直接使用TF Frozen Graph,因此FPS的數字看來並不是想像中那麼美好,不過以$99美元的開發板來說,這速度和樹莓派比較起來已經相當超質了。(請注意Nano全速運轉時,上面那一大塊散熱板可作為烤肉盤使用)

自己訓練的指尖/手掌偵測模型(SSD-MobileNet V2)

透過OpenCV+Python call Tensorflow-gpu 執行。

速度:7.5 FPS

YOLOV3-Tiny + COCO Dataset

使用darknet程式直接執行,未透過python。

速度:9-11 FPS

YOLOV3-Tiny + 自己訓練的行車道路缺陷偵測模型

使用darknet程式直接執行,未透過python。

速度:5~6 FPS

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

如何計算道路及十字路口的車流

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

傳統車流的計算是以人工計數器的方式,再搭配測速槍以計算行車速率,但採用此方式進行交通調查需要耗費龐大資源而且難以頻繁及大規模地執行,所以後來改採用車輛偵測器(Vehicle Detector, VD),有超音波反射式、環路線圈式、聲納式、紅外線以及微波雷達式等不同的方法,但使用VD會有購置成本及後續的維修成本,成本較高。

在目前電腦硬體成本大幅下降以及Deep learning和computer vision技術的支援下,透過影像方式來計算統計車流成為可行,不但成本更低且方便設置。下面我們來試看看,透過影像的方式來計算道路上的車流量,並且分類出車子的類型,以及不同方向的車流數目。

使用技術

要能作到分類車子類型以及不同方向的車流數目,需要使用到:

  1. 物件偵測( Object detection):

用於車輛位置及類型,本範例中我們使用YOLO V3進行車輛的偵測及定位,您也可以使用其它的物件偵測技術,例如SSD或R-CNN等等,只要能夠取得車輛的種類及位置就可以了。

  1. 物件追蹤 (Object tracking)

避免重複計算,因為每個影格frame每進行一次物件偵測都會得到一次新的物件列表,使得我們無從得知上下frame的物件是否為同一台車輛以避免重複計算,也無法掌握車子行進的方向,這必須要透過Object tracking才能解決。

  1. 影像處理

我們不需要針對整張圖計算車子流量及方向,只要加入繪製好的線段、熱區到隱藏圖層上,當車輛經過此線或此區域時再進行判斷及計算即可。

車輛偵測定位及分類

我們直接使用YOLO提供的pre-trained yolov3.weights來進行車輛的定位偵測及分類。因為這個pre-trained model是使用Coco dataset所訓練,可偵測多達80種物件,其中也包含了數種車輛類型,如:car、truck、bus、bicycle、motorbike等,若是想要做其它更多或更細的車輛分類,需要另外自行訓練哦。

車輛追蹤及計算

接下來,我們要在圖片上虛擬一塊熱區及一條計算線,它的位置及功能如下:

當我們得到車輛的類型以及位置之後,接著,我們將:

  • 判斷此車輛的位置是否在熱區的範圍。
  • 若處於熱區範圍,則與上一個frame的車輛進行比對,計算該車中心點與上一個frame所有車輛的中心點距離最短是那一台。
  • 若非處於熱區範圍則略過不處理。
  • 由於我們的熱區是定義於道路中間位置,因此理論上該熱區不會有突然新出現的車輛,每一台車應該能找到其一個frame的所在位置。
  • 經由上下frame得到該車的行徑方向,並將該方向的車輛數目加1。
  • 車子行徑的方向,可由上下frame車子的中心點(X,Y)的變化來判斷:

注意放置計算線的位置,我偏好放置於比較接近出口的附近,這是為了給YOLO有充份的時間進行偵測,若是放得太接近入口,那麼車子剛出現的尺寸可能不太大(因為距離較遠),而且可能還沒有偵測到就快離開計算線或熱區了,這樣會影響到計算的結果。

實例

以下面的影片為例,很明顯我們只要判斷Y值的變化即可判斷車流的方向。

我們在影片中加入南北雙向的兩條計算線,並以線的上下各30 pixels寬度作為熱區,可以想像影片如下:

輸入車輛的bbox(bounding box),判斷是否進入南下的熱區,若在熱區,則將該車的ID、bbox、中心點、車子種類、是否已計算過等資訊,放入儲存目前frame data的array中。

def in_range_N2S(bbox):

    #only calculate the cars (from south to north) run across the line and not over Y +- calculateRange_y

    x = bbox[0]

    y = bbox[1]

    w = bbox[2]

    h = bbox[3]

    cx = int(x+(w/2))

    cy = int(y+(h/2))

    if(cx>=calculateLine2[0][0] and cx<=calculateLine2[1][0] and \

        cy>calculateLine2[0][1]-calculateRange_y and cy<=(calculateLine2[1][1]+calculateRange_y) ):

        return True

    else:

        return False

if(in_range_S2N(box)==True or in_range_N2S(box)==True):

    now_IDs.append(id)

    now_BBOXES.append(box)

    now_CENTROIDS.append(bbox2Centroid(box))

    now_LABELS.append(labelName)

    now_COUNTED.append(False)

    cv2.rectangle(frame, (box[0], box[1]), (box[0]+box[2], box[1]+box[3]), (0,255,0), 2)

傳入上下兩個frame的車子bbox list,以上個frame的list為基準,從上一個frame熱區中車子裹,找出與目前frame熱區中距離最短的車子,放入新的list中,我們可以透過該list找到上下兩個frame中每台車子的對應。

兩點(x1,y1), (x2, y2) 距離的計算是使用歐式距離(又稱歐幾里得距離),指的就是兩點之間的直線最短距離。

def count_Object(centroid_last, centroid_now):

    distances = []

    for cent_last in centroid_last:

        smallist = 99999.0

        smallist_id = 0

        dist = 0.0

        

        for id, cent_now in enumerate(centroid_now):

            dist = distance(cent_now, cent_last)

            if(dist<=smallist):

                smallist = dist

                smallist_id = id

        distances.append(smallist_id)

    return distances

從車子對應表中,如果該車輛的中心點在上個frame位於計算線下方,而目前frame的中心點已超過計算線,則可判斷該車為北上,反之則為南下,分別針對不同車道、不同的車型累加1。

for id, now_id in enumerate(obj_target):

    #if last Y is under the line and now Y is above or on the line, then count += 1

    print(last_CENTROIDS[id][1], calculateLine2[0][1], now_CENTROIDS[now_id][1], calculateLine2[0][1])

    UP = last_CENTROIDS[id][1]>calculateLine1[0][1] and now_CENTROIDS[now_id][1]<=calculateLine1[0][1]

    DOWN = last_CENTROIDS[id][1]<calculateLine2[0][1] and now_CENTROIDS[now_id][1]>=calculateLine2[0][1]

    if( UP is True):

        if(now_LABELS[now_id]=="truck"):

            count_Truck1 += 1

        elif(now_LABELS[now_id]=="car"):

            count_Car1 += 1

        elif(now_LABELS[now_id]=="bus"):

            count_Bus1 += 1

        elif( DOWN is True):

            if(now_LABELS[now_id]=="truck"):

                count_Truck2 += 1

            elif(now_LABELS[now_id]=="car"):

                count_Car2 += 1

            elif(now_LABELS[now_id]=="bus"):

                count_Bus2 += 1

執行結果

非垂直或水平的道路

你可能會有個疑問,這類十字形垂直或水平的道路很容易用X或Y軸的變化來計算,但如果是傾斜或不規則形狀的道路那怎麼處理呢?比如像下圖的十字路口。

像這類斜向的道路,如果我們依樣畫葫蘆劃出斜度的線性直接才行,但問題就來了,要如何快速的判斷車輛行徑,而不需要很麻煩的計算出y=ax+b的函式?此外,斜線寬度為1的直線,實際上其寬的點數不一定為1,因此很有可能一台車輛速度很慢,上個frame的中心點在此線上,下一個frame也還沒脫離此線,不過此問題較小可透過程式來解決。

以隱藏的色線來取代計算線

我們可以加入此隱藏的圖層到圖片上,看起來如下(各路口都有紅綠的雙層線,看起來顏色雖然相同,但不同路口的顏色值有差一點點,可協助我們快速判斷目前車子是在那一個路口):

採用顏色的好處如下:

  1. 紅色與綠色的交界處就類似我們之前的計算線,其不同色系的交界處永遠為1,不會有寬度不均的問題。
  2. 取得車輛中心點在隱藏層的顏色,比起推論線性函式及計算該點位於該線的何種方位來得簡單且直覺多了。
  3. 提供自行定義的界面,讓使用者可在相片中抹上顏色或劃線,自行加入不規則形狀的禁區或熱區。例如,我們可以在如下的草坪區加入隱藏的色區,用於偵測是否有人侵入。

繪製隱藏圖層及顏色判斷程式說明:以此張圖為示範

定義十字路口上的線段並繪製到一複製的圖(該圖我們不顯示,因此是隱藏的)。

線條可以畫寬一點作為熱區來使用。範例中用40(px),當車輛在該顏色區域時,可開始進行追蹤。

calculateLine1 = [(36, 610), (1126, 900)]  #[(from(x,y), to(x,y)]

calculateLine2 = [(820, 350), (1574, 530)]  #[(from(x,y), to(x,y)]

calculateLine3 = [(830, 380), (0, 580)]  #[(from(x,y), to(x,y)]

calculateLine4 = [(1532, 590), (1224, 880)]  #[(from(x,y), to(x,y))

def draw_CalculateLine(frame):

    cv2.line(frame, (calculateLine1[0][0],calculateLine1[0][1]+20), (calculateLine1[1][0],calculateLine1[1][1]+25), (0, 255, 0), 40)

    cv2.line(frame, (calculateLine2[0][0],calculateLine2[0][1]-20), (calculateLine2[1][0],calculateLine2[1][1]-25), (0, 255, 0), 40)

    cv2.line(frame, (calculateLine3[0][0],calculateLine3[0][1]-20), (calculateLine3[1][0],calculateLine3[1][1]-25), (0, 255, 0), 40)

    cv2.line(frame, (calculateLine4[0][0],calculateLine4[0][1]+25), (calculateLine4[1][0],calculateLine4[1][1]+35), (0, 255, 0), 45)

    cv2.line(frame, (calculateLine1[0][0],calculateLine1[0][1]), (calculateLine1[1][0],calculateLine1[1][1]), (0, 0, 255), 40)

    cv2.line(frame, (calculateLine2[0][0],calculateLine2[0][1]), (calculateLine2[1][0],calculateLine2[1][1]), (0, 0, 254), 40)

    cv2.line(frame, (calculateLine3[0][0],calculateLine3[0][1]), (calculateLine3[1][0],calculateLine3[1][1]), (0, 0, 253), 40)

    cv2.line(frame, (calculateLine4[0][0],calculateLine4[0][1]), (calculateLine4[1][0],calculateLine4[1][1]), (0, 0, 252), 40)

    return frame

frameLayout = frame.copy()

frameLayout = draw_CalculateLine(frameLayout)

取得某車輛中心點在上一個frame以及目前frame的顏色,然後判斷比較其行徑方向。例如,目前上一個frame車子中心點所在為綠色,目前frame為紅色,則可判定為往十字路口中心走去。

取得圖片上某一點的RGB顏色值方法為:(B,G,R) = image[y,x]

顏色比對是否相同的方法為:image[y,x] == [B,G,R]).all()

color_now = frameLayout[now_CENTROIDS[now_id][1],now_CENTROIDS[now_id][0]]

color_last = frameLayout[last_CENTROIDS[id][1],last_CENTROIDS[id][0]]

UP_1 = (color_now == [0,0,255]).all() and (color_last == [0,255,0]).all()

DOWN_1 = (color_last == [0,0,255]).all() and (color_now==[0,255,0]).all()

UP_2 = (color_now == [0,0,254]).all() and (color_last == [0,255,0]).all()

DOWN_2 = (color_last == [0,0,254]).all() and (color_now==[0,255,0]).all()

UP_3 = (color_now == [0,0,253]).all() and (color_last == [0,255,0]).all()

DOWN_3 = (color_last == [0,0,253]).all() and (color_now==[0,255,0]).all()

UP_4 = (color_now == [0,0,252]).all() and (color_last == [0,255,0]).all()

DOWN_4 = (color_last == [0,0,252]).all() and (color_now==[0,255,0]).all()

示範影片:

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

 

 

Raspberry Pi 4 來了!有1/2/4GB等多種記憶體規格

$
0
0

Raspberry Pi 4 來了,CAVEDU的AI車又多一個無痛升級的選擇,還有1/2/4GB RAM可以選擇喔,要跑較高效能的應用也沒問題了!

本文由阿吉老師取得 Eben Upton先生同意之後翻譯刊登 (原文連結)

翻譯文開始:


驚喜!Raspberry Pi 4開賣了,基礎售價從$35美金開始。這次是全面升級,也是首次對多數使用者提供可比擬PC的效能,同時也保留其他Pi 產品線一如既往的互動與修改程度。

請由您當地的合格代理商購買,或從英國劍橋的Raspberry Pi Store 也可以買喔,8am–8pm!

Raspberry Pi 4 Model B

規格馬上看:

  • A 1.5GHz quad-core 64-bit ARM Cortex-A72 CPU (~3× performance)
  • 1GB, 2GB, or 4GB of LPDDR4 SDRAM
  • Full-throughput Gigabit Ethernet
  • Dual-band 802.11ac wireless networking
  • Bluetooth 5.0
  • Two USB 3.0 and two USB 2.0 ports
  • Dual monitor support, at resolutions up to 4K
  • VideoCore VI graphics, supporting OpenGL ES 3.x
  • 4Kp60 hardware decode of HEVC video
  • Complete compatibility with earlier Raspberry Pi products

正面,依然是帥氣的小惡魔呢:

Raspberry Pi 4 記憶體選項

這是首次Pi 有不同的記憶體選項,我們提供了更高的記憶體容量並保留入門的 $35美金價位:

RAM 零售價
1GB $35
2GB $45
4GB $55

以上售價當然還要另外加上稅金與運費等必要費用。這三款都在今天(2019 / 6/ 24) 上市了:2GB 的版本備貨比較充足,之後看哪一款比較受歡迎再調整庫存囉

新的Raspberry Pi 4、全新特色

乍看之下會覺得 Raspberry Pi 4 與2014上市的 $35美金 Raspberry Pi 1B+ 差不多。 James 下了苦工才做到這件事,但同時他也首次對 form factor 做了必要的調整來加入新特色,請看:

電源

原本的USB micro-B電源接頭改成了USB-C,這樣可以再額外提供 500mA 電流,確保即便在CPU高負載的前提下,對外接的USB裝置可以提供 1.2A 的電流。

額外0.5安培,以及USB OTG開機

影像

為了在現有的板子配置兩個顯示輸出,原本的 type-A (full-size) HDMI接頭換成一組 type-D (micro) HDMI接頭。

兩個 mini HDMI 接頭

Ethernet 與 USB

Gigabit Ethernet 接頭從原本的右下方換到了右上方,這樣大幅減少了PCB佈線。4-pin 的 Power-over-Ethernet (PoE) 接頭位置不變,因此 Raspberry Pi 4 依然可相容於 PoE HAT擴充線。

主SoC上的 Ethernet 控制器是透過專用 RGMII link 來連到外部的 Broadcom PHY 來確保輸出。 USB 則是透過一個外部的 VLI 控制器所提供,經由 a single PCI Express Gen 2 lane 來連接,使得總頻寬達到 4Gbps 再由四個 USB port 分配使用。

板子右側的三個接頭突出板子邊緣約 1mm,目標是簡化板子的設計。

整體而言,接頭與安裝孔保持不變,這當然為了確保能與現有的各類HAT擴充板與其他周邊相容。

新版Raspbian作業系統

作業系統當然也做了大量修改來支援 Raspberry Pi ,並以即將發布的 Debian 10 Buster release 為基礎。這牽涉到非常多幕後的技術改進還有數不完的新介面,還有包含 Chromium 74 web browser 在內的各式軟體。Simon 在這篇 blog 深入介紹這些改動,但現在先看看新的作業系統化面。

Raspbian Buster desktop

想要馬上玩玩看 Raspbian Buster 的朋友:強烈建議您先下載新的作業系統映像檔,而非去更新原本的sd卡。這樣可確保您是從一個乾淨可運作的 Buster OS。但如果您非常想要自行升級的話,記得先備份

Raspberry Pi 4 一個值得一題的邁進就是淘汰了先前版本的圖形驅動程式,並改用 Mesa “V3D” 驅動程式,這是由任職於 Broadcom 的 Eric Anholt 在過去五年的卓越成果。這樣做的好處多多,包含 OpenGL-加速的網頁與桌面,還能在視窗中執行某些3D應用程式,程式碼還瘦身一半呢。

Raspberry Pi 4 新周邊

接頭與 form-factor 修改勢必讓對應的周邊也要修改。我們也明白做出來也要有人想買才行:Mike 與 Austin 努力對經銷商與授權夥伴提供物美價廉的產品,如果有必要的話也會去找合適的替代方案。

Raspberry Pi 4 外殼

Gordon 與基金會的設計夥伴 Kinneir Dufort 以及製造商 T-Zero 開發了全新的兩件式外殼,售價5美金。

新玩具、新盒子

我們很喜歡這個新外殼啦,但如果您想要用同款的舊版外殼的話,只要把右側不合的地方切除少許,然後裝上側板就好了。

新的外殼

Raspberry Pi 4 電源供應

出乎意料,我們在把原型出給 alpha測試者進行測試時,很難找到便宜又高品質的 USB-C 電源與線材 (阿吉老師說:台灣要找這些配件超簡單~,請參考機器人王國商城)。所以我們與 Ktec 配合來開發一款合適的 5V/3A 電源供應器。售價 $8美金,並有 UK (type G)、European (type C)、North American (type A) 與 Australian (type I) 不同類型的插頭。

如果您想沿用 Raspberry Pi 3 原廠的電源供應器,請洽我們的經銷商有一個USB micro-B to USB-C 的轉接頭 ($1)。舊款電源供應器的線徑較粗,負載也不錯,當您的專案不需要用到 3安培的話,買這個轉接頭是不錯的方法。

Raspberry Pi 4 micro HDMI 線材

再次發現,要能支援 4Kp60 影片的 6Gbps 資料傳輸率的平價micro HDMI 線材,真的不好找。Amazon Basics cable 還不錯,但我們的零售商也有 1m 長度的線材,售價 $5美金。

官方 micro HDMI 對 HDMI 線材

新版 Raspberry Pi Beginner’s Guide

Raspberry Pi Press 在去年年底推出了 Official Raspberry Pi Beginner’s Guide. Gareth Halfacree 進一步更新內容來涵蓋 Raspberry Pi 4 的新功能與更新後的OS。

Little computer people

Raspberry Pi 4 Desktop Kit

我們把所有的東西都整理成一個完整的 Desktop Kit,售價$120美金,包含以下項目:

  • A 4GB Raspberry Pi 4
  • An official case
  • An official PSU
  • An official mouse and keyboard
  • A pair of HDMI cables
  • A copy of the updated Beginner’s Guide
  • A pre-installed 32GB microSD card
Raspberry Pi Desktop Kit

其餘更多內容關於 Pi Store 與 FAQ 請參考原文(不斷更新)

如何估算前方人物的距離?

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

我們都知道,組合兩台相機(stereo camera)可讓我們以模擬人眼的方式,在已知相機焦距以及兩台相機距離的情況下,透過視差來計算前方物體的距離。那麼… 單台的相機可以計算出前方物件的距離嗎?可以的,如果只想使用一台相機來計算距離,我們只要先知道該物體的實際大小(寬或高)以及相機的焦距,就能依據物體在相片上的尺寸(pixels),計算出該物體相距我們有多遠。

最早是在pyimagesearch.com看到這篇文章「Find distance from camera to object/marker using Python and OpenCV」(https://www.pyimagesearch.com/2015/01/19/find-distance-camera-objectmarker-using-python-opencv/),作者Adrian介紹如何利用計算相機焦距來反算出鏡頭中目標物體的距離,這勾起了我的興趣,我們是否能夠利用此種方式,很快的計算出前方陌生人距離我們有多遠呢?

什麼是焦距 Focal length

首先,瞭解一下相機焦距是什麼?它又是怎麼計算的?

維基百科的解釋是:

“焦距,也稱為焦長,是光學系統中衡量光的聚集或發散的度量方式,指從透鏡中心到光聚集之焦點的距離。”

如下圖,不同的凹透鏡與凸透鏡,因光的折射方向不同,其焦距f有不同的計算,但總而言之,從光線焦點到透鏡之間的距離就是焦距,如下方不同的透鏡有不同的焦距量測方法。

攝影愛好者通常擁有很多支鏡頭用來適應不同的攝影場景。除了光圈大小,這些攝影鏡頭最大的差異就是焦距上的不同。不同的鏡頭有不同的焦距,不同的焦距會使得相同大小的物體在感光元件上呈現不同的大小,焦距愈短的鏡頭,在相同的感光元件尺寸可容納更多眼前的物體,代表它的視野愈廣,反之,焦距愈長的鏡頭,能將遠處物體放得更大更適合特寫,這也就是所謂的望遠鏡頭,如下圖所示。

焦距範圍 <20mm 24 ~35mm 50mm 80~300mm >300mm
視野 超廣角 廣角 標準 望遠 超望遠

焦距的計算

為什麼要計算焦距?因為當攝影師確定要拍攝的場景或物體之後,心中會有個構圖希望在相片中它的比例是多大,再決定要使用何種焦距的鏡頭來滿足此構圖。例如,我們想要去機場拍攝747客機的特寫, 747-100型客機的長度為70.8公尺,全幅感光元件的長度為36mm,距離飛機跑道為500公尺,根據這些資訊我們就可以推算出鏡頭的焦距,然後選擇必要的鏡頭。

你知道這公式怎麼來的嗎?這是來自於一個國中數學的章節:相似三角形定理(triangle similarity),兩個相似三角形其邊長比例是相等的觀念。

距離的計算

反推,假設我們已經知道了相機的焦距,那麼,也能夠計算出物體與相機之間的距離了,只要把上述的公式左右兩邊稍微移動一下,然後把感測器大小替換為物體在影像上的pixels數目,就能計算出距離了。

從上面的公式得知,如果要計算影像中物件的距離,我們必須先知道:

  1. 鏡頭焦距
  2. 被攝物體的尺寸(長度或寬度)
  3. 影像中該物體的pixels數(長度或寬度)

實際計算說明

假設我們要量測下圖中膠水瓶的距離,該膠水瓶長度為11.5cm。

首先,如果我們不知道目前相機鏡頭的焦距,先如下計算取得焦距:

  1. 將該膠水瓶放置於離相機一定的距離,例如30cm。
  2. 拍攝一張相片計算膠水瓶在相片中的長度有多少pixels,假設為150 pixels。
  3. 於是計算出相機焦距為: 30cm x 150pixels / 11.5cm = 391.3mm。

把這數值記下來,以後就可以用在推算其它物體的距離了。

接下來,我們將膠水瓶放在如上圖中的位置,然後拍攝一張計算看它的距離為多遠。

1. 拍攝後發現該物體在相片中的長度為90pixels

2. 計算距離:391.3mm x 11.5cm / 90 pixels = 49.999 cm

故可透過拍攝的相片計算出該物體目前距離為49.999cm。

計算未知尺寸物件的距離

如果我們要透過影像大小來計算該物體的距離,依據上述公式我們必須知道該物體的實際尺寸才行,但在實際場合我們經常無法預先得知該物體的尺寸。例如,一台停在遠方的汽車,想要計算它距離我們有多遠但不知該汽車的實際長寬,要如何才能使用上述公式計算它距離我們多遠呢?我的想法是,可以透過該汽車上已知物件的尺寸來計算,例如,車子輪胎長度、車牌、車高等尺寸差異較小,我們可改為抓取計算該特定物件來估算出汽車的距離。

如何計算人物的距離

如果相片中是人呢?我們要怎麼估算出他距離有多遠?同樣的想法,首先尋找人類身上特定已知尺寸的物件,你覺得會是什麼?我所想到的是頭顱的寬度,人類無論高矮胖瘦種族,頭圍的尺寸(尤其是寬度)應該是每個人外觀差異最小的部份,例如下方的圖表(摘自維基百科:https://en.wikipedia.org/wiki/Human_head)。

誤差

男女的人臉不含耳朵的寬度介於12.5~15.9cm,中間值則介於13.3~14.5cm。假設我們採用13.9cm作為人臉的寬度平均,那麼,該平均值與最小及最大人臉的寬度差距分別為-1.4cm與+2.0cm。換句話說,假設我們使用13.9來作為每個人的人臉寬度,那麼,最差的情況是少估了1.4cm或多估了2.0cm。

假設我們是在最差情況下,少估了1.4cm或多估了2.0cm,那對於計算出的距離影響有多大呢?以女兒為例,她的臉寬約12.8cm,我用iPhone SE手機在距離她大約100cn處拍攝一張如下,計算出其焦距大約為:100cm * 814 pixels / 12.8cm = 3179.69:

接著再往前移動約一半距離再拍攝一張,此時可利用公式計算出該照片的距離為:

3179.69 x 12.8 / 944 = 43.11 cm

 

如果當初我將女兒的臉寬分別少估與多估了1.0cm,亦即11.8cm與13.8cm,那麼計算出的距離將分別由43.11cm變成39.75cm與46.48cm。

3179.69 x 11.8 / 944 = 39.75cm

3179.69 x 13.8 / 944 = 46.48cm

故得知在距離為43.11cm時,臉部1cm的誤差對於距離計算的影響大約正負3.36cm。

如果再看一次公式

會發現,距離愈遠將使得作為分母的臉寬影像pixels更小,造成誤差值會更大,例如下圖:

在距離更遠的情況下,假設將臉寬一樣分別少估與多估了1.0cm,那麼計算出的距離將分別為326.26cm與381.56cm,,影響範圍擴大至正負27.65cm。

3179.69 x 12.8 / 115 = 353.91cm

3179.69 x 11.8 / 115 = 326.26cm

3179.69 x 13.8 / 115 = 381.56cm

不過,正如先前所提到,人臉寬度男與女平均分別為14.5cm與13.3cm,假設我們使用13.9來作為每個人的人臉寬度,那麼,最差的情況就是少估了1.4cm或多估了2.0cm。如果真的希望能降低誤差,可考慮先辨識其性別後再使用該性別的平均臉寬,先針對臉部作align後再取得其實際pixels,應可減少距離的誤差。

實際測試

結論

在已知相機的焦距情況下,我們可以將臉孔寬度預設為13.9cm用以推算人物的大致距離,雖然最終其值無法很準確(距離為43.11cm時,臉部1cm的誤差對於距離計算的影響大約正負3.36cm),但用於大略的估計是可行的。如果需要準確的偵測距離,那我們必須先得知該人實際的臉孔寬度(或長度)才行,但這在實務應用上比較不可行。

另一替代方式,可利用人物身上明確已知尺寸大小的要的物作為替代人臉的量測標準,例如,已知該人物的身高、襯衫普遍的鈕釦直徑等。

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

 

[ 課程回顧 ]2019 國小畢業生限定-AIoT體驗營

$
0
0

 

平時在路上我們經常看到販售各式商品的販賣機,伴隨著科技的日新月異與人們的需求變化,販賣機也逐漸邁向科技化,這次的體驗營由我們帶著小朋友們一起製作自己獨一無二的自動販賣機,並且認識販賣機背後的操作原理,讓我們來看看他們是如何做出來的吧!

作者/攝影  Tina
課程時間 2019.6.24-6.28
課程講師  皇甫、豐智、俊廷、Tina
課程場地 CAVEDU教育團隊大本營

 

了解 BOSON 的功能後,老師讓大家任選一組輸入、輸出的功能來發揮創意設計出一種作品,運用樂高積木做出作品的外觀,其中一位小朋友使用「自鎖開關」和「高亮度LED」燈泡製作手電筒,將簡單的架構拼出並裝上 BOSON,最後用樂高將整體包覆起來,只露出操作的開關和提供光源的燈泡。

另一位小朋友則是使用「光源感測器」和「蜂鳴器」製作防盜保險箱,期間對於外觀製作和門軸的設計苦惱了一陣子,最後成功克服困難將成品製作完成!

有了對 BOSON 的基礎認識,我們就可以試著來做自己的販賣機了!

首先,想像一下自己的販賣機會長什麼樣子並畫出設計圖。

構思完設計之後,就開始動手製作囉~

這次使用長形的紙箱來當作販賣機的外殼,把按鈕和馬達安裝好,並割出最後拿取商品的取物口。

有了初步的外殼、按鈕與馬達之後,除了基礎的動能外,我們該如何製作更加完整的製作出自動販賣機呢?市售自動販賣機的交易流程為何?

皇甫老師安排了一些戶外觀摩行程,三創生活園區無人販賣機、松山機場智慧圖書館、無人咖啡廳CoCoCafe 7-11無人商店 X-Store找尋答案。

第一站,我們來到了三創生活園區,在商場內有一區放置了無人販賣機,乍看之下似乎是普通的販賣機,不過機台上沒有常見的投幣孔,取而代之的是悠遊卡感應、二維條碼掃描等付款方式,小朋友們細心觀察這些販賣機的交易流程,皇甫老師也提醒大家還可觀察機台的外觀設計以及商品運送方式,於是有人發現販賣機的取物口設置了防盜擋板,避免機台內的商品遭竊。

除了自動販賣機,臺灣也逐漸出現不同的無人商店,接著我們來到了松山機場,松山機場內也設了一間無人咖啡廳 CoCoCafe,客人們進入店內按照購買流程至販賣機購買飲料後,即可在一旁的座位休息,店內的一角甚至還有無人卡拉OK

CoCoCafe 的附近我們發現台北市立圖書館設立的松山機場智慧圖書館,雖然它並沒有販售實體商品,但只要憑藉悠遊卡即可進入,也能利用機器自行借還書,留給大家一個更舒服的閱覽空間。

位在捷運松山站的 Bingo Store 比起販賣機更有無人商店的實感,進入店面需要先掃描二維條碼開啟門鎖,挑選完商品後到結帳的機器按照指示完成交易,想出去店面的話要到門口的鏡頭前掃描大家可愛的臉龐,掃描成功後大門就會自動開啟啦!

講到無人商店不可不提的是接近捷運市政府站的 7-11 無人商店 X-Store,入口處設立了閘門,憑著icash卡片即可順利通過,也可以在旁邊的機器照一張美美的相片,以後就可以透過人臉辨識「刷臉」出入店面了!

透過實地訪查,小朋友們也開始漸漸地了解無人販賣機、無人咖啡廳、智慧圖書館與無人商店需具備的一些執行條件與需要克服的問題。

接下來我們再次回到教室,開始探討「如果自己經營一間無人商店,店內沒有店員,我們要如何辨識客人買了什麼商品呢?」這就輪到豐智老師為大家帶來精采的 AI 人工智慧課程啦!一開始打開 Teachable Machine 網頁後,透過電腦的攝影機拍照,將我們希望電腦能夠辨識的物品記錄下來,過程中要記得盡量讓物品填滿畫面並且拍到不同角度,要是沒做好的話,AI 可能就會不小心「學壞」,看著A物品告訴你這是B物品。

同學們都很喜歡魔術方塊,希望教電腦辨認不同的魔方,其中一位拿了顏色不同、形狀也不同的魔方,AI 幾乎都能夠成功辨識,另一位想要挑戰形狀相同、顏色也很接近的魔方,不過 AI 就會錯認兩者了。

除了自行拍照,我們也可以使用 Custom Vision AI 學習辨認圖片中的特定內容,只要上傳照片,並且將內容範圍框好,就可以開始訓練 AI 了!

這位同學想讓 AI 學會分辨不同的動物,外型和顏色差異比較大的熊貓和殺人鯨 AI 通常都能夠成功辨別。

這位同學依然想以魔方為主題,挑戰難度很高,可能需要多給一點素材來教 AI

了解無人商店和販賣機的模式後,就輪到小朋友們完成自己的無人販賣機,除了設計精美的外觀,內部的構造更是一點都不能馬虎,我們利用 LinkIt 7697 開發板搭配上馬達讓機器運轉,五顏六色的電線放在一起讓人頭昏腦脹的,好在有皇甫老師和俊廷老師的細心講解,大家都成功的將電線接好並讓馬達轉動。

我們使用 BlocklyDuino 編輯器,利用拖拉方塊的方式來寫出程式,因為需要網路連線至 MCS 雲端平台,所以在程式的一開始必須做好WiFi MCS 的連線設定,成功感應到悠遊卡後需要扣款,再來定好馬達的轉動速度及角度,讓商品可以成功的被推落,最後將程式燒錄至晶片內販賣機就大功告成了!

不過刷完卡我要怎麼知道自己花了多少錢呢?要是被盜刷或是多扣錢那就不妙了!所以我們進到 MCS 的網站設定只要卡片進行消費行為,就自動寄信到設定的電子信箱,讓消費者知道自己哪張卡片被偵測到扣錢,並且告知餘額還有多少。

讓我們來看看販賣機的購買流程吧!

全部都製作完畢後,我們要記得將門給關上,不然商品被偷走就事情大條啦!但是我們也需要在商品賣完的時候打開來補貨,那該怎麼辦呢?所以我們加裝上活動式的門栓,這樣有需要時就可以打開了!

來欣賞一下大家的成品吧!

每個人的販賣機都很有特色,想必會吸引許多顧客來買東西的!

NVIDIA Jetson Nano 8小時線上課程,完成可拿證書喔

$
0
0

有興趣的朋友請由此報名,需要註冊帳號、完成一個0元的購買之後,再由註冊的email 來開始上課。根據網站表示完成課程者可取得證書,一起來挑戰吧!

阿吉老師註:課程硬體購買連結都使用 Amazon,但機器人王國商城都幫大家測試過也準備好了,NVIDIA Jetson nano 大全套購買請按我。當然您還是可以在Amazon上面購買沒問題喔。

以下內容翻譯自報名網站


學習目標

透過NVIDIA Jetson Nano Developer Kit,maker、自學開發者以及嵌入式科技狂熱者已經能掌握AI所展現的強大威力了。這片易用且威力無窮的單板電腦可以同時直行多個神經網路,用途超廣!包括影像分類、物件偵測、物件分割與語音處理等等。本課程將在您個人的 Jetson nano 使用Jupyter iPython notebooks 來打造一個電腦視覺模型來完成深度學習影像識別專題。

您會學到的內容:

  • 設定 Jetson Nano 單板電腦與攝影機
  • 收集分類模型所需的影像資料
  • 標註用於迴歸模型的影像資料
  • 根據您的資料訓練神經網路並建立模型
  • 在Jetson Nano上使用您所建立的模型進行推論

完成本課程之後,您將有能力使用Jetson nano 完成一個深度學習分類與迴歸模型。

課程細節

基礎:對Python的基礎理解 (有很好,但並非必須)

要用到的軟硬體:PyTorch, Jetson Nano 單板電腦

證書:

考試方式:選擇題

需要的硬體

  • NVIDIA Jetson Nano Developer Kit
  • High-performance microSD card:至少32GB (購買)
  • 5V 4A 電源供應器,2.1mm 圓形接頭 (購買)
  • 2-pin jumper (買我們的套件包就送給您一個!):需安裝於 Jetson Nano 板子上才能用圓形接頭供電 (請參考這裡)
  • Logitech C270 USB Webcam,也可改用 Raspberry Pi Camera Module v2 (購買)
  • USB cable:Micro-B To Type-A 資料傳輸線 (購買)
  • 可上網的電腦,用於下載 img 檔並燒錄SD卡

更多資訊請參考:NVIDIA Deep Learning Institute.

Data Augmentation 資料增強

$
0
0
撰寫/攝影 CH.Tseng
部落格 https://chtseng.wordpress.com/
Facebook https://www.facebook.com/chenghsun.tseng
 在進行深度學習訓練時,我們經常需要海量的資料以確保訓練時不會產生過度擬合(over-fitting)的現象,然而在現今數位時代,資料可是驅使AI引擎全力運轉的新石油,每家公司莫不紛求資料若渴,導致大部份有價值的資料都掌握在資金雄厚公司或位於相關領域的企業,個人開發者或普通公司很難擁有或者搜集完整需要的資料。因此,一般我們會採取如下的作法,以補足資料不足而導致的over-fitting問題:
  1. Review並重新組合或調整model架構。
  2. 將資料進行正規化,如L1/L2 regularization。
  3. 使用dropout技術。
  4. 使用Data augmentation(資料增強)技術。

dropout技術在之前已介紹並實際應用過,在此所要介紹的是Data augmentation。不同於Dropout透過丟棄一定比例的神經元以模擬不同的dataset,Data augmentation則是從既有的dataset中產生出更多的資料讓系統去學習,說坦白一點,是創造更多的「假」資料,來彌補我們資料不足的缺憾。

雖然是假的資料,但也是從原始資料內容修改產生的,因此Data augmentation經過證實的確可解決資料不足的困境並提昇系統訓練的準確率哦!我們來看看要怎麼使用它。

Data augmentation原理

一張圖片經過旋轉、調整大小、比例尺寸,或者改變亮度色溫、翻轉等處理後,我們人眼仍能辨識出來是相同的相片,但是對機器來說那可是完全不同的新圖像了,因此, Data augmentation就是將dataset中既有的圖片予以修改變形,以創造出更多的圖片來讓機器學習,彌補資料量不足的困擾。

Keras透過ImageDataGenerator class提供Data augmentation相關的功能,如:

  1. 資料的正規化normalization:可針對Sample-wise(每次取樣的sample batch)或Feature-wise(整體的dataset)
  2. 資料白化(Whitening)處理:提供ZCA Whitening處理。(Whitening是一種將資料去冗餘的技術)
  3. 影像處理:翻轉、旋轉、切裁、放大縮小、偏移…等。

更詳細的參數使用請參考https://keras.io/preprocessing/image/

如何使用Data augmentation

在Keras使用Data augmentation的流程是:

1.載入class:

from keras.preprocessing.image import ImageDataGenerator

2.初始化ImageDataGenerator物件,並定義其參數:

datagen = ImageDataGenerator(

    zca_whitening=False,

    rotation_range=40,

    width_shift_range=0.2,

    height_shift_range=0.2,

    shear_range=0.2,

    zoom_range=0.2,

    horizontal_flip=True,

    fill_mode=’nearest’)

3.產生不同的圖形,以下分成兩種狀況來說明:

A)想要產生圖形檔到disk:

  • 例如要從某張相片產生10張檔名開頭為cat的jpg圖片,並儲存到目錄preview中:
img = cv2.imread(“test1.jpg”)

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

#格式必須為:(sample數, channels, height, width)

img = img.reshape((1,) + img.shape)

for batch in datagen.flow(img, batch_size=10,

save_to_dir=’preview’, save_prefix=’cat’, save_format=’jpeg’)

B)想要在訓練時邊產生圖形:

這又分兩種情況,一種是dataset已載入memory,另一種是dataset放在某實體目錄中尚未讀入。

  1. dataset已載入memory:
datagen.fit(trainData)

train_history = model.fit_generator(train_datagen.flow(trainData,  

      trainLabels_hot, batch_size=64),

      steps_per_epoch=round(len(trainData)/64),

            epochs=50, validation_data=(valiData, valiLabels_hot))
  1. dataset位在data/train目錄下:
trainData = train_datagen.flow_from_directory(

        “data/train”,

        target_size=(150, 150),  #可以在此指定要rescale的尺寸

        batch_size=64,

        class_mode=’binary’)

model.fit_generator(

        trainData,

        steps_per_epoch= round(len(trainData)/64),

        epochs=50,

validation_data=(valiData, valiLabels_hot) )

Data augmentation的效果

下方範例為讀入一張圖片,然後透過Data augmentation來產生不同的圖片為例,您可以同步開啟https://github.com/ch-tseng/data-augmentation-Keras/blob/master/DataAugmentation-1.ipynb 來檢視其效果

  1. 載入相關class及module
import cv2

from matplotlib import pyplot as plt

%matplotlib inline

from pylab import rcParams

rcParams[‘figure.figsize’] = 15, 15

from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img

  1. 指定一張相片
imgForTest = “../test1.jpg"

  1. 讀入指定相片:

使用opencv讀入圖片,由於opencv預設格式為BGR,因此需用cvtColor轉為RGB格式。

img = cv2.imread(imgForTest)

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

  1. 顯示圖片及其資料維度:

由於我們是load單張圖片而非array,因此需要修改其dimention,在前方加入ID項次。

plt.imshow(img)

print(img.shape)

img = img.reshape((1,) + img.shape)

print(img.shape)

  1. 定義相關參數:

您可以看到下方的ImageDataGenerator參數值有rotation、shift、shear、flip、zoom、fill_mode…等,從字義上即可瞭解其圖形效果,相關詳細參數說明請參考:https://keras.io/preprocessing/image/

datagen = ImageDataGenerator(    

    rotation_range=40,

    width_shift_range=0.2,

    height_shift_range=0.2,

    shear_range=0.2,

    zoom_range=0.2,

    horizontal_flip=True,

    fill_mode=’nearest’)

  1. 經由augmentation產生各種圖形:

datagen.flow會依據指定參數產生各式圖形,您可以輸入一個圖形陣列或本範例一樣的單張圖片。


        在進行深度學習訓練時,我們經常需要海量的資料以確保訓練時不會產生過度擬合(over-fitting)的現象,然而在現今數位時代,資料可是驅使AI引擎全力運轉的新石油,每家公司莫不紛求資料若渴,導致大部份有價值的資料都掌握在資金雄厚公司或位於相關領域的企業,個人開發者或普通公司很難擁有或者搜集完整需要的資料。因此,一般我們會採取如下的作法,以補足資料不足而導致的over-fitting問題:
Review並重新組合或調整model架構。
將資料進行正規化,如L1/L2 regularization。
使用dropout技術。
使用Data augmentation(資料增強)技術。
dropout技術在之前已介紹並實際應用過,在此所要介紹的是Data augmentation。不同於Dropout透過丟棄一定比例的神經元以模擬不同的dataset,Data augmentation則是從既有的dataset中產生出更多的資料讓系統去學習,說坦白一點,是創造更多的「假」資料,來彌補我們資料不足的缺憾。

        雖然是假的資料,但也是從原始資料內容修改產生的,因此Data augmentation經過證實的確可解決資料不足的困境並提昇系統訓練的準確率哦!我們來看看要怎麼使用它。

Data augmentation原理

一張圖片經過旋轉、調整大小、比例尺寸,或者改變亮度色溫、翻轉等處理後,我們人眼仍能辨識出來是相同的相片,但是對機器來說那可是完全不同的新圖像了,因此, Data augmentation就是將dataset中既有的圖片予以修改變形,以創造出更多的圖片來讓機器學習,彌補資料量不足的困擾。

        Keras透過ImageDataGenerator class提供Data augmentation相關的功能,如:

資料的正規化normalization:可針對Sample-wise(每次取樣的sample batch)或Feature-wise(整體的dataset)
資料白化(Whitening)處理:提供ZCA Whitening處理。(Whitening是一種將資料去冗餘的技術)
影像處理:翻轉、旋轉、切裁、放大縮小、偏移…等。
更詳細的參數使用請參考https://keras.io/preprocessing/image/。

如何使用Data augmentation
        在Keras使用Data augmentation的流程是:

載入class:
from keras.preprocessing.image import ImageDataGenerator

初始化ImageDataGenerator物件,並定義其參數:
datagen = ImageDataGenerator(

    zca_whitening=False,

    rotation_range=40,

    width_shift_range=0.2,

    height_shift_range=0.2,

    shear_range=0.2,

    zoom_range=0.2,

    horizontal_flip=True,

    fill_mode=’nearest’)

產生不同的圖形,以下分成兩種狀況來說明:
A)想要產生圖形檔到disk:

例如要從某張相片產生10張檔名開頭為cat的jpg圖片,並儲存到目錄preview中:
img = cv2.imread(“test1.jpg”)

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

#格式必須為:(sample數, channels, height, width)

img = img.reshape((1,) + img.shape)

for batch in datagen.flow(img, batch_size=10,

save_to_dir=’preview’, save_prefix=’cat’, save_format=’jpeg’)

                B)想要在訓練時邊產生圖形:

這又分兩種情況,一種是dataset已載入memory,另一種是dataset放在某實體目錄中尚未讀入。

dataset已載入memory:
datagen.fit(trainData)

train_history = model.fit_generator(train_datagen.flow(trainData,  

      trainLabels_hot, batch_size=64),

      steps_per_epoch=round(len(trainData)/64),

            epochs=50, validation_data=(valiData, valiLabels_hot))

dataset位在data/train目錄下:
trainData = train_datagen.flow_from_directory(

        “data/train”,

        target_size=(150, 150),  #可以在此指定要rescale的尺寸

        batch_size=64,

        class_mode=’binary’)

model.fit_generator(

        trainData,

        steps_per_epoch= round(len(trainData)/64),

        epochs=50,

validation_data=(valiData, valiLabels_hot) )

Data augmentation的效果
下方範例為讀入一張圖片,然後透過Data augmentation來產生不同的圖片為例,您可以同步開啟https://github.com/ch-tseng/data-augmentation-Keras/blob/master/DataAugmentation-1.ipynb 來檢視其效果

載入相關class及module
import cv2

from matplotlib import pyplot as plt

%matplotlib inline

from pylab import rcParams

rcParams[‘figure.figsize’] = 15, 15

from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp.png

指定一張相片
imgForTest = “../test1.jpg"

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp0.png

讀入指定相片:
使用opencv讀入圖片,由於opencv預設格式為BGR,因此需用cvtColor轉為RGB格式。

img = cv2.imread(imgForTest)

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp3.png

顯示圖片及其資料維度:
由於我們是load單張圖片而非array,因此需要修改其dimention,在前方加入ID項次。

plt.imshow(img)

print(img.shape)

img = img.reshape((1,) + img.shape)

print(img.shape)

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp7.png

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp8.png

定義相關參數:
您可以看到下方的ImageDataGenerator參數值有rotation、shift、shear、flip、zoom、fill_mode…等,從字義上即可瞭解其圖形效果,相關詳細參數說明請參考:https://keras.io/preprocessing/image/

datagen = ImageDataGenerator(    

    rotation_range=40,

    width_shift_range=0.2,

    height_shift_range=0.2,

    shear_range=0.2,

    zoom_range=0.2,

    horizontal_flip=True,

    fill_mode=’nearest’)

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp9.png

經由augmentation產生各種圖形:
datagen.flow會依據指定參數產生各式圖形,您可以輸入一個圖形陣列或本範例一樣的單張圖片。

i = 0

for batch in datagen.flow(img, batch_size=10,

          save_to_dir=’small-2000/preview’, save_prefix=’cat’, save_format=’jpeg’):

    plt.subplot(5,4,1 + i)

    plt.axis(“off")

   

    augImage = batch[0]

    augImage = augImage.astype(‘float32’)

    augImage /= 255

    plt.imshow(augImage)

   

    i += 1

    if i > 19:

        break

        在進行深度學習訓練時,我們經常需要海量的資料以確保訓練時不會產生過度擬合(over-fitting)的現象,然而在現今數位時代,資料可是驅使AI引擎全力運轉的新石油,每家公司莫不紛求資料若渴,導致大部份有價值的資料都掌握在資金雄厚公司或位於相關領域的企業,個人開發者或普通公司很難擁有或者搜集完整需要的資料。因此,一般我們會採取如下的作法,以補足資料不足而導致的over-fitting問題:
  1. Review並重新組合或調整model架構。
  2. 將資料進行正規化,如L1/L2 regularization。
  3. 使用dropout技術。
  4. 使用Data augmentation(資料增強)技術。

dropout技術在之前已介紹並實際應用過,在此所要介紹的是Data augmentation。不同於Dropout透過丟棄一定比例的神經元以模擬不同的dataset,Data augmentation則是從既有的dataset中產生出更多的資料讓系統去學習,說坦白一點,是創造更多的「假」資料,來彌補我們資料不足的缺憾。

雖然是假的資料,但也是從原始資料內容修改產生的,因此Data augmentation經過證實的確可解決資料不足的困境並提昇系統訓練的準確率哦!我們來看看要怎麼使用它。

Data augmentation原理

一張圖片經過旋轉、調整大小、比例尺寸,或者改變亮度色溫、翻轉等處理後,我們人眼仍能辨識出來是相同的相片,但是對機器來說那可是完全不同的新圖像了,因此, Data augmentation就是將dataset中既有的圖片予以修改變形,以創造出更多的圖片來讓機器學習,彌補資料量不足的困擾。

Keras透過ImageDataGenerator class提供Data augmentation相關的功能,如:

  1. 資料的正規化normalization:可針對Sample-wise(每次取樣的sample batch)或Feature-wise(整體的dataset)
  2. 資料白化(Whitening)處理:提供ZCA Whitening處理。(Whitening是一種將資料去冗餘的技術)
  3. 影像處理:翻轉、旋轉、切裁、放大縮小、偏移…等。

更詳細的參數使用請參考https://keras.io/preprocessing/image/

如何使用Data augmentation

在Keras使用Data augmentation的流程是:

  1. 載入class:

from keras.preprocessing.image import ImageDataGenerator

  1. 初始化ImageDataGenerator物件,並定義其參數:

datagen = ImageDataGenerator(

zca_whitening=False,

rotation_range=40,

width_shift_range=0.2,

height_shift_range=0.2,

shear_range=0.2,

zoom_range=0.2,

horizontal_flip=True,

fill_mode=’nearest’)

  1. 產生不同的圖形,以下分成兩種狀況來說明:

A)想要產生圖形檔到disk:

  • 例如要從某張相片產生10張檔名開頭為cat的jpg圖片,並儲存到目錄preview中:

img = cv2.imread(“test1.jpg”)

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

#格式必須為:(sample數, channels, height, width)

img = img.reshape((1,) + img.shape)

for batch in datagen.flow(img, batch_size=10,

save_to_dir=’preview’, save_prefix=’cat’, save_format=’jpeg’)

B)想要在訓練時邊產生圖形:

這又分兩種情況,一種是dataset已載入memory,另一種是dataset放在某實體目錄中尚未讀入。

  1. dataset已載入memory:

datagen.fit(trainData)

train_history = model.fit_generator(train_datagen.flow(trainData,

trainLabels_hot, batch_size=64),

steps_per_epoch=round(len(trainData)/64),

epochs=50, validation_data=(valiData, valiLabels_hot))

  1. dataset位在data/train目錄下:

trainData = train_datagen.flow_from_directory(

“data/train”,

target_size=(150, 150),  #可以在此指定要rescale的尺寸

batch_size=64,

class_mode=’binary’)

model.fit_generator(

trainData,

steps_per_epoch= round(len(trainData)/64),

epochs=50,

validation_data=(valiData, valiLabels_hot) )

Data augmentation的效果

下方範例為讀入一張圖片,然後透過Data augmentation來產生不同的圖片為例,您可以同步開啟https://github.com/ch-tseng/data-augmentation-Keras/blob/master/DataAugmentation-1.ipynb 來檢視其效果

  1. 載入相關class及module

import cv2

from matplotlib import pyplot as plt

%matplotlib inline

from pylab import rcParams

rcParams[‘figure.figsize’] = 15, 15

from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp.png

  1. 指定一張相片

imgForTest = “../test1.jpg”

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp0.png

  1. 讀入指定相片:

使用opencv讀入圖片,由於opencv預設格式為BGR,因此需用cvtColor轉為RGB格式。

img = cv2.imread(imgForTest)

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp3.png

  1. 顯示圖片及其資料維度:

由於我們是load單張圖片而非array,因此需要修改其dimention,在前方加入ID項次。

plt.imshow(img)

print(img.shape)

img = img.reshape((1,) + img.shape)

print(img.shape)

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp7.png

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp8.png

  1. 定義相關參數:

您可以看到下方的ImageDataGenerator參數值有rotation、shift、shear、flip、zoom、fill_mode…等,從字義上即可瞭解其圖形效果,相關詳細參數說明請參考:https://keras.io/preprocessing/image/

datagen = ImageDataGenerator(

rotation_range=40,

width_shift_range=0.2,

height_shift_range=0.2,

shear_range=0.2,

zoom_range=0.2,

horizontal_flip=True,

fill_mode=’nearest’)

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp9.png

  1. 經由augmentation產生各種圖形:

datagen.flow會依據指定參數產生各式圖形,您可以輸入一個圖形陣列或本範例一樣的單張圖片。

i = 0

for batch in datagen.flow(img, batch_size=10,

save_to_dir=’small-2000/preview’, save_prefix=’cat’, save_format=’jpeg’):

plt.subplot(5,4,1 + i)

plt.axis(“off”)

 

augImage = batch[0]

augImage = augImage.astype(‘float32’)

augImage /= 255

plt.imshow(augImage)

 

i += 1

if i > 19:

break

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp10.png

同樣的,一張小狗的照片可以產生這麼多的新圖片:https://github.com/ch-tseng/data-augmentation-Keras/blob/master/dogcat-augmentation.ipynb

model.fit與model.fit_generator

注意在使用Data augmentation時,進行訓練所使用的model.fit須改為model.fit_generator才讓系統on-fly的產生新圖像提供訓練使用。model.fit與model.fit_generator這兩個指令都是for相同的訓練用途,但使用時機大有不同:

  1. model.fit 適用於Dataset已ready,不需再進行任何預處理可直接使用。
  2. model.fit_generator 適用於Dataset尚未ready,需要在每批次訓練先進行預處理(或產生)。

由於model.fit_generator在每批次訓練前才on demand或on-the-fly處理或產生data,因此能比較有效率的應用在一些硬體資源不太足夠的機器上(例如RAM僅有8G然而dataset卻有1TB的情況),model.fit_generator可避免load整個dataset,只需要在每批次訓練前on-demand產生需要數量的data。

那麼,我們要如何定義要經由Data augmentation產生多少資料呢?最簡單的方式是透過參數samples_per_epoch,該參數定義每次epoch要產生多少sample data(亦即系統在每個epoch所能看到的資料數量)。在下方的例子中,我們設定為training dataset的2倍數量。


        在進行深度學習訓練時,我們經常需要海量的資料以確保訓練時不會產生過度擬合(over-fitting)的現象,然而在現今數位時代,資料可是驅使AI引擎全力運轉的新石油,每家公司莫不紛求資料若渴,導致大部份有價值的資料都掌握在資金雄厚公司或位於相關領域的企業,個人開發者或普通公司很難擁有或者搜集完整需要的資料。因此,一般我們會採取如下的作法,以補足資料不足而導致的over-fitting問題:
Review並重新組合或調整model架構。
將資料進行正規化,如L1/L2 regularization。
使用dropout技術。
使用Data augmentation(資料增強)技術。
dropout技術在之前已介紹並實際應用過,在此所要介紹的是Data augmentation。不同於Dropout透過丟棄一定比例的神經元以模擬不同的dataset,Data augmentation則是從既有的dataset中產生出更多的資料讓系統去學習,說坦白一點,是創造更多的「假」資料,來彌補我們資料不足的缺憾。

        雖然是假的資料,但也是從原始資料內容修改產生的,因此Data augmentation經過證實的確可解決資料不足的困境並提昇系統訓練的準確率哦!我們來看看要怎麼使用它。

Data augmentation原理

一張圖片經過旋轉、調整大小、比例尺寸,或者改變亮度色溫、翻轉等處理後,我們人眼仍能辨識出來是相同的相片,但是對機器來說那可是完全不同的新圖像了,因此, Data augmentation就是將dataset中既有的圖片予以修改變形,以創造出更多的圖片來讓機器學習,彌補資料量不足的困擾。

        Keras透過ImageDataGenerator class提供Data augmentation相關的功能,如:

資料的正規化normalization:可針對Sample-wise(每次取樣的sample batch)或Feature-wise(整體的dataset)
資料白化(Whitening)處理:提供ZCA Whitening處理。(Whitening是一種將資料去冗餘的技術)
影像處理:翻轉、旋轉、切裁、放大縮小、偏移…等。
更詳細的參數使用請參考https://keras.io/preprocessing/image/。

如何使用Data augmentation
        在Keras使用Data augmentation的流程是:

載入class:
from keras.preprocessing.image import ImageDataGenerator

初始化ImageDataGenerator物件,並定義其參數:
datagen = ImageDataGenerator(

    zca_whitening=False,

    rotation_range=40,

    width_shift_range=0.2,

    height_shift_range=0.2,

    shear_range=0.2,

    zoom_range=0.2,

    horizontal_flip=True,

    fill_mode=’nearest’)

產生不同的圖形,以下分成兩種狀況來說明:
A)想要產生圖形檔到disk:

例如要從某張相片產生10張檔名開頭為cat的jpg圖片,並儲存到目錄preview中:
img = cv2.imread(“test1.jpg”)

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

#格式必須為:(sample數, channels, height, width)

img = img.reshape((1,) + img.shape)

for batch in datagen.flow(img, batch_size=10,

save_to_dir=’preview’, save_prefix=’cat’, save_format=’jpeg’)

                B)想要在訓練時邊產生圖形:

這又分兩種情況,一種是dataset已載入memory,另一種是dataset放在某實體目錄中尚未讀入。

dataset已載入memory:
datagen.fit(trainData)

train_history = model.fit_generator(train_datagen.flow(trainData,  

      trainLabels_hot, batch_size=64),

      steps_per_epoch=round(len(trainData)/64),

            epochs=50, validation_data=(valiData, valiLabels_hot))

dataset位在data/train目錄下:
trainData = train_datagen.flow_from_directory(

        “data/train”,

        target_size=(150, 150),  #可以在此指定要rescale的尺寸

        batch_size=64,

        class_mode=’binary’)

model.fit_generator(

        trainData,

        steps_per_epoch= round(len(trainData)/64),

        epochs=50,

validation_data=(valiData, valiLabels_hot) )

Data augmentation的效果
下方範例為讀入一張圖片,然後透過Data augmentation來產生不同的圖片為例,您可以同步開啟https://github.com/ch-tseng/data-augmentation-Keras/blob/master/DataAugmentation-1.ipynb 來檢視其效果

載入相關class及module
import cv2

from matplotlib import pyplot as plt

%matplotlib inline

from pylab import rcParams

rcParams[‘figure.figsize’] = 15, 15

from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp.png

指定一張相片
imgForTest = “../test1.jpg"

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp0.png

讀入指定相片:
使用opencv讀入圖片,由於opencv預設格式為BGR,因此需用cvtColor轉為RGB格式。

img = cv2.imread(imgForTest)

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp3.png

顯示圖片及其資料維度:
由於我們是load單張圖片而非array,因此需要修改其dimention,在前方加入ID項次。

plt.imshow(img)

print(img.shape)

img = img.reshape((1,) + img.shape)

print(img.shape)

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp7.png

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp8.png

定義相關參數:
您可以看到下方的ImageDataGenerator參數值有rotation、shift、shear、flip、zoom、fill_mode…等,從字義上即可瞭解其圖形效果,相關詳細參數說明請參考:https://keras.io/preprocessing/image/

datagen = ImageDataGenerator(    

    rotation_range=40,

    width_shift_range=0.2,

    height_shift_range=0.2,

    shear_range=0.2,

    zoom_range=0.2,

    horizontal_flip=True,

    fill_mode=’nearest’)

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp9.png

經由augmentation產生各種圖形:
datagen.flow會依據指定參數產生各式圖形,您可以輸入一個圖形陣列或本範例一樣的單張圖片。

i = 0

for batch in datagen.flow(img, batch_size=10,

          save_to_dir=’small-2000/preview’, save_prefix=’cat’, save_format=’jpeg’):

    plt.subplot(5,4,1 + i)

    plt.axis(“off")

   

    augImage = batch[0]

    augImage = augImage.astype(‘float32’)

    augImage /= 255

    plt.imshow(augImage)

   

    i += 1

    if i > 19:

        break

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp10.png



同樣的,一張小狗的照片可以產生這麼多的新圖片:https://github.com/ch-tseng/data-augmentation-Keras/blob/master/dogcat-augmentation.ipynb



model.fit與model.fit_generator
        注意在使用Data augmentation時,進行訓練所使用的model.fit須改為model.fit_generator才讓系統on-fly的產生新圖像提供訓練使用。model.fit與model.fit_generator這兩個指令都是for相同的訓練用途,但使用時機大有不同:

model.fit 適用於Dataset已ready,不需再進行任何預處理可直接使用。
model.fit_generator 適用於Dataset尚未ready,需要在每批次訓練先進行預處理(或產生)。
由於model.fit_generator在每批次訓練前才on demand或on-the-fly處理或產生data,因此能比較有效率的應用在一些硬體資源不太足夠的機器上(例如RAM僅有8G然而dataset卻有1TB的情況),model.fit_generator可避免load整個dataset,只需要在每批次訓練前on-demand產生需要數量的data。

那麼,我們要如何定義要經由Data augmentation產生多少資料呢?最簡單的方式是透過參數samples_per_epoch,該參數定義每次epoch要產生多少sample data(亦即系統在每個epoch所能看到的資料數量)。在下方的例子中,我們設定為training dataset的2倍數量。

epochs = 15

batch_size = 32

train_history = model.fit_generator(

train_datagen.flow(trainData_normalize, trainLabels_hot, batch_size=batch_size),

samples_per_epoch=(len(trainData)*2), nb_epoch=epochs,

validation_data=(valiData_normalize, valiLabels_hot))

如此一來,如果我們的dataset只有1,000張,但透過augmentation實際上訓練的數量可擴增到2,000張,是不是很方便呢?

我們也可以用另一種方式,不先給予total的training數目而是指定每個epoch要分成幾個batch來run(參數steps_per_epoch),以及每次batch所要提取的sample數目為多少?(參數batch size),因此,一個epoch所train的dataset數目就是steps_per_epoch乘上batch_size。下面的例子同樣每epoch會run 2倍於目前的dataset數量。(注意:nb_epoch 參數自Keras 2.0開始已被epoch參數取代)

        epochs = 50

batch_size = 32

steps_per_epoch=int((len(trainData)*2)/batch_size)

train_history = model.fit_generator(

train_datagen.flow(trainData_normalize, trainLabels_hot, atch_size=batch_size),

steps_per_epoch=steps_per_epoch, epochs=epochs,

validation_data=(valiData_normalize, valiLabels_hot))

實際應用

接下來我以之前作過的「使用CNN 識別辦公區狀態」為例子,該dataset的資訊如下:

  • 格式:jpeg,224×224 pixels
  • 相片日期:2017/04~2017/09
  • 分類:共有17種categories,每個category有70張相片,共1,190張。

每張圖片依如下分為四個區域並給予label:由左上角本人座位開始順時間方向,1代表有人,0代表無人,亦即該區只要有人出現該區便視為1,因此,下面的兩張圖皆會被label為1-1-0-1。

若剛好有人橫跨兩個區域,則視其在那一區域佔的比例較多來決定,例如:

        在進行深度學習訓練時,我們經常需要海量的資料以確保訓練時不會產生過度擬合(over-fitting)的現象,然而在現今數位時代,資料可是驅使AI引擎全力運轉的新石油,每家公司莫不紛求資料若渴,導致大部份有價值的資料都掌握在資金雄厚公司或位於相關領域的企業,個人開發者或普通公司很難擁有或者搜集完整需要的資料。因此,一般我們會採取如下的作法,以補足資料不足而導致的over-fitting問題:
  1. Review並重新組合或調整model架構。
  2. 將資料進行正規化,如L1/L2 regularization。
  3. 使用dropout技術。
  4. 使用Data augmentation(資料增強)技術。

dropout技術在之前已介紹並實際應用過,在此所要介紹的是Data augmentation。不同於Dropout透過丟棄一定比例的神經元以模擬不同的dataset,Data augmentation則是從既有的dataset中產生出更多的資料讓系統去學習,說坦白一點,是創造更多的「假」資料,來彌補我們資料不足的缺憾。

雖然是假的資料,但也是從原始資料內容修改產生的,因此Data augmentation經過證實的確可解決資料不足的困境並提昇系統訓練的準確率哦!我們來看看要怎麼使用它。

Data augmentation原理

一張圖片經過旋轉、調整大小、比例尺寸,或者改變亮度色溫、翻轉等處理後,我們人眼仍能辨識出來是相同的相片,但是對機器來說那可是完全不同的新圖像了,因此, Data augmentation就是將dataset中既有的圖片予以修改變形,以創造出更多的圖片來讓機器學習,彌補資料量不足的困擾。

Keras透過ImageDataGenerator class提供Data augmentation相關的功能,如:

  1. 資料的正規化normalization:可針對Sample-wise(每次取樣的sample batch)或Feature-wise(整體的dataset)
  2. 資料白化(Whitening)處理:提供ZCA Whitening處理。(Whitening是一種將資料去冗餘的技術)
  3. 影像處理:翻轉、旋轉、切裁、放大縮小、偏移…等。

更詳細的參數使用請參考https://keras.io/preprocessing/image/

如何使用Data augmentation

在Keras使用Data augmentation的流程是:

  1. 載入class:

from keras.preprocessing.image import ImageDataGenerator

  1. 初始化ImageDataGenerator物件,並定義其參數:

datagen = ImageDataGenerator(

zca_whitening=False,

rotation_range=40,

width_shift_range=0.2,

height_shift_range=0.2,

shear_range=0.2,

zoom_range=0.2,

horizontal_flip=True,

fill_mode=’nearest’)

  1. 產生不同的圖形,以下分成兩種狀況來說明:

A)想要產生圖形檔到disk:

  • 例如要從某張相片產生10張檔名開頭為cat的jpg圖片,並儲存到目錄preview中:

img = cv2.imread(“test1.jpg”)

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

#格式必須為:(sample數, channels, height, width)

img = img.reshape((1,) + img.shape)

for batch in datagen.flow(img, batch_size=10,

save_to_dir=’preview’, save_prefix=’cat’, save_format=’jpeg’)

B)想要在訓練時邊產生圖形:

這又分兩種情況,一種是dataset已載入memory,另一種是dataset放在某實體目錄中尚未讀入。

  1. dataset已載入memory:

datagen.fit(trainData)

train_history = model.fit_generator(train_datagen.flow(trainData,

trainLabels_hot, batch_size=64),

steps_per_epoch=round(len(trainData)/64),

epochs=50, validation_data=(valiData, valiLabels_hot))

  1. dataset位在data/train目錄下:

trainData = train_datagen.flow_from_directory(

“data/train”,

target_size=(150, 150),  #可以在此指定要rescale的尺寸

batch_size=64,

class_mode=’binary’)

model.fit_generator(

trainData,

steps_per_epoch= round(len(trainData)/64),

epochs=50,

validation_data=(valiData, valiLabels_hot) )

Data augmentation的效果

下方範例為讀入一張圖片,然後透過Data augmentation來產生不同的圖片為例,您可以同步開啟https://github.com/ch-tseng/data-augmentation-Keras/blob/master/DataAugmentation-1.ipynb 來檢視其效果

  1. 載入相關class及module

import cv2

from matplotlib import pyplot as plt

%matplotlib inline

from pylab import rcParams

rcParams[‘figure.figsize’] = 15, 15

from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp.png

  1. 指定一張相片

imgForTest = “../test1.jpg”

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp0.png

  1. 讀入指定相片:

使用opencv讀入圖片,由於opencv預設格式為BGR,因此需用cvtColor轉為RGB格式。

img = cv2.imread(imgForTest)

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp3.png

  1. 顯示圖片及其資料維度:

由於我們是load單張圖片而非array,因此需要修改其dimention,在前方加入ID項次。

plt.imshow(img)

print(img.shape)

img = img.reshape((1,) + img.shape)

print(img.shape)

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp7.png

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp8.png

  1. 定義相關參數:

您可以看到下方的ImageDataGenerator參數值有rotation、shift、shear、flip、zoom、fill_mode…等,從字義上即可瞭解其圖形效果,相關詳細參數說明請參考:https://keras.io/preprocessing/image/

datagen = ImageDataGenerator(

rotation_range=40,

width_shift_range=0.2,

height_shift_range=0.2,

shear_range=0.2,

zoom_range=0.2,

horizontal_flip=True,

fill_mode=’nearest’)

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp9.png

  1. 經由augmentation產生各種圖形:

datagen.flow會依據指定參數產生各式圖形,您可以輸入一個圖形陣列或本範例一樣的單張圖片。

i = 0

for batch in datagen.flow(img, batch_size=10,

save_to_dir=’small-2000/preview’, save_prefix=’cat’, save_format=’jpeg’):

plt.subplot(5,4,1 + i)

plt.axis(“off”)

 

augImage = batch[0]

augImage = augImage.astype(‘float32’)

augImage /= 255

plt.imshow(augImage)

 

i += 1

if i > 19:

break

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp10.png

同樣的,一張小狗的照片可以產生這麼多的新圖片:https://github.com/ch-tseng/data-augmentation-Keras/blob/master/dogcat-augmentation.ipynb

model.fit與model.fit_generator

注意在使用Data augmentation時,進行訓練所使用的model.fit須改為model.fit_generator才讓系統on-fly的產生新圖像提供訓練使用。model.fit與model.fit_generator這兩個指令都是for相同的訓練用途,但使用時機大有不同:

  1. model.fit 適用於Dataset已ready,不需再進行任何預處理可直接使用。
  2. model.fit_generator 適用於Dataset尚未ready,需要在每批次訓練先進行預處理(或產生)。

由於model.fit_generator在每批次訓練前才on demand或on-the-fly處理或產生data,因此能比較有效率的應用在一些硬體資源不太足夠的機器上(例如RAM僅有8G然而dataset卻有1TB的情況),model.fit_generator可避免load整個dataset,只需要在每批次訓練前on-demand產生需要數量的data。

那麼,我們要如何定義要經由Data augmentation產生多少資料呢?最簡單的方式是透過參數samples_per_epoch,該參數定義每次epoch要產生多少sample data(亦即系統在每個epoch所能看到的資料數量)。在下方的例子中,我們設定為training dataset的2倍數量。

epochs = 15

batch_size = 32

train_history = model.fit_generator(

train_datagen.flow(trainData_normalize, trainLabels_hot, batch_size=batch_size),

samples_per_epoch=(len(trainData)*2), nb_epoch=epochs,

validation_data=(valiData_normalize, valiLabels_hot))

如此一來,如果我們的dataset只有1,000張,但透過augmentation實際上訓練的數量可擴增到2,000張,是不是很方便呢?

我們也可以用另一種方式,不先給予total的training數目而是指定每個epoch要分成幾個batch來run(參數steps_per_epoch),以及每次batch所要提取的sample數目為多少?(參數batch size),因此,一個epoch所train的dataset數目就是steps_per_epoch乘上batch_size。下面的例子同樣每epoch會run 2倍於目前的dataset數量。(注意:nb_epoch 參數自Keras 2.0開始已被epoch參數取代)

epochs = 50

batch_size = 32

steps_per_epoch=int((len(trainData)*2)/batch_size)

train_history = model.fit_generator(

train_datagen.flow(trainData_normalize, trainLabels_hot, atch_size=batch_size),

steps_per_epoch=steps_per_epoch, epochs=epochs,

validation_data=(valiData_normalize, valiLabels_hot))

實際應用

接下來我以之前作過的「使用CNN 識別辦公區狀態」為例子,該dataset的資訊如下:

  • 格式:jpeg,224×224 pixels
  • 相片日期:2017/04~2017/09
  • 分類:共有17種categories,每個category有70張相片,共1,190張。

每張圖片依如下分為四個區域並給予label:由左上角本人座位開始順時間方向,1代表有人,0代表無人,亦即該區只要有人出現該區便視為1,因此,下面的兩張圖皆會被label為1-1-0-1。

若剛好有人橫跨兩個區域,則視其在那一區域佔的比例較多來決定,例如:

  

  

總計會有17種情況,因此所有相片會被歸屬於17個不同的labels(Categories)。每個category舉例一張如下(後方的藍色數字代表其label的代碼):

0-0-0-0(11) 1-0-0-0(7) 0-1-0-0(14)
0-0-1-0(9) 0-0-0-1(12) 1-1-0-0(6)
0-1-1-0(16) 0-0-1-1(1) 1-0-1-0(8)
0-1-0-1(2) 1-0-0-1(4) 1-1-1-0(13)
0-1-1-1(3) 1-0-1-1(0) 1-1-0-1(15)
1-1-1-1(10) Dark(5)
        在進行深度學習訓練時,我們經常需要海量的資料以確保訓練時不會產生過度擬合(over-fitting)的現象,然而在現今數位時代,資料可是驅使AI引擎全力運轉的新石油,每家公司莫不紛求資料若渴,導致大部份有價值的資料都掌握在資金雄厚公司或位於相關領域的企業,個人開發者或普通公司很難擁有或者搜集完整需要的資料。因此,一般我們會採取如下的作法,以補足資料不足而導致的over-fitting問題:
  1. Review並重新組合或調整model架構。
  2. 將資料進行正規化,如L1/L2 regularization。
  3. 使用dropout技術。
  4. 使用Data augmentation(資料增強)技術。

dropout技術在之前已介紹並實際應用過,在此所要介紹的是Data augmentation。不同於Dropout透過丟棄一定比例的神經元以模擬不同的dataset,Data augmentation則是從既有的dataset中產生出更多的資料讓系統去學習,說坦白一點,是創造更多的「假」資料,來彌補我們資料不足的缺憾。

雖然是假的資料,但也是從原始資料內容修改產生的,因此Data augmentation經過證實的確可解決資料不足的困境並提昇系統訓練的準確率哦!我們來看看要怎麼使用它。

Data augmentation原理

一張圖片經過旋轉、調整大小、比例尺寸,或者改變亮度色溫、翻轉等處理後,我們人眼仍能辨識出來是相同的相片,但是對機器來說那可是完全不同的新圖像了,因此, Data augmentation就是將dataset中既有的圖片予以修改變形,以創造出更多的圖片來讓機器學習,彌補資料量不足的困擾。

Keras透過ImageDataGenerator class提供Data augmentation相關的功能,如:

  1. 資料的正規化normalization:可針對Sample-wise(每次取樣的sample batch)或Feature-wise(整體的dataset)
  2. 資料白化(Whitening)處理:提供ZCA Whitening處理。(Whitening是一種將資料去冗餘的技術)
  3. 影像處理:翻轉、旋轉、切裁、放大縮小、偏移…等。

更詳細的參數使用請參考https://keras.io/preprocessing/image/

如何使用Data augmentation

在Keras使用Data augmentation的流程是:

  1. 載入class:

from keras.preprocessing.image import ImageDataGenerator

  1. 初始化ImageDataGenerator物件,並定義其參數:

datagen = ImageDataGenerator(

zca_whitening=False,

rotation_range=40,

width_shift_range=0.2,

height_shift_range=0.2,

shear_range=0.2,

zoom_range=0.2,

horizontal_flip=True,

fill_mode=’nearest’)

  1. 產生不同的圖形,以下分成兩種狀況來說明:

A)想要產生圖形檔到disk:

  • 例如要從某張相片產生10張檔名開頭為cat的jpg圖片,並儲存到目錄preview中:

img = cv2.imread(“test1.jpg”)

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

#格式必須為:(sample數, channels, height, width)

img = img.reshape((1,) + img.shape)

for batch in datagen.flow(img, batch_size=10,

save_to_dir=’preview’, save_prefix=’cat’, save_format=’jpeg’)

B)想要在訓練時邊產生圖形:

這又分兩種情況,一種是dataset已載入memory,另一種是dataset放在某實體目錄中尚未讀入。

  1. dataset已載入memory:

datagen.fit(trainData)

train_history = model.fit_generator(train_datagen.flow(trainData,

trainLabels_hot, batch_size=64),

steps_per_epoch=round(len(trainData)/64),

epochs=50, validation_data=(valiData, valiLabels_hot))

  1. dataset位在data/train目錄下:

trainData = train_datagen.flow_from_directory(

“data/train”,

target_size=(150, 150),  #可以在此指定要rescale的尺寸

batch_size=64,

class_mode=’binary’)

model.fit_generator(

trainData,

steps_per_epoch= round(len(trainData)/64),

epochs=50,

validation_data=(valiData, valiLabels_hot) )

Data augmentation的效果

下方範例為讀入一張圖片,然後透過Data augmentation來產生不同的圖片為例,您可以同步開啟https://github.com/ch-tseng/data-augmentation-Keras/blob/master/DataAugmentation-1.ipynb 來檢視其效果

  1. 載入相關class及module

import cv2

from matplotlib import pyplot as plt

%matplotlib inline

from pylab import rcParams

rcParams[‘figure.figsize’] = 15, 15

from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp.png

  1. 指定一張相片

imgForTest = “../test1.jpg”

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp0.png

  1. 讀入指定相片:

使用opencv讀入圖片,由於opencv預設格式為BGR,因此需用cvtColor轉為RGB格式。

img = cv2.imread(imgForTest)

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp3.png

  1. 顯示圖片及其資料維度:

由於我們是load單張圖片而非array,因此需要修改其dimention,在前方加入ID項次。

plt.imshow(img)

print(img.shape)

img = img.reshape((1,) + img.shape)

print(img.shape)

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp7.png

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp8.png

  1. 定義相關參數:

您可以看到下方的ImageDataGenerator參數值有rotation、shift、shear、flip、zoom、fill_mode…等,從字義上即可瞭解其圖形效果,相關詳細參數說明請參考:https://keras.io/preprocessing/image/

datagen = ImageDataGenerator(

rotation_range=40,

width_shift_range=0.2,

height_shift_range=0.2,

shear_range=0.2,

zoom_range=0.2,

horizontal_flip=True,

fill_mode=’nearest’)

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp9.png

  1. 經由augmentation產生各種圖形:

datagen.flow會依據指定參數產生各式圖形,您可以輸入一個圖形陣列或本範例一樣的單張圖片。

i = 0

for batch in datagen.flow(img, batch_size=10,

save_to_dir=’small-2000/preview’, save_prefix=’cat’, save_format=’jpeg’):

plt.subplot(5,4,1 + i)

plt.axis(“off”)

 

augImage = batch[0]

augImage = augImage.astype(‘float32’)

augImage /= 255

plt.imshow(augImage)

 

i += 1

if i > 19:

break

C:\Users\CHE7C6~1.TSE\AppData\Local\Temp\x10sctmp10.png

同樣的,一張小狗的照片可以產生這麼多的新圖片:https://github.com/ch-tseng/data-augmentation-Keras/blob/master/dogcat-augmentation.ipynb

model.fit與model.fit_generator

注意在使用Data augmentation時,進行訓練所使用的model.fit須改為model.fit_generator才讓系統on-fly的產生新圖像提供訓練使用。model.fit與model.fit_generator這兩個指令都是for相同的訓練用途,但使用時機大有不同:

  1. model.fit 適用於Dataset已ready,不需再進行任何預處理可直接使用。
  2. model.fit_generator 適用於Dataset尚未ready,需要在每批次訓練先進行預處理(或產生)。

由於model.fit_generator在每批次訓練前才on demand或on-the-fly處理或產生data,因此能比較有效率的應用在一些硬體資源不太足夠的機器上(例如RAM僅有8G然而dataset卻有1TB的情況),model.fit_generator可避免load整個dataset,只需要在每批次訓練前on-demand產生需要數量的data。

那麼,我們要如何定義要經由Data augmentation產生多少資料呢?最簡單的方式是透過參數samples_per_epoch,該參數定義每次epoch要產生多少sample data(亦即系統在每個epoch所能看到的資料數量)。在下方的例子中,我們設定為training dataset的2倍數量。

epochs = 15

batch_size = 32

train_history = model.fit_generator(

train_datagen.flow(trainData_normalize, trainLabels_hot, batch_size=batch_size),

samples_per_epoch=(len(trainData)*2), nb_epoch=epochs,

validation_data=(valiData_normalize, valiLabels_hot))

如此一來,如果我們的dataset只有1,000張,但透過augmentation實際上訓練的數量可擴增到2,000張,是不是很方便呢?

我們也可以用另一種方式,不先給予total的training數目而是指定每個epoch要分成幾個batch來run(參數steps_per_epoch),以及每次batch所要提取的sample數目為多少?(參數batch size),因此,一個epoch所train的dataset數目就是steps_per_epoch乘上batch_size。下面的例子同樣每epoch會run 2倍於目前的dataset數量。(注意:nb_epoch 參數自Keras 2.0開始已被epoch參數取代)

epochs = 50

batch_size = 32

steps_per_epoch=int((len(trainData)*2)/batch_size)

train_history = model.fit_generator(

train_datagen.flow(trainData_normalize, trainLabels_hot, atch_size=batch_size),

steps_per_epoch=steps_per_epoch, epochs=epochs,

validation_data=(valiData_normalize, valiLabels_hot))

實際應用

接下來我以之前作過的「使用CNN 識別辦公區狀態」為例子,該dataset的資訊如下:

  • 格式:jpeg,224×224 pixels
  • 相片日期:2017/04~2017/09
  • 分類:共有17種categories,每個category有70張相片,共1,190張。

每張圖片依如下分為四個區域並給予label:由左上角本人座位開始順時間方向,1代表有人,0代表無人,亦即該區只要有人出現該區便視為1,因此,下面的兩張圖皆會被label為1-1-0-1。

若剛好有人橫跨兩個區域,則視其在那一區域佔的比例較多來決定,例如:

  

  

總計會有17種情況,因此所有相片會被歸屬於17個不同的labels(Categories)。每個category舉例一張如下(後方的藍色數字代表其label的代碼):

0-0-0-0(11) 1-0-0-0(7) 0-1-0-0(14)
C:\Users\ch.tseng\AppData\Local\Microsoft\Windows\INetCache\Content.Word\csi_20170919_072137.jpg C:\Users\ch.tseng\AppData\Local\Microsoft\Windows\INetCache\Content.Word\csi_20170802_183652.jpg C:\Users\ch.tseng\AppData\Local\Microsoft\Windows\INetCache\Content.Word\csi_20170922_141016.jpg
0-0-1-0(9) 0-0-0-1(12) 1-1-0-0(6)
C:\Users\ch.tseng\AppData\Local\Microsoft\Windows\INetCache\Content.Word\csi_20170425_081744.jpg C:\Users\ch.tseng\AppData\Local\Microsoft\Windows\INetCache\Content.Word\csi_20170511_165117.jpg C:\Users\ch.tseng\AppData\Local\Microsoft\Windows\INetCache\Content.Word\csi_20170712_165118.jpg
0-1-1-0(16) 0-0-1-1(1) 1-0-1-0(8)
C:\Users\ch.tseng\AppData\Local\Microsoft\Windows\INetCache\Content.Word\csi_20170914_080154.jpg C:\Users\ch.tseng\AppData\Local\Microsoft\Windows\INetCache\Content.Word\csi_20170816_114856.jpg C:\Users\ch.tseng\AppData\Local\Microsoft\Windows\INetCache\Content.Word\csi_20170711_091805.jpg
0-1-0-1(2) 1-0-0-1(4) 1-1-1-0(13)
C:\Users\ch.tseng\AppData\Local\Microsoft\Windows\INetCache\Content.Word\csi_20170717_111347.jpg C:\Users\ch.tseng\AppData\Local\Microsoft\Windows\INetCache\Content.Word\csi_20170717_150541.jpg C:\Users\ch.tseng\AppData\Local\Microsoft\Windows\INetCache\Content.Word\csi_20170720_083751.jpg
0-1-1-1(3) 1-0-1-1(0) 1-1-0-1(15)
C:\Users\ch.tseng\AppData\Local\Microsoft\Windows\INetCache\Content.Word\csi_20170918_151031.jpg C:\Users\ch.tseng\AppData\Local\Microsoft\Windows\INetCache\Content.Word\csi_20170801_163111.jpg C:\Users\ch.tseng\AppData\Local\Microsoft\Windows\INetCache\Content.Word\csi_20170920_150029.jpg
1-1-1-1(10) Dark(5)
C:\Users\ch.tseng\AppData\Local\Microsoft\Windows\INetCache\Content.Word\csi_20170817_104837.jpg C:\Users\ch.tseng\AppData\Local\Microsoft\Windows\INetCache\Content.Word\csi_20170916_103218.jpg

比較有否使用Data Augmentation的差異

未使用Data Augmentation

由於此dataset總圖片張數僅有1,190張,因此我們打算比較看看加入Data Augmentation功能是否能提昇其準確率。因為時間因素,我們僅訓練15 epoches,首先,是未使用data augmentation的結果:

F1-score成績僅為0.69。

使用Data Augmentation

接下來我們看看加入data augmentation的效果。在下方,我們增加一個調整曝光值的function,讓data augmentation能產生各種不同亮度的相片作為新圖片來使用。

from skimage import exposure

def AHE(img):

    img_adapteq = exposure.equalize_adapthist(img, clip_limit=0.03)

    return img_adapteq

if(dataAugment):

    train_datagen = ImageDataGenerator(

        preprocessing_function=AHE,

        fill_mode=’nearest’)

   

    train_datagen.fit(trainData_normalize)

使用Test dataset測試結果,F1-score成績為0.85,發現使用Data augmentation讓成績大幅提昇了23%。

註:上述的程式碼已上傳Github,您可參考下方的連結:

1. 未使用Data augmentation的程式: https://github.com/ch-tseng/data-augmentation-Keras/blob/master/CNN-Meetingroom-Augmentation-No.ipynb

2. 使用Data augmentation的程式: https://github.com/ch-tseng/data-augmentation-Keras/blob/master/CNN-Meetingroom-Augmentation-2.ipynb

 

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

 


簡易opendata – PM2.5 查詢

$
0
0

個人很喜歡的範例之一 (其實超多的啊),是使用行政院環保署的空氣品質資料來查詢,之前的範例使用App Inventor查詢,因為每個測站的資料有座標,馬上可以在手機的Google Map 上呈現。對學生來說,使用這個資料來做相關的排序、搜尋也好玩多了,因為資料本身是有意義的。教學者可以帶同學先好好思考資料內容的格式,再試著從資料中找到有趣的資訊。本範例也收錄在 CAVEDU第51本書 [實戰AI資料導向式學習|Raspberry Pi╳深度學習╳視覺辨識] 中。

原始資料來源:http://opendata2.epa.gov.tw/AQI.json

您可使用 http://www.jsoneditoronline.org/ 這樣的網站幫助您更快理解 json 架構, 它會把 raw data 排版完成

今天改用 python 來玩玩看,輸入縣市名稱 (需符合 county 欄位實際內容) 之後會帶出該縣市下的測站數量以及這幾個測站的平均 PM 2.5 值。本網頁一個小時更新一次,試試看畫出指定測站的 AQI 每小時折線圖吧。或者也可以用 Raspberry Pi 去 host 一個 .json 格式的網頁,再讓其它裝置去爬取網頁內容,也是很有趣的應用喔!

執行畫面:

source code:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

import urllib, json
from urllib import request
s = 0
k = 0
url = "http://opendata2.epa.gov.tw/AQI.json"
response = request.urlopen(url)
content = response.read()
content = content.decode('utf-8')
data_list = json.loads(content)
c = input("請輸入縣市名稱:")
for i in range(0,81):
  if c == data_list[i]["County"]:
    s = s + int(data_list[i]["PM2.5"])
    k=k+1
if k == 0:
  print("查無資料")
else:
  print (c + "共有" + str(k) + "個測站,平均 PM 2.5 是 " + str(round(s/k)))
easy example of MS Cognitive service - Face API

本範例感謝 2019 CAVEDU實習生 – Ning Chen 支援

Google ML Study Jam培訓計畫上課心得[使用 Cloud ML APIs 來解析、分析及翻譯圖片中的文字內容]

$
0
0

Google的諸多服務一直是我很愛用的,雖然有些不知道怎麼用…  我想很多人與我是類似的感覺,所以前陣子由Google所推出的 ML Study Jam 機器學習培訓計劃 – 初級課程,當然火速報名。課程內容非常豐富,包含以下主題,都非常實用:

  1. 使用 BigQuery ML 的預測模型預測計程車費率
  2. 使用 BigQuery ML 的分類模型預測顧客購買行為
  3. 使用 Cloud Vision API 來偵測圖片中的標籤、臉孔以及地標
  4. 快速上手 Cloud Speech API
  5. 使用 Cloud Speech API 將聲音轉成文字稿
  6. 使用 Cloud Translate API 翻譯文字內容
  7. 使用 Cloud Natural Language API 分類文字內容
  8. 使用 Cloud ML APIs 來解析、分析及翻譯圖片中的文字內容
  9. 使用 Cloud Vision API 以及 Cloud Video Intelligence 來分析用戶上傳的影像內容

已經有許多朋友分享自己的心得,我也來分享 [使用 Cloud ML APIs 來解析、分析及翻譯圖片中的文字內容] 的操作過程與一點想法。政府於上個月也推動了 [高中職生AI扎根系列活動],已經不是高中生的朋友別擔心,類似的課程與資源日後一定會愈來愈多。請密切關注CAVEDU相關頻道即可。

1.進入專案頁面

本文說明的範例是「使用 Cloud ML APIs 來解析、分析及翻譯圖片中的文字內容

接著會看到很詳盡的專案說明以及學習內容(翻譯用粗體表示)

總覽:本課程透過不同的機器學習API 讓您探索機器學習的威力。首先使用Cloud Vision API 的文字偵測方法,運用Optical Character Recognition (OCR)技術來辨識影像中的各種文字。接著則是運用 Translation API 來翻譯這個文字,最後用 Natural Language API 來分析它。.

您會學到:

  • 建立一個Vision API request 並用curl 來呼叫這個API
  • 理解如何運用 Vision API 的文字偵測(OCR)方法
  • 理解如何運用來翻譯影像中的文字
  • 理解如何運用 Natural Language API 來分析文字

您需要:

  • A Google Cloud Platform Project
  • 瀏覽器,Chrome 或 Firefox 都可以

2. 登入

同意相關規範之後繼續,請注意在此都是用本次ML Study Jam所提供的帳號來上課,請不要用您個人的email來登入,因此相關兩階段登入、回復設定以及免費試用等選項都不要去理它。[AGREE AND CONTINUE]之後,會進入您這個 GCP帳號的 GCP console。


3. 進入GCP console 並開啟 Cloud shell

接著要啟動Google Cloud Shell。Google Cloud Shell 是預先載入好所需開發工具的虛擬機,提供永久性的 /home目錄(容量 5GB)並直接在 Google Cloud上執行。Google Cloud Shell 可讓您用命令列指令來存取 GCP專案資源,相當方便。

請在GCP console右上角點選 [Open Cloud Shell] 按鈕,再點選[START CLOUD SHELL] 就會開啟。

頁面上還有一些基礎的 cloud sheel 指令教學,在此省略囉

4. 建立API key

API key 的重要性應該不用多說吧,透過API key 來驗證每一次呼叫的合法性(當然還有計價). 由於後續會用 curl 來對 Vision API 發送需求,因此當然需要在 request URL 中放入一個 API key 來驗證呼叫的合法性。

下拉式選單,選擇 API Key

API key 產生之後,點選Close

現在請把 API key 存成一個環境變數,這樣後續呼叫會比較方便。請在Cloud Shell 中輸入以下<your_api_key>:

export API_KEY=<your_api_key>

5. 上傳影像到 cloud storage bucket

接下來新增一個 cloud storage bucket 來儲存所要辨識的圖片。共有兩種方法把影像發送到 Vision API,一是發送 base64 編碼後的影像字串 image string,或是把存放在Google Cloud Storage 的檔案 URL 發送過去。本課程會先建立一個 Google Cloud Storage bucket 來存放影像。

請在Cloud console中找到 Storage

點選Create bucket,給一個名稱(不可重複)之後點選Create

上傳影像到您所建立的 bucket

請下載下面這張照片,另存檔名為sign.jpg

sign_image.png

回到您剛剛建立的bucket,點選Upload files,再選擇剛剛的sign.jpg

上傳完成之後可以看到這張影片的相關資訊

現在要把這個檔案設為 public,但 bucket 本身依然為private,請點選影像檔最右邊的[…]鍵。選擇 Edit Permissions,點選Add Item並完成以下設定:

  • Entity,選擇”Group
  • Name,輸入”allUsers
  • Acceess,選擇”Reader

點選Save就完成了,現在這個檔案是公開的了。接著就是要建立一個 Vision API request 將這張圖檔的 Url 傳送過去。

建立Vision API request

在Cloud Shell環境中,建立一個ocr-request.json並加入以下內容,把my-bucket-name換成您所建立的bucket名稱。使用任何喜歡的編輯器都可以(nano, vim, emacs),也可以點選Cloud Shell 工具列上的鉛筆圖示:

{
  "requests": [
      {
        "image": {
          "source": {
              "gcsImageUri": "gs://my-bucket-name/sign.jpg"
          }
        },
        "features": [
          {
            "type": "TEXT_DETECTION",
            "maxResults": 10
          }
        ]
      }
  ]
}

在Cloud shell下的 Explorer 下找到 ocr-request.json,確認 gcsImageUrl 後面的路徑沒有錯,例如要改成:gs//cavedu-bucket/sign.jpg

在cloud shell中,輸入以下指令:

curl -s -X POST -H "Content-Type: application/json" --data-binary @ocr-request.json  https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}

第一段結果看起來類似這樣:

OCR方法可以從影像中擷取各式各樣的文字,很酷吧!reponse中第一段是 API 在影像中找到的所有影像區塊,包含語言編碼 (以 sign.jpg 來說為法語)、一串文字與一組座標來說明文字在影像中的位置。接著是文字中找到各單字的物件,一樣也會標明座標。

但除非你是法國人,不然也不知道文字確切的意思,來試試看翻譯吧。

將影像中的文字發送到Translation API

Translation API 支援100種以上語言的翻譯,還可以自動偵測輸入語言的文字。想要把法文翻譯成英文的話,您只要把要翻譯的文字與目標語言的編碼(例如en-US)發送給Translation API就可以囉。

一樣建立translation-request.json,並加入以下內容:

{
  "q": "your_text_here",
  "target": "en"
}
translation-request.json

請在Cloud Shell 執行本指令,可以把上一步影像中所擷取的文字複製到translation-request.json中:

STR=$(jq .responses[0].textAnnotations[0].description ocr-response.json) && STR="${STR//\"}" && sed -i "s|your_text_here|$STR|g" translation-request.json

 

請在 cloud shell 中輸入以下指令:

curl -s -X POST -H "Content-Type: application/json" --data-binary @translation-request.json https://translation.googleapis.com/language/translate/v2?key=${API_KEY} -o translation-response.json

執行結果如下:

建立自己的YOLO辨識模型 – 以柑橘辨識為例

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

Joseph Redmon曾經上TED演講介紹YOLO,可上此網址https://www.ted.com/talks/joseph_redmon_how_a_computer_learns_to_recognize_objects_instantly?language=zh-tw#t-434921觀看,他在影片中介紹了影像分類及物件偵測的不同,推廣Object detection的應用並展示了YOLO在實時偵測上的威力。

Yolo歷代各版本的特色比較

V1 V2 V3
Detect方式 Grid網格式,預設為7×7 Anchor box on feature map。在CNN output的13×13 feature map進行預測(stride為32),每格搭配5個Anchor Boxes來預測Bounding Boxes。

(以輸入圖片尺寸為416 x 416為例)

Anchor box on feature map。在13×13, 26×26, 52×52三種feature maps上進行預測(stride分別為32, 16, 8),每格搭配3個Anchor Boxes來預測Bounding Boxes。(以輸入圖片尺寸為416 x 416為例)
Bound box最大數量 7 x 7 x 2 = 98 13 x 13 x 5 = 845(以輸入圖片尺寸為416 x 416為例) (13×13+26×26+52×52)x3 = 3549(以輸入圖片尺寸為416 x 416為例)
Image seize for input 448 x 448 416 x 416(default)model可接受最高解析度 (height=608, width=608)

或任何大於32的2次方倍數。

全連結層有 無輸入的圖片不再受限於固定的尺寸,任意輸入維度都可以在整個網絡上運行。
Detection 一個 一個 三個,分別針對不同的size
Loss function sum-squared error loss sum-squared error loss binary cross-entropy loss
Output activation Softmax loss Softmax loss Logistic loss
Base model GoogLeNet VGG ResNet
Darknet model darknet-19 darknet-53
新增技術 Batch Normalization→ V2以BN取代V1的Dropout layer,mAP提昇。High Resolution Classifier→ V1用224×244 training,V2提昇至448×448訓練。

Convolution with anchor boxes→V2在FC層進行regression預測bounding box,V2直接去除FC層參考Faster R-CNN的作法以anchor來預測bound box。

Multi-Scale Training→ V2每訓練10個Batch會隨機地選擇新的圖片尺寸進行訓練。→提昇模型針對不同尺寸的圖片的偵測效果。

多尺度預測→提昇了對小物體的偵測能力。Anchor box增加 → IOU提高
亮點 YOLO:45 FPSFast YOLO:155FPS YOLO9000:可偵測9,000種物品,67FPS 針對前一版,主要亮點並非在速度,而是小物體的偵測能力以及數量。

最初版本的Yolo論文公佈於2015年,刊登於arXiv公開論文網站上,掛名的作者分別是Joseph Redmon、Santosh Divvala、Ross Girshick以及Ali Farhadi,但主要開發者應該是Joseph Redmon吧,這是他的個人網站https://pjreddie.com/。除了電腦,他還喜愛滑雪、徒步旅行、攀岩以及和他的阿拉斯加雪撬犬Kelp玩,所以他的YOLO論文(https://arxiv.org/abs/1506.02640)寫得相當的平實有趣,V2版還被選為2017年最佳論文。

https://avatars3.githubusercontent.com/u/302108?s=400&v=4

Joseph Redmon曾經上TED演講介紹YOLO,可上此網址https://www.ted.com/talks/joseph_redmon_how_a_computer_learns_to_recognize_objects_instantly?language=zh-tw#t-434921觀看,他在影片中介紹了影像分類及物件偵測的不同,推廣Object detection的應用並展示了YOLO在實時偵測上的威力。

Yolo歷代各版本的特色比較

V1 V2 V3
Detect方式 Grid網格式,預設為7×7 Anchor box on feature map。在CNN output的13×13 feature map進行預測(stride為32),每格搭配5個Anchor Boxes來預測Bounding Boxes。

(以輸入圖片尺寸為416 x 416為例)

Anchor box on feature map。在13×13, 26×26, 52×52三種feature maps上進行預測(stride分別為32, 16, 8),每格搭配3個Anchor Boxes來預測Bounding Boxes。(以輸入圖片尺寸為416 x 416為例)
Bound box最大數量 7 x 7 x 2 = 98 13 x 13 x 5 = 845(以輸入圖片尺寸為416 x 416為例) (13×13+26×26+52×52)x3 = 3549(以輸入圖片尺寸為416 x 416為例)
Image seize for input 448 x 448 416 x 416(default)model可接受最高解析度 (height=608, width=608)

或任何大於32的2次方倍數。

全連結層 無輸入的圖片不再受限於固定的尺寸,任意輸入維度都可以在整個網絡上運行。
Detection 一個 一個 三個,分別針對不同的size
Loss function sum-squared error loss sum-squared error loss binary cross-entropy loss
Output activation Softmax loss Softmax loss Logistic loss
Base model GoogLeNet VGG ResNet
Darknet model darknet-19 darknet-53
新增技術 Batch Normalization→ V2以BN取代V1的Dropout layer,mAP提昇。High Resolution Classifier→ V1用224×244 training,V2提昇至448×448訓練。

Convolution with anchor boxes→V2在FC層進行regression預測bounding box,V2直接去除FC層參考Faster R-CNN的作法以anchor來預測bound box。

Multi-Scale Training→ V2每訓練10個Batch會隨機地選擇新的圖片尺寸進行訓練。→提昇模型針對不同尺寸的圖片的偵測效果。

多尺度預測→提昇了對小物體的偵測能力。Anchor box增加 → IOU提高
亮點 YOLO:45 FPSFast YOLO:155FPS YOLO9000:可偵測9,000種物品,67FPS 針對前一版,主要亮點並非在速度,而是小物體的偵測能力以及數量。

如何訓練自己的YOLO model

  1. dataset準備與架構

從V2開始,可以自行在cfg檔中設定輸入圖片的尺寸(預設416×416或最高608×608,或任何大於32的2次方倍數尺寸)。所以若在拍攝相片時能用愈高像素來拍更好,可label出的物件愈多,且在後續使用的彈性更大。

在相片的準備上,建議需注意多樣及差異性,假設我們要準備柑橘圖片for辨識使用,那麼拍攝時需注意到:

– 不同環境:比如溫室或戶外的場地,高架或平地種植的草莓。

– 不同季節:蔬果外觀顏色的變化。

– 不同時間:光影的變化帶來的差異,直射斜射或散射光。

– 不同氣候:雨天與乾季對於蔬果外形的影響。

– 不同生長周期:蔬果從發芽抽高長葉到開花結果成熟…等,不同時期的外觀變化。

2. 相片或攝影的選擇

使用影片匯出影格frames作為訓練用圖片,目前也是主流方法之一,與相片拍攝比較,個人覺得最大差異是在1.事前篩選(相片)或事後篩選(攝影)、以及 2.像素尺寸大小兩種:

相片 影片
優點
  1. 尺寸及解析度較高
  2. 篩選相片時間少, 可直接進行label
  3. 成本較低
  1. 直接針對目的物進行錄影,不需一張張拍攝,搜集data較方便省時。
  2. 短時間內便可搜集到各種不同角度不同視野的大量相片。
  3. 訓練時可針對欠缺的某一角度或形態的相片,再從影片檔中去取得再加入訓練。
缺點
  1. 拍攝時需考慮角度對焦及距離,搜集data會發費較多時間。
  2. 若缺少某一類相片,必須重回現場拍攝取得。
  1. 解析度較低,物體太小時無法利用裁圖方式來放大。
  2. 需花費時間針對影片中的frames進行篩選匯出,才能開始label。
  3. 1080P或4K錄影,硬體成本較相機高。

我個人偏好的模式是以相片為主攝影為輔,在準備dataset階段可先用相片拍攝大量相片後,再花點時間用攝影模式拍幾段影片,之後在訓練的過程中若發現效果不理想或有某一類型的圖片缺乏,可從影片中尋找符合該類型的frame加入訓練。

3. 建立相關資料夾

首先,先建立如下三個資料夾,然後將上一步欲用來訓練的相片放置於images資料夾中。

4. 開始label相片

Label軟體我們使用的是LabelImg,請從https://github.com/tzutalin/labelImg 下載並執行該軟體。剛執行時畫面是空的,請按「Open Dir」、「Change Save Dir」選擇剛剛建立的images以及labels資料夾,接下來便可從下窗格中選擇要label的相片,「按下Create RectBox」便可開始label。

在作label框選時,請考慮是否有足夠的紋理特徵?此外,若人眼都無法確定的物件,就放棄框選。

框選完所有的相片之後,您的資料夾下應會分別有相同數目的image檔及xml的label檔。

請注意,目前新版for windows的LabelImg新增YOLO格式,因此可以直接輸出YOLO需要的檔案格式,您可以直接使用該格式,但我的習慣還是用較為流行的Pascal VOC格式,另外再寫一支程式將VOC轉為YOLO格式,好處是VOC較多人使用,而我們的dataset除了YOLO之外,還可以支援其它的object detection模型。

5.  轉換VOC labels為YOLO格式

YOLO所需要的label格式不同於我們所熟知、ImageNet使用的PASCAL VOC xml,而是採用text文字檔,第一欄為class的ID,其它皆以物件框相對於整張圖片的比例來呈現:

類別代碼 物件中心x位在整張圖片x的比例 物件中心y位在整張圖片y的比例 物件寬度w佔整張圖片寬度的比例 物件長度h佔整張圖片長度的比例
Category

number

Object center

in X

Object center

in Y

Object width

in X

Object height

in Y

例如下圖定義了三個名稱為「Orange」的label,右側為PASCAL VOC的格式,下方為YOLO的格式,可用如下計算方式來轉換VOC→YOLO。

轉換公式:

x = (xmin + (xmax-xmin)/2) * 1.0 / image_w

y = (ymin + (ymax-ymin)/2) * 1.0 / image_h

w = (xmax-xmin) * 1.0 / image_w

h = (ymax-ymin) * 1.0 / image_h

6. 建立YOLO資料夾,放置Label檔及圖片檔

YOLO的label檔是text格式的.txt,每張圖片對應一個txt檔,且兩者較要放置於同一資料夾中,因此,我建了一個資料夾名稱為YOLO,將所有images及txt檔全部放置於其下。稍後在訓練時,YOLO只會access該Yolos資料夾,Images和Labels這兩個已經不需要了。

7. 建立設定檔cfg資料夾

在Orange目錄下,新增cfg資料夾,我們將在此資料夾下放置YOLO設定檔。

有五個設定檔,分別為:

obj.names、obj.data、train.txt、test.txt、yolov3.cfg or yolov3-tiny.cfg

  1. obj.names:此檔內容為label的列表,例如mature與flower,YOLO在訓練與預測時皆需要讀取此檔。
mature

flower
  1. obj.data:定義label數目以及各個設定檔及weights目錄的path,YOLO訓練及預測時皆會讀取。
classes= 2

train  = cfg.orange/train.txt

valid  = cfg.orange/test.txt

names = /home/digits/jupyter/chtseng/opencv-cascade-make/yolo-v3/cfg.orange/obj.names

backup = cfg.orange/weights/

 

  1. train.txt:所有images檔案名稱列表中的80%(或其它比例,可視需求變更),訓練時YOLO會依次讀取該檔內容取出相片進行訓練.。您可以手動或寫程式取出固定比例的列表放置於此檔案內容中。
/dataset/orange/yolo/IMG_4287.jpg

/dataset/orange/yolo/IMG_4104.jpg

/dataset/orange/yolo/IMG_4291.jpg

/dataset/orange/yolo/IMG_4306.jpg

/dataset/orange/yolo/IMG_4429.jpg

…

…

…
  1. test.txt:所有images檔案名稱列表中的20%(或其它比例,可視需求變更),訓練時YOLO會依次讀取該檔內容取出相片進行validation.。您可以手動或寫程式取出固定比例的列表放置於此檔案內容中。
/dataset/orange/yolo/IMG_4102.jpg

/dataset/orange/yolo/IMG_4428.jpg

/dataset/orange/yolo/IMG_4318.jpg

…

…
  1. yolov3.cfg or yolov3-tiny.cfg :YOLO模型設定檔,請從Darknet安裝目錄下的cfg資料夾找到需要的YOLO cfg檔(標準或tiny YOLO),複製到本cfg資料夾。
  2. 修改yolo模型的cfg檔:

如果您想訓練Tiny YOLO,請複製並修改yolov3-tiny.cfg如下:

Line 3: set batch=24 → using 24 images for every training step

Line 4: set subdivisions=8 → the batch will be divided by 8

Line 127: set filters=(classes + 5)*3   → in our case filters=21

Line 135: set classes=2  →  the number of categories we want to detect

Line 171: set filters=(classes + 5)*3  → in our case filters=21

Line 177: set classes=2   → the number of categories we want to detect

如果您想訓練YOLO,請複製並修改yolov3.cfg如下:

Line 3: set batch=24 → using 24 images for every training step

Line 4: set subdivisions=8 → the batch will be divided by 8

Line 603: set filters=(classes + 5)*3   → in our case filters=21

Line 610: set classes=2   →  the number of categories we want to detect

Line 689: set filters=(classes + 5)*3   → in our case filters=21

Line 696: set classes=2, the number of categories we want to detect

Line 776: set filters=(classes + 5)*3   → in our case filters=21

Line 783: set classes=2   →  the number of categories we want to detect

batch參數是指每批次取幾張圖片進行訓練,subdivisions參數是指要將每批次拆成幾組,以避免GPU memory不夠。如果您是使用12G的1080 Ti GPU,建議使用其預設的batch=24、subdivisions=8即可。

另外,由於標準YOLO V3有三個detector針對三種scale的feature map,因此要修改三組的filters及classes。Tiny YOLO只有兩個detector,因此要修改兩組。

修改完yolov3.cfg or yolov3-tiny.cfg之後,便可開始進行訓練了。

8. 開始訓練

  1. 新建一目錄 for 儲存訓練過程的weights權重檔,該目錄的路徑名稱定義於obj.data中的backup參數。

  1. 下載預訓練檔

請從https://pjreddie.com/media/files/darknet53.conv.74,下載darknet53.conv.74 weights pre-trained on Imagent,該檔大小約155MB,可同時用於訓練YOLO及Tiny YOLO。另外,也可以考慮使用Imagent+COCO datasets所訓練的yolov3.weights (https://pjreddie.com/media/files/yolov3.weights)或yolov3-tiny.weights(https://pjreddie.com/media/files/yolov3-tiny.weights)。

下載後的訓練檔請置於可讀取到的位置,下一步將用到。

  1. 執行darknet command開始訓練

../../darknet/darknet detector train cfg.orange/obj.data cfg.orange/yolov3-tiny.cfg darknet53.conv.74

  1. 訓練過程會持續的秀出各種數值,並且每隔100batches會寫出一個weights檔。其log說明如下:

  1. 一般來說,我們最需要注意的是紅框的average loss error,如果您訓練的圖片數目有數千個以上,那麼average loss error約0.06左右便可手動停止了,如果僅有數百張,那麼大約0.6左右便可先試著載入其weights檔測試看看辨識效果是否滿意。YOLO在訓練過程中每訓練100 batches便會寫入一個新的weights檔到目錄中,我們可以隨時取用以檢視目前的訓練成果。

9. 檢視訓練成果

我們找一張圖片,然後使用下列的Darknet command來測試。

../../darknet/darknet  detector test cfg.orange/obj.data cfg.orange/yolov3-tiny.cfg cfg.orange/weights/yolo_18200.weights {要測試的相片路徑}

執行後,會將指定的測試相片進行檢測後,將結果輸出為predictions.jpg。

 

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

Google Coral TPU Edge開發板 –硬體介紹與開機

$
0
0

Google Coral TPU Edge系列分成開發板與USB加速棒兩種版本。本文將說明如何讓Coral開發板開機以及執行預設的範例。我是跟著原廠文件使用我的 mac 電腦來操作,後續會說明如何使用 micro SD卡來開機。

我先說明到目前為止覺得與 Raspberry Pi / NVIDIA Jetson Nano的不同之處

  1. 原廠文件未說明如何使用SD卡開機(但網路上有教學),需與 host 電腦連線之後刷機後開機
  2. 原廠文件都是以 Mac / Linux 系統來說明如何讓板子開機,Windows做法還要再整理
  3. SSH預設不開啟,且必須push一個 google key到板子上才能SSH連入。本文做法是將板子用USB線接上電腦後使用 screen 程式連入。

開發板介紹

Coral Dev Board 是一片包含Edge TPU處理器的單板電腦,適合用來開發可直接在裝置上進行推論的機器學習專案。該有的通訊介面也都有,Jetson nano 相較之下只有有線網路(對,沒有藍牙也沒有 Wi-Fi…)

板子的外觀與配置上與 Raspberry Pi 相當類似,關於各接頭說明請參考data sheet

https://coral.withgoogle.com/docs/dev-board/datasheet/

前置作業

請注意!在說明”請接電源“之前都不要接電 (USB type C port),要準備的東西真不少…

  • Linux 或 Mac 電腦 (後續稱為 host 電腦)
  • USB-A – USB-microB傳輸線 (連接PC – 板子的序列埠)
  • USB-A – USB-C cable (連接PC – 板子的資料埠)
  • 5V / 3A USB Type-C 電源供應器 (手機充電器 OK)
  • 網路線或 Wi-Fi連線 (需要輸入帳號密碼)
  • 序列通訊軟體,例如screen、picocom 或PuTTY。我也是在 Mac 上使用 screen 來連線。
  • 最新版的 fastboot。這是包含在 Android SDK Platform-tools中的工具程式。請下載Android SDK Platform-tools,下載解壓縮會看到很多檔案,但我們只要 fastboot 就好。把 fastboot 放到 ~/.local/bin,並檢查版本。我的是 29,原廠文件要求要 28.0.2 以上。
    mkdir -p ~/.local/bin
    
    sudo mv ~/Downloads/platform-tools/fastboot ~/.local/bin/
    
    fastboot --version
  • Mendel Development Tool (MDT).
    MDT 是一組 command line tool,用來與 Mendel 裝置(Coral) 來互動。例如,MDT 可以列出已與電腦連線的裝置、安裝 Debian Linux 套件、對裝置開啟shell 還有 push key (後續SSH連線設定時會介紹)等等。請用以下指令來安裝MDT:
    pip3 install --user mendel-development-tool

    如果在 terminal 中輸入 mdt 指令出現錯誤的話,請檢查是否已將 mdt 路徑寫入到 PATH 系統變數中。Windows:\Users\yourname\AppData\Roaming\Python\Python36\Scripts;Mac:/Users/yourname/Library/Python/3.7/bin/;Linux:~/.local/bin/

刷機開機

Coral 板子出場時未包含系統映像檔,只有一個 U-Boot bootloader。 開始刷機之前請先確認:

  1. 板子完全不接電,也不連線到電腦
  2. 板子已設定為 eMMC mode,如下圖中的指撥開關由左到右分別為 (上下下下)
https://coral.withgoogle.com/docs/dev-board/get-started/

請根據以下步驟來操作,在此只列出Mac,使用Linux的朋友請參考原廠文件:

  1. 安裝 Mac 版的 CP210x USB to UART Bridge Virtual COM Port (VCP) driver
  2. 連接序列埠(還不要接電源)
  3. 使用 micro USB 傳輸線連接 host 電腦與開發板的序列埠 (只有一個 micro USB 所以不會接錯)。板子上的橘色與綠色LED燈會亮起。
  4. 於 host 電腦開啟 terminal,並輸入以下指令來確認連線
    screen /dev/cu.SLAB_USBtoUART 115200
  5. 這時畫面應該會完全空白。別擔心,因為板子還沒接電。如果看到 [screen is terminating],代表連線有點小問題。這時把 micro USB線拔除後重新接上,再次輸入 4. 的指令應該就可以了。
  6. 開機!請把 5V / 3A USB type C 接上板子 (靠近音源接頭),接頭上有標記 “PWR“。板子上紅色LED會亮起,風扇會開始轉動。
  7. 啟動 fastboot。在terminal中輸入以下指令,會直接換行並等候 host 電腦來寫入系統映像檔。
    fastboot 0
  8. 透過資料埠與 fastboot連線。只剩下最後一個 USB type-C接頭(標示為 “OTG“),請再用一條傳輸線連接 host 電腦與板子的這個埠。
  9. 在 host computer 開一個新的 terminal (原本的screen terminal不要關掉),並輸入以下指令:
    fastboot devices
  10. 會看到類似 [1b0741d6f0609912        fastboot] 的訊息代表 fastboot 有抓到裝置了。
  11. 下載系統映像檔並寫入板子。在與上一步Froterminal中輸入以下指令
    cd ~/Downloads
    
    curl -O https://dl.google.com/coral/mendel/enterprise/mendel-enterprise-chef-13.zip
    
    unzip mendel-enterprise-chef-13.zip \
    && cd mendel-enterprise-chef-13
    
    bash flash.sh
  12. 刷機過程約4~5分鐘,會看到很多訊息不斷出來

登入

呼…  經過一番折騰,請用預設帳號密碼(mendel / mendel)登入,登入後畫面如下:

輸入 df -h 來看看還有多少空間

連上網路並更新相關軟體

要連上網路才能更新軟體或下載範例,這一定要完成喔。網路線或Wi-Fi 都可以,請在板子的 terminal 輸入以下指令:

nmtui

選擇 Activate a connection 並在 Wi-Fi (wlan0) 選項下選擇一個網路來連線。或輸入以下指令來直接建立連線:

nmcli dev wifi connect <NETWORK_NAME> password <PASSWORD> ifname wlan0

檢查連線有沒有成功

nmcli connection show

可以看到板子已經順利連上 cavedu 這個無線網路,如下圖:

透過MDT連上板子

現在板子上已經有 Mendel 系統了,micro USB線可以拔掉。這時要用 MDT 開啟一個 shell 來透過 USB-C 線來與板子溝通。使用 MDT 很方便就能產生 OpenSSH 公私金鑰組,我們需要把公鑰 push 到板子上才能建立 SSH連線 (真麻煩…)

mdt shell

設定SSH來透過WIFI連入

Coral 開發板必須由 host 電腦給一個 openSSH 金鑰才能進行SSH連線,請在 mdt shell 中輸入以下指令。詳細 MDT指令請點我

ssh-keygen
# Follow steps to create key

mdt pushkey ~/.ssh/id_rsa.pub

ssh mendel@192.168.100.2

執行範例程式

輸入以下指令來跑範例程式,會開啟一個網頁來進行物件辨識 (MobileNet SSD)。

edgetpu_demo --stream

從 host 電腦端,用網路瀏覽器輸入 192.168.100.2:4664 就能看到以下畫面,太棒啦!

[ 教學技術文 ] 如何把樹莓派放到冰箱做實驗

$
0
0
作者/攝影 鄭姓天文同好 (腦波弱老闆特別聲明:不是我,我的狗膽還沒這麼大)
難度   參閱成本欄位。
成本 一般人眼中的重量級,但對天文攝影有愛就可以無視。

 

老婆大人:昨晚打開冷凍庫看到這個,第一時間以為被放了定時炸彈。我問天文學家wtf????

天文學家表示:這是我能想到家裡最冷的地方了。

我想試  #冷凍相機  的極限 ,妳看看它在零下三十度真的可以運作耶!ㄜ………其實我並不想知道。

 

眼尖的你一定注意到了照片右上角的小玩意兒,這不是樹莓派嗎? 怎麼一起丟進冰箱了? 這是甚麼神祕的裝置藝術嗎?

原來是供應110V交流電的電池,透過變壓器轉換成12V與5V的直流電,分別提供天文冷凍相機與樹莓派使用。

為什麼要塞進冰箱裏面嚇壞老婆呢?

 

這台紅色圓柱狀的機器是天文攝影專用的相機,可以將感光元件的溫度,降低到周遭環境的35度以下。越低溫的環境,感光元件產生的雜訊越低,這對低光的天文攝影是很重要的。而台灣夏天均溫攝氏30度,放在室溫下的相機,大概可以降低到 30-35 = -5,也就是零下五度。

圖片來源:振旺官網:http://zwoasi.com/

 

根據原廠提供的圖,可以知道溫度越低,相機產生的暗電流越低,雜訊也就越低。如果希望把溫度降到零下20度,就必須把周遭環境降低到 -20 + 35 = 15度以下。在台灣的夏天,要把室溫降到15度,恐怕要耗費很大的資源吧。所以才把腦筋動到了冰箱上面。

圖片來源:振旺官網:http://zwoasi.com/

而樹莓派是做甚麼用的呢?

傳統天文攝影需要各種軟體的整合,由電腦上控制赤道儀、導星、拍照、濾鏡、以及拍照時程都可以由電腦設定控制。

圖片來源:振旺官網:http://zwoasi.com/

 

樹莓派的出現實現了整合的機會。特別是第三代效能提升並內置WiFi與藍牙,價格親民,國內外就有不少天文同好實踐了由樹莓派控制這些複雜的步驟。而後出現了很多香蕉派、蓮霧派等等類似水果產品。振旺ZWO則是中文的商業產品,支援旗下所有的天文冷凍相機以及相關產品。

圖片來源:振旺官網:http://zwoasi.com/

 

透過簡潔的操作介面,把複雜的步驟圖像化,天文攝影變得更加親民。

原照片這位炸彈客(誤),把樹莓派和相機一起放進冰箱,無非是想在冰箱裏面拍照。天文攝影很重要的一個環節就是拍攝暗場照片以減低雜訊。各位若有拿單眼相機拍攝長時間曝光照片的經驗,應該有拍完照寫入記憶卡時,需要花一段時間才能完成的體驗。例如曝光30秒後,還需要額外30秒的寫入時間;多出來這30秒,是相機自動拍攝一張完全沒有光線的暗場照片,再把您的作品減去這張暗場照片的雜訊,達到消除雜訊的效果得到最終影像。而天文攝影時,黑夜時間珍貴,要把握時間拍攝天體。拍雜訊的暗場照片,就在家裡製造出相同溫度的環境,回家再拍就好了。

【寶瓶座的索倫之眼NGC7293】

這是恆星壽命將盡,噴發氣體變成的行星狀星雲;中間的白矮星是僅存的螢燭之光。距離地球700光年。

Vixen VC200L + SXD2,由ASIAIR 控制ASI294MC, ASI120MM-S導星,導星鏡為APM60240

 

【NGC7635 泡泡星雲】

 

繼邪惡的索倫之眼後,來一個可愛的泡泡星雲。雖然他在空中小小一顆,實際上的直徑是10光年!

只有曝光48分鐘而已,之後再補,噪訊比才會改善。

Vixen VC200L + SXD2,由ASIAIR 控制ASI294MC, ASI120MM-S導星,導星鏡為APM60240

Viewing all 678 articles
Browse latest View live