J'ai créé un ensemble de données avec des images obtenues à partir de ImageNet et j'ai essayé de les classer.
Avec le même code, il y a des moments où cela fonctionne pour une raison quelconque et des moments où ce n'est pas le cas, et je ne sais pas pourquoi. [^ 1] Cliquez ici pour le notebook: https://gist.github.com/juntaki/263d9c43c0509c6610bdf95a59867e99 [^ 1]: bogue Keras? Voici une description des notes.
Enregistrez la liste d'URL recherchée par ImageNet dans un emplacement approprié, puis téléchargez l'image. Jetez ceux dont la capacité ou les fichiers texte sont inhabituellement petits car ils ont échoué.
cat ../urllist | xargs wget -T1
Pour les images RVB, vous devez faire quelque chose comme [3 (RVB), 50 (vertical), 50 (horizontal)] pour passer à Keras. Puisque celui fourni avec Image.open () est [50,50,3], l'ordre est changé avec transpose (). L'argument signifie changer [0,1,2] en [2,0,1].
im_reading = np.array( Image.open(i).resize((50,50)))
im_reading = im_reading.transpose(2,0,1)
De plus, pour entrer dans Keras, il doit s'agir d'un np.array de [Sample, 3,50,50 (RGB image)], donc J'ai créé un ensemble de données en l'ajoutant à un tableau vide. Contrairement au tableau de python, vous devez d'abord définir la taille de la matrice. De plus, comme le dtype de l'image est uint8, elle ne peut pas être bien affichée comme une image avec imshow () à moins qu'elle ne soit alignée avec unsigned (bien qu'il semble qu'il n'y ait pas de problème si elle est juste en train d'apprendre) [^ 2].
[^ 2]: Le chargement prend beaucoup de temps, il devrait donc y avoir un meilleur moyen. Il n'est pas confirmé qu'une copie mémoire s'est produite à chaque fois qu'elle est stockée.
image = np.empty((0,3,50,50), dtype=np.uint8)
...
image = np.append(image, [im_reading], axis=0)
Il peut être affiché en retournant la commande permutée.
plt.imshow( image[number].transpose(1,2,0) )
scikit-learn a une fonction qui divise l'ensemble de données pour l'entraînement et les tests. Puisque l'ensemble de données s'ajoute dans l'ordre, il est soigneusement divisé avant et après, mais si vous passez cette fonction, il sera sélectionné au hasard et divisé.
from sklearn.cross_validation import train_test_split
data_train, data_test, labels_train, labels_test = train_test_split(image, result, test_size=0.10, random_state=10)
Le contenu du modèle est une couche combinée et une mise en commun maximale superposées de manière appropriée.
model = Sequential()
model.add(Convolution2D(96, 3, 3, border_mode="same", activation="relu" ,input_shape=(3, 50, 50) ))
model.add(Convolution2D(96, 3, 3, border_mode="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Convolution2D(96, 3, 3, border_mode="same", activation="relu"))
model.add(Convolution2D(96, 3, 3, border_mode="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Convolution2D(96, 3, 3, border_mode="same", activation="relu"))
model.add(Convolution2D(96, 3, 3, border_mode="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation("relu"))
model.add(Dense(10))
model.add(Activation("relu"))
model.add(Dense(2))
model.add(Activation("sigmoid"))
model.summary()
model.compile(loss='binary_crossentropy', optimizer="adadelta", metrics=['accuracy'])
C'est une classification simple de deux classes, mais j'ai pu obtenir une précision de 90% en lisant une image étiquetée correctement sélectionnée.
Recommended Posts