前言
SAM是Meta提出的一個(gè)分割一切的提示型模型,其在1100萬(wàn)張圖像上訓(xùn)練了超過(guò)10億個(gè)掩碼,實(shí)現(xiàn)了強(qiáng)大的零樣本泛化,突破了分割界限。本例程對(duì)SAM官方開(kāi)源倉(cāng)庫(kù)的模型和算法進(jìn)行移植,使之能在基于BM1684X芯片的嵌入式設(shè)備上進(jìn)行高效推理測(cè)試。
一、特性
- ? 支持BM1684X平臺(tái)全系列部署方案(x86 PCIe、SoC、riscv PCIe)
- ? 圖像壓縮(embedding)部分支持FP16 1batch(BM1684X)模型編譯和推理
- ? 圖像推理(mask_decoder)部分支持FP32 1batch、FP16 1batch(BM1684X)模型編譯和推理
- ? 支持基于OpenCV的Python推理
- ? 支持單點(diǎn)和box輸入的模型推理,并輸出最高置信度mask或置信度前三的mask
- ? 支持圖片測(cè)試
- ? 支持無(wú)需點(diǎn)框輸入的自動(dòng)圖掩碼生成
特別說(shuō)明:
本例程已成功應(yīng)用于ShiMetaPi基于BM1684X打造的算力盒子,實(shí)現(xiàn)了圖像壓縮(embedding)和圖像推理(mask_decoder)兩個(gè)bmodel的高效協(xié)同運(yùn)行。圖像推理部分最后一層resize未編入bmodel模型,這種設(shè)計(jì)在ShiMetaPi算力盒子的實(shí)際部署中展現(xiàn)了良好的靈活性和性能平衡,為邊緣端分割任務(wù)提供了穩(wěn)定可靠的解決方案。
二、工程目錄
工程文件筆者對(duì)demo改動(dòng)較多,建議直接拷貝筆者文件到/data目錄下。
SAM
├─datasets##weby以及python案例的圖片保存
│ dog.jpg
│ groceries.jpg
│ truck.jpg
│
├─docs #
#幫助文檔
│ │ boxShare_PC_Wifi.md
│ │ sam.md
│
││ └─image #
#文檔中顯示的圖片
│ eth.png
│ ipv4.png
│ ping.png
│ regedit.png
│ result_0.jpg
│ result_auto.jpg
│ result_box_0.jpg
│ result_box_1.jpg
│ result_box_2.jpg
│ t2.png
│ t3.png
│ terminal.png
│ ui.png
│ uib.png
│ uip.png
│ wlan.png
│
├─models #
#模型文件
│ └─BM1684X #
#1684x的模型權(quán)重文件
│ ├─decode_bmodel
│ │ SAM-ViT-B_auto_multi_decoder_fp32_1b.bmodel
│ │ SAM-ViT-B_decoder_multi_mask_fp16_1b.bmodel
│ │ SAM-ViT-B_decoder_multi_mask_fp32_1b.bmodel
│ │ SAM-ViT-B_decoder_single_mask_fp16_1b.bmodel
│ │ SAM-ViT-B_decoder_single_mask_fp32_1b.bmodel
│ │
│ └─embedding_bmodel│
SAM-ViT-B_embedding_fp16_1b.bmodel
│
├─python #
#python腳本
│ amg.py
│ automatic_mask_generator.py
│ backend.py
│ predictor.py
│ sam_encoder.py
│ sam_model.py
│ sam_opencv.py
│ transforms.py
│└─web_ui web例程文件
│ index.html
│ ├─components
│ drawBox.png
│ firstPage.png
│ frontPage.png
│ singlePoint.png
│
├─css
│ styles.css
│
├─images
│ dog.jpg
│ groceries.jpg
│ truck.jpg
│
└─scripts
main.js
二、運(yùn)行步驟
檢查網(wǎng)絡(luò)環(huán)境:因?yàn)楹竺娴慕换ゾW(wǎng)頁(yè)用到了固定IP,所以這里使用開(kāi)發(fā)板通過(guò)網(wǎng)線共享電腦網(wǎng)絡(luò)的方式進(jìn)行,詳細(xì)操作可以參考聯(lián)網(wǎng)文檔(注1)。
1、環(huán)境準(zhǔn)備
修改.bashrc文件,將sophon的python環(huán)境引入。
sudovim ~/.bashrc
在文件末尾加上下面字段:
exportPYTHONPATH=$PYTHONPATH:/opt/sophon/libsophon-current/lib:/opt/sophon/sophon-opencv-latest/opencv-python/
:wq保存退出后重新加載終端。
source~/.bashrc
可echo $PYTHONPATH,檢查是否是對(duì)應(yīng)字段。
此外,運(yùn)行環(huán)境還需要以下python庫(kù):
pip3install torch
torchvision安裝過(guò)慢,可指定清華源安裝
pip3 install torchvision -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install matplotlib
pip3 install flask flask-cors## 運(yùn)行web交互案例所需,可選擇性安裝
安裝完畢可pip show 包名進(jìn)行檢查。
2、python例程測(cè)試
2.1 參數(shù)說(shuō)明
python例程主要運(yùn)行sam_opencv.py文件,參數(shù)說(shuō)明如下:
usage: sam_opencv.py [--input_image INPUT_PATH] [--input_point INPOINT_POINT]
[--embedding_bmodel EMBEDDING_BMODEL] [--bmodel BMODEL]
[--auto bool][--dev_id DEV_ID]
--input_image: 測(cè)試圖片路徑,需輸入圖片路徑;
--input_point: 輸入點(diǎn)的坐標(biāo),輸入格式為x,y;或者輸入框坐標(biāo),格式為x1,y1,x2,y2
--embedding_bmodel 用于圖像壓縮(embedding)的bmodel路徑;
--decode_bmodel: 用于推理(mask_decode)的bmodel路徑;
--dev_id: 用于推理的tpu設(shè)備id;
--auto: 是否啟用自動(dòng)分割,為bool,默認(rèn)為0不開(kāi)啟,1為開(kāi)啟;'''以下為automatic masks generator的可調(diào)參數(shù),可控制采樣點(diǎn)的密度以及去除低質(zhì)量或重復(fù)mask的閾值'''
--points_per_side: 沿圖像一側(cè)采樣的點(diǎn)數(shù)。總點(diǎn)數(shù)為points_per_side2^2。默認(rèn)值為32;
--points_per_batch: 設(shè)置模型同時(shí)檢測(cè)的點(diǎn)數(shù)。數(shù)字越大可能速度越快,但會(huì)使用更多GPU內(nèi)存。默認(rèn)值為64;
--pred_iou_thresh: [0,1]中的過(guò)濾閾值,模型的預(yù)測(cè)mask質(zhì)量。默認(rèn)值為0.88;
--stability_score_thresh: [0,1] 中的過(guò)濾閾值(截止值變化時(shí)掩模的穩(wěn)定性)用于對(duì)模型的mask預(yù)測(cè)進(jìn)行二值化。默認(rèn)值為0.95;
--stability_score_offset: 計(jì)算穩(wěn)定性分?jǐn)?shù)時(shí),偏移截止值的量。默認(rèn)值為1.0;
--box_nms_thresh: 用于過(guò)濾重復(fù)mask的非極大值抑制框IoU截止。默認(rèn)值為0.7;
--crop_nms_thresh: 用于非極大值抑制的框IoU截止,以過(guò)濾不同對(duì)象之間的重復(fù)mask。默認(rèn)值為0.7;
--crop_overlap_ratio: 設(shè)置物體重疊的程度。在第一個(gè)裁剪層中,裁剪將重疊圖像長(zhǎng)度的這一部分。物體較多的后幾層會(huì)縮小這種重疊。默認(rèn)值為512 / 1500;
--crop_n_points_downscale_factor: 在層n中采樣的每側(cè)的點(diǎn)數(shù)按比例縮小"crop_n_points_downscale_factorn"^n。默認(rèn)值為1;
--min_mask_region_area: 如果>0,將應(yīng)用后處理來(lái)移除面積小于"min_mask_region_area"的mask來(lái)中斷開(kāi)連接的區(qū)域和孔。需要opencv。默認(rèn)為0;
--output_mode: mask輸出方式。可以是binary_mask、uncompressed_rle或coco_rle ,coco_rle需要pycocotools。對(duì)于大分辨率,binary_mask可能會(huì)消耗大量?jī)?nèi)存。默認(rèn)為'binary_mask';
2.2 測(cè)試圖片
2.2.1 點(diǎn)輸入測(cè)試
cd/data/SAMpython3 python/sam_opencv.py --input_image datasets/truck.jpg --input_point 700,375 --embedding_bmodel models/BM1684X/embedding_bmodel/SAM-ViT-B_embedding_fp16_1b.bmodel --decode_bmodel models/BM1684X/decode_bmodel/SAM-ViT-B_decoder_single_mask_fp16_1b.bmodel --dev_id 0
結(jié)果如下:
終端:
圖片:圖片位于SAM目錄下的results/中
2.2.2 box輸入
python3python/sam_opencv.py --input_image datasets/truck.jpg --input_point100,300,1700,800--embedding_bmodel models/BM1684X/embedding_bmodel/SAM-ViT-B_embedding_fp16_1b.bmodel --decode_bmodel models/BM1684X/decode_bmodel/SAM-ViT-B_decoder_multi_mask_fp16_1b.bmodel --dev_id0
效果以及位置與point中類(lèi)似
2.2.3 自動(dòng)分割
若是要使用無(wú)需點(diǎn)和框輸入的全自動(dòng)掩碼生成則需要設(shè)置輸入?yún)?shù)auto為1,并設(shè)置--bmodel為auto的bmodel,操作如下:
python3 python/sam_opencv.py--input_image datasets/dog.jpg--embedding_bmodel models/BM1684X/embedding_bmodel/SAM-ViT-B_embedding_fp16_1b.bmodel--decode_bmodel models/BM1684X/decode_bmodel/SAM-ViT-B_auto_multi_decoder_fp32_1b.bmodel--dev_id0--auto1--pred_iou_thresh0.86
運(yùn)行結(jié)束后,會(huì)將結(jié)果圖保存在results/下,同時(shí)會(huì)打印推理時(shí)間等信息。
3. web例程
用于交互的圖片文件存放于SAM/web_ui/images目錄下,程序會(huì)自動(dòng)讀取目錄下所有*.jpg的所有圖片,并在前端頁(yè)面下拉框中顯示圖片名。
3.1 啟動(dòng)后端程序
后端程序位于SAM/python/中,腳本名字叫 backend.py。此web_ui的python例程不需要編譯,可以直接運(yùn)行。
3.1.1 參數(shù)說(shuō)明
usage: backend.py [--embedding_bmodel EMBEDDING_BMODEL] [
--bmodel BMODEL] [--dev_id DEV_ID]--embedding_bmodel 用于圖像壓縮(embedding)的bmodel路徑;
--bmodel: 用于推理(mask_decode)的bmodel路徑;
--dev_id: 用于推理的tpu設(shè)備id;
3.1.2 運(yùn)行示例
cd/data/SAMpython3 python/backend.py --embedding_bmodel models/BM1684X/embedding_bmodel/SAM-ViT-B_embedding_fp16_1b.bmodel --decode_bmodel models/BM1684X/decode_bmodel/SAM-ViT-B_decoder_single_mask_fp16_1b.bmodel --dev_id 0
出現(xiàn)下面內(nèi)容,說(shuō)明后端已經(jīng)啟動(dòng)
3.2 啟動(dòng)前端服務(wù)
前端程序在/data/SAM/web_ui 里面,可以通過(guò) python 啟動(dòng)。
保留后端session窗口,新開(kāi)一個(gè)session窗口用于前端:
cd/data/SAM/web_ui/
python3 -m http.server 8080
打開(kāi)PC端瀏覽器界面,在網(wǎng)址處輸入192.168.49.32:8080,進(jìn)入交互界面,點(diǎn)擊選擇要加載的圖像...的下拉框,即可選擇預(yù)存圖像。選擇Single Point進(jìn)入點(diǎn)擊模式,Draw BOX進(jìn)入框選模式。
3.2.1 點(diǎn)擊模式
點(diǎn)擊模式待圖片加載成功,點(diǎn)擊感興趣區(qū)域即可,等待1-2S,頁(yè)面繪制掩碼結(jié)果。
3.2.2 框選模式
點(diǎn)擊模式待圖片加載成功,點(diǎn)擊鼠標(biāo)拖動(dòng)框選感興趣區(qū)域即可,等待1-2S,頁(yè)面繪制掩碼結(jié)果。
PS:可在原來(lái)終端中檢測(cè)后端和前端的運(yùn)行狀態(tài),前端狀態(tài)還可在瀏覽器開(kāi)發(fā)者工具中檢測(cè)。
-
SAM
+關(guān)注
關(guān)注
0文章
118瀏覽量
34394 -
AI算力
+關(guān)注
關(guān)注
1文章
143瀏覽量
9856 -
大模型
+關(guān)注
關(guān)注
2文章
3648瀏覽量
5179 -
BM1684
+關(guān)注
關(guān)注
0文章
7瀏覽量
227 -
AI大模型
+關(guān)注
關(guān)注
0文章
398瀏覽量
998
發(fā)布評(píng)論請(qǐng)先 登錄
從模型到產(chǎn)品:Qwen2.5-VL在BM1684X邊緣計(jì)算部署全攻略
【算能RADXA微服務(wù)器試用體驗(yàn)】Radxa Fogwise 1684X Mini 規(guī)格
bm1684運(yùn)行demo報(bào)錯(cuò)怎么解決?
【算能RADXA微服務(wù)器試用體驗(yàn)】+ GPT語(yǔ)音與視覺(jué)交互:2,圖像識(shí)別
bmneto轉(zhuǎn)換模型時(shí)報(bào)錯(cuò)誤split_conv_float: Assertion \"valid\" failed是什么原因?
基于多級(jí)混合模型的圖像分割方法
近期分割大模型發(fā)展情況
32Tops算力!BM1684行業(yè)主機(jī)系列
基于算能第四代AI處理器BM1684X的邊緣計(jì)算盒子
本地化ChatGPT?Firefly推出基于BM1684X的大語(yǔ)言模型本地部署方案
探索ChatGLM2在算能BM1684X上INT8量化部署,加速大模型商業(yè)落地
一種新的分割模型Stable-SAM
圖像分割與語(yǔ)義分割中的CNN模型綜述
Qwen3-VL 4B/8B全面適配,BM1684X成邊緣最佳部署平臺(tái)!
SAM(通用圖像分割基礎(chǔ)模型)丨基于BM1684X模型部署指南
評(píng)論