Йоло Даркнет, обнаруживающий только определенный класс, как человек, кошка, собака и т. Д.

Мы используем YOLO Darknet для обнаружения объектов. Мы используем Python3, тензор потока 1.0, numpy, opencv 3. Использование yolo.weight для обнаружения. Согласно приведенной ниже ссылке: https://github.com/thtrieu/darkflow

Когда мы запускаем его на видео, он одновременно обнаруживает все объекты, которые не требуются?

Пожалуйста, объясните нам, как мы можем определить только определенное имя класса для поиска.

Спасибо

3 ответа

Если вы просто выполните шаги, упомянутые @JP Kim - вы получите видео только с вашими ярлыками, однако оно также выведет другие объекты в качестве одного из ваших ярлыков.

В репозитории Darkflow есть специальный раздел, в котором точно указано, что делать, если вы хотите получить другой вывод. TLDR - вы должны переучить свою модель. Они показывают это, взяв пример из 3 классов.

Но позвольте мне в любом случае провести вас через процесс. Давайте рассмотрим, что у вас есть видео, и вам просто нужно отследить всех людей в нем. Итак, нам нужно отслеживать только один тип объекта - "человек".

  1. Мы делаем копию tiny-yolo-voc.cfg файл в cfg каталог. Давайте следовать их соглашению и назовите это tiny-yolo-voc-1c.cfg где суффикс 1c представляет количество классов. Причина выбора tiny-yolo-voc а не какой-то другой конфиг, так как наша базовая модель - это меньшая сеть, которая может работать на меньших графических процессорах Из того, что я наблюдал, для других конфигов требовалось 10 ГБ + графическая память, и они использовались, чтобы заставить мою машину не хватать памяти.

  2. Мы внесем необходимые изменения в tiny-yolo-voc-1c.cfg файл:

    • редактировать classes переменная к classes=1
    • Напоследок convolutional раздел перед region мы изменим filter переменная к 5 * (num_class + 5) = 5 * (1+5) = 30, Итак, установите filters=30
  3. Мы будем редактировать labels.txt файл в каталоге с исходным кодом darkflow и содержит только 1 строку, которая говорит person, поскольку нам нужен только 1 тип этикетки.

  4. Теперь нам нужно тренировать нашу модель. Однако, для обучения, мы сначала требуем, чтобы набор данных был там.

    • Теперь, если ваша метка является одной из существующих меток набора данных VOC или набора данных CoCo, то вы можете просто загрузить один из наборов данных VOC / Coco. В нашем случае person это тип объекта, который мы должны отслеживать, и это уже тип объекта в наборе данных VOC. Итак, мы будем использовать набор данных VOC.

    • Однако, если вы хотите использовать YOLO для классификации и отслеживания нового типа объектов, вам необходимо подготовить свой собственный набор данных и аннотации. Для этого пользовательского объекта вы можете следовать части 5-8 этой серии видеороликов YouTube. Эти видео демонстрируют пример того, как использовать YOLO для отслеживания и классификации fidget_spinner,

  5. Загрузите набор данных VOC, поскольку он содержит достаточно данных и аннотаций для нашего типа объекта. person

    # Download the Pascal VOC dataset:
    curl -O https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar
    tar xf VOCtest_06-Nov-2007.tar
    
  6. Мы не собираемся тренироваться с нуля. Итак, мы на самом деле собираемся загрузить веса для tiny-yolo-voc модель и начать переподготовку для нашего конкретного случая использования (просто person учебный класс). Для этого мы должны иметь веса, загруженные для tiny-yolo-voc, Вы можете найти веса здесь для YOLO v2. Мы будем загружать веса для Tiny YOLO для набора данных VOC. Переместить файл в /darkflow/bin/ каталог после скачивания.

  7. После того, как мы скачали это, необходимо иметь файл конфигурации базовой модели и файл весов с одинаковым именем. Поскольку переименование конфигурации не является хорошей идеей, мы переименуем веса, которые мы скачали с yolov2-tiny-voc.weights в tiny-yolo-voc.weights, Это необходимо, потому что когда мы тренируемся, мы предоставляем файл весов, и darkflow пытается выбрать соответствующий файл конфигурации в качестве справочного материала для обучения новой модели.

