[PYTHON] Identifizieren Sie den Namen aus dem Blumenbild mit Keras (Tensorfluss)

Faltungsneurales Netzwerk (CNN) Faltungsneurales Netzwerk (CNN) Lassen Sie uns ein Experiment durchführen, um den Namen anhand des Bildes der Blume zu identifizieren!

Einführung

Dieses Mal werden wir das Programm in die Docker-Umgebung stellen.

    1. Umweltvorbereitung
  1. Programm
    1. Experiment   Platzieren Sie das Programm in Git.

Umweltvorbereitung

Entwicklungsumgebung

Macbook pro 13 2016

Docker installieren

Docker kann einfach als Binärdatei von der folgenden Site installiert werden.

https://docs.docker.com/docker-for-mac/

Erstellen Sie eine maschinelle Lernumgebung aus einem Miniconda-Image

Sie können eine kompilierte Binärdatei mit Paketen für maschinelles Lernen installieren Bauen Sie eine Umgebung mit Conda (Miniconda).

① Vorlage herunterladen

$ docker pull continuumio/miniconda3

② Docker-Datei erstellen

$ vi Dockerfile
  :
$ cat Dockerfile
FROM continuumio/miniconda3
  RUN apt-get update
  RUN pip install --upgrade pip
  RUN pip install tensorflow \
                  pandas \
                  scipy \
                  Pillow \
                  keras
  RUN pip install -U scikit-learn
  RUN mkdir /home/src/

③ Docker Build (Image erstellen)

$ docker build -t conda:init .

④ Bestätigung

$ docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
conda                    init                daf923e29da8        2 hours ago         1.55 GB

⑤ Docker starten

Hängen Sie dieses Mal den zu entwickelnden Ordner in Docker ein.

# [mount dir]Bitte umschreiben und verwenden.
$ docker run -i -t -v [mount dir]:/home/src conda:init /bin/bash

Sie können den Vorgang beenden, indem Sie "Strg + p" oder "Strg + q" drücken.

Beim erneuten Zugriff auf den Container

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
745860b72c67        conda:init         "/usr/bin/tini -- ..."   11 hours ago        Up 11 hours                             friendly_galileo

#Geben Sie die CONTAINER-ID an
$ docker attach 745860b72c67

Damit ist die Umgebungsvorbereitung abgeschlossen

Blumenbild-Klassifizierungsprogramm von hier

① Vorbereitung der Trainingsdaten

Sammeln Sie entsprechende Blumenbilder aus dem Internet! Benennen Sie die Blume im Verzeichnisnamen, wie in der Abbildung unten gezeigt, und platzieren Sie das Bild der Blume darin.

キャプチャ

② Erstellung eines Lernmodells

Bereiten Sie ein Programm zum Speichern von Bilddaten und einer Reihe von Kategorien vor.

data_create.py


from PIL import Image
import sys
from sklearn import cross_validation
import os, glob
import numpy as np
import random, math

#
#Trainingsdaten generieren
#
class DataCreate : 
  def __init__(self, script_name):
    Image.LOAD_TRUNCATED_IMAGES = True
  
  def create(self) :
    input_dir = "images"
    categorys = []
    
    dir_list = os.listdir(input_dir)
    for index, dir_name in enumerate(dir_list):
      if dir_name == '.DS_Store' :
        continue
      categorys.append(dir_name)
    image_size = 50
    train_data = [] #Bilddaten,Daten beschriften
    for idx, category in enumerate(categorys): 
      try :
        print("---", category)
        image_dir = input_dir + "/" + category
        files = glob.glob(image_dir + "/*.jpg ")
        for i, f in enumerate(files):
          img = Image.open(f)
          img = img.convert("RGB")
          img = img.resize((image_size, image_size))
          data = np.asarray(img)
          train_data.append([data, idx])

      except:
        print("SKIP : " + category)

    #Daten mischen
    random.shuffle(train_data)
    X, Y = [],[]
    for data in train_data: 
      X.append(data[0])
      Y.append(data[1])

    test_idx = math.floor(len(X) * 0.8)
    xy = (np.array(X[0:test_idx]), np.array(X[test_idx:]), 
          np.array(Y[0:test_idx]), np.array(Y[test_idx:]))
    np.save("./npy/flower", xy)
  

