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

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

3天內(nèi)不再提示

基于AX650N部署SegFormer

愛芯元智AXERA ? 來源:愛芯元智AXERA ? 2023-06-20 16:37 ? 次閱讀

背景

語義分割(Semantic Segmentation)是計(jì)算機(jī)視覺中的一項(xiàng)基本任務(wù)。與單張圖像分類任務(wù)相比,語義分割相當(dāng)于是像素級(jí)別上的分類任務(wù)。語義分割為許多下游應(yīng)用特別是近幾年來的智能駕駛技術(shù)的落地提供了可能。

本文將簡(jiǎn)單介紹SegFormer的基本原理,同時(shí)指導(dǎo)如何導(dǎo)出ONNX模型,并將其部署在優(yōu)秀的端側(cè)AI芯片AX650N上,希望能給行業(yè)內(nèi)對(duì)邊緣側(cè)/端側(cè)部署Transformer模型的愛好者提供新的思路。

SegFormer介紹

SegFormer的論文中提出了一個(gè)簡(jiǎn)單、高效的語義分割方案,它將Transformers與輕量級(jí)多層感知(MLPs)解碼器結(jié)合起來。SegFormer有兩個(gè)吸引人的特點(diǎn):

1

SegFormer包含一個(gè)新的層次結(jié)構(gòu)的Transformer編碼器,輸出多尺度特征。它不需要位置編碼,這樣就不用對(duì)位置編碼做插值。

2

SegFormer避免了復(fù)雜的解碼器。所提出的MLP解碼器從不同的層聚集信息,從而結(jié)合Local Attention和Global Attention來呈現(xiàn)強(qiáng)大的表示。這種簡(jiǎn)單而輕量級(jí)的設(shè)計(jì)是用Transformer高效地做分割的關(guān)鍵。

論文中擴(kuò)展了上述方案,得到了一系列不同大小型號(hào)的模型,從SegFormer-B0到SegFormer-B5,相比之前的分割模型達(dá)到了更好的性能和效率。例如,SegFormer-B4在ADE20K上以64M參數(shù)實(shí)現(xiàn)了50.3%的mIoU,最佳模型SegFormer-B5在Cityscapes驗(yàn)證集上達(dá)到了84.0%的mIoU。

2.1 骨干網(wǎng)絡(luò)

5dedd428-0f45-11ee-962d-dac502259ad0.png

backbone

2.2 分級(jí)Transformer編碼器

論文中提出了一系列的Mix Transformer編碼器(MiT),MiT-B0到MiT-B5,具有相同的結(jié)構(gòu),但尺寸不同。MiT-B0是用于快速推理的輕量級(jí)模型,而MiT-B5是用于最佳性能的最大模型。設(shè)計(jì)的MiT部分靈感來自ViT,但針對(duì)語義分割進(jìn)行了定制和優(yōu)化。

2.3 輕量級(jí)All-MLP解碼器

集成了一個(gè)僅由MLP層組成的輕量級(jí)解碼器,這避免了其他方法中通常用的手工制作和計(jì)算要求很高的組件。實(shí)現(xiàn)這種簡(jiǎn)單解碼器的關(guān)鍵是分級(jí)Transformer編碼器比傳統(tǒng)的CNN編碼器具有更大的有效感受野(ERF)。

5e3be17c-0f45-11ee-962d-dac502259ad0.png

benchmark

AX650N

AX650N是一款兼具高算力與高能效比的SoC芯片,集成了八核Cortex-A55 CPU,10.8TOPs@INT8 NPU(針對(duì) Transformer 模型進(jìn)行了定制優(yōu)化),支持8K@30fps的ISP,以及H.264、H.265編解碼的VPU。接口方面,AX650N支持64bit LPDDR4x,多路MIPI輸入,千兆Ethernet、USB、以及HDMI 2.0b輸出,并支持32路1080p@30fps解碼。強(qiáng)大的性能可以讓AX650N幫助用戶在智慧城市、智慧教育、智能制造等領(lǐng)域發(fā)揮更大的價(jià)值。

模型轉(zhuǎn)換

本文以segformer-b0-cityscapes-640-1280為例。

