電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>使用MTCNN和用于ESP32-S3的TensorFlow Lite進(jìn)行人臉檢測

使用MTCNN和用于ESP32-S3的TensorFlow Lite進(jìn)行人臉檢測

2023-06-13 | zip | 0.00 MB | 次下載 | 免費

資料介紹

描述

介紹

前段時間我第一次聽到“嵌入式機器學(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ū)域。

poYBAGSBN0yAFebIAABngXA4wtA582.png
?

R-Net(精煉網(wǎng)絡(luò))

R-Net 進(jìn)一步減少候選的數(shù)量,使用邊界框回歸進(jìn)行校準(zhǔn),并使用 NMS 合并重疊的候選。這個網(wǎng)絡(luò)是一個 CNN,而不是像 P-Net 這樣的 FCN,因為在其架構(gòu)的最后階段有一個密集層。

poYBAGSBN0-AT8WoAACmpUD8yVA100.png
?

O-Net(輸出網(wǎng)絡(luò))

這個階段類似于R-Net,但這個輸出網(wǎng)絡(luò)旨在更詳細(xì)地描述面部并輸出眼睛、鼻子和嘴巴的五個面部特征點的位置。

pYYBAGSBN1KAV3NOAAB3GFjphhE939.png
?

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)的管道的圖塊。

poYBAGSBN1SAQ7gzAADu67kh1ac171.png
?

第一步是執(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)整裁剪圖像的大小以匹配模型的輸入形狀。

pYYBAGSBN1aAUBDzAAAeOtktOiU097.png
?

另一方面,后處理包括三個步驟,應(yīng)用NMS合并重疊區(qū)域,用之前獲得的偏移量校準(zhǔn)邊界框,對最終邊界框坐標(biāo)進(jìn)行平方和校正。

poYBAGSBN1mAMEaWAABJRZfbQ90293.png
?

之前詳述的所有過程以及 TensorFlow、TensorFlow Lite 和 TensorFlow Lite Micro 的模型都是在下一個 Google Colab notebook 中開發(fā)的。

在 Colab 中打開

部署到 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)行手動安裝。

下載并安裝 ESP-IDF v5.0

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é)果。

pYYBAGSBN1uASXTIAAALN1BQ7ZA931.jpg
?

特征

  • 形狀 輸入圖像:96x96
  • 格式輸入圖像:RGB888
  • 檢測距離:10 cm - 100 cm
  • 響應(yīng)時間(1 人臉):大約 1000 毫秒

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
  2. 1.06 MB  |  532次下載  |  免費
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費
  9. 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費
  13. 7元宇宙底層硬件系列報告
  14. 13.42 MB  |  182次下載  |  免費
  15. 8FP5207XR-G1中文應(yīng)用手冊
  16. 1.09 MB  |  178次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關(guān)電源設(shè)計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅(qū)動電路設(shè)計》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191187次下載  |  免費
  13. 7十天學(xué)會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費