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()