Создание файла бинарной сегментации для обнаружения дорожек в Python / Tensorflow (Tusimple Lanenet Dataset) - PullRequest
0 голосов
/ 07 ноября 2018

Я использовал код от https://github.com/MaybeShewill-CV/lanenet-lane-detection, который использовал Deep Learning для обнаружения линий полосы движения.

Я успешно протестировал модель. Теперь я хочу переучить модель по моим собственным данным.

Учебные данные состояли из трех частей: исходное изображение, файл двоичной сегментации и файл сегментации экземпляра. Пожалуйста, обратитесь к папкам gt_image_binary и gt_image_instance внутри папки /data/training_data_example из репозитория.

Бинарная сегментация использует 255 для представления поля линии и 0 для остальных. Экземпляр использует другое значение пикселя для представления другого поля линии и 0 для остальных.

У меня вопрос, как мне сгенерировать эти две метки (двоичные файлы и файлы сегментации экземпляра)?

Автор сказал, что вам просто нужно следовать инструкциям в файле readme для набора данных Tusimple Lanenet, найденному здесь: https://github.com/TuSimple/tusimple-benchmark/blob/master/doc/lane_detection/readme.md

И из этого говорится, что вы можете сгенерировать эти файлы, используя этот формат в файле json:

{
      'raw_file': str. 20th frame file path in a clip.
      'lanes': list. A list of lanes. For each list of one lane, the elements are width values on image.
      'h_samples': list. A list of height values corresponding to the 'lanes', which means len(h_samples) == len(lanes[i])
    }

Где каждая строка json в label_data_ (date) .json - это данные метки для фрейма.

* * Например, тысяча двадцать-три
{
  "lanes": [
        [-2, -2, -2, -2, 632, 625, 617, 609, 601, 594, 586, 578, 570, 563, 555, 547, 539, 532, 524, 516, 508, 501, 493, 485, 477, 469, 462, 454, 446, 438, 431, 423, 415, 407, 400, 392, 384, 376, 369, 361, 353, 345, 338, 330, 322, 314, 307, 299],
        [-2, -2, -2, -2, 719, 734, 748, 762, 777, 791, 805, 820, 834, 848, 863, 877, 891, 906, 920, 934, 949, 963, 978, 992, 1006, 1021, 1035, 1049, 1064, 1078, 1092, 1107, 1121, 1135, 1150, 1164, 1178, 1193, 1207, 1221, 1236, 1250, 1265, -2, -2, -2, -2, -2],
        [-2, -2, -2, -2, -2, 532, 503, 474, 445, 416, 387, 358, 329, 300, 271, 241, 212, 183, 154, 125, 96, 67, 38, 9, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2],
        [-2, -2, -2, 781, 822, 862, 903, 944, 984, 1025, 1066, 1107, 1147, 1188, 1229, 1269, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2]
       ],
  "h_samples": [240, 250, 260, 270, 280, 290, 300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 410, 420, 430, 440, 450, 460, 470, 480, 490, 500, 510, 520, 530, 540, 550, 560, 570, 580, 590, 600, 610, 620, 630, 640, 650, 660, 670, 680, 690, 700, 710],
  "raw_file": "path_to_clip"
}

Тогда вы просто наложите точки на исходном изображении (используя cv2.polylines?).

Как мне это сделать?

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

Но, опять же, я получил ошибку при этом.

Каков наилучший способ создания двоичных файлов и файлов сегментации экземпляра?

1 Ответ

0 голосов
/ 14 мая 2019

Я просто оставлю здесь ответ (Не знаю, хорошо ли отвечать на старый вопрос).

label = '0601'
labe_filename = 'label_data_%s.json' % label
clips = [json.loads(line) for line in open(labe_filename).readlines()]

for clip in clips:
    lanes = clip['lanes']
    filepath = clip['raw_file']
    ysamples = clip['h_samples']

    lanes = [[(x, y) for (x, y) in zip(lane, ysamples) if x >= 0] for lane in lanes]

    raw_image = cv2.imread(filepath)
    label_image = np.zeros(raw_image.shape[:2], dtype=np.uint8)

    for lane in lanes:
        cv2.polylines(label_image, np.int32([lane]), isClosed=False, color=(255,255,255), thickness=5)

    cv2.imshow("win1", raw_image)
    cv2.imshow("win2", label_image)
    cv2.waitKey(0)
    break

В наборе данных Tusimple используется что-то вроде линии сканирования для формирования разметки для дорожек ( это ). h_samples - координаты Y линий сканирования. Поэтому вам нужно объединить h_samples и lanes (которые являются координатами x), чтобы сформировать разметку полосы. И если нет существующей разметки полосы движения, координата x будет равна 0. Вот что делает эта строка:

lanes = [[(x, y) for (x, y) in zip(lane, ysamples) if x >= 0] for lane in lanes]

Например, для сегментации используйте разные цвета для каждой полосы. Вы можете обратиться к их кодам поставщика данных для устранения ошибок формы.

...