行人检测数据集yolov8
时间: 2025-03-06 09:38:49 浏览: 35
### 行人检测数据集转换为YOLOv8格式
对于行人检测项目而言,找到合适的数据集并将其转换成适合特定版本YOLO模型使用的格式至关重要。考虑到YOLO系列算法之间的相似性和兼容性,可以采用已有的行人跟踪数据集,并按照YOLOv5或更通用的YOLO格式进行转换,这同样适用于YOLOv8。
#### 数据集选择与获取
公开可用且广泛认可的一个高质量行人检测数据集是CityPersons[^1]。该数据集中包含了大量城市环境下的行人图像及其标注信息,非常适合用于训练和测试行人检测模型。另一个常用的选择是Caltech Pedestrian Detection Benchmark, 它提供了丰富的场景变化样本,有助于提升模型鲁棒性。
这些数据集可以从官方网址下载:
- CityPersons: [http://www.cityscapes-dataset.com/](http://www.cityscapes-dataset.com/)
- Caltech Pedestrian Dataset: [http://vision.caltech.edu/Image_Datasets/CaltechPedestrians/](http://vision.caltech.edu/Image_Datasets/CaltechPedestrians/)
#### 转换至YOLOv8所需格式
为了使上述提到的数据集能够被YOLOv8所利用,需遵循其输入文件结构的要求:
1. 图像存储路径应保持原样;
2. 创建对应的标签文件夹,其中每张图片对应一个`.txt`文件作为标签描述;
3. 标签文件中的每一行代表一个目标框,格式如下:类别编号 中心点X坐标比例 中心点Y坐标比例 宽度比例 高度比例;所有数值均为相对于整幅图的比例值(范围0~1),并且保留六位小数精度。
具体实现过程可以通过编写Python脚本来完成自动化处理,下面给出一段简单的代码片段展示如何读取原始XML格式的标注并将之转化为YOLO所需的TXT格式:
```python
import xml.etree.ElementTree as ET
from pathlib import Path
def convert(size, box):
dw = 1./(size[0])
dh = 1./(size[1])
x = (box[0] + box[1])/2.0 - 1
y = (box[2] + box[3])/2.0 - 1
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 main():
sets=[('train'), ('val')]
classes = ["person"]
for image_set in sets:
image_ids = open(f'Annotations/{image_set}.txt').read().strip().split()
list_file = open('%s.txt'%(image_set), 'w')
for image_id in image_ids:
in_file = open(f'Annotations/%s.xml'%image_id)
out_file = open(f'labels/%s.txt'%image_id.split('.')[0], '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').text
cls = obj.find('name').text
if cls not in classes or int(difficult)==1:
continue
cls_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')
if __name__ == '__main__':
main()
```
此段代码假设源数据是以PASCAL VOC XML形式提供的,如果实际遇到其他类型的标注,则需要相应调整解析逻辑部分。
阅读全文
相关推荐


















