文章

[筆記] Edge Impulse平台的影像辨識模型

圖片
        Edge Impulse 是一個提供 AI 模型訓練的雲端平台  https://edgeimpulse.com/ ,也提供幾個免費的模型讓新註冊者使用,適合初學者入門學習 AI 模型訓練( Train ),乃至生成推理參數( Inference )。此外,該平台提供的模型適用於邊緣運算,訓練後的模型參數可以移植到資源有限的嵌入式系統上面進行 AI 的推理,犧牲部分模型的精準度來換取更多周邊設備的推理應用。在網站,Edge Impulse 列出一些合作的硬體設備廠商或可移植的模組,我們可以根據這方向找適合的模組來實現。          就 EI 平台上免費提供的模型而言,可以分為一維資料的語音模型訓練,和二維資料的影像模型訓練。本文僅就影像辨識模型來介紹,請參考吉伊卡哇的臉部辨識  https://youtu.be/F2ollSB4v2g 。在平台上,物件偵測的模型 MobileNet,我們可以調整模型訓練的圈數以及學習率...等,以便達到較好的精準度。底下的圖顯示,在相同的設定圈數下,MobileNet 2.0.35 版本的整體分數比 2.0.1 好,更進一步採用 MobileNetV2 SSD 模組來訓練,也能達到接近的精準度。MobileNetV2 SSD 比 MobileNet 模型除了物件的分類之外,還能精準物件的定位,當然在訓練的過程會花費更多的時間。簡而言之,MobileNet 2.0.35 專注於影像分類,而 MobileNetV2 SSD 則將分類與定位結合,實現更全面的影像理解。         除了上述的模型之外,EI 平台也提供 Yolo 模型,不過這模型訓練時間過長,無法提供免費使用,必須購買點數才行,如果訓練過程要用 GPU,這也是需要購買點數。言歸正傳,訓練後的模組,EI 平台可以依據應用的環境產生推理的參數,比如生成 C/C++ 的推理函數庫,Arduino IDE 環境的推理函數庫...等,前段提到的影片就是用 Arduino IDE 環境的 ESP32 CAM 模組來實現影像辨識的推理。下圖是生成 Arduino IDE 推理的函數庫結構,模型的參數放在 tflite...

建立一個 MQTT 測試環境

圖片
如何建立一個 MQTT server 的測試環境,在網路上有提供 MQTT Broker 的服務,其中免費的 MQTT 測試網站列表,如下: 1)       MQTT GO : https://broker.mqttgo.io/ ,使用說明參考 [1] 。 2)       EMQX : https://www.emqx.com/ ,可用谷歌或 Github 帳號登錄,然後創建 MQTT 服務。特別留意,這個網站提供的連線方式為 MQTT over TLS/SSL 。   有了網路的 Broker 服務之後,我們需要設計一個訊息發佈的終端,來模擬 IoT 的設備。利用 MQTTnet C# 設計一個 client 端的工具,可驗證 MQTT 連線與發佈,工具的操作畫面如下所示。 操作步驟 1)       設定 broker 網址以及連線的端口,標準端口: 1883 ,或者 TLS/SSL 端口: 8883 。不過,這個 MQTT GO 網站使用標準端口連線,而且不需要 user/password 。按下 Connect 鈕後,無論成功與否,會彈出一個連線結果。 2)       成功後,設定右側的 Topic 欄位,然後再填寫訊息欄,最後按下 Publish ,這則訊息會傳送到 MQTT GO 網站,我們再到網站上檢視,如下圖。 3)       開啟瀏覽器到 MQTT GO 網站,先連線後,再訂閱主題。這裡的主題就是對應上面工具的 Topic 欄位,訂閱後,就能直接在瀏覽器上面看到工具傳送的訊息。   模擬測試 根據水利署的 MQTT 資料上傳文件 [2] ,主題的格式為 Datastream( 物理量 GUID)/Observations ,而訊息內容為 JSON 格式。將 GUID 填入 1 為模擬代號,下圖是模擬的結果。   EMQX 連線資訊 EMQX 服務器的連線採用 MQTT over TLS/SSL ,...

[筆記] RTSP stream server on Windows

