色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

SAM 到底是什么

OpenCV學堂 ? 來源:OpenCV學堂 ? 2023-06-12 10:46 ? 次閱讀

前言

“分割一切,大家一起失業!”——近期,這樣一句話在社交媒體上大火!這講的就是 Segment Anything Model(簡稱 “SAM” )。SAM 到底是什么?它具備哪些功能?它真的有這么強大嗎?讓我們一起通過本文了解詳情!

SAM 是一個由 Meta AI 實驗室推出的強大人工智能圖像分割應用,可以自動識別哪些圖像像素屬于一個對象,并且對圖像中各個對象進行自動風格處理,可廣泛用于分析科學圖像、編輯照片等。

SAM 的完整應用由一個圖片編碼器模型(encoder)以及掩碼解碼(mask decoder) + 提示編碼模型(prompt encoder)構成,這兩部分都可以被解析為獨立的靜態模型。其中大部分的算力負載和推理延時都集中在圖片編碼器任務,因此如果進一步提升圖片編碼器部分的執行效率,就成為了 SAM 應用的主要優化方向之一。

995622b2-083e-11ee-962d-dac502259ad0.png

圖:SAM 模型任務pipeline

本次分享講重點演示如何通過 OpenVINO 的 NNCF 模型壓縮工具實現對 SAM 編碼器部分的量化壓縮,實現在 CPU 側的性能提升。

一、量化介紹

在正式開始實戰之前,我們不得不提一下量化的概念,量化是指在不改變模型結構的情況下,將模型參數的表達區間從 FP32 映射到 INT8 或是 INT4 范圍,用更小數值位寬來表示相同的信息,實現對于模型體積的壓縮,降低內存消耗,同時在模型網絡的執行過程中,系統會自動調用硬件平臺專門針對低比特數據優化的指令集或 kernel 函數,提升性能。

996a561a-083e-11ee-962d-dac502259ad0.png

圖:不同精度數據的表示位寬

Intel AVX512 VNNI 擴展指令集實現了將原本需要3個時鐘周期才能完成的INT8矩陣點乘與加法運算壓縮到一個時鐘周期,而在最新的 AMX 指令集更是將多個 VNNI 模塊進行堆疊實現了單周期內成倍的性能提升。

9993eb10-083e-11ee-962d-dac502259ad0.png

圖:INT8 矩陣點乘與加法運算指令集優化

二、NNCF 訓練后量化模式

NNCF 工具的全稱是 Neural Network Compression Framework,是 OpenVINO 工具鏈中專門用于模型壓縮加速的方案實現,包含 量化,剪枝,二值化 等多種模型壓縮算法,調用方式又可以分化為訓練后量化 (PTQ)訓練時壓縮 (QAT) 兩種模式,訓練時壓縮要需要引入原始的訓練腳本和數據集,而訓練后量化則可以直接針對訓練生成模型文件進行壓縮,無需額外的訓練腳本和標注數據集參與,這也是 NNCF 在 OpenVINO 2023.0 正式發布的新功能特性, 而這個模式也僅僅需要以下兩步便可實現:

1. 準備校驗數據集

這里的校驗數據僅用作量化過程中對數據表示范圍與分布的計算,因此不需要額外的標簽數據,例如在圖像識別任務中,我們僅需要送入200-300張左右的圖片文件即可。此外我們還需要定義 DataLoader 對象與 transform_fn 數據轉換函數, DataLoader 用于讀取校驗數據集中的每一個元素,transform_fn 用于將讀取的元素轉化為 OpenVINO 模型推理的直接輸入數據。

import nncf
calibration_loader = torch.utils.data.DataLoader(...)
def transform_fn(data_item):
    images, _ = data_item
    return images
calibration_dataset=nncf.Dataset(calibration_loader,transform_fn)

2. 運行模型量化

首先需要導入模型對象,然后通過 nncf.quantize() 接口,將模型對象與校驗數據集綁定開啟量化任務, NNCF 工具可以支持多種模型對象類型,包含openvino.runtime.Model, torch.nn.Module, onnx.ModelProto以及 tensorflow.Module

model = ... #OpenVINO/ONNX/PyTorch/TF object
quantized_model=nncf.quantize(model,calibration_dataset)

3.(可選)準確性控制模式

如果發現 NNCF 在默認模式下的導出的模型準確性下降超過預期,我們也可以使用準確性控制模式(accuracy control)完成訓練后量化,此時我們需要加入帶標簽的測試集數據,用來評估模型在量化過程中哪些 layer 對模型準確性損失的影響(敏感度)比較大,并作為排序依據,依次將這些 layer 回退至原始精度,直到模型符合預期準確性表現。通過這個模式,我們可以在保證模型準確性的情況下,盡可能壓縮模型體積,實現性能和準確性之間的平衡。具體方法可以參考以下鏈接:

