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


其他的一些超参数自行修改即可。

出现了的问题

  1. 发现原博主的数据路径用的是/,但是在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))
  1. 但是发现还是找不到label,我们把将里面所有txt文件复制到 [ VOCdevkit\VOC2007\JPEGImages ]中即可。

  2. 这时,常规错误出现了

    这类报错原因是显卡内存太小了,一次装不下太多的图片,因此可以通过–batch-size调整每个批次样本的个数,默认值是16。报错后可以调整为8试试,如果还是报错,再调整为4试试,如果还是报错,那请找一把锤子,瞄准电脑主机箱用力地砸下去…
    我的batch-size已经改成1了伙计们。。
    那下一个教程咱们就利用远程服务器来进行模型训练吧!~

解决之前的一些疑惑?

PASCAL_VOC中的正负样本

  • Main文件夹下可以看到很多的txt文件,作用是什么呢?就是分出test集、train集和val集。还有一个trainval集(train+val和合集嘛)
    刚打开的时候发现有84个txt文件,其中有四个不带前缀,剩下的80个呢分别对应了VOC中的20个类别的四个数据集txt文件。

    traintesttrainvalval里面的内容如下,就是很常规的划分数据集:

  • 但是在那20个类别的数据对应的traintest…文件中,除了划分数据之外,还做了正负样本的标注

  • 这个1-1所代表的正负样本究竟是什么呢?

    1. 在机器学习中,数据预处理一般包括数据清洗数据集成数据采样。而正负样本涉及到了数据采样的问题,因此后面也提一下。
    2. 简单来说,和概率论中类似,一般我们看一个问题时,只关注一个事件(希望它发生或者成功,并对其进行分析计算),而正样本就是属于我们关注的这一类别的样本,负样本就是指不属于该类别的样本。
    3. 一般来说,比如我们训练分类器时,希望样本中正负样本的比例是接近于1:1的。因为如果正样本占比很大(比如90%)或者负样本占比远超正样本,那么训练结果可想而知,获得的分类器在测试中的效果会很差。(这也得出了为什么我们在教程一中的检测器效果很差的原因,60张图片全是奇奇怪怪的正样本)

数据采样平衡

所以在进行数据采样时,如何解决数据不平衡的问题呢?

1.过采样(over-sampling)

这是一种较为直接的办法,即通过随机复制少数类来增加其中的实例数量,从而可增加样本中少数类的代表性。

2.欠采样(under-sampling)

这种方法也比较直接,即通过随机消除占多数类的样本来平衡类分布,直到多数类和少数类实现平衡。

3.获取更多样本

上面的两种方法比较直接方便,但也存在弊端,比如过采样可能会导致过拟合,欠采样可能无法很好地利用有限的数据(这也可能会造成过拟合)。因此最好还是获取更多的样本来补充,我认为主要有下面两种方法:

  1. 采集
    例如在海贼王漫画的样本中,我们要进行20x20大小的海贼检测,那么为了获取尽可能多的负样本,我们可以截取一张1000x1000大小的海王类图像,将其拆分为20x20大小的片段加入到负样本中(即50x50地进行分割)。
  2. 生成
    为了获得更多负样本,我们也可将前面1000x1000的海王类图像先拆分为10x10大小,这就比之前多出了4倍的负样本图像。不过要注意的是,为了保持大小的一致,还需进一步将其拉伸至20x20的大小。
    当然,其实不需要从体积上达到这么大的比例,关键是像素尺寸的匹配

References

  1. 手把手教会使用YOLOv5训练VOC2007数据集https://blog.csdn.net/Jwenxue/article/details/107912834 皇天不负有心人,在我想要探索的时候已经有好心人把路摸索好了,可以愉快的跟随前人的经验!(这个博主的帖子非常的清晰)
  2. PASCAL VOC数据集分析https://blog.csdn.net/zhangjunbob/article/details/52769381
  3. machine learning笔记:数据采样之正样本和负样本https://gsy00517.github.io/machine-learning20200118112156/ 通俗易懂,但是网站总是出bug啊,网页五光十色的。。

