文章目录
- 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 !