https://docs.openvino.ai/nightly/quantization_w_accuracy_control.html

三、 Segment Anything + NNCF實戰

接下來讓我們具體一步步看下如何使用 NNCF 的 PTQ 模式完成 SAM encoder 的量化。

項目地址:https://github.com/openvinotoolkit/openvino_notebooks/blob/main/notebooks/237-segment-anything/237-segment-anything.ipynb

1. 定義數據加載器

本示例使用 coco128 作為校驗數據集,其中包含 128 張 .jpg 格式的圖片。由于在量化 ONNX 或 IR 靜態模型的情況下,數據加載器必須是一個 torch 的 DataLoader 類,因此這里我們需要繼承 torch.utils.data.Dataset 并重新構建一個數據集類,其中必須包含__getitem__方法,用于遍歷數據集中的每一個對象,__len__用于獲取數據集的對象數量,最后再通過 torch.utils.data.DataLoader 方法生成數據加載器。

class COCOLoader(data.Dataset):
    def __init__(self, images_path):
        self.images = list(Path(images_path).iterdir())


    def __getitem__(self, index):
        image_path = self.images[index]
        image = cv2.imread(str(image_path))
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        return image
    
    def __len__(self):
        return len(self.images)
    
coco_dataset = COCOLoader(OUT_DIR / 'coco128/images/train2017')
calibration_loader=torch.utils.data.DataLoader(coco_dataset)

2. 定義數據格式轉化模塊

下一步是定義數據轉化模塊,我們可以調用之前定義 preprocess_image 函數完成數據的預處理,值得注意的是由于 calibration_loader 模塊返回的單個數據對象為 torch tensor 類型 ,而 OpenVINO 的 Python 接口不支持該類型數據,我們需要先將其強制轉化為 numpy 格式。

def transform_fn(image_data):
    image = image_data.numpy()
    processed_image = preprocess_image(np.squeeze(image))
    return processed_image


calibration_dataset=nncf.Dataset(calibration_loader,transform_fn)

3. 運行 NNCF 量化

為了確保量化后的模型準確性,這里我們使用原始的 FP32 ONNX 格式模型作為輸入對象,而不是 FP16 的 IR 格式模型,然后再將該對象送入 nncf.quantize 接口執行量化,該函數接口中有幾個比較重要的額外參數:

# Load FP32 ONNX model
model = core.read_model(onnx_encoder_path)
quantized_model = nncf.quantize(model,
                                calibration_dataset,
                                model_type=nncf.parameters.ModelType.TRANSFORMER,
                                preset=nncf.common.quantization.structs.QuantizationPreset.MIXED)
ov_encoder_path_int8 = "sam_image_encoder_int8.xml"
serialize(quantized_model,ov_encoder_path_int8)

· model_type:模型類別,用于開啟特殊的量化策略,例如在類 Transformer 模型中,我們需要優先保證模型的準確性。

· preset:量化模式,默認為 PERFORMANCE,使用對卷積的權重和偏置均采用對稱量化算法,有助于提升模型性能,此處為了提升模型準確性,我們采用 MIXED 模式,采用權重對稱量化,偏置非對稱量化的方法,適合模型中包含非 Relu 或者非對稱的激活層。

由于 SAM encoder 模型的網絡結構比較復雜,而量化過程中我們需要多次遍歷模型每一個 layer 的參數,所以量化耗時相對會長一些,請大家耐心等待。這邊建議使用 32G 以上內存的硬件設備,如果遇到內存不夠的情況,可以通過 subset_size=100 參數,適當降低校驗數據數量。

4.模型準確性比較

接下來我們比較下 INT8 和 FP16 模型的推理結果:

可以看到在 prompt 和 auto 模式下,INT8 模型的準確性相較 FP16 模型,幾乎沒有任何變化。

注:auto 模式下,mask 將使用隨機生成的顏色。

5. 性能比較

最后我們通過 OpenVINO 自帶的 benchmark_app 工具比較下性能指標:

[ INFO ] Execution Devices:['CPU']
[ INFO ] Count:            60 iterations
[ INFO ] Duration:         75716.93 ms
[ INFO ] Latency:
[ INFO ]    Median:        14832.33 ms
[ INFO ]    Average:       14780.77 ms
[ INFO ]    Min:           10398.47 ms
[ INFO ]    Max:           16725.65 ms
[INFO]Throughput:0.79FPS

Benchmark結果(FP16)

[ INFO ] Execution Devices:['CPU']
[ INFO ] Count:            72 iterations
[ INFO ] Duration:         68936.14 ms
[ INFO ] Latency:
[ INFO ]    Median:        11281.87 ms
[ INFO ]    Average:       11162.87 ms
[ INFO ]    Min:           6736.09 ms
[ INFO ]    Max:           12547.48 ms
[INFO]Throughput:1.04FPS

