写在前面:本文仅就csdn中yolo系列的大部分教程踩坑记录最终得出的一个最简洁最流畅的流程,本人非计算机专业,水平有限,仅适合想要快速入门YOLO训练自己的数据集以及如何使用模型进行目标检测的同学,个人记录的同时希望可以帮到大家。
文章目录
环境配置
solution 1: 淘宝花几十块找专人帮你配置,对环境配置不是很熟悉的话这个很方便,因为自己配置的话总是会有各种各样的报错,较快。
solution 2:其他教程讲的很详细了不再赘述
🌟🌟数据集准备
拍想要检测物体的视频
手机拍即可,建议时长2min以上,后期截取数据集就比较多了,训练的准确度自然有所提升
截取视频流截图
如果宁用的也是🍎手机的话会很方便直接使用快捷指令,设置如下图,可以根据自身需求修改一些参数:(注意此时图片名字比较乱没关系)
如果宁用的不是的话可以百度找其它视频转图片的应用,后期注意命名。
数据集文件结构
新建如下目录结构,建在哪无所谓:
将截取好的照片先全部放入images下的train文件夹下以便于批量重命名。
批量重命名(重要‼️)
一定要将图片名字改的整齐划一之后再进行打标,打标是个废事的操作,如果前期没有重命名后面会前功尽弃。
这里我是用的python进行批量重命名为images+数字,代码如下:
【要使用的话要将路径改为自己的图片所放文件夹的绝对路径,命名方式也可进行修改】
import os
def myrename(path):
file_list=os.listdir(path)
for i,fi in enumerate(file_list):
old_dir=os.path.join(path,fi)
filename="images"+str(i+1)+"."+str(fi.split(".")[-1])
new_dir=os.path.join(path,filename)
try:
os.rename(old_dir,new_dir)
except Exception as e:
print(e)
print("Failed!")
else:
print("SUcess!")
if __name__=="__main__":
path="/home/jiabei/wetest/data/images/train"
myrename(path)
在全部命名好后,随意挑选一部分照片放到val文件夹中作为验证集,数量无需太多。很多教程里会采用自动分类列表这样的,我在此处浪费了很多时间,其实完全没必要,自己随便选一些就可以我们放到对应的文件夹中也不会乱。
打标签
下载labelImg放到合适的位置
打开界面后设置打开目录的位置(images下的train和val要分别打标签)和存放目录的位置(对应的xml文件夹下的train或者val,和images文件夹下保持对应),自动保存即可开始漫长的打标签啦!
打标签就是创建区块后命名类别,多个目标就多个区块即可,这里需要提醒的是一定要用快捷键,能省不少事:
a上一张图d下一张图w创建区块
voc格式(xml文件)转yolo归一txt文件(重要❗️)
在打完标签操作后xml文件夹中的train和val都应该有对应的.xml文件了,但是yolo不能识别xml文件我们需要将其转化为txt文件放入对应的labels文件夹中。
转化格式的代码如下:【后面加有备注的五处地方根据自己的实际情况进行修改】
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
classes = [ 'redcone','bluecone','jiabei','ikun-Jack']#5
def convert(size, box):
dw = 1./(size[0])
dh = 1./(size[1])
x = (box[0] + box[1])/2.0 - 1
y = (box[2] + box[3])/2.0 - 1
w = box[1] - box[0]
h = box[3] - box[2]
x = x*dw
w = w*dw
y = y*dh
h = h*dh
return (x,y,w,h)
def convert_annotation(rootpath,xmlname):
xmlpath = rootpath + '/xml2/val' #1
xmlfile = os.path.join(xmlpath,xmlname)
with open(xmlfile, "r", encoding='UTF-8') as in_file:
txtname = xmlname[:-4]+'.txt'
print(txtname)
txtpath = rootpath + '/labels/val' #2
if not os.path.exists(txtpath):
os.makedirs(txtpath)
txtfile = os.path.join(txtpath,txtname)
with open(txtfile, "w+" ,encoding='UTF-8') as out_file:
tree=ET.parse(in_file)
root = tree.getroot()
size = root.find('size')
w = int(size.find('width').text)
h = int(size.find('height').text)
out_file.truncate()
for obj in root.iter('object'):
difficult = obj.find('difficult').text
cls = obj.find('name').text
if cls not in classes or int(difficult)==1:
continue
cls_id = classes.index(cls)
xmlbox = obj.find('bndbox')
b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
bb = convert((w,h), b)
out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
if __name__ == "__main__":
rootpath='/home/jiabei/realcone/data' #3
xmlpath=rootpath+'/xml2/val' #4
list=os.listdir(xmlpath)
for i in range(0,len(list)) :
path = os.path.join(xmlpath,list[i])
if ('.xml' in path)or('.XML' in path):
convert_annotation(rootpath,list[i])
print('done', i)
else:
print('not xml file',i)
分别将xml文件夹中的train和Val转化到labels下的对应的文件夹中。
该步骤后laels文件夹中应有对应的txt文件。
🌟配置各种文件
参数文件配置
主要修改path,train,val,nc,names:⚠️train和val文件夹位置要对应到train和val(图中有误)
模型文件配置
主要修改nc数
开始训练
主要修改train.py
主要是两个配置文件位置的修改,迭代次数两百到三百一般足够了
训练成功标识:结果在runs下的train文件夹下
开始目标检测
主要修改detect.py:1.权重文件路径,在训练好的runs下面有2.检测对象路径3.参数配置文件路径