PaddleLabel标注注意事项_完整版

文章目录

  • 1.数据标注
    • [1.1 数据标注要点](#1.1 数据标注要点)
  • 2.数据验证
    • [2.1 格式验证及修改](#2.1 格式验证及修改)
    • [2.2 PaddleX数据验证](#2.2 PaddleX数据验证)

1.数据标注

1.1 数据标注要点

(1)倾斜框处理。倾斜 / 旋转字符必须画倾斜四边形框,不能画正矩形,否则矫正后会变形。

(2) 多点标注顺序。对于倾斜字符需要用多点标注(按键盘 Q 进入四点模式),顺序为顺时针 / 逆时针(左上→右上→右下→左下),框要完整包围字符区域,并保留少量边缘空白,避免裁剪到字符边缘。多边形框必须是凸的。

(3)英文字符格式。如果训练英文字符,标签必须使用英文输入法下的半角字符。如果字典(my_dict.txt)里只有半角字符,模型遇到全角字符会报 (未知字符)错误导致训练失败。例如,模型无法学会"全角A"和"半角A"其实是同一个意思导致识别率低。

(4)空格处理。如果图片文本本身就包含明显的空格分隔,那么标注时就必须加上空格。如果没有空格,请注意输入字符时不要有空格,PaddleOCR 不会自动忽略空格,它会把"有空格"和"无空格"视为两个完全不同的文本。因此,标注必须和实际预测时的输入/输出需求保持一致。如果图文为了美观让数字之间呈现空格,则在标注的时候需要把空格去掉。如果保留了空格,必须确保你的字典文件(ppocr_keys_v1.txt 或自定义字典)中包含空格字符,否则模型会把空格识别为他乱码。

(5)特殊字符(#、=、|、●)要添加到自定义字典。

(6)同一行中大小不一的字符要分开标注。

(7)无法识别区域标记为 ###。

(8)在windows系统下上传标签(label.txt) 文件到算力平台,需要整个文件上传,不要粘贴复制,在粘贴复制过程中数据格式会发生转变,导致模型会跳过不符合格式的数据。

2.数据验证

2.1 格式验证及修改

(1)以下代码会判断多边形标注的数据label.txt与rec_gt.txt是否符合要求并修改不合格的数据,使得每行数据统一使用Tab分隔。

python 复制代码
import json
import os

def get_polygon_area(points):
    """使用鞋带公式计算多边形面积(用于判断顺/逆时针及自相交)"""
    area = 0.0
    n = len(points)
    for i in range(n):
        j = (i + 1) % n
        area += points[i][0] * points[j][1]
        area -= points[j][0] * points[i][1]
    return area / 2.0

def order_points_clockwise(pts):
    """将四个点强制矫正为标准的顺时针顺序:左上->右上->右下->左下"""
    # 1. 按 y 坐标排序,分出上下两对点
    sorted_by_y = sorted(pts, key=lambda x: x[1])
    top_two = sorted_by_y[:2]
    bottom_two = sorted_by_y[2:]
    
    # 2. 上方两点按 x 排序,分出左上和右上
    top_two_sorted = sorted(top_two, key=lambda x: x[0])
    tl, tr = top_two_sorted[0], top_two_sorted[1]
    
    # 3. 下方两点按 x 排序,分出左下和右下
    bottom_two_sorted = sorted(bottom_two, key=lambda x: x[0])
    bl, br = bottom_two_sorted[0], bottom_two_sorted[1]
    
    # 返回标准的顺时针顺序
    return [tl, tr, br, bl]

def validate_and_fix_points(points):
    """校验并矫正四点框"""
    if len(points) != 4:
        return points, False, "点数不为4"
    
    # 计算面积,如果面积 <= 0,说明是逆时针或自相交(凹四边形)
    area = get_polygon_area(points)
    is_clockwise_convex = area < 0
    
    if is_clockwise_convex:
        return points, True, "原始合规"
    else:
        # 自动矫正:重排为标准的左上->右上->右下->左下
        fixed_points = order_points_clockwise(points)
        return fixed_points, False, "顺序/形状不合规,自动矫正"

input_file = r'C:\Users\ls\Desktop\tmp\MY_val .txt'
ok_file = r'C:\Users\ls\Desktop\tmp\MY_val_OK.txt'
ng_file = r'C:\Users\ls\Desktop\tmp\MY_val_NG.txt'
log_file = r'C:\Users\ls\Desktop\tmp\MY_val_judge_result.txt'

with open(input_file, 'r', encoding='utf-8') as f_in, 
     open(ok_file, 'w', encoding='utf-8') as f_ok, 
     open(ng_file, 'w', encoding='utf-8') as f_ng, 
     open(log_file, 'w', encoding='utf-8') as f_log:

    for line in f_in:
        line = line.strip()
        if not line:
            continue
            
        # 兼容空格或Tab分隔,提取图片名和JSON字符串
        parts = line.split(None, 1)
        if len(parts) != 2:
            continue
            
        img_name, json_str = parts
        
        try:
            # 解析标注的JSON列表
            labels = json.loads(json_str)
            new_labels = []
            log_notes = []
            has_ng = False
            
            for label in labels:
                original_points = label['points']
                fixed_points, is_valid, note = validate_and_fix_points(original_points)
                
                if not is_valid:
                    has_ng = True
                
                # 更新矫正后的坐标
                label['points'] = fixed_points
                new_labels.append(label)
                log_notes.append(note)
            
            # 1. 写入全部合规数据(MY_train_ok.txt),统一使用Tab分隔
            f_ok.write(f"{img_name}\t{json.dumps(new_labels, ensure_ascii=False)}\n")
            
            # 2. 写入不合规的原始数据及修改后的框(MY_train_ng.txt)
            if has_ng:
                f_ng.write(f"原始:{line}\n")
                f_ng.write(f"修改:{img_name}\t{json.dumps(new_labels, ensure_ascii=False)}\n\n")
            
            # 3. 写入校验日志(judge_result.txt)
            note_summary = "; ".join(log_notes)
            f_log.write(f"{img_name}|{json_str}|{'合规' if not has_ng else '不合规'}|{json.dumps(new_labels, ensure_ascii=False)}|{note_summary}\n")

        except Exception as e:
            print(f"处理行出错: {line}, 错误: {e}")

print("✅ 校验与矫正完成!已生成 MY_train_ok.txt, MY_train_ng.txt, judge_result.txt")

(2)创建convert.py 脚本批量将所有全角字母、数字和符号转换为对应的半角字符。

python 复制代码
import unicodedata
input_file = 'rec_gt.txt'
output_file = 'rec_gt_halfwidth.txt'

with open(input_file, 'r', encoding='utf-8') as f_in, \
     open(output_file, 'w', encoding='utf-8') as f_out:
    for line in f_in:
        # 使用 NFKC 规范化,将全角字符转换为半角
        normalized_line = unicodedata.normalize('NFKC', line)
        f_out.write(normalized_line)

print(f"转换完成!已将半角文件保存为: {output_file}")

2.2 PaddleX数据验证

默认已安装paddleX(校验数据)

(1)PPOCRV5检测模型数据目录:

bash 复制代码
--data
   -- images
   -- train.txt
   -- val.txt

检测模型数据集验证

bash 复制代码
python PaddleX-release-3.5/main.py -c PaddleX-release-3.5/paddlex/configs/modules/text_detection/PP-OCRv5_mobile_det.yaml  -o Global.mode=check_dataset  -o Global.dataset_dir= dataset/train_data/det

(2)PPOCRV5识别模型数据目录:

bash 复制代码
--data
  -- images
   -- train.txt
   -- val.txt
   -- dict.txt

识别模型数据集验证

bash 复制代码
python PaddleX-release-3.5/main.py -c paddlex/configs/modules/text_recognition/PP-OCRv4_mobile_rec.yaml     -o Global.mode=check_dataset     -o Global.dataset_dir=/root/dataset/train_rec

如果数据集格式合格会显示Check dataset passed !

相关推荐
大模型任我行3 小时前
蚂蚁:无师自通的视觉记忆增强
人工智能·计算机视觉·语言模型·论文笔记
简简单单做算法6 小时前
基于混沌加密的遥感图像加密算法matlab仿真
图像处理·计算机视觉·matlab·混沌加密·遥感图像加密
armwind7 小时前
openISP学习5-CNF — Chroma Noise Filtering(Bayer 域色度噪声滤波)
图像处理·计算机视觉
armwind9 小时前
openISP学习4-AWB(自动白平衡增益控制)
图像处理·计算机视觉
armwind10 小时前
openISP学习1-openISP介绍
图像处理·计算机视觉
armwind10 小时前
openISP学习3-AAF— Anti-Aliasing Filter(抗混叠滤波)
人工智能·计算机视觉
FL162386312911 小时前
Synapse腹部CT多器官分割数据集png图片+掩码图片+颜色映射表
人工智能·计算机视觉
在水一缸11 小时前
深度解析:基于 3D Gaussian Splatting 技术的编辑器实践与原理
计算机视觉·3d·编辑器·aigc·3d建模·nerf·3d编辑器
装不满的克莱因瓶12 小时前
从梯度下降到 Adam 优化器:掌握神经网络参数优化的核心原理
人工智能·python·深度学习·神经网络·机器学习·计算机视觉·ai