国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

基于分類目標的預訓練卷積神經網絡

新機器視覺 ? 來源:飛思實驗室 ? 作者:飛思實驗室 ? 2022-08-02 11:44 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

自人類文明誕生以來,高達90%的數據是在過去兩年中產生的!

隨著社交媒體和物聯網IoT)等數字技術以及5G等速度更快的無線通信技術的普及,數據創建速度不斷提高。然而,創建的大多數新數據都是“非結構化的”,例如文本、圖像、音頻和視頻[來源]。

非結構化數據之所以得名,是因為它不像由行和列組成的表那樣具有固有的結構。相反,非結構化數據包含多種可能格式之一的信息。例如,電子商務圖像、客戶評論、社交媒體帖子、監控視頻、語音命令等都是不遵循傳統表格數據格式的豐富信息源。

人工智能AI)和機器學習(ML)技術的最新進展創造了一種通過使用“嵌入”以可伸縮的方式從非結構化數據源中提取有用信息的方法,這種方法將非結構化數據轉換為嵌入式數據并將其存儲在向量數據庫(如Milvus)上,實現了幾年前難以想象的幾個優秀應用程序。

一些示例應用程序包括視覺圖像搜索、語義文本搜索、推薦引擎、打擊誤報、藥物發現等!

在這篇文章中,我們將討論以下內容。

什么是嵌入

使用Kaggle API加載一些數據

展平原始像素值

基于分類目標的預訓練卷積神經網絡

基于度量學習目標的預訓練卷積神經網絡

基于度量學習目標的預訓練圖文多模態神經網絡

結論

在這篇文章中,我們將使用Kaggle提供的Digikala產品顏色分類數據集來構建一個簡單的基于電子商務圖像的類似產品搜索服務。該數據集是根據GPL 2許可證授權的。

什么是嵌入

我們的計算機無法像人類那樣直接理解圖像或文本。然而,計算機很擅長理解數字!

因此,為了幫助我們的計算機理解圖像或文本的內容,我們需要將它們轉換為數字表示。例如,如果我們考慮圖像用例,我們本質上是將圖像的上下文和場景“編碼”或“嵌入”到向量形式的一系列數字中。

“嵌入”向量是圖像數據的數字表示,以便計算機能夠理解圖像的上下文和場景。

8d62244c-0e7a-11ed-ba43-dac502259ad0.png

幾個Python庫允許我們從圖像生成嵌入。通常,我們可以將這些庫分為兩大類。

提供帶有預訓練模型的現成API的庫:對于許多涉及日常對象圖像的真實問題,我們可能不需要訓練任何模型。相反,我們可以依賴世界各地研究人員開放的許多高質量的預訓練模型。研究人員已經訓練這些模型來識別和聚類ImageNet數據集中的對象。

允許我們訓練和微調模型的庫:顧名思義,對于這些模型,我們可以從頭開始提供數據和訓練模型,或者專門針對我們的用例微調預訓練的模型。如果預訓練好的模型還沒有為我們的問題域提供良好的嵌入,那么我們只需要沿著這條路走下去。

讓我們看看這篇文章中的幾個庫。

但首先,讓我們加載一些圖像數據,以定性地評估相似性搜索應用程序中的嵌入。

加載一些數據

我們首先需要加載一些圖像數據來測試各種嵌入策略。在這篇文章中,我們使用Kaggle提供的Digikala產品顏色分類數據集。該數據集包含超過6K個電子商務產品的圖像,非常適合測試基于電子商務圖像的類似產品搜索服務。

步驟1:設置Kaggle環境

在kaggle上創建帳戶

單擊你的個人資料圖片,然后從下拉菜單中單擊“帳戶”。

向下滾動至“API”部分。

單擊下圖所示的“創建新API令牌”按鈕,下載一個新的令牌,作為一個JSON文件,其中包含用戶名和API密鑰。

如果你使用的是macOS或Linux,請將JSON文件復制到~/.kaggle/目錄。在Windows系統上,轉到根目錄,然后轉到.kaggle文件夾,并將下載的文件復制到此文件夾。如果.kaggle目錄不存在,請創建它并將JSON文件復制到其中。

8d7a784e-0e7a-11ed-ba43-dac502259ad0.png

步驟2:從Kaggle下載數據

