1. 程式人生 > >基於keras的影象多分類-flower

基於keras的影象多分類-flower

from keras.models import Sequential
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.layers.core import Activation
from keras.layers.core import Flatten
from keras.layers.core import Dense
from keras import backend as K

class LeNet:
	@staticmethod
def build(width, height, depth, classes): model = Sequential() inputShape = (height, width, depth) # using "channels first",(樣本數,通道數,行或高,列或寬)通道在前,修改引數位置 if K.image_data_format() == "channels_first": inputShape = (depth, height, width) """ CONV => RELU => POOL layers CONV => RELU => POOL layers FC => RELU layers softmax """
model.add(Conv2D(20, (5, 5), padding="same", input_shape=inputShape,name='Conv_1')) model.add(Activation("relu")) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) model.add(Conv2D(50, (5, 5), padding="same",name='Conv_2')) model.add(Activation("relu")) model.add(MaxPooling2D(pool_size=
(2, 2), strides=(2, 2))) # first (and only) set of FC => RELU layers model.add(Flatten()) model.add(Dense(500,name='Dense_1')) model.add(Activation("relu")) # softmax classifier model.add(Dense(classes,name='Dense_2')) model.add(Activation("softmax")) # return the constructed network architecture return model

二、定義訓練模型 train_network.py

# set the matplotlib backend so figures can be saved in the background
import matplotlib
matplotlib.use("Agg")

# import the necessary packages
from keras.preprocessing.image import ImageDataGenerator
from keras.optimizers import Adam
from sklearn.model_selection import train_test_split
from keras.preprocessing.image import img_to_array
from keras.utils import to_categorical
from pyimagesearch.lenet import LeNet
from imutils import paths
import matplotlib.pyplot as plt
import numpy as np
import argparse
import random
import cv2
import os


ap = argparse.ArgumentParser()
ap.add_argument("-d", "--dataset", type=str, default="training_set" ,
	help="path to input dataset")
ap.add_argument("-m", "--model", type=str, default="trained_model" ,
	help="path to output model")
ap.add_argument("-p", "--plot", type=str, default="plot.png" ,
	help="path to output loss/accuracy plot")
args = vars(ap.parse_args())


EPOCHS = 25
INIT_LR = 1e-3
BS = 32


data = []
labels = []
dir_labels = ()
num_class = 0


# finding the labels
print("[INFO] Finding Labels...")
for file in os.listdir(args["dataset"]) :
	temp_tuple=(file,'null')
	dir_labels=dir_labels+temp_tuple
	dir_labels=dir_labels[:-1]
	#print(dir_labels)
	num_class=num_class+1
	#print(num_class)

	
# grab the image paths and randomly shuffle them
print("[INFO] Loading Images...")
imagePaths = sorted(list(paths.list_images(args["dataset"])))
random.seed(42)
random.shuffle(imagePaths)


for imagePath in imagePaths:
	image = cv2.imread(imagePath)
	image = cv2.resize(image, (28, 28))
	image = img_to_array(image)
	data.append(image)

	label = imagePath.split(os.path.sep)[-2]	
	for i in range(num_class) :
		if label == dir_labels[i] :
			label = i
	labels.append(label)

data = np.array(data, dtype="float") / 255.0
labels = np.array(labels)



(trainX, testX, trainY, testY) = train_test_split(data,labels, test_size=0.25, random_state=42)
trainY = to_categorical(trainY, num_classes=num_class)
testY = to_categorical(testY, num_classes=num_class)


aug = ImageDataGenerator(rotation_range=30, width_shift_range=0.1,
	height_shift_range=0.1, shear_range=0.2, zoom_range=0.2,
	horizontal_flip=True, fill_mode="nearest")

print("[INFO] Compiling Model...")
model = LeNet.build(width=28, height=28, depth=3, classes=num_class)
opt = Adam(lr=INIT_LR, decay=INIT_LR / EPOCHS)
model.compile(loss="binary_crossentropy", optimizer=opt,
	metrics=["accuracy"])

print("[INFO] Training Network...")
H = model.fit_generator(aug.flow(trainX, trainY, batch_size=BS),
	validation_data=(testX, testY), steps_per_epoch=len(trainX) // BS,
	epochs=EPOCHS, verbose=1 )