圖片
➤ 準備套件 MediaMTX :到 github 網站下載 zip 包  https://github.com/bluenviron/mediamtx ,參考 [1] FFmpeg :到官網下載已經編譯好的 zip 包,參考[2] ➤ 啟動 RTSP 服務         MediaMTX zip 包裡面有三個檔案,一個程式的執行檔(.exe),一個是程式的配置檔(.yml),另一個是許可檔案。配置檔就是一個文字檔,打開後可以看到 RTSP 的相關設定,還有其他串流 RTMP 的設定。在 Windows 環境下,開啟 CMD 視窗,然後執行 mediamtx.exe,顯示出下圖的結果。RTSP 串流的 TCP 端口為 8554,UDP 端口為 8000。 ➤ FFmpeg 影像編碼         編譯過的 FFmpeg 壓縮包裡面,\bin\ 目錄底下有三個執行檔,一個是 ffmpeg.exe,一個是 ffplay.exe,以及 ffprobe.exe。第一步,在 Windows 環境下開啟 CMD 視窗,然後執行 ffmpeg .exe -version 檢視版本號,看有沒有成功。         第二步,查看並列出電腦上的所有攝影機,執行 ffmpeg -list_devices true -f dshow -i dummy,結果會列出來,如下圖。         第三步,我們用 ffplay 工具執行擷取攝影機的影像數據,在 CMD 視窗執行 ffplay -f dshow -i video = "USB2.0 VGA UVC WebCam",其結果如下圖所示。         前面的步驟都成功後,進行第四步,將攝影機影像推到 RTSP 伺服器上,參考[3], ffmpeg -f dshow -i video="USB2.0 VGA UVC WebCam" -f rtsp rtsp://127.0.0.1:8554/stream 接著,我們在另一台電腦上,寫一個 RTSP client 的程式,從伺服器上面讀取攝影機的影像,如下圖,RTSP 伺服器的 ...

工控板 STM32H750 ADC / DAC / 網路介面

圖片
        在實務上,經常使用意法半導體的 MCU,本文介紹一塊高效能的工控板,如圖一所示,以 STM32H750 為基礎,其核心為 ARM Cortex-M7,最高運算時脈 480MHz。底下列出這塊工控板的周邊介面:      1) 12 路光耦合GPI      2) 8 路光耦合GPO (有帶+24V電源的接點)      4) 2 路DAC (12-bit, 0~10V)      5) 8 路ADC (16-bit, -10.24V~+10.24V, 外接 ADS8688 晶片)      6) RS-485 x 4, RS-232 x 1, FDCAN-bus x 2, USB-to-COM x 1      7) Ethernet RJ-45 (外接 LAN8720 PHY)      8) 8 路高速 PWM 輸出 值得一提的是這款工控的 CAN bus 是高速的 FDCAN (Flexible Data-rate CAN),傳輸速度可達 5Mbps,原本的 CAN 只有 1Mbps。 圖一:STM32H750 工控板的外觀         工控板上面外接了一顆 ADS8688 的 ADC 晶片,其規格是 16-bit 解析度,總取樣率為每秒 500k samples。在取樣的效能上,比起之前的 STM32F407 工控板提升了不少,請參考前文  https://han-ya.blogspot.com/2024/03/stm32f407-24-bit-adc.html 。雖然 ADS8688 晶片最高取樣率為每秒 500k,但是實際與 STM32H750 搭配後,只剩下 53.9k 左右,因為兩者間的通訊為 SPI,需要處理每筆通道的中斷服務,這會耗損不少時間。筆者也曾試著用 SPI_DMA 方式,看看能不能解放更多 MCU 的時間,無奈,效果更差,大概只剩不到 20k 左右。

STM32MP157 的 Linux 系統處理器 -- 第二步建立 Qt Creator 開發環境

圖片
        STM32MP157開發板通電後,如下圖,開發板上面所運行 Qt 的版本為 5.12 ,因此我們從 Qt 官網下載對應的版本來開發 UI 介面,網址: https://download.qt.io/archive/qt/5.12/5.12.9/ 。 MP157 上面運行的作業系統是 OpenLinux ,要從 ST 官網下載 STM32MP1 OpenSTLinux Developer Package ,安裝包裡面有交叉編譯器和基於 Yocto 的 SDK ,安裝過程請參考 [2] 第一章或 [4] 第六章。         安裝 Qt Creator 5.12.9 後,需要將上述 cross compiler 的位置指向 ST 官方自帶的工具,如下圖所示,請參考 [2] 第二章。第一步先設定 qmake 路徑,第二步再設定 C++ 編譯器的路徑,最後再將開發環境的配置設定好。 第一個範例         利用 Qt 來編譯我們第一個範例 Hello World , Qt 能分別編譯 Ubuntu 環境的 UI 介面,也能編譯 MP157 開發板的 UI 介面。下面第一張圖是運行在 Ubuntu 系統的 Hello World ,下圖第二張是運行在 MP157 板子的 Hello World ,如果第一個範例能成功運行在不同系統的話,這代表我們上述安裝 Qt 開發環境是正確的。 參考資料 [1] STM32MP1 嵌入式 Linux 驅動開發指南 V2.0 [2] STM32MP157 出廠系統 Qt 交叉編譯環境搭建 V1.1 [3] STM32MP1 嵌入式 Linux C 應用編程指南 V1.4 [4] STM32MP157 快速體驗 V1.6

