65 lines
1.7 KiB
Python
65 lines
1.7 KiB
Python
|
|
import os
|
|||
|
|
|
|||
|
|
|
|||
|
|
def expand_bbox(label_path, k=1.1):
|
|||
|
|
"""
|
|||
|
|
扩大YOLO标签的边界框
|
|||
|
|
:param label_path: 标签文件路径(.txt)
|
|||
|
|
:param k: 扩大系数(k>1)
|
|||
|
|
"""
|
|||
|
|
with open(label_path, 'r') as f:
|
|||
|
|
lines = f.readlines()
|
|||
|
|
|
|||
|
|
new_lines = []
|
|||
|
|
for line in lines:
|
|||
|
|
line = line.strip()
|
|||
|
|
if not line:
|
|||
|
|
continue
|
|||
|
|
# 解析标签
|
|||
|
|
class_id, xc, yc, w, h = line.split()
|
|||
|
|
xc = float(xc)
|
|||
|
|
yc = float(yc)
|
|||
|
|
w = float(w)
|
|||
|
|
h = float(h)
|
|||
|
|
|
|||
|
|
# 计算新宽高
|
|||
|
|
new_w = w * k
|
|||
|
|
new_h = h * k
|
|||
|
|
|
|||
|
|
# 计算边界
|
|||
|
|
x1 = xc - new_w / 2
|
|||
|
|
y1 = yc - new_h / 2
|
|||
|
|
x2 = xc + new_w / 2
|
|||
|
|
y2 = yc + new_h / 2
|
|||
|
|
|
|||
|
|
# 截断超出图像的部分(0~1范围)
|
|||
|
|
x1 = max(0.0, x1)
|
|||
|
|
y1 = max(0.0, y1)
|
|||
|
|
x2 = min(1.0, x2)
|
|||
|
|
y2 = min(1.0, y2)
|
|||
|
|
|
|||
|
|
# 重新计算中心和宽高
|
|||
|
|
new_xc = (x1 + x2) / 2
|
|||
|
|
new_yc = (y1 + y2) / 2
|
|||
|
|
new_w = x2 - x1
|
|||
|
|
new_h = y2 - y1
|
|||
|
|
|
|||
|
|
# 保留6位小数,拼接新标签
|
|||
|
|
new_line = f"{class_id} {new_xc:.6f} {new_yc:.6f} {new_w:.6f} {new_h:.6f}\n"
|
|||
|
|
new_lines.append(new_line)
|
|||
|
|
|
|||
|
|
# 写入新标签(覆盖原文件,或改为新路径)
|
|||
|
|
with open(label_path, 'w') as f:
|
|||
|
|
f.writelines(new_lines)
|
|||
|
|
|
|||
|
|
|
|||
|
|
# 批量处理文件夹中的所有标签
|
|||
|
|
label_dir = r"D:\DataPreHandler\yuanshi_data\images\val\labels" # 替换为你的标签文件夹路径
|
|||
|
|
k = 1.25 # 扩大系数,根据需求调整
|
|||
|
|
|
|||
|
|
for filename in os.listdir(label_dir):
|
|||
|
|
if filename.endswith('.txt'):
|
|||
|
|
label_path = os.path.join(label_dir, filename)
|
|||
|
|
expand_bbox(label_path, k)
|
|||
|
|
|
|||
|
|
print("处理完成!")
|