[PYTHON] (Deep Learning) Ich habe Bilder von der Flickr-API gesammelt und versucht, durch Transferlernen mit VGG16 zu unterscheiden

Einführung

** ~~ 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

Sammle Bilder

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.

Erstellen eines Bilderkennungsprogramms

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.

Importierte Bibliotheken, Module usw.

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

Vorsichtsmaßnahmen beim Erstellen einer Modellfunktion

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/

Übersicht über das Modell VGG16

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

002.jpeg

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.

Modifiziert für Transferlernen

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

Erstellen Sie eine Funktion, um festzustellen, ob es sich um ein Kind oder einen alten Mann handelt

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.

003.png

abschließend

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

(Deep Learning) Ich habe Bilder von der Flickr-API gesammelt und versucht, durch Transferlernen mit VGG16 zu unterscheiden
Deep Learning von Grund auf neu Die Theorie und Implementierung des mit Python erlernten Deep Learning Kapitel 3
[Teil 4] Verwenden Sie Deep Learning, um das Wetter anhand von Wetterbildern vorherzusagen
[Teil 1] Verwenden Sie Deep Learning, um das Wetter anhand von Wetterbildern vorherzusagen
[Teil 3] Verwenden Sie Deep Learning, um das Wetter anhand von Wetterbildern vorherzusagen
Erkennen Sie Ihren Chef mit Deep Learning und verbergen Sie den Bildschirm
[Teil 2] Verwenden Sie Deep Learning, um das Wetter anhand von Wetterbildern vorherzusagen
Verfahren zum Generieren und Speichern eines Lernmodells durch maschinelles Lernen, Erstellen eines API-Servers und Kommunizieren mit JSON über einen Browser
Verwenden Sie die Flickr-API von Python
Ich habe versucht, den unter "Abrufen von Bildern von der Flickr-API mit Python" (Teil 2) veröffentlichten Vorlagencode zu überarbeiten.
Realisieren Sie mit Docker und Vagrant die Umgebungskonstruktion für "Deep Learning von Grund auf neu"
Sprachverarbeitung durch tiefes Lernen: Lassen Sie uns anhand der Stimme herausfinden, wer der Sprecher ist
Bereiten Sie die Umgebung für das O'Reilly-Buch "Deep Learning from Grund neu" mit apt-get vor (Debian 8).
Versuchen Sie die Feinabstimmung (Transferlernen), die bei Bildern mit Keras der Mainstream ist, mit Datenlernen
Bestimmen Sie anhand des Bildes des Shiba-Hundes anhand des Bildes des Shiba-Hundes, ob es sich um ein Kind handelt
Die Geschichte des tiefen Lernens mit TPU
Chainer und Deep Learning durch Funktionsnäherung gelernt
99,78% Genauigkeit bei tiefem Lernen durch Erkennen von handgeschriebenem Hiragana
Paralleles Lernen von Deep Learning durch Keras und Kubernetes
Extrahieren Sie Bilder und Tabellen mit Python aus PDF, um die Berichtslast zu verringern
Erhalten Sie Daten von Poloniex, einem virtuellen Geldwechsel, über die API und verwenden Sie Deep Learning, um den Preis des nächsten Tages vorherzusagen.