Обучаем обнаружению объектов руками - yolov3

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

содержание

тренироваться

Алгоритм загрузки

Загрузите предварительно обученную модель с расширением .weights и преобразуйте файл веса в файл h5.

Изменить категорию.

Набор данных, помеченный Labelme, преобразуется в набор данных, обученный yolov3.

Запустите файл Kmeans.py для расчета якорей.

Измените файл train.py.

контрольная работа

Изменить йоло.py

Изменить yolo_video.py


Резюме

YOLOv3 — третья версия алгоритмов обнаружения целей серии YOLO (You Only Look Once).По сравнению с предыдущими алгоритмами, особенно для небольших целей, точность значительно улучшена. Обработка изображений 608x608 со скоростью 20 кадров в секунду на Pascal Titan X, на COCO test-devmAP@0.5Он достигает 57,9%, что аналогично результату RetinaNet (одноэтапная сеть, предложенная в документе FocalLoss), и в 4 раза быстрее.

По сравнению с YOLOV2, YOLOV3 имеет два основных улучшения:

  • Многомасштабное прогнозирование (подобно FPN)
  • Улучшенные базовые сети классификации (подобные ResNet) и классификаторы


Для понимания YOLOV3 вы можете обратиться к этим двум статьям:

1. Yolo v3 из серии Yolo [углубленный анализ]

blog.CSDN.net/Levi op cool/AR….

 

Общая структура YOLOV3

2. YOLOv3 сети обнаружения целей

Блог Woohoo.cn на.com/Makefile/afraid/…

тренироваться

Локальная среда: TensorFlow 1.15.3

                   Python 3.7

                   Keras 2.1.5

Алгоритм загрузки

Существует множество версий алгоритма yolo v3. Я предлагаю вам выбрать версию qqwweee для keras. Ее легче воспроизвести, а код относительно прост для понимания.

адрес гитхаба:GitHub.com/ 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000/Guest…

Загрузите предварительно обученную модель с расширением .weights и преобразуйте файл веса в файл h5.

ссылка для скачивания:Семья P Eddie.com/Media/files….

Создайте новую папку весов и поместите в нее загруженную модель. Затем измените файл convert.py

Удалите три параметра config_path, weightsPath и output_path. Как показано ниже:

 

Измените путь в основной функции.

def _main(args):

            config_path = "yolov3.cfg"

            weights_path = "weight/yolov3.weights"

            assert config_path.endswith('.cfg'), '{} is not a .cfg file'.format(

           config_path)

              assert weights_path.endswith(

         '.weights'), '{} is not a .weights file'.format(weights_path)

            output_path = "weight/yolov3.h5"

После завершения модификации нажмите «Выполнить».

 

Изменить категорию.

Файл категории, используемый yolo по умолчанию, — это coco_classes.txt, поэтому нам нужно изменить категорию этого файла на категорию набора данных. Набор данных, используемый в этом примере, имеет две категории: самолеты и масляные баки.

 

Набор данных, помеченный Labelme, преобразуется в набор данных, обученный yolov3.

Добавьте файл labelme2txt.py

from os import getcwd

import os

import json

import glob

wd = getcwd()

"labelme标注的json 数据集转为keras 版yolov3的训练集"

classes = ["aircraft","oiltank"]



image_ids = glob.glob(r"LabelmeData/*jpg")

print(image_ids)

list_file = open('train.txt', 'w')



def convert_annotation(image_id, list_file):

    jsonfile=open('%s.json' % (image_id))

    in_file = json.load(jsonfile)
    for i in range(0,len(in_file["shapes"])):

        object=in_file["shapes"][i]

        cls=object["label"]

        points=object["points"]

        xmin=int(points[0][0])

        ymin=int(points[0][1])

        xmax=int(points[1][0])

        ymax=int(points[1][1])

        if cls not in classes:

            print("cls not in classes")

            continue

        cls_id = classes.index(cls)

        b = (xmin, ymin, xmax, ymax)

        list_file.write(" " + ",".join([str(a) for a in b]) + ',' + str(cls_id))

    jsonfile.close()

for image_id in image_ids:

    list_file.write('%s.jpg' % (image_id.split('.')[0]))

    convert_annotation(image_id.split('.')[0], list_file)

    list_file.write('\n')

list_file.close()

Сгенерированное содержимое train.txt выглядит следующим образом:

 

Каждое изображение представляет собой строку классов x1, y1, x2, y2.

Запустите файл Kmeans.py для расчета якорей.

打开Kmeans.py文件,修改self.filename = "train.txt",然后运行,计算的结果会直接覆盖到yolo_anchors.txt
 

 

Измените файл train.py.

annotation_path = 'train.txt'

classes_path = 'model_data/coco_classes.txt'

anchors_path = 'model_data/yolo_anchors.txt'
model = create_model(input_shape, anchors, num_classes,

                            freeze_body=2, weights_path='weight/yolov3.h5')
这几个文件的路径按照上面文件的存放位置和名称修改。
注意57行和76行的batch_size按照电脑的配置去修改。

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

 

контрольная работа

Изменить йоло.py

mode_path изменяется на путь окончательной модели:

"model_path": 'logs/000/trained_weights_final.h5',

Изменить yolo_video.py

Удалите следующие параметры

parser.add_argument(
    '--model', type=str,
    help='path to model weight file, default ' + YOLO.get_defaults("model_path")
)

parser.add_argument(
    '--anchors', type=str,
    help='path to anchor definitions, default ' + YOLO.get_defaults("anchors_path")
)

parser.add_argument(
    '--classes', type=str,
    help='path to class definitions, default ' + YOLO.get_defaults("classes_path")
)

parser.add_argument(
    '--gpu_num', type=int,
    help='Number of GPU to use, default ' + str(YOLO.get_defaults("gpu_num"))
)

Измените параметр изображения на true

parser.add_argument(
    '--image', default=True, action="store_true",
    help='Image detection mode, will ignore all positional arguments'
)
修改detect_img的img路径
def detect_img(yolo):
    while True:
        img ="D:\keras-yolo3-master\LabelmeData/aircraft_4.jpg"

Результаты теста

 

Примеры этой статьи:download.CSDN.net/download/Хе-хе…