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
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
cpu : intel corei7 8th Gen gpu : NVIDIA GeForce RTX 1080ti os : ubuntu 20.04
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. __ __
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! Dies ist ein Bild von hoher Qualität. (Das Originalbild) Dies ist ein Bild von geringer Qualität mit einem Gaußschen Filter. Dies ist das vom Modell erzeugte Bild. Es wird hübsch. War der psnr-Wert ungefähr 34?
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