[PYTHON] J'ai essayé d'utiliser l'apprentissage en profondeur pour extraire la partie où la plante est montrée de la photo de la véranda, mais cela n'a pas fonctionné, je vais donc résumer le contenu des essais et erreurs. Partie 2

Dernier synopsis

Un stock qui a commencé avec un petit effort. Cependant, je n'ai jamais imaginé qu'une nouvelle infection à coronavirus prévaudrait, et j'ai probablement échoué à faire un investissement sans omission, et les économies que j'avais économisées jusqu'à présent pour acheter ma maison sont devenues complètement vides, et je suis devenu désespéré et désespéré. Quand je marchais le long du pont du lac, on m'a demandé par derrière: "Ça fait un moment. Comment vas-tu?!" ...

... c'est une blague, et je continue l'article sur le thème de l'extraction d'objets à partir de photos!

J'ai essayé d'utiliser l'apprentissage profond pour extraire la partie où la plante est montrée de la photo de la véranda, mais cela n'a pas fonctionné, donc je vais résumer le contenu des essais et erreurs. Partie 1

Considération

Après la première partie, même si je change certains paramètres, cela n'a aucun effet, et seul le temps vide s'écoule ...

Pendant ce temps, j'ai soudainement imaginé «l'apprentissage par transfert». C'est une méthode pour réaliser une identification très précise à partir d'une petite quantité de données en utilisant la sortie du modèle entraîné ...

Je ne sais pas du tout comment le faire, mais pour le moment, j'ai décidé de l'essayer avec mes connaissances!

Apprentissage

Lisez les mêmes données que la première partie, laissez le modèle entraîné l'identifier et laissez le réseau neuronal entraîner le résultat comme entrée.

python


from glob import glob
import random

X = []
y = []

dirs = ["9*/*.jpg ", "0*/*.jpg "]

i = 0
min = 1500

for d in dirs:
    files = glob(d)
    files = random.sample(files, min if len(files) > min else len(files))
    
    for f in files:
        X.append(f)
        y.append(i)

    i += 1
    
import pandas as pd

df = pd.DataFrame({"X" : X, "y" : y})

from keras.applications.vgg16 import VGG16, preprocess_input, decode_predictions

#Obtenez un modèle formé de VGG16
model_VGG16 = VGG16()

import cv2
import numpy as np
from keras.preprocessing import image

X = []
y = []

cnt = 0

for idx in df.index:

    f = df.loc[idx, "X"]
    l = df.loc[idx, "y"]

    print("\r{:05} : [{}] {}".format(cnt, l, f), end="")
    i += 1

    #Chargement des images
    img = image.load_img(f, target_size=model_VGG16.input_shape[1:3])

    X.append(image.img_to_array(img))
    y.append(l)

    cnt += 1

print()

#Prétraitement
X = np.array(X)
X = preprocess_input(X)

#Identification par VGG16
preds = model_VGG16.predict(X)
print('preds.shape: {}'.format(preds.shape))  # preds.shape: (1, 1000)

#Définir le résultat de l'identification comme entrée
X = preds

from sklearn import model_selection

test_size = 0.2

#Split pour l'apprentissage, la validation et les tests
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=test_size, random_state=42)
X_valid, X_test, y_valid, y_test = model_selection.train_test_split(X_test, y_test, test_size=.5, random_state=42)

from keras.utils.np_utils import to_categorical

y_train = to_categorical(y_train)
y_valid = to_categorical(y_valid)
y_test = to_categorical(y_test)

from keras.layers import Dense
from keras.models import Sequential

#Créer un modèle d'apprentissage
model = Sequential()

model.add(Dense(64, input_dim=len(X_train[0]), activation='relu'))
model.add(Dense(64, activation='sigmoid'))

model.add(Dense(len(y_train[0]), activation='softmax'))

#compiler
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

#Apprentissage
history = model.fit(
    X_train, y_train, batch_size=25, epochs=60, 
    verbose=1, shuffle=True,
    validation_data=(X_valid, y_valid))

import matplotlib.pyplot as plt

#Évaluation et affichage du système de généralisation
score = model.evaluate(X_test, y_test, batch_size=32, verbose=0)
print('validation loss:{0[0]}\nvalidation accuracy:{0[1]}'.format(score))

#acc, val_tracé acc
plt.plot(history.history["accuracy"], label="acc", ls="-", marker="o")
plt.plot(history.history["val_accuracy"], label="val_acc", ls="-", marker="x")
plt.ylabel("accuracy")
plt.xlabel("epoch")
plt.legend(loc="best")
plt.show()

#loss, val_tracé des pertes
plt.plot(history.history["loss"], label="loss", ls="-", marker="o")
plt.plot(history.history["val_loss"], label="val_loss", ls="-", marker="x")
plt.ylabel("loss")
plt.xlabel("epoch")
plt.legend(loc="best")
plt.show()

Courir! !!

validation loss:0.0818712607031756
validation accuracy:0.9797570705413818

