[PYTHON] Ich habe versucht, eine Super-Resolution-Methode / SRCNN build zu erstellen

Überblick

Fortsetzung der vorherigen Sitzung. Dies ist Teil 3, der letzte Artikel. Letztes Mal: Ich habe versucht, eine Superauflösungsmethode / SRCNN build zu erstellen Letztes Mal: Ich habe versucht, eine Superauflösungsmethode / SRCNN② zu erstellen

Inhaltsverzeichnis

  1. Zuallererst
  2. PC-Umgebung
  3. Codebeschreibung
  4. Am Ende

1. Zuallererst

Super-Resolution ist eine Technologie, die die Auflösung von Bildern mit niedriger Auflösung und bewegten Bildern verbessert. SRCNN verwendet Deep Learning, um Ergebnisse mit höherer Genauigkeit als herkömmliche Methoden zu messen. Es ist die Methode, die gemacht wurde. (Drittes Mal)

Der vollständige Code ist auch auf GitHub veröffentlicht. Überprüfen Sie ihn daher dort. https://github.com/morisumori/srcnn_keras

2. PC-Umgebung

cpu : intel corei7 8th Gen gpu : NVIDIA GeForce RTX 1080ti os : ubuntu 20.04

3. Codebeschreibung

Wie Sie aus GitHub sehen können, besteht es hauptsächlich aus drei Codes. ・ Datacreate.py → Programm zur Datensatzgenerierung ・ Model.py → SRCNN-Programm ・ Main.py → Ausführungsprogramm Ich habe eine Funktion mit datacreate.py und model.py erstellt und mit main.py ausgeführt.

__ Dieses Mal werde ich main.py erklären. __ __

Beschreibung von model.py

model.py



import model
import data_create
import argparse
import os
import cv2

import numpy as np
import tensorflow as tf

if __name__ == "__main__":
    
    def psnr(y_true, y_pred):
        return tf.image.psnr(y_true, y_pred, 1, name=None)

    train_height = 33
    train_width = 33
    test_height = 700
    test_width = 700

    mag = 3.0
    cut_traindata_num = 10
    cut_testdata_num = 1

    train_file_path = "./train_data"
    test_file_path = "./test_data"

    BATSH_SIZE = 240
    EPOCHS = 1000
    opt = tf.keras.optimizers.Adam(learning_rate=0.0001)

    parser = argparse.ArgumentParser()
    parser.add_argument('--mode', type=str, default='srcnn', help='srcnn, evaluate')

    args = parser.parse_args()

    if args.mode == "srcnn":
        train_x, train_y = data_create.save_frame(train_file_path,   #Pfad der Datei mit dem zu beschneidenden Bild
                                                cut_traindata_num,  #Anzahl der generierten Datensätze
                                                train_height, #Speichergröße
                                                train_width,
                                                mag)   #Vergrößerung
                                                
        model = model.SRCNN() 
        model.compile(loss = "mean_squared_error",
                        optimizer = opt,
                        metrics = [psnr])
#https://keras.io/ja/getting-started/faq/
        model.fit(train_x,
                    train_y,
                    epochs = EPOCHS)

        model.save("srcnn_model.h5")

    elif args.mode == "evaluate":
        path = "srcnn_model"
        exp = ".h5"
        new_model = tf.keras.models.load_model(path + exp, custom_objects={'psnr':psnr})

        new_model.summary()

        test_x, test_y = data_create.save_frame(test_file_path,   #Pfad der Datei mit dem zu beschneidenden Bild
                                                cut_testdata_num,  #Anzahl der generierten Datensätze
                                                test_height, #Speichergröße
                                                test_width,
                                                mag)   #Vergrößerung

        pred = new_model.predict(test_x)
        path = "resurt_" + path
        os.makedirs(path, exist_ok = True)
        path = path + "/"

        ps = psnr(tf.reshape(test_y[0], [test_height, test_width, 1]), pred[0])
        print("psnr:{}".format(ps))

        before_res = tf.keras.preprocessing.image.array_to_img(tf.reshape(test_x[0], [test_height, test_width, 1]))
        change_res = tf.keras.preprocessing.image.array_to_img(tf.reshape(test_y[0], [test_height, test_width, 1]))
        y_pred = tf.keras.preprocessing.image.array_to_img(pred[0])

        before_res.save(path + "low_" + str(0) + ".jpg ")
        change_res.save(path + "high_" + str(0) + ".jpg ")
        y_pred.save(path + "pred_" + str(0) + ".jpg ")

    else:
        raise Exception("Unknow --mode")

