YOLO系列算法使用bdd100k数据集训练的数据预处理及格式转换python代码
立即下载
资源介绍:
内容简介
本资源提供了一套针对BDD100K数据集的Python代码,旨在辅助用户完成YOLO系列算法训练前的数据预处理及格式转换工作。内容概要上,该代码能够处理BDD100K数据集的复杂标注信息,包括图像路径、类别标签、边界框坐标等,并将其转换为YOLO算法训练所需的特定格式(如TXT文件),同时可能包括图像增强、归一化等预处理步骤,以优化训练效果。
适用人群:
深度学习爱好者与研究者,特别是专注于目标检测领域的学者和学生。
开发人员,需要利用BDD100K数据集进行YOLO算法训练的工程师。
寻求提升数据处理效率与准确性的数据科学家。
能学到什么:
了解BDD100K数据集的标注结构与特点。
掌握将BDD100K数据集转换为YOLO训练格式的方法。
学习图像预处理技术,如数据增强、归一化等,在目标检测训练中的应用。
提升Python编程能力,特别是文件操作、数据处理及条件逻辑的实现。
阅读建议:
在阅读前,建议对BDD100K数据集和YOLO算法有一定的了解。
逐步执行代码,理解每一步的作用,特别是数据解析、预处理和格式转换的逻辑。
尝试修改代码中的参数,如调整数据增强的
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright @ 2021 zuosi <807269961@qq.com>
# Distributed under terms of the MIT license
import re
import os
import json
def search_file(data_dir, pattern=r'\.jpg$'):
root_dir = os.path.abspath(data_dir)
for root, dirs, files in os.walk(root_dir):
for f in files:
if re.search(pattern, f, re.I):
abs_path = os.path.join(root, f)
#print('new file %s' % absfn)
yield abs_path
class Bdd2yolov5:
def __init__(self):
self.bdd100k_width = 1280
self.bdd100k_height = 720
self.select_categorys=["person", "car", "bus", "truck"]
self.cat2id = {
"person": 0,
"car": 1,
"bus": 1,
"truck": 1
}
@property
def all_categorys(self):
return ["person", "rider", "car", "bus", "truck", "bike",
"motor", "traffic light", "traffic sign","train"]
def _filter_by_attr(self, attr=None):
if attr is None:
return False
#过滤掉晚上的图片
if attr['timeofday'] == 'night':
return True
return False
def _filter_by_box(self, w, h):
#size ratio
#过滤到过于小的小目标
threshold = 0.001
if float(w*h)/(self.bdd100k_width*self.bdd100k_height) < threshold:
return True
return False
def bdd2yolov5(self, path):
lines = ""
with open(path) as fp:
j = json.load(fp)
# if self._filter_by_attr(j['attributes']): //去掉晚上的
# return
for fr in j["frames"]:
dw = 1.0 / self.bdd100k_width
dh = 1.0 / self.bdd100k_height
for obj in fr["objects"]:
if obj["category"] in self.select_categorys:
idx = self.cat2id[obj["category"]]
cx = (obj["box2d"]["x1"] + obj["box2d"]["x2"]) / 2.0
cy = (obj["box2d"]["y1"] + obj["box2d"]["y2"]) / 2.0
w = obj["box2d"]["x2"] - obj["box2d"]["x1"]
h = obj["box2d"]["y2"] - obj["box2d"]["y1"]
if w<=0 or h<=0:
continue
# if self._filter_by_box(w,h)://去掉小目标
# continue
#根据图片尺寸进行归一化
cx,cy,w,h = cx*dw,cy*dh,w*dw,h*dh
line = f"{idx} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}\n"
lines += line
if len(lines) != 0:
#转换后的以*.txt结尾的标注文件我就直接和*.json放一具目录了
#yolov5中用到的时候稍微挪一下就行了
yolo_txt = path.replace(".json",".txt")
print(yolo_txt)
with open(yolo_txt, 'w') as fp2:
fp2.writelines(lines)
#print("%s has been dealt!" % path)
if __name__ == "__main__":
bdd_label_dir = "E:\\数据集\\bdd100k\\bdd100k_labels\\bdd100k\\labels\\100k\\val"
cvt=Bdd2yolov5()
for path in search_file(bdd_label_dir, r"\.json$"):
cvt.bdd2yolov5(path)