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

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

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

在英特爾開發(fā)套件上用OpenVIN實現(xiàn)中文圖文檢索

英特爾物聯(lián)網(wǎng) ? 來源:英特爾物聯(lián)網(wǎng) ? 2023-10-27 11:06 ? 次閱讀

作者:盧雨畋英特爾邊緣計算創(chuàng)新大使

本文演示了使用OpenVINO與Chinese-Clip進行中文圖文相似性匹配任務(wù):CLIP 模型以自監(jiān)督的方式在數(shù)億或數(shù)十億(圖像,文本)對上進行訓(xùn)練,它從輸入圖像和文本中提取特征向量 embedding,根據(jù)特征相似度匹配可完成圖像分類和相似查找任務(wù)。CLIP 模型的 zero-shot 分類效果就能達到在 Imagenet 上監(jiān)督訓(xùn)練的 ResNet 分類效果,且有更好的泛化和抽象能力。

得益于中文 Clip模型較小的計算開銷與OpenVINO 的優(yōu)化效果,我們能夠在英特爾開發(fā)者套件 AIxBoard 上良好的復(fù)現(xiàn)這一推理流程。

本文不會展示所有的代碼,所有資料和代碼的在文末的下載鏈接給出。

英特爾開發(fā)者套件

AIxBoard(愛克斯板)

英特爾開發(fā)套件AIxBoard(愛克斯板)由 2023 年藍(lán)蛙智能推出的人工智能嵌入式開發(fā)板,專為支持入門級人工智能應(yīng)用和邊緣智能設(shè)備而設(shè)計,是一款面向?qū)I(yè)創(chuàng)客、開發(fā)者的功能強大的小型計算機。借助OpenVINO工具套件,能夠?qū)崿F(xiàn) CPU + iGPU 的高效異構(gòu)計算推理。

CLIP 原理

CLIP 模型(Contrastive Language-Image Pre-Training) 是來自 OpenAI 的經(jīng)典圖文表征模型,采用雙塔模型結(jié)構(gòu)(如下圖),利用大規(guī)模圖文對平行語料進行對比學(xué)習(xí),從而能夠?qū)崿F(xiàn)圖片和文本的跨模態(tài)語義特征抽取。

33932828-7475-11ee-939d-92fbcf53809c.png

CLIP 模型基于英文圖文語料,不能用于中文的圖文表征提取場景。得益于達摩院的工作,達摩院的中文 CLIP 以英文 CLIP 視覺側(cè)參數(shù)和中文 Roberta 參數(shù),作為模型初始化值,使用大規(guī)模中文數(shù)據(jù)進行訓(xùn)練(~2 億圖文對);最終可用于中文場景下的圖文檢索和圖像、文本的表征提取,應(yīng)用于搜索、推薦等應(yīng)用。

二階段預(yù)訓(xùn)練策略(一階段僅訓(xùn)練文本側(cè),二階段同時訓(xùn)練)如下所示:

33aa9f9e-7475-11ee-939d-92fbcf53809c.png

CLIP 應(yīng)用

CLIP 可以應(yīng)用于各類不同的場景:

Zero Shot分類

將圖像與類別文本相比較,以得到最接近的分類結(jié)果。(例如:圖像分類)

Retrieval

對于給定的輸入文本和圖像,在大量文本與圖像數(shù)據(jù)中找到最匹配的結(jié)果。(例如:clip-retrieval)

CLIP Guidance

對于圖像生成模型,結(jié)合生成結(jié)果與輸入文本間的 CLIP 距離生成更好的圖片(例如:VQGAN + CLIP)

CLIP Captioning

利用 CLIP encoding 提取特征,以該特征的映射結(jié)果結(jié)合 GPT2 生成 caption.(例如:ClipCap)

在本文中,你將學(xué)會如何使用中文Clip進行Zero Shot分類,以及處理簡單的文字與圖像檢索任務(wù)。

模型下載

為節(jié)省時間,這里我直接提供了中文clip onnx模型;你也可以根據(jù)導(dǎo)出教程,自行導(dǎo)出onnx模型。值得注意的是,OpenVINO也支持Pytorch模型到 OpenVINO IR的轉(zhuǎn)換方式,如果有興趣你可以參考轉(zhuǎn)換教程,與源碼自行轉(zhuǎn)換直接得到OpenVINO模型。