我們將使用Anaconda來管理此項目的虛擬環境。你可以從這里安裝Anaconda。下載并安裝Anaconda后,我們可以建立一個名為semantic_similarity的新環境,安裝必要的庫,如kaggle和pandas,并從kaggle下載整個數據集。如果不想使用Anaconda,還可以使用python的venv為該項目創建和管理虛擬環境。


#Createadirectoryfornotebooksandanothertodownloaddata mkdir-psemantic_similarity/notebookssemantic_similarity/data/cv #CDintothedatadirectory cdsemantic_similarity/data/cv #Createandactivateacondaenvironment condacreate-nsemantic_similaritypython=3.8 condaactivatesemantic_similarity ##CreateVirtualEnvironmentusingvenvifnotusingconda #python-mvenvsemantic_similarity #sourcesemantic_similarity/bin/activate #Pipinstallthenecessarylibraries pipinstalljupyterlabkagglepandasmatplotlibscikit-learntqdmipywidgets #DownloaddatausingthekaggleAPI kaggledatasetsdownload-dmasouduut94/digikala-color-classification #Unzipthedataintoafashion/directory unzipdigikala-color-classification.zip-d./fashion #DeletetheZipfile rmdigikala-color-classification.zip

該數據包含超過6K張各種電子商務產品的圖像。我們可以在下圖中看到數據集中的一些示例圖像。正如你所注意到的,該數據集包括各種時尚產品,如男裝、女裝、包、珠寶、手表等。

8d880db0-0e7a-11ed-ba43-dac502259ad0.png

步驟3:將所有圖像從每個文件夾移動到父文件夾

讓我們在semantic_similarity/notebooks目錄中創建一個新的jupyter筆記本,以測試各種嵌入策略。首先,讓我們導入必要的庫。


frommatplotlibimportpyplotasplt importnumpyasnp importos importpandasaspd fromPILimportImage fromrandomimportrandint importshutil fromsklearn.metrics.pairwiseimportcosine_similarity importsys fromtqdmimporttqdm tqdm.pandas()

下載的圖像位于多個子文件夾中。讓我們將它們全部移動到主父目錄中,以便輕松獲取它們的所有路徑。


defmove_to_root_folder(root_path,cur_path): #Codefromhttps://stackoverflow.com/questions/8428954/move-child-folder-contents-to-parent-folder-in-python forfilenameinos.listdir(cur_path): ifos.path.isfile(os.path.join(cur_path,filename)): shutil.move(os.path.join(cur_path,filename),os.path.join(root_path,filename)) elifos.path.isdir(os.path.join(cur_path,filename)): move_to_root_folder(root_path,os.path.join(cur_path,filename)) else: sys.exit("Shouldneverreachhere.") #removeemptyfolders ifcur_path!=root_path: os.rmdir(cur_path) move_to_root_folder(root_path='../data/cv/fashion',cur_path='../data/cv/fashion')

步驟4:將圖像路徑加載到pandas數據幀中

接下來,讓我們將所有圖像文件路徑的列表加載到pandas數據幀中。


#Pathtoallthedownloadedimages img_path='../data/cv/fashion' #Findlistofallfilesinthepath images=[ f'../data/cv/fashion/{f}' forfinos.listdir(img_path) ifos.path.isfile(os.path.join(img_path,f)) ] #Loadthefilenamestoadataframe image_df=pd.DataFrame(images,columns=['img_path']) print(image_df.shape) image_df.head()

8e73c55c-0e7a-11ed-ba43-dac502259ad0.png

生成嵌入的策略

計算機視覺技術的最新進展開辟了許多將圖像轉換為數字嵌入的方法。讓我們看看其中的一些。

展平原始像素值

基于分類目標的卷積神經網絡預訓練

基于度量學習目標的卷積神經網絡預訓練

基于度量學習目標的圖文多模態神經網絡預訓練

展平原始像素值

彩色圖像由三維像素陣列組成。第一個維度是圖像的高度,第二個維度是圖像的寬度,最后的第三個維度是顏色通道,統稱為RGB,包含紅色、綠色和藍色,如下圖所示。每個像素的值是0到255之間的整數,255是可能的最高強度。

因此,(0,0,0)的RGB值是完全黑暗或純黑色像素,并且(255,255,255)是完全飽和的純白色像素。我們圖像中可見的所有其他顏色都是由這三個基本RGB值的各種組合組成的。

RapidTables網站上的RGB顏色代碼圖表允許你選擇任何顏色來查看其RGB值,可以點擊以下鏈接進行嘗試:

