YoloV4 Combat: научим обнаруживать объекты вручную - YOLOV4 (pytorch)

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

содержание

Резюме

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

Скачать код

Загрузите файл весов

Сделать набор данных

Установите необходимые пакеты для запуска

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

Измените файл конфигурации cfg.py.

Изменить models.py

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

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


Резюме

YOLOV4 достиг 43,5% AP на кокосе и 65 кадров в секунду на Tesla V100. По сравнению с другими моделями этого года оценка невысокая, но она улучшает оценку не за счет увеличения разрешения входного изображения, а за счет улучшения структуры сети. Нововведения в основном включают следующие аспекты:

(1) Входная часть: инновация здесь относится к улучшению входной части во время обучения, в основном включая улучшение данных Mosaic, cmBN и обучение самоконфронтации SAT.

(2) Магистральная сеть BackBone: сочетание различных новых методов, в том числе: CSPDarknet53, функция активации Mish, Dropblock.

(3) Шейка: Сеть обнаружения целей часто вставляет некоторые слои между BackBone и конечным выходным слоем, например, модуль SPP и структуру FPN+PAN в Yolov4.

(4) Прогноз: механизм якоря выходного слоя такой же, как у Yolov 3. Основное улучшение - функция потерь CIOU_Loss во время обучения, а nms, экранированный блоком прогнозирования, становится DIOU_nms

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

Местная среда:

   Ubuntu20.04

   pytorch1.5.1

   CUDA10.1

   Python3.7

скачать код

Код, используемый в этой статье:GitHub.com/TI Ан Сяомо/…

И обучающий, и тестовый код вывода завершены.

Загрузите файл весов

yolov4.conv.137.pth

Ссылка один:disk.baidu.com/yes/1o VB IE4YY…Код извлечения: kcel

Ссылка два:

drive.Google.com/open?ID=1 очень…

Поместите загруженный файл веса в папку данных

 

Сделать набор данных

Адрес набора данных:download.CSDN.net/download/Хе-хе…

Скопируйте набор данных Labelme в папку pytorch-YOLOv4-master, как показано на рисунке:

Затем используйте pycharm для создания нового файла labelme2txt.py. Напишите код для создания обучающих и проверочных наборов.

код labelme2txt.py:

from os import getcwd
from sklearn.model_selection import train_test_split
import json
import glob
wd = getcwd()
"labelme отмечен json Преобразование набора данных в версию pytorch yolov4 тренировочный набор "
classes = [ "aircraft" , "oiltank" ]

image_ids = glob.glob(r"LabelmeData/*jpg" )
print(image_ids)
train_list_file = open( 'data/train.txt' , 'w' )
val_list_file = open( 'data/val.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()

def ChangeData2TXT(image_List,dataFile):
for image_id in image_List:
dataFile.write( '%s' % (image_id.split( ' \\ ' )[-1]))
convert_annotation(image_id.split( '.' )[0], dataFile)
dataFile.write( ' \n ' )
dataFile.close()
trainval_files, test_files = train_test_split(image_ids, test_size=0.2, random_state=55)
ChangeData2TXT(trainval_files,train_list_file)
ChangeData2TXT(test_files,val_list_file)

Установите необходимые пакеты для запуска

Чтобы установить пакеты, недоступные на машине, обратитесь к файлу requirements.txt. Версии могут не совпадать. Если позже не будет сообщений об ошибках, все будет в порядке.

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

将coco.names和voc.names里面的类别修改为自己数据集的类别(默认是coco.names,都改了肯定没有错。),顺序和labelme2txt.py中的classes顺序保持一致。

Измените файл конфигурации cfg.py.

Cfg.use_darknet_cfg = False

Cfg.batch = 2 (модифицировано в соответствии с вашей собственной видеокартой, моя видеокарта 8G и может обучать до 2-х пакетов).

Cfg.subdivisions = 1

Изменить models.py

Измените inplace=True в строках 51 и 53 на inplace=False. Если его не изменить, во время обучения будет сообщено об ошибке.

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

Найдена строка 526, параметры этого метода являются обновлениями параметров в cfg.py.

Основные измененные параметры следующие:

parser.add_argument( '-g' , '--gpu' , metavar= 'G' , type=str, default= '0' ,
help= 'GPU' , dest= 'gpu')#установить графический процессор, используемый графическим процессором

parser.add_argument( '-dir' , '--data-dir' , type=str, default= "LabelmeData" ,
help= 'dataset dir' , dest= 'dataset_dir')#Папка, в которой находится изображение.

                  parser.add_argument( '-pretrained' , type=str, default= "data/yolov4.conv.137.pth" , help= 'pretrained yolov4.conv.137')#Установите путь к файлу предварительно обученных весов.

                  parser.add_argument( '-classes' , type=int, default=80, help= 'dataset classes')#Количество категорий объектов.

parser.add_argument( '-train_label_path' , dest= 'train_label' , type=str, default= 'data/train.txt' , help= "train label path")#Путь, где хранится тренировочный набор.

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

После изменения вышеуказанного содержимого вы можете нажать «Выполнить», чтобы начать тренировку.

 

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

Тест в основном модифицирует код models.py. Замените приведенный ниже код со строки 449.

 

if __name__ == "__main__":

    import sys

    import cv2



    namesfile = None

    n_classes=2

    weightfile="checkpoints/Yolov4_epoch151.pth" 

    imgfile="data/aircraft_4.jpg"#待测试的图片

    width=608

    height=608

    model = Yolov4(yolov4conv137weight=None, n_classes=n_classes, inference=True)



    pretrained_dict = torch.load(weightfile, map_location=torch.device('cpu'))

#如果使用GPU则改为:

#pretrained_dict = torch.load(weightfile, map_location=torch.device('cuda'))

    model.load_state_dict(pretrained_dict)

use_cuda = True
if use_cuda:
model.cuda()

img = cv2.imread(imgfile)

# Inference input size is 416*416 does not mean training size is the same
# Training size could be 608*608 or even other sizes
# Optional inference sizes:
#   Hight in {320, 416, 512, 608, ... 320 + 96 * n}
#   Width in {320, 416, 512, 608, ... 320 + 96 * m}
sized = cv2.resize(img, (width, height))
sized = cv2.cvtColor(sized, cv2.COLOR_BGR2RGB)

from tool.utils import load_class_names, plot_boxes_cv2
from tool.torch_utils import do_detect

for i in range(2):  # This 'for' loop is for speed check
# Because the first iteration is usually longer
boxes = do_detect(model, sized, 0.4, 0.6, use_cuda)

if namesfile == None:
if n_classes == 2:
namesfile = 'data/voc.names'
elif n_classes == 80:
namesfile = 'data/coco.names'
else:
print("please give namefile")

class_names = load_class_names(namesfile)
resultImg=plot_boxes_cv2(img, boxes[0], 'predictions.jpg', class_names)
cv2.imshow("image",resultImg)
cv2.waitKey(0);

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

Ссылка на источник:download.CSDN.net/download/Хе-хе…

Справочная статья:

Полное объяснение основных базовых знаний Yolov3 и Yolov4 из серии Yolo.

blog.CSDN.net/мужчина 35565560…