print("[INFO] Saving Model...")
model_base=args["model"]+'.h5'
model.save(model_base)

# plot the training loss and accuracy
plt.style.use("ggplot")
plt.figure()
plt.plot(np.arange(0,EPOCHS), H.history["loss"], label="train_loss")
plt.plot(np.arange(0,EPOCHS), H.history["val_loss"], label="val_loss")
plt.plot(np.arange(0,EPOCHS), H.history["acc"], label="train_acc")
plt.plot(np.arange(0,EPOCHS), H.history["val_acc"], label="val_acc")
plt.title("Training Loss and Accuracy")
plt.xlabel("Epoch #")
plt.ylabel("Loss/Accuracy")
plt.legend(loc="lower left")
plt.savefig(args["plot"])

print("[INFO] Completed...")

三、定義預測模型

# import the necessary packages
from keras.preprocessing.image import img_to_array
from keras.models import load_model
import numpy as np
import argparse
import imutils
import cv2
import os
import sys

# initialising 
dir_labels=()
dir_predict=()
num_class=0

# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-d", "--dataset", required=False, default="training_set",
	help="path to input dataset")
ap.add_argument("-m", "--model", required=False, default="trained_model",
	help="path to trained model model")
ap.add_argument("-i", "--image", required=True,
	help="path to input image")
args = vars(ap.parse_args())

#findings the labels
for file in os.listdir(args["dataset"]) :
	temp_tuple=(file,'null')
	dir_labels=dir_labels+temp_tuple
	dir_labels=dir_labels[:-1]
	num_class=num_class+1

print("[INFO] Labels are ",dir_labels)

# load the image
print("[INFO] Loading Image...")
try :
	image = cv2.imread(args["image"])
	orig = image.copy()
except AttributeError :
	print("[INFO] Error in the test image... ")
	print('[INFO] Exiting...')
	sys.exit()

# pre-process the image for classification
image = cv2.resize(image, (28, 28))
image = image.astype("float") / 255.0
image = img_to_array(image)
image = np.expand_dims(image, axis=0)

# load the trained convolutional neural network
print("[INFO] Loading Network...")
model_base=args["model"]+'.h5'
model = load_model(model_base)

# classify the input image
dir_predict = model.predict(image)[0]
print(dir_labels)
print(dir_predict)
for i in range(num_class) :
	var = 0
	for j in range(num_class) :
		if(dir_predict[i]>=dir_predict[j]) :
			var=var+1
	if(var==num_class) :
		label=dir_labels[i]
		proba=dir_predict[i]
	elif(var==num_class-1) :
		label2=dir_labels[i]
		proba2=dir_predict[i]


label = "{}: {:.2f}%".format(label, proba * 100)

# draw the label on the image
output = imutils.resize(orig, width=400)
cv2.putText(output, label, (10, 25),  cv2.FONT_HERSHEY_SIMPLEX,
	0.7, (0, 255, 0), 2)

# show and save the output image
cv2.imshow("Output", output)
cv2.imwrite("Output.png",output)
cv2.waitKey(0)  #Press any key to exit the output image

print('[INFO] Exiting...')

資料集下載地址:
執行命令如下:

python train_network.py --dataset training_set --model trained_model --plot plo

