Le Deep Learning est devenu plus facile à atteindre en raison de l'augmentation de la demande et de l'augmentation des cadres. mais, Il est difficile de préparer un ensemble de données!
Puisque des milliers ou des dizaines de milliers de données sont nécessaires, il est très difficile de les collecter à moins que quelqu'un ne les prépare comme des caractères manuscrits. Par conséquent, passez d'un petit nombre d'images à plusieurs images et augmentez-les! Il existe un mécanisme appelé.
J'ai également dû préparer moi-même l'ensemble de données, alors je l'ai étudié, je vais donc l'écrire sous forme de note de service. Si vous avez des erreurs ou de meilleurs moyens, veuillez nous en informer!
J'ai également eu du mal à tirer plus de 1000 de mes propres mains, En raison de l'augmentation du nombre à 54 000 en complétant avec cette expansion, l'intérieur du répertoire est un peu horrible. J'avais peur que ma connaissance ne soit malade.
L'environnement de l'auteur est le suivant.
Si vous voulez vous assurer que cela fonctionne, créez un environnement avec ʻanacondaou
pyenv` et exécutez-le à partir de là.
Python 3.5.3
Keras==2.0.4
numpy==1.12.1
tensorflow==1.0.0
keras
fonctionne sur le backend Tensor Flow
.
Si vous voulez avoir une idée approximative de Keras
, veuillez consulter les Articles précédents.
C'est vraiment difficile, donc si vous voulez en savoir plus, veuillez vous référer au Document officiel etc.
J'utiliserai ce Keras
cette fois,
Comme c'est uniquement dans le but de préparer un ensemble de données, veuillez l'utiliser pour votre framework préféré tel que keras
, machine learning, chainer
, Tensor Flow
et caffe
.
Peut-être que chaque framework a des fonctionnalités similaires, mais si vous trouvez qu'il est difficile de rechercher et que vous souhaitez l'augmenter rapidement, essayez simplement le code ci-dessous.
Déplacez-le simplement dans le répertoire de l'ensemble de données pour étendre l'ensemble de données et l'enregistrer dans un autre répertoire. Veuillez l'utiliser en fonction de l'objectif tel que le nombre de feuilles à développer à partir d'une feuille et le nom du répertoire de sortie.
Par défaut, tous les fichiers jpg
du répertoire courant sont développés par 10 chacun et sortis vers. / Extened
(s'ils ne sont pas créés).
dataset_generator.py
import os
import glob
import numpy as np
from keras.preprocessing.image import ImageDataGenerator, load_img, img_to_array, array_to_img
def draw_images(generator, x, dir_name, index):
#Paramètres du fichier de sortie
save_name = 'extened-' + str(index)
g = generator.flow(x, batch_size=1, save_to_dir=output_dir, save_prefix=save_name, save_format='jpg')
#Spécifiez le nombre d'images à développer à partir d'une image d'entrée
# g.next()Est augmenté du nombre de fois
for i in range(10):
bach = g.next()
if __name__ == '__main__':
#Paramètres du répertoire de destination de sortie
output_dir = "extended"
if not(os.path.exists(output_dir)):
os.mkdir(output_dir)
#Chargement des images développées
images = glob.glob(os.path.join('./', "*.jpg "))
#Paramètres d'extension
generator = ImageDataGenerator(
rotation_range=90, #Rotation jusqu'à 90 °
width_shift_range=0.1, #Décaler horizontalement au hasard
height_shift_range=0.1, #Décalage aléatoire dans la direction verticale
channel_shift_range=50.0, #Changement de couleur aléatoire
shear_range=0.39, #Direction diagonale(pi/Jusqu'à 8)Tirer vers
horizontal_flip=True, #Retourné verticalement au hasard
vertical_flip=True #Retourner horizontalement au hasard
)
#Développez les images chargées dans l'ordre
for i in range(len(images)):
img = load_img(images[i])
#Organiser et déplacer les images a
x = img_to_array(img)
x = np.expand_dims(x, axis=0)
#Extension d'image
draw_images(generator, x, output_dir, i)
generator = ImageDataGenerator(
rotation_range=90,
width_shift_range=0.1,
height_shift_range=0.1,
channel_shift_range=50.0,
shear_range=0.39,
zoom_range=0.2,
horizontal_flip=True,
vertical_flip=True
)
En réécrivant cette partie, diverses extensions peuvent être faites. Veuillez le personnaliser en fonction de votre application.
Les types et explications des arguments sont les suivants. L'explication est presque la même que Document, je ne sais pas ...
Facile à utiliser et facile à comprendre
-- rotation_range
: Entier. Plage de rotation (0-180) pour faire pivoter l'image de manière aléatoire
--width_shift_range
: nombre à virgule flottante (rapport à la largeur). Décale de manière aléatoire horizontalement dans la plage spécifiée.
--height_shift_range
: nombre à virgule flottante (rapport à la hauteur). Décale verticalement de manière aléatoire dans la plage spécifiée.
--shear_range
: nombre à virgule flottante. Résistance au cisaillement (angle de cisaillement dans le sens antihoraire (Radian)). Effectuez la Conversion de cisaillement. En bref, il tire au hasard dans la plage spécifiée.
--zoom_range
: nombre à virgule flottante ou [inférieur, supérieur]. Effectue un zoom aléatoire à un grossissement compris dans la valeur spécifiée. Étant donné un nombre à virgule flottante, [lower, upper] = [1-zoom_range, 1 + zoom_range].
--channel_shift_range
: nombre à virgule flottante. Décalez aléatoirement les canaux dans la plage. La couleur changera.
--horizontal_flip
: valeur de vérité. Inverse de manière aléatoire l'entrée horizontalement. Il s'agit d'un paramètre de contre-indication qui ne doit pas être utilisé pour la reconnaissance de caractères.
--vertical_flip
: valeur de vérité. Inverse de manière aléatoire l'entrée verticalement Il s'agit d'un paramètre de contre-indication qui ne doit pas être utilisé pour la reconnaissance de caractères.
Ce que vous ne comprenez pas (j'apprécierais que vous puissiez l'expliquer)
--featurewise_center
: valeur de vérité. Faites la moyenne des entrées à 0 dans l'ensemble de données.
--samplewise_center
: valeur de vérité. Réglez la moyenne de chaque échantillon sur 0.
--featurewise_std_normalization
: valeur de vérité. Normalise l'entrée avec l'écart type de l'ensemble de données.
--samplewise_std_normalization
: valeur de vérité. Normaliser chaque entrée avec son écart type.
-- zca_whitening
: valeur de vérité. Appliquez le blanchiment ZCA.
-- zca_epsilon
: epsilon de blanchiment ZCA. La valeur par défaut est 1e-6.
--fill_mode
: {"constant", "le plus proche", "refléter", "envelopper"}. Remplit les limites de l'image d'entrée selon le mode spécifié.
-- cval
: nombre à virgule flottante ou entier; valeur utilisée lorsque fill_mode = "constant".
--rescale
: facteur de remise à l'échelle. La valeur par défaut est Aucun, si spécifié, la valeur donnée sera ajoutée aux données avant toute autre conversion.
--preprocessing_function
: La fonction appliquée à chaque entrée. Cette fonction sera exécutée avant toute autre modification. Cette fonction doit être définie pour prendre un tenseur numpy tridimensionnel comme argument et produire un tenseur de la même forme.
--data_format
: Spécifiez "channels_last" (par défaut) ou "channels_first". Dans le cas de "channels_last", la forme d'entrée est (échantillons, hauteur, largeur, canaux), et dans le cas de "channels_first", c'est (échantillons, canaux, hauteur, largeur). La valeur par défaut est la valeur de image_data_format dans le fichier de configuration Keras ~ / .keras / keras.json. Si vous n'avez jamais changé la valeur, ce sera "channels_last".
Cela semble être persistant plusieurs fois, mais je suis toujours une personne inexpérimentée, alors apprenez-moi différentes choses!
Recommended Posts