darknet包的下载
AlexeyAB版
github
编译
进入darknet文件夹
vim Makefile
按需设置,比如将opencv、gpu、cudnn设为1;
然后执行:
make
下载yolov4.weights文件
github
放置在darknet目录下
数据集
数据集下载
按照官方推荐,下载coco2017版本的数据集
数据集下载
数据集介绍
COCO通过大量使用Amazon Mechanical Turk来收集数据。
COCO数据集现在有3种标注类型:object instances(目标实例), object keypoints(目标上的关键点), 和image captions(看图说话),使用JSON文件存储。
数据处理
1.在/data
下新建文件夹coco2017
进入/data/coco2017
,
按照如下方式放置:
——coco2017
————train(训练集图片文件夹)
————val(验证集图片文件夹)
————test(测试集图片文件夹)
————instances_train2017.json(训练集标签)
————instances_val2017.json(验证集标签)
————image_info_test-dev2017.json(测试集标签)
注意:测试集标签文件中没有位置数值信息。
2.在/coco2017
下依次输入以下命令:
find `pwd`/train -name \*.png > train.list
find `pwd`/val -name \*.png > val.list
find `pwd`/test -name \*.png > test.list
执行完后在/coco2017
生成train.list、val.list、test.list三个文件夹
3.因为darknet_yolov4的训练需要txt标签文件,因此需要将json文件转为txt文件。
3.1. 在/coco2017
下新建transform.py
from pycocotools.coco import COCO
import numpy as np
import tqdm
import argparse
def arg_parser():
parser = argparse.ArgumentParser('code by rbj')
parser.add_argument('--annotation_path', type=str,
default='data/coco/annotations/instances_train2017.json')
parser.add_argument('--save_base_path', type=str, default='data/coco/labels/train2017/')
args = parser.parse_args()
return args
if __name__ == '__main__':
args = arg_parser()
annotation_path = args.annotation_path
save_base_path = args.save_base_path
data_source = COCO(annotation_file=annotation_path)
catIds = data_source.getCatIds()
categories = data_source.loadCats(catIds)
categories.sort(key=lambda x: x['id'])
classes = {}
coco_labels = {}
coco_labels_inverse = {}
for c in categories:
coco_labels[len(classes)] = c['id']
coco_labels_inverse[c['id']] = len(classes)
classes[c['name']] = len(classes)
img_ids = data_source.getImgIds()
for index, img_id in tqdm.tqdm(enumerate(img_ids), desc='change .json file to .txt file'):
img_info = data_source.loadImgs(img_id)[0]
file_name = img_info['file_name'].split('.')[0]
height = img_info['height']
width = img_info['width']
save_path = save_base_path + file_name + '.txt'
with open(save_path, mode='w') as fp:
annotation_id = data_source.getAnnIds(img_id)
boxes = np.zeros((0, 5))
if len(annotation_id) == 0:
fp.write('')
continue
annotations = data_source.loadAnns(annotation_id)
lines = ''
for annotation in annotations:
box = annotation['bbox']
# some annotations have basically no width / height, skip them
if box[2] < 1 or box[3] < 1:
continue
#top_x,top_y,width,height---->cen_x,cen_y,width,height
box[0] = round((box[0] + box[2] / 2) / width, 6)
box[1] = round((box[1] + box[3] / 2) / height, 6)
box[2] = round(box[2] / width, 6)
box[3] = round(box[3] / height, 6)
label = coco_labels_inverse[annotation['category_id']]
lines = lines + str(label)
print(lines)
for i in box:
lines += ' ' + str(i)
lines += '\n'
fp.writelines(lines)
print('finish')
3.2.在/coco2017
下执行
python --annotation_path ./instances_train2017.json --save_base_path ./train2017/
python --annotation_path ./instances_val2017.json --save_base_path ./val2017/
在/train2017
和/val2017
下便生成针对每张图片的txt标签文件
配置文件的设置
1.在/cfg
下vim coco.data
classes= 80
train = /home/……(your filepath)/data/coco2017/train.list
valid =/home/……(your filepath)/data/coco2017/val.list
#valid = /home/……(your filepath)/data/coco2017/test.list
names = data/coco.names
backup = backup/
eval=coco
2.在/cfg
下vim coco.names
(默认就有)
每行分别放置类名,共80类。
测试
测试一张图
./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -ext_output data/dog.jpg
训练
从头开始训练:
./darknet detector train cfg/coco.data cfg/yolov4.cfg -clear > train_log.txt 2>&1
弹出一个yolov4.png的文件,显示出loss和literation值,
并且在darknet文件夹下生成train_log.txt记录日志文件。
最后也会生成一个yolov4_last.weights文件
验证
map计算
./darknet detector map ./cfg/coco.data ./cfg/yolov4.cfg ./yolov4_last.weights
./darknet detector map ./cfg/coco.data ./cfg/yolov4.cfg ./yolov4.weights -thresh 0.25 -map
PS:
yolov3
假如用yolov3,并加上预训练模型 darknet53.conv.74 ,则:
./darknet detector train cfg/coco.data cfg/yolov3.cfg darknet53.conv.74 -map > train_log_yolov3_210414.txt 2>&1
./darknet detector map ./cfg/coco.data ./cfg/yolov4.cfg ./yolov4_last.weights
resnet50
./darknet classifier train cfg/cifar.data cfg/resnet50.cfg
time ./darknet classifier valid cfg/cifar.data cfg/resnet50.cfg ./resnet50.weights