4.1 模型下載

這次我們推薦從Huggingface的ModelZoo下載模型。

5ea3bd4c-0f45-11ee-962d-dac502259ad0.png

huggingface

● ONNX模型導(dǎo)出的腳本

ONNX模型導(dǎo)出

import torch
from transformers import SegformerForSemanticSegmentation, SegformerFeatureExtractor
from pathlib import Path
from onnxruntime.quantization import quantize_dynamic, QuantType, preprocess
import onnx
import onnxruntime
import os
from PIL import Image
from typing import List


def export_model(model_name: str, export_dir: str, input_sample: torch.Tensor):
  model = SegformerForSemanticSegmentation.from_pretrained(model_name)
  model.eval()
  export_path = os.path.join(export_dir, model_name)
  Path(export_path).mkdir(parents=True, exist_ok=True)
  onnx_path = os.path.join(export_path, "model.onnx")
  # export the model to ONNX while preserving the first dimension as dynamic
  torch.onnx.export(model, input_sample, onnx_path, export_params=True, 
            opset_version=11,
            input_names=["input"],
            output_names=["output"],
            )


export_dir = "./hf_export/"


model_name = "nvidia/segformer-b0-finetuned-cityscapes-640-1280"
export_model(model_name, export_dir, torch.randn([1,3,640,1280]))


# model_name = "nvidia/segformer-b1-finetuned-ade-512-512"
# export_model(model_name, export_dir, torch.randn([1,3,512,512]))
# check_models(model_name, export_dir, image_paths)

● onnxsim優(yōu)化

$ onnxsim segformer-b0-cityscapes-640-1280.onnx segformer-b0-cityscapes-640-1280-sim.onnx
Simplifying...
Finish! Here is the difference:
┏━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┓
┃      ┃ Original Model ┃ Simplified Model ┃
┡━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━┩
│ Add    │ 136      │ 136       │
│ Concat   │ 21       │ 1        │
│ Constant  │ 176      │ 0        │
│ Conv    │ 20       │ 20        │
│ Div    │ 46       │ 46        │
│ Erf    │ 8       │ 8        │
│ MatMul   │ 68       │ 68        │
│ Mul    │ 46       │ 46        │
│ Pow    │ 30       │ 30        │
│ ReduceMean │ 60       │ 60        │
│ Relu    │ 1       │ 1        │
│ Reshape  │ 76       │ 76        │
│ Resize   │ 4       │ 4        │
│ Shape   │ 20       │ 0        │
│ Slice   │ 20       │ 0        │
│ Softmax  │ 8       │ 8        │
│ Sqrt    │ 30       │ 30        │
│ Sub    │ 30       │ 30        │
│ Transpose │ 76       │ 76        │
│ Model Size │ 14.3MiB    │ 14.3MiB     │
└────────────┴────────────────┴──────────────────┘

● 添加argmax輸出頭

由于AX650N的NPU支持argmax算子,因此可以將argmax添加到該模型的輸出頭,直接獲取每個(gè)像素點(diǎn)置信度最高的類別ID。

首先安裝onnx_graphsurgeon依賴:

pip install onnx_graphsurgeon --index-url https://pypi.ngc.nvidia.com

運(yùn)行下面的腳本,添加argmax op:

import numpy as np
import onnx
import onnx_graphsurgeon as gs


model_path = "./segformer-b0-cityscapes-640-1280-sim.onnx"
output_model_path = "./segformer-b0-cityscapes-640-1280-sim-argmax.onnx"


onnx_model = onnx.load(model_path)
onnx_graph = gs.import_onnx(onnx_model)
node_last_conv = onnx_graph.nodes[-1]


# Attrs for ArgMax
axis = 1
keepdims = 1


argmax_out_shape = node_last_conv.outputs[0].shape.copy()
argmax_out_shape[axis] = 1


argmax_out = gs.Variable(
  "argmax_output",
  dtype=np.int64,
  shape=argmax_out_shape,
)


argmax_node = gs.Node(
  op="ArgMax",
  name="decode_head_ArgMax",
  inputs=[node_last_conv.outputs[0]],
  outputs=[argmax_out],
  attrs={"axis": axis, "keepdims": keepdims},
)


