文章目录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):使用鞋带公式计算多边形面积用于判断顺/逆时针及自相交area0.0nlen(points)foriinrange(n):j(i1)%n areapoints[i][0]*points[j][1]area-points[j][0]*points[i][1]returnarea/2.0deforder_points_clockwise(pts):将四个点强制矫正为标准的顺时针顺序左上-右上-右下-左下# 1. 按 y 坐标排序分出上下两对点sorted_by_ysorted(pts,keylambdax:x[1])top_twosorted_by_y[:2]bottom_twosorted_by_y[2:]# 2. 上方两点按 x 排序分出左上和右上top_two_sortedsorted(top_two,keylambdax:x[0])tl,trtop_two_sorted[0],top_two_sorted[1]# 3. 下方两点按 x 排序分出左下和右下bottom_two_sortedsorted(bottom_two,keylambdax:x[0])bl,brbottom_two_sorted[0],bottom_two_sorted[1]# 返回标准的顺时针顺序return[tl,tr,br,bl]defvalidate_and_fix_points(points):校验并矫正四点框iflen(points)!4:returnpoints,False,点数不为4# 计算面积如果面积 0说明是逆时针或自相交凹四边形areaget_polygon_area(points)is_clockwise_convexarea0ifis_clockwise_convex:returnpoints,True,原始合规else:# 自动矫正重排为标准的左上-右上-右下-左下fixed_pointsorder_points_clockwise(points)returnfixed_points,False,顺序/形状不合规自动矫正input_filerC:\Users\ls\Desktop\tmp\MY_val .txtok_filerC:\Users\ls\Desktop\tmp\MY_val_OK.txtng_filerC:\Users\ls\Desktop\tmp\MY_val_NG.txtlog_filerC:\Users\ls\Desktop\tmp\MY_val_judge_result.txtwithopen(input_file,r,encodingutf-8)asf_in,open(ok_file,w,encodingutf-8)asf_ok,open(ng_file,w,encodingutf-8)asf_ng,open(log_file,w,encodingutf-8)asf_log:forlineinf_in:lineline.strip()ifnotline:continue# 兼容空格或Tab分隔提取图片名和JSON字符串partsline.split(None,1)iflen(parts)!2:continueimg_name,json_strpartstry:# 解析标注的JSON列表labelsjson.loads(json_str)new_labels[]log_notes[]has_ngFalseforlabelinlabels:original_pointslabel[points]fixed_points,is_valid,notevalidate_and_fix_points(original_points)ifnotis_valid:has_ngTrue# 更新矫正后的坐标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_asciiFalse)}\n)# 2. 写入不合规的原始数据及修改后的框MY_train_ng.txtifhas_ng:f_ng.write(f原始{line}\n)f_ng.write(f修改{img_name}\t{json.dumps(new_labels,ensure_asciiFalse)}\n\n)# 3. 写入校验日志judge_result.txtnote_summary; .join(log_notes)f_log.write(f{img_name}{json_str}{合规ifnothas_ngelse不合规}{json.dumps(new_labels,ensure_asciiFalse)}{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_filerec_gt.txtoutput_filerec_gt_halfwidth.txtwithopen(input_file,r,encodingutf-8)asf_in,\open(output_file,w,encodingutf-8)asf_out:forlineinf_in:# 使用 NFKC 规范化将全角字符转换为半角normalized_lineunicodedata.normalize(NFKC,line)f_out.write(normalized_line)print(f转换完成已将半角文件保存为:{output_file})2.2 PaddleX数据验证默认已安装paddleX校验数据1PPOCRV5检测模型数据目录--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.modecheck_dataset-oGlobal.dataset_dirdataset/train_data/det2PPOCRV5识别模型数据目录--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.modecheck_dataset-oGlobal.dataset_dir/root/dataset/train_rec如果数据集格式合格会显示Check dataset passed !
PaddleLabel标注注意事项_完整版
发布时间:2026/6/6 20:30:38
文章目录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):使用鞋带公式计算多边形面积用于判断顺/逆时针及自相交area0.0nlen(points)foriinrange(n):j(i1)%n areapoints[i][0]*points[j][1]area-points[j][0]*points[i][1]returnarea/2.0deforder_points_clockwise(pts):将四个点强制矫正为标准的顺时针顺序左上-右上-右下-左下# 1. 按 y 坐标排序分出上下两对点sorted_by_ysorted(pts,keylambdax:x[1])top_twosorted_by_y[:2]bottom_twosorted_by_y[2:]# 2. 上方两点按 x 排序分出左上和右上top_two_sortedsorted(top_two,keylambdax:x[0])tl,trtop_two_sorted[0],top_two_sorted[1]# 3. 下方两点按 x 排序分出左下和右下bottom_two_sortedsorted(bottom_two,keylambdax:x[0])bl,brbottom_two_sorted[0],bottom_two_sorted[1]# 返回标准的顺时针顺序return[tl,tr,br,bl]defvalidate_and_fix_points(points):校验并矫正四点框iflen(points)!4:returnpoints,False,点数不为4# 计算面积如果面积 0说明是逆时针或自相交凹四边形areaget_polygon_area(points)is_clockwise_convexarea0ifis_clockwise_convex:returnpoints,True,原始合规else:# 自动矫正重排为标准的左上-右上-右下-左下fixed_pointsorder_points_clockwise(points)returnfixed_points,False,顺序/形状不合规自动矫正input_filerC:\Users\ls\Desktop\tmp\MY_val .txtok_filerC:\Users\ls\Desktop\tmp\MY_val_OK.txtng_filerC:\Users\ls\Desktop\tmp\MY_val_NG.txtlog_filerC:\Users\ls\Desktop\tmp\MY_val_judge_result.txtwithopen(input_file,r,encodingutf-8)asf_in,open(ok_file,w,encodingutf-8)asf_ok,open(ng_file,w,encodingutf-8)asf_ng,open(log_file,w,encodingutf-8)asf_log:forlineinf_in:lineline.strip()ifnotline:continue# 兼容空格或Tab分隔提取图片名和JSON字符串partsline.split(None,1)iflen(parts)!2:continueimg_name,json_strpartstry:# 解析标注的JSON列表labelsjson.loads(json_str)new_labels[]log_notes[]has_ngFalseforlabelinlabels:original_pointslabel[points]fixed_points,is_valid,notevalidate_and_fix_points(original_points)ifnotis_valid:has_ngTrue# 更新矫正后的坐标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_asciiFalse)}\n)# 2. 写入不合规的原始数据及修改后的框MY_train_ng.txtifhas_ng:f_ng.write(f原始{line}\n)f_ng.write(f修改{img_name}\t{json.dumps(new_labels,ensure_asciiFalse)}\n\n)# 3. 写入校验日志judge_result.txtnote_summary; .join(log_notes)f_log.write(f{img_name}{json_str}{合规ifnothas_ngelse不合规}{json.dumps(new_labels,ensure_asciiFalse)}{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_filerec_gt.txtoutput_filerec_gt_halfwidth.txtwithopen(input_file,r,encodingutf-8)asf_in,\open(output_file,w,encodingutf-8)asf_out:forlineinf_in:# 使用 NFKC 规范化将全角字符转换为半角normalized_lineunicodedata.normalize(NFKC,line)f_out.write(normalized_line)print(f转换完成已将半角文件保存为:{output_file})2.2 PaddleX数据验证默认已安装paddleX校验数据1PPOCRV5检测模型数据目录--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.modecheck_dataset-oGlobal.dataset_dirdataset/train_data/det2PPOCRV5识别模型数据目录--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.modecheck_dataset-oGlobal.dataset_dir/root/dataset/train_rec如果数据集格式合格会显示Check dataset passed !