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

Intel OpenVINO™工具組 2022.3 LTS 有什麼?

$
0
0

前言

Intel OpenVINO™工具組 (本文後簡稱 OpenVINO 或 OV) 從 2022 迎來最大幅度改版,本文將為您介紹 2022.3 LTS 的特色,相關資料擷取自 OV 原廠網站並參閱相關資料 (皆已附上相關連結)。歡迎有興趣導入深度學習應用以及加速開發流程的師長朋友們參考本文。

CAVEDU 已為您挑選合適的 NUC,並安裝好 OpenVINO 所需的相關套件,開機就開工! (點我購買)

本文

Intel OpenVINO™工具組 (本文後簡稱 OpenVINO 或 OV) 從 2022 迎來最大幅度改版,目前最新的版本為 2022.3 LTS,標榜效能更好、更多立即可用的模型、裝置可攜性更好,以及用更少幅度的程式碼修改做到更好的推論效能。

CAVEDU 怎麼看 OpenVINO

AI 即工具/服務 (AI as a tool / service) 走到現在的 AI 即產品 (AI as a product),這股趨勢從 NVIDIA TAO toolkit 與 Intel OpenVINO 是非常明顯的。而 Intel OpenVINO 自從 2018 公布以來,希望讓開發者不須具備太多的專業知識,就能根據您的使用案例來部署最合適且最佳化的 AI 解決方案。

就白話一點的角度來說,除非我的工作目標就是要訓練出一款更棒神經網路模型,否則絕大多數人的目標應該都是 “如何找到一款最適合我的神經網路來快速解決我所碰到的問題“。CAVEDU 從 2019 年接觸 OpenVINO 以來 (相關文章請點我),也累積了不少使用心得,相信 OpenVINO 2022 可以更快更好地滿足您各方面的開發需求,所提供的教學方案也很適合學校教學使用。

CAVEDU 已為您挑選合適的 NUC,並安裝好 OpenVINO 所需的相關套件,開機就開工! (點我購買)

透過 OpenvINO 全面掌握並充分運用您的 AI 部署計畫

OpenVINO 可讓您對幾乎是所有框架所建置的深度學習模型進行最佳化,並將其部署在一系列 Intel 處理器與其他硬體平台上,當然,效能也是一等一。OpenVINO 工作流程如下,簡單分為建模(model)、最佳化(optimization)與部署(deployment),每個步驟在實務上都有非常多要考量的面向,可說是牽一髮動全身,因此才需要 OpenVINO 這類工具組為開發者提供許多好用的解決方案來加速開發。

OpenVINO 工具組讓程式碼改寫與維護變得更簡單。藉由 Open Model Zoo 所提供的最佳化預訓練模型與 Model Optimizer API,讓您的模型在轉換與用於推論上變得更得心應手。執行階段 (又稱推論引擎) 可進一步編譯已最佳化網路與管理不同裝置上的推論作業來進一步提升效能。它還針對 CPU、GPU平台提供了裝置探索(device discovery)、負載平衡(load balancing)與推論平行化(inferencing parallelism) 等諸多方案供開發者使用。

除此之外,OV 也標榜與更多裝置、平台有更好的整合結果,如下圖 (期待每一版本都能整合更多~):

2022.3 LTS 有哪些重大改變?

以下僅列出大標題,詳細 release 內容請參考  OV 原廠文件

  • 更廣泛的模型與硬體支援 – 在包括 NLP 在內的廣泛深度學習模型上輕鬆優化與部署,並在廣泛的硬體上存取 AI 加速。
  • 擴大模型涵蓋範圍 – 在廣泛的深度學習模型上輕鬆優化與部署。
  • 改善 API 與更多整合 ──更容易採用與維護程式碼。需要更少的程式碼變更、更符合框架,並且最小化轉換

如何開始

OV 支援了不同環境、作業系統、版本、安裝方式與框架,請由本頁面選擇您喜歡的起點開始吧

您也可以直接從 Intel® Developer Cloud 來試試看,其中已經預先安裝好了各種最佳化框架、工具與函式庫,讓您可以立即體驗 OpenVINO 與 oneAPI。

 

OpenVINO model zoo

想了解 OV 有哪些立即可用方案的話,請參考 OpenVINO model zoo (原廠簡稱 OMZ),當然也要看看他所提供的各種 demo case 來挑選適合您的解決方案。OMZ 免費提供了數十款的預訓練深度訓練模型與應用案例,您可運用現成的樣板來加速完成您的深度學習專案,支援語言包括 Python 、C++ 與 OpenCV Graph API (G-API)。

OV 也針對 Python 開發者提供了 Google colab 實作,直接點選 Tutorial 頁面中各範例旁的  colab icon 就可以直接在,無須安裝任何東西即可馬上體驗許多有趣的範例,包括影像分類、認識 OV Python API、影像分割與文字偵測等等諸多實用的功能。

Intel Edge AI Certification Program

學習腳步可不能停!歡迎從 Intel Edge AI Certification Program 來免費學習更多關於邊緣運算與 AI 的相關知識,除了 AI 與邊緣運算的發展與必要性之外,您也會使用 OpenVINO 框架來進行模型最佳化以及運行於不同平台上所需的實務經驗,本計畫已提供了非常豐富的教學影片與對應的範例專案,有中文解說,快點來看看吧。

完成課程之後即可進一步取得 Intel certified Edge AI Developer 徽章,如果要取得認證徽章的話,需另外付費

參考資料

註:本文圖片皆引用自 Intel OpenVINO 網站

Intel OpenVINO™工具組 2022.3 LTS 有什麼?〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。


[ Wio Terminal ] 來組裝!智慧植栽實驗套件(DHT22版本)

$
0
0

前言

本文延續 [ [Wio Terminal] 組裝!智慧植栽實驗套件(使用DHT20) ] 一文, 差別在於改用 Grove DHT22 溫溼度感測器。完成硬體組裝之後,歡迎跟著以下兩篇教學文來實作您的智慧植栽系統喔:

在開始之前,請先準備好十字螺絲起子、剪刀(或斜口鉗)。由於部分組裝有方向的問題,為了講述方便,本文會將 Wio Terminal LCD 螢幕的那面稱為正面,而有接腳的那一面則稱之為背面,組裝時還請多注意,所有材料都可以在機器人王國商城一次買齊喔

撰寫/攝影 邱柏憲
時間 15 分鐘,輕輕鬆鬆   材料表

(購買)

  • Wio Terminal 開發板 x1
  • Grove – 溫溼度感測器(DHT22) x1
  • Grove – MOSFET模組 x1
  • Gravity: 類比式防水電容式土壤濕度感測器 x1
  • 直流沉水式抽水馬達 x1
  • PVC管(已挖洞)25公分
  • 矽膠管50公分
  • 雷射切割壓克力背板
  • 杜邦線(公公) 3條
  • Grove轉杜邦公接頭
  • 訊號線 1條
  • 金屬螺絲M2*8 2個
  • 塑膠螺絲M2*5 3個
  • 塑膠六角隔離柱205 6個
  • 塑膠M2螺帽 3個
  • 小束線帶 2條
  • 大束線帶 1條
難度 1.5(滿分5)

本文

首先看到零件圖,零件不算多,但螺絲螺帽螺柱比較小,組裝時要注意,掉了很容易找不到

請跟著以下步驟來組裝:

STEP 1

撕取壓克力背板的保護膜(如果有的話),再將Wio Termial用金屬螺絲M2*8鎖在壓克力板上。這裡要注意上下不要顛倒,且Wio Termial背面的腳位需對準壓克力挖空的部分。(抱歉,透明壓克力放在白色桌面不太清楚,請回顧上面的零件圖)

STEP 2

把剛剛的壓克力板先放到一邊。用M2*5塑膠隔離柱3個和M2*5塑膠螺帽3個如圖2所示個別鎖在MOSFET模組上。

STEP 3

把STEP1完成的壓克力拿過來轉到背面,接著將MOSFET模組利用M2*5塑膠隔離柱3個鎖於壓克力板上,要特別注意MOSFET模組的OUT和GND須朝外,完成後將壓克力板翻至正面,如下兩圖

 

STEP 4

下一步拿出DHT22模組並利用塑膠螺絲M2*5鎖在塑膠隔離柱上,完成如下圖

STEP 5

使用一條Grove線,將 MOSFET 模組接到 Wio Terminal 的左側(LCD面朝下) Grove插槽,多餘的線可以用原本的橡皮筋固定,線會比較整齊。

STEP 6

拿出Grove轉杜邦公接頭,將對應的顏色的杜邦線分別插入Wio Terminal的背面孔位,也為 Wio Terminal 腳位配置也請參考下圖。

  • 紅線接於下排右1的位置(1)->3.3V
  • 黑線接於下排右5的位置(9)->GND
  • 白線接於上排右7的位置(14)->其實不需要接,只是接了可以將線固定
  • 黃線接於上排右9的位置(18)->訊號D3

完成後正面圖如下:

STEP 7

完成後拿出PVC水管將孔離邊緣較近的那端朝上,接著將束線帶穿過PVC水管的對位的兩個孔,再穿過壓克力板上對位的兩孔,成功後拉緊束線帶以確保PVC水管不會輕易晃動。

 

上端完成後下端也是相同的做法,兩端都完成再確認水管不會輕易晃動後,將束線帶多餘的部分剪掉。

STEP 8

使用杜邦線(公公)與土壤溼度感測器的腳位連接,連接的方式如下圖。公公杜邦線的顏色可能會不同,因此請根據土壤感測器的線的顏色來對應 Wio Terminal 腳位,就是 5V、GND 與訊號等三條線。

完成後將杜邦線(公公)的另一端與Wio Terminal腳位連接,也可查詢上面的 Wio Terminal 腳位圖自行更改接線:

  • 紅線接於上排右1的位置(2)  ->5V
  • 黑線接於上排右3的位置(6)  ->GND
  • 黃線接於上排右8的位置(16)    ->D2

完成如下圖,由於線路已經有點複雜,因此繪製比較簡易的接線圖,完成後可以再檢查一次,確保接線都正確

STEP 9

拿出沉水馬達,將紅黑兩條線分別接在MOSFET模組的OUT和GND端(紅黑圈)。紅色(正極)接OUT,黑色(負極)接GND。

接完線路後再將矽膠管與沉水馬達對接,這樣馬達這一段就完成了。

矽膠管不太好裝須多用點力氣,要注意一下有沒有裝緊,紅圈處請確認有卡進去。如果太鬆,可能會在運作時鬆脫,水就會到處流啦!

STEP 10 (完成)

將土壤濕度感測器剩餘的線和較長的杜邦線用大束線帶綁在水管上,您可以視使用的環境來決定線要留多長。

使用此裝置時請依照實際情況調整線的長度,沉水馬達必須在水中使用否則容易損毀。PVC水管需插入土中一定深度否則可能整根裝置會倒下。希望大家都順利完成您的智慧植栽系統喔!

相關文章

[ Wio Terminal ] 來組裝!智慧植栽實驗套件(DHT22版本)〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

Python程式打造Google MediaPipe 深蹲偵測互動遊戲

$
0
0

2022年南港瓶蓋工廠所舉行的Maker Faire 中,在公司的攤位上,最受到矚目與歡迎的,就是Google MediaPipe 的深蹲偵測互動遊戲了,達到一定的深蹲次數不僅買徽章可以折價,還可以免費獲得摩艾石像3D列印一個,吸引了很多大小朋友,一起來看看當時熱鬧的畫面吧!

 

 

 

原理及功能說明

本次的深蹲互動專題,以這篇[累累累] Google Mediapipe 深蹲偵測,結合 Arduino 首次接觸就上手所改編的,一樣著重於偵測身體大腿及小腿的角度小於一定的數值,將深蹲次數顯示出來外,並取消了和Arduino的連線。而MediaPipe已經將人體簡化成由點和線所構成的人體線條骨架的樣貌,如下圖所示。

 

由上圖所示,就是偵測左腿點23(left_hip)到點25(left _knee)的直線距離,和點25(left _knee)到點27(left _ankle)的直線距離,兩條直線所產生的夾角小於120;右腿則是點24(right_hip)到點26(right _knee)的直線距離,和點28(right _knee)到點27(right _ankle)的直線距離,兩條直線所產生的夾角小於120。

也就是說,當左右腳膝蓋彎曲角度小於120度時,字體顏色就會變綠色。只要螢幕上顯示的字體「Left Angle」、「Right Angle」、「Pose」皆為綠色時,次數會加1。

 

再來是遊戲互動體驗,筆者使用了一顆超大的Enter鍵,當程式開始執行時,畫面會出現指示「Press Enter To Start」,Enter鍵按下去後就可以開始深蹲遊戲,此時就會開始計算深蹲次數。再按一次Enter鍵,次數會歸零,同時又會回到「Press Enter To Start」的畫面。而筆者在每次計算深蹲次數後,都會加上音效,以確保動作完成,如以下所示。

 

再來是場地架設,以當時在Maker Faire南港瓶蓋工廠場地為例,筆者使用的是羅技C270的攝影鏡頭,鏡頭距離地面高度需2公尺,距離人的身體約3公尺,才能偵測得到全身骨架畫面,由下圖所示。

 

程式撰寫

由於程式過長,故說明重要片段,如下列程式所示。

以下程式為影像訊號來源。第1行為攝影機訊號;第2行可撥放影片。

cam = cv2.VideoCapture(3)
#cam=cv2.VideoCapture("POSE1.mp4")

 

以下程式為計算身體比率函式。

def get_body_ratio(landmarks):
    r_body = abs(landmarks[mppose.PoseLandmark["RIGHT_SHOULDER"].value].y
                 - landmarks[mppose.PoseLandmark["RIGHT_HIP"].value].y)

    l_body = abs(landmarks[mppose.PoseLandmark["LEFT_SHOULDER"].value].y
                 - landmarks[mppose.PoseLandmark["LEFT_HIP"].value].y)

    avg_body = (r_body + l_body) / 2

    r_leg = abs(landmarks[mppose.PoseLandmark["RIGHT_HIP"].value].y
                - landmarks[mppose.PoseLandmark["RIGHT_ANKLE"].value].y)

    l_leg = abs(landmarks[mppose.PoseLandmark["LEFT_HIP"].value].y
                - landmarks[mppose.PoseLandmark["LEFT_ANKLE"].value].y)

    if r_leg > l_leg:

        return r_leg / avg_body
    else:
        return l_leg / avg_body

 

以下程式為計算左右腳的角度函式。

