人類通過視覺和語言感知世界。人工智能的一個(gè)長(zhǎng)期目標(biāo)是構(gòu)建智能體,通過視覺和語言輸入來理解世界,并通過自然語言與人類交流。比如,在《幾行代碼加速 Stable Diffusion,使用 OpenVINO 輕松文生圖》中,我們介紹了利用OpenVINO 運(yùn)行Stable Diffusion模型,快速實(shí)現(xiàn)文生圖應(yīng)用。讓人人可以成為繪畫大師,利用AI隨心作畫。
隨著計(jì)算機(jī)視覺和自然語言處理領(lǐng)域的快速發(fā)展,視覺與語言的融合越來越受到研究人員的重視。在這個(gè)背景下,BLIP(Bootstrapping Language-Image Pre-training)作為一種創(chuàng)新的預(yù)訓(xùn)練模型,引起了廣泛關(guān)注。該模型在大規(guī)模的圖像文本數(shù)據(jù)集上預(yù)訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)模型,以提高下游視覺語言任務(wù)的性能,如圖像文本檢索、圖像字幕和視覺問答。通過聯(lián)合訓(xùn)練圖像和文本數(shù)據(jù),為視覺與語言的融合提供了強(qiáng)大的基礎(chǔ)。
BLIP 的預(yù)訓(xùn)練過程涉及兩個(gè)關(guān)鍵組件:圖像編碼器和文本編碼器。圖像編碼器負(fù)責(zé)將輸入的圖像轉(zhuǎn)換為低維向量表示,而文本編碼器則將輸入的文本轉(zhuǎn)換為另一個(gè)低維向量表示。為了實(shí)現(xiàn)統(tǒng)一的視覺-語言預(yù)訓(xùn)練,BLIP 采用了一種跨模態(tài)約束策略,即在預(yù)訓(xùn)練階段,圖像編碼器和文本編碼器被設(shè)計(jì)成相互約束的。這樣的約束機(jī)制強(qiáng)制模型學(xué)習(xí)將視覺信息和語言信息進(jìn)行對(duì)齊,從而使得模型在后續(xù)任務(wù)中能夠更好地處理視覺與語言之間的聯(lián)合信息。
除了視覺-語言理解任務(wù),BLIP 還在視覺-語言生成任務(wù)中表現(xiàn)出色。在這個(gè)任務(wù)中,模型需要根據(jù)輸入的圖像和文本生成相關(guān)的描述或回答問題。BLIP 通過聯(lián)合訓(xùn)練和引入了圖像-文本生成任務(wù),使得模型具備了更強(qiáng)大的圖像描述和問題回答能力。這使得 BLIP 在圖像描述生成和視覺問答等任務(wù)上取得了優(yōu)異的成績(jī)。
接下來,我們一起來看看如何在研揚(yáng)科技(AAEON)的新品 UP Squared Pro 7000 Edge運(yùn)行利用OpenVINO來優(yōu)化加速BLIP的推理有哪些重點(diǎn)步驟吧。
作為研揚(yáng)UP Squared Pro系列的第三代產(chǎn)品,Upsquared Pro 7000 系列 (up-shop.org) 透過高性能計(jì)算能力、升級(jí)的電路板設(shè)計(jì)和擴(kuò)展的顯示接口,提供更大的開發(fā)潛力。作為該系列中首款采用Intel Core/Atom/N系列處理器(原 Alder Lake-N)的產(chǎn)品,UP Squared Pro 7000是首款配備板載LPDDR5內(nèi)存的產(chǎn)品,提高了I/O的運(yùn)行速度。此外,UP Squared Pro 7000 在圖像處理和顯示功能方面都有顯著提升,支持MIPI CSI照相機(jī),并搭配Intel UHD顯卡,可同時(shí)進(jìn)行三臺(tái)4K顯示器。
1.4倍以上CPU性能提升
UP Squared Pro 7000采用Intel Core/Atom/N-系列處理器,CPU性能是上一代的1.4倍。UP Squared Pro 7000擁有多達(dá)8個(gè)Gracemont內(nèi)核,支持OpenVINO Toolkit,以及第12代Intel處理器的UHD顯卡,擁有強(qiáng)大的計(jì)算能力、優(yōu)化的推理引擎和圖像處理功能,提供絕佳的智能解決方案。
同步支持3臺(tái)4K顯示器
UP Squared Pro 7000配備HDMI 2.0b、DP 1.2埠和透過USB Type-C的DP 1.4a,擁有出色的顯示接口。UP Squared Pro 7000整合了GPU和多重輸出,可以同步支持三個(gè)4K顯示器,非常適合用于數(shù)字廣告牌等視覺導(dǎo)向型的相關(guān)應(yīng)用。
雙倍的高速系統(tǒng)內(nèi)存
作為UP Squared Pro系列中第一塊配備板載LPDDR5系統(tǒng)內(nèi)存的板卡,UP Squared Pro 7000搭載了16GB的系統(tǒng)內(nèi)存,是上一代的兩倍。此外,快達(dá)4800MHz的內(nèi)存速度讓用戶的帶寬和數(shù)據(jù)傳輸速度加倍,同時(shí)也更加省電。
全面的I/O升級(jí)
除了維持UP Squared Pro系列4" x 4"的緊湊外形之外,UP Squared Pro 7000 在電路板設(shè)計(jì)上更為精實(shí)。UP Squared Pro 7000配備了兩個(gè)2.5GbE、三個(gè) USB 3.2和一個(gè)FPC端口,可外接更多像是MIPI CSI 相機(jī)的外圍設(shè)備。將這些特色與板載 LPDDR5 及性能強(qiáng)大的CPU相結(jié)合,非常適合用于智慧工廠機(jī)器人方面的視覺解決方案。
注意:以下步驟中的所有代碼來自O(shè)penVINO Notebooks開源倉庫中的233-blip-visual-language-processing notebook 代碼示例,您可以點(diǎn)擊以下鏈接直達(dá)源代碼。https://github.com/openvinotoolkit/openvino_notebooks/tree/main/notebooks/233-blip-visual-language-processing
第一步:安裝相應(yīng)工具包、加載模型并轉(zhuǎn)換為OpenVINO IR格式
本次代碼示例需要首先安裝BLIP相應(yīng)工具包。
1.!pipinstall"transformers>=4.26.0"然后下載及加載相應(yīng)的PyTorch模型。在本問中,您將使用可從Hugging Face下載的blip-vqa-base基本模型。同樣的操作也適用于BLIP系列中的其它模型。盡管該模型類是為執(zhí)行問答而設(shè)計(jì)的,但其組件也可以用于圖像字幕。要開始使用該模型,需要使用from_pretrained方法實(shí)例化BlipForQuestionAnswering類。BlipProcessor是一個(gè)助手類,用于準(zhǔn)備文本和視覺模態(tài)的輸入數(shù)據(jù)以及生成結(jié)果的后處理。 1.importsys2.importtime3.fromPILimportImage4.fromtransformersimportBlipProcessor,BlipForQuestionAnswering5.6.sys.path.append("../utils")7.fromnotebook_utilsimportdownload_file8.9.#Getmodelandprocessor10.processor=BlipProcessor.from_pretrained("Salesforce/blip-vqa-base")11.model=BlipForQuestionAnswering.from_pretrained("Salesforce/blip-vqa-base")
接下來,我們看看如何將原始模型轉(zhuǎn)換為OpenVINO IR格式的模型,并利用OpenVINO進(jìn)行相應(yīng)的優(yōu)化以及部署推理加速。
第二步:將模型轉(zhuǎn)換為OpenVINO IR格式
-
文本編碼器轉(zhuǎn)換:視覺問答任務(wù)使用文本編碼器來構(gòu)建問題的嵌入表示。它采用經(jīng)過分詞后的問題的input_ids,并輸出從視覺模型獲得的圖像嵌入和它們的注意力掩碼。根據(jù)問題文本的不同,標(biāo)記化輸入后的標(biāo)記數(shù)量可能不同。因此,為使用標(biāo)記的模型輸入保留動(dòng)態(tài)形狀,dynamic_axes參數(shù)負(fù)責(zé)在torch.onx.export中保留輸入的動(dòng)態(tài)特定維度。代碼如下:
-
文本解碼器轉(zhuǎn)換:文本解碼器負(fù)責(zé)使用圖像(以及問題,如果需要的話)的表示來生成模型輸出(問題的答案或標(biāo)題)的分詞token序列。生成方法基于這樣的假設(shè),即單詞序列的概率分布可以分解為下一個(gè)單詞條件分布的乘積。換言之,模型預(yù)測(cè)由先前生成的token引導(dǎo)循環(huán)生成下一個(gè)token,直到達(dá)到停止生成的條件(生成達(dá)到最大長(zhǎng)度序列或獲得的字符串結(jié)束的token)。在預(yù)測(cè)概率之上選擇下一個(gè)token的方式由所選擇的解碼方法來驅(qū)動(dòng)。與文本編碼器類似,文本解碼器可以處理不同長(zhǎng)度的輸入序列,并且需要保留動(dòng)態(tài)輸入形狀。這部分特殊的處理可由如下代碼完成:
接下來,對(duì)于文本解碼器的轉(zhuǎn)換,還有來自前一步驟的隱藏狀態(tài)的額外輸入。與輸出類似,在模型導(dǎo)出為ONNX格式后,它們將被展平。需要使用新的輸入層更新dynamic_axies和input_names。因此,其后面的轉(zhuǎn)換過程與前面的文本編碼器的轉(zhuǎn)換過程類似,在本文中不再贅述。
第三步:運(yùn)行OpenVINO 推理
-
圖像字幕
classOVBlipModel:"""ModelclassforinferenceBLIPmodelwithOpenVINO"""def__init__(self,config,decoder_start_token_id:int,vision_model,text_encoder,text_decoder):"""Initializationclassparameters"""self.vision_model=vision_modelself.vision_model_out=vision_model.output(0)self.text_encoder=text_encoderself.text_encoder_out=text_encoder.output(0)self.text_decoder=text_decoderself.config=configself.decoder_start_token_id=decoder_start_token_idself.decoder_input_ids=config.text_config.bos_token_id定義圖像字幕函數(shù)如下,defgenerate_caption(self,pixel_values:torch.Tensor,input_ids:torch.Tensor=None,attention_mask:torch.Tensor=None,**generate_kwargs):"""ImageCaptioningpredictionParameters:pixel_values(torch.Tensor):preprocessedimagepixelvaluesinput_ids(torch.Tensor,*optional*,None):pregeneratedcaptiontokenidsaftertokenization,ifprovidedcaptiongenerationcontinueprovidedtextattention_mask(torch.Tensor):attentionmaskforcaptiontokens,usedonlyifinput_idsprovidedRetruns:generationoutput(torch.Tensor):tensorwhichrepresentssequenceofgeneratedcaptiontokenids"""batch_size=pixel_values.shape[0]image_embeds=self.vision_model(pixel_values.detach().numpy())[self.vision_model_out]image_attention_mask=torch.ones(image_embeds.shape[:-1],dtype=torch.long)ifisinstance(input_ids,list):input_ids=torch.LongTensor(input_ids)elifinput_idsisNone:input_ids=(torch.LongTensor([[self.config.text_config.bos_token_id,self.config.text_config.eos_token_id]]).repeat(batch_size,1))input_ids[:,0]=self.config.text_config.bos_token_idattention_mask=attention_mask[:,:-1]ifattention_maskisnotNoneelseNoneoutputs=self.text_decoder.generate(input_ids=input_ids[:,:-1],eos_token_id=self.config.text_config.sep_token_id,pad_token_id=self.config.text_config.pad_token_id,attention_mask=attention_mask,encoder_hidden_states=torch.from_numpy(image_embeds),encoder_attention_mask=image_attention_mask,**generate_kwargs,)returnoutputs
-
視覺問答
在OVBLIPModel類內(nèi)部同理可定義視覺問答函數(shù)如下:defgenerate_answer(self,pixel_values:torch.Tensor,input_ids:torch.Tensor,attention_mask:torch.Tensor,**generate_kwargs):"""VisualQuestionAnsweringpredictionParameters:pixel_values(torch.Tensor):preprocessedimagepixelvaluesinput_ids(torch.Tensor):questiontokenidsaftertokenizationattention_mask(torch.Tensor):attentionmaskforquestiontokensRetruns:generationoutput(torch.Tensor):tensorwhichrepresentssequenceofgeneratedanswertokenids"""image_embed=self.vision_model(pixel_values.detach().numpy())[self.vision_model_out]image_attention_mask=np.ones(image_embed.shape[:-1],dtype=int)ifisinstance(input_ids,list):input_ids=torch.LongTensor(input_ids)question_embeds=self.text_encoder([input_ids.detach().numpy(),attention_mask.detach().numpy(),image_embed,image_attention_mask])[self.text_encoder_out]question_attention_mask=np.ones(question_embeds.shape[:-1],dtype=int)bos_ids=np.full((question_embeds.shape[0],1),fill_value=self.decoder_start_token_id)outputs=self.text_decoder.generate(input_ids=torch.from_numpy(bos_ids),eos_token_id=self.config.text_config.sep_token_id,pad_token_id=self.config.text_config.pad_token_id,encoder_hidden_states=torch.from_numpy(question_embeds),encoder_attention_mask=torch.from_numpy(question_attention_mask),**generate_kwargs,)returnoutputs·初始化OpenVINO運(yùn)行時(shí)并運(yùn)行推理初始化OpenVINOCore對(duì)象,選擇推理設(shè)備,并加載、編譯模型#createOpenVINOCoreobjectinstancecore=Core()importipywidgetsaswidgetsdevice=widgets.Dropdown(options=core.available_devices+["AUTO"],value='AUTO',description='Device:',disabled=False,)device#loadmodelsondeviceov_vision_model=core.compile_model(VISION_MODEL_OV,device.value)ov_text_encoder=core.compile_model(TEXT_ENCODER_OV,device.value)ov_text_decoder=core.compile_model(TEXT_DECODER_OV,device.value)ov_text_decoder_with_past=core.compile_model(TEXT_DECODER_WITH_PAST_OV,device.value)
-
運(yùn)行圖像字幕推理
運(yùn)行效果如下圖所示:
-
運(yùn)行視覺問答推理
小 結(jié) 整個(gè)的步驟就是這樣!現(xiàn)在就開始跟著我們提供的代碼和步驟,動(dòng)手試試用Open VINO和BLIP吧。
關(guān)于英特爾OpenVINOTM開源工具套件的詳細(xì)資料,包括其中我們提供的三百多個(gè)經(jīng)驗(yàn)證并優(yōu)化的預(yù)訓(xùn)練模型的詳細(xì)資料。除此之外,為了方便大家了解并快速掌握OpenVINOTM的使用,我們還提供了一系列開源的Jupyter notebook demo。運(yùn)行這些notebook,就能快速了解在不同場(chǎng)景下如何利用OpenVINOTM實(shí)現(xiàn)一系列、包括計(jì)算機(jī)視覺、語音及自然語言處理任務(wù)。OpenVINOTM notebooks的資源可以在GitHub這里下載安裝。
# 研揚(yáng)科技簡(jiǎn)介
研揚(yáng)科技成立于1992年,是工業(yè)物聯(lián)網(wǎng)和人工智能邊緣解決方案的領(lǐng)先設(shè)計(jì)商和制造商之一。以不斷創(chuàng)新為核心價(jià)值觀,研揚(yáng)科技為市場(chǎng)帶來可靠、高質(zhì)量的計(jì)算平臺(tái),包括工業(yè)主板和系統(tǒng)、強(qiáng)固式平板電腦、嵌入式人工智能系統(tǒng)、uCPE網(wǎng)絡(luò)設(shè)備以及LoRaWAN/WWAN解決方案。研揚(yáng)科技還帶來行業(yè)領(lǐng)先的經(jīng)驗(yàn)和知識(shí),以在全球范圍內(nèi)提供OEM/ODM服務(wù)。此外,研揚(yáng)科技與諸多城市和政府緊密合作,開發(fā)和部署智能城市生態(tài)系統(tǒng),提供個(gè)性化平臺(tái)和端到端解決方案。研揚(yáng)科技與頂級(jí)芯片設(shè)計(jì)商緊密合作,提供穩(wěn)定、可靠的平臺(tái),并被認(rèn)可為Intel物聯(lián)網(wǎng)解決方案聯(lián)盟的鈦金級(jí)成員。欲了解更多研揚(yáng)科技的產(chǎn)品線和服務(wù),請(qǐng)?jiān)L問www.aaeon.com。
審核編輯:湯梓紅-
英特爾
+關(guān)注
關(guān)注
61文章
10015瀏覽量
172412 -
計(jì)算機(jī)
+關(guān)注
關(guān)注
19文章
7549瀏覽量
88708 -
AI
+關(guān)注
關(guān)注
87文章
31670瀏覽量
270463 -
自然語言處理
+關(guān)注
關(guān)注
1文章
620瀏覽量
13655
原文標(biāo)題:OpenVINO?賦能BLIP實(shí)現(xiàn)視覺語言AI邊緣部署
文章出處:【微信號(hào):SDNLAB,微信公眾號(hào):SDNLAB】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論