(注意:在這里我提前導(dǎo)出了base的模型,如果你發(fā)現(xiàn)在部分任務(wù)下效果不是很好,可以嘗試large模型或者進行微調(diào),中文 Clip的官方倉庫中提供了所有的可參考資料。)

模型的加載與運行

01通用模型類

準(zhǔn)備用于結(jié)果預(yù)測的通用模型類,包括模型的初始化與推理。

OpenVINO 模型初始化有四個主要步驟:

1.初始化 OpenVINO Runtime。

2.從模型文件中讀取網(wǎng)絡(luò)和權(quán)重(支持pytorch onnx paddle tensorflow vinoIR多種中間格式的直接讀?。?/p>

3.將模型編譯為設(shè)備可用的形式。

4.獲取并準(zhǔn)備節(jié)點的輸入和輸出名稱。

我們可以將它們放在一個類的構(gòu)造函數(shù)中。為了讓 OpenVINO 自動選擇最佳設(shè)備進行推理,只需使用“AUTO”。大多數(shù)情況下,最佳設(shè)備是“GPU”(性能更好,但啟動時間稍長)。

core = ov.Core()
class VinoModel:
  def init(self, model_path, device=“AUTO”):
    self.model = core.read_model(model=model_path)
    self.input_layer = self.model.input(0)
    self.input_shape = self.input_layer.shape
    self.height = self.input_shape[2]
    self.width = self.input_shape[3]
    print(“input shape:”,self.input_layer.shape)
    print(“input names:”,self.input_layer.names)
    self.compiled_model = core.compile_model(model=self.model, device_name=device)
    self.output_layer = self.compiled_model.output(0)
    print(“output names:”,self.output_layer.names)
  def predict(self, input):
    result = self.compiled_model(input)[self.output_layer]
    return result
img_model = VinoModel(“image_model.onnx”)
txt_model = VinoModel(“text_model.onnx”)

左滑查看更多

02預(yù)處理

在輸入OpenVINO引擎推理之前,我們需要對數(shù)據(jù)進行適當(dāng)?shù)念A(yù)處理操作,數(shù)據(jù)預(yù)處理函數(shù)改變輸入數(shù)據(jù)的布局和形狀以適配網(wǎng)絡(luò)輸入格式。

def preprocess(image:np.ndarray):
  image = cv2.resize(image, (224, 224), interpolation=cv2.INTER_CUBIC).astype(np.float32) / 255.0
  mean = np.array([0.48145466, 0.4578275, 0.40821073])
  std = np.array([0.26862954, 0.26130258, 0.27577711])
  image = (image - mean) / std
  image = np.transpose(image, (2, 0, 1))
  image = np.expand_dims(image,axis=0).astype(np.float32)
  return image

左滑查看更多

03核心函數(shù)

在核心處理函數(shù)中,我們需要分別提取圖像和文本的Embedding特征,歸一化后一一匹配得到最接近的特征結(jié)果。

def run_clip(image:np.ndarray,input_strs:List[str]):
  image_features = _img_feature(preprocess(image))
  text_features = _text_feature(input_strs)
  logits_per_image = 100 * np.dot(image_features, text_features.T)
  exp_logits = np.exp(logits_per_image - np.max(logits_per_image, axis=-1, keepdims=True))
  max_logit = exp_logits / np.sum(exp_logits, axis=-1, keepdims=True)
  max_str = input_strs[max_logit.argmax()]
  max_str_logit = max_logit.max()
  return max_str, max_str_logit

左滑查看更多

接下來我們將進行Clip模型的推理,我們選擇一個青蛙的圖片作為推理對象。

我們可以初始化一個字符串列表,從而得到該圖最匹配的一個文本信息

你可以構(gòu)建一個自己想要進行分類的字符串列表,從而達到在不同任務(wù)上分類的目的。

text = [“大象”, “猴子”, “長頸鹿”, “青蛙”]
max_str, max_str_logit = run_clip(image,text)
print(f”最大概率:{max_str_logit}, 對應(yīng)類別:{max_str}“)

