[PYTHON] Déterminer s'il y a des oiseaux dans l'image

introduction

Utilisez des keras pour déterminer si l'image contient des oiseaux. Les oiseaux ont des formes complètement différentes lorsqu'ils sont stationnaires et lorsqu'ils volent, ils ont différentes couleurs, et ils sont faciles à assimiler avec l'arrière-plan, alors j'ai pensé qu'il pourrait être plus difficile de les distinguer que d'autres créatures, alors j'ai choisi les oiseaux comme sujet. ..

En fait, je procédais à la méthode d'annotation de l'image obtenue par grattage, mais comme j'ai beaucoup de mal, je vais essayer la même méthode que la dernière fois.

Collection d'images

Nous avons collecté environ 100 images chacune avec et sans oiseaux. Nous avons collecté un large éventail d'images, des images en gros plan aux images volant au loin.

programme

importer

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

Prétraitement des données d'entraînement

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

Divisez en données d'entraînement et en données de test


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

Définir un modèle d'IA


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

Structure du modèle

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

Apprentissage de modèle


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

Résultat d'exécution

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

Tester le modèle entraîné


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 = aucun oiseau, 1 = il y a un oiseau. Dans le cas où l'oiseau est représenté, 1 est relativement fort, mais dans l'image volant au loin, la différence entre 1 et 2 est faible. Dans de nombreuses photographies, le paysage de fond et les oiseaux sont assimilés, ce qui, je pense, est l'une des raisons de la faible précision.

image.png

image.png

finalement

Cette fois, j'ai utilisé la même méthode que la précédente reconnaissance d'image des émotions, mais la précision n'était pas très bonne. Je pense que la méthode utilisant les annotations sera un peu plus précise, alors j'aimerais en quelque sorte améliorer l'erreur et la compléter.

Recommended Posts

Déterminer s'il y a des oiseaux dans l'image
Vérifiez si les caractères sont similaires en Python
S'il n'y avait pas de conteneurs DI dans le monde.
Lors de la lecture d'une image avec SimpleITK, il y a un problème s'il y a du japonais dans le chemin
Détecter les points de mosaïque dans l'image
python Remarque: déterminez si l'argument de ligne de commande est dans la liste
Déterminer si tous les éléments de la liste sont présents dans la clé dict
Vérifiez si l'URL existe en Python
Algorithme de hachage pour déterminer la même image
Y a-t-il NaN dans le DataFrame pandas?
Si branche en fonction de l'existence ou non d'un élément spécifique dans la liste
Vérifiez s'il existe des points "presque correspondants" pour le groupe de données de coordonnées 3D.
Il y a des moments où vous pouvez raccourcir l'instruction if en utilisant max · min
Qu'est-ce que wheezy dans l'image Docker Python?
[Minecraft] Quels sont les éléments importants de la survie?
Déterminez les nombres dans l'image prise avec la webcam
Détecter les dossiers avec la même image dans ImageHash
Dans bash, "supprimez le fichier s'il existe".
N'y a-t-il pas une valeur par défaut dans le dictionnaire?
Vérifiez si la chaîne est un nombre en python
Vérifiez si la colonne attendue existe dans Pandas DataFrame
[Python] Obtenez les nombres dans l'image graphique avec OCR
Puisqu'il y a beaucoup de tremblements de terre, obtenez l'histoire du tremblement de terre
Convertissez l'image au format .zip en PDF avec Python
Vérifiez s'il s'agit d'Unix dans le langage de script
Essayez de charger l'image dans un thread séparé (OpenCV-Python)
Déterminer si un attribut est défini dans l'objet
Ingénierie des fonctionnalités des prévisions financières: quelles sont les fonctionnalités des prévisions financières?
Vérifiez s'il s'agit d'Unix dans le langage de script
Utilisation de l'application LibreOffice en Python (1) Où sont les macros?
Python Open CV a essayé d'afficher l'image sous forme de texte.
Que faire si l'image n'est pas affichée à l'aide de matplotlib etc. dans le conteneur Docker
Comment vérifier si le contenu du dictionnaire est le même en Python par valeur de hachage
Comment activer l'instruction for lorsqu'il existe plusieurs valeurs pour une clé dans le dictionnaire