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