在计算机视觉项目中,最耗时的工作往往不是模型训练,而是数据准备阶段——特别是当你有成千上万张按文件夹分类的图片需要标注时。我最近开发了一个自动化脚本工具,能够根据文件夹结构自动为图像生成标签文件,将原本需要数天的手工标注工作缩短到几分钟完成。
这个工具特别适合以下场景:
工具的核心逻辑建立在"文件夹名称=类别标签"的约定上。例如:
code复制dataset/
├── cat/
│ ├── 001.jpg
│ └── 002.jpg
├── dog/
├── 003.jpg
└── 004.jpg
系统会扫描目录结构,自动生成对应的标签映射:
python复制{'cat': 0, 'dog': 1}
考虑到不同框架的需求差异,我们实现了三种主流标注格式:
csv复制filename,label
/dataset/cat/001.jpg,cat
code复制# classes.txt
cat
dog
采用递归方式处理嵌套文件夹结构:
python复制def scan_directory(root_path):
for dirpath, dirnames, filenames in os.walk(root_path):
if dirpath == root_path: # 跳过根目录
continue
label = os.path.basename(dirpath)
for filename in filenames:
if filename.lower().endswith(('.png','.jpg')):
yield label, os.path.join(dirpath, filename)
当处理超过10万张图片时,采用多进程池加速:
python复制with Pool(processes=cpu_count()) as pool:
results = pool.imap(process_image, file_paths)
通过参数即可划分训练集/验证集:
bash复制python auto_label.py --split 0.2 # 20%作为验证集
集成OpenCV实现自动处理:
python复制def preprocess(image_path):
img = cv2.imread(image_path)
img = cv2.resize(img, (256,256))
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
return img
处理来自科研机构的10万张植物图像:
code复制原始结构:
plant_dataset/
├── Rosaceae/
├── Liliaceae/
└── Gramineae/
运行命令:
python auto_label.py --input plant_dataset --format yolo
处理工厂传送带拍摄的产品缺陷图片:
python复制# 自定义标签过滤规则
def is_valid_label(label):
return label in ['scratch', 'dent', 'normal']
当文件夹包含多种图像格式时:
python复制VALID_EXTENSIONS = ('.jpg','.jpeg','.png','.bmp','.tiff')
自动清理不合规的文件夹名称:
python复制import re
def clean_label(label):
return re.sub(r'[^\w-]', '', label)
dockerfile复制FROM python:3.8
COPY auto_label.py /app/
ENTRYPOINT ["python", "/app/auto_label.py"]
python复制from auto_label import FolderLabeler
labeler = FolderLabeler(input_path='dataset')
labeler.generate_labels()
这个工具在实际项目中帮我节省了数百小时的人工标注时间。特别是在处理时间序列的监控数据时,只需按日期整理的文件夹结构,就能自动生成带时间戳的标注文件。对于需要快速验证模型效果的场景,这种自动化流程的价值更加凸显。