keras實(shí)現(xiàn)VGG16方式(預(yù)測(cè)一張圖片)
我就廢話不多說了,大家還是直接看代碼吧~
from keras.applications.vgg16 import VGG16#直接導(dǎo)入已經(jīng)訓(xùn)練好的VGG16網(wǎng)絡(luò) from keras.preprocessing.image import load_img#load_image作用是載入圖片 from keras.preprocessing.image import img_to_array from keras.applications.vgg16 import preprocess_input from keras.applications.vgg16 import decode_predictions model = VGG16() image = load_img('D:\\photo\\dog.jpg',target_size=(224,224))#參數(shù)target_size用于設(shè)置目標(biāo)的大小,如此一來無論載入的原圖像大小如何,都會(huì)被標(biāo)準(zhǔn)化成統(tǒng)一的大小,這樣做是為了向神經(jīng)網(wǎng)絡(luò)中方便地輸入數(shù)據(jù)所需的。 image = img_to_array(image)#函數(shù)img_to_array會(huì)把圖像中的像素?cái)?shù)據(jù)轉(zhuǎn)化成NumPy中的array,這樣數(shù)據(jù)才可以被Keras所使用。 #神經(jīng)網(wǎng)絡(luò)接收一張或多張圖像作為輸入,也就是說,輸入的array需要有4個(gè)維度: samples, rows, columns, and channels。由于我們僅有一個(gè) sample(即一張image),我們需要對(duì)這個(gè)array進(jìn)行reshape操作。 image = image.reshape((1,image.shape[0],image.shape[1],image.shape[2])) image = preprocess_input(image)#對(duì)圖像進(jìn)行預(yù)處理 y = model.predict(image)#預(yù)測(cè)圖像的類別 label = decode_predictions(y)#Keras提供了一個(gè)函數(shù)decode_predictions(),用以對(duì)已經(jīng)得到的預(yù)測(cè)向量進(jìn)行解讀。該函數(shù)返回一個(gè)類別列表,以及類別中每個(gè)類別的預(yù)測(cè)概率, label = label[0][0] print('%s(%.2f%%)'%(label[1],label[2]*100)) # print(model.summary())
from keras.models import Sequential from keras.layers.core import Flatten,Dense,Dropout from keras.layers.convolutional import Convolution2D,MaxPooling2D,ZeroPadding2D from keras.optimizers import SGD import numpy as np from keras.preprocessing import image from keras.applications.imagenet_utils import preprocess_input, decode_predictions import time from keras import backend as K K.set_image_dim_ordering('th') def VGG_16(weights_path=None): model = Sequential() model.add(ZeroPadding2D((1, 1), input_shape=(3, 224, 224))) model.add(Convolution2D(64, (3, 3), activation='relu')) model.add(ZeroPadding2D((1, 1))) model.add(Convolution2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D((2, 2), strides=(2, 2))) model.add(ZeroPadding2D((1, 1))) model.add(Convolution2D(128, (3, 3), activation='relu')) model.add(ZeroPadding2D((1, 1))) model.add(Convolution2D(128, (3, 3), activation='relu')) model.add(MaxPooling2D((2, 2), strides=(2, 2))) model.add(ZeroPadding2D((1, 1))) model.add(Convolution2D(256, (3, 3), activation='relu')) model.add(ZeroPadding2D((1, 1))) model.add(Convolution2D(256, (3, 3), activation='relu')) model.add(ZeroPadding2D((1, 1))) model.add(Convolution2D(256, (3, 3), activation='relu')) model.add(MaxPooling2D((2, 2), strides=(2, 2))) model.add(ZeroPadding2D((1, 1))) model.add(Convolution2D(512, (3, 3), activation='relu')) model.add(ZeroPadding2D((1, 1))) model.add(Convolution2D(512, (3, 3), activation='relu')) model.add(ZeroPadding2D((1, 1))) model.add(Convolution2D(512, (3, 3), activation='relu')) model.add(MaxPooling2D((2, 2), strides=(2, 2))) model.add(ZeroPadding2D((1, 1))) model.add(Convolution2D(512, (3, 3), activation='relu')) model.add(ZeroPadding2D((1, 1))) model.add(Convolution2D(512, (3, 3), activation='relu')) model.add(ZeroPadding2D((1, 1))) model.add(Convolution2D(512, (3, 3), activation='relu')) model.add(MaxPooling2D((2, 2), strides=(2, 2))) model.add(Flatten()) model.add(Dense(4096, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(4096, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(1000, activation='softmax')) if weights_path: model.load_weights(weights_path,by_name=True) return model model = VGG_16(weights_path='F:\\Kaggle\\vgg16_weights.h5') sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True) model.compile(optimizer=sgd, loss='categorical_crossentropy') t0 = time.time() img = image.load_img('D:\\photo\\dog.jpg', target_size=(224, 224)) x = image.img_to_array(img) # 三維(224,224,3) x = np.expand_dims(x, axis=0) # 四維(1,224,224,3)#因?yàn)閗eras要求的維度是這樣的,所以要增加一個(gè)維度 x = preprocess_input(x) # 預(yù)處理 print(x.shape) y_pred = model.predict(x) # 預(yù)測(cè)概率 t1 = time.time() print("測(cè)試圖:", decode_predictions(y_pred)) # 輸出五個(gè)最高概率(類名, 語義概念, 預(yù)測(cè)概率) print("耗時(shí):", str((t1 - t0) * 1000), "ms")
這是兩種不同的方式,第一種是直接使用vgg16的參數(shù),需要在運(yùn)行時(shí)下載,第二種是我們已經(jīng)下載好的權(quán)重,直接在參數(shù)中輸入我們的路徑即可。
補(bǔ)充知識(shí):keras加經(jīng)典網(wǎng)絡(luò)的預(yù)訓(xùn)練模型(以VGG16為例)
我就廢話不多說了,大家還是直接看代碼吧~
# 使用VGG16模型 from keras.applications.vgg16 import VGG16 print('Start build VGG16 -------') # 獲取vgg16的卷積部分,如果要獲取整個(gè)vgg16網(wǎng)絡(luò)需要設(shè)置:include_top=True model_vgg16_conv = VGG16(weights='imagenet', include_top=False) model_vgg16_conv.summary() # 創(chuàng)建自己的輸入格式 # if K.image_data_format() == 'channels_first': # input_shape = (3, img_width, img_height) # else: # input_shape = (img_width, img_height, 3) input = Input(input_shape, name = 'image_input') # 注意,Keras有個(gè)層就是Input層 # 將vgg16模型原始輸入轉(zhuǎn)換成自己的輸入 output_vgg16_conv = model_vgg16_conv(input) # output_vgg16_conv是包含了vgg16的卷積層,下面我需要做二分類任務(wù),所以需要添加自己的全連接層 x = Flatten(name='flatten')(output_vgg16_conv) x = Dense(4096, activation='relu', name='fc1')(x) x = Dense(512, activation='relu', name='fc2')(x) x = Dense(128, activation='relu', name='fc3')(x) x = Dense(1, activation='softmax', name='predictions')(x) # 最終創(chuàng)建出自己的vgg16模型 my_model = Model(input=input, output=x) # 下面的模型輸出中,vgg16的層和參數(shù)不會(huì)顯示出,但是這些參數(shù)在訓(xùn)練的時(shí)候會(huì)更改 print('\nThis is my vgg16 model for the task') my_model.summary()
以上這篇keras實(shí)現(xiàn)VGG16方式(預(yù)測(cè)一張圖片)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
OpenCV-Python實(shí)現(xiàn)輪廓擬合
本文將結(jié)合實(shí)例代碼,介紹OpenCV-Python實(shí)現(xiàn)輪廓擬合,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06python實(shí)現(xiàn)PID溫控算法的示例代碼
PID算法是一種常用的控制算法,用于調(diào)節(jié)和穩(wěn)定控制系統(tǒng)的輸出,這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)pid溫控算法,需要的可以參考下2024-01-01python GUI庫圖形界面開發(fā)之PyQt5窗口背景與不規(guī)則窗口實(shí)例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5窗口背景與不規(guī)則窗口實(shí)例,需要的朋友可以參考下2020-02-02Python實(shí)現(xiàn)二維數(shù)組按照某行或列排序的方法【numpy lexsort】
這篇文章主要介紹了Python實(shí)現(xiàn)二維數(shù)組按照某行或列排序的方法,結(jié)合具體實(shí)例形式分析了Python使用numpy模塊的lexsort方法針對(duì)二維數(shù)組進(jìn)行排序的常用操作技巧,需要的朋友可以參考下2017-09-09采用python實(shí)現(xiàn)簡單QQ單用戶機(jī)器人的方法
這篇文章主要介紹了采用python實(shí)現(xiàn)簡單QQ單用戶機(jī)器人的方法,需要的朋友可以參考下2014-07-07YOLOv5改進(jìn)系列之增加小目標(biāo)檢測(cè)層
yolov5出來已經(jīng)很長時(shí)間了,所以有關(guān)yolov5的一些詳細(xì)介紹在這里就不一一介紹了,下面這篇文章主要給大家介紹了關(guān)于YOLOv5改進(jìn)系列之增加小目標(biāo)檢測(cè)層的相關(guān)資料,需要的朋友可以參考下2022-09-09