Die Hauptleitung ist ziemlich lang, aber ich habe den Eindruck, dass ich mehr tun kann, wenn ich sie verkürzen kann. Im Folgenden werde ich den Inhalt erklären.

import model
import data_create
import argparse
import os
import cv2

import numpy as np
import tensorflow as tf

Hier laden wir eine Funktion oder eine andere Datei in dasselbe Verzeichnis. datacreate.py, model.py und main.py sollten sich im selben Verzeichnis befinden.

    def psnr(y_true, y_pred):
        return tf.image.psnr(y_true, y_pred, 1, name=None)

Dieses Mal habe ich psnr als Kriterium für die Beurteilung der Qualität des generierten Bildes verwendet, das ist also die Definition. psnr wird als Spitzensignal-Rausch-Verhältnis bezeichnet und ist in einfachen Worten wie die Berechnung der Differenz zwischen den Pixelwerten der Bilder, die Sie vergleichen möchten. Ich werde hier nicht im Detail erklären, aber dieser Artikel ist ziemlich detailliert und es werden mehrere Bewertungsmethoden beschrieben.

    train_height = 33 #Größe der Zugdaten
    train_width = 33
    test_height = 700 #Testdatengröße
    test_width = 700

    mag = 3.0 #Ich benutze es nicht, aber ich habe es in die Funktion aufgenommen.
    cut_traindata_num = 10 #Wie viele Datenblätter werden bei der Zugdatengenerierung aus einem Foto generiert?
    cut_testdata_num = 1 #Wie viele Datenblätter werden bei der Testdatengenerierung aus einem Foto generiert?

    train_file_path = "./train_data" #Pfad der Datei mit dem zu beschneidenden Bild
    test_file_path = "./test_data"

    BATSH_SIZE = 240 #batchsize
    EPOCHS = 1000 #Epochennummer
    opt = tf.keras.optimizers.Adam(learning_rate=0.0001) #optimizer

Hier wird der diesmal verwendete Wert eingestellt. Wenn Sie sich github ansehen, ist es in Ordnung, wenn Sie eine separate config.py haben. Da es sich jedoch nicht um ein umfangreiches Programm handelt, wird es zusammengefasst.

In Bezug auf die Größe der Trainingsdaten wurden die Zugdaten übernommen, da in dem Papier angegeben wurde, dass es sich um 33 * 33 handelte. Der Test ist zur einfachen Anzeige nur übergroß. Die Anzahl der Daten beträgt das Zehnfache der Anzahl der in der Datei enthaltenen Bilder. (Bei 800 Blatt beträgt die Anzahl der Daten 8.000)

Dieses Mal habe ich DIV2K Dataset verwendet, das häufig für die Superauflösung verwendet wird. Da die Qualität der Daten gut ist, wird gesagt, dass mit einer kleinen Datenmenge eine gewisse Genauigkeit erzielt werden kann.

    parser = argparse.ArgumentParser()
    parser.add_argument('--mode', type=str, default='srcnn', help='srcnn, evaluate')

    args = parser.parse_args()

Ich wollte das Lernen und die Bewertung des Modells hier trennen, also habe ich es so gemacht, damit ich es mit --mode auswählen kann. Ich werde nicht im Detail erklären, also werde ich die offizielle Python-Dokumentation veröffentlichen. https://docs.python.org/ja/3/library/argparse.html