YOLOv5超详细的入门级教程(训练篇)(二)——VOC2007模型复现相关推荐

  1. YOLOv5超详细的入门级教程(训练篇)(一)——训练自制数据集(识别鱼类)

    Pytorch-YOLOv5 数据集标注 数据集制作 修改配置文件 修改coco.yaml文件 修改model.yaml文件 训练train.py 出现的问题 测试detect.py 结论 Refer ...

  2. YOLOv5超详细的入门级教程(训练篇)(四)——利用远程服务器训练模型

    利用远程服务器训练模型 修改train.py文件 进行训练 1.传文件到服务器 2.环境配置与进行训练 出现的问题 我是一个非常懒蛋的人,如果不记录博客的话,遇到一点点问题就不想解决了. 感觉记录博客 ...

  3. 超详细docker入门级教程

    何夜息随笔录-docker入门级教程 文章目录 何夜息随笔录-docker入门级教程 什么是docker docker的组成 安装docker 卸载docker 阿里云镜像加速 docker的运行流程 ...

  4. 超详细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文件测试运算符 ...

  5. 超强、超详细Redis入门教程【转】

    这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么 2.redis的作者何许人也 3.谁在使用r ...

  6. mysql2008数据库配置_SQL Server 2008 R2 超详细安装图文教程

    这篇文章主要介绍了SQL Server 2008 R2 超详细安装图文教程,需要的朋友可以参考下 一.下载SQL Server 2008 R2安装文件 二.将安装文件刻录成光盘或者用虚拟光驱加载,或者 ...

  7. [转](转载+整理)超详细的cmake教程

    cmake教程 参考 什么是cmake cmake 常见语法罗列 CMake可用变量 入门案例 单个源文件 多个源文件 同一目录,多个源文件 多个目录,多个源文件 进阶案例 自定义编译选项 指定安装和 ...

  8. (超详细的新手教程)怎么下载JDK包?

    一.打开百度,搜索 " JDK " 选择 " java development kit (jdk) ",点击进去 二.找到 " JDK "包 ...

  9. 【转】超强、超详细Redis入门教程 ,建议收藏

    转载自: 这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么 2.redis的作者何许人也 3. ...

  10. (转载+整理)超详细的cmake教程

    cmake教程 参考 什么是cmake cmake 常见语法罗列 CMake可用变量 入门案例 单个源文件 多个源文件 同一目录,多个源文件 多个目录,多个源文件 进阶案例 自定义编译选项 指定安装和 ...

最新文章

  1. HTML 中点击a标签,页面跳转执行过程
  2. mysql 存储过程 set into_mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET)操作方法...
  3. C++ opengl 环境光分量
  4. [leetcode双周赛]5311. 将数字变成 0 的操作次数
  5. C/C++中使用可变参数
  6. FAT文件系统原理详细介绍
  7. Unity-Live2D笔记(脚本初始化,模型加载,live2d模型导出)
  8. ps只能选择html格式,怎么找不到ps“选择主体”功能?
  9. java isbn_java – 将ISBN10转换为ISBN13
  10. 网站优化中SEO关键词密度到底多少属于合理?
  11. 2022 CCF中国软件大会(CCF Chinasoft)“软件可信性与供应链安全前沿进展”论坛成功召开...
  12. 笔记:戴蒙德模型中的折旧
  13. 2.3软件测试与软件开发的关系
  14. 大型客服外包公司和小型客服外包公司的不同
  15. 再见,搜不准的百度!你好,6个精准搜索技巧(还可以屏蔽广告哦~)
  16. unity3d 图文并排--动态表情--超链接。
  17. DNS Round Robin
  18. 如何查看CentOS7的版本信息
  19. 新Titan X + cuda8.0 配置caffe
  20. 移动oa系统对企业有哪些推动作用?

热门文章

  1. .NET Runtime Optimization Service占用大量cpu问题处理windows2012
  2. mysql8初始化 2021-12-18版本 设置mysql大写
  3. 转行测试,11k入职,我写了份1000多字的分享,每一笔都是经历
  4. php 忽略 deprecated,php升级后使用deprecated函数报错的解决方法
  5. LOI2504 [HAOI2006]聪明的猴子
  6. Cisco Aironet WLAN系列AP的瘦胖模式转换
  7. 手绘三相电压电流波形的方法
  8. Windows_XP SP3 Profession 正版密钥
  9. 台风怎么看内存颗粒_光威TYPE普通马甲内存条,南亚ADIE HR颗粒稳超3200MHZ
  10. 深度学习笔记(二十)Momentum动量梯度下降及RSMprop Adam优化算法