def get_knee_angle(landmarks):

    r_hip = get_landmark(landmarks, "RIGHT_HIP")
    l_hip = get_landmark(landmarks, "LEFT_HIP")

    r_knee = get_landmark(landmarks, "RIGHT_KNEE")
    l_knee = get_landmark(landmarks, "LEFT_KNEE")

    r_ankle = get_landmark(landmarks, "RIGHT_ANKLE")
    l_ankle = get_landmark(landmarks, "LEFT_ANKLE")

    r_angle = calc_angles(r_hip, r_knee, r_ankle)
    l_angle = calc_angles(l_hip, l_knee, l_ankle)


    #print(r_hip)
    m_hip = (r_hip + l_hip)
    m_hip = [x / 2 for x in m_hip]
    m_knee = (r_knee + l_knee)
    m_knee = [x / 2 for x in m_knee]
    m_ankle = (r_ankle + l_ankle)
    m_ankle = [x / 2 for x in m_ankle]

    mid_angle = calc_angles(m_hip, m_knee, m_ankle)

    return [int(r_angle),int(l_angle) ,int(mid_angle)]

 

以下程式為計算按下Enter鍵的次數,可觸發遊戲開始。

        if (read_dir_key == 13):
            sport['count'] = 0
            run_flag += 1

        if (run_flag == 2):
            run_flag = 0

 

以下程式為左腳膝蓋彎曲角度之顏色顯示。小於120度綠色,介於120~130度黃色,大於130度紅色。

而檔案POSE_entercount_sound.py中的第226~248行則為顯示右腳膝蓋彎曲角度之顏色顯示。

if knee_angles[0] < 120:

cv2.putText(preview, "Left Angle: {:d}".format(knee_angles[0]), (400, 360)
, cv2.FONT_HERSHEY_SIMPLEX, 0.8, (82, 169, 255), 4, cv2.LINE_AA)

cv2.putText(preview, "Left Angle: {:d}".format(knee_angles[0]), (400, 360)
, cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 1, cv2.LINE_AA)


elif knee_angles[0] < 130:

cv2.putText(preview, "Left Angle: {:d}".format(knee_angles[0]), (400, 360)
, cv2.FONT_HERSHEY_SIMPLEX, 0.8, (82, 169, 255), 4, cv2.LINE_AA)


cv2.putText(preview, "Left Angle: {:d}".format(knee_angles[0]), (400, 360)
, cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 255), 1, cv2.LINE_AA)

else:

cv2.putText(preview, "Left Angle: {:d}".format(knee_angles[0]), (400, 360)
, cv2.FONT_HERSHEY_SIMPLEX, 0.8, (82, 169, 255), 4, cv2.LINE_AA)

cv2.putText(preview, "Left Angle: {:d}".format(knee_angles[0]), (400, 360)
, cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 1, cv2.LINE_AA)

                               

 

決定深蹲的次數,如果次數已加1,則會撥放音效。

if status:
if avg_angle > 160:
status = False
pass_time = time.time() - start_time
start_time = 0

if 3000 > pass_time > 0.5:
sport['count'] = sport['count'] + 1

while (pygame.mixer.music.get_busy()!=1):
pygame.mixer.music.load('coin05.mp3')
pygame.mixer.music.play()

sport['calories'] = sport['calories'] + int(0.66 * pass_time)
logger(sport['count'], sport['calories'])
tmp = f"a{sport['count']}\n"
#ser.write(str.encode(tmp))
tmp = f"b{sport['calories']}\n"
#ser.write(str.encode(tmp))
#print(pass_time)


else:
if avg_angle < 120 and body_ratio < 1.2:
start_time = time.time()
status = True

 

 

在螢幕上顯示”Press Enter To Start”,以開始深蹲遊戲

cv2.putText(preview, "Press Enter To Start", (10, 80)
                               , cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 0, 0), 5, cv2.LINE_AA)

cv2.putText(preview, "Press Enter To Start", (10, 80)
                                , cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 255, 0), 2, cv2.LINE_AA)

 

以上程式傳送門-連結

下載解壓縮後,電腦中需依本文安裝Python的執行環境(操作至圖 21)。

執行程式

cd pose_detection
python POSE_entercount_sound.py

 

影片展示

以下影片為腦波弱老闆在南港瓶蓋工廠所示範的深蹲畫面,一起來看看吧!

 

Python程式打造Google MediaPipe 深蹲偵測互動遊戲〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

eCapture Depth Camera G100深度攝影機開箱與使用教學

$
0
0

前言

本文要為您開箱 eCapture Depth Camera G100深度攝影機,之前已經介紹過 eCapture G53,屬於初階款的深度攝影機,此次開箱的G100是較高階的具紅外線測距、彩色RGB影像。

撰寫/攝影 郭俊廷
時間 1小時 (不包含 Jetson Orin  前置準備時間)   材料表

 

難度 2(滿分5)

本文

硬體介紹

先看看原廠規格表,如下二圖

G53/G100 比較表

  G53 G100
主要特點 小尺寸

近距離的解析度高

寬視角

寬的深度範圍

遠距離的解析度高

應用目標 物體迴避

人臉識別

手勢辨識

SLAM

物體識別

體積測量

AMR 追踪

視角深度 50(H)x32.5(V) 100(H)x67(V)
解析度 640×480 1280×720
深度範圍 15-200cm 20-300cm
顏色輸出 灰階 RGB
傳輸規格 USB 2.0 USB 3.0

接著來看一下G100的外觀 (偷偷拿出來),本體只有 10 x 3 公分,厚度 2.7 公分,要做各種配置都很方便

打開盒子後可以看到裡面有攝影機本體跟傳輸線。

防塵膠帶,貼在鏡頭前防止入塵

 

防塵膠帶貼法如下圖

軟體操作說明 – Windows

介紹完外觀接著介紹如何使用原廠網站提供的軟體開啟攝影機。本次介紹的是DMPreview 是一款解壓縮後即可直接使用的軟體。

此款軟體分為Windows版本以及Linux版本。

Windows載點如下(以下是v1.5.4.1版本):https://github.com/eYs3D/HD-DM-Windows-SDK-Release/releases/tag/v1.5.4.1

以下是HD-DM-Windows-SDK-Release:https://github.com/eYs3D/HD-DM-Windows-SDK-Release

檔案下載完成後解壓縮,找到其中的 HD-DM-Windows-SDK-Release-1.5.4.1\bin\eSPDI_DM 裡面的DMPreview.exe (如果是32bit的電腦,請選擇 Win32 資料夾裡的 DMPreview.exe )

啟動並正確連接攝影機之後的畫面如下,左邊是RGB影像,右邊是深度影像,下面還有相關設定的操作介面。

 

軟體操作說明 – Linux

接著是Linux-SDK-Release,如果是要在Jetson系列等ARM架構裝置上執行,請下載 v5.0.1.24 以上版本才有支援:https://github.com/eYs3D/HD-DM-Linux-SDK-Release/releases/tag/v5.0.1.24

以下是HD-DM-Linux-SDK-Release:https://github.com/eYs3D/HD-DM-Linux-SDK-Release

 

檔案下載完成後解壓縮,找到其中的 HD-DM-Linux-SDK-Release-5.0.1.24/bin/。如果是Jetson系列等ARM架構的 ubuntu 系統,請執行執行DMPreview_TX2,如下圖。如果是X86的 ubuntu 系統請執行DMPreview_X86。(在 _TX2 檔案旁邊)

開啟軟體畫面如下

 

之後會再寫一篇來說明如何以 ROS2 節點的方式來存取G100攝影機的景深影像,請各位繼續關注我們BLOG喔!

相關文章

 

 

eCapture Depth Camera G100深度攝影機開箱與使用教學〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

NVIDIA Jetson專案 製作樂高輸送帶 執行自動光學檢測 AOI(Automated Optical Inspection)

$
0
0

在2022年的南港瓶蓋工廠Maker Faire所展出RK-AOI樂高自動光學檢測專題,受到很多大朋友小朋友的喜愛,吸引了很多好奇的民眾來觀看,紛紛都來詢問是如何透過樂高與微控器和reComputer來做結合,本篇就來分享這三者的協作溝通,以及原理說明。

 

RK-AOI光學檢測專題設備介紹

 

由以下設備所組成:

 

將不同顏色的積木放置輸送帶中,IR感測器偵測到後,便會停止馬達,使得攝影機能夠辨識積木。當攝影機辨識完畢,輸送帶便會重新啟動運輸積木,撥桿也會開始分類。流程圖如下。

 

嵌入式系統和MCU之溝通

再來是reComputer和Link7697的溝通,是藉由UART的模式來做溝通,這類的溝通模式不限定reComputer和Link7697,只要是嵌入式系統和MCU(Microcontroller)搭配即可,如下圖所示:

 

即是reComputer和Link7697之間,是藉由一條Micro USB傳輸線來溝通,如下圖所示。

 

 

先說明reComputer接那些設備,如下圖所示:

 

樂高PF馬達控制

接下來是樂高PF馬達控制。筆者是透過L298N馬達驅動板,接上樂高PF馬達來控制,樂高PF馬達配線說明,如下圖所示。

 

c1和c2的線可以配合Arduino程式,來控制樂高PF馬達的正/反轉。也就是說,馬達轉向若有錯,是可以直接互換c1和c2位置,或者改Arduino程式。

 

LinkIt7697與其他感測器的腳位說明

再來以下說明的是LinkIt7697擴充板與感測器及樂高PF馬達腳位接法,如下圖所示。

 

以及LinkIt7697擴充板和reComputer溝通的接線圖,是為了控制伺服馬達撥桿。

 

 

機器學習軟體

那重點來了,輸送帶AI識別積木顏色的軟體是用甚麼甚麼呢?筆者是透過微軟的Lobe.ai,不僅免費使用,還可直接安裝在電腦中,且可離線收集資料、訓練、推論及匯出模型。

 

 

有鑑於之前有使用過Google Teachable Machine做過類似顏色辨識的專題,但是效果卻差強人意,於是選擇Lobe.ai。

其最大優點是Lobe.ai有提供Optimize for Speed Optimize for Accuracy 兩種優化模型。前者精度低,辨識率差,但辨識速度快,模型較小,適合資料集外型特徵差異大時使用;後者精度高,辨識率佳,但模型較大,適合資料集特徵外型差異小時用。本專案便選了Optimize for Accuracy ,在真實使用上除了在辨識樂高積木顏色時需要等10~20秒,時間稍久時,其辨識率也非常準確。

 

控制介面說明

筆者設計了可以辨識樂高積木顏色的畫面,以及控制伺服馬達撥桿,和馬達轉速控制的控制介面,如下圖所示。

 

以上是本次的分享,如果對製作輸送帶方面的專題想更多了解,歡迎聯繫我們。

 

NVIDIA Jetson專案 製作樂高輸送帶 執行自動光學檢測 AOI(Automated Optical Inspection)〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

安裝Discord社群平台伺服器-從0到加入CAVEDU學習頻道

$
0
0

為了提供更良好的服務,CAVEDU教育團隊已經在Discord開了伺服器囉~

以下教大家如何註冊和加入本團隊的Discord伺服器吧~

分成下列四個步驟:

  • 下載並安裝Discord軟體
  • 建立Discord帳號
  • 到信箱收驗證碼
  • 加入CAVEDU伺服器

 

下載並安裝Discord軟體

1.請到Discord網站下載Windows版本的軟體,也可以在瀏覽器直接開啟Discord,連結:

https://discord.com/download

 

 

2.如果你選擇安裝Windows版本的軟體,在安裝的過程中,若跟筆者一樣,遇到目前無法連接到SmartScreen篩選工具

則按下執行即可

 

建立Discord帳號

1.新手上路,註冊Discord時,需先註冊帳號

 

2.填寫相關資料

 

3.註冊完成,若出現安全性警訊,則按允許存取(此為Windows版本)

 

4.驗證是否為人類

 

到信箱收驗證碼

1.接收驗證碼

上方會有綠色橫條,顯示到註冊的信箱接收驗證碼。若沒有找到,則可以去垃圾郵件尋找,或在綠色橫條中按下重新傳送。

 

2.註冊成功

上方會有綠色橫條消失,代表註冊成功。

 

加入CAVEDU伺服器

1.按下左邊欄位的”+“,再按加入伺服器

 

2.在欄位輸入CAVEDU的邀請連結

在邀請連結欄位輸入:https://discord.gg/5z9yg96VuT ,再按下加入伺服器

 

3.加入成功

看到歡迎來到CAVEDU教育團隊的標題,則代表成功加入本團隊伺服器囉。我們會不定期地在Discord上分享相關活動,平台上見。

安裝Discord社群平台伺服器-從0到加入CAVEDU學習頻道〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

YOLO v5, v7 與 v8 物件偵測模型效能比較,執行於 Jetson AGX Orin 與 RTX 4070 Ti

$
0
0

物件偵測是電腦視覺技術中一項極為重要且快速發展的領域,而 YOLO (You Only Look Once) 則是物件偵測中最熱門的框架之一。目前最新的版本為 YOLO v5、v7 與 v8,本文將比較這幾個版本在 NVIDIA Jetson AGX Orin 32GB 邊緣運算裝置 (目前市面上最強大的嵌入式 AI 電腦),以及 RTX 4070 Ti 顯示卡上的執行效能。歡迎詳閱本文,找出哪一款 YOLO 最符合您的需求喔!

註:本文經ZED同意之後翻譯(原文連結)

YOLO v5, v7 與 v8 在 Jetson AGX Orin 上的執行效能

每當有新的 YOLO 問世,我們心中的第一個問題總是:

要不要升級到最新的版本?

多數情況下,各類 benchmark 都是在 A100 這類高階 GPU 上來測試,與實際用於生產的嵌入式 GPU 相差甚遠。再者,即便大家都知道 TensoRT 可有效對大多數的神經網路進行最佳化,但實際上很少用到。最後,將 YOLO v7 與 Ultralytics v5 / v8 進行比較的 benchmark 也不太多。

因此,Stereolabs (ZED景深攝影機製造商) 於2023年初,針對 YOLO v5、YOLO v7 與 YOLO v8 在 AGX Orin 推出了完整的 COCO benchmark (與實際延遲時間進行比較),使用 TensorRT 8.4 與 JetPack 5。結果如下:

另一方面,也針對 NVIDIA Jetson AGX Orin (JetPack 5) 與 RTX 4070 Ti (Batch 1, TRT8.4, FP16) 上以 640 解析度來執行所有 YOLOv8、YOLOv5 與 YOLOv7 模型,詳細結果如下:

