[PYTHON] J'ai essayé de créer une méthode de super résolution / SRCNN ①

Aperçu

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 ③

table des matières

1.Tout d'abord 2. Environnement PC 3. Description du code 4. À la fin

1.Tout d'abord

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

2. Environnement PC

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

3. Description du code

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. __

Description de detacreate.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.

4. À la fin

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!

Recommended Posts

J'ai essayé de créer une méthode de super résolution / SRCNN ①
J'ai essayé de créer une méthode de super résolution / SRCNN ③
J'ai essayé de créer une méthode de super résolution / SRCNN ②
J'ai essayé de créer une méthode de super résolution / ESPCN
[Go + Gin] J'ai essayé de créer un environnement Docker
J'ai essayé "Comment obtenir une méthode décorée en Python"
J'ai essayé de créer un linebot (implémentation)
J'ai essayé de créer un linebot (préparation)
Je veux créer un environnement Python
J'ai créé une API Web
J'ai essayé de déboguer.
J'ai essayé de générer une chaîne de caractères aléatoire
J'ai essayé de créer un environnement de développement Mac Python avec pythonz + direnv
J'ai créé un jeu ○ ✕ avec TensorFlow
J'ai essayé de faire un "putain de gros convertisseur de littérature"
J'ai essayé d'implémenter un pseudo pachislot en Python
Je souhaite créer facilement un environnement de développement basé sur un modèle
J'ai essayé de créer un pipeline ML avec Cloud Composer
Le débutant de la CTF a tenté de créer un serveur problématique (Web) [Problème]
J'ai essayé de simuler la méthode de calcul de la moyenne des coûts en dollars
J'ai ajouté une fonction à CPython (construction et compréhension de la structure)
J'ai essayé de dessiner un diagramme de configuration à l'aide de diagrammes
J'ai essayé d'apprendre PredNet
J'ai essayé d'organiser SVM.
J'ai essayé d'implémenter PCANet
J'ai essayé de réintroduire Linux
J'ai essayé de présenter Pylint
J'ai essayé de résumer SparseMatrix
jupyter je l'ai touché
J'ai essayé d'implémenter StarGAN (1)
J'ai essayé de créer un environnement avec WSL + Ubuntu + VS Code dans un environnement Windows
J'ai essayé de créer une classe pour rechercher des fichiers avec la méthode Glob de Python dans VBA
J'ai essayé d'implémenter une ligne moyenne mobile de volume avec Quantx
J'ai essayé de mettre en œuvre le modèle de base du réseau neuronal récurrent
J'ai essayé l'algorithme de super résolution "PULSE" dans un environnement Windows
J'ai essayé d'implémenter un automate cellulaire unidimensionnel en Python
[Chaîne de Markov] J'ai essayé de lire les citations en Python.
J'ai essayé de résoudre le problème d'optimisation des combinaisons avec Qiskit
J'ai essayé de commencer avec Hy ・ Définir une classe
J'ai essayé d'automatiser [une certaine tâche] à l'aide d'une tarte à la râpe
J'ai trébuché lorsque j'ai essayé d'installer Basemap, donc un mémorandum
J'ai essayé de trier une colonne FizzBuzz aléatoire avec un tri à bulles.
J'ai essayé de créer un bot pour annoncer un événement Wiire
J'ai fait un chronomètre en utilisant tkinter avec python
J'ai essayé d'écrire dans un modèle de langage profondément appris
J'ai créé un éditeur de texte simple en utilisant PyQt
Quand j'ai essayé de créer un environnement Rails sur WSL2 (Ubuntu 20.04LTS), j'ai trébuché et suis tombé.
J'ai essayé de créer un service qui vend des données apprises par machine à une vitesse explosive avec Docker
J'ai essayé d'implémenter Deep VQE
J'ai essayé de créer l'API Quip
J'ai essayé de mettre en place une validation contradictoire
J'ai essayé d'expliquer l'ensemble de données de Pytorch
J'ai essayé l'authentification vocale Watson (Speech to Text)
J'ai touché l'API de Tesla
J'ai essayé de m'organiser à propos de MCMC.