【Pytorch神经网络实战案例】23 使用ImagNet的预训练模型识别图片内容
?1 案例基本工具概述
1.1 數(shù)據(jù)集簡(jiǎn)介
Imagenet數(shù)據(jù)集共有1000個(gè)類別,表明該數(shù)據(jù)集上的預(yù)訓(xùn)練模型最多可以輸出1000種不同的分類結(jié)果。
- Imagenet數(shù)據(jù)集是目前深度學(xué)習(xí)圖像領(lǐng)域應(yīng)用得非常多的一個(gè)領(lǐng)域,關(guān)于圖像分類、定位、檢測(cè)等研究工作大多基于此數(shù)據(jù)集展開。
- Imagenet數(shù)據(jù)集文檔詳細(xì),有專門的團(tuán)隊(duì)維護(hù),使用非常方便,在計(jì)算機(jī)視覺領(lǐng)域研究論文中應(yīng)用非常廣,幾乎成為了目前深度學(xué)習(xí)圖像領(lǐng)域算法性能檢驗(yàn)的“標(biāo)準(zhǔn)”數(shù)據(jù)集。
- Imagenet數(shù)據(jù)集有1400多萬幅圖片,涵蓋2萬多個(gè)類別,其中有超過百萬的圖片有明確的類別標(biāo)注和圖像中物體位置的標(biāo)注。
1.2?預(yù)訓(xùn)練模型
?PyTorch中提供了許多在可以被直接加載到模型中并進(jìn)行器的eNet數(shù)據(jù)集上訓(xùn)練好的模型,這些模型叫作預(yù)訓(xùn)練模型預(yù)測(cè)。
1.2.1?預(yù)訓(xùn)練模型簡(jiǎn)介
預(yù)訓(xùn)練模型都存放在PyTorch的torchvision庫中。torchvision庫是非常強(qiáng)大的PyTorch視覺處理庫,包括分類、目標(biāo)檢測(cè)、語義分割等多種計(jì)算機(jī)視覺任務(wù)的預(yù)訓(xùn)練模型,還包括圖片處理、錨點(diǎn)計(jì)算等很多基礎(chǔ)工具。
1.2.2 預(yù)訓(xùn)練模型簡(jiǎn)介
2 代碼實(shí)戰(zhàn)
2.1 案例概述
實(shí)例描述,將ImageNet數(shù)據(jù)集上的預(yù)訓(xùn)練模型ResNet18加抗到內(nèi)存,并使用該模型對(duì)圖片進(jìn)行分類預(yù)測(cè)。
2.2 代碼實(shí)現(xiàn):下載并加載預(yù)訓(xùn)練模型-----ResNetModel.py(第1部分)
from PIL import Image import matplotlib.pyplot as plt import json import numpy as np import torch import torch.nn.functional as F from torchvision import models,transforms # 引入torchvision庫 import os os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'# 1.1 下載并加載預(yù)訓(xùn)練模型:引入基礎(chǔ)庫,并使用torchvision庫中的API下載模型。 # Tip:本例使用的中文標(biāo)簽總類別為1001類,索引值為0的類為None,代表未知分類;英文標(biāo)簽總類注意別為1000類,沒有None類。 # 因?yàn)镻yTorch中的模型是在英文標(biāo)簽中訓(xùn)練的,所以在讀取中文標(biāo)簽時(shí),還需要將索引值加1 model = models.resnet18(pretrained=True) # True代表要下載模型 ,返回一個(gè)具有18層的ResNet模型 model = model.eval()2.3 代碼實(shí)現(xiàn):加載標(biāo)簽并對(duì)輸入數(shù)據(jù)進(jìn)行預(yù)處理-----ResNetModel.py(第2部分)
# 1.2 加載標(biāo)簽并對(duì)輸入數(shù)據(jù)進(jìn)行預(yù)處理 labels_path = './models_2/code_01/imagenet_class_index.json' # 處理英文標(biāo)簽 with open(labels_path) as json_data:idx_to_labels = json.load(json_data)def getone(onestr):return onestr.replace(',','') with open('models_2/code_01/中文標(biāo)簽.csv','r+') as f:zh_labels = list(map(getone,list(f)))print(len(zh_labels),type(zh_labels),zh_labels[:5]) # 顯示輸出中文標(biāo)簽transform = transforms.Compose([transforms.Resize(256), # 將輸入圖像的尺寸修改為256×256transforms.CenterCrop(224), # 沿中心裁剪得224×224transforms.ToTensor(),transforms.Normalize( # 圖片歸一化參數(shù):對(duì)圖片按照指定的均值與方差進(jìn)行歸一化處理,必須要與模型實(shí)際訓(xùn)練的預(yù)處理方式一樣。mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225])] )2.4 使用模型進(jìn)行預(yù)測(cè)
2.4.1 代碼操作概述
打開一個(gè)圖片文件,并將其輸入模型進(jìn)行預(yù)測(cè),同時(shí)輸出預(yù)測(cè)結(jié)果。
2.4.2 代碼實(shí)現(xiàn):使用模型進(jìn)行預(yù)測(cè) -----ResNetModel.py(第3部分)
# 1.3 使用模型進(jìn)行預(yù)測(cè) # -------start-------- 將四通道中代表透明通道的維度A去掉,變?yōu)?通道的圖片 def preimg(img): # 圖片預(yù)處理函數(shù):if img.mode == 'RGBA': # 實(shí)現(xiàn)兼容RGBA格式的圖片信息ch = 4print('ch',ch)a = np.asarray(img)[:,:,:3]img = Image.fromarray(a)return imgim = preimg(Image.open('models_2/code_01/book.png')) # 載入圖片 transforms_img = transform(im) # 調(diào)整圖片大小 inputimg = transforms_img.unsqueeze(0) # 增加批次維度 # -------end-------- 將四通道中代表透明通道的維度A去掉,變?yōu)?通道的圖片output = model(inputimg) # 輸入模型 output = F.softmax(output,dim=1) # 獲取結(jié)果# 從預(yù)測(cè)結(jié)果中取前3名 prediction_score , pred_label_idx = torch.topk(output,3) prediction_score = prediction_score.detach().numpy()[0] # 獲取結(jié)果概率 pred_label_idx = pred_label_idx.detach().numpy()[0] # 獲得結(jié)果ID predicted_label = idx_to_labels[str(pred_label_idx[0])][1]#取出標(biāo)簽名稱 predicted_label_zh = zh_labels[pred_label_idx[0] + 1 ] #取出中文標(biāo)簽名稱 print(' 預(yù)測(cè)結(jié)果:', predicted_label,predicted_label_zh,'預(yù)測(cè)分?jǐn)?shù):', prediction_score[0])2.5 預(yù)測(cè)結(jié)果可視化
2.5.1 可視化代碼概述
將預(yù)測(cè)結(jié)果以圖的方式顯示出來。
2.5.2 代碼實(shí)戰(zhàn):預(yù)測(cè)結(jié)果可視化-----ResNetModel.py(第4部分)
# 1.4 預(yù)測(cè)結(jié)果可視化 #可視化處理,創(chuàng)建一個(gè)1行2列的子圖 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 8)) fig.sca(ax1) #設(shè)置第一個(gè)軸是ax1 ax1.imshow(im) #第一個(gè)子圖顯示原始要預(yù)測(cè)的圖片 #設(shè)置第二個(gè)子圖為預(yù)測(cè)的結(jié)果,按概率取前3名 barlist = ax2.bar(range(3), [i for i in prediction_score]) barlist[0].set_color('g') #顏色設(shè)置為綠色 #預(yù)測(cè)結(jié)果前3名的柱狀圖 plt.sca(ax2) plt.ylim([0, 1.1]) #豎直顯示Top3的標(biāo)簽 plt.xticks(range(3), [idx_to_labels[str(i)][1][:15] for i in pred_label_idx ], rotation='vertical') fig.subplots_adjust(bottom=0.2) #調(diào)整第二個(gè)子圖的位置 plt.show() #顯示圖像?結(jié)果輸出:
3? 代碼總覽ResNetModel.py
from PIL import Image import matplotlib.pyplot as plt import json import numpy as np import torch import torch.nn.functional as F from torchvision import models,transforms # 引入torchvision庫 import os os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'# 1.1 下載并加載預(yù)訓(xùn)練模型:引入基礎(chǔ)庫,并使用torchvision庫中的API下載模型。 # Tip:本例使用的中文標(biāo)簽總類別為1001類,索引值為0的類為None,代表未知分類;英文標(biāo)簽總類注意別為1000類,沒有None類。 # 因?yàn)镻yTorch中的模型是在英文標(biāo)簽中訓(xùn)練的,所以在讀取中文標(biāo)簽時(shí),還需要將索引值加1 model = models.resnet18(pretrained=True) # True代表要下載模型 ,返回一個(gè)具有18層的ResNet模型 model = model.eval()# 1.2 還在標(biāo)簽并對(duì)輸入數(shù)據(jù)進(jìn)行預(yù)處理 labels_path = './models_2/code_01/imagenet_class_index.json' # 處理英文標(biāo)簽 with open(labels_path) as json_data:idx_to_labels = json.load(json_data)def getone(onestr):return onestr.replace(',','') with open('models_2/code_01/中文標(biāo)簽.csv','r+') as f:zh_labels = list(map(getone,list(f)))print(len(zh_labels),type(zh_labels),zh_labels[:5]) # 顯示輸出中文標(biāo)簽transform = transforms.Compose([transforms.Resize(256), # 將輸入圖像的尺寸修改為256×256transforms.CenterCrop(224), # 沿中心裁剪得224×224transforms.ToTensor(),transforms.Normalize( # 圖片歸一化參數(shù):對(duì)圖片按照指定的均值與方差進(jìn)行歸一化處理,必須要與模型實(shí)際訓(xùn)練的預(yù)處理方式一樣。mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225])] )# 1.3 使用模型進(jìn)行預(yù)測(cè) # -------start-------- 將四通道中代表透明通道的維度A去掉,變?yōu)?通道的圖片 def preimg(img): # 圖片預(yù)處理函數(shù):if img.mode == 'RGBA': # 實(shí)現(xiàn)兼容RGBA格式的圖片信息ch = 4print('ch',ch)a = np.asarray(img)[:,:,:3]img = Image.fromarray(a)return imgim = preimg(Image.open('models_2/code_01/book.png')) # 載入圖片 transforms_img = transform(im) # 調(diào)整圖片大小 inputimg = transforms_img.unsqueeze(0) # 增加批次維度 # -------end-------- 將四通道中代表透明通道的維度A去掉,變?yōu)?通道的圖片output = model(inputimg) # 輸入模型 output = F.softmax(output,dim=1) # 獲取結(jié)果# 從預(yù)測(cè)結(jié)果中取前3名 prediction_score , pred_label_idx = torch.topk(output,3) prediction_score = prediction_score.detach().numpy()[0] # 獲取結(jié)果概率 pred_label_idx = pred_label_idx.detach().numpy()[0] # 獲得結(jié)果ID predicted_label = idx_to_labels[str(pred_label_idx[0])][1]#取出標(biāo)簽名稱 predicted_label_zh = zh_labels[pred_label_idx[0] + 1 ] #取出中文標(biāo)簽名稱 print(' 預(yù)測(cè)結(jié)果:', predicted_label,predicted_label_zh,'預(yù)測(cè)分?jǐn)?shù):', prediction_score[0])# 1.4 預(yù)測(cè)結(jié)果可視化 #可視化處理,創(chuàng)建一個(gè)1行2列的子圖 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 8)) fig.sca(ax1) #設(shè)置第一個(gè)軸是ax1 ax1.imshow(im) #第一個(gè)子圖顯示原始要預(yù)測(cè)的圖片 #設(shè)置第二個(gè)子圖為預(yù)測(cè)的結(jié)果,按概率取前3名 barlist = ax2.bar(range(3), [i for i in prediction_score]) barlist[0].set_color('g') #顏色設(shè)置為綠色 #預(yù)測(cè)結(jié)果前3名的柱狀圖 plt.sca(ax2) plt.ylim([0, 1.1]) #豎直顯示Top3的標(biāo)簽 plt.xticks(range(3), [idx_to_labels[str(i)][1][:15] for i in pred_label_idx ], rotation='vertical') fig.subplots_adjust(bottom=0.2) #調(diào)整第二個(gè)子圖的位置 plt.show() #顯示圖像總結(jié)
以上是生活随笔為你收集整理的【Pytorch神经网络实战案例】23 使用ImagNet的预训练模型识别图片内容的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2017年php还能火多久,PHP还会火
- 下一篇: html 网页制作标签,html网页制作