如何将LabelImg生成的YOLO格式TXT转为CSV并解决多标注行读取问题
YOLO标注TXT批量转CSV修正代码
你的问题核心是原代码仅调用了一次readline()读取单个TXT文件的首行标注,没有遍历文件内的所有标注行,同时输出列结构也没有拆分出单独的坐标字段,修正后代码如下:
import os import glob import pandas as pd import numpy as np # 配置参数 LABEL_DIR = r'D:\karami\Labeled\train1\labels' IMG_WIDTH = 1024 IMG_HEIGHT = 1024 os.chdir(LABEL_DIR) txt_files = glob.glob('*.txt') final_data = [] image_id = 0 for txt_path in txt_files: # 同一个TXT对应同一张图,所有标注共用同一个image_id with open(txt_path, 'r', encoding='utf-8') as f: lines = f.readlines() for line in lines: line = line.strip() # 跳过空行 if not line: continue parts = line.split() try: # YOLO格式:[类别id, x_center_norm, y_center_norm, width_norm, height_norm] x_center = float(parts[1]) * IMG_WIDTH y_center = float(parts[2]) * IMG_HEIGHT bbox_width = float(parts[3]) * IMG_WIDTH bbox_height = float(parts[4]) * IMG_HEIGHT final_data.append([ image_id, IMG_WIDTH, IMG_HEIGHT, x_center, y_center, bbox_width, bbox_height ]) except Exception as e: print(f"文件 {txt_path} 存在不符合YOLO格式的行:{line}") # 处理完当前文件所有标注后,image_id自增 image_id += 1 # 生成CSV df = pd.DataFrame(final_data, columns=[ 'image_id', 'img_width', 'img_height', 'x_center', 'y_center', 'width', 'height' ]) df.to_csv("yolo_annotations.csv", index=False)
核心修改点
- 替换单行读取逻辑为遍历TXT文件的所有行,每个标注行单独生成一条CSV记录
- 同一图片对应的所有标注复用同一个
image_id,全部标注处理完成后再自增ID - 直接拆分输出4个独立坐标字段,符合要求的CSV结构
- 新增空行跳过逻辑、错误日志输出具体问题文件,方便排查异常标注
内容的提问来源于stack exchange,提问作者Joju
相关产品推荐
相关产品推荐