if args.mode == "srcnn":
        train_x, train_y = data_create.save_frame(train_file_path,   #Pfad der Datei mit dem zu beschneidenden Bild
                                                cut_traindata_num,  #Anzahl der generierten Datensätze
                                                train_height, #Speichergröße
                                                train_width,
                                                mag)   #Vergrößerung
                                                
        model = model.SRCNN() 
        model.compile(loss = "mean_squared_error",
                        optimizer = opt,
                        metrics = [psnr])
#https://keras.io/ja/getting-started/faq/
        model.fit(train_x,
                    train_y,
                    epochs = EPOCHS)

        model.save("srcnn_model.h5")

Ich lerne hier. Wenn Sie srcnn auswählen (die Methode wird später beschrieben), funktioniert dieses Programm.

In data_create.save_frame wird die Funktion save_frame von data_create.py gelesen und verfügbar gemacht. Nachdem sich die Daten in train_x und train_y befinden, laden Sie das Modell auf die gleiche Weise und kompilieren und passen Sie es an.

Weitere Informationen zum Kompilieren und mehr finden Sie unter Keras-Dokumentation. Wir verwenden die gleichen wie die Papiere.

Speichern Sie schließlich das Modell und Sie sind fertig.

elif args.mode == "evaluate":
        path = "srcnn_model"
        exp = ".h5"
        new_model = tf.keras.models.load_model(path + exp, custom_objects={'psnr':psnr})

        new_model.summary()

        test_x, test_y = data_create.save_frame(test_file_path,   #Pfad der Datei mit dem zu beschneidenden Bild
                                                cut_testdata_num,  #Anzahl der generierten Datensätze
                                                test_height, #Speichergröße
                                                test_width,
                                                mag)   #Vergrößerung

        pred = new_model.predict(test_x)
        path = "resurt_" + path
        os.makedirs(path, exist_ok = True)
        path = path + "/"

        ps = psnr(tf.reshape(test_y[0], [test_height, test_width, 1]), pred[0])
        print("psnr:{}".format(ps))

        before_res = tf.keras.preprocessing.image.array_to_img(tf.reshape(test_x[0], [test_height, test_width, 1]))
        change_res = tf.keras.preprocessing.image.array_to_img(tf.reshape(test_y[0], [test_height, test_width, 1]))
        y_pred = tf.keras.preprocessing.image.array_to_img(pred[0])

        before_res.save(path + "low_" + str(0) + ".jpg ")
        change_res.save(path + "high_" + str(0) + ".jpg ")
        y_pred.save(path + "pred_" + str(0) + ".jpg ")

    else:
        raise Exception("Unknow --mode")

Es ist endlich die Erklärung des Letzten. Laden Sie zunächst das zuvor gespeicherte Modell, damit Sie psnr verwenden können. Generieren Sie als Nächstes einen Datensatz zum Testen und ein Bild mit Vorhersage.

Ich wollte den psnr-Wert vor Ort wissen, also habe ich ihn berechnet. Ich wollte das Bild speichern, also habe ich es vom Tensor in ein Numpy-Array konvertiert, es gespeichert und schließlich war es fertig! high_0.jpg Dies ist ein Bild von hoher Qualität. (Das Originalbild) low_0.jpg Dies ist ein Bild von geringer Qualität mit einem Gaußschen Filter. pred_0.jpg Dies ist das vom Modell erzeugte Bild. Es wird hübsch. War der psnr-Wert ungefähr 34?

4. Am Ende

Es ist lange her, dass ich es in drei Artikel unterteilt habe, aber danke fürs Lesen. Ich werde auch in Zukunft an verschiedenen Dingen arbeiten. Wenn Sie Fragen oder Kommentare haben, zögern Sie bitte nicht, uns zu kontaktieren!

Recommended Posts