https://www.rapidtables.com/web/color/RGB_Color.html

8e8ce230-0e7a-11ed-ba43-dac502259ad0.png

如果圖像是三維數組格式的一系列數字,則使用重塑操作將其轉換為一維向量非常簡單,如下圖所示。我們還可以通過將每個像素的值除以255來規范化。我們將在代碼中執行此操作。

8ea577be-0e7a-11ed-ba43-dac502259ad0.png


defflatten_pixels(img_path): #Loadtheimageontopython img=Image.open(img_path).convert('RGB') #Reshapetheimageto1Dandnormalizethevalues flattened_pixels=np.array(img).reshape(-1)/255. returnflattened_pixels #Applythetransformationtothedataframe #Warning!Runningonlyonasubset1Krowsofthedata, #Yourcomputermightcrashifyourunontheentiredataset! #Betterdon’trunit.Wehavemuchbetterwaystogenerateembeddings! pixels_df=image_df.sample(1_000).reset_index(drop=True).copy() pixels_df['flattened_pixels']=pixels_df['img_path'].progress_apply(flatten_pixels)

此方法的問題

雖然這種方法易于理解和實現,但這種將圖像“嵌入”到向量中的方法存在一些嚴重的缺點。

巨大的向量:我們從Kaggle下載的圖像非常小[224 x 224 x 3],對應于[Height x Width x Channels],將此3D陣列轉換為1D向量將得到大小為150528的向量!對于如此小的圖像,這是一個巨大的向量!在整個數據集上生成此向量時,我的計算機崩潰了好幾次。最后我只在一個較小的子集(1K行)上運行它來說明這個方法。

具有大量白色的稀疏向量:在視覺上檢查時裝數據集中的圖像時,我們會注意到圖片中有很大的白色區域。因此,這個150528元素向量的許多元素是值255(對于白色),并且沒有添加任何與圖像中的對象相關的信息。換句話說,這種“嵌入”方案不能有效地對圖像對象進行編碼,而是包含大量無用的空白。

缺乏局部結構:最后,直接展平圖像會丟失圖片的所有局部結構。例如,我們通過眼睛、耳朵、鼻子和嘴巴的相對位置來識別人臉圖像。這些是各種各樣的“特征”級別的信息,如果我們一次只看一行像素,就會完全忽略這些信息。這種損失的影響是,一張倒置的臉與一張右側朝上的臉有著非常不同的嵌入,即使這兩張臉都是同一張人臉的照片!

隨著基于卷積神經網絡CNN和Transformer結構的新型神經網絡結構的出現,我們基本上克服了這些問題。這篇文章的其余部分將深入探討如何使用這些神經網絡將我們的圖像轉換為嵌入。

基于分類目標的卷積神經網絡預訓練

也許最著名的計算機視覺任務之一就是將圖像分為不同的類別。通常,對于這項任務,我們將使用CNN模型(如ResNet)作為編碼器,將圖像轉換為向量,然后將該向量通過多層感知器(MLP)模型來確定圖像的類別,如下圖所示。

研究人員將使用交叉熵損失對CNN+MLP模型進行訓練,以準確分類圖像類別。

8eb4b1b6-0e7a-11ed-ba43-dac502259ad0.png

這種方法提供了最先進的精確度,甚至超過了大多數人的能力。在訓練這樣一個模型后,我們可以去掉MLP層,直接將CNN編碼器的輸出作為每個輸入圖像的嵌入向量。

事實上,我們不需要為許多現實世界的問題從頭開始訓練我們自己的CNN模型。相反,我們直接下載并使用已經訓練過的模型來識別日常對象,例如ImageNet數據集中的類別。

Towhee是一個python庫,它可以使用這些預訓練好的模型快速生成嵌入。讓我們看看如何做到這一點。

Towhee管道

Towhee是一個python庫,提供了非常易于使用的嵌入生成管道。我們可以使用towhee將圖像轉換為嵌入,代碼不到五行!首先,讓我們在終端窗口中使用pip安裝towhee。


#Activatethecondaenvironmentifnotalreadydoneso #condaactivatesemantic_similarity pipinstalltowheetorchtorchvision

接下來,在Jupyter筆記本單元中,讓我們導入庫并實例化一個管道對象。


fromtowheeimportpipeline embedding_pipeline=pipeline('image-embedding')

