Фон

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

С другой стороны, метод глубокого обучения в сочетании с компьютерным зрением настолько популярен, что в Интернете уже есть десятки тысяч учебных пособий, но я дам свои собственные шаги исследования. В этой статье я выберу одну тему — обнаружение пешеходов — для начала. Давайте начнем это путешествие!

Прежде всего — набор данных

Для начала нам следует выбрать соответствующий набор данных о пешеходах. По сравнению с Caltech Pedstrian Benchmark, набором данных ETH и набором Daimler я решил выбрать ETH, основным соображением здесь является размер набора данных. Кроме того, ETH на самом деле представляет собой стереофонический набор данных, и, возможно, мы все еще сможем использовать его в дальнейших исследованиях.

После загрузки набора (я выбираю «Sequence BAHNHOF (999 кадров) в Setup 1 (chariot Mk I)», конечно, вы можете выбрать свой собственный), следующим шагом будет разделение набора данных на две части, одна из которых является тренировочной. (75%), а другой тестирует один (25%) со случайным выбором. Я сделал этот шаг, потому что этот набор данных не предоставил набор для тестирования. Обычно я думаю, что мы не будем делать этот дополнительный шаг, потому что сопровождающий набор данных предоставит нам набор для тестирования.

Теперь мы должны подготовить набор для Tensorflow. В соответствии с требованием TF мы не можем напрямую передавать файлы *.png или *.jpg, а также аннотации в фреймворк для обучения. Вместо этого мы должны преобразовать исходный набор данных, включая аннотации, в формат TFRecord. Одним из преимуществ, которые я вижу, является эффективность обработки данных на этапе обучения, если они были преобразованы в двоичный формат. Другой способ заключается в том, что Tensorflow может получать согласованный формат данных независимо от того, какие исходные данные. И последнее, но не менее важное: Tensorflow будет использовать относительные значения (соотношения), вычисляемые из аннотированных координат и размера изображения, вместо абсолютных значений для обучения.

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

«left/image_00000001.png»: (212, 204, 232, 261):1, (223, 181, 259, 285):1, (293, 151, 354, 325):1, (452, 208, 479, 276):1, (255, 219, 268, 249):1, (280, 219, 291, 249):1, (267, 246, 279, 216):1, (600, 247, 584, 210):1;

Как мы видим, он состоит из 2-х частей. Одно — это имя изображения, другое — координаты пешехода, а также информация о ярлыке, где формат: (x1, y1, x2, y2):label_info. (Примечание 1: исходная метка в файле аннотаций — -1, я заменил их все на 1, потому что -1 вызовет ошибку в Tensorflow. Примечание 2: В исходных аннотациях некоторые из них могут встречаться x1›x2 или y1›y2, в этом случае TensorFlow будет падать во время обучения, см. эту проблему.

Следующий шаг — обучение

Это трудоемкий шаг, но чтобы сэкономить время на прекрасную жизнь, мы можем выбрать одну из предварительно обученных моделей из Зоопарка моделей TensorFlow (эта процедура называется Перенос обучения). Для себя я выбрал Faster R-CNN ResNet101 и внес необходимые изменения (такие как скорость обучения, номер шага обучения и путь к файлу TFRecord, сгенерированный на предыдущем шаге), чтобы продолжить обучение.

Почти успех — создание карты выводов

После нескольких часов ожидания экспортируйте карту логического вывода на основе результатов обучения. Мы получим файл карты с именем вроде «frozen_inference_graph.pb». Это последнее сокровище, которое мы ищем после часов или пары дней работы.

Итог — прогноз

Наконец! Карта логического вывода плюс карта меток — это окончательное оружие для прогнозирования при тестировании изображений. Ниже приведен результат прогноза для одного из тестовых изображений.

Дальнейшее исследование — оценка эффективности

Как мы видим на этапе прогнозирования, похоже, что результат хороший. Если мы просто создаем игрушку, возможно, мы можем остановиться на этапе предсказания. Однако многим из нас интересно, насколько хороша наша модель? Например, хорошо ли это для следующего прогноза (обратите внимание, на следующем изображении один из прогнозов неверен)?

Итак, какие показатели можно использовать для оценки эффективности обнаружения? Во многих работах по классификации мы можем использовать такие показатели, как «Точность», «Отзыв» и «Оценка F1», чтобы измерить производительность. Однако существуют различия между чистой классификацией и детектированием. Помимо классификации, мы также должны заботиться о правильности координат объектов на изображениях. Как мы можем принять во внимание как классификацию, так и локализацию для измерения производительности? Итак, мы вводим mAP. Если вам нужен этот индикатор, не забудьте сохранить копию результатов прогнозирования (означает прогнозирование координат на тестовых изображениях).

После расчета средняя точность моей обучающей модели составляет [0,8941, 0,8906, 0,8829, 0,7852, 0,7553, 0,6363, 0,4137, 0,2143, 0,0651, 0,0056] по десяти пороговым значениям IoU: [0,5, 0,55, 0,6, 0,65, 0,7, 0,8, 0,85, 0,9, 0,95]. Таким образом, окончательный показатель mAP составляет 55,43%, что кажется невысоким показателем и может быть улучшено в будущем.

Ниже представлена ​​кривая Precision-Recall для обнаружения этой модели на тестовых изображениях.

При попытке улучшить вышеуказанный показатель mAP можно учитывать три фактора. Во-первых, ввести отрицательные обучающие выборки. Я этого не делал, потому что это кажется еще одной трудоемкой работой. Во-вторых, я могу увеличить данные перед фазой обучения. Я имею в виду, что я могу взять изображения с горизонтальным переворотом вместе с исходными в набор обучающих данных. Но имейте в виду, что это может не принести хороших преимуществ, потому что это зависит от модели. Возможно, производительность на модели SSD выше, чем на Faster R-CNN. (Почему?) И последнее: мы можем выполнять валидацию во время обучения, что означает, что прежде всего мы разделяем тренировочный набор на две части: один — реальный тренировочный набор (~ 85%), а другой — проверочный набор (~ 15 %) до обучение. Затем мы используем набор данных проверки, чтобы оценить производительность модели и соответствующим образом настроить гиперпараметры модели. Я не делал этот шаг, как описано выше. Кстати, если мы используем небольшой набор данных, еще один способ повысить производительность модели — использовать перекрестную проверку.

Теперь, это действительно добраться до конца этой статьи. Должен сказать, что в этом путешествии интересно, однако, наряду с некоторыми «болями» — например, найти первопричину крушения во время тренировки. Но я предполагаю, что именно в этом и заключается радость — найти проблемы, а затем исправить их.