YOLOv7训练自己的数据集(超详细)
目录
一、准备深度学习环境
二、 准备自己的数据集
1、创建数据集
2、转换数据格式
3、配置文件
三、模型训练
1、下载预训练模型
2、训练
四、模型测试
五、模型推理
YOLOv7训练自己的数据集整个过程主要包括:环境安装----制作数据集----模型训练----模型测试----模型推理
一、准备深度学习环境
本人的笔记本电脑系统是:Windows10
首先下载YOLOv7的代码,手动下载zip或是git clone 远程仓库,本人下载的是YOLOv7的0.1版本代码,代码文件夹中会有requirements.txt文件,里面描述了所需要的安装包。
本文最终安装的pytorch版本是1.8.1,torchvision版本是0.9.1,python是3.7.10,其他的依赖库按照requirements.txt文件安装即可。
二、 准备自己的数据集
本人标注的数据格式是VOC,而YOLOv7能够直接使用的是YOLO格式的数据,因此下面将介绍如何将自己的数据集转换成可以直接让YOLOv7进行使用。
1、创建数据集
在YOLOv7文件夹中的data目录下创建mydata文件夹(名字可以自定义),目录结构如下,将之前labelImg标注好的xml文件和图片放到对应目录下
mydata
…images # 存放图片
…xml # 存放图片对应的xml文件
…dataSet #之后会在Main文件夹内自动生成train.txt,val.txt,test.txt和trainval.txt四个文件,存放训练集、验证集、测试集图片的名字(无后缀.jpg)
示例如下:
mydata文件夹下内容如下:
- image为VOC数据集格式中的JPEGImages,内容如下:
- xml文件夹下面为.xml文件(标注工具采用labelImage),内容如下:
- dataSet 文件夹下面存放训练集、验证集、测试集的划分,通过脚本生成,可以创建一个split_train_val.py文件,代码内容如下:
# coding:utf-8import os
import random
import argparseparser = argparse.ArgumentParser()
# xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下
parser.add_argument('--xml_path', default='xml', type=str, help='input xml label path')
# 数据集的划分,地址选择自己数据下的ImageSets/Main
parser.add_argument('--txt_path', default='dataSet', type=str, help='output txt label path')
opt = parser.parse_args()trainval_percent = 1.0
train_percent = 0.9
xmlfilepath = opt.xml_path
txtsavepath = opt.txt_path
total_xml = os.listdir(xmlfilepath)
if not os.path.exists(txtsavepath):os.makedirs(txtsavepath)num = len(total_xml)
list_index = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list_index, tv)
train = random.sample(trainval, tr)file_trainval = open(txtsavepath + '/trainval.txt', 'w')
file_test = open(txtsavepath + '/test.txt', 'w')
file_train = open(txtsavepath + '/train.txt', 'w')
file_val = open(txtsavepath + '/val.txt', 'w')for i in list_index:name = total_xml[i][:-4] + '\n'if i in trainval:file_trainval.write(name)if i in train:file_train.write(name)else:file_val.write(name)else:file_test.write(name)file_trainval.close()
file_train.close()
file_val.close()
file_test.close()
- 运行代码后,在dataSet 文件夹下生成下面四个txt文档:
- 三个txt文件里面的内容如下:
2、转换数据格式
接下来准备labels,把数据集格式转换成yolo_txt格式,即将每个xml标注提取bbox信息为txt格式,每个图像对应一个txt文件,文件每一行为一个目标的信息,包括class, x_center, y_center, width, height格式。格式如下:
- 创建voc_label.py文件,将训练集、验证集、测试集生成label标签(训练中要用到),同时将数据集路径导入txt文件中,代码内容如下:
# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import os
from os import getcwdsets = ['train', 'val', 'test']
classes = ["a", "b"] # 改成自己的类别
abs_path = os.getcwd()
print(abs_path)def 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):in_file = open('data/mydata/xml/%s.xml' % (image_id), encoding='UTF-8')out_file = open('data/mydata/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').textdifficult = obj.find('Difficult').textcls = obj.find('name').textif 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()
for image_set in sets:if not os.path.exists('data/mydata/labels/'):os.makedirs('data/mydata/labels/')image_ids = open('data/mydata/dataSet/%s.txt' % (image_set)).read().strip().split()list_file = open('mydata/%s.txt' % (image_set), 'w')for image_id in image_ids:list_file.write(abs_path + '/mydata/images/%s.jpg\n' % (image_id))convert_annotation(image_id)list_file.close()
3、配置文件
1)数据集的配置
在YOLOv7目录下的data文件夹下新建一个mydata.yaml文件(可以自定义命名),用来存放训练集和验证集的划分文件(train.txt和val.txt),这两个文件是通过运行voc_label.py代码生成的,然后是目标的类别数目和具体类别列表,mydata.yaml内容如下:
2) 选择一个你需要的模型
在YOLOv7目录下的cfg/deploy文件夹下是模型的配置文件,这边提供yolov7、yolov7-d6、yolov7-e6、yolov7-e6e、yolov7x等多个版本,假设采用yolov7x.yaml,只用修改一个参数,把nc改成自己的类别数,需要取整(可选) 如下:
至此,自定义数据集已创建完毕,接下来就是训练模型了。
三、模型训练
1、下载预训练模型
在YOLOv7的GitHub开源网址上下载对应版本的模型
2、训练
在正式开始训练之前,需要对train.py进行以下修改:
以上参数解释如下:
epochs:指的就是训练过程中整个数据集将被迭代多少次,显卡不行你就调小点。
batch-size:一次看完多少张图片才进行权重更新,梯度下降的mini-batch,显卡不行你就调小点。
cfg:存储模型结构的配置文件
data:存储训练、测试数据的文件
img-size:输入图片宽高,显卡不行你就调小点。
之后运行训练命令如下:
python train.py --img 640 --batch 32 --epoch 300 --data data/mydata.yaml --cfg cfg/deploy/yolov7x.yaml --weights weights/yolov7x.pt --device '0'
四、模型测试
评估模型好坏就是在有标注的测试集或者验证集上进行模型效果的评估,在目标检测中最常使用的评估指标为mAP。在test.py文件中指定数据集配置文件和训练结果模型,如下:
通过下面的命令进行模型测试:
python test.py --data data/mydata.yaml --weights runs/exp1/weights/best.pt --augment
模型测试效果如下:
五、模型推理
最后,模型在没有标注的数据集上进行推理,在detect.py文件中指定测试图片和测试模型的路径,其他参数(img_size、置信度object confidence threshold、IOU threshold for NMS)可自行修改,如下:
使用下面的命令,其中,weights使用最满意的训练模型即可,source则提供一个包含所有测试图片的文件夹路径即可。
python detect.py --weights runs/exp1/weights/best.pt --source inference/images/ --device 0,1
测试完毕后,每个测试图片会在指定的inference/output输出文件夹中生成结果图片文件,如下:
本人训练的数据集是口罩数据集,检测后的效果如下图所示:
YOLOv7训练自己的数据集(超详细)相关推荐
- yolov5-pytorch训练自己的数据集-超详细
文章目录 前言 一.主要代码介绍 1.data文件夹 2.model文件夹 3.主要py文件 4.新建weights文件夹 二.数据集准备 三.训练与测试 1. 训练前准备 2. 修改配置文件 3. ...
- YOLOv5训练自己的数据集(超详细)
目录 一.准备深度学习环境 二. 准备自己的数据集 1.创建数据集 2.转换数据格式 3.配置文件 三.模型训练 1.下载预训练模型 2.训练 四.模型测试 五.模型推理 YOLOv5训练自己的数 ...
- YOLOv8训练自己的数据集(超详细)
一.准备深度学习环境 本人的笔记本电脑系统是:Windows10 YOLO系列最新版本的YOLOv8已经发布了,详细介绍可以参考我前面写的博客,目前ultralytics已经发布了部分代码以及说明,可 ...
- SSD-MobileNetv2之Ubuntu18.04训练VOC格式数据集-超详细
Ubuntu** python3.6 tensorflow1.15.0 TensorFlow Object Detection API下载 https://github.com/tensorflow/ ...
- YOLO | 用YOLOv7训练自己的数据集(超详细版)
一.环境设置 本文环境设置:Ubuntu (docker) pytorch-gpu 1.远程Ubuntu新建一个新的docker 容器 以下命令是创建一个名称为torch_yolo的gpu容器.如果没 ...
- 利用yolov7训练自己的数据集; yolov7的安装与使用 ; yolov7源码解读
*免责声明: 1\此方法仅提供参考 2\搬了其他博主的操作方法,以贴上路径. 3* 场景一:Anconda环境基本操作 场景二:yolov7的使用 场景三:yolov7训练自己的数据集 场景四:实用工 ...
- 目标检测算法——YOLOv7训练自己的数据集(保姆级教程)
>>>深度学习Tricks,第一时间送达<<< 目录 YOLOv7训练自己的数据集(保姆级教程): 一.YOLOv7源代码下载 二.安装深度学习环境 三.准备自己的 ...
- YOLOv7训练自己的数据集(口罩检测)
YOLOv7训练自己的数据集(口罩检测) 前言 前提条件 实验环境 项目结构 制作自己的数据集 数据集目录结构 训练自己的数据集 VOC格式数据集转换成YOLO格式数据集 修改cfg配置 新建一个my ...
- Yolov5训练自己的数据集(详细完整版)
最近在网上看到有与本博客一模一样的,连图片都一样. 特此声明:这是原版,转载请附原文链接,谢谢. 这次我将大部分图片添加了水印 文章目录 一. 环境(不能含有中文路径) 二. 准备工作(文件夹及视频转 ...
最新文章
- nginx+iis实现负载均衡
- GridView更新出现异常的解决过程
- 解决PendingIntent传递参数为空的问题
- 百度音乐 android,千千音乐(com.ting.mp3.android) - 8.2.3.4 - 应用 - 酷安
- azure blob_从Azure Databricks访问Azure Blob存储
- css中的背景、边框、补丁相关属性
- [转]一个故事讲清楚NIO
- Unity调用Android类方法
- #!/bin/sh与#!/bin/bash有区别
- Java之API的使用
- 清华大学计算机系96级 那些缔造中国互联网的男孩们
- android pcm 音量_Android中实时获取音量分贝值详解
- 量子力学科普书籍《见微知著》为什么值得读,看看目录就懂了
- 大前端求人不如求己系列工具:如何PSD文件自动标注切图和真机预览
- 基于随机分形搜索算法的函数寻优算法
- Part III.S3. 对方案有偏好的直觉模糊多属性决策方法
- ESP32-C3学习,Windows下基于VScode环境建立
- 分布式事件调度框架tiger
- 有没有办法找回testflight之前测试的软件_关于TestFlight ,你需要知道这些
- html网页底部弹窗,【HTML】底部弹窗插件代码
热门文章
- 装机软件测试工资,实际性能测试及总结_DIY攒机装机不求人-中关村在线
- arm linux 识别新硬盘_嵌入式Linux 的NTFS移动硬盘支持
- layui.form用ajax提交表单时的问题(巨坑)
- Android 双usb 摄像头支持
- poj 3208 Apocalypse Someday(数位dp)
- Kubectl debug 调试容器
- 【Java基础】集合总结(三)——Queue集合、Map集合
- 红色荧光染料AF 594活性酯,Alexa Fluor 594 NHS ester,CAS:295348-87-7
- 594. 最长和谐子序列--Python
- ios 渐变透明背景_在PS中用橡皮擦工具擦除背景并合成背景