if __name__ == "__main__":
  args = sys.argv
  datacreate = DataCreate(args[0])
  datacreate.create()


Bereiten Sie als Nächstes ein Programm vor, um ein Lernmodell zu erstellen.

train.py


import sys
import os
import numpy as np
import pandas as pd
import gc
from keras.models import Sequential
from keras.layers import Convolution2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.utils import np_utils

#
#Modell generieren
#
class TrainModel : 
  def __init__(self):
    input_dir = 'images'
    self.nb_classes = len([name for name in os.listdir(input_dir) if name != ".DS_Store"])
    x_train, x_test, y_train, y_test = np.load("./npy/flower.npy")
    #Normalisieren Sie die Daten
    self.x_train = x_train.astype("float") / 256
    self.x_test = x_test.astype("float") / 256
    self.y_train = np_utils.to_categorical(y_train, self.nb_classes)
    self.y_test = np_utils.to_categorical(y_test, self.nb_classes)

  def train(self, input=None) :
    model = Sequential()
    # K=32, M=3, H=3
    if input == None :
      model.add(Convolution2D(32, 3, 3, border_mode='same', input_shape=self.x_train.shape[1:]))
    else :
      model.add(Convolution2D(32, 3, 3, border_mode='same', input_shape=input))

    # K=64, M=3, H=3 (Einstellung)
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    model.add(Convolution2D(64, 3, 3, border_mode='same'))
    model.add(Activation('relu'))
    # K=64, M=3, H=3 (Einstellung)
    model.add(Convolution2D(64, 3, 3))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    model.add(Flatten()) 
    model.add(Dense(512))
    # biases  nb_classes
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    model.add(Dense(self.nb_classes))
    model.add(Activation('softmax'))

    model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
    if input == None :
      #Lernen und speichern Sie das Modell
      model.fit(self.x_train, self.y_train, batch_size=32, nb_epoch=10)
      hdf5_file = "./model/flower-model.hdf5"
      model.save_weights(hdf5_file)

      #Modelltest
      score = model.evaluate(self.x_test, self.y_test)
      print('loss=', score[0])
      print('accuracy=', score[1])
    return model

if __name__ == "__main__":
  args = sys.argv
  train = TrainModel()
  train.train()
  gc.collect()

Das Lernen ist jetzt abgeschlossen.

Versuchen Sie es dann.

#Bilder anordnen
$ python data_create.py
---Ai (Tadeai)
---Aogiri
---Aomoria Zami (Okino Zami)
---Agapanthus (Murasakikunsilane)
---Akaza
---Akashouma
---Akabana Buchweizen
---Akabana Mitsumata
---Akaya Jio
---Akanthus(Haazami)
---Aginashi
---Akizaki Schneeflocke
---Akino Unagitsukami
---Akino Tamurasou (Salvia Japonica)
---Akinonogeshi
---Akinowasu Regusa
   :
   :

#Lernen
$ python train.py 
  :
loss= 0.0410282239616
accuracy= 0.992773946126

Die Trefferquote von 99% ist fehlerhaft (lacht)

③ Modellversuch vorerst

Bereiten Sie ein einfaches Programm für die Modellprüfung vor.

check.py


import train as train
import sys, os
from PIL import Image
import numpy as np
import pandas as pd

if len(sys.argv) <= 1:
  quit()

image_size = 50
input_dir = 'images'
categories = [name for name in os.listdir(input_dir) if name != ".DS_Store"]

X = []
for file_name in sys.argv[1:]:
  img = Image.open(file_name)
  img = img.convert("RGB")
  img = img.resize((image_size, image_size))
  in_data = np.asarray(img)
  X.append(in_data)

X = np.array(X)

model = train.TrainModel().train(X.shape[1:])
model.load_weights("./model/flower-model.hdf5")

predict = model.predict(X)

for pre in predict:
  y = pre.argmax()
  print("Blumenname: ", categories[y])

Testlauf

Getestet mit Gurkenblüten.

flower.jpg

