1. 疾速开始我的项目:

    • 筹备本人的数据集
    • 创立对应的配置文件: 'data/xx.yaml'
    • 批改预训练的配置文件:'models/yolov5s.yaml'
    • 下载最新预训练模型到weights目录下
    • 开始训练:
      python train.py --img 640 --batch 16 --epochs 500 --data go.yaml --weights weights/yolov5s.pt
      (能够批改train.py中的相干参数的默认配置,不便下次训练)
    • 测试:

      python test.py  --data data/go.yaml --weights  E:\GDUT\python_project\ObjectDection\Yolov5\runs\train\exp13\weights\best.pt --augment
    • 检测:

      python detect.py --weight runs\train\exp14\weights\best.pt--source data/testImg
    • tensbard查看:

      tensorboard --logdir=runs
  2. 数据集的筹备:

    • 意识voc与yolo两种格局的数据集:
      voc数据的格局 :参考

      • folder: 文件夹
        filename:文件名
        database: 数据库名
        annotation: 标记文件格式
        size:图像尺寸,width宽、height高,depth通道数
        segmented: 宰割
        object, name: 标签名;
        pose:是否是姿态
        truncated:是否被截断;
        difficult:是否辨认艰难。
        bndbox, 边界框地位
      • https://www.cnblogs.com/sdu20...
      • https://www.sohu.com/a/333069...
      • 验证集+训练集不肯定等于你手头中的所有图片
        https://www.itdaan.com/blog/2...
    • yolo标签的格局(须要归一化) 参考

      <object-class> <x> <y> <width> <height>

      x,y是指标的核心坐标,width,height是指标的宽和高

  3. 训练集、验证集与测试集的抉择:

    • https://zhuanlan.zhihu.com/p/...
  4. 相干脚本:

    • 文件对立命名

      ## 将目录上面的图片从起始编号开始按程序命名import ospath=os.getcwd()print("以后所在门路:"+path)path=input("输出文件门路:")if(path[-1]!="\\"):path=path+"\\"# C:/Users/zh/Desktop/围棋数据集补充/数据集图片/a=input("输出起始编号:")type=input("文件后缀:")##创立文件夹# if not os.path.exists(res_path):#     os.makedirs(res_path)f=os.listdir(path)for index,i in enumerate(f):if os.path.isfile(path+i) and  (path+i).endswith("."+type):## 重命名并删除if  (os.path.exists(path+str(int(a)+index)+"."+type)):     print("文件名抵触")else:     os.rename(path+i,path+str(int(a)+index)+"."+type)
    • voc训练集与验证集以及测试集的划分

      # 参考:https://my.oschina.net/u/4870686/blog/4803148# 作用: 划分xml文件名到四个txt文件去# 阐明: 数据集全副拿来训练(其中80%作为训练集20%作为验证集),不留测试集train_and_valid=1.0train_percent = 0.8##输出xml文件门路:xml_file_path=input("请输出xml文件门路:")txt_save_path=input("将要保留的门路:")if(xml_file_path==""):xml_file_path='Annotations'if(txt_save_path==""):txt_save_path='ImageSets/Main'# xml文件对象total_xml = os.listdir(xml_file_path)if not os.path.exists(txt_save_path):os.makedirs(txt_save_path)num = len(total_xml)list_index = range(num)num_train_and_valid = int(num*train_and_valid)num_train = int(num_train_and_valid * train_percent)## 从数据集中抉择出用于训练的局部index_train_and_valid = random.sample(list_index,num_train_and_valid)##  训练集的编号(在上一步随机的根底上在随机筛选)index_train = random.sample(index_train_and_valid,num_train)file_train_and_valid = open(txt_save_path + '/trainval.txt', 'w')file_test = open(txt_save_path + '/test.txt', 'w')file_train = open(txt_save_path + '/train.txt', 'w')file_val = open(txt_save_path + '/val.txt', 'w')##for i in list_index:## 获取每个文件名(去除后缀)name = total_xml[i][:-4] + '\n'if i in index_train_and_valid :## 训练+验证file_train_and_valid.write(name)if i in index_train:     ## 训练     file_train.write(name)else:     ## 验证     file_val.write(name)## 测试集else:file_test.write(name)file_train_and_valid .close()file_train.close()file_val.close()file_test.close()
    • voc格局转yolo格局

      import xml.etree.ElementTree as ETimport osfrom os import getcwddir_type = ['train', 'val']classes = ["wdj"]   # 改成本人的类别abs_path = os.getcwd()print(abs_path)## voc to Yolodef convert(size, box):dw = 1. / (size[0])dh = 1. / (size[1])x = (box[0] + box[1]) / 2.0 - 1y = (box[2] + box[3]) / 2.0 - 1w = box[1] - box[0]h = box[3] - box[2]## 归一化x = x * dww = w * dwy = y * dhh = h * dhreturn x, y, w, hdef convert_annotation(image_id):## 读取xmlin_file = open('Annotations/%s.xml' % (image_id), encoding='UTF-8')## 创立 将要保留的文件out_file = open('labels/%s.txt' % (image_id), 'w')# xml工具tree = ET.parse(in_file)root = tree.getroot()size = root.find('size')## 图片的w\hw = int(size.find('width').text)h = int(size.find('height').text)## 多指标检测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:     continuecls_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))b1, b2, b3, b4 = b# 标注越界修改if b2 > w:     b2 = wif b4 > h:     b4 = hb = (b1, b2, b3, b4)bb = convert((w, h), b)out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')wd = getcwd()##   E:\GDUT\python_project\ObjectDection\dataset\wdj2test_file=open("file.txt","w")test_file.write("测试内容")##别离读取三个划分文件:for dir in dir_type:if not os.path.exists('labels/'):os.makedirs('labels/')##从划分的txt文件中获取图片idimage_ids = open('ImageSets/Main/%s.txt' % (dir)).read().strip().split()##根目录创立txt文件保留图片绝对路径:##list_file = open('%s.txt' % (dir), 'w')for image_id in image_ids:## 图片写入指定的目录##list_file.write(abs_path + '\\JPGEImages\\%s.jpg\n' % (image_id))convert_annotation(image_id)##list_file.close()
    • yolo数据集中训练集、验证集、测试集的划分

      ## 将yolo数据集的格局 依照比例进行划分 用于训练# 训练集、验证集和测试集的比例调配test_percent = 0valid_percent = 0.2train_percent = 0.8# 标注文件的门路srcImg_path=input("源图片门路:")label_path=input("标签文件路劲:")if(srcImg_path==""):image_path = 'JPEGImages'if(label_path==""):label_path = 'labels'##指标存储文件夹:save_path=input("Yolo数据集存储地位:")if(save_path[-1]!="\\"):save_path=save_path+"\\"##获取文件夹下的文件对象images_files_list = os.listdir(image_path)labels_files_list = os.listdir(label_path)total_num = len(images_files_list)test_num = int(total_num * test_percent)valid_num = int(total_num * valid_percent)train_num = int(total_num * train_percent)# 对应文件的索引test_image_index = random.sample(range(total_num), test_num)valid_image_index = random.sample(range(total_num), valid_num)train_image_index = random.sample(range(total_num), train_num)dir=["train","valid","test"]sub_dir=["images","labels"]for d in dir:if not os.path.exists(save_path+d):os.makedirs(save_path+d)for sd in sub_dir:if not os.path.exists(save_path+d+"/"+sd):     os.makedirs(save_path+d+"/"+sd)for i in range(total_num):if i in test_image_index:# 将图片和标签文件拷贝到对应文件夹下shutil.copyfile('JPEGImages/{}'.format(images_files_list[i]), save_path+'test/images/{}'.format(images_files_list[i]))shutil.copyfile('labels/{}'.format(labels_files_list[i]), save_path+'test/labels/{}'.format(labels_files_list[i]))elif i in valid_image_index:shutil.copyfile('JPEGImages/{}'.format(images_files_list[i]), save_path+'valid/images/{}'.format(images_files_list[i]))shutil.copyfile('labels/{}'.format(labels_files_list[i]), save_path+'valid/labels/{}'.format(labels_files_list[i]))else:shutil.copyfile('JPEGImages/{}'.format(images_files_list[i]), save_path+'train/images/{}'.format(images_files_list[i]))shutil.copyfile('labels/{}'.format(labels_files_list[i]), save_path+'train/labels/{}'.format(labels_files_list[i]))