接下來,讓我們在一行代碼中使用管道將圖像轉換為嵌入!嵌入管道的輸出有一些額外的維度,我們可以使用np.squeeze去除這些維度。


image_df['towhee_img_embedding']=image_df['img_path'].progress_apply(lambdax:np.squeeze(embedding_pipeline(x))) image_df.head()

8ec1da6c-0e7a-11ed-ba43-dac502259ad0.png

在繼續之前,讓我們創建一個helper函數,該函數接受嵌入列的名稱、用作查詢圖像的數據幀索引以及要搜索的類似圖像的k個數。

該函數計算查詢圖像的嵌入與數據幀中所有其他圖像的嵌入之間的余弦相似度,以找到前k個最相似的圖像并顯示它們。


defplot_similar(df,embedding_col,query_index,k_neighbors=5): '''Helperfunctiontotakeadataframeindexasinputqueryanddisplaytheknearestneighbors ''' #Calculatepairwisecosinesimilaritiesbetweenqueryandallrows similarities=cosine_similarity([df[embedding_col][query_index]],df[embedding_col].values.tolist())[0] #Findnearestneighborindices k=k_neighbors+1 nearest_indices=np.argpartition(similarities,-k)[-k:] nearest_indices=nearest_indices[nearest_indices!=query_index] #Plotinputimage img=Image.open(df['img_path'][query_index]).convert('RGB') plt.imshow(img) plt.title(f'QueryProduct. Index:{query_index}') #Plotnearestneighborsimages fig=plt.figure(figsize=(20,4)) plt.suptitle('SimilarProducts') foridx,neighborinenumerate(nearest_indices): plt.subplot(1,len(nearest_indices),idx+1) img=Image.open(df['img_path'][neighbor]).convert('RGB') plt.imshow(img) plt.title(f'CosineSim:{similarities[neighbor]:.3f}') plt.tight_layout()

我們現在可以通過查詢數據幀中的隨機圖像并使用上述輔助函數顯示k個最相似的圖像來測試towhee嵌入的質量。

如下圖所示,towhee嵌入非常準確,我們每次查詢都會從包含多個不同產品(如連衣裙、手表、包和配件)的整套圖像中找到類似的圖片!

考慮到我們僅用三行代碼就生成了這些嵌入,這更令人印象深刻!


