https://gitee.com/nickdlk/python_machine_learning
单张图片预测
#加载数单张数据
from keras.preprocessing.image import load_img,img_to_array
pic_dog_path = "E:\\PycharmProjects\\Learning\\dataset\\dog_test.jpg"
pic_dog = load_img(pic_dog_path,target_size=(224,224))#VGG所要的大小
pic_dog = img_to_array(pic_dog)
#加载模型
from keras.applications.vgg16 import VGG16
from keras.applications.vgg16 import preprocess_input
import numpy as np
model_vgg = VGG16(weights="imagenet",include_top=False)
x = np.expand_dims(pic_dog,axis=0)
x = preprocess_input(x)
print(x.shape)
#特征提取
features = model_vgg.predict(x)
print(features.shape)
features = features.reshape(1,7*7*512)
print(features.shape)
可视化数据
from matplotlib import pyplot as plt
fig = plt.figure(figsize=(5,5))
img = load_img(pic_dog_path,target_size=(224,224))
plt.show()
批量预测
就是将单张的批量读取进来
from keras.preprocessing.image import load_img,img_to_array
from keras.applications.vgg16 import VGG16
from keras.applications.vgg16 import preprocess_input
import numpy as np
model_vgg = VGG16(weights="imagenet",include_top=False)
def modelProcess(img_path,model):
img = load_img(img_path,target_size=(224,224))#VGG所要的大小
img = img_to_array(img)
x = np.expand_dims(img,axis=0)
x = preprocess_input(x)
x_vgg = model_vgg.predict(x)
x_vgg = x_vgg.reshape(1,7*7*512)
return x_vgg
#加载图片 提取特征
import os
folder = "E:\\PycharmProjects\\Learning\\dataset\\validation\\cats"
dirs = os.listdir(folder)
img_path = []
for i in dirs:
if os.path.splitext(i)[1]==".jpg":
img_path.append(i)
img_path = [ folder + "\\" + i for i in img_path]
features1 = np.zeros([len(img_path), 25088])
for i in range(len(img_path)):
features_i = modelProcess( img_path[i],model_vgg )
print('preprocessed',img_path[i])
features1[i] = features_i
folder2 = "E:\\PycharmProjects\\Learning\\dataset\\validation\\dogs"
dirs2 = os.listdir(folder2)
img_path2 = []
for i in dirs2:
if os.path.splitext(i)[1]==".jpg":
img_path.append(i)
img_path = [ folder2 + "\\" + i for i in img_path2]
features2 = np.zeros([len(img_path2), 25088])
for i in range(len(img_path2)):
features_i = modelProcess( img_path2[i],model_vgg )
print('preprocessed',img_path2[i])
features2[i] = features_i
print(features1.shape,features2.shape)
y1=np.zeros(300)
y2=np.ones(300)
X = np.concatenate((features1,features2),axis=0)
y = np.concatenate((y1,y2),axis=0)
y = y.reshape(-1,1)
X = X[:500]
y = y[:500]
print(X.shape,y.shape)
分割数据集这里,X和y的数量要一样,可以手动调整数据集,不一样的话手动裁剪.
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=50)
print(X_train.shape,X_test.shape,X.shape)
加载模型
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(units=10,activation="relu",input_dim=25088))
model.add(Dense(units=1,activation="sigmoid"))
model.summary()
model.compile(optimizer="adam",loss="binary_crossentropy",metrics=['accuracy'])#最后是看训练效果的
#训练
model.fit(X_train,y_train,epochs=50)
训练效果
#训练集准确率
from sklearn.metrics import accuracy_score
y_train_predict = model.predict_classes(X_train)
accuracy_train = accuracy_score(y_train,y_train_predict)
print(accuracy_train)
#测试集数据
y_test_predict = model.predict_classes(X_test)
accuracy_test = accuracy_score(y_test,y_test_predict)
print(accuracy_test)
分类单张图片
img_path = "E:\\PycharmProjects\\Learning\\dataset\\dog_test.jpg"
img = load_img(img_path,target_size=(224,224))#VGG所要的大小
img = img_to_array(img)
x = np.expand_dims(img,axis=0)
x = preprocess_input(x)
print(x.shape)
features = model_vgg.predict(x)
features = features.reshape(1,7*7*512)
print(features.shape)
result = model.predict_classes(features)
print(result)
img_path = "E:\\PycharmProjects\\Learning\\dataset\\cat_test.jpeg"
img = load_img(img_path,target_size=(224,224))#VGG所要的大小
img = img_to_array(img)
x = np.expand_dims(img,axis=0)
x = preprocess_input(x)
print(x.shape)
features = model_vgg.predict(x)
features = features.reshape(1,7*7*512)
print(features.shape)
result = model.predict_classes(features)
print(result)
批量预测
import matplotlib as mlp
mlp.rcParams['font.family']='SimHei'
mlp.rcParams['axes.unicode_minus']=False
from matplotlib import pyplot as plt
from keras.preprocessing.image import load_img,img_to_array
a = [ i for i in range(1,10)]
fig = plt.figure(figsize=(10,10))
for i in a:
img_name = "E:\\PycharmProjects\\Learning\\dataset\\validation\\dogs\\dog.21"+str(i).zfill(2)+".jpg"
img_ori = load_img(img_name,target_size=(224,224))
img = img_to_array(img_ori)
x = np.expand_dims(img,axis=0)
x = preprocess_input(x)
# img = img.astype('float32')/255
# img = img.reshape(1,50,50,3)\
x_vgg = model_vgg.predict(x)
x_vgg = features.reshape(1,7*7*512)
result = model.predict_classes(x_vgg)
img_ori = load_img(img_name,target_size=(250,250))
plt.subplot(3,3,i)
if(result[0][0] == 0):
img_show = img_ori.convert('1')
#img_ori.convert('L')#错误的显示灰色#img_ori.convert('1')#错误的显示黑白
plt.imshow(img_show)
plt.title("预测为 猫" )
if(result[0][0] == 1):
plt.imshow(img_ori)
plt.title("预测为 狗" )
#plt.title("预测为 狗" if result[0][0] == 0 else "预测为 猫")
plt.show()
效果不太好…
数据
链接:https://pan.baidu.com/s/15S4LNpPlUIi90Q6hXY9_aA
提取码:nr1b