輸出:
Using TensorFlow backend.
[INFO] Finding Labels...
[INFO] Loading Images...
[INFO] Compiling Model...
[INFO] Training Network...
Epoch 1/25
2018-10-30 16:25:45.234853: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
101/101 [==============================] - 18s 175ms/step - loss: 0.4371 - acc: 0.8043 - val_loss: 0.4090 - val_acc: 0.8098
Epoch 2/25
101/101 [==============================] - 13s 128ms/step - loss: 0.3919 - acc: 0.8224 - val_loss: 0.3658 - val_acc: 0.8415
Epoch 3/25
101/101 [==============================] - 12s 119ms/step - loss: 0.3714 - acc: 0.8333 - val_loss: 0.3616 - val_acc: 0.8515
Epoch 4/25
101/101 [==============================] - 12s 121ms/step - loss: 0.3661 - acc: 0.8352 - val_loss: 0.3442 - val_acc: 0.8547
Epoch 5/25
101/101 [==============================] - 14s 140ms/step - loss: 0.3393 - acc: 0.8486 - val_loss: 0.3250 - val_acc: 0.8636
Epoch 6/25
101/101 [==============================] - 15s 144ms/step - loss: 0.3274 - acc: 0.8575 - val_loss: 0.3387 - val_acc: 0.8528
Epoch 7/25
101/101 [==============================] - 14s 134ms/step - loss: 0.3270 - acc: 0.8564 - val_loss: 0.3232 - val_acc: 0.8614
Epoch 8/25
101/101 [==============================] - 15s 145ms/step - loss: 0.3192 - acc: 0.8626 - val_loss: 0.3176 - val_acc: 0.8627
Epoch 9/25
101/101 [==============================] - 14s 143ms/step - loss: 0.3033 - acc: 0.8695 - val_loss: 0.3333 - val_acc: 0.8562
Epoch 10/25
101/101 [==============================] - 13s 126ms/step - loss: 0.3141 - acc: 0.8641 - val_loss: 0.3155 - val_acc: 0.8647
Epoch 11/25
101/101 [==============================] - 17s 166ms/step - loss: 0.3032 - acc: 0.8672 - val_loss: 0.3088 - val_acc: 0.8667
Epoch 12/25
101/101 [==============================] - 17s 166ms/step - loss: 0.2906 - acc: 0.8755 - val_loss: 0.3450 - val_acc: 0.8562
Epoch 13/25
101/101 [==============================] - 16s 155ms/step - loss: 0.2884 - acc: 0.8759 - val_loss: 0.3135 - val_acc: 0.8688
Epoch 14/25
101/101 [==============================] - 16s 155ms/step - loss: 0.2943 
            
           

相關推薦

基於keras影象分類-flower

from keras.models import Sequential from keras.layers.convolutional import Conv2D from keras.layers.convolutional import MaxPoolin

基於keras實現標籤分類(multi-label classification)

首先討論多標籤分類資料集(以及如何快速構建自己的資料集)。 之後簡要討論SmallerVGGNet,我們將實現的Keras神經網路架構,並用於多標籤分類。 然後我們將實施SmallerVGGNet並使用我們的多標籤分類資料集對其進行訓練。 最後,我們將通過在示例影象上測試我

keras系列︱影象分類訓練與利用bottleneck features進行微調(三)

不得不說,這深度學習框架更新太快了尤其到了Keras2.0版本,快到Keras中文版好多都是錯的,快到官方文件也有舊的沒更新,前路坑太多。 到發文為止,已經有theano/tensorflow/CNTK支援keras,雖然說tensorflow造勢很多,但是筆

【火爐煉AI】深度學習008-Keras解決分類問題

【火爐煉AI】深度學習008-Keras解決多分類問題 (本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2, Keras 2.1.6, Tensorflow 1.9.0) 在我前面的文章【火爐煉AI】深

利用Tensorflow構建CNN影象分類模型及影象引數、資料維度變化情況例項分析

本文以CIFAR-10為資料集,基於Tensorflow介紹了CNN(卷積神經網路)影象分類模型的構建過程,著重分析了在建模過程中卷積層、池化層、扁平化層、全連線層、輸出層的運算機理,以及經過運算後圖像尺寸、資料維度等引數的變化情況。 CIFAR-10資料

基於Tensorflow實現分類支援向量機

1、匯入必要的程式設計庫; import matplotlib.pyplot as plt import numpy as np import tensorflow as tf from sklearn import datasets sess = tf.Se

focal loss論文筆記(附基於keras類別focal loss程式碼)

一.focal loss論文 二.focal loss提出的目的 解決one-stage目標檢測是場景下前景和背景極度不平衡的情況(1:1000) 讓模型在訓練的時候更加關注hard examples(前景)。 另外two-stage的檢測器是用一

Keras之DNN:基於Keras(sigmoid+linear+mse+predict)利用DNN實現迴歸預測——DIY分類資料集&預測新資料點

