Понимание того, как YOLO обучается - PullRequest
1 голос
/ 27 марта 2020

Я пытаюсь понять, как тренируется YOLO (v2). Для этого я использую эту реализацию keras https://github.com/experiencor/keras-yolo2 для обучения YOLO с нуля на наборе данных VO C (я открыт для другой реализации, но я никогда не работал с pytorch, поэтому keras реализация будет первым выбором).

1- Как я понял, YOLO сначала обучается для классификации по imag eNet, затем эти обученные веса (для классификации) следует где-то использовать при обучении yolo для регрессии ( обнаружить ограничивающие рамки). В большинстве кодов, которые я нашел в inte rnet для тренировки йоло с нуля (для регрессии), я не вижу той части, где загружаются эти весовые коэффициенты классификации. Когда это происходит? когда классификационные веса используются в тренировке йоло-регрессии?

2- Верно ли мое понимание, как описано в 1)?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

У вас есть два варианта:

  • Использовать предварительно обученные веса для всего детектора (бэкэнд + внешний интерфейс, т.е. сеть классификации + детектор).
  • Использовать предварительно обученный только для бэкэнда.

Все объяснено ниже https://github.com/experiencor/keras-yolo2#2 -edit-the-config-file по указанной вами ссылке.

В код, загрузка предварительно обученных весов для всей модели производится здесь . Это необязательно.

Предварительно обученные веса для бэкэнда обязательны (в соответствии с руководством), в коде это делается здесь (пример для полного Yolo). Обратите внимание, что вы должны были загрузить веса бэкэнда перед созданием модели, как указано в учебном пособии или в начале файла .

Редактировать 1

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

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

Вы не можете использовать исходные веса YoloV2 для инициализации этой сети, потому что формат отличается между Dar knet и Keras, сначала вы должны перевести их в формат Keras.

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

Обратите внимание, что существует дополнительная опция, называемая трансферным обучением. Если у вас есть предварительно обученные сети (магистраль и интерфейс), вы можете извлечь веса магистрали и использовать их для инициализации магистрали сети.

Редактировать 2

Нет, интерфейс и Бэкэнд не является строго говоря двумя отдельными сетями: это две сети. Фактически в большинстве сред глубокого обучения, таких как PyTorch, Keras или Tensorflow, любой слой можно рассматривать как сеть (Fully Connected, Convolutive, MaxPool, ...).

«Сети» - это просто объект которая представляет собой произвольную сложную математическую функцию, отображающую входы на выходы, к которым может применяться дифференцирование Automati c (необходимо определить прямое и обратное распространение).

В детекторе объекта одиночного выстрела, таком как Yolo, это более актуально для воспринимайте всю сеть как цепочку из двух сетей: магистраль и детектор . Это представление позволяет использовать более обобщенную c конструкцию и более широкий спектр настроек (т. Е. Использовать более производительную магистраль или облегченную).

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

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

Обычно количество каналов в последнем выходном слое должно быть numberOfClasses + 4, где numberOfClasses включает класс фона и где число 4 представляет четыре координаты ограничительной рамки. Этот пример сильно упрощен, я советую вам прочитать статьи Йоло, чтобы лучше понять структуру сети.

Похоже, что существует только один обучаемый слой (2D Conv здесь ) в сети детекторов. Обратите внимание на размер вывода, который ограничен числом классов: self.nb_box * (4 + 1 + self.nb_class).

Затем параметры этого слоя инициализируются со случайным распределением.

Что касается вашего последнего вопроса, я думаю, что вы исправить порядок переноса обучения, который должен работать.

0 голосов
/ 27 марта 2020

Сначала я рассмотрю 2-ю часть вашего вопроса

При обнаружении объекта, когда изображение помечено, создается файл метки, который содержит координаты ограничительной рамки и классификацию / class объекта / objects.

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

Так что здесь тренировка классификации и регрессии происходит вместе.

Не стесняйтесь комментировать, если у вас есть сомнения, и ставьте галочку, если он отвечает на ваш вопрос.

...