学会Yolo v4的使用,必然要学会如何使用Yolo v4进行训练,尤其是训练自己想要训练的数据集。如果觉得自己训练数据集比较麻烦的可以下载公开的已经标注好的数据集进行训练,如coco数据集、wider face数据集等,下载地址coco、wider face。
本系列博客主要介绍采用Yolo v4训练自己的数据集,因此先记录一下如何对自己的数据进行标记,以下是具体流程。
1、获取某个目标的若干照片,例如500张包含猫的照片;
2、对全部的图片进行随机分类,分为训练集和数据集(二者的比例自己确定),train_cat_imgs以及test_cat_imgs;
3、使用labelme标注工具对这些图片中的要识别的目标进行标记,标记的数据格式为json格式,即每张图片的label文件。labelme的具体使用方法参考标注工具labelme的使用这篇博客;
4、将上一步得到的json格式的数据集中放到一个文件夹内,然后将其全部转化为训练yolo所需要的txt格式的数据(写一个json2txt.py脚本进行转换),json2txt.py代码如下:
# -*- coding: UTF-8 -*-
#将生成的json文件转为为yolo训练需要的格式
import json
import os
import numpy as np
import cv2
json_root='path-to-your-json-files'
txt_root='path-you-want-to-save-txt-files'
files=os.listdir(json_root)
for i in range (0,len(files)):
name=files[i].split('.')[0]
json_name=os.path.join(json_root,files[i])
txt_name=os.path.join(txt_root,name+'.txt')
f_json=open(json_name,'r')
f_txt=open(txt_name,'w')
data=json.load(f_json)
shapes=data['shapes']
ww=data['imageWidth']
hh=data['imageHeight']
for j in range(0,len(shapes)):
points=shapes[j]['points']
points=np.array(points)
xs=points[:,0]
ys=points[:,1]
x_max=xs.max()
x_min=xs.min()
y_max=ys.max()
y_min=ys.min()
x_center=(x_min+x_max)/2
y_center=(y_min+y_max)/2
w=x_max-x_min
h=y_max-y_min
f_txt.write('0' + ' ')
f_txt.write(str(x_center / ww) + ' ')
f_txt.write(str(y_center / hh) + ' ')
f_txt.write(str(w / ww) + ' ')
f_txt.write(str(h / hh) + '\n')
f_txt.close()
f_json.close()
5、转化成txt文件之后,先来看看txt文件的格式:
<object-class> <x_center> <y_center> <width> <height>
数据例子:1 0.393098958333 0.531481481481 0.0455729166667 0.118518518519
<object-class> - 这是代表目标的类别号,范围是0-(classes-1);
<x_center> <y_center> <width> <height> 这几个值都归一化到(0.0 to 1.0]区间;
<x_center> <y_center> 是矩形框的中心。
6、将转化好的训练集中的图片所对应的txt文件放在train_cat_imgs文件夹中(即原图像和对应的txt文件放在同一个文件夹下);
7、编写脚本文件(label2train.py文件)生成train.txt和test.txt两个文件,train.txt的内容是全部训练数据的路径,作为训练用,label2train.py代码如下:
import os
from os import listdir, getcwd
from os.path import join
wd = 'path-to-your-jpg-files'
g = os.walk("path-to-your-jpg-files")
list_file = open('train.txt', 'w')
for path,d,filelist in g:
for filename in filelist:
if filename.endswith('jpg'):
list_file.write('%s/%s\n'%(wd, filename))
list_file.close()
至此,Yolo v4训练之前的数据准备工作就做好了,接下来就可以进行训练的步骤了。