2017-02-21 31 views
0

Я пытаюсь классифицировать изображения с помощью искусственной нейронной сети, и подход я хочу попробовать это:SIFT входа в ИНС

  1. Получить функцию дескрипторы (с использованием SIFT сейчас)
  2. Классифицировать с помощью Neural Сеть

Я использую для этого OpenCV3 и Python.

Я относительно новым для машинного обучения и у меня есть следующий вопрос -

Каждый образ, который я анализирую будет иметь разное количество «ключевых точек» и, следовательно, различных размеров «дескриптора» 2D-массива. Как мне выбрать вход для моего ANN. Например, для одного образца изображения форма дескриптора равна (12211, 128), поэтому я сглаживаю этот массив и использую его как вход, и в этом случае мне приходится беспокоиться о разных размерах ввода для каждого изображения или я могу вычислить что-то еще для вход?

+0

Для ANNs вам обычно нужны входы фиксированного размера. –

ответ

0

Я не уверен, что это точное решение, но это сработало для меня. Основная идея заключается в следующем:

  • Разделите свое изображение на сетку MxN.
  • Получите заданное количество точек для каждого суб-изображения.
  • Объедините результаты для всех суб-изображений, чтобы получить вектор-функцию для всего изображения.

Опорный код примерно приведен ниже (функция "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 

Однако это чрезвычайно медленно. Я сейчас работаю над оптимальным выбором функций с помощью PCA.

0

Будет полезно, если вы примените нормализацию на каждом изображении перед тем, как получить экстрактор функции.

 Смежные вопросы

  • Нет связанных вопросов^_^