Keras之DNN:基於Keras(sigmoid+linear+mse+predict)利用DNN實現迴歸預測——DIY多分類資料集&預測新資料點 輸出結果 實現程式碼 # coding:utf-8 Xa=[] Xb=[] for i in ra

分類例項:鳶尾花分類-基於keras的python學習筆記(五)

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/weixin_44474718/article/details/86420803 資料集可以從UCI機器學習倉庫下載(http://archive.ics.uci.edu/ml/datasets

Python機器學習筆記:利用Keras進行分類

名稱 encoder 創建 numeric 種類 deep ast 4.0 允許   Keras是一個用於深度學習的Python庫,它包含高效的數值庫Theano和TensorFlow。   本文的目的是學習如何從csv中加載數據並使其可供Keras使用,如何用神經網絡建立

Keras入門(一)搭建深度神經網絡(DNN)解決分類問題

-s pil return 進行 stat var das 部分 sof Keras介紹 ??Keras是一個開源的高層神經網絡API,由純Python編寫而成,其後端可以基於Tensorflow、Theano、MXNet以及CNTK。Keras 為支持快速實驗而生,能夠把

Keras分類例項:鳶尾花

鳶尾花資料集具有4個數值型輸入專案,並且數值具有相同的尺度,輸出專案是鳶尾花的三個子類。 這裡使用的是Scikit-Learn中提供的資料集,省略了資料預處理的過程,如果在UCI上面下載的話要使用Pandas中的read_csv()函式匯入資料,並使用Scikit-Learn的LabelEnco

基於深度學習和遷移學習的遙感影象場景分類實踐(AlexNet、ResNet)

卷積神經網路(CNN)在影象處理方面有很多出色的表現,在ImageNet上有很多成功的模型都是基於CNN的。AlexNet是具有歷史意義的一個網路,2012年提出來當年獲得了當年的ImageNet LSVRC比賽的冠軍,此後ImageNet LSVRC的冠軍都是都是用CNN做的,並且層

【火爐煉AI】深度學習009-用Keras遷移學習提升性能(分類問題)

tro ray size array 全連接 步驟 loss pytho numpy 【火爐煉AI】深度學習009-用Keras遷移學習提升性能(多分類問題) (本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn

【火爐煉AI】深度學習010-Keras微調提升效能(分類問題)

【火爐煉AI】深度學習010-Keras微調提升效能(多分類問題) (本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2, Keras 2.1.6, Tensorflow 1.9.0) 前面的文章(【火爐

Keras之DNN:基於Keras(sigmoid+binary_crossentropy+predict_proba)利用DNN實現分類預測概率——DIY二分類資料集&預測新資料點

#Keras之DNN:基於Keras(sigmoid+binary_crossentropy+predict_proba)利用DNN實現分類預測概率——DIY二分類資料集&預測新資料點 輸出結果   實現程式碼 # coding:utf-8 #Ke

基於混淆矩陣計算分類的準確率和召回率

定義 TP-將正類預測為正類 FN-將正類預測為負類 FP-將負類預測位正類 TN-將負類預測位負類 準確率(正確率)=所有預測正確的樣本/總的樣本 (TP+TN)/總 精確率= 將正類預測為正類 / 所有預測為正類 TP/(TP+FP) 召回率 = 將正類預

【NLP】【八】基於keras與imdb影評資料集做情感分類

【一】本文內容綜述 1. keras使用流程分析(模型搭建、模型儲存、模型載入、模型使用、訓練過程視覺化、模型視覺化等) 2. 利用keras做文字資料預處理 【二】環境準備 1. 資料集下載:http://ai.stanford.edu/~amaas/data/sentiment/

基於Keras的LSTM變數時間序列預測 (學習筆記)

本文翻譯自Jason Brownlee的部落格https://machinelearningmastery.com/multivariate-time-series-forecasting-lstms-keras/ 本部落格主要參考以下中文版部落格 https://blog.csdn.net/qq_280

基於Keras的LSTM變數時間序列預測(北京PM2.5資料集pollution.csv)

                             基於Keras的LSTM多變數時間序列預測   傳統的線性模型難以解決多變數或多輸入問題