MODEL AP AP0.5 AGX ORIN (FPS) RTX 4070 TI (FPS)
v5n 28 45.7 370 934
v8n 37.3 52.5 383 1163
v7-tiny 37.4 55.2 290 917
v5s 37.4 56.8 277 877
v8s 44.9 61.8 260 925
v5m 45.4 64.1 160 586
v8m 50.2 67.2 137 540
v5l 49 67.3 116 446
v7 51.2 69.7 115 452
v8l 52.9 69.8 95 391
v5x 50.7 68.9 67 252
v7x 52.9 71.1 77 294
v8x 53.9 71.0 64 236

以下是一些有趣的結果:

  • 就相同執行階段而言,所有 v8 模型的 mAP 都比 v5 提升了 4 到 9 左右。
  • v8m 與 v8l 在 mAP(mean Average Precision) 與推論速度上已優於 v5l 與 v5x。
  • 就準確率與推論速度來說,v8n 是最佳的輕量化模型。
  • YOLO v8 (目前為止) 尚未提供以 1280 解析度來訓練的模型,因此在可小幅降低推論速度但講求高解析度的情境下,YOLO v7 仍是推論的最佳方案。

將 YOLO 結合數位雙生技術( Digital Twin)

新款的 YOLOv8 相較於傳統的 YOLOv5 物件偵測器有長足的改進。已從諸多產業看到一股明顯的趨勢,就是將景深影像整合 YOLO 技術,例如 ZED 2i 景深攝影機。這款攝影機可讓在空間中定位與追蹤人體/物體的成效更上一層樓。以下影片是將 YOLO 整合 ZED 2i 景深影像 (其中用到了 ZED SDK) 的即時數位雙生影片,也可以看到物體的 3D 邊界框(bounding box):

總結

由上可知,本文所提的三種  YOLO 版本 (v5, v7, v8) 在 Jetson Orin 上都有相當亮眼的表現。但根據本文測試,YOLO v8 看起來是其中成效最好的一款。不論是執行於 Orin 與 RTX 4070 Ti,YOLO v8 的所有變體針對 COCO 資料集的 mAP 都優於 v5。如果您還在尋找某一款又快又可靠的物件偵測框架的話,YOLO v8 應該是您的最佳選擇。

藉由在 ZED SDK 中加入自定義物件,您就能把新款的 YOLO v8 搭配 ZED 景深攝影機來取得物體的 3D 邊界框。

YOLO v5, v7 與 v8 物件偵測模型效能比較,執行於 Jetson AGX Orin 與 RTX 4070 Ti〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

工業電腦 PE1000N-開箱使用教學,支援4G LTE!

$
0
0

前言

CAVEDU 已有多篇文章介紹 NVIDIA Jetson系列邊緣裝置與相關應用,本文要介紹 RK-ASUS 工業電腦 PE1000N,目前我們提供了 Jetson Nano 版本以及 Jetson Xavier NX 等兩種運算模組版本來販售。
PE1000N除了有工業電腦等級無風扇設計的外殼以外,也支援了M.2 E key的Wi-Fi模組以及M.2 M key的SSD插槽,還支援了Mini PCIe插槽的4G/LTE模組可以使用。另外還有兩個SMI卡插槽以及一個Micro SD記憶卡插槽可以使用。

撰寫/攝影 郭俊廷
時間 1小時 (不包含 PE1000N 系統設定時間) 材料表
  • RK-ASUS 工業電腦 PE1000N配500GB固態硬碟(搭載NVIDIA Jetson Nano運算模組)
  • RK-ASUS 工業電腦PE1000N全配版(搭載NVIDIA Jetson Xavier NX運算模組)
  • 4G LTE/GPS帶天線(EG25-G(for Global))
  • Linux作業系統電腦 x1
  • 鍵盤滑鼠 x1

 

難度 2(滿分5)

本文

首先看到外箱(香~),ASUS IoT 很顯眼:

裡面會有 PE1000N本體以及一個盒子,本體的正面與背面如下圖所示

盒子底下還有個小盒子

打開後,可以看到 WIFI 天線、DC電源轉接頭與支架片。

拆除原有的 M.2 E key 的 Wi-Fi模組

因為這款 PE1000N Jetson Nano版本無法同時安裝使用M.2 E key的Wi-Fi模組與M.2 M key的固態硬碟,因為資源被M.2 E key的Wi-Fi模組占用了。

如果同時需要使用固態硬碟與Wi-Fi,建議改為使用USB外接的Wi-Fi模組。

另外:PE1000N Jetson Nano版本才會有接頭占用此問題,PE1000N Jetson Xavier NX版本不會有此問題。

首先先把PE1000N背面朝上,拆除下圖六個螺絲才可以安裝SSD。

接著把SSD裝上去,如下圖紅框

安裝好SSD之後接著拆除M.2 E key的Wi-Fi模組,首先慢慢移除絕緣膠布 (位置如下圖紅框)

再來移除M.2 E key的Wi-Fi模組的固定螺絲跟天線(螺絲位置如下圖紅框)

Wi-Fi模組拆下來之後就收起來,最後要記得將Wi-Fi模組的天線整理好才不會不小心跟其他電路短路。

電源

接著介紹如何接上電源,在小盒子裡面有一個綠色的DC電源轉接頭,我們使用的是電源供應器是輸出直流19V / 3.42A / 65W。

各接頭說明

看到 PE1000N 的背面,由左至右分別是電源接頭、兩個RJ45網路孔、HDMI輸出、三個USB3.0孔,最右邊的是電源按鈕。

雖然大家可能不陌生,但電源轉接頭的接法還是多留意一點比較好。黑色線接到 V- 端子,紅色線則是 V+ 端子 (如下圖)。

靠近電源接頭那一側還有記憶卡與SIM卡插槽,但要先把螺絲移除才可以看到(位置如下圖紅框)。

卸下蓋子之後,由左至右依序是記憶卡插槽、序列埠輸出、燒錄連接輸出、SIM卡1插槽、SMI卡2插槽。

 

更多的硬體相關資訊可以參考以下 PE1000N 原廠資料表:

LTE 模組

以下是選配的LTE模組(並沒有包含在 PE1000N 中,需要另外加購),兩根扁平狀的是LTE天線,右邊較大的五邊形的是GPS模組。

LTE模組的安裝方法如下,請記得使用Wi-Fi模組以外的接頭(大小不同)。

天線的接法及順序可以參考我的接法並且貼上標籤貼紙紀錄哪個天線孔位對應哪個腳位(ANT2跟ANT5是LTE天線,ANT4是GPS天線):

 

更多的LTE模組資料可參考 Quectel_EC25系列_硬體設計手冊

硬體的介紹到這邊告一段落,LTE模組通訊的相關設定請到軟體安裝說明查看。

軟體安裝

接著要介紹如何安裝 Jetson 載板系統,再將系統移動到SSD。首先PE1000N裡面已經有內建安好的Ubuntu作業系統(但沒有安裝好Jetpack相關套件),如果想要使用Jetpack相關套件需要自行安裝或是使用NVIDIA SDK Manager來進行安裝。

  • PE1000N Jetson Xavier NX版本可參考本文,使用NVIDIA SDK Manager將系統安裝到SSD裡面。
  • PE1000N Jetson Nano版本想將原本內建的系統或是新安裝好的移動到SSD可參考本文將reComputer Jetson-10-1-H0「系統」從eMMC轉移至SSD固態硬碟的部分。
  • 系統都安裝完成之後,如果是PE1000N Jetson Nano 版本並搭配 USB外接的EDIMAX AC1200 雙頻長距離USB 3.0無線網路卡,安裝驅動程式教學請參考本文

LTE模組通訊設定

首先在 PE1000N 的 Ubuntu 作業系統中,找到設定 -> 網路:

接著選擇行動寬頻,將其打開(啟用):

點選加入新連線之後,需要接續設定行動寬頻連線:

設定連線後,會需要輸入行動網路的名稱等資訊,點選下一步:

選擇所在國家,在此選擇”臺灣”

再來要選擇電信供應商,由於本文作者使用中華電信,因此選擇第一個 “Chunghwa Telecom(emome)“,其他電信請修改為對應供應商即可:

  • Chunghwa Telecom(emome):中華電信
  • Far EasTone:遠傳電信
  • TW Mobile:台灣大哥大

接著選擇計費方案,在此選擇”預設“,後續會自動選擇方案的APN。

確認設定無誤之後,點選”套用“。

最後把網路選定為方才設定好的網路,稍等一下等到系統取得 IP 之後,就可以順利使用4G LTE上網了!

本文到此結束,更多的PE1000N資料請參考ASUS網站:

https://www.asus.com/tw/networking-iot-servers/aiot-industrial-solutions/intelligent-edge-computer/pe1000n/

 

 

工業電腦 PE1000N-開箱使用教學,支援4G LTE!〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。


Wio Terminal 小技巧:中斷與 LCD 折線圖

$
0
0

前言

Wio Terminal 自帶的LCD螢幕讓我們檢視資料更容易了。藉由將數值顯示在螢幕上比單純使用Serial monitor更方便,也能在沒有電腦的時候使用。但螢幕的大小有限,因此需要有翻頁功能,此時就需要使用中斷(Interrupt),這也是開發 Arduino 這類 MCU 程式時的重要技巧。

本文

使用中斷(Interrupt)的好處是程式會直接停下當下的動作,優先執行中斷事件所指定的程式碼,這與 delay() 不同,且可以避免程式執行到一半時按下按鈕沒有反應。

底下是使用兩種方式時的簡單流程圖:

 

Wio Terminal可使用五向開關以及上面的ABC三個按鈕觸發中斷,
注意:由於五向開關和按鈕A的中斷連接腳位是一樣的,同時宣告會導致兩個都無法使用,只能擇一宣告

以下是中斷的宣告以及使用方式:

//設定為上拉或下拉電阻
pinMode(WIO_5S_UP, INPUT_PULLUP);

//開啟觸發腳位
//button_handler_up 代表要執行的函式名稱
attachInterrupt(digitalPinToInterrupt(WIO_5S_UP),  button_handler_up, FALLING);

//觸發後的執行動作
void button_handler_up() {
    Serial.println("button Up");
    delay(100);
    mode = 1;
}

上述程式碼中,WIO_5S_UP 指的是 Wio Terminal 五向開關的向上按鈕,此外還有WIO_5S_DOWN, WIO_5S_LEFTWIO_5S_RIGHTWIO_5S_PRESS2 等同一個按鈕的不同事件。

另外還有三個按鈕可用:WIO_KEY_AWIO_KEY_BWIO_KEY_C,如下圖

 

Arduino 的 attachinterrupt 指令的詳細介紹請點我,如果只需使用基礎功能可以使用本文的範例程式碼即可。更多細節設定就請自行參考連結中的說明。

Wio temrinal 中斷範例

以下範例使用Wio Terminal內建的光感測器、加速度和聲音感測器以及五向項開關的右、下、左,當然還有顯示用的LCD,由於都是內建的元件,因此額外接線,Wio Terminal 拿出來就好,非常方便。

此外本範例程式也會使用到 seeed 的 line_chart 範例,筆者覺得該範例相當實用,可以輕鬆把各類資料以折線圖的方式顯示於 Wio Terminal 內建的 LCD。

TFT_eSPI tft;
TFT_eSprite spr = TFT_eSprite(&tft);
tft .begin();
tft.setRotation(3);
spr.createSprite(TFT_HEIGHT, TFT_WIDTH);
spr.setRotation(3);
spr.setTextColor(TFT_BLACK, TFT_BLACK);
spr.setTextSize(2);

if (data.size() == MAX_SIZE) {
//當資料筆數太多時將最舊一筆的數值丟棄
data.pop();
}
data.push(val); //將最新的一筆資料寫入

//設定圖表標題部分,此處是聲音感測器
auto header = text(0, 0)
.value("Microphone Reading")
.align(center)
.color(TFT_WHITE)
.valign(vcenter)
.width(spr.width())
.thickness(2);

header.height(header.font_height(&spr) * 2);
header.draw(&spr);

//折線圖設定
//這重點在於.value(data) 中的data
//就是希望由折線圖所繪製的數值
//這些數值應先儲存於陣列中

auto content = line_chart(20, header.height());
content
.height(spr.height() - header.height() * 1.5)
.width(spr.width() - content.x() * 2)
.based_on(0.0)
.show_circle(false)
.max_size(MAX_SIZE)
.value(data)
.color(TFT_RED)
.backgroud(TFT_WHITE)
.draw(&spr);

最後分別是三種感測器的畫面顯示,可使用五向開關的左、下、右來即時切換。希望本文分享的功能能對大家有幫助,完整程式碼列於文末。

complete code - wio terminal interrupt demo
#include"LIS3DHTR.h" //加速度感測器函示庫
#include <Wire.h>
#include <TFT_eSPI.h>
#include "seeed_line_chart.h" //Wio Termainl圖表函示庫
#define MAX_SIZE 30
LIS3DHTR<TwoWire> lis;

int mode;
int brightness;

doubles data;
doubles accelerator_readings[3];

//觸發啟動後所要執行的動作
void button_handler_down() { Serial.println("button Down");delay(100); mode = 1;}
void button_handler_left() { Serial.println("button left");delay(100); mode = 2;}
void button_handler_right() { Serial.println("button Right");delay(100); mode = 3;}

/*其他觸發
void button_handler_up() { Serial.println("button Up"); delay(100); mode = 4;}
void button_handler_press() { Serial.println("button Press");delay(100); mode = 5;}
void button_handler_B() { Serial.println("button Press");delay(100); mode = 6;}
void button_handler_C() { Serial.println("button Press");delay(100); mode = 7;}
*/

TFT_eSPI tft;
TFT_eSprite spr = TFT_eSprite(&tft);

void setup() {
Serial.begin(9600);
lis.begin(Wire1);
lis.setOutputDataRate(LIS3DHTR_DATARATE_25HZ);
lis.setFullScaleRange(LIS3DHTR_RANGE_2G);

//設定五項開關為上拉或下拉電阻

pinMode(WIO_5S_DOWN, INPUT_PULLUP);
pinMode(WIO_5S_LEFT, INPUT_PULLUP);
pinMode(WIO_5S_RIGHT, INPUT_PULLUP);

/*其他設定
pinMode(WIO_5S_UP, INPUT_PULLUP);
pinMode(WIO_5S_PRESS, INPUT_PULLUP);
pinMode(WIO_KEY_B, INPUT_PULLUP)
pinMode(WIO_KEY_C, INPUT_PULLUP)
*/

//設定按鈕被如何按下時會啟動觸發,有按下或按下後放開

attachInterrupt(digitalPinToInterrupt(WIO_5S_DOWN), button_handler_down, FALLING);
attachInterrupt(digitalPinToInterrupt(WIO_5S_LEFT), button_handler_left, FALLING);
attachInterrupt(digitalPinToInterrupt(WIO_5S_RIGHT), button_handler_right, FALLING);

/*其他觸發設定
attachInterrupt(digitalPinToInterrupt(WIO_5S_UP), button_handler_up, FALLING);
attachInterrupt(digitalPinToInterrupt(WIO_5S_PRESS), button_handler_press, FALLING);
attachInterrupt(digitalPinToInterrupt(WIO_KEY_B), button_handler_B, FALLING);
attachInterrupt(digitalPinToInterrupt(WIO_KEY_C), button_handler_C, FALLING);
*/


//LCD顯示設定
tft .begin();
tft.setRotation(3);
spr.createSprite(TFT_HEIGHT, TFT_WIDTH);
spr.setRotation(3);
spr.setTextColor(TFT_BLACK, TFT_BLACK);
spr.setTextSize(2);
delay(500);
}