Unknown1.pngUnknown2.png

Oh! Qu'est-ce que c'est ça? !!

Identification et marquage

python


import cv2
import numpy as np

div = 10
cl = (0, 0, 255)

i = 0

#Obtenez une liste d'images de test
testFiles = glob("test/*.JPG")
testFiles.sort()

for f in testFiles:

    print(f.split("/")[-1])

    #Lire le fichier
    img = cv2.imread(f)
    img_output = cv2.imread(f)
    #print(img.shape)

    h, w, c = img.shape
    print(f, h, w, c)

    #Obtenez le côté court et définissez la taille de division
    size = h if h < w else w
    size = int(size / 10)
    print(size)

    i = 0
    k = 0

    while size * (i + 1) < h:
        j = 0
        while size * (j + 1) < w:

            #Obtenir une image fractionnée
            img_x = img[size*i:size*(i+1), size*j:size*(j+1)]
            
            #Identification par VGG16
            img_test = cv2.resize(img_x, model_VGG16.input_shape[1:3])
            img_test = cv2.cvtColor(img_test, cv2.COLOR_BGR2RGB)
            X = np.array([img_test])
            X = preprocess_input(X)
            preds = model_VGG16.predict(X)

            #identification
            pred = model.predict(preds, batch_size=32)
            m = np.argmax(pred[0])

            #La précision est 85%Lorsqu'il est identifié comme une plante
            if pred[0][m] > 0.85 and m == 1:
                #Dessinez un carré rouge où il est identifié comme une plante
                cv2.rectangle(img_output, (size*j + 5, size*i + 5), (size*(j+1) - 5, size*(i+1) - 5), cl, thickness=2)

            j += 1
            k += 1

        i += 1
    
    img_output = img_output[0:size*i, 0:size*j]

    f_new = "predicted/{}".format(f.split("/")[-1])
    cv2.imwrite(f_new, img_output)

    print()

Courir! !!

IMG_0791.JPG IMG_0805.JPG IMG_0826_転移学習_EPOC100.JPG

Parfait! !!

L'apprentissage par transfert est incroyable! ... peut être différent de l'apprentissage par transfert au sens original. Transpiration

Au fait, je ne l'ai pas marqué à la main. Lol

Eh bien, que ferons-nous ensuite?

Recommended Posts

J'ai essayé d'utiliser l'apprentissage en profondeur pour extraire la partie où la plante est montrée de la photo de la véranda, mais cela n'a pas fonctionné, je vais donc résumer le contenu des essais et erreurs. Partie 2
Je n'ai pas compris le redimensionnement de TensorFlow, alors je l'ai résumé visuellement.
L'arbre.plot_tree de scikit-learn était très simple et pratique, j'ai donc essayé de résumer comment l'utiliser facilement.
Je n'ai pas compris le comportement d'argsort de numpy, donc je vais le résumer
J'ai essayé d'utiliser Java avec Termux en utilisant Termux Arch, mais cela n'a pas fonctionné
J'ai essayé d'utiliser Twitter Scraper avec AWS Lambda et cela n'a pas fonctionné.
[Partie 4] Utilisez le Deep Learning pour prévoir la météo à partir d'images météorologiques
[Partie 1] Utilisez le Deep Learning pour prévoir la météo à partir d'images météorologiques
[Partie 3] Utilisez le Deep Learning pour prévoir la météo à partir d'images météorologiques
[Partie 2] Utilisez le Deep Learning pour prévoir la météo à partir d'images météorologiques
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
J'ai essayé d'implémenter Perceptron Part 1 [Deep Learning from scratch]
[API Qiita] [Statistiques • Apprentissage automatique] J'ai essayé de résumer et d'analyser les articles publiés jusqu'à présent.
[Deep Learning from scratch] J'ai essayé d'implémenter la couche sigmoïde et la couche Relu
J'ai installé PySide2, mais pyside2-uic ne fonctionnait pas, alors j'ai réussi à le faire.
J'ai essayé d'installer Docker sur Windows10 Home mais cela n'a pas fonctionné
J'ai essayé d'extraire et d'illustrer l'étape de l'histoire à l'aide de COTOHA
J'ai essayé l'histoire courante de l'utilisation du Deep Learning pour prédire la moyenne Nikkei
Je voulais utiliser le module de recherche d'Ansible2, mais cela a pris du temps, alors prenez note
Utilisez Pillow pour rendre l'image transparente et en superposer une partie seulement
J'ai essayé d'extraire le dessin au trait de l'image avec Deep Learning
Docker x Visualization ne fonctionnait pas et j'en étais accro, alors je l'ai résumé!
J'ai essayé de classer Hanana Oba et Emiri Otani par apprentissage profond (partie 2)
J'ai fait de mon mieux pour créer une fonction d'optimisation, mais cela n'a pas fonctionné.
Déterminez s'il s'agit de mon enfant à partir de l'image du chien Shiba par apprentissage profond (4) Visualisation par Grad-CAM et Grad-CAM guidé