YOLO格式目标检测数据集标注批量原地处理:保留前5字段
高效批量处理YOLO标注文件:保留前5个字段
针对170万个YOLO格式标注文件的批量修改需求(每行仅保留类别+xywh的前5个字段,移除后续分割数据),以下是比cut更高效的bash实现方案,核心思路是流处理工具+多进程并行,大幅提升处理速度:
单文件处理命令
方案1:使用sed原地修改(推荐)
利用sed的正则匹配替换,直接原地修改文件,无需生成临时文件:
sed -i 's/^\(\S\+\s\+\S\+\s\+\S\+\s\+\S\+\s\+\S\+\).*/\1/' your_label_file.txt
- 正则解释:
^\(\S\+\s\+\)重复5次,匹配行首的5个非空白字段(每个字段后跟空格),.*匹配后续所有内容,最终替换为仅保留前5个字段。 - 注意:macOS系统需添加空参数:
sed -i '' 's/^\(\S\+\s\+\S\+\s\+\S\+\s\+\S\+\s\+\S\+\).*/\1/' your_label_file.txt
方案2:使用awk生成临时文件替换
如果对sed正则不熟悉,也可以用awk提取前5个字段,再替换原文件:
awk '{print $1, $2, $3, $4, $5}' your_label_file.txt > temp.txt && mv temp.txt your_label_file.txt
批量并行处理(核心提速手段)
单线程处理170万文件效率极低,通过find+xargs开启多进程并行处理,可将速度提升数倍:
基于sed的并行脚本
# 替换为你的标注文件根目录,后缀根据实际情况调整(比如*.txt) find /path/to/your/labels -type f -name "*.txt" | xargs -P 8 -n 100 sed -i 's/^\(\S\+\s\+\S\+\s\+\S\+\s\+\S\+\s\+\S\+\).*/\1/'
- 参数说明:
-P 8:开启8个并行进程(可根据CPU核心数调整,比如16核可设为12)-n 100:每个进程每次处理100个文件,平衡进程调度和IO负载
基于awk的并行脚本
find /path/to/your/labels -type f -name "*.txt" | xargs -P 8 -I {} sh -c 'awk "{print \$1,\$2,\$3,\$4,\$5}" {} > {}.tmp && mv {}.tmp {}'
注意事项
- 先小范围测试:挑选少量标注文件,先执行不带
-i的sed命令(或仅生成临时文件),确认输出符合预期后再批量处理,避免数据损坏。 - IO资源限制:如果存储设备是机械硬盘,不要设置过高的并行进程数(建议不超过8),避免IO瓶颈导致速度下降;SSD可适当提高。
- 备份重要数据:批量修改前建议备份部分核心数据,防止意外情况。
内容的提问来源于stack exchange,提问作者foemre
相关产品推荐
相关产品推荐