Benchmark 結果 (INT8)

可以看到在 CPU 端,INT8 模型相較 FP16 提升了大約 30%, 體積從原本的 350MB 壓縮到了 100MB 不到。

四、總結

鑒于 SAM 出色的自動化分割能力,相信未來會有越來越多應用場景會部署這項技術,而在產業化落地的過程中,開發者往往最關注的就是性能和準確性之間的平衡,以此獲取成本更優的方案。OpenVINO NNCF 工具通過對 Segment Anything encoder 部分的量化壓縮,在幾乎沒有影響模型準確性的情況下,顯著提升模型的運行效率,降低模型占用空間。
責任編輯:彭菁

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編碼器
    +關注

    關注

    45

    文章

    3663

    瀏覽量

    135038
  • 模型
    +關注

    關注

    1

    文章

    3296

    瀏覽量

    49042
  • SAM
    SAM
    +關注

    關注

    0

    文章

    113

    瀏覽量

    33556

原文標題:開發者實戰 | 分割一切?Segment Anything 量化加速實戰

文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學堂】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    PLC到底是什么呢?

    PLC到底是什么呢?
    發表于 10-10 09:30

    關于PSAM卡和SAM卡作用

    最近在研究CPU卡和M1卡的使用,網上查了查PSAM卡和SAM卡的資料,資料里說的讓我很是迷糊,就想知道PSAM卡和SAM卡的區別到底是什么?哪個是計算密鑰?哪個是認證的?
    發表于 03-20 09:20

    這是到底是什么元件?

    開關電源一個小貼片,在k2717前端。絲印MY還有133字樣。這到底是什么元件?什么原理?
    發表于 05-26 15:06

    請問CKFA到底是什么

    在其他網站看到CKFA,這個到底是什么啊?具體怎么用啊?希望能有比較詳細的解釋,謝謝!
    發表于 08-20 07:18

    這個到底是什么電路

    這個到底是積分電路還是濾波電路還是RC延時電路,我已經頭暈了
    發表于 01-20 21:56

    特性阻抗到底是什么

    特性阻抗到底是什么?
    發表于 02-25 07:16

    DSP到底是什么?DSP的要素是什么?

    DSP設計人員還是要知道到底DSP到底是什么?DSP的三要素是:性能、價格與功耗嗎?
    發表于 03-05 06:23

    QPainter到底是什么?

    QPainter到底是什么?
    發表于 09-28 06:30

    PID控制算法到底是什么?

    PID控制算法到底是什么?
    發表于 10-11 07:14

    STM32時鐘樹到底是什么?

    STM32時鐘樹到底是什么?
    發表于 11-11 06:22

    STM32固件庫到底是什么?

    STM32固件庫到底是什么?
    發表于 11-30 07:34

    RGB屏到底是什么?

    RGB屏到底是什么?
    發表于 02-14 07:18

    看看芯片到底是如何設計的

    看看芯片到底是如何設計的拿好小本本,芯片的設計之旅開始嘍推薦閱讀▼電子漫畫系列,更新九張圖片。【最強干...
    發表于 03-02 07:17

    AT指令,AT固件,這個AT到底是什么意思?

    我們常說AT指令,AT固件,這個AT到底是什么意思?
    發表于 09-26 07:25

    單片機的“性能”到底是什么?

    單片機的“性能”到底是什么?
    的頭像 發表于 10-24 16:58 ?621次閱讀
    單片機的“性能”<b class='flag-5'>到底是</b>什么?
    主站蜘蛛池模板: 成年视频国产免费观看| 伊人成色综合人网| 忘忧草在线| 中文字幕一区二区视频 | 伊人色综合久久大香| 攵女yin乱合集高h| 男女车车的车车网站W98免费| 午夜国产理论| 超碰人人澡人人胔| 狂野猛交xxxx吃奶| 亚洲精品在线免费| 国产精品AV无码免费播放| 欧美最猛性XXXXX肛交| 在教室伦流澡到高潮HNP视频| 国产毛A片久久久久久无码| 青青草原影视| 970女主播电台歌曲| 人人模人人干| 伊人网综合| 国产午夜免费不卡精品理论片| 欧洲vs美洲完整视频| 曰本老头同性xxxxx| 韩国伦理电影在线神马网| 双性诱受灌满哭求饶BL| www亚洲欲色成人久久精品| 毛片无码免费无码播放| 一区二区不卡在线视频| 极品色αv影院| 亚洲欧美韩国综合色| 国产精片久久久久久婷婷| 日韩丰满少妇无码内射| ewp系列虐杀在线视频| 高清国产mv视频在线观看| 欧美另类老少配hd| aaa在线观看视频高清视频| 美女屁股软件| 99久久国产综合精品国| 女人十八毛片水真多啊| a一级毛片视频免费看| 欧美末成年videos在线| 9LPORM原创自拍达人|