YOLOv5超详细的入门级教程(训练篇)(二)——VOC2007模型复现
Pytorch-YOLOv5
- 利用VOC2007对模型进行训练
- 下载VOC2007数据集
- 转换为YOLO标注格式的文件
- 修改配置文件
- 1. 修改voc.yaml文件
- 2.修改yolov5s.yaml文件
- 3. 修改train.py
- 出现了的问题
- 解决之前的一些疑惑?
- PASCAL_VOC中的正负样本
- 数据采样平衡
- 1.过采样(over-sampling)
- 2.欠采样(under-sampling)
- 3.获取更多样本
- References
经过YOLOv5训练一个简单的识别鱼的模型(超详细的入门级教程)(一)的学习后,明白了训练模型的全套流程,现在我们的问题是如何提升模型的性能?
非常重要的一个环节便是数据集,一个好的数据集对于模型性能是至关重要的。
我们首先利用VOC2007数据集来对模型进行复现
利用VOC2007对模型进行训练
下载VOC2007数据集
- 首先,附上VOC数据集下载链接VOC数据集下载。
我们选择的是VOC2007数据集,可以看到现在最新版本的数据集是VOC2012,数量也多了很多。
需要下载训练集和测试集:
- TIPS:用迅雷下载速度起飞哦!!!(之前我只下载了训练集,在这里补下测试集)
- 将两个压缩文件在同一级目录下
解压到当前文件夹
,两个压缩包的内容会合并在VOCdevkit
中
- 恍然大悟,原来加上了测试集之后,VOC2007数据集就是正常人能理解的排序了。当看到训练集中第一个图片
000005.jpg
时云里雾里。
转换为YOLO标注格式的文件
这时我们对于VOC2007数据集有了进一步的理解,有以下文件:
我们做的时目标检测任务,而且不是人的动作识别(具有人体部位的数据)(layout是做这个任务的)所以上述的SegmentationClass
,SegmentationObject
,Layout
,Segmentation
文件夹我们都不需要。在
data
目录下,放入VOCdevkit
(包括了一整个VOC2007数据集),在相同的文件夹内创建voc2yolo.py
,内容如下,并运行
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join# 这里就体现出来了咱们在1.2步骤的时候我说的尽量按照那个目录名进行操作的优势,
# 在这可以剩下很多去修改名称的精力
# sets=[('2012', 'train'), ('2012', 'val'), ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
sets=[ ('2007', 'train'), ('2007', 'val'), ('2007', 'test')] # 我只用了VOC2007classes = ["aeroplane", "bicycle", "bird", "boat", "bottle","bus", "car", "cat", "chair", "cow","diningtable", "dog", "horse", "motorbike", "person","pottedplant", "sheep", "sofa", "train", "tvmonitor"]
#classes = ["face"] # 修改为自己的labeldef convert(size, box):dw = 1./(size[0]) # 有的人运行这个脚本可能报错,说不能除以0什么的,你可以变成dw = 1./((size[0])+0.1)dh = 1./(size[1]) # 有的人运行这个脚本可能报错,说不能除以0什么的,你可以变成dh = 1./((size[0])+0.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,h)def convert_annotation(year, image_id):in_file = open('VOCdevkit/VOC%s/Annotations/%s.xml'%(year, image_id))out_file = open('VOCdevkit/VOC%s/labels/%s.txt'%(year, 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').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))bb = convert((w,h), b)out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')wd = getcwd()for year, image_set in sets:if not os.path.exists('VOCdevkit/VOC%s/labels/'%(year)):os.makedirs('VOCdevkit/VOC%s/labels/'%(year))image_ids = open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()list_file = open('%s_%s.txt'%(year, image_set), 'w')for image_id in image_ids:list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n'%(wd, year, image_id))convert_annotation(year, image_id)list_file.close()# 这块是路径拼接,暂时用不上,先都注释了
# os.system("cat 2007_train.txt 2007_val.txt 2012_train.txt 2012_val.txt > train.txt")
# os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt 2012_train.txt 2012_val.txt > train.all.txt")
可以看到生成了三个数据集的路径txt文件,和label文件夹。
修改配置文件
还是原来的步骤,我们继续巩固以下~
1. 修改voc.yaml文件
这里我们直接修改voc.yaml
的文件,可以看到还有coco.yaml
文件,其实就是你的数据集的配置文件罢了!!
# PASCAL VOC dataset http://host.robots.ox.ac.uk/pascal/VOC/
# Download command: bash ./data/get_voc.sh
# Train command: python train.py --data voc.yaml
# Default dataset location is next to /yolov5:
# /parent_folder
# /VOC
# /yolov5# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: F:\AI\datasets\VOC2007\VOCdevkit\VOC2007\2007_train.txt
val: F:\AI\datasets\VOC2007\VOCdevkit\VOC2007\2007_val.txt# number of classes
nc: 20# class names
names: ['aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog','horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor']
可以看到博主把常用数据集都放在了一个路径里,整理在一起!!值得学习
2.修改yolov5s.yaml文件
该文件需要修改的地方是第2行nc的个数,需要改成自己数据集类别的个数,对于VOC数据集改成20。
3. 修改train.py
其他的一些超参数自行修改即可。
出现了的问题
- 发现原博主的数据路径用的是
/
,但是在win下用的是\
,所以找不到label(可能是这个原因)
把voc2yolo.py
中最后的代码修改为
list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n'%(wd, year, image_id))换成list_file.write('%s\VOCdevkit\VOC%s\JPEGImages\%s.jpg\n'%(wd, year, image_id))
但是发现还是找不到label,我们把将里面所有txt文件复制到 [ VOCdevkit\VOC2007\JPEGImages ]中即可。
这时,常规错误出现了
这类报错原因是显卡内存太小了,一次装不下太多的图片,因此可以通过–batch-size调整每个批次样本的个数,默认值是16。报错后可以调整为8试试,如果还是报错,再调整为4试试,如果还是报错,那请找一把锤子,瞄准电脑主机箱用力地砸下去…
我的batch-size已经改成1了伙计们。。
那下一个教程咱们就利用远程服务器来进行模型训练吧!~
解决之前的一些疑惑?
PASCAL_VOC中的正负样本
在
Main
文件夹下可以看到很多的txt文件,作用是什么呢?就是分出test集、train集和val集。还有一个trainval集(train+val和合集嘛)
刚打开的时候发现有84个txt文件,其中有四个不带前缀,剩下的80个呢分别对应了VOC中的20个类别的四个数据集txt文件。
train
、test
、trainval
、val
里面的内容如下,就是很常规的划分数据集:
但是在那20个类别的数据对应的
train
、test
…文件中,除了划分数据之外,还做了正负样本的标注
这个
1
和-1
所代表的正负样本究竟是什么呢?- 在机器学习中,数据预处理一般包括数据清洗、数据集成、数据采样。而正负样本涉及到了数据采样的问题,因此后面也提一下。
- 简单来说,和概率论中类似,一般我们看一个问题时,只关注一个事件(希望它发生或者成功,并对其进行分析计算),而正样本就是属于我们关注的这一类别的样本,负样本就是指不属于该类别的样本。
- 一般来说,比如我们训练分类器时,希望样本中正负样本的比例是接近于1:1的。因为如果正样本占比很大(比如90%)或者负样本占比远超正样本,那么训练结果可想而知,获得的分类器在测试中的效果会很差。(这也得出了为什么我们在教程一中的检测器效果很差的原因,60张图片全是奇奇怪怪的正样本)
数据采样平衡
所以在进行数据采样时,如何解决数据不平衡的问题呢?
1.过采样(over-sampling)
这是一种较为直接的办法,即通过随机复制少数类来增加其中的实例数量,从而可增加样本中少数类的代表性。
2.欠采样(under-sampling)
这种方法也比较直接,即通过随机消除占多数类的样本来平衡类分布,直到多数类和少数类实现平衡。
3.获取更多样本
上面的两种方法比较直接方便,但也存在弊端,比如过采样可能会导致过拟合,欠采样可能无法很好地利用有限的数据(这也可能会造成过拟合)。因此最好还是获取更多的样本来补充,我认为主要有下面两种方法:
- 采集
例如在海贼王漫画的样本中,我们要进行20x20大小的海贼检测,那么为了获取尽可能多的负样本,我们可以截取一张1000x1000大小的海王类图像,将其拆分为20x20大小的片段加入到负样本中(即50x50地进行分割)。 - 生成
为了获得更多负样本,我们也可将前面1000x1000的海王类图像先拆分为10x10大小,这就比之前多出了4倍的负样本图像。不过要注意的是,为了保持大小的一致,还需进一步将其拉伸至20x20的大小。
当然,其实不需要从体积上达到这么大的比例,关键是像素尺寸的匹配。
References
- 手把手教会使用YOLOv5训练VOC2007数据集https://blog.csdn.net/Jwenxue/article/details/107912834 皇天不负有心人,在我想要探索的时候已经有好心人把路摸索好了,可以愉快的跟随前人的经验!(这个博主的帖子非常的清晰)
- PASCAL VOC数据集分析https://blog.csdn.net/zhangjunbob/article/details/52769381
- machine learning笔记:数据采样之正样本和负样本https://gsy00517.github.io/machine-learning20200118112156/ 通俗易懂,但是网站总是出bug啊,网页五光十色的。。
YOLOv5超详细的入门级教程(训练篇)(二)——VOC2007模型复现相关推荐
- YOLOv5超详细的入门级教程(训练篇)(一)——训练自制数据集(识别鱼类)
Pytorch-YOLOv5 数据集标注 数据集制作 修改配置文件 修改coco.yaml文件 修改model.yaml文件 训练train.py 出现的问题 测试detect.py 结论 Refer ...
- YOLOv5超详细的入门级教程(训练篇)(四)——利用远程服务器训练模型
利用远程服务器训练模型 修改train.py文件 进行训练 1.传文件到服务器 2.环境配置与进行训练 出现的问题 我是一个非常懒蛋的人,如果不记录博客的话,遇到一点点问题就不想解决了. 感觉记录博客 ...
- 超详细docker入门级教程
何夜息随笔录-docker入门级教程 文章目录 何夜息随笔录-docker入门级教程 什么是docker docker的组成 安装docker 卸载docker 阿里云镜像加速 docker的运行流程 ...
- 超详细Shell学习教程第二篇
目录 1.1vim使用简单介绍 1.2控制语句 1.3运算符 1.3.1算术运算符 1.3.2关系运算符 1.3.3布尔运算符 1.3.4逻辑运算符 1.3.5字符串运算符 1.3.6文件测试运算符 ...
- 超强、超详细Redis入门教程【转】
这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么 2.redis的作者何许人也 3.谁在使用r ...
- mysql2008数据库配置_SQL Server 2008 R2 超详细安装图文教程
这篇文章主要介绍了SQL Server 2008 R2 超详细安装图文教程,需要的朋友可以参考下 一.下载SQL Server 2008 R2安装文件 二.将安装文件刻录成光盘或者用虚拟光驱加载,或者 ...
- [转](转载+整理)超详细的cmake教程
cmake教程 参考 什么是cmake cmake 常见语法罗列 CMake可用变量 入门案例 单个源文件 多个源文件 同一目录,多个源文件 多个目录,多个源文件 进阶案例 自定义编译选项 指定安装和 ...
- (超详细的新手教程)怎么下载JDK包?
一.打开百度,搜索 " JDK " 选择 " java development kit (jdk) ",点击进去 二.找到 " JDK "包 ...
- 【转】超强、超详细Redis入门教程 ,建议收藏
转载自: 这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么 2.redis的作者何许人也 3. ...
- (转载+整理)超详细的cmake教程
cmake教程 参考 什么是cmake cmake 常见语法罗列 CMake可用变量 入门案例 单个源文件 多个源文件 同一目录,多个源文件 多个目录,多个源文件 进阶案例 自定义编译选项 指定安装和 ...
最新文章
- HTML 中点击a标签,页面跳转执行过程
- mysql 存储过程 set into_mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET)操作方法...
- C++ opengl 环境光分量
- [leetcode双周赛]5311. 将数字变成 0 的操作次数
- C/C++中使用可变参数
- FAT文件系统原理详细介绍
- Unity-Live2D笔记(脚本初始化,模型加载,live2d模型导出)
- ps只能选择html格式,怎么找不到ps“选择主体”功能?
- java isbn_java – 将ISBN10转换为ISBN13
- 网站优化中SEO关键词密度到底多少属于合理?
- 2022 CCF中国软件大会(CCF Chinasoft)“软件可信性与供应链安全前沿进展”论坛成功召开...
- 笔记:戴蒙德模型中的折旧
- 2.3软件测试与软件开发的关系
- 大型客服外包公司和小型客服外包公司的不同
- 再见,搜不准的百度!你好,6个精准搜索技巧(还可以屏蔽广告哦~)
- unity3d 图文并排--动态表情--超链接。
- DNS Round Robin
- 如何查看CentOS7的版本信息
- 新Titan X + cuda8.0 配置caffe
- 移动oa系统对企业有哪些推动作用?
热门文章
- .NET Runtime Optimization Service占用大量cpu问题处理windows2012
- mysql8初始化 2021-12-18版本 设置mysql大写
- 转行测试,11k入职,我写了份1000多字的分享,每一笔都是经历
- php 忽略 deprecated,php升级后使用deprecated函数报错的解决方法
- LOI2504 [HAOI2006]聪明的猴子
- Cisco Aironet WLAN系列AP的瘦胖模式转换
- 手绘三相电压电流波形的方法
- Windows_XP SP3 Profession 正版密钥
- 台风怎么看内存颗粒_光威TYPE普通马甲内存条,南亚ADIE HR颗粒稳超3200MHZ
- 深度学习笔记(二十)Momentum动量梯度下降及RSMprop Adam优化算法