$ python check.py test/flower.jpg
Using TensorFlow backend.
Blumenname:Gurke

Gurke ist erfolgreich! Aber es gab Zeiten, in denen andere Fotos nicht funktionierten. Ich werde ein bisschen mehr lernen und es wieder geben.

Schließlich

Ich werde Ihnen auch geben, wie Sie einen Chat-Bot mit Lernen erstellen, wenn Sie Zeit haben.

Recommended Posts

Identifizieren Sie den Namen aus dem Blumenbild mit Keras (Tensorfluss)
Fordern Sie die Bildklassifizierung mit TensorFlow2 + Keras CNN 1 heraus ~ Bewegen Sie sich vorerst ~
Bilderkennung mit Keras
Fordern Sie die Bildklassifizierung mit TensorFlow2 + Keras 3 heraus ~ Visualisieren Sie MNIST-Daten ~
Entfernen Sie den Rahmen aus dem Bild
Bilderkennung mit Keras + OpenCV
2020/02 Python 3.7 + TensorFlow 2.1 + Keras 2.3.1 + YOLOv3 Objekterkennung mit der neuesten Version
MNIST (DCNN) mit Keras (TensorFlow-Backend)
Fordern Sie die Bildklassifizierung mit TensorFlow2 + Keras 4 heraus. ~ Lassen Sie uns mit dem trainierten Modell ~ vorhersagen
Fordern Sie die Bildklassifizierung durch TensorFlow2 + Keras 1-Move vorerst heraus.
[TensorFlow] [Keras] Aufbau eines neuronalen Netzwerks mit Keras
Fordern Sie die Bildklassifizierung mit TensorFlow2 + Keras 9 heraus. Lernen, Speichern und Laden von Modellen
Das Geschlecht wird aus dem Namen bestimmt.
Schneiden wir das Gesicht aus dem Bild
Versuchen Sie, das Bild mit opencv2 zu verwischen
[TensorFlow / Keras] Der Weg zum Zusammenstellen eines RNN Ihrer Lieblingsstruktur
Bildanzeige mit dem eingebauten ISIGHT
Vergleichen Sie rohen TensorFlow mit tf.contrib.learn und Keras
Führen Sie Keras mit CNTK-Backend unter CentOS aus
Bildaufnahme von der Kamera mit Python + OpenCV
Klicken Sie mit der rechten Maustaste auf das Bild → Realisieren Sie "Mit TinyPNG komprimieren"
Ich habe versucht, mit Pillow mit dem Bild zu spielen
Verstehen Sie die Bilder verschiedener Matrixoperationen, die in Keras (Tensorflow) verwendet werden, anhand von Beispielen
Flächenextraktionsmethode mit dem Zellautomaten Versuchen Sie die Flächenextraktion aus dem Bild mit Growcut (Python).
[Python] Ich habe die gleiche Berechnung versucht wie die Vorhersage von LSTM von Grund auf [Keras]
Versuchen Sie, das Fizzbuzz-Problem mit Keras zu lösen
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Schneiden Sie das Bild mit Pythonista auf abgerundete Ecken
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
(Hinweis) Importieren von Excel mit demselben Spaltennamen
Bildverarbeitung von Grund auf mit Python (5) Fourier-Transformation
Laden Sie Bilder aus einer Textdatei herunter, die die URL enthält
Belichtung des DCGAN-Modells für Cifar 10 mit Keras
Bestimmen Sie die Zahlen in dem mit der Webkamera aufgenommenen Bild
Bildverarbeitung von Grund auf mit Python (4) Konturextraktion
Erkennen Sie Ordner mit demselben Bild in ImageHash
Schreiben Sie den Namen des Tags mit dem Namespace in lxml neu
Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
Laden Sie die TensorFlow-Modelldatei .pb mit readNetFromTensorflow ().
Berechnen Sie den Winkel zwischen n-dimensionalen Vektoren mit TensorFlow
Zeigen Sie das Bild nach der Datenerweiterung mit Pytorch an
Fordern Sie die Bildklassifizierung mit TensorFlow2 + Keras heraus. 6-Versuchen Sie, die von Ihnen erstellten Bilder vorzuverarbeiten und zu klassifizieren.