<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          使用PyTorch進(jìn)行小樣本學(xué)習(xí)的圖像分類

          共 12985字,需瀏覽 26分鐘

           ·

          2024-07-30 10:38

          點(diǎn)擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

          重磅干貨,第一時(shí)間送達(dá)

          作者丨Aryan Jadon
          來源丨DeepHub IMBA
          編輯丨極市平臺(tái)

          極市導(dǎo)讀

           

          本文簡(jiǎn)要總結(jié)了四種小樣本學(xué)習(xí)圖像分類算法的方法,并使用pytorch實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的分類模型,附有操作代碼。 

          近年來,基于深度學(xué)習(xí)的模型在目標(biāo)檢測(cè)和圖像識(shí)別等任務(wù)中表現(xiàn)出色。像ImageNet這樣具有挑戰(zhàn)性的圖像分類數(shù)據(jù)集,包含1000種不同的對(duì)象分類,現(xiàn)在一些模型已經(jīng)超過了人類水平上。但是這些模型依賴于監(jiān)督訓(xùn)練流程,標(biāo)記訓(xùn)練數(shù)據(jù)的可用性對(duì)它們有重大影響,并且模型能夠檢測(cè)到的類別也僅限于它們接受訓(xùn)練的類。

          由于在訓(xùn)練過程中沒有足夠的標(biāo)記圖像用于所有類,這些模型在現(xiàn)實(shí)環(huán)境中可能不太有用。并且我們希望的模型能夠識(shí)別它在訓(xùn)練期間沒有見到過的類,因?yàn)閹缀醪豢赡茉谒袧撛趯?duì)象的圖像上進(jìn)行訓(xùn)練。我們將從幾個(gè)樣本中學(xué)習(xí)的問題被稱為“少樣本學(xué)習(xí) Few-Shot learning”。

          什么是小樣本學(xué)習(xí)?

          少樣本學(xué)習(xí)是機(jī)器學(xué)習(xí)的一個(gè)子領(lǐng)域。它涉及到在只有少數(shù)訓(xùn)練樣本和監(jiān)督數(shù)據(jù)的情況下對(duì)新數(shù)據(jù)進(jìn)行分類。只需少量的訓(xùn)練樣本,我們創(chuàng)建的模型就可以相當(dāng)好地執(zhí)行。

          考慮以下場(chǎng)景:在醫(yī)療領(lǐng)域,對(duì)于一些不常見的疾病,可能沒有足夠的x光圖像用于訓(xùn)練。對(duì)于這樣的場(chǎng)景,構(gòu)建一個(gè)小樣本學(xué)習(xí)分類器是完美的解決方案。

          小樣本的變化

          一般來說,研究人員確定了四種類型:

          1. N-Shot Learning (NSL)

          2. Few-Shot Learning ( FSL )

          3. One-Shot Learning (OSL)

          4. Zero-Shot Learning (ZSL)

          當(dāng)我們談?wù)?FSL 時(shí),我們通常指的是 N-way-K-Shot 分類。N 代表類別數(shù),K 代表每個(gè)類中要訓(xùn)練的樣本數(shù)。所以N-Shot Learning 被視為比所有其他概念更廣泛的概念。可以說 Few-Shot、One-Shot 和 Zero-Shot是 NSL 的子領(lǐng)域。而零樣本學(xué)習(xí)旨在在沒有任何訓(xùn)練示例的情況下對(duì)看不見的類進(jìn)行分類。

          在 One-Shot Learning 中,每個(gè)類只有一個(gè)樣本。Few-Shot 每個(gè)類有 2 到 5 個(gè)樣本,也就是說 Few-Shot 是更靈活的 One-Shot Learning 版本。

          小樣本學(xué)習(xí)方法

          通常,在解決 Few Shot Learning 問題時(shí)應(yīng)考慮兩種方法:

          數(shù)據(jù)級(jí)方法 (DLA)

          這個(gè)策略非常簡(jiǎn)單,如果沒有足夠的數(shù)據(jù)來創(chuàng)建實(shí)體模型并防止欠擬合和過擬合,那么就應(yīng)該添加更多數(shù)據(jù)。正因?yàn)槿绱耍S多 FSL 問題都可以通過利用來更大大的基礎(chǔ)數(shù)據(jù)集的更多數(shù)據(jù)來解決。基本數(shù)據(jù)集的顯著特征是它缺少構(gòu)成我們對(duì) Few-Shot 挑戰(zhàn)的支持集的類。例如,如果我們想要對(duì)某種鳥類進(jìn)行分類,則基礎(chǔ)數(shù)據(jù)集可能包含許多其他鳥類的圖片。

          參數(shù)級(jí)方法 (PLA)

          從參數(shù)級(jí)別的角度來看,F(xiàn)ew-Shot Learning 樣本相對(duì)容易過擬合,因?yàn)樗鼈兺ǔ>哂写蟮母呔S空間。限制參數(shù)空間、使用正則化和使用適當(dāng)?shù)膿p失函數(shù)將有助于解決這個(gè)問題。少量的訓(xùn)練樣本將被模型泛化。

          通過將模型引導(dǎo)到廣闊的參數(shù)空間可以提高性能。由于缺乏訓(xùn)練數(shù)據(jù),正常的優(yōu)化方法可能無法產(chǎn)生準(zhǔn)確的結(jié)果。

          因?yàn)樯厦娴脑颍?xùn)練我們的模型以發(fā)現(xiàn)通過參數(shù)空間的最佳路徑,產(chǎn)生最佳的預(yù)測(cè)結(jié)果。這種方法被稱為元學(xué)習(xí)。

          小樣本學(xué)習(xí)圖像分類算法

          有4種比較常見的小樣本學(xué)習(xí)的方法:

          與模型無關(guān)的元學(xué)習(xí) Model-Agnostic Meta-Learning

          基于梯度的元學(xué)習(xí) (GBML) 原則是 MAML 的基礎(chǔ)。在 GBML 中,元學(xué)習(xí)者通過基礎(chǔ)模型訓(xùn)練和學(xué)習(xí)所有任務(wù)表示的共享特征來獲得先前的經(jīng)驗(yàn)。每次有新任務(wù)要學(xué)習(xí)時(shí),元學(xué)習(xí)器都會(huì)利用其現(xiàn)有經(jīng)驗(yàn)和新任務(wù)提供的最少量的新訓(xùn)練數(shù)據(jù)進(jìn)行微調(diào)訓(xùn)練。

          一般情況下,如果我們隨機(jī)初始化參數(shù)經(jīng)過幾次更新算法將不會(huì)收斂到良好的性能。MAML 試圖解決這個(gè)問題。MAML 只需幾個(gè)梯度步驟并且保證沒有過度擬合的前提下,為元參數(shù)學(xué)習(xí)器提供了可靠的初始化,這樣可以對(duì)新任務(wù)進(jìn)行最佳快速學(xué)習(xí)。

          步驟如下:

          元學(xué)習(xí)者在每個(gè)分集(episode)開始時(shí)創(chuàng)建自己的副本C,

          C 在這一分集上進(jìn)行訓(xùn)練(在 base-model 的幫助下),

          C 對(duì)查詢集進(jìn)行預(yù)測(cè),

          從這些預(yù)測(cè)中計(jì)算出的損失用于更新 C,

          這種情況一直持續(xù)到完成所有分集的訓(xùn)練。

          1. 元學(xué)習(xí)者在每個(gè)分集(episode)開始時(shí)創(chuàng)建自己的副本C,

          2. C 在這一分集上進(jìn)行訓(xùn)練(在 base-model 的幫助下),

          3. C 對(duì)查詢集進(jìn)行預(yù)測(cè),

          4. 從這些預(yù)測(cè)中計(jì)算出的損失用于更新 C,

          5. 這種情況一直持續(xù)到完成所有分集的訓(xùn)練。

          這種技術(shù)的最大優(yōu)勢(shì)在于,它被認(rèn)為與元學(xué)習(xí)算法的選擇無關(guān)。因此MAML 方法被廣泛用于許多需要快速適應(yīng)的機(jī)器學(xué)習(xí)算法,尤其是深度神經(jīng)網(wǎng)。

          匹配網(wǎng)絡(luò) Matching Networks

          為解決 FSL 問題而創(chuàng)建的第一個(gè)度量學(xué)習(xí)方法是匹配網(wǎng)絡(luò) (MN)。

          當(dāng)使用匹配網(wǎng)絡(luò)方法解決 Few-Shot Learning 問題時(shí)需要一個(gè)大的基礎(chǔ)數(shù)據(jù)集。。

          將該數(shù)據(jù)集分為幾個(gè)分集之后,對(duì)于每一分集,匹配網(wǎng)絡(luò)進(jìn)行以下操作:

          • 來自支持集和查詢集的每個(gè)圖像都被饋送到一個(gè) CNN,該 CNN 為它們輸出特征的嵌入

          • 查詢圖像使用支持集訓(xùn)練的模型得到嵌入特征的余弦距離,通過 softmax 進(jìn)行分類

          • 分類結(jié)果的交叉熵?fù)p失通過 CNN 反向傳播更新特征嵌入模型

          匹配網(wǎng)絡(luò)可以通過這種方式學(xué)習(xí)構(gòu)建圖像嵌入。MN 能夠使用這種方法對(duì)照片進(jìn)行分類,并且無需任何特殊的類別先驗(yàn)知識(shí)。他只要簡(jiǎn)單地比較類的幾個(gè)實(shí)例就可以了。

          由于類別因分集而異,因此匹配網(wǎng)絡(luò)會(huì)計(jì)算對(duì)類別區(qū)分很重要的圖片屬性(特征)。而當(dāng)使用標(biāo)準(zhǔn)分類時(shí),算法會(huì)選擇每個(gè)類別獨(dú)有的特征。

          原型網(wǎng)絡(luò) Prototypical Networks

          與匹配網(wǎng)絡(luò)類似的是原型網(wǎng)絡(luò)(PN)。它通過一些細(xì)微的變化來提高算法的性能。PN 比 MN 取得了更好的結(jié)果,但它們訓(xùn)練過程本質(zhì)上是相同的,只是比較了來自支持集的一些查詢圖片嵌入,但是 原型網(wǎng)絡(luò)提供了不同的策略。

          我們需要在 PN 中創(chuàng)建類的原型:通過對(duì)類中圖像的嵌入進(jìn)行平均而創(chuàng)建的類的嵌入。然后僅使用這些類原型來比較查詢圖像嵌入。當(dāng)用于單樣本學(xué)習(xí)問題時(shí),它可與匹配網(wǎng)絡(luò)相媲美。

          關(guān)系網(wǎng)絡(luò) Relation Network

          關(guān)系網(wǎng)絡(luò)可以說繼承了所有上面提到方法的研究的結(jié)果。RN是基于PN思想的但包含了顯著的算法改進(jìn)。

          該方法使用的距離函數(shù)是可學(xué)習(xí)的,而不是像以前研究的事先定義它。關(guān)系模塊位于嵌入模塊之上,嵌入模塊是從輸入圖像計(jì)算嵌入和類原型的部分。

          可訓(xùn)練的關(guān)系模塊(距離函數(shù))輸入是查詢圖像的嵌入與每個(gè)類的原型,輸出為每個(gè)分類匹配的關(guān)系分?jǐn)?shù)。關(guān)系分?jǐn)?shù)通過 Softmax 得到一個(gè)預(yù)測(cè)。

          使用 Open-AI Clip 進(jìn)行零樣本學(xué)習(xí)

          CLIP(Contrastive Language-Image Pre-Training)是一個(gè)在各種(圖像、文本)對(duì)上訓(xùn)練的神經(jīng)網(wǎng)絡(luò)。它無需直接針對(duì)任務(wù)進(jìn)行優(yōu)化,就可以為給定的圖像來預(yù)測(cè)最相關(guān)的文本片段(類似于 GPT-2 和 3 的零樣本的功能)。

          CLIP 在 ImageNet“零樣本”上可以達(dá)到原始 ResNet50 的性能,而且需要不使用任何標(biāo)記示例,它克服了計(jì)算機(jī)視覺中的幾個(gè)主要挑戰(zhàn),下面我們使用Pytorch來實(shí)現(xiàn)一個(gè)簡(jiǎn)單的分類模型。

          引入包

          ! pip install ftfy regex tqdm
          ! pip install git+https://github.com/openai/CLIP.gitimport numpy as np
          import torch
          from pkg_resources import packaging
           
          print("Torch version:", torch.__version__)

          加載模型

           import clipclip.available\_models\(\) # it will list the names of available CLIP modelsmodel, preprocess = clip.load\("ViT-B/32"\)  
           model.cuda\(\).eval\(\)  
           input\_resolution = model.visual.input\_resolution  
           context\_length = model.context\_length  
           vocab\_size = model.vocab\_size  

           print\("Model parameters:", f"\{np.sum\(\[int\(np.prod\(p.shape\)\) for p in model.parameters\(\)\]\):,\}"\)  
           print\("Input resolution:", input\_resolution\)  
           print\("Context length:", context\_length\)  
           print\("Vocab size:", vocab\_size\)

          圖像預(yù)處理

          我們將向模型輸入8個(gè)示例圖像及其文本描述,并比較對(duì)應(yīng)特征之間的相似性。

          分詞器不區(qū)分大小寫,我們可以自由地給出任何合適的文本描述。

          import os  
           import skimage  
           import IPython.display  
           import matplotlib.pyplot as plt  
           from PIL import Image  
           import numpy as np  

           from collections import OrderedDict  
           import torch  

           \%matplotlib inline  
           \%config InlineBackend.figure\_format = 'retina'  

           \# images in skimage to use and their textual descriptions  
           descriptions = \{  
              "page""a page of text about segmentation",  
              "chelsea""a facial photo of a tabby cat",  
              "astronaut""a portrait of an astronaut with the American flag",  
              "rocket""a rocket standing on a launchpad",  
              "motorcycle\_right""a red motorcycle standing in a garage",  
              "camera""a person looking at a camera on a tripod",  
              "horse""a black-and-white silhouette of a horse",  
              "coffee""a cup of coffee on a saucer"  
           \}original\_images = \[\]  
           images = \[\]  
           texts = \[\]  
           plt.figure\(figsize=\(16, 5\)\)  

           for filename in \[filename for filename in os.listdir\(skimage.data\_dir\) if filename.endswith\(".png"\) or filename.endswith\(".jpg"\)\]:  
              name = os.path.splitext\(filename\)\[0\]  
              if name not in descriptions:  
                  continue  

              image = Image.open\(os.path.join\(skimage.data\_dir, filename\)\).convert\("RGB"\)  
                 
              plt.subplot\(2, 4, len\(images\) + 1\)  
              plt.imshow\(image\)  
              plt.title\(f"\{filename\}\\n\{descriptions\[name\]\}"\)  
              plt.xticks\(\[\]\)  
              plt.yticks\(\[\]\)  
                 
              original\_images.append\(image\)  
              images.append\(preprocess\(image\)\)  
              texts.append\(descriptions\[name\]\)  

           plt.tight\_layout\(\)

          結(jié)果的可視化如下:

          我們對(duì)圖像進(jìn)行規(guī)范化,對(duì)每個(gè)文本輸入進(jìn)行標(biāo)記,并運(yùn)行模型的正傳播獲得圖像和文本的特征。

           image\_input = torch.tensor\(np.stack\(images\)\).cuda\(\)  
           text\_tokens = clip.tokenize\(\["This is " + desc for desc in texts\]\).cuda\(\)  

           with torch.no\_grad\(\):  
              image\_features = model.encode\_image\(image\_input\).float\(\)  
              text\_features = model.encode\_text\(text\_tokens\).float\(\)

          我們將特征歸一化,并計(jì)算每一對(duì)的點(diǎn)積,進(jìn)行余弦相似度計(jì)算

           image\_features /= image\_features.norm\(dim=-1, keepdim=True\)  
           text\_features /= text\_features.norm\(dim=-1, keepdim=True\)  
           similarity = text\_features.cpu\(\).numpy\(\) \@ image\_features.cpu\(\).numpy\(\).T  

           count = len\(descriptions\)  

           plt.figure\(figsize=\(20, 14\)\)  
           plt.imshow\(similarity, vmin=0.1, vmax=0.3\)  
           \# plt.colorbar\(\)  
           plt.yticks\(range\(count\), texts, fontsize=18\)  
           plt.xticks\(\[\]\)  
           for i, image in enumerate\(original\_images\):  
              plt.imshow\(image, extent=\(i - 0.5, i + 0.5, -1.6, -0.6\), origin="lower"\)  
           for x in range\(similarity.shape\[1\]\):  
              for y in range\(similarity.shape\[0\]\):  
                  plt.text\(x, y, f"\{similarity\[y, x\]:.2f\}", ha="center", va="center", size=12\)  

           for side in \["left""top""right""bottom"\]:  
            plt.gca\(\).spines\[side\].set\_visible\(False\)  

           plt.xlim\(\[-0.5, count - 0.5\]\)  
           plt.ylim\(\[count + 0.5, -2\]\)  

           plt.title\("Cosine similarity between text and image features", size=20\)

          零樣本的圖像分類

          from torchvision.datasets import CIFAR100  
           cifar100 = CIFAR100\(os.path.expanduser\("\~/.cache"\), transform=preprocess, download=True\)  
           text\_descriptions = \[f"This is a photo of a \{label\}" for label in cifar100.classes\]  
           text\_tokens = clip.tokenize\(text\_descriptions\).cuda\(\)  
           with torch.no\_grad\(\):  
              text\_features = model.encode\_text\(text\_tokens\).float\(\)  
              text\_features /= text\_features.norm\(dim=-1, keepdim=True\)  

           text\_probs = \(100.0 \* image\_features \@ text\_features.T\).softmax\(dim=-1\)  
           top\_probs, top\_labels = text\_probs.cpu\(\).topk\(5, dim=-1\)  
           plt.figure\(figsize=\(16, 16\)\)  
           for i, image in enumerate\(original\_images\):  
              plt.subplot\(4, 4, 2 \* i + 1\)  
              plt.imshow\(image\)  
              plt.axis\("off"\)  

              plt.subplot\(4, 4, 2 \* i + 2\)  
              y = np.arange\(top\_probs.shape\[-1\]\)  
              plt.grid\(\)  
              plt.barh\(y, top\_probs\[i\]\)  
              plt.gca\(\).invert\_yaxis\(\)  
              plt.gca\(\).set\_axisbelow\(True\)  
              plt.yticks\(y, \[cifar100.classes\[index\] for index in top\_labels\[i\].numpy\(\)\]\)  
              plt.xlabel\("probability"\)  

           plt.subplots\_adjust\(wspace=0.5\)  
           plt.show\(\)

          可以看到,分類的效果還是非常好的

              
          下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
          在「小白學(xué)視覺」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

          下載2:Python視覺實(shí)戰(zhàn)項(xiàng)目52講
          小白學(xué)視覺公眾號(hào)后臺(tái)回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目即可下載包括圖像分割、口罩檢測(cè)、車道線檢測(cè)、車輛計(jì)數(shù)、添加眼線、車牌識(shí)別、字符識(shí)別、情緒檢測(cè)、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺。

          下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
          小白學(xué)視覺公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

          交流群


          歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請(qǐng)按照格式備注,否則不予通過。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~


          瀏覽 93
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  后入极品少妇 | 国产亚洲天堂 | 国产色爽精品无码视频 | 亚洲国产综合视频 | 天天干天天干天天日 |