2017-02-21 1 views
0

J'essaie de classer les images en utilisant un réseau de neurones artificiels et l'approche que je veux essayer est:EIPD entrée à ANN

  1. Get descripteurs de fonction (en utilisant EIPD pour l'instant)
  2. Classifier utilisant un Neural Réseau

J'utilise OpenCV3 et Python pour cela.

Je suis relativement nouveau à l'apprentissage machine et j'ai la question suivante -

Chaque image que j'analyse aura un nombre différent de tableau « » et, par conséquent keypoints différentes dimensions du «descripteur du 2D. Comment puis-je décider de l'entrée pour mon ANN. Par exemple, pour une image échantillon, la forme du descripteur est (12211, 128), donc j'aplatis ce tableau et l'utilise comme entrée, auquel cas je dois m'inquiéter de varier les tailles d'entrée pour chaque image, ou est-ce que je calcule autre chose? l'entrée?

+0

Pour les ANNs, vous avez généralement besoin d'entrées de taille fixe. –

Répondre

0

Je ne sais pas si c'est une solution exacte, mais cela a fonctionné pour moi. L'idée principale est la suivante:

  • Divisez votre image en une grille MxN.
  • Obtenir un nombre défini de points de caractéristiques pour chaque sous-image.
  • Concatène les résultats pour toutes les sous-images afin d'obtenir un vecteur de caractéristiques pour l'image entière.

Le code de soutien à peu près est donné ci-dessous (la fonction "pre_process_image"):

def tiles(arr, nrows, ncols): 
    """ 
    If arr is a 2D array, the returned list contains nrowsXncols numpy arrays 
    with each array preserving the "physical" layout of arr. 

    When the array shape (rows, cols) are not divisible by (nrows, ncols) then 
    some of the array dimensions can change according to numpy.array_split. 

    """ 
    rows, cols, channel = arr.shape 
    col_arr = np.array_split(range(cols), ncols) 
    row_arr = np.array_split(range(rows), nrows) 
    return [arr[r[0]: r[-1]+1, c[0]: c[-1]+1] 
        for r, c in product(row_arr, col_arr)] 

def pre_process_images(data, dimensions=(28, 28)): 
    images = data['image'] 
    features = [] 
    count = 1 
    nrows = dimensions[0] 
    ncols = dimensions[1] 
    sift = cv2.xfeatures2d.SIFT_create(1) 
    for arr in images: 
     image_feature = [] 
     cut_image = tiles(arr, nrows, ncols) 
     for small_image in cut_image: 
      (kps, descs) = sift.detectAndCompute(im, None) 
      image_feature.append(descs.flatten()) 
     features.append(image_feature) 
     print count 
     count += 1 

    data['sift_features'] = features 
    return data 

Cependant cela est extrêmement lent. Je travaille sur un moyen de sélectionner de manière optimale les fonctionnalités utilisant PCA dès maintenant pour la même chose.

0

Ce sera bien si vous appliquez la normalisation sur chaque image avant d'obtenir l'extracteur de fonctionnalité.