Fortsetzung von Letztes Mal ist dies die Vorhersagephase von SRCNN. Eigentlich habe ich versucht, den Code zu erklären, aber ich habe ihn nicht so oft erklärt. .. .. Diesmal werde ich also die Erklärung des Codes weglassen. Es endet, nachdem das Ergebnis der Superauflösung angezeigt wurde. .. ..
Nachdem Sie in den Kommentaren Ratschläge erhalten und den Code teilweise geändert haben [Achtung (gelöst)](https://qiita.com/hima_zin331/items/ebb6046a2a8d860254e1#%E6%B3%A8%E6%84%8F%E8 % A7% A3% E6% B1% BA% E6% B8% 88% E3% 81% BF) wurde behoben. Das Bild des Ausführungsergebnisses wurde ebenfalls ersetzt. Ebenso wurden die Programme im Github-Repository überarbeitet.
-Software- Windows 10 Home Anaconda3 64-bit(Python3.7) Spyder -Library- Tensorflow 2.1.0 opencv-python 4.1.2.30 -Hardware- CPU: Intel core i9 9900K GPU: NVIDIA GeForce RTX2080ti RAM: 16GB 3200MHz
Ich werde es auf Github posten. https://github.com/himazin331/Super-resolution-CNN Das Repository enthält eine Lernphase, eine Vorhersagephase und einen Datensatz (General-100).
Ich werde nur den Quellcode setzen. ** Bitte beachten Sie, dass der Code verschmutzt ist ... **
srcnn_pre.py
import argparse as arg
import os
import sys
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' #TF-Nachricht ausblenden
import tensorflow as tf
import tensorflow.keras.layers as kl
import cv2
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
# SRCNN
class SRCNN(tf.keras.Model):
def __init__(self, h, w):
super(SRCNN, self).__init__()
self.conv1 = kl.Conv2D(64, 3, padding='same', activation='relu', input_shape=(None, h, w, 3))
self.conv2 = kl.Conv2D(32, 3, padding='same', activation='relu')
self.conv3 = kl.Conv2D(3, 3, padding='same', activation='relu')
def call(self, x):
h1 = self.conv1(x)
h2 = self.conv2(h1)
h3 = self.conv3(h2)
return h3
def main():
#Erstellen Sie Befehlszeilenoptionen
parser = arg.ArgumentParser(description='Super-resolution CNN prediction')
parser.add_argument('--param', '-p', type=str, default=None,
help='Gelernte Parameter angeben(Fehler, wenn nicht angegeben)')
parser.add_argument('--data_img', '-d', type=str, default=None,
help='Angeben einer Bilddatei(Fehler, wenn nicht angegeben)')
parser.add_argument('--out', '-o', type=str, default=os.path.join(os.path.dirname(os.path.abspath(__file__)), "result"),
help='Geben Sie das Speicherziel an(Standardwert=./result)')
parser.add_argument('--he', '-he', type=int, default=256,
help='Ändern Sie die Größenangabe(Standardwert=256)')
parser.add_argument('--wi', '-wi', type=int, default=256,
help='Geben Sie die Größenänderung an(Standardwert=256)')
parser.add_argument('--mag', '-m', type=int, default=2,
help='Angabe des Untersetzungsverhältnisses(Standardwert=2)')
args = parser.parse_args()
#Wenn keine Parameterdatei angegeben ist->Ausnahme
if args.param == None:
print("\nException: Trained Parameter-File not specified.\n")
sys.exit()
#Wenn eine nicht vorhandene Parameterdatei angegeben wird->Ausnahme
if os.path.exists(args.param) != True:
print("\nException: Trained Parameter-File {} is not found.\n".format(args.param))
sys.exit()
#Wenn keine Bilddatei angegeben ist->Ausnahme
if args.data_img == None:
print("\nException: Image not specified.\n")
sys.exit()
#Wenn eine nicht vorhandene Bilddatei angegeben wird->Ausnahme
if os.path.exists(args.data_img) != True:
print("\nException: Image {} is not found.\n".format(args.data_img))
sys.exit()
#Wenn 0 entweder in der Breitenhöhe oder in der Verkleinerungsvergrößerung eingegeben wird->Ausnahme
if args.he == 0 or args.wi == 0 or args.mag == 0:
print("\nException: Invalid value has been entered.\n")
sys.exit()
#Informationsausgabe einstellen
print("=== Setting information ===")
print("# Trained Prameter-File: {}".format(os.path.abspath(args.param)))
print("# Image: {}".format(args.data_img))
print("# Output folder: {}".format(args.out))
print("")
print("# Height: {}".format(args.he))
print("# Width: {}".format(args.wi))
print("# Magnification: {}".format(args.mag))
print("===========================")
#Ausgabeordner erstellen(Nicht erstellen, wenn der Ordner vorhanden ist)
os.makedirs(args.out, exist_ok=True)
#Modellbau
model = SRCNN(args.he, args.wi)
model.build((None, args.he, args.wi, 3))
model.load_weights(args.param)
#Eingabebildverarbeitung(Hochauflösendes Bild)
img = cv2.imread(args.data_img)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
hr_img = cv2.resize(img, (args.he, args.wi))
#Bilderzeugung mit niedriger Auflösung
lr_img = cv2.resize(hr_img, (int(args.he/args.mag), int(args.wi/args.mag)))
lr_img = cv2.resize(lr_img, (args.he, args.wi))
lr_img_s = lr_img
#Normalisierung
lr_img = tf.convert_to_tensor(lr_img, np.float32)
lr_img /= 255.0
lr_img = lr_img[np.newaxis, :, :, :]
#Super Auflösung
re = model.predict(lr_img)
#Datenverarbeitung
re = np.reshape(re, (args.he, args.wi, 3))
re *= 255
re = np.clip(re, 0.0, 255.0) #Ausschnitt(0~Runde auf 255)
#Bildspeicher mit niedriger Auflösung
lr_img = Image.fromarray(np.uint8(lr_img_s))
lr_img.show()
lr_img.save(os.path.join(args.out, "Low-resolution Image(SRCNN).bmp"))
#Bildspeicher mit hoher Auflösung
sr_img = Image.fromarray(np.uint8(re))
sr_img.show()
sr_img.save(os.path.join(args.out, "Super-resolution Image(SRCNN).bmp"))
#Hochauflösender Bildspeicher
hr_img = Image.fromarray(np.uint8(hr_img))
hr_img.show()
hr_img.save(os.path.join(args.out, "High-resolution Image(SRCNN).bmp"))
if __name__ == "__main__":
main()
Im Code
re *= 240 #Wenn es 255 ist, ist die Ausgabe abnormal.
Es gibt einen solchen Prozess.
re
ist das Ergebnis von model.predict ()
, dh einem hochauflösenden Bild. Andererseits denke ich, dass die richtige Antwort darin besteht, den Pixelwert von 0 auf 1 mit 255 zu multiplizieren und auf 0 bis 255 zu ändern. Wenn Sie jedoch mit 255 multiplizieren, werden die Farbinformationen verfälscht (?) Wie in der folgenden Abbildung gezeigt. Ich werde. Ich weiß nicht, warum das passiert, aber wenn jemand es weiß, lass es mich bitte in den Kommentaren wissen. Da es mit 240 statt 255 multipliziert wird, ist die Farbe etwas dunkler als das Original.
Dies ist das Ergebnis von 3000 Epochennummern. Ich habe General-100 für Trainingsdaten verwendet.
** Ergebnis der Vergrößerung 2 **
Die Auflösung ist so hoch, dass sie von einem hochauflösenden Bild kaum zu unterscheiden ist.
** Ergebnis der Vergrößerung 4 **
Wenn die Auflösung so niedrig ist, gehen detaillierte Informationen verloren.
Ich habe versucht, die Auflösung von Bildern mit niedriger Auflösung mithilfe von SRCNN, einer hochauflösenden Technologie, zu erhöhen. Wie ich zu Beginn des letzten Males erwähnt habe, habe ich neben SRCNN auch SRGAN implementiert. Ich werde es eines Tages zusammenfassen.