Это также упоминается на странице репо Darkflow:

Когда darkflow увидит, что вы загружаете tiny-yolo-voc.weights, он найдет файл tiny-yolo-voc.cfg в вашей папке cfg/ и сравнит этот файл конфигурации с новым, который вы установили с помощью --model cfg/tiny-yolo. -voc-1c.cfg. В этом случае каждый слой будет иметь одинаковое точное количество весов, за исключением двух последних, поэтому он будет загружать веса во все слои вплоть до двух последних, потому что теперь они содержат разное количество весов.

  1. Теперь мы можем тренировать нашу модель. Вы можете удалить --gpu 0.9 расстаться, если у вас нет GPU для обучения этому.

    # Train the net on the Pascal dataset:
    flow --model cfg/tiny-yolo-voc-1c.cfg --load bin/tiny-yolo-voc.weights --train --dataset "~/VOCdevkit/VOC2007/JPEGImages" --annotation "~/VOCdevkit/VOC2007/Annotations" --gpu 0.9
    
  2. Нажмите Ctrl+C, чтобы закончить тренировку, когда вы думаете, что потери больше не уменьшаются. Обычно хорошая потеря / потеря составляет 1 или ниже 1.

Вы бы заметили, что после каждых 250 шагов darkflow будет сохранять контрольные точки в ckpt/ каталог. Как только вы прекратите обучение, вы можете использовать любую из этих контрольных точек для проверки вашей модели.

  1. Мы запустим его на видео людей и позволим сохранить новое видео с предсказаниями с ограничивающими рамками. Давайте используем 1500-й шаг контрольной точки для этого примера.

    flow --model cfg/tiny-yolo-voc-1c.cfg --load 1500 --demo video-input.mp4 --gpu 0.9 --saveVideo
    

Когда вы запустите это, он покажет FPS, на котором модель может работать с вашим видео. Это может варьироваться в зависимости от вашей машины. В зависимости от FPS и продолжительности видео, это может занять некоторое время, чтобы закончить. Как только процесс закончится, у вас будет video.avi создано в darkflow/ каталог.

Это должно иметь только person тип объектов, обнаруженных в видео.

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

Надеюсь это поможет.

Из того, что я нашел, вы можете сделать это следующим образом:

  1. скопируйте исходный файл yolo cfg в новый файл и отредактируйте значение для классов в разделе [region], указав количество классов, которое вы хотите обнаружить.
  2. создайте текстовый файл метки и поместите имя класса, которое вы хотите обнаружить (подмножество исходных классов)

затем,

flow --model cfg/your_new_copied_file.cfg --load path/to/weight_file --demo your_video.mp4 --labels your_labels.txt --saveVideo

Вот и все.

Но проблема в том, что общая точность обнаружения значительно снижается. Часто он обнаруживает совершенно разные объекты как объекты в ярлыках. (может быть, Darkflow просто выберет наиболее уверенное предположение среди ярлыков, если оно выше порога?)

Итак, если вы хотите обнаружить только некоторые объекты среди других классов, пропуская другие объекты (то есть распознать их, но пропуская), я думаю, что лучше отредактировать источники darkflow, чтобы принять дополнительный параметр (например, --mark marklabels.txt).

Если вы хотите быстрых результатов без переобучения darknetофициальное предложение можно найти по адресу https://github.com/AlexeyAB/darknet/issues/2920#issuecomment-482810023, как ответил AlexeyAB, который я резюмирую следующим образом:

Просто добавь dont_showперед каждой строкой, кроме кота, собаки, человека здесь: https://github.com/AlexeyAB/darknet/blob/master/data/coco.names

и запустите (что-то вроде следующей команды):

       ./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights -thresh 0.25

Итак, для каждого класса, для которого вы не хотели бы выводить данные, например, person, в файле "coco.names" в первой строке:

      dont_show person

Остальные похожи, если вы тоже не хотите показывать.

Другие вопросы по тегам