J'ai créé un programme pour SRCNN, qui est l'une des méthodes de super résolution, je vais donc le poster. Cela va être long, alors je prévois de le diviser en trois parties. Suite: J'ai essayé de créer une méthode de super-résolution / SRCNN② Suite: J'ai essayé de créer une méthode de super résolution / SRCNN ③
1.Tout d'abord 2. Environnement PC 3. Description du code 4. À la fin
La super-résolution est une technologie qui améliore la résolution des images basse résolution et des images animées, et le SRCNN utilise l'apprentissage en profondeur pour mesurer les résultats avec une précision plus élevée que les méthodes conventionnelles. C'est la méthode qui a été faite. Cette fois, j'ai implémenté ce SRCNN, donc je vais le poster.
Le code complet est également publié sur GitHub, veuillez donc vérifier ici. https://github.com/morisumori/srcnn_keras
cpu : intel corei7 8th Gen gpu : NVIDIA GeForce RTX 1080ti os : ubuntu 20.04
Comme vous pouvez le voir sur GitHub, il se compose principalement de trois codes. ・ Datacreate.py → Programme de génération de jeux de données ・ Model.py → Programme SRCNN ・ Main.py → Programme d'exécution J'ai créé une fonction avec datacreate.py et model.py et l'ai exécutée avec main.py.
__ Cette fois, je vais expliquer datacreate.py. __
datacreate.py
import cv2
import os
import random
import glob
import numpy as np
import tensorflow as tf
#Un programme qui coupe un nombre arbitraire d'images
def save_frame(path, #Chemin du fichier contenant les données
data_number, #Nombre de photos à couper à partir d'une image
cut_height, #Taille de stockage(Verticale)
cut_width, #Taille de stockage(côté)
mag, #Ratio de réduction
ext='jpg'):
#Générer une liste d'ensembles de données
low_data_list = []
high_data_list = []
path = path + "/*"
files = glob.glob(path)
for img in files:
img = cv2.imread(img, cv2.IMREAD_GRAYSCALE)
H, W = img.shape
if cut_height > H or cut_width > W:
return
for q in range(data_number):
ram_h = random.randint(0, H - cut_height)
ram_w = random.randint(0, W - cut_width)
cut_img = img[ram_h : ram_h + cut_height, ram_w: ram_w + cut_width]
#Flou avec le filtre gaussien
img1 = cv2.GaussianBlur(img, (5, 5), 0)
img2 = img1[ram_h : ram_h + cut_height, ram_w: ram_w + cut_width]
high_data_list.append(cut_img)
low_data_list.append(img2)
#numpy → tensor +Normalisation
low_data_list = tf.convert_to_tensor(low_data_list, np.float32)
high_data_list = tf.convert_to_tensor(high_data_list, np.float32)
low_data_list /= 255
high_data_list /= 255
return low_data_list, high_data_list
De là, je vais expliquer individuellement.
def save_frame(path, #Chemin du fichier contenant les données
data_number, #Nombre de photos à couper à partir d'une image
cut_height, #Taille de stockage(Verticale)
cut_width, #Taille de stockage(côté)
mag, #Ratio de réduction
ext='jpg'):
Voici la définition de la fonction. Comme je l'ai écrit dans le commentaire, path est le chemin du fichier. (Par exemple, si le fichier nommé file contient des photos, saisissez "./file".) data_number coupe plusieurs photos et transforme les données. cut_height et cut_wedth sont la taille des données. Je n'utilise pas de mag ... (car j'ai utilisé un filtre gaussien pour générer des images basse résolution cette fois)
path = path + "/*"
files = glob.glob(path)
Ceci est une liste de toutes les photos du fichier.
for img in files:
img = cv2.imread(img, cv2.IMREAD_GRAYSCALE)
H, W = img.shape
if cut_height > H or cut_width > W:
return
for q in range(data_number):
ram_h = random.randint(0, H - cut_height)
ram_w = random.randint(0, W - cut_width)
cut_img = img[ram_h : ram_h + cut_height, ram_w: ram_w + cut_width]
#Flou avec le filtre gaussien
img1 = cv2.GaussianBlur(img, (5, 5), 0)
img2 = img1[ram_h : ram_h + cut_height, ram_w: ram_w + cut_width]
high_data_list.append(cut_img)
low_data_list.append(img2)
Ici, je prends les photos listées plus tôt une par une et j'en découpe autant que le nombre de data_number. J'utilise random.randint parce que je veux couper l'emplacement au hasard. Ensuite, il est flouté avec un filtre gaussien pour générer une image basse résolution. Enfin, je l'ai ajouté à la liste avec append.
#numpy → tensor +Normalisation
low_data_list = tf.convert_to_tensor(low_data_list, np.float32)
high_data_list = tf.convert_to_tensor(high_data_list, np.float32)
low_data_list /= 255
high_data_list /= 255
return low_data_list, high_data_list
Ici, dans keras et tensorflow, il est nécessaire de convertir en tenseur au lieu de tableau numpy, donc la conversion est effectuée. En même temps, la normalisation se fait ici.
Enfin, la fonction se termine par une liste contenant des images basse résolution et une liste contenant des images haute résolution.
Cette fois, j'ai expliqué le programme de génération et de prétraitement des données. Ensuite, j'expliquerai le programme du modèle SRCNN. Suite: J'ai essayé de créer une méthode de super-résolution / SRCNN② Suite: J'ai essayé de créer une méthode de super résolution / SRCNN ③
Puisque c'est la première fois que j'écris un article, cela peut être difficile à comprendre, mais si vous avez des questions ou des commentaires, n'hésitez pas à me contacter!