自己被这个问题困扰了一下午,特地记录一下。
问题描述:在使用ppocr训练文本方向分类器时遇到的问题,同时ppocrlabel的文本框图片导出结果可能存在类似的问题,发现导出的图片(结果)和实际相比发生了旋转。
原因以及解决方案:
百度ppocr会对检测到的文本计算高宽比,若大于某个阈值(表示文本是竖直的),则会对文本进行逆时针旋转90度(np.rot90),之后文本的方向只有0和180之分,就可以使用ppocr的[0, 180]的方向分类器进行分类,并进行旋转修改。
代码在tools/infer/utility.py文件中的get_rotate_crop_image方法,可以进行注释修改。注:PPOCRLabel可能也有类似的情况,导致导出的文本框图片出现倒立的情况(与实际情况不符合,如果需要训练文本方向分类器,需要将代码注释再导出,同时禁用文本方向分类器,use_angle_cls设置为false。
同时训练文本方向分类器的时候分清楚分清楚自己的文本方向是90度还是270.按照顺时针旋转计算。
并在tools/infer/predict_cls.py文件中进行修改,之前只支持180.
cv_rotate_code = {
'90': cv2.ROTATE_90_COUNTERCLOCKWISE,
'180': cv2.ROTATE_180,
'270': cv2.ROTATE_90_CLOCKWISE
}
if label in cv_rotate_code and score > self.cls_thresh:
img_list[indices[beg_img_no + rno]] = cv2.rotate(
img_list[indices[beg_img_no + rno]], cv_rotate_code[label])
再同时,修改超参数,有两个地方,一个是对应的超参数文件中的label_list[‘0’, ‘270’](训练或者单独推理用),另外一个就是utility文件,label_list也要进行修改(大概118行左右)(整体预测有关,predict_system)同时的同时,对于分类器分数小于cls_thresh的文本框,不会进行旋转调整,可以适当调小。