1

Je suis en train d'utiliser le réseau de neurones en profondeur pour détecter la signalisation routière sur les images (basées sur the tflearn example):Comment améliorer réseau neuronal profond pour travailler avec une plus grande image d'entrée?

dataset_file = [path_to_dataset_file] 
X, Y = image_preloader(dataset_file, image_shape=(32, 32), mode='file', 
         categorical_labels=True, normalize=True) 
X, Y = shuffle(X, Y) 

network = input_data(shape=[None, 32, 32, 3]) 
network = conv_2d(network, 32, 3, activation='relu') 
network = max_pool_2d(network, 2) 
network = conv_2d(network, 64, 3, activation='relu') 
network = conv_2d(network, 64, 3, activation='relu') 
network = fully_connected(network, 512, activation='relu') 
network = dropout(network, 0.5) 
network = fully_connected(network, 2, activation='softmax') 
network = regression(network) 

model = tflearn.DNN(network, tensorboard_verbose=0) 
model.fit(X, Y, n_epoch=1000, show_metric=True) 

Il fonctionne vraiment agréable avec de petites images (32 x 32px), mais je voudrais améliorer mon réseau pour travailler avec des images plus grandes (500 x 500px ou plus si possible) avec des panneaux de signalisation en arrière-plan, dans le coin, etc. Tenter d'exécuter ce code avec shape = [Aucun, 500, 500, 3] a tué mon ordinateur :)

Je pense à cette façon (pseudo-code):

SIZE_GOOD_ENOUGH = 32 

def try_detect(image): 
    if image_too_small(image): # image is too small when width 
     return FALSE   # or height < SIZE_GOOD_ENOUGH 
    resized_image = image.resize_to(SIZE_GOOD_ENOUGH, SIZE_GOOD_ENOUGH) 
    result = detect_with_DNN(resized_image) # returns TRUE if detected 
    if result: 
     return TRUE 
    smaller_images_list = cut_into_pieces(image) # list of smaller images 
    for smaller_image in smaller_images_list: 
     result = try_detect(smaller_image) # recursion 
     if result: 
      return TRUE 
    return FALSE 

... ou quelque chose comme ça, mais je voudrais encore avoir plus grand SIZE_GOOD_ENOUGH, car certains panneaux de signalisation redimensionnés sont difficiles à reconnaître, même pour moi. Est-il possible d'améliorer mon réseau pour qu'il fonctionne mieux avec (par exemple) des images 200 x 200px? Mieux pour moi signifie "ne pas tuer mon GPU" et obtient toujours une précision> 0.9. Peut-être que mes conv_2d/max_pool_2d ne sont pas bien sélectionnés? Je serais reconnaissant pour tout conseil.

Répondre

2

Pour réduire l'utilisation de la mémoire GPU, vous pouvez réduire davantage la taille spatiale des mappes d'entités au début du réseau. Pour former un réseau plus important, il est nécessaire d'avoir un GPU de 4G ou plus, ou plusieurs GPU.

Un autre point, je suppose que les exemples de 32x32 sont centrés sur les panneaux routiers tandis que les images 500x500 sont des scènes de route, pas seulement des signes. Dans ce cas, vous feriez mieux de faire quelque chose comme la détection d'objet.

+1

Nous vous remercions de votre réponse. J'ai trouvé ce lien: https://github.com/tensorflow/models/tree/master/object_detection en utilisant vos conseils et il ressemble à une solution facile à tous mes problèmes! :) – Vether