содержание
Установите необходимые пакеты для запуска
Измените файл конфигурации cfg.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.