Beim Python-Ndarray-Typ wurde es notwendig, (32,32,3) in einen 4-dimensionalen Tensor (1,32,32,1) umzuwandeln. Der Zweck ist das maschinelle Lernen von Daten.
Ein Array vom Typ ndarray wie (1,32,32,1) wird als "vierdimensionaler Tensor" bezeichnet. Der Inhalt des Bildes, der von diesem 4-dimensionalen Tensor gelesen werden kann, ist (Anzahl der Bilder, Höhe des Bildes, Breite des Bildes, Anzahl der Bildkanäle). Die Anzahl der Kanäle im Bild bedeutet RGB in Graustufen bei 1 und in Farbe bei 3. Ein Bild wird durch ein Array vom Typ ndarray (32, 32, 3) dargestellt, und es kann beurteilt werden, dass es sich nicht um einen Bilddatensatz handelt.
Nachtrag) Wenn ich einer auf Mathematik spezialisierten Person sage, dass es sich um einen 4-dimensionalen Tensor handelt, scheint es, dass er in einem anderen Bild vermittelt wird, aber ich mag die Art und Weise, wie es heißt: "Wenn Sie es nicht zu einem 4-dimensionalen Tensordatensatz machen, können Sie ihn nicht in Keras verwenden." Ich benutze es oft (lacht)
Ich denke, es ist ziemlich schwierig, den ndarray-Typ so zu konvertieren, wie Sie möchten. Vorerst habe ich bestätigt, dass der ndarray-Typ wie folgt konvertiert werden kann.
import numpy as np
a = np.arange(6)
a = a.reshape(2, 3)
print(a)
#↓ Ausgabeergebnis
#[[0 1 2]
# [3 4 5]]
print("===============\n")
a = a.reshape(2,3,1)
print(a)
#↓ Ausgabeergebnis
#[[[0]
# [1]
# [2]]
#
# [[3]
# [4]
# [5]]]
print("---------------\n")
a = a.reshape(1,2,3,1)
print(a)
#↓ Ausgabeergebnis
#[[[[0]
# [1]
# [2]]
#
# [[3]
# [4]
# [5]]]]
Jetzt können Sie es in die Vorhersagefunktion unten setzen. y_pred = model.predict(x) Wenn Sie die Daten von (1, 32, 16, 1) nicht im ndarray-Typ für x eingeben, tritt ein Fehler auf. Auch bei (32, 16, 1) tritt ein Fehler auf.
from PIL import Image
import numpy as np
# 3 *Wobei 2 eigentlich 32 ist*Bitte ersetzen Sie es durch 32 oder so.
c = np.arange(3 * 2)
c = c.reshape(3, 2)
pilImg = Image.fromarray(np.uint8(c))
# pilImg_1 = pilImg.convert("RGB")
pilImg_1 = pilImg.convert("L")
data = np.array(pilImg_1, dtype='int64')
print(type(data))
print(data)
print(data.shape)
a = data
print("===============\n")
a = a.reshape(3,2,1)
print(a)
print("===============\n")
a = data.reshape(1,3,2,1)
print(a)
Es ist ein Bonus. Es wird verwendet, wenn Sie das Bild von RGB in Graustufen ändern möchten. Ich weiß nicht, wie viel Nachfrage es gibt.
from PIL import Image
import numpy as np
file = "neko.png "
image = Image.open(file)
image = image.convert("RGB")
data_rgb = np.array(image, dtype='int64')
#Weil es rgb ist(height, width, 3)Wird ein Array sein
print(type(data_rgb))
print("data_rgb ... " + str(data_rgb.shape))
pilImg_rgb = Image.fromarray(np.uint8(data_rgb))
pilImg_gray = pilImg_rgb.convert("L")
data_gray = np.array(pilImg_gray, dtype='int64')
#Weil es Graustufen sind(height, width)Wird ein Array sein
print(type(data_gray))
print("data_gray ... " + str(data_gray.shape))
#
pilImg_rgb_2 = Image.fromarray(np.uint8(data_gray))
pilImg_rgb_2 = pilImg_rgb_2.convert("RGB")
data_rgb_2 = np.array(pilImg_rgb_2, dtype='int64')
#Ich habe es also wieder in rgb konvertiert(height, width, 3)Wird ein Array sein
print(type(data_rgb_2))
print("data_rgb ... " + str(data_rgb_2.shape))
Wenn Sie also (Höhe, Breite) ⇔ (Höhe, Breite, 3) tun, war dies ein Beispiel dafür. Es wird ein Array von (Höhe, Breite) anstelle von (Höhe, Breite, 1) sein.
P.S. Es wurde schlecht geschrieben. Immerhin denke ich, dass der folgende Code ausreicht.
from PIL import Image
import numpy as np
file = "neko.png "
image = Image.open(file)
image = image.convert("RGB")
data_rgb = np.array(image, dtype='int64')
#Weil es rgb ist(height, width, 3)Wird ein Array sein
print(type(data_rgb))
print("data_rgb ... " + str(data_rgb.shape))
pilImg_rgb = Image.fromarray(np.uint8(data_rgb))
pilImg_gray = pilImg_rgb.convert("L")
data_gray = np.array(pilImg_gray, dtype='int64')
#Weil es Graustufen sind(height, width)Wird ein Array sein
print(type(data_gray))
print("data_gray ... " + str(data_gray.shape))
#Weil es Graustufen sind(height, width)Wird ein Array sein
print(type(data_gray))
print("data_gray ... " + str(data_gray.shape))
a = data_gray.reshape(1, image.height, image.width, 1)
print(a.shape)
#Ausführungsergebnis
# <class 'numpy.ndarray'>
# data_rgb ... (210, 160, 3)
# <class 'numpy.ndarray'>
# data_gray ... (210, 160)
# (1, 210, 160, 1)
Die Sequenz ist (1, 210, 160, 1), also dieselbe wie (1, 32, 32, 1). Jetzt können Sie es verwenden, um maschinelles Lernen vorherzusagen. Da Sie jedoch normalerweise ein Farbbild verwenden, ist das Ende 3 anstelle von 1. Wenn Sie Buchstaben usw. lernen möchten, können Sie Graustufen verwenden. Ich denke, Sie können das Beispiel dieses Artikels verwenden.
Nachtrag) Jetzt geht es mir gut und ich arbeite.
print("img ... " + str(img.shape))
# img ... (1, 32, 32, 3)
print("img ..." + str(img[0].shape))
# img ... (32, 32, 3)
imwrite(img_path, img)
#↑ Dies ist ein Fehler
imwrite(img_path, img[0])
#↑ Das ist ein Erfolg
Recommended Posts