[PYTHON] Feststellen, ob das Bild Vögel enthält

Einführung

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.

Sammlung von Bildern

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.

Programm

importieren

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

Vorverarbeitung von Trainingsdaten

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

Teilen Sie in Trainingsdaten und Testdaten


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

AI-Modell definieren


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'])

Modellstruktur

Total params: 887,621
Trainable params: 887,621
Non-trainable params: 0

Modelllernen


history = model.fit(x_train, y_train,
         batch_size=batch_size,
         epochs=epochs,
         verbose=1,
         validation_data=(x_test, y_test))

Ausführungsergebnis

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

image.png

Testen Sie das trainierte Modell


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.

image.png

image.png

Schließlich

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

Feststellen, ob das Bild Vögel enthält
Überprüfen Sie, ob die Zeichen in Python ähnlich sind
Wenn es keine DI-Container auf der Welt gäbe.
Beim Lesen eines Bildes mit SimpleITK tritt ein Problem auf, wenn sich Japanisch im Pfad befindet
Erkennen Sie Mosaikpunkte im Bild
Python Hinweis: Stellen Sie fest, ob das Befehlszeilenargument in der Liste enthalten ist
Stellen Sie fest, ob alle Listenelemente im Diktatschlüssel vorhanden sind
Überprüfen Sie, ob die URL in Python vorhanden ist
Hashing-Algorithmus zur Bestimmung des gleichen Bildes
Gibt es NaN im Pandas DataFrame?
Wenn verzweigen, hängt davon ab, ob die Liste ein bestimmtes Element enthält
Überprüfen Sie, ob für die 3D-Koordinatendatengruppe "fast übereinstimmende" Punkte vorhanden sind.
Es gibt Zeiten, in denen Sie die if-Anweisung mit max · min verkürzen können
Was ist im Docker Python-Image pfeifend?
[Minecraft] Was sind die wichtigsten Überlebensgegenstände?
Bestimmen Sie die Zahlen in dem mit der Webkamera aufgenommenen Bild
Erkennen Sie Ordner mit demselben Bild in ImageHash
In Bash "Löschen Sie die Datei, falls vorhanden".
Gibt es keinen Standardwert im Wörterbuch?
Überprüfen Sie, ob die Zeichenfolge eine Zahl in Python ist
Überprüfen Sie, ob die erwartete Spalte in Pandas DataFrame vorhanden ist
[Python] Holen Sie sich die Zahlen im Diagramm mit OCR
Da es viele Erdbeben gibt, erfahren Sie mehr über die Geschichte des Erdbebens
Konvertieren Sie das Bild in .zip mit Python in PDF
Überprüfen Sie, ob es sich um Unix in der Skriptsprache handelt
Versuchen Sie, das Bild in einen separaten Thread zu laden (OpenCV-Python).
Bestimmen Sie, ob im Objekt ein Attribut definiert ist
Feature Engineering für Finanzprognosen: Wie hoch ist der Feature-Betrag in der Finanzprognose?
Python Open CV hat versucht, das Bild im Text anzuzeigen.
Was tun, wenn das Bild nicht mit matplotlib usw. im Docker-Container angezeigt wird?
So überprüfen Sie anhand des Hashwerts, ob der Inhalt des Wörterbuchs in Python identisch ist
So drehen Sie die for-Anweisung, wenn das Wörterbuch mehrere Werte für einen Schlüssel enthält