前言
最近因为在公司实习,迷上了计算机视觉,对目标检测这一方向饶有兴趣。再加上yolov7的论文也才出了不久,笔者就想着带着学习的心态,搞一搞基于yolov7的目标检测的实现。同时笔者也是踩了无数的坑🕳,心态几近崩溃,前前后后搞了一个多星期才跑完,网上的资料零零碎碎也不方便进行操作,笔者就想着写一篇事无巨细的文章,帮助大家尽量跑通自己的代码。
在这里感谢一下https://blog.csdn.net/qq_39770163/article/details/127715144
这篇博客对笔者的帮助。
数据集的准备
平时我们在使用YOLOv5、YOLOv7官方模型进行魔改训练的时候,一般不会用到COCO2017等这样的大型数据集,一般是在自己的自定义数据集或者是一些小的开源数据集上进行调试,这时候就要涉及到数据集的问题。
这里我就VOC格式的数据集如何转成YOLO格式的数据集,如何写训练需要的datasets.yaml文件等问题进行探讨和分享。以我个人实际操作过程中的细节为例,如果有一些细节地方和数据文件位置等问题的,欢迎在评论区讨论交流。
VOC数据集介绍
VOC数据集主要分为:VOC2007、VOC2012。
下载地址:
1、Darknet网站的地址:VOC数据集下载地址
2、PASCAL官网的地址:VOC2007、VOC2012
推荐在第一个地址下载,因为这是一个镜像网站,下载数据集也很快。
格式介绍:
本文为了方便起见,下载的是VOCtrainval_06-Nov-2007文件。
下载VOC数据集,解压后,文件夹内容如下:
其实真正在做目标检测的时候用不到这么多数据集,保留前三个足以,但是如果你是第一次做,觉得不保险的话,全部保留也无伤大雅。
Annotations:存放所有图片的标注xml文件;
ImageSets:文件夹下有3个子文件夹:Layout、Main、Segmentation,我们只用到Main文件夹,其他可以删掉。下面看一下Main文件夹下的内容:
Main文件夹下有20个类别的×××_train.txt、×××_trainval.txt、×××_val.txt(其实删掉也可以,不影响)。我们只要保留并关注三个文件(黄色框):train.txt、val.txt、trainval.txt (训练集、验证集、训练集+验证集的总和)。其实可以把Main文件夹下内容全删了,只留空文件夹。
划分数据集
在yolo根目录下创建voc_to_yolo.py脚本,即划分数据集的脚本。
用于将 VOC 数据集转换为 YOLO 数据集格式。它首先创建了一些文件夹和子文件夹,然后根据 VOC 数据集中的 XML 文件和图像文件生成 YOLO 标签文件和图像文件,最后将这些文件分为训练集和验证集,并生成了两个 txt 文件,一个是训练集的文件列表,一个是验证集的文件列表。文章来源:https://www.toymoban.com/news/detail-536127.html
voc_to_yolo.py:文章来源地址https://www.toymoban.com/news/detail-536127.html
"""
# VOC数据集 转 YOLO数据集 格式
"""
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
import random
from shutil import copyfile
classes = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog",
"horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]
# classes=["ball"]
# 划分比率
TRAIN_RATIO = 80
def clear_hidden_files(path):
dir_list = os.listdir(path)
for i in dir_list:
abspath = os.path.join(os.path.abspath(path), i)
if os.path.isfile(abspath):
if i.startswith("._"):
os.remove(abspath)
else:
clear_hidden_files(abspath)
# size是原图的宽和高
def convert(size, box):
dw = 1. / size[0]
dh = 1. / size[1]
x = (box[0] + box[1]) / 2.0
y = (box[2] + box[3]) / 2.0
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
到了这里,关于【YOLO系列】基于YOLOv7模型的目标检测与实现——利用PASCALVOC数据集(超详细,看这一篇足矣)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!