plot_similar(df=image_df, embedding_col='towhee_img_embedding', query_index=randint(0,len(image_df)),#Queryarandomimage k_neighbors=5)

8ecf5e3a-0e7a-11ed-ba43-dac502259ad0.png

從結果中,我們可以得出結論,towhee是快速生成相似性搜索應用程序嵌入的良好起點。

然而,我們沒有明確地訓練這些模型,以確保相似的圖像具有彼此相同的嵌入。因此,在相似性搜索的上下文中,來自此類模型的嵌入對于所有用例可能都不是最準確的。

你現在可能會問的一個自然問題是,“是否有一種方法可以訓練模型,使相似的圖像具有彼此相似的嵌入?”謝天謝地,有!

基于度量學習目標的卷積神經網絡預訓練

進入度量學習,這是生成嵌入的最有希望的方法之一,特別是對于相似性搜索應用程序。在度量學習的最基本層面上,

我們使用神經網絡(如CNN或Transformer網絡)將圖像轉換為嵌入。

我們構造這些嵌入,以便語義相似的圖像彼此靠近,而不同的圖像則相距更遠。

8edfe192-0e7a-11ed-ba43-dac502259ad0.png

訓練度量學習模型需要在數據處理方式和模型訓練方式方面進行創新。

數據:在度量學習中,對于每個稱為“錨點”圖像的源圖像,我們需要至少一個稱為“正樣本”的類似圖像我們還需要第三個圖像,稱為“負樣本”,以改進嵌入表示。在最近針對每個源圖像的度量學習方法中,我們使用各種數據增強綜合生成“錨點”和“正樣本”圖像,如下圖所示。

模型:度量學習模型大多具有暹羅網絡體系結構。錨點圖像、正圖像和負圖像依次通過相同的模型生成嵌入,然后使用特殊的損失函數進行比較。其中一個損失函數稱為對比損失,該模型的目標是將錨點圖像和正面圖像的嵌入移動得更近,使它們之間的距離接近0。相反,該模型旨在將錨點和負樣本移動得更遠,以便它們之間的距離更大。

8ef2db9e-0e7a-11ed-ba43-dac502259ad0.png

在用這種方法訓練模型后,我們可以通過數學計算嵌入向量之間的距離來發現任意兩幅圖像之間的相似性,這些距離可以使用余弦距離等度量。正如這篇中型博客文章所示,存在幾種距離度量,余弦距離常用于比較嵌入。

SimCLR:簡單對比學習

SimCLR代表視覺表征對比學習的簡單框架。它是使用一種稱為對比學習的度量學習方法生成圖像嵌入的常用方法之一。在對比學習中,對比損失函數比較兩個嵌入是相似的(0)還是不同的(1)。

SimCLR的優點在于它是一種簡單的自監督算法(圖像類不需要任何標簽!)這實現了與一些受監督方法相當的性能,如下圖所示!

8f03d0e8-0e7a-11ed-ba43-dac502259ad0.png8f18872c-0e7a-11ed-ba43-dac502259ad0.png

SimCLR的基本思想如下。

給定一個圖像,創建同一圖像的兩個增強版本。這些增強可以是裁剪和調整大小、顏色失真、旋轉、添加噪聲等。上圖顯示了一些增強的示例。

批處理中所有圖像的增強版本通過CNN編碼器,該編碼器將圖像轉換為嵌入。然后,這些CNN嵌入通過一個簡單的多層感知器(MLP)將其轉換為另一個空間,該感知器只有一個隱藏層。

最后,使用余弦距離比較MLP輸出處的嵌入。該模型期望來自同一圖像的增強的余弦距離為0,而來自不同圖像的增強的余弦距離為1。然后,損失函數更新CNN和MLP的參數,以便嵌入更接近我們的期望。

一旦訓練完成,我們就不再需要MLP,直接使用CNN編碼器的輸出作為嵌入。

下圖從概念上解釋了整個過程。有關更多詳細信息,請查看這篇谷歌博客文章。

https://ai.googleblog.com/2020/04/advancing-self-supervised-and-semi.html

8f2b96dc-0e7a-11ed-ba43-dac502259ad0.png

作者進行了幾次實驗,確定隨機裁剪和顏色失真是增強的最佳組合,如下所示。

8f3c57c4-0e7a-11ed-ba43-dac502259ad0.png

與towhee一樣,我們使用其他研究人員在ImageNet上預先訓練的模型直接提取SimCLR嵌入。然而,在撰寫本文時,為了獲得SimCLR預訓練過的嵌入,我們需要使用Pytorch Lightning Bolts庫編寫幾行代碼。我從官方lightning文檔中改編了以下內容。首先,在終端窗口中使用pip安裝必要的庫。


#Activatethecondaenvironmentifnotalreadydoneso #condaactivatesemantic_similarity pipinstalllightning-bolts

接下來,在Jupyter筆記本單元中,我們導入必要的庫,并根據你的計算機是否有GPU將設備設置為cuda或cpu。


frompl_bolts.models.self_supervisedimportSimCLR importtorch fromtorch.utils.dataimportDataset,DataLoader fromtorchvisionimportio,transforms #UseGPUifitisavailable device=torch.device('cuda'iftorch.cuda.is_available()else'cpu')

接下來,讓我們加載在ImageNet上預先訓練的SimCLR模型,并將其設置為評估模式,因為我們只想從模型中獲得嵌入,而不想再訓練它。


#loadresnet50pre-trainedusingSimCLRonimagenet weight_path='https://pl-bolts-weights.s3.us-east-2.amazonaws.com/simclr/bolts_simclr_imagenet/simclr_imagenet.ckpt' simclr=SimCLR.load_from_checkpoint(weight_path,strict=False,batch_size=32) #SendtheSimCLRencodertothedeviceandsetittoeval simclr_resnet50=simclr.encoder.to(device) simclr_resnet50.eval();

以下兩個步驟針對Pytorch;用于實現模型的基礎庫。我們首先創建一個數據集,該數據集可以接受我們的數據幀作為輸入,從img_path列讀取圖像,應用一些轉換,最后創建一批圖像,我們可以將其輸入到模型中。


#CreateadatasetforPytorch classFashionImageDataset(Dataset): def__init__(self,df,transform=None): self.df=df self.transform=transform def__len__(self): returnlen(self.df) def__getitem__(self,idx): #LoadtheImage img_path=self.df.loc[idx,'img_path'] image=io.read_image(img_path,mode=io.image.ImageReadMode.RGB)/255. #ApplyTransformations ifself.transform: image=self.transform(image) returnimage #Transforms ##NormalizetransformtoensuretheimageshavesimilarintensitydistributionsasImageNet ##Resizetransformtoensureallimagesinabatchhavethesamesize transformations=transforms.Compose([ transforms.Normalize((0.485,0.456,0.406),(0.229,0.224,0.225)), transforms.Resize(size=(64,64)) ]) #CreatetheDataLoadertoloadimagesinbatches emb_dataset=FashionImageDataset(df=image_df,transform=transformations) emb_dataloader=DataLoader(emb_dataset,batch_size=32)

最后,我們可以在dataloader中迭代批處理,為所有圖像生成嵌入,并將它們作為列存儲回dataframe中。


#Createembeddings embeddings=[] forbatchintqdm(emb_dataloader): batch=batch.to(device) embeddings+=simclr_resnet50(batch)[0].tolist() #Assignembeddingstoacolumninthedataframe image_df['simclr_img_embeddings']=embeddings image_df.head()

8f4d7d2e-0e7a-11ed-ba43-dac502259ad0.png

現在是有趣的部分!我們可以使用相同的helper函數測試SimCLR嵌入的質量。

我們從數據幀中查詢隨機圖像,并顯示k個最相似的圖像。如下所示,SimCLR嵌入也非常適合為我們運行的每個查詢找到類似的圖像!


plot_similar(df=image_df, embedding_col='simclr_img_embeddings', query_index=randint(0,len(image_df)), k_neighbors=5)

8f5fe874-0e7a-11ed-ba43-dac502259ad0.png

用度量學習目標預訓練的圖像-文本多模態神經網絡

最后,將圖像和文本嵌入到統一嵌入空間的模型有了巨大的改進,這開辟了幾個優秀的應用程序,如 Image-To-Text 和 Text-To - 圖像相似度搜索。這種范式中最流行的模型之一是CLIP(對比語言圖像預訓練)。

CLIP是一種基于度量學習框架的神經網絡。CLIP使用圖像作為錨點,相應的文本描述作為正樣本來構建圖像-文本對。我們可以在多個應用程序中使用CLIP,包括文本到圖像、圖像到文本、圖像到圖像和文本到文本的相似性搜索。

圖像通過ResNet或ViT編碼器生成圖像嵌入。文本描述通過基于Transformer的編碼器提供,以生成文本嵌入。CLIP聯合訓練圖像和文本編碼器,以便在一批N個圖像-文本對中,第i個圖像的嵌入與第i個文本的嵌入具有最高的點積,如下圖所示。

8f6c8714-0e7a-11ed-ba43-dac502259ad0.png

訓練完成后,我們可以通過將兩者轉換為各自的嵌入并使用點積或余弦距離進行比較,找到與查詢圖像最相似的文本行,如下圖所示。

相反,我們也可以以相同的方式搜索給定查詢文本的最相似圖像。讓我們看看如何在示例問題上實現這一點。

8f7b4448-0e7a-11ed-ba43-dac502259ad0.png

Sentence Transformers

使用優秀的句子Transformer庫,在我們的數據上生成CLIP嵌入非常簡單。然而,由于操作系統對一次可以打開的文件數量的限制,在處理成千上萬的圖像時,我們需要編寫幾行樣板代碼。首先,在終端窗口中使用pip安裝必要的庫。


#Activatethecondaenvironmentifnotalreadydoneso #condaactivatesemantic_similarity pipinstallsentence_transformersftfy

接下來,在Jupyter筆記本單元中,讓我們導入庫并實例化片段模型。


fromsentence_transformersimportSentenceTransformer model=SentenceTransformer('clip-ViT-B-32')

接下來,我們需要迭代10K個圖像,以繞過操作系統對一次可以打開的文件數量的限制。我們在每次迭代期間加載所有圖像并生成CLIP嵌入。


#Initializeanemptylisttocollectembeddings clip_embeddings=[] #Generateembeddingsfor10_000imagesoneachiteration step=10_000 foridxinrange(0,len(image_df),step): #Loadthe`step`numberofimages images=[ Image.open(img_path).convert('RGB') forimg_pathinimage_df['img_path'].iloc[idx:idx+step] ] #GenerateCLIPembeddingsfortheloadedimages clip_embeddings.extend(model.encode(images,show_progress_bar=True).tolist()) #Assigntheembeddingsbacktothedataframe image_df['clip_img_embedding']=clip_embeddings image_df.head()

8f8d779e-0e7a-11ed-ba43-dac502259ad0.png

現在我們有了所有圖像的CLIP嵌入,我們可以使用相同的輔助函數來測試嵌入的質量。

我們從數據幀中查詢隨機圖像,并顯示k個最相似的圖像。如下圖所示,CLIP嵌入也非常準確,可以為我們運行的每個查詢找到相似的圖像!


plot_similar(df=image_df, embedding_col='clip_img_embedding', query_index=randint(0,len(image_df)), k_neighbors=5)

8f9ff2c0-0e7a-11ed-ba43-dac502259ad0.png

雖然我們必須編寫一些額外的代碼來生成CLIP嵌入,但它提供的一個顯著優勢是文本到圖像搜索。換句話說,我們可以搜索與給定文本描述匹配的所有圖像。讓我們看看下面的內容。

由于我們已經將圖像轉換為CLIP嵌入,現在只需要將文本查詢轉換為CLIP嵌入。然后,我們可以利用文本嵌入和數據幀中所有圖像嵌入之間的余弦相似度來搜索相似的產品。我們將編寫一個簡單的助手函數來為我們完成這一切,如下所示。最后,我們將繪制所有類似的k個產品圖像。


deftext_image_search(text_query,df,img_emb_col,k=5): '''Helperfunctiontotakeatextqueryasinputanddisplaytheknearestneighborimages ''' #Calculatethetextembeddings text_emb=model.encode(text_query).tolist() #Calculatethepairwisecosinesimilaritiesbetweentextqueryandimagesfromallrows similarities=cosine_similarity([text_emb],df[img_emb_col].values.tolist())[0] #Findnearestneighbors nearest_indices=np.argpartition(similarities,-k)[-k:] #PrintQueryText print(f'QueryText:{text_query}') #Plotnearestneighborsimages fig=plt.figure(figsize=(20,4)) plt.suptitle('SimilarProducts') foridx,neighborinenumerate(nearest_indices): plt.subplot(1,len(nearest_indices),idx+1) img=Image.open(df['img_path'][neighbor]).convert('RGB') plt.imshow(img) plt.title(f'CosineSim:{similarities[neighbor]:.3f}') plt.tight_layout()

現在,我們可以使用helper函數測試示例文本查詢。如下圖所示,如果我們的測試查詢是“一件女裝的照片”,那么最相似的產品都是女裝!盡管每個產品的標題沒有明確指定“連衣裙”一詞,但CLIP模型能夠僅從文本和圖像嵌入推斷出這些圖像與查詢“一張女裝照片”最相關。

繼續嘗試其他查詢!


text_query="aphotoofawomen'sdress" text_image_search(text_query, df=image_df, img_emb_col='clip_img_embedding', k=5)

8fab3202-0e7a-11ed-ba43-dac502259ad0.png

結論

深度學習研究和開源代碼庫的最新技術為從圖像和文本數據生成高質量嵌入提供了許多簡單的方法。這些現成的嵌入是為許多實際問題構建原型的絕佳起點!下面的流程圖有助于選擇要使用的初始嵌入。但是,在將任何單個查詢部署到生產環境之前,請不斷評估一些復雜示例查詢上嵌入模型的準確性!

說到生產,我們在這里使用的數據集是一個只有6K個圖像的玩具數據集。在現實世界的應用程序中,例如電子商務商店,你將有數億個產品圖像需要在幾秒鐘內嵌入、存儲和執行近鄰搜索!問題的規模需要使用強大的向量搜索數據庫,如Milvus!

8fd34440-0e7a-11ed-ba43-dac502259ad0.png

審核編輯:彭靜

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

    關注

    5198

    文章

    20442

    瀏覽量

    333971
  • 神經網絡
    +關注

    關注

    42

    文章

    4838

    瀏覽量

    107745
  • 計算機
    +關注

    關注

    19

    文章

    7806

    瀏覽量

    93188
  • API
    API
    +關注

    關注

    2

    文章

    2368

    瀏覽量

    66752

原文標題:計算機視覺中的語義相似性搜索

文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    在Ubuntu20.04系統中訓練神經網絡模型的一些經驗

    , batch_size=512, epochs=20)總結 這個核心算法中的卷積神經網絡結構和訓練過程,是用來對MNIST手寫數字圖像進行分類的。模型將圖像作為輸入,通過
    發表于 10-22 07:03

    卷積神經網絡如何使用

    卷積神經網絡(CNN)究竟是什么,鑒于神經網絡在工程上經歷了曲折的歷史,您為什么還會在意它呢? 對于這些非常中肯的問題,我們似乎可以給出相對簡明的答案。
    發表于 07-17 07:21

    卷積神經網絡模型發展及應用

    神經網絡已經廣泛應用于圖像分類目標檢測、語義分割以及自然語言處理等領域。首先分析了典型卷積神經網絡模型為提高其性能增加
    發表于 08-02 10:39

    卷積神經網絡簡介:什么是機器學習?

    大量的二維矩陣。為了實現我們的實際分類目標,我們將二維數據轉換為長一維向量。轉換是在所謂的扁平層中完成的,然后是一個或兩個完全連接的層。最后兩層類型的神經元類似于圖2所示的結構。神經網絡的最后一層
    發表于 02-23 20:11

    python卷積神經網絡cnn的訓練算法

    python卷積神經網絡cnn的訓練算法? 卷積神經網絡(Convolutional Neural Network,CNN)一直是深度學習領
    的頭像 發表于 08-21 16:41 ?2485次閱讀

    卷積神經網絡模型訓練步驟

    模型訓練是將模型結構和模型參數相結合,通過樣本數據的學習訓練模型,使得模型可以對新的樣本數據進行準確的預測和分類。本文將詳細介紹 CNN 模型訓練的步驟。 CNN 模型結構
    的頭像 發表于 08-21 16:42 ?2820次閱讀

    卷積神經網絡如何識別圖像

    多層卷積層、池化層和全連接層。CNN模型通過訓練識別并學習高度復雜的圖像模式,對于識別物體和進行圖像分類等任務有著非常優越的表現。本文將會詳細介紹卷積
    的頭像 發表于 08-21 16:49 ?2829次閱讀

    卷積神經網絡層級結構 卷積神經網絡卷積層講解

    分類、目標檢測、人臉識別等。卷積神經網絡的核心是卷積層和池化層,它們構成了網絡的主干,實現了對
    的頭像 發表于 08-21 16:49 ?1.1w次閱讀

    卷積神經網絡的介紹 什么是卷積神經網絡算法

    卷積神經網絡的介紹 什么是卷積神經網絡算法 卷積神經網絡涉及的關鍵技術
    的頭像 發表于 08-21 16:49 ?3154次閱讀

    卷積神經網絡算法流程 卷積神經網絡模型工作流程

    卷積神經網絡算法流程 卷積神經網絡模型工作流程? 卷積神經網絡(Convolutional Ne
    的頭像 發表于 08-21 16:50 ?3930次閱讀

    什么是卷積神經網絡?為什么需要卷積神經網絡

    卷積神經網絡(Convolutional Neural Network,CNN)是一種用于處理具有類似網格結構的數據的神經網絡。它廣泛用于圖像和視頻識別、文本分類等領域。CNN可以自動
    發表于 08-22 18:20 ?3497次閱讀

    利用卷積神經網絡實現SAR目標分類的研究

    卷積神經網絡(CNN)是一種在圖像處理和計算機視覺領域廣泛應用的深度學習模型,因其能夠自動學習圖像的層次化特征表示而成為SAR目標分類的理想選擇。
    發表于 04-08 09:39 ?1225次閱讀
    利用<b class='flag-5'>卷積</b><b class='flag-5'>神經網絡</b>實現SAR<b class='flag-5'>目標</b><b class='flag-5'>分類</b>的研究

    卷積神經網絡訓練的是什么

    、訓練過程以及應用場景。 1. 卷積神經網絡的基本概念 1.1 卷積神經網絡的定義 卷積
    的頭像 發表于 07-03 09:15 ?1560次閱讀

    cnn卷積神經網絡分類有哪些

    卷積神經網絡(CNN)是一種深度學習模型,廣泛應用于圖像分類、目標檢測、語義分割等領域。本文將詳細介紹CNN在分類任務中的應用,包括基本結構
    的頭像 發表于 07-03 09:28 ?2351次閱讀

    卷積神經網絡分類方法有哪些

    卷積神經網絡(Convolutional Neural Networks,CNN)是一種深度學習模型,廣泛應用于圖像分類、目標檢測、語義分割等計算機視覺任務。本文將詳細介紹
    的頭像 發表于 07-03 09:40 ?1638次閱讀