R-CNN: Train Faster Модель VGG-16 R-CNN с собственными данными

искусственный интеллект

Недавно я изучаю модель Faster R-CNN, Чтобы понять структуру сети, набор данных PascalVOC используется для расширения категорий сети (всего 20 категорий). Процесс делится на: подготовка данных ==> изменение связанного файла ==> обучение сети ==> тестирование


1. Подготовка данных

(1) Загрузите набор данных:

Официальное зеркало набора данных веб-сайта:Семья P Eddie.com/projects/ Боюсь… Паскаль набор данных VOCИмеются изображения, необходимые для обучения, соответствующие файлы аннотаций (xml) и текстовые файлы (txt) с указанием положительных и отрицательных образцов, которые размещаются в главном каталоге JPEGImage, Annotations и ImageSets в каталоге VOC2007 или VOC2012 соответственно.

(2) Маркировка данных:

Целью этого тренинга является расширение 3 категорий на основе первоначальных 20 категорий, а именно чашка, окно, стаканы. Инструменты маркировки используют LabelImage :адрес загрузки гитхаб

Для запуска требуется безопасный PyQt и другие связанные зависимости.

После загрузки запустите файл LabelImage.py, интерфейс выглядит следующим образом:

«Открыть реж.»Указывает путь к файлу;"Изменить папку сохранения"Указывает путь к сохраненному файлу xlm. Общие сочетания клавиш по умолчанию:"ж"для рамы,"а"для предыдущего изображения,"д"для следующей картинки,"Ctrl + S"для сохранения xml-файла.

Если вы хотите изменить сочетания клавиш, вы можете открыть файл LabelImage.py и изменить его в следующем коде (от 213 до 276 строк):

...
        openNextImg = action('&Next Image', self.openNextImg,    //里面有快捷键的功能和快捷键
                             'd', 'next', u'Open Next')          //第三个参数('d')就是快捷键,可以修改

        openPrevImg = action('&Prev Image', self.openPrevImg,
                             'a', 'prev', u'Open Prev')

        verify = action('&Verify Image', self.verifyImg,
                        'space', 'verify', u'Verify Image')

        save = action('&Save', self.saveFile,
                      'ctrl+s'', 'save', u'Save labels to file', enabled=False)
...

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

Если вы хотите изменить предварительно выбранную категорию, вы можете$LabelImage_ROOT/dataвнутриpredefined_classes.txtизменено в.

После маркировки данных необходимо создать четыре текстовых файла, а именно: class_train.txt, class_trainval.txt, class_val.txt и class_test.txt.

Формат контента следующий:

2008_000008 -1
2008_000015 -1
2008_000019 -1
2008_000023 -1
2008_000028 -1
2008_000033  1
2008_000036 -1
2008_000037  1
2008_000041 -1
2008_000045 -1
2008_000053 -1
2008_000060 -1
...

(3) Адрес хранения данных:

После подготовки данных, jpg файлы помещаются в \py-faster-rcnn\data\VOCdevkit2007\VOC2007\JPEGImage\ xml в \py-faster-rcnn\data\VOCdevkit2007\VOC2007\Annotations\ txt в \py-faster-rcnn\data\VOCdevkit2007\VOC2007\ImageSets\Main\ Обратите внимание, что каждой категории в txt соответствуют файлы train, val, trainval и test.Чтобы сделать это в соответствии с исходным форматом данных, вам нужно сгенерировать его самостоятельно.

2. Обучение сети

Перед началом обучения необходимо изменить некоторые сетевые файлы и загрузить предварительно обученную модель ImageNet.

(1) Измените соответствующие файлы конфигурации

1. cd $FRCN_ROOT/lib/datasets,Исправлятьpascal_voc .py, добавьте свой собственный класс

        self._classes = ('__background__', # always index 0
                         'aeroplane', 'bicycle', 'bird', 'boat',
                         'bottle', 'bus', 'car', 'cat', 'chair',
                         'cow', 'diningtable', 'dog', 'horse',
                         'motorbike', 'person', 'pottedplant',
                         'sheep', 'sofa', 'train', 'tvmonitor', 'cup', 'window', 'glasses')

2. cd $FRCN_ROOT/lib/datasets,Исправлятьimdb.py, существуетboxes[:, 2] = widths[i] - oldx1 -1Добавьте три строки после него, как показано ниже:

...
    boxes[:, 2] = widths[i] - oldx1 -1
    for b in range(len(boxes)):
        if boxes[b][2] < boxes[b][0]:
            boxes[b][0] = 0 
...

3.Исправлятьtrain.prototxtиtest.prototxtЗамените все 21 на 24, это число равно количеству категорий + фон = 23 + 1, и измените его в соответствии с количеством категорий. Затем замените все 84 на 96. Это число (количество категорий + фон) × 4 = 96, которое также изменяется в соответствии с вашей собственной категорией.

4.изменить все.ptдокумент Как и выше, замените все 21 на 24 и все 84 на 96.

(2) Загрузите модель ImageNet

При обучении необходимо использовать предварительно обученную модель ImageNet, поэтому необходимо подготовить:cd $FRCN_ROOT Запустите файл сценария:./data/scripts/fetch_imagenet_models.shВозможно, для загрузки потребуется перевернуть стену или скорость загрузки будет низкой. Вы можете скачать его онлайн.

(3) Очистить кеш

Удалить файлы кеша:

$FRCN_ROOT/data/VOCdevkit2007/annotations_cache/annots.pkl $FRCN_ROOT/data/cache pkl-файл под Если кэш не очищается, может появиться сообщение об ошибке.

(4) Начать обучение

Убедившись, что все шаги подготовки выполнены правильно, можно приступать к обучению. Команда выглядит следующим образом:

cd $FRCN_ROOT ./experiments/scripts/faster_rcnn_end2end.sh [GPU_ID] [NET] [dataset]

Первый параметр указывает GPU, используемый для обучения, второй указывает, какую сеть обучать, здесь используется VGG16, а третий — указанный набор данных, здесь pascal_voc

Например:

./experiments/scripts/faster_rcnn_end2end.sh 0 VGG16 pascal_voc

Каждая итерация обучения занимает около 0,2 с, 70 000 итераций, снимок создается каждые 10 000 раз.Обучение занимает около 4 часов.Обученная сеть сохраняется в:

$FRCN_ROOT/output/faster_rcnn_end2end/voc_2007_trainval

(5) Проблемы, возникающие при обучении

Я все еще сталкиваюсь с различными ошибками во время обучения.Я суммировал проблемы, с которыми я столкнулся, следующим образом, для справкиПроблемы, возникающие при обучении и тестировании моделей Faster R-CNN.

3. Тестовая сеть

После завершения обучения сети, если есть тестовый набор, он автоматически запустит тест и, наконец, выведет среднюю точность (AP) и среднее AP всех классов:

==В дополнение к обучению модели VGG16 я также обучил еще один ResNet-50.При обучении ResNet-50 я изменил масштаб сгенерированных якорей, добавил два маленьких якоря и улучшил точность обнаружения.AP для сравнения . ==

Можно обнаружить, что AP всех категорий остаточной сети улучшилась, а некоторые категории значительно улучшились:

Вверху: mAP сети VGG16 Внизу: mAP сети ResNet-50

Поскольку в официальном файле нет файла обучения сети ResNet, вы можете обратиться кТренируйте быстрее модель ResNet-50 R-CNN с собственными данными.