左滑查看更多

結(jié)果顯示為:

最大概率:0.9436781406402588, 對應(yīng)類別:青蛙

左滑查看更多

你可以根據(jù)自己的需求構(gòu)建不同的分類文本標(biāo)簽,達到zero shot分類的目的。

除此之外,我們還可以利用OpenVINO提供的Benchmark工具,來更好的觀察Clip模型運行的吞吐量與效率

(注意:你可以將AUTO顯式指定為GPU觀察結(jié)果的區(qū)別,你也可以嘗試把之前加載的模型重新編譯到GPU觀察性能和結(jié)果是否有所區(qū)別。)

!benchmark_app-mimage_model.onnx-dAUTO-apisync-t30

左滑查看更多

圖文檢索

接下來,我們將結(jié)合之前的推理Embedding結(jié)果,利用端到端機器學(xué)習(xí)Embedding開源庫Towhee以及Meta向量數(shù)據(jù)庫Faiss,構(gòu)建一個高效的文圖檢索與圖圖檢索引擎。通過在邊緣設(shè)備上部署檢索引擎,我們能夠有效地篩選和總結(jié)推理檢測結(jié)果,從而更好地進行綜合統(tǒng)計分析。

除此之外,Chinese-Clip同時提供了微調(diào)的接口,通過對指定商品數(shù)據(jù)的微調(diào),你可以結(jié)合檢索引擎實現(xiàn)一個商品檢索裝置,抑或是端側(cè)商品推薦系統(tǒng)。

(注意:這里只是一個范例,你可以使用端側(cè)設(shè)備得到Embedding但使用云端數(shù)據(jù)庫進行匹配,又或者是利用它減少端側(cè)數(shù)據(jù)的篩選時間。)

from towhee.operator import PyOperator
from towhee import ops, pipe, DataCollection,register
import glob
@register
class img_embedding(PyOperator):
  def call(self, path):
    image = np.array(Image.open(path).convert(‘RGB’))
    return _img_feature(preprocess(image))[0]
@register
class text_embedding(PyOperator):
  def call(self, input_strs):
    return _text_feature(input_strs)[0]

左滑查看更多

通過構(gòu)建自定義 Towhee ops 進行 pipeline 推理,我們可以很容易進行文圖檢索:

decode = ops.image_decode.cv2(‘rgb’)
text_pipe = (
  pipe.input(‘text’)
  .map(‘text’, ‘vec’, ops.text_embedding())
  # faiss op result format: [[id, score, [file_name], …]
  .map(‘vec’, ‘row’, ops.ann_search.faiss_index(‘./faiss’, 5))
  .map(‘row’, ‘images’, lambda x: [decode(item[2][0]) for item in x])
  .output(‘text’, ‘images’)
)
DataCollection(text_pipe([‘吃東西的人’])).show()

左滑查看更多

我們輸出了topk前 5 的結(jié)果,你可以根據(jù)自己的需求修改需要展示多少相關(guān)圖片。

不局限于文圖搜索,我們也可以實現(xiàn)圖圖檢索的功能:

image_pipe = (
  pipe.input(‘img’)
  .map(‘img’, ‘vec’, ops.img_embedding())
  # faiss op result format: [[id, score, [file_name], …]
  .map(‘vec’, ‘row’, ops.ann_search.faiss_index(‘./faiss’, 5))
  .map(‘row’, ‘images’, lambda x: [decode(item[2][0]) for item in x])
  .output(‘img’, ‘images’)
)
DataCollection(image_pipe(‘images/000000005082.jpg’)).show()

左滑查看更多

是不是覺得很神奇?即使是小型邊緣設(shè)備也能夠運行Clip這樣的大型模型,快通過下方鏈接獲取所有資料,與我一起感受中文Clip與OpenVINO共同帶來的便捷體驗。

審核編輯:湯梓紅

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

    關(guān)注

    61

    文章

    9964

    瀏覽量

    171771
  • 人工智能
    +關(guān)注

    關(guān)注

    1791

    文章

    47279

    瀏覽量

    238489
  • 開發(fā)套件
    +關(guān)注

    關(guān)注

    2

    文章

    154

    瀏覽量

    24277
  • OpenVINO
    +關(guān)注

    關(guān)注

    0

    文章

    93

    瀏覽量

    202