void loop() {


//根據觸發後更改mode的數字決定要做的動作
switch(mode){
//下
case 1 :
spr.drawString("2", 40, 40);
chartMicro();
break;

//左
case 2 :
chartAccel();
break;

//右
case 3 :
chartLight();
break;


/*....
case 4 :
執行動作
break
*/
}
//輸出畫面
spr.pushSprite(0, 0);
}


//光感值以圖表顯示
void chartLight()
{
brightness = analogRead(WIO_LIGHT);
spr.fillSprite(TFT_WHITE);
if (data.size() > MAX_SIZE)
{
data.pop(); // this is used to remove the first read variable
}
data.push(brightness); // read variables and store in data

// Settings for the line graph title
auto header = text(0, 0)
.value("Light Sensor Readings")
.align(center)
.valign(vcenter)
.width(spr.width())
.thickness(2);

header.height(header.font_height(&spr) * 2);
header.draw(&spr); // Header height is the twice the height of the font

// Settings for the line graph
auto content = line_chart(20, header.height()); //(x,y) where the line graph begins
content
.height(spr.height() - header.height() * 1.5) // actual height of the line chart
.width(spr.width() - content.x() * 2) // actual width of the line chart
.based_on(0.0) // Starting point of y-axis, must be a float
.show_circle(false) // drawing a cirle at each point, default is on.
.value(data) // passing through the data to line graph
.max_size(MAX_SIZE)
.color(TFT_RED) // Setting the color for the line
.backgroud(TFT_WHITE)
.draw(&spr);
delay(100);
}

//加速度值以圖表顯示
void chartAccel()
{
spr.fillSprite(TFT_WHITE);

if (accelerator_readings[0].size() == MAX_SIZE) {
for (uint8_t i = 0; i<3; i++){
accelerator_readings[i].pop(); //this is used to remove the first read variable
}
}

accelerator_readings[0].push(lis.getAccelerationX()); //read variables and store in data
accelerator_readings[1].push(lis.getAccelerationY());
accelerator_readings[2].push(lis.getAccelerationZ());
// Settings for the line graph title
auto header = text(0, 0)
.value("ACCEL Sensor Readings")
.align(center)
.valign(vcenter)
.width(spr.width())
.thickness(2);

header.height(header.font_height(&spr) * 2);
header.draw(&spr); // Header height is the twice the height of the font

// Settings for the line graph
auto content = line_chart(20, header.height()); //(x,y) where the line graph begins
content
.height(spr.height() - header.height() * 1.5) // actual height of the line chart
.width(spr.width() - content.x() * 2) // actual width of the line chart
.based_on(0.0) // Starting point of y-axis, must be a float
.show_circle(false) // drawing a cirle at each point, default is on.
.value({accelerator_readings[0],accelerator_readings[1], accelerator_readings[2]}) // passing through the data to line graph
.max_size(300)
.color(TFT_BLUE, TFT_RED, TFT_GREEN) // Setting the color for the line
.backgroud(TFT_WHITE)
.draw(&spr);
delay(10);
}

//聲音感測器以圖表顯示
void chartMicro()
{
spr.fillSprite(TFT_WHITE);

int val = analogRead(WIO_MIC);

if (data.size() == MAX_SIZE) {
data.pop();//this is used to remove the first read variable
}
data.push(val); //read variables and store in data

//Settings for the line graph title
auto header = text(0, 0)
.value("Microphone Reading")
.align(center)
.valign(vcenter)
.width(spr.width())
.thickness(2);

header.height(header.font_height(&spr) * 2);
header.draw(&spr); //Header height is the twice the height of the font

//Settings for the line graph
auto content = line_chart(20, header.height()); //(x,y) where the line graph begins
content
.height(spr.height() - header.height() * 1.5) //actual height of the line chart
.width(spr.width() - content.x() * 2) //actual width of the line chart
.based_on(0.0) //Starting point of y-axis, must be a float
.show_circle(false) //drawing a cirle at each point, default is on.
.max_size(MAX_SIZE)
.value(data) //passing through the data to line graph
.color(TFT_RED) //Setting the color for the line
.backgroud(TFT_WHITE)
.draw(&spr);
delay(50);
}

 

 

 

 

 

 

 

 

 

 

 

 

最後分別是三種感測器的畫面顯示,可使用五項開關的左下右及時切換觀察

 

加速度感測

 

光感測器

聲音感測器

 

 

最後希望這次所分享的功能能對做專題或是作品時有幫助,由於整支範例程式有點長,程式碼就不完整貼於文中,而是附在底下。

 

Wio Terminal 小技巧:中斷與 LCD 折線圖〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

RK-reComputer J2022 (安裝Jetson Xavier NX 16GB運算模組) 使用YOLOv5 進行物件辨識

$
0
0

前言

之前已介紹過 Jetson 平台如何安裝與執行 YOLOv4 物件辨識框架,本文要介紹 YOLOv5 在 RK-reComputer J2022,也就是16GB記憶體的Jetson Xavier NX 的執行效果如何。

撰寫/攝影 郭俊廷
時間 2小時 材料表

 

難度 3(滿分5)

本文

 

安裝所需套件

首先您才剛安裝好 Jetson 的系統,請先更新系統以及安裝 pip git 等套件,如果是使用 CAVEDU 為您安裝好的RK-reComputer J2022(安裝Jetson Xavier NX 16GB運算模組)套件,則相關內容都已經更新好了,可以直接執行。

本文所用的 RK-reComputer J2022(安裝Jetson Xavier NX 16GB運算模組)是使用Jetpack4.6版本。

以下是系統更新及安裝指令:

sudo apt-get update && sudo apt-get -y upgrade
sudo apt-get install python3-pip
sudo apt-get install git-all -y

接著下載YOLOv5 的Github並移動到資料夾裡面:

git clone https://github.com/ultralytics/yolov5.git
cd ~/yolov5

可以看到 yolov5 目錄裡面有個requirements.txt,那是安裝yolov5所需相關套件的檔案清單。在此要先把一些檔案註解掉不要安裝,否則會出現錯誤無法正常安裝。
opencv已包含在Jetpack裡面,torch 跟 torchvision 在Jetson載板無法使用pip安裝,setuptools 與 wheel 則是不能安裝他指定的版本。

請在該列語法最前面加上 # 字號就可以註解了,以下五個套件請記得前面都加上# 字號註解掉就不會安裝了(如下圖紅框所示)

# opencv-python>=4.1.1
# torch>=1.7.0  # see https://pytorch.org/get-started/locally (recommended)
# torchvision>=0.8.1
# setuptools>=65.5.1 # Snyk vulnerability fix
# wheel>=0.38.0 # Snyk vulnerability fix

安裝缺失的套件

sudo apt install -y libfreetype6-dev

安裝YOLOv5所需套件

pip3 install -r requirements.txt

最後要補安裝PyTorch v1.10.0 以及 Torchvision v0.11.1
以下是 JetPack 4.6 所需要 PyTorch v1.10.0以及Torchvision v0.11.1
PyTorch 所對應的Torchvision版本跟下載點如下:

安裝 PyTorch v1.10.0

PyTorch是一個由Facebook開發的開源深度學習框架,提供了用於構建運算圖的Python API,可以有效地進行梯度計算、最佳化與微分等重要運算。PyTorch 已被廣泛用於深度學習領域的研究和應用。

install pytorch 1.10.0
cd ~
sudo apt-get install -y libopenblas-base libopenmpi-dev
wget https://nvidia.box.com/shared/static/fjtbno0vpo676a25cgvuqc1wty0fkkg6.whl -O torch-1.10.0-cp36-cp36m-linux_aarch64.whl
pip3 install torch-1.10.0-cp36-cp36m-linux_aarch64.whl

安裝完可以使用以下指令查看pytorch版本

check torch version
python3 -c "import torch; print(torch.__version__)"

安裝 torchvision v0.11.1

torchvision 是 PyTorch的一個影像處理與機器視覺函式庫。它提供了各種常用的影像資料集集,包括MNIST、CIFAR-10、ImageNet等,也支援影像預處理和增強,如裁剪、縮放、旋轉、翻轉、顏色調整等。此外,torchvision 還包括一些經典的機器視覺預訓練模型,如AlexNet、ResNet、VGG等,可以快速用於圖像分類、物體檢測、分割等任務。

安裝 torchvision 需要十分鐘左右,請稍等:

install torchvision
sudo apt install -y libjpeg-dev zlib1g-dev
git clone --branch v0.11.1 https://github.com/pytorch/vision torchvision
cd torchvision
sudo python3 setup.py install

查看torchvision版本:

check torchvision version
python3 -c "import torchvision; print(torchvision.__version__)"

都安裝好了就會顯示如下對應的版本。

執行YOLOv5的範例程式

使用 yolo Github 所提供的範例程式 detect.py,範例程式主要會用到的參數如下:

  • --source:圖片、影片目錄或是 0 開啟攝影機
  • --weights:權重,有s、m、l、x之分

接著執行 detect.py,我們先使用官網提供的範例圖片來測試:

移動到 /yolov5 資料夾,接著辨識 /yolov5/data/images/ 中的圖片,可自由換成其他圖片路徑即可。

run yolo to inference single image
cd ~/yolov5
python3 detect.py --source data/images/ --weights weights/yolov5s.pt

最後是用攝影機來做即時辨識的效果,一樣是在 /yolov5 資料夾底下執行以下指令(--source 0 代表使用攝影機編號video 0的攝影機):

run real-time yolo inference
cd ~/yolov5
python3 detect.py --weights yolov5s.pt --source 0

本文介紹到此結束,yolo 作為近年非常熱門的物件辨識框架,不但準確率高而且執行速度相當好。希望大家都順利根據本文說明在您的 Jetson NX 安裝成功喔!

參考資料

 

RK-reComputer J2022 (安裝Jetson Xavier NX 16GB運算模組) 使用YOLOv5 進行物件辨識〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

最新 NVIDIA Jetson Orin Nano 開發者套件,入門級 AI 的新基線

$
0
0

NVIDIA Jetson Orin Nano

NVIDIA 在 GTC 2023 大會 發表了最新的 NVIDIA Jetson Orin Nano 開發者套件。相較前一代 Jetson Nano,Jetson Orin Nano 8GB 模組採用NVIDIA Ampere 架構GPU,擁有 1024 個 CUDA 核心、32 個第三代 Tensor 核心和 6 核 ARM CPU,可實現多個平行 AI 應用管道和高性能推論。開發者套件載板具備各種接頭,包括兩個 MIPI CSI 攝影機接頭,支持多達四個通道的相機模組,從而實現比以前更高的解析度與幀率。

NVIDIA Jetson Orin Nano Developer Kit

新的 Jetson Orin Nano 開發者套件以 80 倍的性能提高了入門級 AI 開發的門檻,可執行任何類型的現代 AI 模型,包括 transformer 和高級機器人模型。與上一代 Jetson Nano 相比,它不僅大幅提升了 AI 性能,而且 Jetson Orin Nano 還提供了 5.4 倍的 CUDA 計算、6.6 倍的 CPU 性能和 50 倍的每瓦性能,為新一代入門級 AI 機器人、智慧無人機與智慧視覺系統奠定新基準。

Graph showing performance and efficiency comparison between NVIDIA Jetson Orin Nano and NVIDIA Jetson Nano.

Jetson Orin Nano 定價 499 美元,機器人王國即將推出預購,敬請期待喔!

* 上述資訊接整理自 NVIDIA Jetson Orin Nano 網站

開箱

話說 CAVEDU 有位 NVIDIA Jetson AI 大使(aka 阿吉老師),因此率先拿到也是很合理的~ 那就來開箱吧

外盒比上一代 Jetson Nano 大了將近一倍,黑色的外觀很神祕典雅 (也容易沾指紋QQ)

黑色外盒抽出,有個對開的盒子,由圖示可知左側為電源,右側為開發套件本體

燈燈,沒錯!

看到本體,風扇變成標準配備,相關接頭相當完整,所有 USB 接頭皆為 USB 3.2。另外請注意外接實體螢幕改為 display port,不再使用 HDMI。另可在左側看到兩個 CSI 相機匯流排,看來可以接很多很多的攝影機,Orin Nano 也對本身的算力很有信心。

背面則可看到 M.2 用於外接 SSD 硬碟。

規格

細節規格引用自 Orin Nano 網站,規格表如下

運算模組規格

模組 NVIDIA Jetson Orin Nano 8 GB 模組
GPU 具有 1024 個 NVIDIA CUDA 核心和32 個 Tensor 核心的NVIDIA Ampere 架構
CPU 6 核 Arm Cortex-A78AE v8.2 64 位元 CPU
1.5 MB L2 / 4 MB L3
記憶體 8 GB 128 位元 LPDDR5,68 GB/秒
儲存 通過 microSD 插槽外接
通過 M.2 Key M 外接 NVMe
電源  7 – 15 w

載板規格

相機 2 個 MIPI CSI-2 相機接頭
M.2 Key M x4 PCIe Gen3
M.2 Key M x2 PCIe Gen3
M.2 Key E PCIe (x1)、USB 2.0、UART、I2S 和 I2C
USB A 型:4 個 USB 3.2 Gen2

C 型:1 個,用於 debug 與裝置模式

網路 1x GbE 接頭
顯示  DisplayPort 1.2 (+MST)
microSD 插槽 支援 SDR104 模式的 UHS-1 卡
其他 40-pin Header (UART, SPI, I2S, I2C, GPIO)

12-pin button header

4-pin 風扇接頭

DC 電源

方面 100 mm x 79 mm x 21 mm(載板、底板、模組與和散熱風扇)

開機

由於 NVIDIA 寄過來就已經是可以開機的狀態,且本文編寫時尚未看到針對 Orin Nano 的 img 檔載點更新,所以就請大家耐心等等囉。

常用的 Jetson Inference 最近也更新了,推出了背景移除與動作辨識兩個新的應用,加上原本的影像分類等,Jetson 平台可用的機器視覺方案愈來愈多了!

