** ~~ Der Artikel wurde überarbeitet (10. März 2020) ~~ ** ** Der Artikel wurde korrigiert (4. Mai 2020) **
Dieser Artikel fasst Folgendes zusammen:
Übrigens, da ich ein Anfänger im maschinellen Lernen bin, verwende ich möglicherweise unangemessene Ausdrücke. In diesem Fall entschuldigen wir uns für die Unannehmlichkeiten, aber wir würden uns freuen, wenn Sie darauf hinweisen könnten.
Die Ausführungsumgebung ist wie folgt.
Die URLs, auf die ich verwiesen habe, sind unten aufgeführt. https://qiita.com/ayumiya/items/e1e87df54c41519be6b4
Dieses Mal habe ich die flickr-API verwendet, um eine große Anzahl von Bildern zu sammeln. Diesbezüglich haben wir Bilder gesammelt, indem wir flickr registriert, API, geheimen SCHLÜSSEL usw. unter Bezugnahme auf die folgende URL ausgegeben haben. http://ykubot.com/2017/11/05/flickr-api/
In Bezug auf die Sammlung konnte ich Bilder automatisch sammeln, indem ich das folgende Programm auf Python ausführte. Die zum Sammeln von 300 Blättern erforderliche Zeit betrug in diesem Fall etwa 5 Minuten.
Unten finden Sie den vollständigen Text des Programms.
collection.py
import os
import time
import traceback
import flickrapi
from urllib.request import urlretrieve
import sys
from retry import retry
flickr_api_key = "xxxx" #Geben Sie den hier ausgegebenen API-SCHLÜSSEL ein
secret_key = "xxxx" #Geben Sie den hier ausgegebenen SECRET KEY ein
keyword = sys.argv[1]
@retry()
def get_photos(url, filepath):
urlretrieve(url, filepath)
time.sleep(1)
if __name__ == '__main__':
flicker = flickrapi.FlickrAPI(flickr_api_key, secret_key, format='parsed-json')
response = flicker.photos.search(
text='child',#Geben Sie das Wort ein, nach dem Sie suchen möchten
per_page=300,#Geben Sie an, wie viele Blätter Sie sammeln möchten
media='photos',
sort='relevance',
safe_search=1,
extras='url_q,license'
)
photos = response['photos']
try:
if not os.path.exists('./image-data/' + 'child'):
os.mkdir('./image-data/' +'child')
for photo in photos['photo']:
url_q = photo['url_q']
filepath = './image-data/' + 'child' + '/' + photo['id'] + '.jpg'
get_photos(url_q, filepath)
except Exception as e:
traceback.print_exc()
Dieses Mal haben wir 300 dieser Bilder gesammelt, um "Kind: Kind" und "alter Mann: Ältester" zu erkennen. Wie ich später erläutern werde, wurde geschätzt, dass das Suchwort Elder keine hohe Erkennungsrate aufwies, da sowohl Bilder von Pflanzen, jungen Frauen usw. als auch von alten Menschen gesammelt wurden.
Der folgende Artikel beschreibt das Bilderkennungsprogramm. Ich werde die Punkte, auf die ich gestoßen bin, und die Punkte, die auf dem gesamten Bild zu beachten sind, eingrenzen und dann den vollständigen Text des Programms schreiben.
child.py
import os
import cv2
import numpy as np
import matplotlib.pyplot as plt
from keras.utils.np_utils import to_categorical
from keras.layers import Dense, Dropout, Flatten, Input
from keras.applications.vgg16 import VGG16
from keras.models import Model, Sequential
from keras import optimizers
child.py
model = Model(input=vgg16.input, output=top_model(vgg16.output))
Ursprünglich installierte die Spezifikationsumgebung Tensorflow und zitierte es als Bibliothekskeras darin. Beispiel: Import von tensorflow.keras.utils nach_categorical
Wenn Sie bei der Definition dieser Modellfunktion so vorgehen, wie Sie sind,
('Keyword argument not understood:', 'input')
Ein Fehler ist aufgetreten.
Es scheint, dass dies passiert, wenn die Version von Keras alt ist, Ich habe auch Keras selbst aktualisiert, aber der Fehler trat weiterhin auf. Als ich versuchte zu schreiben, um Keras selbst zu lesen, wurde es daher gelöst.
Diese Fehlerübersicht und Aktualisierung von Keras selbst https://sugiyamayoshiaki.jp/%E3%80%90%E3%82%A8%E3%83%A9%E3%83%BC%E3%80%91typeerror-keyword-argument-not-understood-data_format/
Das diesmal verwendete Modell ist ein trainiertes Modell, das auf einem mehrschichtigen Perzeptron namens VGG16 basiert.
URL:https://arxiv.org/pdf/1409.1556.pdf Verfasser: Karen Simonyan & Andrew Zisserman Visual Geometry Group, Department of Engineering Science, University of Oxford
Das obige ** Bild D ** ist das Modell, das diesmal behandelt wird. Es ist ein neuronales Netzwerk mit 13 Faltungsschichten ** mit einer Kerngröße von ** 3 Dimensionen und 3 vollständig verbundenen Schichten. Dies ist der 2015 angekündigte Algorithmus, aber zuvor war die Kernelgröße sehr groß, z. B. 9 oder 11 Dimensionen. Daher gab es das Problem, dass die Unterscheidungsrate niedrig war, obwohl die Berechnungslast hoch war. Daher ist VGG16 eine Methode, die dieses Problem löst, indem die Kernelgröße auf 3 reduziert und die Schichten tiefer gemacht werden (13 Schichten). Darüber hinaus besteht der Punkt dieses Modells darin, dass Sie sich auf ein gewichtetes Modell beziehen können, das auf einer Bildseite namens ImageNet eine große Menge an Bilderkennungstraining absolviert hat. Es kann als 1000 Arten von Gegenständen identifiziert werden. Daher gibt es zwei Möglichkeiten, es zu verwenden.
Eine besteht darin, das gewichtete Modell zu verwenden, das trainiert wurde, um aus 1000 Typen das nächstgelegene zu finden. Die zweite Methode besteht darin, das Modell selbst für neues Lernen ohne Verwendung von Gewichten zu verwenden. Dieses Mal möchte ich diese zweite Methode verwenden, um zwischen Kindern und alten Menschen zu unterscheiden.
Werfen wir einen Blick auf den Inhalt dieses Modells.
child.py
model.summary()
Ausgabe
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 224, 224, 3) 0
_________________________________________________________________
block1_conv1 (Conv2D) (None, 224, 224, 64) 1792
_________________________________________________________________
block1_conv2 (Conv2D) (None, 224, 224, 64) 36928
_________________________________________________________________
block1_pool (MaxPooling2D) (None, 112, 112, 64) 0
_________________________________________________________________
block2_conv1 (Conv2D) (None, 112, 112, 128) 73856
_________________________________________________________________
block2_conv2 (Conv2D) (None, 112, 112, 128) 147584
_________________________________________________________________
block2_pool (MaxPooling2D) (None, 56, 56, 128) 0
_________________________________________________________________
block3_conv1 (Conv2D) (None, 56, 56, 256) 295168
_________________________________________________________________
block3_conv2 (Conv2D) (None, 56, 56, 256) 590080
_________________________________________________________________
block3_conv3 (Conv2D) (None, 56, 56, 256) 590080
_________________________________________________________________
block3_pool (MaxPooling2D) (None, 28, 28, 256) 0
_________________________________________________________________
block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160
_________________________________________________________________
block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808
_________________________________________________________________
block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808
_________________________________________________________________
block4_pool (MaxPooling2D) (None, 14, 14, 512) 0
_________________________________________________________________
block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808
_________________________________________________________________
block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808
_________________________________________________________________
block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808
_________________________________________________________________
block5_pool (MaxPooling2D) (None, 7, 7, 512) 0
_________________________________________________________________
flatten (Flatten) (None, 25088) 0
_________________________________________________________________
fc1 (Dense) (None, 4096) 102764544
_________________________________________________________________
fc2 (Dense) (None, 4096) 16781312
_________________________________________________________________
predictions (Dense) (None, 1000) 4097000
=================================================================
Total params: 138,357,544
Trainable params: 138,357,544
Non-trainable params: 0
_________________________________________________________________
Betrachtet man ** Ausgabeform **, so ist dies (Keine, 244, 244, 3). Dies entspricht ** (Anzahl der Abtastwerte, vertikale Auflösung, horizontale Auflösung, Anzahl der Kanäle (≈ RGB für die Farbe der Dimensionsnummer)) **. Wenn wir uns diesen Wert ansehen, können wir sehen, dass die Anzahl der Dimensionen nach dem Durchlaufen der Faltungsschicht von 64 auf 128 auf 256 auf 512 gestiegen ist.
child.py
input_tensor = Input(shape=(50, 50, 3))
vgg16 = VGG16(include_top=False, weights='imagenet', input_tensor=input_tensor)
top_model = Sequential()
top_model.add(Flatten(input_shape=vgg16.output_shape[1:]))
top_model.add(Dense(256, activation='relu'))
top_model.add(Dropout(0.5))
top_model.add(Dense(2, activation='softmax'))
Fügen Sie nach der VGG16-Ebene hinzu, um sie in zwei Typen zu unterteilen: Kinder und alte Menschen.
https://qiita.com/MuAuan/items/86a56637a1ebf455e180
child.py
def child(img):
img = cv2.resize(img, (50, 50))
pred = np.argmax(model.predict(np.array([img])))
if pred == 0:
return 'Das ist ein Kind'
else:
return 'Das ist ein alter Mann'
Infolgedessen war die richtige Antwortrate nicht sehr gut. Dies liegt daran, dass bei der Suche nach "Elder" auf flickr Fotos von Nicht-Alten getroffen werden. Ich denke, dass das Lernen nicht gut läuft. Das Bild unten ist ein Beispiel.
Wenn Sie ein bereits trainiertes Modell wie VGG16 verwenden, ist es effektiv, einen Datensatz zu verwenden, der den trainierten Inhalt gut nutzen kann.
Ich hoffe, Sie können es nutzen, indem Sie fest auf den Schultern Ihrer Vorfahren reiten.
Das vollständige Programm ist unten gespeichert. https://github.com/Fumio-eisan/vgg16_child20200310
Recommended Posts