YOLO v5训练人脸数据集小记

5 篇文章 0 订阅
4 篇文章 0 订阅
该博客详细介绍了如何构建VOC2007数据集,包括图像、标注文件的组织,使用Python脚本进行数据集划分和标签转换。接着,创建了用于YOLOv5训练的yaml配置文件,并提供了训练参数的修改建议,以适应face检测任务。最后,展示了完成后的数据集结构和训练配置。
摘要由CSDN通过智能技术生成

1、制作voc2007数据集

2007标准格式为:
在这里插入图片描述

(1)2007具体结构内容如下:

C:\Users\lindsay\Desktop\yolov5\data\VOC2007\images存放我的jpg图片
在这里插入图片描述

C:\Users\lindsay\Desktop\yolov5\data\VOC2007\Annotations存放对应的xml文件
在这里插入图片描述
C:\Users\lindsay\Desktop\yolov5\data\VOC2007\ImageSets\Main存放划分的训练集、验证集等图片名称的txt文档
在这里插入图片描述

(2)运行voc2yolo4.py划分数据集

import os
import random 

xmlfilepath=r'Annotations'
saveBasePath=r"ImageSets/Main/"

trainval_percent=0.66
train_percent=0.5

temp_xml = os.listdir(xmlfilepath)
total_xml = []
for xml in temp_xml:
  if xml.endswith(".xml"):
    	total_xml.append(xml)

num=len(total_xml)  
list=range(num)  
tv=int(num*trainval_percent)  
tr=int(tv*train_percent)  
trainval= random.sample(list,tv)  
train=random.sample(trainval,tr)  

print("train and val size",tv)
print("traub suze",tr)
ftrainval = open(os.path.join(saveBasePath,'trainval.txt'), 'w')  
ftest = open(os.path.join(saveBasePath,'test.txt'), 'w')  
ftrain = open(os.path.join(saveBasePath,'train.txt'), 'w')  
fval = open(os.path.join(saveBasePath,'val.txt'), 'w')  

for i  in list:  
	name=total_xml[i][:-4]+'\n'  
	if i in trainval:  
   		 ftrainval.write(name)  
   		 if i in train:  
        	ftrain.write(name)  
   		 else:  
       		 fval.write(name)  
	else:  
    		ftest.write(name)  

ftrainval.close()  
ftrain.close()  
fval.close()  
ftest .close()

运行完毕后在C:\Users\lindsay\Desktop\yolov5\data\VOC2007\ImageSets\Main生成了划分的训练集、验证集等图片名称的txt文档

(3)运行voc_label.py生成对应图片的label的坐标:

# -*- coding: utf-8 -*-


import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

sets = ['train', 'val', 'test']
classes = ['face']

abs_path = os.getcwd()


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(image_id):
    in_file = open('C:/Users/lindsay/Desktop/yolov5/data/VOC2007/Annotations/%s.xml' % (image_id))
    out_file = open('C:/Users/lindsay/Desktop/yolov5/data/VOC2007/labels/%s.txt' % (image_id), 'w')
    tree = ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = 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:
            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')


wd = getcwd()
for image_set in sets:
    if not os.path.exists('C:/Users/lindsay/Desktop/yolov5/data/VOC2007/labels/'):
        os.makedirs('C:/Users/lindsay/Desktop/yolov5/data/VOC2007/labels/')
    image_ids = open('C:/Users/lindsay/Desktop/yolov5/data/VOC2007/ImageSets/Main/%s.txt' % (image_set)).read().strip().split()
    list_file = open('%s.txt' % (image_set), 'w')
    for image_id in image_ids:
        list_file.write('C:/Users/lindsay/Desktop/yolov5/data/VOC2007/images/%s.jpg\n' % (image_id))
        convert_annotation(image_id)
    list_file.close()
    # os.system("cat 2007_train.txt 2007_val.txt > train.txt")

运行完毕后在C:\Users\lindsay\Desktop\yolov5\data\VOC2007\labels里面生成了如下文件:
在这里插入图片描述
在C:\Users\lindsay\Desktop\yolov5\data生成test、train、val三个文件,文件里包含了图片的路径以及名称
在这里插入图片描述

(4)完成以上步骤后整体数据集结构如下:

VOC2007
    -Annotations
        -xxx.xml
    -images
        -xxx.jpg
    -ImageSets
        -Main
            -train.txt
            -trainval.txt
            -test.txt
            -val.txt
    -labels
        -xxx.txt

2、创建两个yaml文件

创建./data/voc2007.yaml

train: C:/Users/lindsay/Desktop/yolov5/data/train.txt  

val:  C:/Users/lindsay/Desktop/yolov5/data/val.txt   

 
# number of classes
nc: 1
 
# class names
names: ['face']

创建./models/yolov5s.yaml

# parameters
nc: 1  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple

# anchors
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

# YOLOv5 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Focus, [64, 3]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, BottleneckCSP, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 9, BottleneckCSP, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, BottleneckCSP, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 1, SPP, [1024, [5, 9, 13]]],
   [-1, 3, BottleneckCSP, [1024, False]],  # 9
  ]

# YOLOv5 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, BottleneckCSP, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, BottleneckCSP, [256, False]],  # 17 (P3/8-small)

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, BottleneckCSP, [512, False]],  # 20 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, BottleneckCSP, [1024, False]],  # 23 (P5/32-large)

   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

对train代码进行如下修改:

parser = argparse.ArgumentParser()
parser.add_argument('--weights', type=str, default='yolov5s.pt', help='initial weights path')
parser.add_argument('--cfg', type=str, default='yolov5s.yaml', help='model.yaml path')
parser.add_argument('--data', type=str, default='C:/Users/lindsay/Desktop/yolov5/data/voc2007.yaml', help='data.yaml path')
parser.add_argument('--hyp', type=str, default='', help='hyperparameters path, i.e. data/hyp.scratch.yaml')
parser.add_argument('--epochs', type=int, default=300)
parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs')
parser.add_argument('--img-size', nargs='+', type=int, default=[640, 640], help='[train, test] image sizes')
parser.add_argument('--rect', action='store_true', help='rectangular training')
parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')
parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')
parser.add_argument('--notest', action='store_true', help='only test final epoch')
parser.add_argument('--noautoanchor', action='store_true', help='disable autoanchor check')
parser.add_argument('--evolve', action='store_true', help='evolve hyperparameters')
parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')
parser.add_argument('--cache-images', action='store_true', help='cache images for faster training')
parser.add_argument('--image-weights', action='store_true', help='use weighted image selection for training')
parser.add_argument('--name', default='', help='renames results.txt to results_name.txt if supplied')
parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%')
parser.add_argument('--single-cls', action='store_true', help='train as single-class dataset')
parser.add_argument('--adam', action='store_true', help='use torch.optim.Adam() optimizer')
parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')
parser.add_argument('--local_rank', type=int, default=-1, help='DDP parameter, do not modify')
parser.add_argument('--logdir', type=str, default='runs/', help='logging directory')
parser.add_argument('--workers', type=int, default=1, help='maximum number of dataloader workers')
opt = parser.parse_args()

改完后直接运行就可以了

在这里插入图片描述

一起开启新世界的大门吧😊

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lindsayshuo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值