敬請期待後續更新,作為教學推廣單位,也很期待 Jetson DLI 課程與 Jetbot 也進一步更新!

相關資料

 

最新 NVIDIA Jetson Orin Nano 開發者套件,入門級 AI 的新基線〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

使用Jetson Xavier NX執行 NVIDIA DLI 深度學習機構課程

$
0
0

前言

NVIDIA 深度學習機構 (DLI) 線上課程中,有兩門與 Jetson Nano 有關的課程,分別是 [透過 Jetson Nano 開發人工智慧應用] 以及 [Building Video AI Applications at the Edge on Jetson Nano],CAVEDU 已經也舉辦多次線上直播來協助大家通過證照。

課程內容使用最入門的 Jetson 平台:Jetson Nano,因此有網友詢問如何使用 Jetson Xavier NX 來執行本課程內容,本文將介紹安裝方法以及可能碰到問題的解決方法。

撰寫/攝影 郭俊廷
時間 2小時 材料表

 

難度 3(滿分5)

本文

本文用的是 RK-reComputer J2011套件,也就是Jetson Xavier NX 8G版本,來說明如何執行 NVIDIA DLI 上述兩張證照的課程範例。

首先當然要先裝好 Jetson Xavier NX 的作業系統,請參考本文教學。安裝好系統後建議先不要進行系統的更新 update upgrade 等動作,有可能會導致啟動 Docker 時 (DLI 課程都是以 docker 方式進行) 無法正常把 CUDA 匯入系統。請等執行完課程範例再更新系統。

01- [透過 Jetson Nano 開發人工智慧應用] DLI 課程安裝

請由本網頁來檢視支援各 JetPack 版本的容器,並由其中找到對應的 JetPack 版本來建立課程腳本檔。
本文使用 JetPack版本是4.6,如果要查看您所用系統的 JetPack 版本,可用 jtop 或是安裝 jetson_stats 來查詢。以上兩者都是透過 pip 來安裝,所以如果還未安裝 pip 的人,請用以下指令來安裝:
sudo apt-get install python3-pip

pip 安裝完成之後,請用以下指令來安裝並執行 jetson_stats,即可由系統訊息中檢視 JetPack 版本,如下圖紅框處:

pip3 install jetson_stats
jetson_stats

jtop 則是可以查看系統資訊(CPU、GPU、記憶體與軟體版本)以及控制供電模式與風扇等功能的小工具,請用以下指令來安裝並執行 jtop:

sudo pip3 install -U jetson-stats
jtop

由於這兩門課都是由腳本檔來啟動 docker,且要求預先接好攝影機 (腳本檔中已指定 --device /dev/video0 ) ,否則將無法順利啟動 docker。

接著就要建立 sh 腳本檔,也就是課程 docker 的啟動檔,其中 v2.0.1-r32.6.1tw 則是要根據您系統的JetPack版本以及課程的語系來決定,目前支援 JetPack4.4 到 JetPack4.6.1。

以下是JetPack4.6 繁體中文版的腳本檔指令:

echo "sudo docker run --runtime nvidia -it --rm --network host \
--volume ~/nvdli-data:/nvdli-nano/data \
--volume /tmp/argus_socket:/tmp/argus_socket \
--device /dev/video0 \
nvcr.io/nvidia/dli/dli-nano-ai:v2.0.1-r32.6.1tw" > docker_dli_run.sh

生成後會在執行目錄下產生一個 docker_dli_run.sh 腳本檔,執行以下指令來修改本檔案的執行權限:
chmod +x docker_dli_run.sh

初次執行會開始下載該課程所需套件檔案,並解壓縮執行(根據實際網路速度會影響下載時間)。

如出現以下訊息代表還沒接上攝影機,無法正常執行程式,只要接上攝影機就可正常啟動。
docker: Error response from daemon: error gathering device information while adding custom device “/dev/video0”: no such file or directory.

要啟動 [透過 Jetson Nano 開發人工智慧應用]課程,請執行以下指令即可:
./docker_dli_run.sh

接著開啟瀏覽器,輸入 <裝置IP>:8888 即可進入課程的 Jupyterlab 畫面

看到 Jupyterlab 歡迎畫面,輸入密碼 dlinano 即可開始課程!登入後就可開始上課,每次重新執行都須重新登入

如果遇見以下錯誤代表docker中的CUDA沒有正常運作,可能是更新系統導致docker套件更新的Bug。
OSError: libcurand.so.10: cannot open shared object file: No such file or directory

目前的解決方法是透過 NVIDIA SDK Manager 重新安裝 Jetson SDK Components,裡面包含 NVIDIA Container Runtime也就是Docker的安裝檔(Jetson OS不用重新安裝)。

02- [Building Video AI Applications at the Edge on Jetson Nano] DLI 課程安裝

接著另一門 DLI 課程 [Building Video AI Applications at the Edge on Jetson Nano],由本網頁知道本也是用 docker 方式執行,目前適用於JetPack4.6以上。

執行方法與上一門課程差不多,一樣要先建立腳本檔:

echo "sudo docker run --runtime nvidia -it --rm --network host \
-v /tmp/.X11-unix/:/tmp/.X11-unix \
-v /tmp/argus_socket:/tmp/argus_socket \
-v ~/my_apps:/dli/task/my_apps \
--device /dev/video0 \
nvcr.io/nvidia/dli/dli-nano-deepstream:v2.0.0-DS6.0GA " > ds_docker_run.sh

修改腳本檔執行權限:
chmod +x ds_docker_run.sh

要啟動 [Building Video AI Applications at the Edge on Jetson Nano]課程,請執行以下指令即可:
./ds_docker_run.sh

接著開啟瀏覽器,輸入 <裝置IP>:8888 即可進入課程的 Jupyterlab 畫面,密碼一樣是 dlinano

本文到此結束,也歡迎各位直接跟我們購買相關硬體就可以在出貨時預先安裝好相關軟體,當然也歡迎找我們去執行 NVIDIA DLI 的相關課程喔!完成之後就可以取得電子證照,大方秀出來吧!

參考資料與相關文章

  • https://forums.developer.nvidia.com/t/oserror-libcurand-so-10-cannot-open-shared-object-file-no-such-file-or-directory/210171
  • https://courses.nvidia.com/courses/course-v1:DLI+C-RX-02+V2-TW/course/
  • https://courses.nvidia.com/courses/course-v1:DLI+S-IV-02+V2/course/
  • https://blog.cavedu.com/2019/07/10/nvidia-jetson-nano-course/
  • https://blog.cavedu.com/2021/07/21/nvidia-deepstream/

 

 

使用Jetson Xavier NX執行 NVIDIA DLI 深度學習機構課程〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

Jetson Orin Nano 邊緣運算電腦執行 Jetson Inference 深度學習影像函式庫

$
0
0

前言

本文將說明如何在 Jetson Orin Nano 上安裝  Jetson Inference 這套即時影像深度網路函式庫,使用了 TensorRT 來在 GPU 上執行各種最佳化後的神經網路模型,訓練模型則是使用 PyTorch 框架。到了 Jetson Orin Nano 在 GTC 2023 發表之後,Jetson Inference 也正式支援了 JetPack 5。本文使用 Jetson Orin Nano 8GB 來安裝並執行相關範例。

Jetson Orin Nano 開箱文請看這裡:[最新 NVIDIA Jetson Orin Nano 開發者套件,入門級 AI 的新基線]

本文

Jetson Inference 即時影像深度網路函式庫

Jetson Inference 是搭配 NVIDIA 自家 Jetson 平台的即時影像深度網路函式庫,使用了 TensorRT 來在 GPU 上執行各種最佳化後的神經網路模型,訓練模型則是使用 PyTorch 框架。CAVEDU 自從 2019 年 Jetson Nano 發布以來,在執行各種課程上真心覺得 Jetson Inference 相當方便好用,TensorRT 針對資源有限的邊緣運算裝置也進行了各種效能最佳化(榨乾),希望能有更好的推論速度。

從最初的影像分類、物件偵測與影像分割三大範例開始,陸陸續續擴充到了七個應用,說明如下,詳細資料如使用哪款資料及訓練,提供那些預訓練模型,請由以下連結點入即可:

本文將說明 Jetson Inference 執行於 Jetson Orin Nano 的安裝方式以及以下七個應用的實際執行畫面。如果您想回顧 Jetson Nano 如何安裝 Jetson Inference 請參考:[深入使用NVIDIA Jetson Inference機器學習專案 – 電腦視覺圖片分類任務]

  1. imageNet:影像分類,訓練資料集使用 ImageNet,模型預設為 googlenet,並有其他 ResNet 多款模型可使用
  2. detectNet:物件偵測,模型預設為 SSD-Mobilenet-v2 (使用 COCO 資料集),並有其他 PeopleNet、DashCamNet 多款模型可使用
  3. segNet:影像語意分割,提供了 Cityscapes, DeepScene 與 Pascal VOC 等多個資料集的預訓練模型。
  4. poseNet:姿勢估計,可用於偵測骨架關節點,模型預設為 Pose-ResNet18-Body
  5. actionNet:辨識畫面中的動作類別,屬於分類應用。
  6. 移除背景:使用 U²-Net 來移除背景,也可置換其他背景圖片。
  7. 深度預估:從一般 RGB 影像來推估相對深度的技術。

Jetson Orin Nano benchamark

根據 NVIDIA 原廠所提供的效能比較,以下兩圖可看到各 Jetson 平台針對諸多預訓練網路的推論速度,其中 Jetson Orin Nano 又分成 4GB 與 8GB 兩個版本。

根據原廠文件,Jetson Orin Nano 開發者套件以 80 倍的性能提高了入門級 AI 開發的門檻,可執行任何類型的現代 AI 模型,包括 transformer 和高級機器人模型。與上一代 Jetson Nano 相比,它不僅大幅提升了 AI 性能,而且 Jetson Orin Nano 還提供了 5.4 倍的 CUDA 計算、6.6 倍的 CPU 性能和 50 倍的每瓦性能,為新一代入門級 AI 機器人、智慧無人機與智慧視覺系統奠定新基準。

安裝 Jetson Inference

提供了 Docker Container從頭建置 等兩種安裝方式,請根據您的需求來進行。本文使用的方法為後者。安裝完成之後,即可在 ~/jetson-inference 目錄下直接執行各個範例。請看以下分段說明。

執行 – 影像分類

最基本的應用,將指定影像或影片的每一個 frame 分類到指定類別。訓練資料集使用 ImageNet,模型預設為 googlenet,並有其他 ResNet 多款模型可使用。

python3 imagenet.py images/IMG_2310.JPG images/test/cat_imagenet.jpg

執行 – 物件偵測

取得物體的邊界框,並可在畫面中偵測多個不同類型的物體。模型預設為 SSD-Mobilenet-v2 (使用 COCO 資料集),並有其他 PeopleNet、DashCamNet 多款模型可使用

python3 detectnet.py images/IMG_0039.JPG images/test/IMG_0039_detectnet.jpg

執行 – 語意分割

語義分割(Semantic Segmentation)是以影像識別技術為基礎,不同之處在於是對每個像素進行分類,而非單張圖像這種方法特別適用於環境感知,能夠對場景中的許多不同潛在對象(包括場景前景和背景)進行密集的像素級分類。

python3 segnet.py images/IMG_0039.JPG images/test/IMG_0039_segnet.jpg

執行 Pose Estimation

姿勢估計包括定位形成人體骨架的各種身體部位(即關鍵點)。姿勢估計有多種應用,包括手勢識別、AR / VR、HMI 和姿勢/步態矯正,模型預設為 Pose-ResNet18-Body

python3 posenet.py images/test_01.jpg images/test/test01_posenet.jpg

執行 – 動作辨識

動作識別是對於一連串影片畫格中所出現的活動、行為或手勢進行分類。所使用的 DNN 通常使用影像分類股幹並搭配時間維度。例如,基於 ResNet18 的預訓練模型會使用長度為 16 frame  的時窗。

實測時,單張照片的分類效果不太好,可能是因為上述的 time window 關係。

python3 posenet.py images/test01.jpg images/test/test01_posenet.jpg

執行 – 背景移除與置換

本技術(又稱為背景減去突出物體檢測)會產生一個遮罩來分離影像前景與背景。您可以使用它來替換或模糊背景(例如視訊會議軟體),或者它可以做為其他視覺網路的預處理段,例如物件檢測/追蹤或運動檢測。

python3 backgroundnet.py images/IMG_2310.JPG images/test/IMG_2310_mask.png //移除背景

python3 backgroundnet.py images/IMG_2310.JPG images/test/IMG_2310_replace.png --replace=images/snow.jpg //使用指定圖檔置換背景
由左到右為原圖、移除背景、置換背景為其他張圖

用發發的照片執行看看,效果也很不錯

執行 – 單眼深度(Mono depth)

深度感測對於地圖繪製、導航和障礙物檢測等任務非常有用,但過去通常需要使用立體相機或RGB-D相機 (例如 ZED 或 Intel RealSense)。現在有了可以從單張影像中推斷相對深度的神經網路(稱為單眼深度),請參考 MIT FastDepth 論文中的全卷積網絡(FCN)實現方法

python3 depthnet.py images/test_02.jpg images/test/test_02_depthnet.jpg

執行 – 即時影像分類與物件偵測

將輸入來源從單一影像改為攝影機來進行即時推論的話,影像分類可到 200 FPS,物件偵測則可到85 FPS。

即時影像分類
即時物件偵測
即時影像分割

結語

本文說明如何在最新的 Jetson Orin Nano 8GB 安裝 Jetson Inference 影像函式庫,並執行各個範例給各位參考。

Jetson Orin Nano 邊緣運算電腦執行 Jetson Inference 深度學習影像函式庫〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

使用 Edge Impulse 快速建置 Jetson Orin Nano 可用的物件偵測模型

$
0
0

前言

在物聯網(IoT)和智慧型裝置的世界中,邊緣運算已是熱門話題。本文將介紹 Edge Impulse 所推出的 FOMO 物件偵測技術,如何實作一個FOMO物件偵測管線並在 Jetson Nano / Jetson Orin Nano 這類 “資源受限” 的裝置上來實現。邊緣AI技術正在改變我們的生活,FOMO 這類創新的機器視覺技術則為資源受限裝置帶來了顯著的性能提升,為智慧型裝置帶來更高的靈活性和實用性,解放了更多可能性與應用場景。

NVIDIA Jetson 平台已有包含 Jetson Inference 等諸多方式來執行各種機器視覺任務,如果是最簡易的影像分類的話,使用 Google Teachable MachineMicrosoft LOBE.ai 也是很不錯的方案。請點選連結看相關介紹。

