文字方向问题总结
由于angle和Chinese-OCR项目是集成在一起的,在了解清楚预测的方法及脉络后,写了能够独立于OCR整体执行的独立脚本。
但是,虽然可以用此脚本将图片直接转换出正确的方向,但是需要执行两次才能成功转换为0度,这也为后面的问题埋了个坑。
为了让项目整体更顺畅,我决定将CHINESE-OCR项目中的Angle文本方向检测子项目移植到本项目。首先需要解决的就是执行一次独立脚本就能够给出正确的结果,这一步经过调整转换的代码实现了。
然后是适配语法,由于原项目是基于python3.6的,原项目中使用的TensorFlow为1.7版本(太老),安装1.12版本会有语法上的更新导致其无法执行,且paddleOCR大部分是基于python3.8 or 3.8,有个别部分语法不兼容,逐适配代码使其支持python3.7.
解决完以上问题,着手将方向检测调整脚本与paddleOCR项目整合,这一步没有理论上的难点,但是由于讯飞是使用上传json数据的方式核验项目检测的正确率的,所以json数据中的坐标都需要是基于原图的坐标,而并非是转换后的图片的坐标。
此部分一定会分四种情况,即0 90 180 270四种,但是由于图像转换后坐标系也会跟着转换,这四种情况对应的算法不确定。最初尝试了几种,都不符合需求,有些甚至出现了负值!
不符合情况的失败效果:
错位的标识
在经过PS与旋转工具结合找坐标并手写计算后,摸索出了相应转换的代码,尝试各种方向成功。代码如下。
识别处理的效果:
顺时针90度
顺时针270度
顺时针180度
在此又出现一个问题,由于PaddleOCR只能由文件导入图片,不能由numpy矩阵导入,所以之前的脚本旋转后会保存并替换原图片再让paddle通过图片地址导入图片进行后续的识别操作,这样不会产生大的影响,但是会污染数据集。
于是参考pillow与c上网的图像转换脚本,直接将PIL的图片转换为C上网的格式,代码如下:
然后将之前img.save()的语句注释掉。这样处理之后就完美解决数据集的污染问题啦。
由于数据集有几千张,但是此时的代码只能单张图片识别,于是再加以修改,将全部图片遍历进来:
再加上异常处理:
此时图片旋转的问题比较完美的解决了。