1、介绍
训练的模型基于yolov8n.pt,数据采用PASCAL VOC数据集,下面进行整个任务的步骤说明,任务分三部:
- 配置好Yolo环境:环境基于Anconda创建的Python虚拟环境。
- 下载数据集和处理数据集:数据集为PASCAL VOC数据集中2012train、2007train、2007test三个数据集。
- 运行Yolo程序:在处理数据集后运行Yolo程序训练模型。
2、下载数据集
对于Voc数据集下载,这里有两种下载方式,方式如下:
-
(1)自己从网站上进行下载;
-
(2)使用Python程序进行下载,当然这个方式比较看网络情况。
下面进行具体介绍这两种方式。
(1)网站下载
首先到PASCAL网站首页,这里给出网站网址:PASCAL 视觉对象类主页 (ox.ac.uk),到这个网站找到下图这个部分。
然后点击VOC2007这个链接,进入2007数据的页面。进入页面找到数据部分,也就是下面的这个图片。
最后点击上图的两个数据下载连接,即可下载2007的数据集。最后以同样的方式下载2012年的数据集,但是注意2012年下载训练集即可,不用下载测试集(测试集数据下载要注册账号,当然如果你有账号也可以进行下载,将我们测试用的2007测试集换成2012年的也可以)。
补充:如果你觉得数据集在浏览器下载太慢,那么可以将下载链接复制,如何到百度网盘进行下载,这样下载数据会快一些(当然这是基于我是会员的情况下)。步骤如下:
-
点击云添加中的添加链接任务
-
填入链接点击下载即可
-
这里给出三个数据下载的链接:
- 2007训练集:http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
- 2007测试集:http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
- 2012训练集:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
-
完整的数据集大小是2.8GB左右
(2)Python程序下载
将下面程序复制到Pycharm中py文件的项目中运行即可(前提网络可以连接github这样可以下载数据),当然这个程序也包含对数据的处理,第一种方法并没有进行对数据的处理还要进一步对数据进行处理。
import xml.etree.ElementTree as ET
from tqdm import tqdm
from ultralytics.utils.downloads import download
from pathlib import Path
import yaml
# 加载VOC.yaml文件内容
yaml_content = """
path: ../datasets/VOC
train:
- images/train2012
- images/train2007
- images/val2012
- images/val2007
val:
- images/test2007
test:
- images/test2007
names:
0: aeroplane
1: bicycle
2: bird
3: boat
4: bottle
5: bus
6: car
7: cat
8: chair
9: cow
10: diningtable
11: dog
12: horse
13: motorbike
14: person
15: pottedplant
16: sheep
17: sofa
18: train
19: tvmonitor
"""
yaml = yaml.safe_load(yaml_content)
# 函数:转换标签
def convert_label(path, lb_path, year, image_id):
# 函数:转换边界框
def convert_box(size, box):
dw, dh = 1. / size[0], 1. / size[1]
x, y, w, h = (box[0] + box[1]) / 2.0 - 1, (box[2] + box[3]) / 2.0 - 1, box[1] - box[0], box[3] - box[2]
return x * dw, y * dh, w * dw, h * dh
# 打开标注文件并创建输出文件
in_file = open(path / f'VOC{
year}/Annotations/{
image_id}.xml')
out_file = open(lb_path, '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)
# 获取类别名称列表
names = list(yaml['names'].values())
for obj in root.iter('object'):
cls = obj.find('name').text
if cls in names and int(obj.find('difficult').text) != 1:
xmlbox = obj.find('bndbox')
bb = convert_box((w, h), [float(xmlbox.find(x).text) for x in ('xmin', 'xmax', 'ymin', 'ymax')])
cls_id = names.index(cls) # 类别ID
out_file.write(" ".join(str(a) for a in (cls_id, *bb)) + '\n')
# 下载数据集
dir = Path(yaml['path']) # 数据集根目录
url = 'https://github.com/ultralytics/assets/releases/download/v0.0.0/'
urls = [
f'{
url}VOCtrainval_06-Nov-2007.zip', # 446MB, 5012张图片
f'{
url}VOCtest_06-Nov-2007.zip', # 438MB, 4953张图片
f'{
url}VOCtrainval_11-May-2012.zip' # 1.95GB, 17126张图片
]
# 下载并解压数据集到指定路径
download(urls, dir=dir / 'images', curl=True, threads=3, exist_ok=True) # 下载并解压到现有路径(如果存在)
# 转换标签
path = dir /