如果您想要知道如何使用 Edge Impulse 來處理光感測器、加速度感測器這類時序資料的話,請參考 CAVEDU 的 tinyML 相關文章喔!

註:本文使用 chatGPT (GPT-4) 來分析 Edge Impulse 與CAVEDU相關文章來生成初稿,再由作者潤飾過發表。在本身也理解領域知識的前提下,節省了 2/3 以上的時間!

本文

Jetson Nano 與 Jetson Orin Nano

請根據本頁來在 Jetson Nano / Jetson Orin Nano 上安裝 edge-impulse-linux,一鍵安裝很方便

安裝指令如下:

wget -q -O - https://cdn.edgeimpulse.com/firmware/linux/jetson.sh | bash

安裝完成之後,請於 Jetson 終端機輸入以下指令,輸入Edge Impulse 帳號密碼之後 (如果第一次操作,請先到 Edge Impulse 建立一個免費帳號),連到預先建立的指定專案。

edge-impulse-linux

Edge Impulse FOMO

物件偵測是 AI / 機器視覺的重要應用之一,自駕車、機器人、無人機、監控等多個領域都已大量使用。然而,傳統的物件偵測方法通常需要強大的硬體來支援所需的運算量,這在算力資源受限的邊緣設備上實現是有困難的。

這個問題可由軟硬體兩方面來解決。硬體面來說,例如您可以期待每年相同價格可取得的新智慧型手機一定會比去年來得更大也更快,代表單位價格所取得的運算能力不斷增加。另一方面,也可以透過新的演算法來做到更準確更輕巧的應用。

Edge Impulse通過提供一個名為 FOMO(Fast Object detection on Mobile and constrained devices)的物件偵測框架來滿足了這一需求。FOMO是一個專為資源受限裝置所設計的輕量級物件偵測框架,具有高效和即時等兩大特點。以下是FOMO的一些重要特性:

  • 更輕量:FOMO的模型較傳統物件偵測模型更小,因此可以在低功耗和低運算能力的裝置上運行。
  • 更即時:FOMO在資源受限裝置上運行時可更快,保證應用場景的即時性。
  • 更易用:通過Edge Impulse Studio,開發者可以輕鬆設計和部署FOMO物件偵測模型。

在Edge Impulse Studio 中建立 FOMO 物件偵測專案

根據 Edge Impulse 原廠文件說明整理以下關於  FOMO 的特點,您可藉此理解這套方法為何可以做到更快。

Edge Impulse 所開發的 FOMO (Faster objects, More objects) 機器學習演算法,可以在資源有限的邊緣裝置上做到更快的物件偵測效果。與MobileNet SSD或YOLOv5相比,FOMO 能夠做到最多30倍、更少的運算量與記憶體來實現物體計數、物體位置識別和即時多物體追踪。FOMO 運用了卷積神經網路結構,並將標準圖像分類模型的最後幾層替換為每個區域的類別機率映射,以在最後一層完全保留局部性(locality),藉此提供了物體位置的熱圖(heat map),並其轉換為用於計數目的的邊界框或物體重心。

heat map

FOMO是完全卷積的,可以分析不同大小的圖像 (可在 Edge Impulse 中自由調整) ,使其就算在處理非常大尺寸的影像時也能保有彈性與實用性。FOMO 相容於 MobileNetV2 模型,還能進行遷移學習。

可用的物件偵測模型

FOMO對已標註資料中的物體與背景的比例相當敏感,但這可在神經網路設定的專家模式(expert mode)來修改訪問附加配置以進行調整,如下圖的 object_weight=100。如果您的情境中所要偵測的物體相對更少的話,可以本數值調高。

切換到 expert mode 來修改 FOMO 模型參數


只要訓練完的模型可放在裝置中(記憶體夠大),FOMO 幾乎可執行在所有的裝置上,相容性相當好。實際的FOMO的性能取決於目標裝置的速度和可用記憶體,Edge Impulse 建議記憶體至少要 512 KB 以上。

使用 FOMO 完成物件偵測管線

請根據以下步驟來完成 FOMO 物件偵測管線:

1. 登錄 Edge Impulse Studio,或註冊免費帳號。

2. 建立一個新專案:點擊 [Create New Project],為您的專案取一個名稱,例如下圖的 object_detetion。Edge Impulse 提供了很多入門教學文件,跟著做就可以完成各種不同的專案,很方便!

專案歡迎畫面

3. 收集資料:在左側選單中,點選 [Data acquisition]。您可在此收集專案所需的各種型態的資料。由於本文是物件偵測教學,因此會電腦外接 usb webcam 來收集影像。或者也可以上傳現有的資料集並手動標註影像。

點選上圖的 [Collect new data] 圖示,會跳出以下頁面,由左至右邊分別是用智慧型手機、電腦與開發板來上傳資料。在此使用 [Connect to your computer],同意相關權限之後就會使用電腦上的 webcam 來拍照,在此使用外接的 USB webcam 來拍照,並非筆電的內建攝影機。

收集資料,有三種作法

擺好姿勢之後,按下 [Capture] 就會拍照。

使用電腦上傳影像資料

拍照之後,系統會要求你進行標註,請點選畫面上方的 [Labeling queue] 就會進入以下的標註畫面,請給定 label 名稱之後,用滑鼠在您所要標註的物體旁邊框起來,完成之後按下 [Save Labels] 就會進入下一張要標註的照片。注意:一張照片中可以標註多個物體。

標註畫面

完成了!系統會自動對其他所有照片標註,您只要再行調整就好。但不管怎樣還是需要一定時間的,但考慮到之後的物件偵測效能,還是好好標囉!

最後還需要調整訓練與測試資料集的比例,建議是 80% / 20%,您可以手動點選單筆資料來移動到指定資料集,或點選 [TRAIN / TEST SPLIT] 附近的 ? 圖示來由系統幫您完成。當然啦,不管怎樣資料都不能太少,不然很難的!

標註影像完成

注意:由於在  Jetson Orin Nano 上也會使用同一支 C270 webcam (就拔過來拔過去),所以還是原廠考照的概念喔!

4. 建立管線 (Impulse):Edge Impulse 把整個從取得資料到輸出特徵的這段流程稱為 Impulse,點選左側選單的  [Impulse Design],在此會自動帶入第一段 data 與最後一段 output features,這都和前一段的資料標註有關。

在自動帶入的  Image Data 區塊中,可以看到影像解析度支援 96 / 160 / 320 的正方形輸入,並可調整 Resize mode (符合短邊、符合長邊或擠壓等作法)

  • processing block 請選擇 Image
  • learning block 請選擇 Object Detecion (Images)

我的 impulse 如下圖,細節後續還要逐個設定。

Impulse 管線

4.1 Image 處理區塊

在這個 processing block 中,請點選畫面上方的 [Generate features] 再點選下方的 [Generate features],會針對訓練資料集去探索其特徵,完成如下圖。

generate features 執行結果

4.2 Object Detection 學習區塊

在此要設定用於神經網路設定,請點選畫面中間來選擇物件偵測模型,會看到下圖,從中選擇 [FOMO (Faster Objects, More Objects) MobileNetV2 0.1] 選項,接著按下 [Start Training] 就會開始訓練了。除了 FOMO 之外,還有其他模型例如  YOLOv5 可用,歡迎玩玩看!如果模型名稱有跟著公司或平台名稱的話,代表是針對該平台硬體最佳化的模型,如果您有這些硬體的話,也務必要體驗看看。

挑選可用的物件偵測模型

根據您的資料集大小,訓練需要一點時間 (影像資料訓練起來本來就很花時間),完成之後會出現以下結果 (勉強接受~),您可根據 confusion matrix 結果回頭調整資料集內容與網路設定。

注意:免費的 Edge Impulse 帳號在資料集大小以及訓練時間上都有限制,所以您無法使用大型的影像資料集來訓練太多的回合數。

神經網路訓練完成

5. Live Classification

在此可以使用測試資料集中的資料,或再次連接攝影機拍照來即時測試模型結果。還可以把測試結果加入資料集,累積又一批資料之後就可以重新訓練啦。

6. Model testing:讓模型對所有的測試資料集的資料進行推論。這裡和上一步差不多。

7. Deployment:確保模型性能滿足要求後,就可以將模型部署到目標裝置上了。在這一步只要選擇不同的平台或開發板,Edge Impulse 就會負責模型轉檔為該裝置可執行的格式,非常方便。

執行畫面

請在Jetson Nano 終端機執行以下指令,就會執行 edge-implse 工具從您的專案把模型拉回來,並於 Jetson 端執行一個網頁來進行即時物件辨識。

edge-impulse-linux-runner

Jetson Orin Nano 作為即時物件偵測平台

參考資料

使用 Edge Impulse 快速建置 Jetson Orin Nano 可用的物件偵測模型〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

NVIDIA® Jetson Orin Nano™ 開發者套件入手到安裝系統、開機教學

$
0
0

前言

我們已經發文介紹過 NVIDIA® Jetson Orin Nano™ 套件開箱,還有使用Jetson Orin Nano執行Jetson Inference 深度學習影像函式庫相關範例,本文要介紹如何讓 Jetson Orin Nano 入手之後馬上開機使用也歡迎從以下連結馬上取得 Jetson Orin Nano,邊緣運算專案動起來!

撰寫/攝影 郭俊廷
時間 1~2小時 材料表

 

難度 2(滿分5)

本文

NVIDIA® Jetson Orin Nano™ 有兩個開機儲存裝置,第一個是microSD記憶卡(推薦容量要至少 64GB UHS-1 或更大),第二個就是 CAVEDU 常用的SSD固態硬碟:合理投資,大大升級

想要更了解相關介紹的可以先看 CAVEDU 的NVIDIA Jetson Orin Nano 開發者套件介紹文,還有NVIDIA原廠的Jetson Orin Nano Developer Kit Getting Started Guide

使用記憶卡安裝系統開機

如果要使用 microSD 記憶卡讓 NVIDIA® Jetson Orin Nano™ 開發者套件開機的話,只需將原廠提供的映像檔燒錄至記憶卡,插入機器開機,最後輸入您所要用的帳號密碼即可開機。

請先下載JetPack 5.1.1記憶卡的映像檔:
https://developer.nvidia.com/downloads/embedded/l4t/r35_release_v3.1/sd_card_b49/jp511-orin-nano-sd-card-image.zip/

JetPack 5.1.1的相關介紹:https://developer.nvidia.com/embedded/jetpack-sdk-511

本文使用之前教學文常用的 balenaEtcher 軟體來燒錄映像檔,由其原廠網站按照您電腦使用的作業系統安裝對應版本的軟體,本文使用的是Windows x64 安裝版。

開啟軟體後,先點選 ”Flash from file“,選取剛剛所下載的映像檔。

 

接著點選 ”Select target“,選擇你要燒錄記憶卡的磁碟機編號,點擊 ”Select“ 後再點擊 ”Flash“ 就會開始對SD卡燒錄映像檔內容,也就是 Orin Nano 開機所需的作業系統。

 

開始燒錄後,根據您的記憶卡規格跟讀卡機速度需要不同的時間。燒錄完會驗證有無錯誤,驗證無誤就代表燒錄完成。

請注意在映像檔燒錄完畢後,SD卡會新增許多磁區。WINDOWS 作業系統的電腦會跳出許多磁區的畫面(平常有更新Windows的電腦不會發生),並要求使用者格式化SD卡,但請不要格式化!

這步驟是因為SD卡的內容已變成 Linux 的檔案系統格式,所以Windows作業系統無法正常顯示SD卡磁區內容,請放心將SD卡退出,並將其插入 Jetson Orin Nano 即可。

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

使用原廠記憶卡映像檔初次開機會需要建立帳號密碼等資訊,請參考 Jetson AGX Orin文章系統安裝文章來操作。

使用SSD安裝系統開機

如果要將系統安裝在SSD硬碟裡開機的話須要使用NVIDIA SDK Manager透過Ubuntu系統的電腦安裝。安裝的時候另外需要注意的一點是需要接上螢幕確認有無成功安裝作業系統,Jetson Orin Nano跟Jetson AGX Orin 已沒有 HDMI 輸出只有DisplayPort輸出,因此您需要購買 DisplayPort 轉 HDMI轉接頭,或是使用有DisplayPort輸入的螢幕來使用。(目前測試DisplayPort轉HDMI轉接頭會有挑線的問題,如有使用需求等問題可參考網站上的DisplayPort 相關說明)

NVIDIA SDK Manager下載點:https://developer.nvidia.com/nvidia-sdk-manager,CAVEDU 已有專文介紹過如何使用NVIDIA SDK Manager 來燒錄系統至Jetson 其他裝置,如還沒下載安裝過 NVIDIA SDK Manager 與詳細的 NVIDIA SDK Manager 安裝流程還有安裝系統條件,請參考本文:

這裡要注意一點,如要使用NVIDIA SDK Manager 來燒錄Jetson Orin Nano作業系統時,需要先將Jetson Orin Nano 設定為 Recovery mode 再手動安裝。

讓板子進入Recovery Mode的做法,是用 jumper 插上 pin9 與 pin10(FC REC,GND)之後再通電,如下圖紅框處:

 

通上電之後,將 Type-C 連接線接到 Ubuntu電腦後,請用 lsusb 指令查詢是否 Ubuntu 電腦有沒有抓到 Jetson。如果正確進入Recovery mode會出現 Bus 001 Device 006: ID 0955:7523 NVidia Corp. 的裝置名稱,如下圖。這時候可以接上 DisplayPort 螢幕來確認系統是否安裝成功。

如果正確連接進入Recovery mode,NVIDIA SDK Manager 會自動偵測到Jetson Orin Nano的裝置,這時候請選擇Jetson Orin Nano(8GB deceloper kit version)。

如有下載過相關JetPack可以取消勾選 Host Machine,並且將Target Hardware選擇Jetson Orin Nano(8GB deceloper kit version),TARGET OPERATING SYSTEM需要選擇JetPack5.1.1以上才可以將系統安裝至SSD當中。

選擇要下載的項目,本文使用預設設定來全部下載安裝。請記得勾選下方的 accept license,如果要馬上安裝,則不要勾選 Download now. Install later 選項,如果想先下載之後再安裝,則可勾選該選項。

開始安裝前需要輸入Ubuntu密碼後會跳出以安裝下選項。安裝選項需要選擇 Manual setup (手動安裝,經實測自動安裝會報錯),最重要的一點是把 9. Storage Device(儲存裝置) 由下拉式選單中選擇 NVMe,也就是 SSD儲存空間,這樣就能把系統預設安裝至SSD當中,按下Flash即會開始安裝系統。