原文標(biāo)題:在英特爾開發(fā)套件上用 OpenVINO? 實現(xiàn)中文圖文檢索 | 開發(fā)者實戰(zhàn)

文章出處:【微信號:英特爾物聯(lián)網(wǎng),微信公眾號:英特爾物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    【Intel Edison試用體驗】+Intel Edison開發(fā)套件資料?

    本帖最后由 anger0925 于 2016-7-1 08:17 編輯 Intel Edison Arduino開發(fā)套件資料: 1,英特爾? Edison開發(fā)套件中文官網(wǎng),htt
    發(fā)表于 07-01 08:16

    英特爾82801HM IO控制器開發(fā)套件

    英特爾 82801HM I/O 控制器開發(fā)套件英特爾 凌動 處理器系列包括板載處理器,該處理器采用 45 納米制程技術(shù)的集成優(yōu)化圖形和內(nèi)存控制器,與上一代英特爾 凌動 處理器 N2
    發(fā)表于 12-07 14:05 ?29次下載
    <b class='flag-5'>英特爾</b>82801HM IO控制器<b class='flag-5'>開發(fā)套件</b>

    英特爾QM57高速芯片組開發(fā)套件

    英特爾酷睿處理器系列和移動式英特爾QM57高速芯片組開發(fā)套件采用行業(yè)標(biāo)準(zhǔn)的x86架構(gòu),擁有智能性能、優(yōu)異能效、集成顯卡和糾錯編碼(ECC)內(nèi)存。這些集成的雙芯片平臺不僅可提供卓越
    發(fā)表于 12-07 14:06 ?50次下載
    <b class='flag-5'>英特爾</b>QM57高速芯片組<b class='flag-5'>開發(fā)套件</b>

    英特爾酷睿2雙核處理器SL9380和英特爾3100芯片組開發(fā)套件

    英特爾 酷睿2 雙核處理器 SL9380 和英特爾 3100 芯片組開發(fā)套件為各種嵌入式和通信基礎(chǔ)設(shè)施應(yīng)用提供優(yōu)越的平臺,特別是要求高性能、高可靠性和低功耗的小型嵌入式平臺應(yīng)用,例如:
    發(fā)表于 12-07 14:07 ?23次下載
    <b class='flag-5'>英特爾</b>酷睿2雙核處理器SL9380和<b class='flag-5'>英特爾</b>3100芯片組<b class='flag-5'>開發(fā)套件</b>

    英特爾凌動N270處理器和移動式英特爾945GSE高速芯片組開發(fā)套件

    英特爾 凌動 N270 處理器 和移動式英特爾 945GSE 高速芯片組開發(fā)套件高速芯片組開發(fā)套件為嵌入式市場提供了優(yōu)異的每瓦性能、高能效顯卡, 豐富的 I/O 功能, 并且經(jīng)濟高效的
    發(fā)表于 12-07 14:08 ?31次下載
    <b class='flag-5'>英特爾</b>凌動N270處理器和移動式<b class='flag-5'>英特爾</b>945GSE高速芯片組<b class='flag-5'>開發(fā)套件</b>

    英特爾BOOT Loader開發(fā)套件-高級嵌入式開發(fā)基礎(chǔ)

    從技術(shù)角度概括介紹用于快速開發(fā)和部署啟動加載器的英特爾 Boot Loader 開發(fā)套件(英特爾 BLDK),該套件基于
    發(fā)表于 12-07 14:57 ?59次下載
    <b class='flag-5'>英特爾</b>BOOT Loader<b class='flag-5'>開發(fā)套件</b>-高級嵌入式<b class='flag-5'>開發(fā)</b>基礎(chǔ)

    英特爾945GME高速芯片組開發(fā)套件

    英特爾945GME高速芯片組開發(fā)套件是多種低功耗嵌入式應(yīng)用,如工業(yè)自動化,測試和儀表、航空、國防和醫(yī)療成像系統(tǒng)的開發(fā)人員的理想選擇
    發(fā)表于 12-08 10:15 ?47次下載
    <b class='flag-5'>英特爾</b>945GME高速芯片組<b class='flag-5'>開發(fā)套件</b>

    英特爾的945GME高速芯片組開發(fā)套件

    英特爾的945GME高速芯片組開發(fā)套件
    發(fā)表于 10-30 11:57 ?3次下載

    使用英特爾物聯(lián)網(wǎng)商業(yè)開發(fā)套件改變世界

    使用英特爾?物聯(lián)網(wǎng)商業(yè)開發(fā)套件改變世界。
    的頭像 發(fā)表于 05-31 10:06 ?1826次閱讀

    最新版英特爾? SoC FPGA 嵌入式開發(fā)套件(SoC EDS)全面的工具套件

    使用內(nèi)置于英特爾? SoC FPGA 開發(fā)套件(也可以用作外部 JTAG 調(diào)試線纜)的英特爾? FPGA Download Cable II 執(zhí)行裸機調(diào)試從 Platform Designer
    的頭像 發(fā)表于 11-20 09:34 ?7053次閱讀

    英特爾開源WebRTC開發(fā)套件OWT 帶來巨大的潛在商業(yè)回報

    為搶占實時視頻的巨大市場,英特爾開源了WebRTC開發(fā)套件,并將其命名為Open WebRTC Toolkit (OWT)。由于實時視頻編碼、轉(zhuǎn)碼需要大量的計算資源,Open WebRTC Toolkit將為英特爾帶來巨大的潛在
    的頭像 發(fā)表于 06-05 10:43 ?1.2w次閱讀
    <b class='flag-5'>英特爾</b>開源WebRTC<b class='flag-5'>開發(fā)套件</b>OWT 帶來巨大的潛在商業(yè)回報

    基于OpenVINO英特爾開發(fā)套件實現(xiàn)眼部追蹤

    本文將以訓(xùn)練一個眼部追蹤 AI 小模型為背景,介紹從 Pytorch 自定義網(wǎng)絡(luò)模型,到使用 OpenVINO NNCF 量化工具優(yōu)化模型,并部署到英特爾開發(fā)套件愛克斯開發(fā)板 AIxBoard 的流程。
    的頭像 發(fā)表于 09-18 10:11 ?766次閱讀

    基于英特爾開發(fā)套件的AI字幕生成器設(shè)計

    市面上有很多自然語言處理模型,本文旨在幫助開發(fā)者快速將 OpenAI* 的熱門 NLP 模型 Whisper 部署至英特爾 開發(fā)套件愛克斯開發(fā)
    的頭像 發(fā)表于 09-27 16:59 ?884次閱讀
    基于<b class='flag-5'>英特爾</b><b class='flag-5'>開發(fā)套件</b>的AI字幕生成器設(shè)計

    基于英特爾? QuickAssist的?EP80579集成處理器開發(fā)套件

    采用英特爾? QuickAssist 技術(shù)的英特爾? EP80579 集成處理器的開發(fā)套件使客戶能夠為嵌入式、存儲和通信應(yīng)用創(chuàng)建新一代解決方案。該處理器采用片系統(tǒng) (SOC) 處理器
    發(fā)表于 11-14 08:32 ?0次下載
    基于<b class='flag-5'>英特爾</b>? QuickAssist的?EP80579集成處理器<b class='flag-5'>開發(fā)套件</b>

    英特爾開發(fā)套件『哪吒』Java環(huán)境實現(xiàn)ADAS道路識別演示 | 開發(fā)者實戰(zhàn)

    本文使用來自O(shè)penModelZoo的預(yù)訓(xùn)練的road-segmentation-adas-0001模型。ADAS代表高級駕駛輔助服務(wù)。該模型識別四個類別:背景、道路、路緣和標(biāo)記。硬件環(huán)境此文使用了英特爾開發(fā)套件家族里的『哪吒』(Nezha)
    的頭像 發(fā)表于 04-29 08:07 ?577次閱讀
    <b class='flag-5'>英特爾</b><b class='flag-5'>開發(fā)套件</b>『哪吒』<b class='flag-5'>在</b>Java環(huán)境<b class='flag-5'>實現(xiàn)</b>ADAS道路識別演示 | <b class='flag-5'>開發(fā)</b>者實戰(zhàn)