Verwenden Sie Keras, um festzustellen, ob das Bild Vögel enthält. Vögel haben völlig unterschiedliche Formen, wenn sie stationär sind und wenn sie fliegen, sie haben verschiedene Farben und sie sind leicht mit dem Hintergrund zu assimilieren, daher dachte ich, dass es schwieriger sein könnte, sie als andere Kreaturen zu unterscheiden, also wählte ich Vögel als Motiv. ..
Eigentlich habe ich mit der Methode fortgefahren, das durch Scraping erhaltene Bild zu kommentieren, aber da ich sehr zu kämpfen habe, werde ich die gleiche Methode wie beim letzten Mal ausprobieren.
Wir haben jeweils ca. 100 Bilder mit und ohne Vögel gesammelt. Wir haben eine breite Palette von Bildern gesammelt, von Nahaufnahmen bis zu Bildern, die in der Ferne fliegen.
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
from keras.preprocessing.image import array_to_img, img_to_array, load_img
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import os
import random,math
batch_size = 128
epochs = 16
category_num = 2
img_rows = 256
img_cols = 256
loaded_array = np.load("bird.npz")
x = loaded_array['x']
y = loaded_array['y']
x = x.astype(np.float32)
import random
num =[]
for i in range(217):
num.append(i)
random.seed(1234)
random.shuffle(num)
random_x = []
random_y = []
for i in num:
random_x.append(x[i])
random_y.append(y[i])
random_x = np.array(random_x)
random_y = np.array(random_y)
random_x /= 127.5
random_x -= 1
p = 0.8
split_index = int(len(x)*p)
x_train = random_x[0:split_index]
y_train = random_y[0:split_index]
x_test = random_x[split_index:len(x)]
y_test = random_y[split_index:len(x)]
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(256, 256, 3)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(5, activation='softmax'))
model.compile(loss=keras.losses.sparse_categorical_crossentropy,
optimizer=keras.optimizers.Adadelta(),
metrics=['accuracy'])
Total params: 887,621
Trainable params: 887,621
Non-trainable params: 0
history = model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test))
Train on 152 samples, validate on 39 samples
Epoch 1/16
152/152 [==============================] - 0s 3ms/step - loss: 0.7060 - acc: 0.7105 - val_loss: 0.6270 - val_acc: 0.6923
Epoch 2/16
152/152 [==============================] - 0s 3ms/step - loss: 0.5161 - acc: 0.7895 - val_loss: 0.6391 - val_acc: 0.7179
Epoch 3/16
152/152 [==============================] - 0s 3ms/step - loss: 0.4950 - acc: 0.7566 - val_loss: 0.8009 - val_acc: 0.6154
Epoch 4/16
152/152 [==============================] - 0s 3ms/step - loss: 0.5938 - acc: 0.6776 - val_loss: 0.5763 - val_acc: 0.7949
Epoch 5/16
152/152 [==============================] - 0s 3ms/step - loss: 0.5269 - acc: 0.7697 - val_loss: 0.5721 - val_acc: 0.7692
Epoch 6/16
152/152 [==============================] - 0s 3ms/step - loss: 0.4931 - acc: 0.7566 - val_loss: 0.6643 - val_acc: 0.6667
Epoch 7/16
152/152 [==============================] - 0s 3ms/step - loss: 0.6636 - acc: 0.6974 - val_loss: 0.6254 - val_acc: 0.6923
Epoch 8/16
152/152 [==============================] - 0s 3ms/step - loss: 0.4320 - acc: 0.7961 - val_loss: 0.6124 - val_acc: 0.7949
Epoch 9/16
152/152 [==============================] - 0s 3ms/step - loss: 0.5349 - acc: 0.7500 - val_loss: 0.6818 - val_acc: 0.5897
Epoch 10/16
152/152 [==============================] - 0s 3ms/step - loss: 0.5050 - acc: 0.7961 - val_loss: 0.6286 - val_acc: 0.7692
Epoch 11/16
152/152 [==============================] - 0s 3ms/step - loss: 0.4667 - acc: 0.7829 - val_loss: 0.7403 - val_acc: 0.6667
Epoch 12/16
152/152 [==============================] - 0s 3ms/step - loss: 0.4203 - acc: 0.7961 - val_loss: 0.8192 - val_acc: 0.7179
Epoch 13/16
152/152 [==============================] - 0s 3ms/step - loss: 0.3978 - acc: 0.8355 - val_loss: 0.6761 - val_acc: 0.7436
Epoch 14/16
152/152 [==============================] - 0s 3ms/step - loss: 0.4731 - acc: 0.7895 - val_loss: 0.7102 - val_acc: 0.7436
Epoch 15/16
152/152 [==============================] - 0s 3ms/step - loss: 0.4996 - acc: 0.7829 - val_loss: 0.7735 - val_acc: 0.6667
Epoch 16/16
152/152 [==============================] - 0s 3ms/step - loss: 0.4655 - acc: 0.7697 - val_loss: 0.6601 - val_acc: 0.7436
CPU times: user 3.91 s, sys: 1.38 s, total: 5.28 s
Wall time: 7.31 s
def predict_one_image(image):
fig, (axL, axR1) = plt.subplots(ncols=2, figsize=(10,4))
img = np.copy(image)
img += 1
img *= 127
img = img.astype(np.uint8)
img = np.reshape(img, (img_rows, img_cols, 3))
axL.imshow(img)
img = np.copy(image)
img = np.reshape(img, (1, img_rows, img_cols, 3))
res = model.predict(img, batch_size=None, verbose=0, steps=None)
axR1.bar(range(category_num), np.reshape(res, (-1,)))
axR1.set_xticks(range(category_num))
fig.show()
for i in range(len(x_test)):
predict_one_image(x_test[i])
0 = kein Vogel, 1 = es gibt einen Vogel. In dem Fall, in dem der Vogel gezeigt wird, ist 1 relativ stark, aber in dem in der Ferne fliegenden Bild ist der Unterschied zwischen 1 und 2 gering. In vielen Fotografien werden die Hintergrundlandschaft und die Vögel assimiliert, was meiner Meinung nach einer der Gründe für die geringe Genauigkeit ist.
Dieses Mal habe ich die gleiche Methode wie bei der vorherigen Bilderkennung von Emotionen verwendet, aber die Genauigkeit war nicht sehr gut. Ich denke, dass die Methode mit Anmerkungen etwas genauer sein wird, daher möchte ich den Fehler irgendwie verbessern und vervollständigen.
Recommended Posts