資料介紹
描述
介紹
前段時間我第一次聽到“嵌入式機器學(xué)習(xí)”這個詞,直到那時我才想到人工智能模型可以在微控制器上運行。一段時間后,我開始使用 TensorFlow 學(xué)習(xí)計算機視覺課程,然后圖像處理背后的神秘主義以及創(chuàng)建和部署 AI 模型所需的所有過程對我來說變得清晰起來。這個項目是我對嵌入式系統(tǒng)的熱情和這些新獲得的知識的結(jié)果。前段時間我第一次聽到“嵌入式機器學(xué)習(xí)”這個詞,直到那時我才想到人工智能模型可以在微控制器上運行。一段時間后,我開始使用 TensorFlow 學(xué)習(xí)計算機視覺課程,然后圖像處理背后的神秘主義以及創(chuàng)建和實施 AI 模型所需的所有過程對我來說變得清晰起來。在計算機視覺領(lǐng)域,我一直覺得很有趣的一個應(yīng)用是面部檢測,在該領(lǐng)域中,MTCNN 非常適合實施。這個項目是我對嵌入式系統(tǒng)的熱情和這些新獲得的知識的結(jié)果。
為什么?
它是如何工作的?
MTCNN(多任務(wù)級聯(lián)卷積網(wǎng)絡(luò))是作為人臉檢測和人臉對齊解決方案而開發(fā)的框架。它由三個階段的卷積網(wǎng)絡(luò)組成,能夠識別人臉和標(biāo)志性位置,例如眼睛、鼻子和嘴巴。
P-Net(提案網(wǎng)絡(luò))
這是一個FCN(Fully Convolutional Network),用于獲取候選窗口及其邊界框回歸向量。當(dāng)目標(biāo)是檢測某個預(yù)定義類的對象時,邊界框回歸是一種預(yù)測框定位的流行技術(shù)。獲得的候選窗口用邊界框回歸向量進(jìn)行校準(zhǔn),并用 NMS(非最大抑制)算子進(jìn)行處理以組合重疊區(qū)域。
R-Net(精煉網(wǎng)絡(luò))
R-Net 進(jìn)一步減少候選的數(shù)量,使用邊界框回歸進(jìn)行校準(zhǔn),并使用 NMS 合并重疊的候選。這個網(wǎng)絡(luò)是一個 CNN,而不是像 P-Net 這樣的 FCN,因為在其架構(gòu)的最后階段有一個密集層。
O-Net(輸出網(wǎng)絡(luò))
這個階段類似于R-Net,但這個輸出網(wǎng)絡(luò)旨在更詳細(xì)地描述面部并輸出眼睛、鼻子和嘴巴的五個面部特征點的位置。
TensorFlow 實施
為實現(xiàn) MTCNN 模型,使用的工具是 TensorFlow 和 Google Colab。TensorFlow 是為 Google 開發(fā)的 ML(機器學(xué)習(xí))開源庫,它能夠構(gòu)建和訓(xùn)練神經(jīng)網(wǎng)絡(luò)以檢測模式和相關(guān)性。Google Colab 是 Google Research 的產(chǎn)品,允許通過瀏覽器編寫和執(zhí)行任意 python 代碼,特別適合 ML、數(shù)據(jù)分析和教育。
為了正確實施 MTCNN,必須處理模型的輸入和輸出數(shù)據(jù)以保證最佳結(jié)果。下圖顯示了實現(xiàn)的管道的圖塊。
第一步是執(zhí)行圖像金字塔以創(chuàng)建不同比例的輸入圖像并檢測不同大小的人臉。這些新的縮放圖像是 P-Net 的輸入,它為每個候選窗口生成偏移量和分?jǐn)?shù)。然后對這些輸出進(jìn)行后處理以獲得面部相遇的坐標(biāo)。R-Net 的輸入必須用之前的輸出進(jìn)行預(yù)處理,這樣才能獲得新的候選窗口。R-Net 輸出是候選窗口的偏移量和分?jǐn)?shù),這些窗口經(jīng)過后處理以獲得人臉相遇的新坐標(biāo)。最后,對于 O-Net,重復(fù) R-Net 過程并獲得輸入圖像中人臉的坐標(biāo)。
預(yù)處理包括兩個步驟,根據(jù)之前獲得的邊界框坐標(biāo)裁剪輸入圖像,并調(diào)整裁剪圖像的大小以匹配模型的輸入形狀。
另一方面,后處理包括三個步驟,應(yīng)用NMS合并重疊區(qū)域,用之前獲得的偏移量校準(zhǔn)邊界框,對最終邊界框坐標(biāo)進(jìn)行平方和校正。
之前詳述的所有過程以及 TensorFlow、TensorFlow Lite 和 TensorFlow Lite Micro 的模型都是在下一個 Google Colab notebook 中開發(fā)的。
部署到 ESP32-S3
模型開發(fā)的最后一步顯示為所有 MTCNN 模型創(chuàng)建 .c 文件和用于模型設(shè)置的 .h 文件,它們位于main/models/
. MTCNN 管道所需的預(yù)處理和后處理函數(shù)是使用 C/C++ 在文件utils.cc
和中實現(xiàn)的utils.h
,這些文件位于main/
.
硬件包括 ESP32-S3-DevKitC-1-N8R8 和 OV2640 相機模塊。PSRAM 的使用是強制性的,可以使用另一個帶有 PSRAM 的 ESP32-S3 代替 ESP32-S3-DevKitC-1-N8R8。
1. 下載并安裝 ESP-IDF
本項目使用ESP-IDF v5.0開發(fā),必須使用該版本或更高版本。下一個鏈接包含下載和安裝它的必要說明,請進(jìn)行手動安裝。
2.克隆這個存儲庫:
git clone --recursive https://github.com/mauriciobarroso/mtcnn_esp32s3.git
3.配置項目:
更改 menuconfig->App Configuration->Camera Configuration 中的值以配置相機引腳,并在 menuconfig->App Configuration->Wi-Fi Configuration 中更改值以設(shè)置 Wi-Fi 憑據(jù)。
cd mtcnn_esp32s3/
idf.py set-target esp32s3
idf.py menuconfig
4.閃光和監(jiān)控
該項目不需要屏幕來顯示 MTCNN 生成的圖像和邊界框。相反,它使用控制臺字符來打印輸出圖像和其他相關(guān)信息。要監(jiān)視控制臺輸出運行:
idf.py flash monitor
控制臺應(yīng)該像這樣打印一些東西:
ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0x1 (POWERON),boot:0x8 (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fce3810,len:0x17d8
load:0x403c9700,len:0xe88
load:0x403cc700,len:0x3000
entry 0x403c9930
I (25) boot: ESP-IDF v5.0 2nd stage bootloader
I (25) boot: compile time 13:50:38
I (25) boot: chip revision: v0.1
I (26) boot_comm: chip revision: 1, min. bootloader chip revision: 0
I (33) qio_mode: Enabling default flash chip QIO
I (39) boot.esp32s3: Boot SPI Speed : 80MHz
I (44) boot.esp32s3: SPI Mode : QIO
I (48) boot.esp32s3: SPI Flash Size : 8MB
I (53) boot: Enabling RNG early entropy source...
I (58) boot: Partition Table:
I (62) boot: ## Label Usage Type ST Offset Length
I (69) boot: 0 nvs WiFi data 01 02 00009000 00006000
I (77) boot: 1 phy_init RF data 01 01 0000f000 00001000
I (84) boot: 2 factory factory app 00 00 00010000 00180000
I (92) boot: 3 storage Unknown data 01 82 00190000 000f0000
I (99) boot: End of partition table
I (103) boot_comm: chip revision: 1, min. application chip revision: 0
I (111) esp_image: segment 0: paddr=00010020 vaddr=3c0b0020 size=b03d4h (721876) map
I (228) esp_image: segment 1: paddr=000c03fc vaddr=3fc99000 size=05de0h ( 24032) load
I (233) esp_image: segment 2: paddr=000c61e4 vaddr=40374000 size=09e34h ( 40500) load
I (242) esp_image: segment 3: paddr=000d0020 vaddr=42000020 size=a441ch (672796) map
I (345) esp_image: segment 4: paddr=00174444 vaddr=4037de34 size=0b150h ( 45392) load
I (354) esp_image: segment 5: paddr=0017f59c vaddr=50000000 size=00010h ( 16) load
I (363) boot: Loaded app from partition at offset 0x10000
I (363) boot: Disabling RNG early entropy source...
I (375) octal_psram: vendor id : 0x0d (AP)
I (375) octal_psram: dev id : 0x02 (generation 3)
I (375) octal_psram: density : 0x03 (64 Mbit)
I (380) octal_psram: good-die : 0x01 (Pass)
I (385) octal_psram: Latency : 0x01 (Fixed)
I (390) octal_psram: VCC : 0x01 (3V)
I (396) octal_psram: SRF : 0x01 (Fast Refresh)
I (401) octal_psram: BurstType : 0x01 (Hybrid Wrap)
I (407) octal_psram: BurstLen : 0x01 (32 Byte)
I (413) octal_psram: Readlatency : 0x02 (10 cycles@Fixed)
I (419) octal_psram: DriveStrength: 0x00 (1/1)
W (424) PSRAM: DO NOT USE FOR MASS PRODUCTION! Timing parameters will be updated in future IDF version.
I (435) esp_psram: Found 8MB PSRAM device
I (439) esp_psram: Speed: 80MHz
I (443) cpu_start: Pro cpu up.
I (446) cpu_start: Starting app cpu, entry point is 0x40375738
0x40375738: call_start_cpu1 at /home/mauricio/esp/esp-idf-v5.0/components/esp_system/port/cpu_start.c:142
I (0) cpu_start: App cpu up.
I (738) esp_psram: SPI SRAM memory test OK
I (747) cpu_start: Pro cpu start user code
I (747) cpu_start: cpu freq: 240000000 Hz
I (747) cpu_start: Application information:
I (750) cpu_start: Project name: mtcnn_esp32s3
I (755) cpu_start: App version: 1f8c91f
I (760) cpu_start: Compile time: Apr 19 2023 14:33:31
I (766) cpu_start: ELF file SHA256: a41224789833e522...
I (772) cpu_start: ESP-IDF: v5.0
I (777) heap_init: Initializing. RAM available for dynamic allocation:
I (784) heap_init: At 3FCA5D60 len 000439B0 (270 KiB): D/IRAM
I (791) heap_init: At 3FCE9710 len 00005724 (21 KiB): STACK/DRAM
I (797) heap_init: At 600FE010 len 00001FF0 (7 KiB): RTCRAM
I (804) esp_psram: Adding pool of 8192K of PSRAM memory to heap allocator
I (812) spi_flash: detected chip: generic
I (816) spi_flash: flash io: qio
I (820) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
I (841) app: Initializing NVS...
I (861) app: Initializing Wi-Fi...
I (861) pp: pp rom version: e7ae62f
I (861) net80211: net80211 rom version: e7ae62f
I (871) wifi:wifi driver task: 3fcedb6c, prio:23, stack:6656, core=0
I (871) system_api: Base MAC address is not set
I (871) system_api: read default base MAC address from EFUSE
I (891) wifi:wifi firmware version: 0d470ef
I (891) wifi:wifi certification version: v7.0
I (891) wifi:config NVS flash: enabled
I (891) wifi:config nano formating: disabled
I (891) wifi:Init data frame dynamic rx buffer num: 32
I (901) wifi:Init management frame dynamic rx buffer num: 32
I (901) wifi:Init management short buffer num: 32
I (911) wifi:Init dynamic tx buffer num: 32
I (911) wifi:Init tx cache buffer num: 32
I (911) wifi:Init static tx FG buffer num: 2
I (921) wifi:Init static rx buffer size: 1600
I (921) wifi:Init static rx buffer num: 10
I (931) wifi:Init dynamic rx buffer num: 32
I (931) wifi_init: rx ba win: 6
I (931) wifi_init: tcpip mbox: 32
I (941) wifi_init: udp mbox: 6
I (941) wifi_init: tcp mbox: 6
I (951) wifi_init: tcp tx win: 5744
I (951) wifi_init: tcp rx win: 5744
I (951) wifi_init: tcp mss: 1440
I (961) wifi_init: WiFi IRAM OP enabled
I (961) wifi_init: WiFi RX IRAM OP enabled
I (971) phy_init: phy_version 503,13653eb,Jun 1 2022,17:47:08
I (1011) wifi:mode : sta (7c:df:a1:e1:d6:4c)
I (1011) wifi:enable tsf
I (1011) app: Connecting to CASAwifi...
I (1011) app: WIFI_EVENT_STA_START
I (1031) wifi:new:<3,1>, old:<1,0>, ap:<255,255>, sta:<3,1>, prof:1
I (1761) wifi:state: init -> auth (b0)
I (1801) wifi:state: auth -> assoc (0)
I (1851) wifi:state: assoc -> run (10)
I (2011) wifi:connected with CASAwifi, aid = 14, channel 3, 40U, bssid = b0:be:76:04:3e:16
I (2011) wifi:security: WPA2-PSK, phy: bgn, rssi: -44
I (2021) wifi:pm start, type: 1
I (2021) wifi:set rx beacon pti, rx_bcn_pti: 0, bcn_timeout: 0, mt_pti: 25000, mt_time: 10000
I (2021) app: WIFI_EVENT_STA_CONNECTED
I (2141) wifi:BcnInt:102400, DTIM:1
W (3001) wifi:idx:0 (ifx:0, b0:be:76:04:3e:16), tid:0, ssn:6, winSize:64
I (4881) esp_netif_handlers: sta ip: 192.168.1.21, mask: 255.255.255.0, gw: 192.168.1.1
I (4881) app: IP_EVENT_STA_GOT_IP
I (13401) app: Initializing SPIFFS...
I (13451) app: Partition size: total: 896321, used: 0
I (13451) file server: Starting HTTP Server on port: '80'
I (13471) s3 ll_cam: DMA Channel=4
I (13471) cam_hal: cam init ok
I (13471) sccb: pin_sda 4 pin_scl 5
I (13471) sccb: sccb_i2c_port=1
I (13481) camera: Detected camera at address=0x30
I (13481) camera: Detected OV2640 camera
I (13481) camera: Camera PID=0x26 VER=0x42 MIDL=0x7f MIDH=0xa2
I (13561) s3 ll_cam: node_size: 3072, nodes_per_line: 1, lines_per_node: 16
I (13561) s3 ll_cam: dma_half_buffer_min: 3072, dma_half_buffer: 9216, lines_per_half_buffer: 48, dma_buffer_size: 27648
I (13571) cam_hal: buffer_size: 27648, half_buffer_size: 9216, node_buffer_size: 3072, node_cnt: 9, total_cnt: 2
I (13581) cam_hal: Allocating 18432 Byte frame buffer in PSRAM
I (13591) cam_hal: Allocating 18432 Byte frame buffer in PSRAM
I (13601) cam_hal: cam config ok
I (13601) ov2640: Set PLL: clk_2x: 1, clk_div: 3, pclk_auto: 1, pclk_div: 8
5.測試
將設(shè)備連接到先前配置的網(wǎng)絡(luò)后,將相機指向任何人臉。控制臺輸出應(yīng)該打印這樣的東西。
P-Net time : 65, bboxes : 3
R-Net time : 232, bboxes : 3
O-Net time : 789, bboxes : 3
MTCNN time : 1088, bboxes : 3
要觀察攝像頭捕獲并經(jīng)過 MTCNN 處理的圖像,您必須訪問以下鏈接http://ip_address/faces.jpg,其中“ip_address”必須替換為分配給設(shè)備的 IP 地址。它應(yīng)該顯示這樣的結(jié)果。
特征
- 形狀 輸入圖像:96x96
- 格式輸入圖像:RGB888
- 檢測距離:10 cm - 100 cm
- 響應(yīng)時間(1 人臉):大約 1000 毫秒
- ESP32-S3-WROOM-1/ESP32-S3-WROOM-1U用戶手冊 9次下載
- 樂鑫ESP32-S3_技術(shù)規(guī)格書
- 樂鑫ESP32-S3_技術(shù)參考手冊
- 樂鑫ESP32-S3-MINI-1參考設(shè)計
- 樂鑫ESP32-S3-MINI-1U參考設(shè)計
- 樂鑫ESP32-S3-WROOM-2參考設(shè)計
- 樂鑫ESP32-S3-WROOM-1參考設(shè)計
- 樂鑫ESP32-S3-WROOM-1U參考設(shè)計
- 樂鑫ESP32-S3-WROOM-2_技術(shù)規(guī)格書
- 樂鑫ESP32-S3-MINI-1_&1U技術(shù)規(guī)格書
- 樂鑫ESP32-S3-WROOM-1_&1U技術(shù)規(guī)格書
- ESP32 S3 MINI 1/ESP32 S3 MINI 1U技術(shù)規(guī)格書
- ESP32 S3 WROOM 1/ESP32 S3 WROOM 1U技術(shù)規(guī)格書
- esp32-s3_datasheet
- esp32s下載電路原理圖下載 27次下載
- ESP32能取代STM32嗎?哪個更好? 2383次閱讀
- ESP32-S3和ESP32-C3通過ESP-Mesh-Lite組網(wǎng) 溫濕度傳感器案例 627次閱讀
- GitHub Copilot+ESP開發(fā)實戰(zhàn)-I2C 310次閱讀
- ESP32-C3開發(fā)板設(shè)計指南 3653次閱讀
- ESP32-S3模組是怎么配置低功耗模式的?低功耗模式下功耗大概是多少? 3627次閱讀
- 使用ESP32-S3搭建網(wǎng)絡(luò)攝像頭 5083次閱讀
- 基于ESP32-S3的高性能開發(fā)板介紹 8718次閱讀
- ESP32-C3硬件定時器簡介及使用 4259次閱讀
- ESP32-C3 WIFI的工作模式 4478次閱讀
- 什么是ESP32-CAM攝像頭? 2.1w次閱讀
- 使用ESP32實現(xiàn)UDP通信的方法 5727次閱讀
- ESP8266/ESP32自動下載原理 4249次閱讀
- 如何在ESP32上使用代碼運行TensorFlow模型? 4526次閱讀
- TensorFlow Lite是TensorFlow針對移動和嵌入式設(shè)備的輕量級解決方案 2.5w次閱讀
- 在Python中利用dlib進(jìn)行人臉檢測 6501次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應(yīng)用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關(guān)電源設(shè)計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅(qū)動電路設(shè)計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學(xué)會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多