Ich habe versucht, eine Super-Resolution-Methode / SRCNN build zu erstellen
Ich habe versucht, eine Super-Resolution-Methode / SRCNN build zu erstellen
Ich habe versucht, eine Super-Resolution-Methode / SRCNN build zu erstellen
Ich habe versucht, eine Super-Resolution-Methode / ESPCN zu erstellen
[Go + Gin] Ich habe versucht, eine Docker-Umgebung zu erstellen
Ich habe versucht "Wie man eine Methode in Python dekoriert"
Ich habe versucht, einen Linebot zu erstellen (Implementierung)
Ich habe versucht, einen Linebot zu erstellen (Vorbereitung)
Ich möchte eine Python-Umgebung erstellen
Ich habe eine Web-API erstellt
Ich habe versucht zu debuggen.
Ich habe versucht, eine Mac Python-Entwicklungsumgebung mit pythonz + direnv zu erstellen
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
Ich habe versucht, einen "verdammt großen Literaturkonverter" zu machen.
Ich habe versucht, einen Pseudo-Pachislot in Python zu implementieren
Ich möchte einfach eine modellbasierte Entwicklungsumgebung erstellen
Ich habe versucht, eine ML-Pipeline mit Cloud Composer zu erstellen
CTF-Anfänger haben versucht, einen Problemserver (Web) zu erstellen [Problem]
Ich habe versucht, die Methode zur Mittelung der Dollarkosten zu simulieren
Ich habe CPython eine Funktion hinzugefügt (Build & Structure Grasp)
Ich habe versucht, ein Konfigurationsdiagramm mit Diagrammen zu zeichnen
Ich habe versucht, PredNet zu lernen
Ich habe versucht, SVM zu organisieren.
Ich habe versucht, PCANet zu implementieren
Ich habe versucht, Linux wieder einzuführen
Ich habe versucht, Pylint vorzustellen
Ich habe versucht, SparseMatrix zusammenzufassen
jupyter ich habe es berührt
Ich habe versucht, StarGAN (1) zu implementieren.
Ich habe versucht, eine Umgebung mit WSL + Ubuntu + VS-Code in einer Windows-Umgebung zu erstellen
Ich habe versucht, eine Klasse für die Suche nach Dateien mit der Glob-Methode von Python in VBA zu erstellen
Ich habe versucht, das grundlegende Modell des wiederkehrenden neuronalen Netzwerks zu implementieren
Ich habe den Super-Resolution-Algorithmus "PULSE" in einer Windows-Umgebung ausprobiert
Ich habe versucht, einen eindimensionalen Zellautomaten in Python zu implementieren
Ich habe versucht, automatisch einen Bericht mit der Markov-Kette zu erstellen
[Markov-Kette] Ich habe versucht, die Zitate in Python einzulesen.
Ich habe versucht, mit Hy ・ Define a class zu beginnen
Ich habe versucht, [eine bestimmte Aufgabe] mit einem Raspeltorte zu automatisieren
Ich bin gestolpert, als ich versucht habe, Basemap zu installieren, also ein Memorandum
Ich habe versucht, eine zufällige FizzBuzz-Spalte mit Blasensortierung zu sortieren.
Ich habe versucht, einen Bot für die Ankündigung eines Wiire-Ereignisses zu erstellen
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Ich habe versucht, in einem tief erlernten Sprachmodell zu schreiben
Ich habe mit PyQt einen einfachen Texteditor erstellt
Ich habe versucht, mit Docker einen Dienst aufzubauen, der maschinell erlernte Daten mit explosiver Geschwindigkeit verkauft
Ich habe versucht, Deep VQE zu implementieren
Ich habe versucht, eine Quip-API zu erstellen
Ich habe versucht, Python zu berühren (Installation)
Ich habe versucht, eine kontroverse Validierung zu implementieren
Ich habe versucht, Pytorchs Datensatz zu erklären
Ich habe Watson Voice Authentication (Speech to Text) ausprobiert.
Ich habe Teslas API berührt
Ich habe versucht, mich über MCMC zu organisieren.
Ich habe versucht, Realness GAN zu implementieren
Ich habe versucht, den Ball zu bewegen