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

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

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

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

Спасибо


person Tejas Somaiya    schedule 21.06.2017    source источник


Ответы (2)


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

В репозитории darkflow есть специальный раздел, в котором точно указано, что нужно сделайте, если хотите получить другой результат. TL; DR - вам следует переобучить вашу модель. Они показывают это на примере трех классов.

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

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

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

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

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

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

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

  5. Загрузите VOC Dataset, потому что он содержит достаточно данных и аннотаций для нашего типа объекта 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 for VOC dataset. После загрузки переместите файл в каталог /darkflow/bin/.

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

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

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

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

    # 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 типа объектов.

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

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

person Bhavul    schedule 19.05.2018
comment
Я думаю, вам следует установить filters=18 для обнаружения одного класса. Я видел формулу filters= num/3*(classes+1+4) с num = 3 для малых, средних и больших объектов. github.com/pjreddie/darknet/issues/582 - person craq; 16.07.2018

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

  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).

person JP Kim    schedule 18.07.2017