VGG19辨識

      在〈VGG19辨識〉中尚無留言

VGG16/19 是 ImageNet 每年舉辦的模型演算競賽(ILSVRC)中,於2014年獲得亞軍的模型。以前曾說明 VGG16 模型的運用,此篇改成 VGG19,其實用法差不多。VGG16/19 用來偵測圖片,將圖片進行分類,是由牛津大學計算機視覺組對 100 萬張圖片進行訓練,然後分成1000 個種類。

安裝套件

如果是使用 python 3.8,則可安裝 tensorflow 2.10.1 啟動 GPU,如下安裝指令

pip install tensorflow==2.10.1 opencv-python Pillow matplotlib

但如果是使用 python 3.10 以上的版本,則 tensorflow 2.10.1 是無法安裝的,必需安裝最新版本 2.17.0 以上,而且無法啟動 GPU,安裝指令如下

pip install tensorflow opencv-python Pillow matplotlib

簡易偵測

model=VGG19() 會建立模型,若是第一次執行,會到網路上下載模型,並儲存在 C:\Users\mahal\.keras\models 目錄中,所以會比較久。第二次執行,就不會重複下載,所以速度就快多了。

在取得圖片的numpy陣列後,必需使用 np.expand_dims(x, axis=0) 由 3 維的最前面一維擴展成 4 維,原因在於 VGG19 規定傳入 predict 開始偵測時,必需是 (1, 224,224, 3) 的陣列格式。

preprocess_input()稱為圖片預處理。預處理有三種方式,分別為 caffe, tf, troch。
VGG19採用 caffe方式,先將RGB 轉成 BGR格式,然後將所有點的B值減掉B的平均數,G及R亦同。如此就可以讓每個點的每個顏色值分佈在 0 的左右二邊。

predict() 偵測後,會傳回 1000 個分數,分別代表每一個種類的分數,分數愈高表示愈接近此分類。所以取得分數最高的那一個分類即可。

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
from PIL import Image, ImageFont, ImageDraw
from keras.src.applications import vgg19
from keras.src.applications.vgg19 import VGG19, preprocess_input
import cv2
import numpy as np
import pylab as plt
model=VGG19(weights='imagenet', include_top=True)
img=cv2.imdecode(np.fromfile('tiger.jpg', dtype=np.uint8), cv2.IMREAD_UNCHANGED)
x=cv2.resize(img, (224, 224), interpolation=cv2.INTER_LINEAR)
x=cv2.cvtColor(x, cv2.COLOR_BGR2RGB)

#VGG19規定在偵測(predict)時,必需傳入 #(1,224,224,3)的資料格式
x=np.expand_dims(x, axis=0)

#預處理圖片及偵測圖片
x=preprocess_input(x)
out=model.predict(x)

#decode_predictions轉成標籤及分數
results=vgg19.decode_predictions(out, top=3)
result=results[0][0]
print('Predicted:', result)

#寫入文字並顯示圖片
pil = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
font = ImageFont.truetype('simsun.ttc', 100)
txt=f'名稱 : {result[1]}\n信心度 : {result[2]*100:.2f}%'
ImageDraw.Draw(pil).text((5, 5), txt, font=font, fill=(255,255,0))
plt.figure(figsize=(12,9))
plt.imshow(pil)
plt.show()

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *