文章目录
- 1.数据标注
- 1.1 数据标注要点
- 2.数据验证
- 2.1 格式验证及修改
- 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分隔。
importjsonimportosdefget_polygon_area(points):"""使用鞋带公式计算多边形面积(用于判断顺/逆时针及自相交)"""area=0.0n=len(points)foriinrange(n):j=(i+1)%n area+=points[i][0]*points[j][1]area-=points[j][0]*points[i][1]returnarea/2.0deforder_points_clockwise(pts):"""将四个点强制矫正为标准的顺时针顺序:左上->右上->右下->左下"""# 1. 按 y 坐标排序,分出上下两对点sorted_by_y=sorted(pts,key=lambdax:x[1])top_two=sorted_by_y[:2]bottom_two=sorted_by_y[2:]# 2. 上方两点按 x 排序,分出左上和右上top_two_sorted=sorted(top_two,key=lambdax:x[0])tl,tr=top_two_sorted[0],top_two_sorted[1]# 3. 下方两点按 x 排序,分出左下和右下bottom_two_sorted=sorted(bottom_two,key=lambdax:x[0])bl,br=bottom_two_sorted[0],bottom_two_sorted[1]# 返回标准的顺时针顺序return[tl,tr,br,bl]defvalidate_and_fix_points(points):"""校验并矫正四点框"""iflen(points)!=4:returnpoints,False,"点数不为4"# 计算面积,如果面积 <= 0,说明是逆时针或自相交(凹四边形)area=get_polygon_area(points)is_clockwise_convex=area<0ifis_clockwise_convex:returnpoints,True,"原始合规"else:# 自动矫正:重排为标准的左上->右上->右下->左下fixed_points=order_points_clockwise(points)returnfixed_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'withopen(input_file,'r',encoding='utf-8')asf_in,open(ok_file,'w',encoding='utf-8')asf_ok,open(ng_file,'w',encoding='utf-8')asf_ng,open(log_file,'w',encoding='utf-8')asf_log:forlineinf_in:line=line.strip()ifnotline:continue# 兼容空格或Tab分隔,提取图片名和JSON字符串parts=line.split(None,1)iflen(parts)!=2:continueimg_name,json_str=partstry:# 解析标注的JSON列表labels=json.loads(json_str)new_labels=[]log_notes=[]has_ng=Falseforlabelinlabels:original_points=label['points']fixed_points,is_valid,note=validate_and_fix_points(original_points)ifnotis_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)ifhas_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}|{'合规'ifnothas_ngelse'不合规'}|{json.dumps(new_labels,ensure_ascii=False)}|{note_summary}\n")exceptExceptionase:print(f"处理行出错:{line}, 错误:{e}")print("✅ 校验与矫正完成!已生成 MY_train_ok.txt, MY_train_ng.txt, judge_result.txt")(2)创建convert.py 脚本批量将所有全角字母、数字和符号转换为对应的半角字符。
importunicodedata input_file='rec_gt.txt'output_file='rec_gt_halfwidth.txt'withopen(input_file,'r',encoding='utf-8')asf_in,\open(output_file,'w',encoding='utf-8')asf_out:forlineinf_in:# 使用 NFKC 规范化,将全角字符转换为半角normalized_line=unicodedata.normalize('NFKC',line)f_out.write(normalized_line)print(f"转换完成!已将半角文件保存为:{output_file}")2.2 PaddleX数据验证
默认已安装paddleX(校验数据)
(1)PPOCRV5检测模型数据目录:
--data-- images -- train.txt -- val.txt检测模型数据集验证
python PaddleX-release-3.5/main.py-cPaddleX-release-3.5/paddlex/configs/modules/text_detection/PP-OCRv5_mobile_det.yaml-oGlobal.mode=check_dataset-oGlobal.dataset_dir=dataset/train_data/det(2)PPOCRV5识别模型数据目录:
--data-- images -- train.txt -- val.txt -- dict.txt识别模型数据集验证
python PaddleX-release-3.5/main.py-cpaddlex/configs/modules/text_recognition/PP-OCRv4_mobile_rec.yaml-oGlobal.mode=check_dataset-oGlobal.dataset_dir=/root/dataset/train_rec如果数据集格式合格会显示Check dataset passed !