[PYTHON] Erstellen Sie einen Stapel von Bildern und blasen Sie sie mit ImageDataGenerator auf

Einführung

Zur Bildsegmentierung mit Deep Learning --Erstellen eines kleinen Bildstapels aus einem großen Bild

Bilddaten

[ISBI challenge 2012(Segmentation of neuronal structures in EM stacks)] Die Bilddaten der in (http://brainiac2.mit.edu/isbi_challenge/home) aufgeführten Zellen werden verwendet. Sie können Bilddaten herunterladen, indem Sie sich auf der Homepage registrieren. Enthält das ursprüngliche Zellenbild und vorgemalte Daten. Basierend auf diesen Daten werden wir die Lerndaten vorbereiten, um das überwachte Lernen automatisch zu malen. Unknown.png

Erstellen eines Bildstapels

Die ursprünglichen Bilddaten sind (512, 512) groß (oben). Teilen Sie dieses Bild in Größen (256, 256). Lesen Sie zuerst die Daten.

from skimage import io
import tensorflow as tf
import glob

dir_name = "./data/train"
paths_train_img = glob.glob(dir_name + "/train_image*")
paths_train_label = glob.glob(dir_name + "/train_label*")

train_images = []
train_labels = []  
for path in paths_train_img[:-5]:
    train_images.append(io.imread(path)/255.0)
    path = path.replace('image', 'labels')
    train_labels.append(io.imread(path)/255.0)

train_images = train_images[..., tf.newaxis]
train_labels = train_labels[..., tf.newaxis]
# print(train_images.shape)  
#   (25, 512, 512, 1)

train_images enthält das ursprüngliche Zellenbild und train_labels enthält die vorgemalten Daten. Die Bilder entsprechen train_images [i] und train_labels [i]. Ich habe eine Achse mit tf.newaxis für die spätere Verwendung im Tensorflow hinzugefügt.

Schneiden Sie nun das Bild aus und erstellen Sie einen Stapel. Verwenden Sie dazu tf.image.extract_patches. In Bezug auf tf.image.extract_patches war die offizielle Seite persönlich schwer zu verstehen, aber Artikel über Stapelüberlauf //stackoverflow.com/questions/40731433/understanding-tf-extract-image-patches-for-extracting-patches-from-an-image) war leicht zu verstehen.

ksize_rows = 256
ksize_cols = 256
strides_rows = 256
strides_cols = 256

ksizes = [1, ksize_rows, ksize_cols, 1] 
strides = [1, strides_rows, strides_cols, 1]
rates = [1, 1, 1, 1]
padding='VALID'

def make_patches(images):
    image_patches = tf.image.extract_patches(images, ksizes, strides, rates, padding)
    #Bild-Patches(25, 2, 2, 65536)Gestalten.
    # 65536=256*Bei 256(256, 256)Das Größenbild wird eindimensional gespeichert.
    patches = []
    for patch in image_patches:
        for i in range(patch.shape[0]):
            for j in range(patch.shape[1]):
                patch2 = patch[i,j,:]
                patch2 = np.reshape(patch2, [ksize_rows, ksize_cols,1])
                # (i,j)Bildstapel der Position von(256, 256)Umformen in die Form von
                patches.append(patch2)

    patches = np.array(patches)
    return patches

train_image_patches = make_patches(train_images)
train_label_patches = make_patches(train_labels)

Mit make_patches oben kann das Bild in Stapelbilder mit einer Größe von (256, 256) geschnitten werden. Da das Originalbild 25 Bilder der Größe (512, 512) hatte, enthalten train_image_patches und train_label_images 100 Bilddaten der Größe (256, 256).

Bildauffüllung mit ImageDataGenrator

Wir werden die Datenerweiterung mit Image Data Generator durchführen. ImageDataGenerator bläst das Bild mithilfe von Transformationen wie Drehen, Zoomen und Spiegeln auf. Übergeben Sie den Maximalwert wie Drehung und Zoom als Argument. Sie können auch eine Funktion für die Bildvorverarbeitung angeben, um die Bildvorverarbeitung vor verschiedenen Konvertierungen durchzuführen. Im folgenden Beispiel wird Gaußsches Rauschen als Vorbehandlung hinzugefügt.

from tensorflow.keras.preprocessing.image import ImageDataGenerator
import skimage

def add_noise(img):
    output_img = skimage.util.random_noise(img, var=0.01, clip=False)
    return np.array(output_img)

SEED1 = 1
batch_size = 2

args={
    "rotation_range":0.2,
    "width_shift_range":0.2,
    "height_shift_range":0.2,
    "zoom_range":0.2,
    "shear_range":0.2,
    "vertical_flip":True,
    "horizontal_flip":True,
    "fill_mode":"reflect",
    "preprocessing_function":add_noise
}

image_data_generator = ImageDataGenerator(**args
).flow(train_image_patches, batch_size=batch_size, seed=SEED1)

args.pop("preprocessing_function")
label_data_generator = ImageDataGenerator(**args
).flow(train_label_patches, batch_size=batch_size, seed=SEED1)

Da ich den vorgemalten korrekten Antwortdaten kein Rauschen hinzufügen möchte, habe ich preproccesing_function aus args entfernt, um label_data_generator zu erstellen. Wenn Sie image_data_generator und label_data_genrator mit demselben Startwert erstellen, stimmen das Originalbild und das vorgemalte Bild korrekt überein.

Zum Schluss setzen Sie sie zu einem Generator zusammen.

def my_image_mask_generator(image_data_generator, mask_data_generator):
    train_generator = zip(image_data_generator, mask_data_generator)
    for (img, mask) in train_generator:
        yield (img, mask)

my_generator = my_image_mask_generator(image_data_generator, label_data_generator)

Werfen wir einen Blick auf die tatsächlich erstellten Bilddaten.

plt.figure(dpi=100)
for i in range(3):
    img, mask = next(my_generator)
    plt.subplot(2, 3, i + 1)
    plt.imshow(img[0, :,:,0], cmap="gray")

    plt.subplot(2, 3, i + 4)
    plt.imshow(mask[0, :, :, 0], cmap="gray")
    plt.axis('off')
plt.show()

Unknown.png

Sie können sehen, dass ein Bildstapel erstellt wurde, in dem das ursprüngliche Zellenbild und das vorgemalte Bild korrekt zugeordnet sind. Außerdem sieht das Bild so aus, als würde ein Teil davon zum Rand hin reflektiert. Dies liegt daran, dass der ImageDataGenerator auf "fill_mode": "reflektieren" gesetzt ist, sodass die Leerzeichen, die beim parallelen Verschieben des Bildes auftreten, im Reflektionsmodus ergänzt werden.

Zusammenfassung

Sie haben jetzt Bilder gestapelt und Ihre Daten für die Bildsegmentierung aufgefüllt. Das nächste Mal werden wir anhand dieser Bilddaten tiefes Lernen durchführen.

Recommended Posts

Erstellen Sie einen Stapel von Bildern und blasen Sie sie mit ImageDataGenerator auf
Wavelet-Konvertierung von Bildern mit PyWavelets und OpenCV
Erstellen Sie eine Tabelle mit IPython Notebook
Erstellen Sie einen Datensatz mit Bildern, die für das Training verwendet werden sollen
Zeigen Sie eingebettete Bilder von MP3 und Flac mit Mutagen an
Erstellen Sie mit Py2app und Tkinter eine native GUI-App
Erstellen Sie mit PyQt5 und PyQtGraph einen 3D-Modell-Viewer
[Linux] Erstellen Sie ein Selbstzertifikat mit Docker und Apache
Erstellen Sie ein Verzeichnis mit Python
Als Ergebnis der Montage und Abstimmung mit POH! Lite
Erstellen Sie Anwendungen, registrieren Sie Daten und teilen Sie sie mit einer einzigen E-Mail
Lassen Sie uns ein PRML-Diagramm mit Python, Numpy und matplotlib erstellen.
Erkennen Sie mit Python Objekte einer bestimmten Farbe und Größe
Python: Erstellen Sie ein Wörterbuch aus einer Liste von Schlüsseln und Werten
Erstellen Sie ein Bereitstellungsskript mit Stoff und Küche und verwenden Sie es erneut
Erstellen Sie eine Web-API, die Bilder mit Django liefern kann
Holen Sie sich den Kauf- und Verkaufspreis der virtuellen Währung mit der API von Zaif Exchange und erstellen Sie ein Diagramm
Erstellen Sie mit Selenium ein Programm, mit dem Sie Ihr Lieblingsbild erstellen können
Übersicht über das Erstellen eines Server-Sockets und das Einrichten eines Client-Sockets
Erstellen Sie eine temporäre Datei mit Django als Zip und geben Sie sie zurück
Erstellen Sie eine virtuelle Umgebung mit Python!
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
Erstellen Sie einen einfachen geplanten Stapel mit Dockers Python Image und parse-crontab
Batch-Download-Bilder von einer bestimmten URL mit Python Modified-Version
Machen wir ein LGTM-Bild mit GIMP! (Python-Fu)
Erstellen Sie mit BigQuery ein privates DMP ohne Anfangskosten und ohne Entwicklung
Ich habe versucht, Bulls and Cows mit einem Shell-Programm zu erstellen
Erstellen Sie einen Videoplayer mit PySimpleGUI + OpenCV 3 Hinzufügen einer Maskenfunktion
Durchsuchen Sie das Verzeichnis und erstellen Sie eine Liste mit Verzeichnispfaden und Dateinamen
Erstellen Sie einen Poisson-Stepper mit numpy.random
Koexistenz von Python2 und 3 mit CircleCI (1.0)
Schreiben Sie ein Batch-Skript mit Python3.5 ~
Laden Sie Bilder mit Falcon hoch und laden Sie sie herunter
Erstellen Sie mit Django einen Datei-Uploader
Erstellen Sie eine CP932-CSV-Datei für Excel mit Chalice und geben Sie sie zurück
Erstellen Sie ein Kompatibilitätsbewertungsprogramm mit dem Zufallsmodul von Python.
Erstellen Sie einen BOT, der mit Discord registrierte Bilder wie Piktogramme aufrufen kann
[AWS] Erstellen Sie mit CodeStar eine Python Lambda-Umgebung und führen Sie Hello World aus
Eine Sammlung von Tipps zur Beschleunigung des Lernens und Denkens mit PyTorch
Führen Sie einen Stapel Python 2.7 mit nohup unter Amazon Linux AMI unter EC2 aus
Die Geschichte einer Soundkamera mit Touch Designer und ReSpeaker
Erstellen Sie einen Stapel mit einer Warteschlange und eine Warteschlange mit einem Stapel (von LetCode / Implement Stack using Queues, Implement Queue using Stacks)
Holen Sie sich Bilder von OpenStreetMap und Geographical Institute Map mit Python + staticmap
Erstellen Sie DNN-CRF mit Chainer und erkennen Sie den Akkordfortschritt der Musik
Todo-App mit Django erstellen ④ Ordner- und Aufgabenerstellungsfunktion implementieren
Erstellen Sie eine Python3-Umgebung mit pyenv auf einem Mac und zeigen Sie NetworkX-Diagramme an
Implementieren Sie ein Modell mit Status und Verhalten (3) - Beispiel für die Implementierung durch den Dekorateur
Erläuterung zum Erstellen einer Anwendung zum Anzeigen von Bildern und Zeichnen mit Python
Erstellen Sie mit Python einen Entscheidungsbaum von 0 und verstehen Sie ihn (5. Information Entropy)
Erstellen Sie mit Class einen Python-Funktionsdekorator
Multi-Class Multi-Label-Klassifizierung von Bildern mit Pytorch
Ein grobes Verständnis von Python-Feuer und ein Memo
Erstellen Sie mit Python + PIL ein Dummy-Image.
[Python] Erstellen Sie mit Anaconda eine virtuelle Umgebung
Erstellen wir mit Python eine kostenlose Gruppe
Bilder mit Pupil, Python und OpenCV aufnehmen