作者:盧雨畋英特爾邊緣計算創(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)語義特征抽取。
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)練)如下所示:
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共同帶來的便捷體驗。
審核編輯:湯梓紅
-
英特爾
+關(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)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論