STM32MP157 的 Linux 系統處理器 -- 第一步建立開發編譯環境

圖片
STM32MP157開發板的資料非常多,本文主要是抓出建立一個開發環境的重點部分。MP157  晶片有兩顆 ARM Cortext-A7 核心 800MHz 和一顆 Cortext-M4 核心 209MHz ,其中 A7 運行 Linux 核心。由於其多核的架構適用於處理複雜的任務,比如智能家居、環境監控、安防、自動控制系統、智慧醫療監測 … 等嵌入式的 Linux 應用。 首先認識啟動過程,當晶片通電啟動後,先跑 TF-A(STM 的安全開機流程 ) ,接著運行 uboot 開機程式 ( 俗稱 bootloader) ,此時 uboot 會載入 Linux 核心到 SRAM ,最後再運行 Linux 系統,周邊設備的驅動會被 Linux 系統帶起來,呈現給我們的就是 Linux 操作介面。 由於是 ARM 為基礎的晶片,編譯過程需要用 ARM 官方的編譯工具,也就是 tool-chain 。正點原子建議使用 gcc-arm-9.2-2019.12-x86_64-arm-none- 版本,這是 2019 年底出的 9.2 版本,有分為 Linux 和 Windows 版。同時, STM 官方有提供 TF-A 、 uboot 、 Linux 內核的原始碼,為了避免編譯原始碼產生錯誤,最好用同一編譯版本 9.2 版,因為無法確認新版本編譯工具是否能成功編譯原始碼。最後留意一點,如果要修改 uboot 或 Linux 內核驅動的話,最好在 Ubuntu 的環境底下進行原始碼的編譯。 Cross Compiler交叉編譯器 首先,到 ARM 官網下載 https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads ,搜尋 version 9.2 。 如果安裝到 Windows 環境,選 Windows (mingw-w64-i686) hosted cross compilers 底下的 AArch32 target with hard float (mingw-w64-i686-arm-none-linux-gnueabihf.tar.xz) 。然後,用 WinRAR 工具將它解壓縮到某一目錄下...

工控板 STM32F407 / 24-bit ADC / 乙太網路介面

圖片
        意法 STM32 系列晶片在工業或控制領域使用是非常廣泛的,這裡介紹一塊 F407 的控制板,板子將晶片的周邊電路已經拉出來,並接到歐式端子頭,如圖一所示。簡單介紹 STM32F407 核心是 ARM Cortex-M4F,晶片最高工作頻率 168MHz ,底下列出這塊控制板的周邊介面:         1) 16 路光耦合隔離 GPI         2) 16 路光耦合隔離 GPO (有帶+24V電源的接點)         3) 4 路光耦合隔離 GPO (無電源的接點)         4) 2 路 DAC (12-bit, 0-10V)         5) 8 路 ADC (24-bit, 0~10V, 7500 samples/sec) : 接 ADS1256 晶片,負電壓採差動模式。         6) RS-485(兩組), RS-232(一組), CAN-bus(兩組)         7) Ethernet RJ-45 接口:接 LAN8720 PHY 晶片         8) 8 路高速 PWM 輸出         9) 2 路高速 PWM 輸入 圖一:工控板系統圖示         下圖二是控制板的實體圖片,左下角是總電源 +24V 供電,右下角有一個 USB 接口 (UART to USB),用來接到電腦,當做終端機可以查看 debug 訊息,也可以當做系統參數配置的通訊介面,像是設定網路 IP 參數或系統參數....等,如下圖四所示。下方的 GPO 的數位輸出端子都會對應一個 LED 燈,當 GPO 輸出為 1 時,燈號就會亮起,反之,燈號會熄滅。 圖二:工控板實物圖示         控制板上面用了一顆 ADS1256 ADC 晶片,具有八個...