onnx_graph.nodes.append(argmax_node)
onnx_graph.outputs.clear()
onnx_graph.outputs = [argmax_out]
onnx_graph.cleanup().toposort()
onnx_model_with_argmax = gs.export_onnx(onnx_graph)
onnx_model_with_argmax.ir_version = onnx_model.ir_version


onnx.save(onnx_model_with_argmax, output_model_path)

添加argmax前后兩個(gè)ONNX模型對(duì)比:

5ee9c300-0f45-11ee-962d-dac502259ad0.png

add-argmax

4.2 模型編譯

使用AX650N配套的AI工具鏈Pulsar2,一鍵完成圖優(yōu)化、離線量化、編譯、對(duì)分功能。

$ pulsar2 build --input model/segformer-b0-cityscapes-640-1280-sim-argmax.onnx --output_dir segformer/ --config config/seg          former_config.json --npu_mode NPU3
Building onnx ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
patool: Extracting ./dataset/coco_4.tar ...
patool: running /usr/bin/tar --extract --file ./dataset/coco_4.tar --directory segformer/quant/dataset/input
patool: ... ./dataset/coco_4.tar extracted to `segformer/quant/dataset/input'.
                                       Quant Config Table
┏━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Input ┃ Shape       ┃ Dataset Directory ┃ Data Format ┃ Tensor Format ┃ Mean                     ┃ Std                     ┃
┡━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ input │ [1, 3, 640, 1280] │ input       │ Image    │ RGB      │ [123.67500305175781, 116.27999877929688,   │ [58.39500045776367, 57.119998931884766,   │
│    │          │          │       │        │ 103.52999877929688]              │ 57.356998443603516]             │
└───────┴───────────────────┴───────────────────┴─────────────┴───────────────┴───────────────────────────────────────────────┴──────────────────────────────────────────────┘
4 File(s) Loaded.
[14:17:44] AX LSTM Operation Format Pass Running ...   Finished.
[14:17:44] AX Refine Operation Config Pass Running ...  Finished.
[14:17:44] AX Transformer Optimize Pass Running ...    Finished.
[14:17:45] AX Reset Mul Config Pass Running ...      Finished.
[14:17:45] AX Tanh Operation Format Pass Running ...   Finished.
[14:17:45] AX Quantization Config Refine Pass Running ... Finished.
[14:17:45] AX Quantization Fusion Pass Running ...    Finished.
[14:17:45] AX Quantization Simplify Pass Running ...   Finished.
[14:17:45] AX Parameter Quantization Pass Running ...   Finished.
Calibration Progress(Phase 1): 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████| 4/4 [00:23<00:00, ?5.86s/it]
Finished.
[1411] AX Passive Parameter Quantization Running ... ?Finished.
[1411] AX Parameter Baking Pass Running ... ? ? ? ? ? Finished.
[1412] AX Refine Int Parameter Pass Running ... ? ? ? Finished.
Network Quantization Finished.
quant.axmodel export success: segformer/quant/quant_axmodel.onnx
Building native ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 000
......
2023-05-30 1418.661 | INFO ? ? | yasched.test_onepass1615 - max_cycle = 37883954
2023-05-30 14:35:04.545 | INFO ? ? | yamain.command.build904 - fuse 1 subgraph(s)

上板部署

5.1 AX-Samples

開源項(xiàng)目AX-Samples實(shí)現(xiàn)了常見的深度學(xué)習(xí)開源算法在愛芯元智的AI SoC上的示例代碼,方便社區(qū)開發(fā)者進(jìn)行快速評(píng)估和適配。最新版本已開始提供AX650系列的NPU示例,其中也包含了本文介紹的SegFormer參考代碼。

https://github.com/AXERA-TECH/ax-samples/blob/main/examples/ax650/ax_segformer_steps.cc

5.2 運(yùn)行

# ./ax_segformer -m segformer-b0-cityscapes-640-1280-argmax.axmodel -i segformer_test.png
--------------------------------------
model file : segformer-b0-cityscapes-640-1280-argmax.axmodel
image file : segformer_test.png
img_h, img_w : 640 1280
--------------------------------------
post process cost time:7.07 ms
--------------------------------------
Repeat 1 times, avg time 48.15 ms, max_time 48.15 ms, min_time 48.15 ms
--------------------------------------
--------------------------------------



審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 解碼器
    +關(guān)注

    關(guān)注

    9

    文章

    1129

    瀏覽量

    40638
  • 計(jì)算機(jī)視覺
    +關(guān)注

    關(guān)注

    8

    文章

    1694

    瀏覽量

    45901
  • AI芯片
    +關(guān)注

    關(guān)注

    17

    文章

    1850

    瀏覽量

    34853
  • MLP
    MLP
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    4217

原文標(biāo)題:愛芯分享 | 基于AX650N部署SegFormer

文章出處:【微信號(hào):愛芯元智AXERA,微信公眾號(hào):愛芯元智AXERA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于AX650N/AX620Q部署YOLO-World

    目標(biāo)檢測(cè)是計(jì)算機(jī)視覺領(lǐng)域一項(xiàng)重要的任務(wù)。開集目標(biāo)檢測(cè)(Open-set Object Detection)與閉集目標(biāo)檢測(cè)(Closed-set Object Detection)是目標(biāo)檢測(cè)領(lǐng)域的兩個(gè)概念。
    的頭像 發(fā)表于 04-17 15:36 ?3258次閱讀
    基于<b class='flag-5'>AX650N</b>/<b class='flag-5'>AX</b>620Q<b class='flag-5'>部署</b>YOLO-World

    基于AX650N/AX630C部署端側(cè)大語言模型Qwen2

    本文將分享如何將最新的端側(cè)大語言模型部署到超高性價(jià)比SoC上,向業(yè)界對(duì)端側(cè)大模型部署的開發(fā)者提供一種新的思路。
    的頭像 發(fā)表于 07-06 17:43 ?3170次閱讀
    基于<b class='flag-5'>AX650N</b>/<b class='flag-5'>AX</b>630C<b class='flag-5'>部署</b>端側(cè)大語言模型Qwen2

    愛芯元智發(fā)布第三代智能視覺芯片AX650N,為智慧生活賦能

    中國(guó) 上海 2023 年 3 月 6 日 ——人工智能視覺感知芯片研發(fā)及基礎(chǔ)算力平臺(tái)公司愛芯元智宣布推出第三代高算力、高能效比的SoC芯片——AX650N。這是繼AX620、AX630系列后,愛芯元
    發(fā)表于 03-07 10:57 ?1522次閱讀
    愛芯元智發(fā)布第三代智能視覺芯片<b class='flag-5'>AX650N</b>,為智慧生活賦能

    【愛芯派 Pro 開發(fā)板試用體驗(yàn)】在愛芯派 Pro上部署坐姿檢測(cè)

    。考慮到AX650N強(qiáng)大的能力,直接在板上編譯。 首先,git clone https://github.com/AXERA-TECH/ax-samples.git下載源碼到本地。 然后,指定芯片為
    發(fā)表于 01-16 22:41

    【愛芯派 Pro 開發(fā)板試用體驗(yàn)】篇一:開箱篇

    愛芯派 Pro (AXera-Pi Pro)M4N Dock 是一款集成了高算力、高能效 AI SOC 的開發(fā)板。它采用了愛芯 AX650N 作為主控芯片。AX650N 集成了 8 核 A55
    發(fā)表于 11-15 11:32

    【愛芯派 Pro 開發(fā)板試用體驗(yàn)】愛芯元智AX650N部署yolov5s 自定義模型

    愛芯元智AX650N部署yolov5s 自定義模型 本博客將向你展示零基礎(chǔ)一步步的部署好自己的yolov5s模型(博主展示的是安全帽模型),利用yolov5 官方的代碼工具導(dǎo)出onnx模型,并通過
    發(fā)表于 11-16 19:34

    【愛芯派 Pro 開發(fā)板試用體驗(yàn)】愛芯元智AX650N部署yolov8s 自定義模型

    愛芯元智AX650N部署yolov8s 自定義模型 本博客將向你展示零基礎(chǔ)一步步的部署好自己的yolov8s模型(博主展示的是自己訓(xùn)練的手寫數(shù)字識(shí)別模型),本博客教你從訓(xùn)練模型到轉(zhuǎn)化成利于
    發(fā)表于 11-24 20:40

    【愛芯派 Pro 開發(fā)板試用體驗(yàn)】ax650使用ax-pipeline進(jìn)行推理

    /AXERA-TECH/ax-pipeline.git 下載sdk cd ax-pipeline ./download_ax_bsp.sh ax650 cd
    發(fā)表于 12-19 17:36

    愛芯元智第三代智能視覺芯片AX650N高能效比SoC芯片

    愛芯元智正式推出第三代高算力、高能效比的SoC芯片——AX650N。這是繼AX620、AX630系列后,愛芯元智推出的又一款高性能智能視覺芯片。 AX650N是一款兼具高算力與高能效比
    的頭像 發(fā)表于 03-10 17:13 ?3877次閱讀

    如何優(yōu)雅地將Swin Transformer模型部署AX650N Demo板上?

    今年來以ChatGPT為代表的大模型的驚艷效果,讓AI行業(yè)迎來了新的動(dòng)力。各種AIGC的應(yīng)用接踵而至。
    的頭像 發(fā)表于 04-15 10:15 ?2155次閱讀

    基于AX650N部署DETR

    目標(biāo)檢測(cè)作為計(jì)算機(jī)視覺應(yīng)用的基礎(chǔ)任務(wù),一直備受行業(yè)應(yīng)用重點(diǎn)關(guān)注。從最早學(xué)術(shù)界的Two-Stage方案Faster-RCNN,到首個(gè)利于工業(yè)界高效率部署的One-Stage方案SSD(Single
    的頭像 發(fā)表于 05-15 14:27 ?793次閱讀
    基于<b class='flag-5'>AX650N</b><b class='flag-5'>部署</b>DETR

    基于AX650N部署EfficientViT

    的速度。為了實(shí)現(xiàn)對(duì)ViT模型的實(shí)時(shí)部署,微軟和港中文共同在CVPR2023提出論文《EfficientViT: Memory Efficient Vision Transformer with Cascaded Group Attention》。
    的頭像 發(fā)表于 05-26 10:30 ?976次閱讀

    基于AX650N部署SegFormer

    語義分割(Semantic Segmentation)是計(jì)算機(jī)視覺中的一項(xiàng)基本任務(wù)。與單張圖像分類任務(wù)相比,語義分割相當(dāng)于是像素級(jí)別上的分類任務(wù)。語義分割為許多下游應(yīng)用特別是近幾年來的智能駕駛技術(shù)的落地提供了可能。
    的頭像 發(fā)表于 06-20 16:37 ?602次閱讀
    基于<b class='flag-5'>AX650N</b><b class='flag-5'>部署</b><b class='flag-5'>SegFormer</b>

    基于AX650N部署視覺大模型DINOv2

    最近一段時(shí)間,基于Transformer網(wǎng)絡(luò)結(jié)構(gòu)的視覺大模型呈現(xiàn)出爆發(fā)式增長(zhǎng),繼Segment Anything(SAM)之后,Meta AI再次發(fā)布重量級(jí)開源項(xiàng)目——DINOv2。DINOv2可以抽取到強(qiáng)大的圖像特征,且在下游任務(wù)上不需要微調(diào),這使得它適合作為許多不同的應(yīng)用中新的Backbone。
    的頭像 發(fā)表于 06-30 10:07 ?2763次閱讀

    愛芯元智AX620E和AX650系列芯片正式通過PSA Certified安全認(rèn)證

    萬物互聯(lián)的時(shí)代,安全性已成為物聯(lián)網(wǎng)產(chǎn)品設(shè)計(jì)及部署的基本要求。近日,愛芯元智AX620E和AX650系列芯片(包含AX630C/AX620Q/
    的頭像 發(fā)表于 04-23 15:45 ?728次閱讀
    愛芯元智<b class='flag-5'>AX</b>620E和<b class='flag-5'>AX650</b>系列芯片正式通過PSA Certified安全認(rèn)證