首先會先安裝Jetson Linux,也就是Jetson Orin Nano的Ubuntu 20.04.06 LTS的作業系統,正確安裝好後Jetson Orin Nano的系統畫面,會出現如下桌面。

在安裝好Jetson Linux 並確認正常開機之後,輸入剛剛建立的帳號密碼按下Install,就可以繼續安裝Jetson Runtime Components與Jetson SDK Components(就是對應的Jetpack套件)。

全部安裝完成後如下圖,請按右下角的 FINISH AND EXIT 離開 SDK Manager 了。恭喜,您的 Jetson Orin Nano 已經可以使用了,期待您完成許多有趣的專題。

請參考本文來安裝並執行 Jetson Inference 機器學習函式庫範例,超好玩喔!

參考資料

https://developer.nvidia.com/embedded/learn/get-started-jetson-orin-nano-devkit

 

 

NVIDIA® Jetson Orin Nano™ 開發者套件入手到安裝系統、開機教學〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。


建立 chatGPT LINE 交談式AI –放在 RK-AIBox 上更方便更酷!

$
0
0

前言

近年來,隨著人工智慧 (AI) 技術的進步和應用,越來越多人開始關注相關技術的應用。其中,由OpenAI公司所推出的 ChatGPT 更是將一般大眾對於 AI 的期待推向了新高峰。

本文將說明如何在 RK-OpenVINO™ AI BOX 上建立一個 LINE 對話機器人,並串接 OpenAI API 來做到更好的對話體驗,只要在LINE聊天群組中的使用者都可以與ChatGPT對話。

撰寫/攝影 許鈺莨
時間 2小時 材料表

 

難度 2.5(滿分5)

本文

RK-OpenVINO™ AI BOX 簡介

本次應用建立於RK-OpenVINO™ AI BOX,本系統已為使用者建置好 Intel OpenVINO™ Toolkit 。RK-OpenVINO™ AI BOX具有以下特點:

1. 立即可用的 AI 推論能力:支援多種AI算法和框架,能夠實現高效的推論計算。

2. 良好的可擴充性:該產品支援多種連接埠,滿足不同應用場景的需求。

3. 方便開發和部署:該產品提供完善的開發工具和開發文件,使得開發人員可以輕鬆地進行開發和部署。

[註]RK-OpenVINO™ AI BOX的完整介紹請點我

ChatGPT 簡介

ChatGPT(Chat Generative Pre-trained Transformer) 是由 OpenAI 公司所推出的交談式AI,後端串接了自家的 GPT 模型,能夠進行極其自然流暢的對話 (有體驗過就知道,很難與真人對話來區分呢!),並且可以進行各種文字生成任務,這些能力使得ChatGPT可以應用於各種領域,例如智能客服、智能對話機器人等。ChatGPT 更於 2023 年 5 月針對 plus 用戶推出了 web browsing 與 plugins 等擴充功能,期待有更多方便的應用!

開始做吧

本文將介紹如何使用 LINE 通訊軟體介面來串接 ChatGPT,並部署於 RK-OpenVINO™ AI BOX,可以幫助我們實現智能對話、問答等功能。請根據以下步驟來操作吧:

作法如下

  1. OpenAI API註冊及申請金鑰(需課金)
  2. 註冊 LINE 免費開發者帳號及相關設定
  3. 安裝並啟動外網連接軟體Ngrok
  4. 安裝LineBot與ChatGPT相關套件安裝
  5. 執行程式

1. OpenAI API註冊及申請金鑰(含課金步驟)

我們已確認免費版本 的 OpenAI API Key 免費版無法使用,所以需要自行付費取得合用的 OpenAI API Key。

1.至 https://platform.openai.com/ 申請註冊帳號

2.按下個人帳號Personal -> View API keys

 

 

3. 由左側欄位找到 Billing -> Overview->Set up paid account

4.若是個人使用,則選擇 I’m an individual

5.填入信用卡相關資訊

付費方式如圖中所述,根據您的用量來付費,另外還會預扣5美元,確保信用卡是否有效。

6.輸入完畢,再回到第3步驟點選Create new secret key,然後輸入名稱即可取得 API key,這是您付費所取得的,請妥善保管囉。

 


● 註冊 LINE 免費開發者帳號及相關設定

有關申請LINE免費開發者網站,結合LINE messageing API的相關設定,可以參照 CAVEDU 另一篇文章【Rasbperry Pi 結合 LINE messaging API – 發發愛聊天】,有詳細的說明。

● 安裝並啟動外網連接軟體Ngrok

1. RK-AIBox 開機之後就會進入 Ubuntu Linux 作業系統桌面,請開啟終端機輸入以下指令來取得 ngrok 中介軟體:

wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-arm.zip
unzip ngrok-stable-linux-arm.zip

2. 於 RK-AI Box 端的 8000 port 啟動一個 http 服務,用於串接 LINE messaging API:

ngrok http 8000

3. 把 “https:“這段網址複製起來,記住要連https一起複製,這就是要填入 LINE 後台的 webhook。由於我們使用免費版本地 ngrok,所以網址 2小時 之後會失效,需要重新啟動並更新網址。

注意:每次啟動網址都會不一樣!

4. 再貼到LINE開發者網站的webhook的欄位,這邊建議用RK-BOX的網頁來開LINE開發者網站。開啟RK-BOX的Google  Chrome網頁時,需要輸入密碼 openvino

5. 接著要回到 LINE Messaging API 頁面來設定 webhook

6. 將上述網址再加上 “/callback“貼在 Webhook URL欄位中

● 安裝LineBot與ChatGPT相關Python套件安裝

一樣在 RK-AI Box 終端機中輸入以下指令來安裝相關套件

wget https://www.dropbox.com/s/j7sfzlfhjnwfaau/ChatGPT_LineBot.zip

unzip ChatGPT_LineBot.zip

cd ChatGPT_LineBot

pip install -r requests.txt

 

● 執行程式

請於上述 .zip 中的 chatgpt.py 中修改以下資訊才能正確串接 LINE 與 chatGPT

1. 輸入Messaging API 的 channel_secretchannel_access_token

2. 輸入openai金鑰

3. 執行程式

請另開啟終端機來執行程式,輸入下列指令

cd ChatGPT_LineBot

python3 chatgpt.py

4. 執行成果

我們開啟電腦版的 LINE,可以看到 python console 和 ngrok 在每一次 LINE 收發訊息時都會產生對應訊息,恭喜您完成啦!

建立 chatGPT LINE 交談式AI – 放在 RK-AIBox 上更方便更酷!〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

使用 Raspberry Pi Pico W 和 MicroPython 開發物聯網應用

$
0
0

前言

當我們提及物聯網(IoT, Internet of Things)開發,可能首先想到的是Arduino或是ESP8266這樣的微控制器開發板。然而,Raspberry Pi的微控制器開發板——Raspberry Pi Pico W,也是一個很好的選擇。
在本專案中,將會介紹如何使用Raspberry Pi Pico W和MicroPython,並用Thonny IDE的平台來撰寫程式。

撰寫/攝影 許鈺莨 (ChatGPT協作編輯)
時間 2小時 材料表

 

難度 2(滿分5)

本文

Raspberry Pi Pico W簡介

Raspberry Pi Pico W是由Raspberry Pi基金會出品的微控制器開發板。它配備了一個RP2040微控制器,有264KB的內部RAM,並且支援MicroPython程式語言,這讓我們可以更方便地開發物聯網應用。

使用上和Raspberry Pi Pico沒有多大差別,只是Raspberry Pi Pico W 還 支援Wi-Fi 802.11n無線網路和藍牙,更多Raspberry Pi Pico相關介紹連結如下:

Raspberry Pi Pico family
Raspberry Pi Pico介紹(含使用Arduino IDE和擴充板教學)

MicroPython簡介

MicroPython是一種針對微控制器和受限環境設計的 Python 3 程式語言編譯器和執行環境。這種程式語言實現了Python 3的大部分語法和特性,並對於開發板所需的低功耗和即時回應有進一步最佳化。MicroPython提供了豐富的API,可以直接控制微控制器的GPIO、I2C、SPI等各種硬體資源。

Thonny IDE簡介

Thonny是一個專為Python初學者設計的整合式開發環境(IDE)。它的介界面簡單,功能強大,對於學習Python語言非常有幫助。而且,Thonny IDE 也支援 MicroPython,我們可以直接在Thonny IDE中編寫MicroPython 程式,並上傳到Raspberry Pi Pico W上執行。

請由 Thonny 官方網站下載 Thonny。

電路接線圖

本次專案分享如何透過Thonny IDE來撰寫MicroPython程式,並使用PMS5003粉塵感測器取得數值和經由Raspberry Pi Pico W的Wi-Fi功能取得目前台灣時間,並顯示在OLED中。
以下介紹Raspberry Pi Pico W、Raspberry Pi Pico W擴充板、OLED、PMS5003接線圖。

Raspberry Pi Pico與擴充板接法(擴充板可相容於Raspberry Pi Pico W):
https://cavedu.gitbook.io/cavedu/raspberry_pi_pico_info/pico_breakout

 

Raspberry Pi Pico W擴充板與OLED接線圖
Raspberry Pi Pico W擴充板與PMS5003接線圖

接下來使用 Thonny IDE 來編寫程式,請先下載 Raspberry Pi Pico W 的 uf2 韌體檔

如何上傳Raspberry Pi Pico W的uf2檔

按住 Raspberry Pi Pico W 的 BOOTSET 按鈕時,插上USB連接到電腦,Raspberry Pi Pico W 會被電腦辨識為一個磁碟,將 uf2 韌體檔拖放到其中就會自動更新任體。。

Raspberry Pi Pico W連接Thonny IDE

● 將Thonny IDE下載至電腦,並解壓縮後開啟,請選擇
執行>設定直譯器>選Micro Python (Raspberry Pi Pico W)

● 連接埠選擇USB序列裝置(COM X)


[註] COM號要記住,後續上傳程式需要正確指定 COM 號,概念如同 Aduino IDE

● 確認是否與Raspberry Pi Pico W連接

檢查 Thonny IDE 下方的 互動環境(Shell),如果沒有紅字錯誤訊息即可上傳程式,這時候還沒寫,繼續看下去吧。

匯入OLED函式庫至 Raspberry Pi Pico W

本專案需要透過 OLED 顯示模組來顯示數值,故需要先匯入OLED 函式庫
1. 下載 OLED 函式庫,檔名ssd1306.py 到您的電腦

2. 在 Thonny IDE 中安裝套件

我們可由 Thonny IDE 呼叫系統命令列來安裝 python 套件,請由工具 –> 開啟系統命令列

3. 安裝 adafruit-ampy 套件
為了順利執行程式,我們需要安裝 adafruit-ampy 套件,用於透過序列埠與 CircuitPython 或 MicroPython 開發板互動,安裝方式就是一般的 pip 指令,相當簡單:

pip install adafruit-ampy

4. 匯入OLED函式庫到Raspberry Pi Pico W

cd module_library
ampy --port COM X put ssd1306.py

[註]請注意,並不是開啟下方的視窗,若出現下方視窗,則要再按一次開啟系統命令列。

5. 如何查看已匯入的函式庫

在 Thonny IDE 中,點選檢視 -> 檔案,可以查看Raspberry Pi Pico W中匯入的檔案

執行程式

本專題有兩個程式 (點我下載原始碼,或由以下複製也可以):

  • 在 OLED 顯示時間(OLED_wifitime.py)
  • 在 OLED 顯示 PMS5003 粉塵感測器數值(PMS5003_OLED.py)
OLED_wifitime.py
import machine
import utime
import ssd1306
from time import sleep
import network
import ntptime
import urequests

i2c = machine.SoftI2C(scl=machine.Pin(15), sda=machine.Pin(4))

oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)

# 初始化 UART
uart = machine.UART(0, baudrate=9600, tx=machine.Pin(0), rx=machine.Pin(1), timeout=1000)
uart.init(9600, bits=8, parity=None, stop=1)



# 初始化WiFi
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)


wifi_ssid = "XXXXX"
wifi_password = "XXXXXXX"


sta_if.connect(wifi_ssid, wifi_password)


# 顯示WiFi連接狀態
oled.fill(0)
oled.text('WiFi:', 0, 0)
if sta_if.isconnected():
oled.text('connected', 40, 0)
else:
oled.text('connceting', 40, 0)
oled.show()

#設定時區
TIME_ZONE = 8

# 取得NTP時間
#ntptime.settime()
for i in range(5):
try:
ntptime.settime()
break
except OSError:
print('Error connecting to NTP server, retrying...')
utime.sleep(5)
else:
print('Could not connect to NTP server after 5 retries.')


# 等待一段時間
utime.sleep(3)

while True:
t = utime.localtime(utime.time() + TIME_ZONE * 3600)
oled.fill(0)
oled.text(str("%d/%02d/%02d" % (t[0], t[1], t[2])), 0, 0)
oled.text(str("%02d:%02d:%02d" % (t[3], t[4], t[5])), 0, 16)
oled.show()
utime.sleep(1)
PMS5003_OLED.py
import machine
import utime
import ssd1306
from time import sleep


i2c = machine.SoftI2C(scl=machine.Pin(15), sda=machine.Pin(4))

oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)


# 初始化 UART
uart = machine.UART(0, baudrate=9600, tx=machine.Pin(0), rx=machine.Pin(1), timeout=1000)
uart.init(9600, bits=8, parity=None, stop=1)

while True:
# 讀取 PMS5003 資料
data = bytearray(uart.read(32))

# 判斷是否為正確的 PMS5003 資料
if data is not None and len(data) >= 10 and data[0] == 0x42 and data[1] == 0x4d:
pm1_cf = int.from_bytes(data[4:6], 'big')
pm25_cf = int.from_bytes(data[6:8], 'big')
pm10_cf = int.from_bytes(data[8:10], 'big')

# 清除 OLED
oled.fill(0)

# 顯示 PMS5003 資料
oled.text("PM1.0: %d ug/m3" % pm1_cf, 0, 22)
oled.text("PM2.5: %d ug/m3" % pm25_cf, 0, 38)
oled.text("PM10 : %d ug/m3" % pm10_cf, 0, 54)

# 更新 OLED
oled.show()

utime.sleep(1)

使用 Raspberry Pi Pico W 和 MicroPython 開發物聯網應用〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

Raspberry Pi Pico W 空氣品質檢測系統 — 上傳感測器數值到 Google 試算表

$
0
0

前言

在我們的日常生活中,空氣品質的重要性不言而喻。尤其在都市中,空氣污染問題日益嚴重,我們需要實時監控空氣品質,以確保我們的健康。在這篇文章中,筆者將分享如何使用 Raspberry Pi Pico W 來操作空氣品質感測器,並將相關數值上傳到 Google 試算表,是一個相當簡單但是功能強大的物聯網應用喔!

