Кодировать ограничивающие рамки для обучения - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь обучить основную сверточную сеть для поиска объектов на изображении. Я превращаю изображение в массив, который имеет форму 480, 640, 3 (высота, ширина, rgb). Цель - это двумерный массив с точками ящиков. Его форма 18, 2 (max_boxes, (x, y)).

Я передаю это в довольно простую сверточную модель (если это полезно, я могу опубликовать источник), которая была хороша в классификации изображений.

Когда я тренирую модель, она быстро достигает точности около 0,77 со сверхвысокими потерями ~ 35. После этого он перестает учиться, и когда я пытаюсь протестировать изображение, оно супер выключено.

Почему это? Я неправильно кодирую данные цели или есть проблема с обучением в сети? Каков «стандартный» способ сделать это? Как мне это исправить?

Пример вывода

Raw output:
[[[0.02862035 0.02726501]
  [0.02820634 0.02730229]
  [0.02834299 0.02714084]
  [0.02819964 0.02701551]
  [0.02831725 0.02733742]
  [0.02820959 0.02748821]
  [0.02811676 0.02731069]
  [0.0284538  0.0269504 ]
  [0.02842114 0.02728475]
  [0.02858478 0.02691348]
  [0.02842172 0.0273287 ]
  [0.02865605 0.02686743]
  [0.02795038 0.02733723]
  [0.0287733  0.02693835]
  [0.02838135 0.02726109]
  [0.02785174 0.02761061]
  [0.03038537 0.02532353]
  [0.02849848 0.0269334 ]]]
Formatted:
[[[18.317022   17.44961   ]
  [13.539045   13.105101  ]
  [ 0.02834299  0.02714084]
  [ 0.02819964  0.02701551]
  [ 0.02831725  0.02733742]
  [ 0.02820959  0.02748821]
  [ 0.02811676  0.02731069]
  [ 0.0284538   0.0269504 ]
  [ 0.02842114  0.02728475]
  [ 0.02858478  0.02691348]
  [ 0.02842172  0.0273287 ]
  [ 0.02865605  0.02686743]
  [ 0.02795038  0.02733723]
  [ 0.0287733   0.02693835]
  [ 0.02838135  0.02726109]
  [ 0.02785174  0.02761061]
  [ 0.03038537  0.02532353]
  [ 0.02849848  0.0269334 ]]]
Correct:
[[44.0, 50.0], [52.0, 51.5], [39.5, 44.5], [42.5, 46.0], [46.5, 48.0], [46.5, 48.0], [53.5, 55.5], [33.5, 53.0], [51.0, 57.0], [45.5, 54.0]]

Форматирование Я умножаю каждый элемент на высоту и ширину, чтобы его не нормализовать:

for e in output:
    e[0] *= 640
    e[1] *= 480

Кодировка изображения

def format_data(X):
    X = array(X)
    n, h, w, c = X.shape
    X = X.reshape(n, h, w, c).astype("float32")
    X = X / 255 # normalize between 0 and 1
    return X

Кодирование целевых данных

def format_output(y, max_box_count=0):
    for e in y:
        if len(e) > max_box_count:
            max_box_count = len(e)

    y_array = []
    for e in y:
        e_zeros = zeros((max_box_count, 2))
        e_zeros[:len(e)] = e
        y_array.append(e_zeros)

    for e in y_array:
        e[0] /= 640
        e[1] /= 480

    return array(y_array).astype('float32'), max_box_count
...