筆者將會逐步介紹連接硬體、編寫軟體和解析數據的過程,讓你可以輕鬆地建立自己的空氣品質監控系統,隨時掌握周遭環境的空氣品質。

撰寫/攝影 許鈺莨 (ChatGPT協作編輯)
時間 小時 材料表

 

難度 2(滿分5)

本文

本專題分享如何操作 Raspberry Pi Pico W 開發板來取得空氣品質、溫溼度、PM2.5 的數值,並顯示在OLED螢幕中,最後再透過 IFTTT 將感測器數值上傳到 Google 試算表。本專題配合Thonny IDE撰寫MicroPython程式,來讀取空氣品質數值,有關於 Raspberry Pi Pico W連接Thonny IDE撰寫MicroPython程式,可以查看下段的前導文章。

前導文章

● 透過Thonny IDE撰寫

有關於Raspberry Pi Pico W透過Thonny IDE撰寫MicroPython程式,請看【使用Raspberry Pi Pico W和MicroPython進行物聯網應用開發】,文中詳細說明xkk7Raspberry Pi Pico W如何與Thonny IDE連接,並且分享了匯入感測器模組的函式庫作法。

● 雲端監測

本文使用的雲端平台是由 IFTTT 串接 Google Sheets, IFTTT 設定部分請參考【LinkIt™ 7697空氣品質偵測並上傳Google表單(空氣盒子2.0)】。

感測器接線圖

這次所使用的感測器,除沿用之前文章所說明的 PMS5003 粉塵感測器和OLED螢幕外,還用到了 SGP30 二氧化碳感測器和 DHT22 溫濕度感測器,以下說明這兩種感測器模組的線路圖。

● SGP30接線圖

● DHT22接線圖

如何查看內建函式庫

本文所需要的 python 函式庫模組,如DHT22的dht模組和雲端IFTTT時需要的requests,在Raspberry Pi Pico W中已經有內建了,需在互動環境(Shell)中輸入下列指令,可查看內建的函式庫。

help('modules')

撰寫程式碼

請由此下載本文程式碼

PMS5003_DHT22_SGP30_IFTTT.py
import machine
import utime
import dht
from ssd1306 import SSD1306_I2C
from adafruit_sgp30 import Adafruit_SGP30
from time import sleep
import network
import ntptime
import urequests





# 初始化 SGP30和OLED的I2C
i2c_sgp = machine.SoftI2C(sda=machine.Pin(8), scl=machine.Pin(9))
i2c_oled = machine.SoftI2C(sda=machine.Pin(4), scl=machine.Pin(15))


# 初始化 OLED
oled_width = 128
oled_height = 64
oled = SSD1306_I2C(oled_width, oled_height, i2c_oled)


# 初始化 UART
uart = machine.UART(0, baudrate=9600, tx=machine.Pin(0), rx=machine.Pin(1), timeout=1000)
uart.init(9600, bits=8, parity=None, stop=1)





# 初始化 DHT22 
dht22 = dht.DHT22(machine.Pin(2))


# 初始化 SGP30 
sgp30 = Adafruit_SGP30(i2c_sgp)


# ...
# 設置變數
# ...
pm1_cf = 0
pm25_cf = 0
pm10_cf = 0
temp = 0
humidity = 0
eco2 = 0
tvoc = 0


# 決定OLED切換顯示感測器數值的變數
display_sensor = 0


# 獲得現在時間
start_time = utime.time()





# 初始化WiFi
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)





wifi_ssid = "XXXXXXX"
wifi_password = "XXXXXX"





sta_if.connect(wifi_ssid, wifi_password)


#輸入IFTTT資訊
IFTTT_API_KEY = "XXXXXXXXXXXXX"
IFTT_EVEN_NAME="XXXXXXXXXXX"





while True:


    current_time = utime.time()


    # 得到DHT22數值
    dht22.measure()
    temp = dht22.temperature()
    humidity = dht22.humidity()


    # 得到PMS5003數值
    data = bytearray(uart.read(32))


    # 得到SGP30數值
    eco2 = sgp30.co2eq
    tvoc = sgp30.tvoc


    if data is not None and len(data) >= 10 and data[0] == 0x42 and data[1] == 0x4d:
        pm1_cf = int.from_bytes(data[4:6], 'big')
        pm25_cf = int.from_bytes(data[6:8], 'big')
        pm10_cf = int.from_bytes(data[8:10], 'big')


        if current_time - start_time >= 3:
            # 每3秒鐘切換數值顯示
            display_sensor = (display_sensor + 1) % 3
            start_time = current_time


        oled.fill(0)
        if display_sensor == 0:
            # 顯示PMS5003數值
            oled.text("PM1.0: %d ug/m3" % pm1_cf, 0, 22)
            oled.text("PM2.5: %d ug/m3" % pm25_cf, 0, 38)
            oled.text("PM10 : %d ug/m3" % pm10_cf, 0, 54)
        elif display_sensor == 1:
            # 顯示DHT22數值 
            oled.text("Temp: %3.1f C" % temp, 0, 22)
            oled.text("Humidity: %3.1f %%" % humidity, 0, 38)
        else:
            # 顯示SGP30數值
            oled.text("eCO2: %d ppm" % eco2, 0, 22)
            oled.text("TVOC: %d ppb" % tvoc, 0, 38)
        oled.show()


    
    # 上傳data 到 IFTTT
    sensor_readings = {
        'value1': pm25_cf,
        'value2': temp,
        'value3': eco2
    }
    print('Printing sensorredings')
    print(sensor_readings)
    request_headers = {'Content-Type': 'application/json'}
    
    request = urequests.post(
        'https://maker.ifttt.com/trigger/' + IFTT_EVEN_NAME +'/with/key/' + IFTTT_API_KEY,
        json=sensor_readings,
        headers=request_headers
    )
    print(request.text)
    request.close()
    
    sleep(1)

如何自動執行程式

如果希望自動執行程式,只需要將上述程式碼檔名改成 main.py 之後存入 Raspberry Pi Pico W中即可,說明如下。

開啟檔案>另存新檔

選Raspberry Pi Pico>將檔案名稱改成”main.py”

執行結果

執行程式之後,就會在 Thonny IDE 中看到相關訊息,開啟對應的 Google 試算表之後也會看到數值一筆筆進來了。

如果無法順利執行程式,請檢查先前所有設定與感測器接線,預祝成功囉!

 

Raspberry Pi Pico W 空氣品質檢測系統 — 上傳感測器數值到 Google 試算表〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

[Wio Terminal ]透過microSD卡或PuTTy 儲存感測器數值

$
0
0

前言

Wio Terminal 開發板支援自家的 Grove 接頭感測器,要讀取各種數值是很方便的,還能把結果直接呈現在本體上的彩色 LCD 小螢幕上,但別忘了 Wio 還有一個 SD 卡插槽,方便您定期寫入資料後進行後續應用 (data logger)。本文章將會介紹兩種方法供讀者選擇。

撰寫/攝影 邱柏憲
時間  30分鐘 材料表

 

難度  1(滿分5)

本文

本文將分別介紹如何使用 micro SD 記憶卡來儲存資料,以及透過 pyTTY 小軟體直接把資料丟回電腦,請根據您的需求來選擇喜歡的做法喔!如果您才剛取得 Wio Terminal 的話,請參考相關文章以及阿吉老師錄製的 tinyML 小教室喔!

方法一:利用microSD儲存數值

Wio Terminal 的 micro SD 卡插槽位於側面 (開關下方)。安裝microSD卡時須注意方向,切記不可硬塞否則可能造成損壞。Seeed 原廠提供了 microSD卡的函式庫,更多資訊請點我

Wio Terminal 發展板

本程式的流程為按下按鈕A (Wio Terminal 上緣的中間按鈕)後,便會讀取光感測器的數值並寫入 SD 卡中的 .csv 檔。.csv是相當常見的結構化資料儲存方式,後續用 python pandas 函式庫來處理非常方便。

請將以下程式碼透過 Arduino IDE 燒錄到Wio Terminal。註解為程式碼的簡單介紹。注意:此程式需要於Wio Terminal側邊安裝SD卡 (當然啦!) 才可正常執行

#include <SPI.h>
#include <Seeed_FS.h>
#include "SD/Seeed_SD.h"

File myFile;
char str[4];

//設定檔案名稱 
const char* data_file = "test.csv";

void setup() {
  pinMode(WIO_KEY_A, INPUT_PULLUP);
  pinMode(WIO_LIGHT, INPUT);
  Serial.begin(9600);
  Serial.print("Initializing SD card...");

  //設定SD卡的連接設定
  if (!SD.begin(SDCARD_SS_PIN, SDCARD_SPI)) {
    Serial.println("initialization failed!");
  }
}

void loop() {
  int light = analogRead(WIO_LIGHT);
  //按下按鈕A後才會儲存
  if (digitalRead(WIO_KEY_A) == LOW) save_data_to_SD_Card(String(light));
}

void save_data_to_SD_Card(String light) {
  //開啟SD卡中的test.csv,如未有此檔案則會新增,如有則會由資料末端接續
  myFile = SD.open(data_file, FILE_APPEND);
  if (myFile)
  {
    //將紀錄規格設計成.csv的格式,前面的light為光感應器的數值,後面的1是為了示範格式,兩個數值間則用逗號隔開。這邊須注意輸入的類別需要為String(字串)
    String data_record = light + "," + "1";
    myFile.println(data_record);
   //關閉檔案 
   myFile.close();
    Serial.println(data_record);
    Serial.println("Data saved successfully!\n");
  }
  delay(1000);
}

執行時,可在 Serial mointor 看到相關訊息:

 

接著將 SD 卡退出並用電腦讀取。此時會發現 SD 卡找到一個 test.csv 檔,使用 Excel 或合適的文字編輯器開啟後就會看到剛剛所紀錄的資料了!

方法二:藉由PuTTY與Arduino IDE將資料直接儲存於電腦中

Wio Terminal 可藉由PuTTY 與電腦進行溝通,我們便可利用此功能將資料儲存於電腦中。請由本連結來下載對應版本的PuTTY

請將以下程式碼透過 Arduino IDE 燒錄到Wio Terminal。註解為程式碼的簡單介紹:

#include <SPI.h>

void setup() {
  pinMode(WIO_KEY_A, INPUT_PULLUP);
  pinMode(WIO_LIGHT, INPUT);
  Serial.begin(9600);

}


void loop() {
  //讀取光感應器的數值
  int light = analogRead(WIO_LIGHT);
  //按下按鈕A執行
  if (digitalRead(WIO_KEY_A) == LOW) putty_read(String(light));
}

   
void putty_read(String light)
{
  //前面的light為光感應器的數值,後面的1是為了示範格式,兩個數值間則用逗號隔開。這邊  
  須注意輸入的類別需要為String(字串)
  String data_record = light + "," + "1";
  Serial.println(data_record);
  delay(1000);
}

PuTTY 軟體端也要進行一些設定。開啟PuTTY後於左側點擊 Session->Logging (下圖紅框),將Session logging 模式選為 Printable output,之後點擊Browse選擇存檔的位置與檔案名稱,並將副檔名設定為.csv (下圖藍框)。完成後回到Session頁面。(此步驟需注意,操作時需關閉Arduino IDE中的Serial Monitor視窗頁面,否則 com port 會被佔住而無法操作)

 

如下圖,將連線方式改為 Serial (下圖紅框),接著輸入Wio Terminal的COM Port 與鮑率9600 (下圖藍框)。設定完成後按下最下方的 Save 按鈕儲存,之後再次開啟便可以不用再次設定。確認前面步驟已完成後,按下底下的Open按鈕,即可開始蒐集資料。

按下 Wio Terminal 的按鈕A後,就會把讀取的光感測器數值顯示於PuTTY中,如下圖:

也可以在您所指定的路徑找到 .csv檔,當然一樣開起來看看囉!

 

本文介紹了兩種資料儲存方式,請根據您的實際情境選一種吧。取得資料後要進行分析處理就容易許多了。希望這次的分享對大家在做作品時有所幫助,如果有其他的資料儲存方式也歡迎分享!

 

[Wio Terminal ]透過microSD卡或PuTTy 儲存感測器數值〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

Raspberry Pi Pico W 開放藍牙無線功能,更新韌體後即可使用

$
0
0

前言

樹莓派基金會在今年6月中宣布 Raspberry Pi Pico W 開發板的內建藍牙通訊功能已可使用。這為開發者和 maker 社群提供了新的通訊方案,此次更新代表使用者可以更便利地在專案中實現無線資料傳輸,從而擴展了Raspberry Pi Pico W的應用領域。

Raspberry Pi Pico 在各類自動化、資料收集和物聯網專案中已展示了其強大的功能,但是,許多開發者需要在Pico上實現藍牙無線通訊,往往需要透過外接藍牙模組。這不僅需要額外的成本,而且增加了設計的複雜性。

為解決這些問題,Raspberry Pi Pico W新增了內建藍牙功能,讓開發者更輕易地在他們的專案中實現藍牙通信。這項內建功能無需額外的硬體或軟體支持,簡化了開發過程,減少了設計和製造成本。

此次的更新為 Raspberry Pi Pico W 提供了更多的應用可能性,如遙控智慧家居裝置、實現設備間的無線數據傳輸等。加入藍牙功能可以更容易地實現這些功能,而不需要額外的硬體。本文要來說明如何更新 Raspberry Pi Pico W 韌體來啟用藍牙無線通訊功能。

撰寫/攝影 許鈺莨 (ChatGPT協作編輯)
時間 30分鐘 材料表

 

難度 1(滿分5)

本文

更新藍牙功能韌體

● 請到樹莓派基金會網站下載UF2韌體檔

● 按住 Raspberry Pi Pico W 開發板的 BOOTSEL 按鈕,並用 USB 傳輸線將它連到電腦後鬆開 BOOTSEL按鈕。

● 這時電腦會將開發板變視為一個叫做 RPI-RP2 的資料夾(或磁碟),將 UF2 韌體檔拖放到其中,Raspberry Pi Pico W 就會更新韌體後重新啟動。

完成了!您的 pi pico W 開發板已經更新好支援有藍牙功能的韌體,下一篇要說明如何讓手機與 Raspberry Pi Pico W 彼此進行藍牙通訊。

相關文章與資源連結

  • https://www.raspberrypi.com/documentation/microcontrollers/micropython.html

 

Raspberry Pi Pico W 開放藍牙無線功能,更新韌體後即可使用〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

Viewing all 678 articles
Browse latest View live