训练莫名终止或者评估莫名终止
这是因为在tools/program.py文件里有一句逻辑关系语言出错了,需要进行如下修改。
if idx >= len(train_dataloader):
break
#把上面这句话修改成下面这个
if idx >= len(train_dataloader)-1:
break
注意,有两个地方都要这样改,train里面和eval里面。
训练和评估的效果都特别好,预测的效果却特别差
这个是数据预处理的问题,paddleOCR官方给的推理程序里数据预处理的方式和训练程序里数据预处理的方式不完全一样,导致了训练时输入神经网络的张量维度和预测时输入神经网络的张量维度不一样,所以即使权重训练得很好,预测效果也会出现偏差。更改方式如下。
首先,要确保训练的配置文件里image_shape参数和推理的参数设置里rec_image_shape参数的值要是一样的,训练的配置文件在configs/rec里面,推理的参数设置在tools/infer/utility.py文件里面。
然后,更改tools/infer/predict_rec.py的代码,如下。
def resize_norm_img(self, img, max_wh_ratio):
imgC, imgH, imgW = self.rec_image_shape
assert imgC == img.shape[2]
if self.character_type == "ch":
imgW = int((32 * max_wh_ratio))
h, w = img.shape[:2]
ratio = w / float(h)
if math.ceil(imgH * ratio) > imgW:
resized_w = imgW
else:
resized_w = int(math.ceil(imgH * ratio))
resized_image = cv2.resize(img, (resized_w, imgH))
resized_image = resized_image.astype('float32')
resized_image = resized_image.transpose((2, 0, 1)) / 255
resized_image -= 0.5
resized_image /= 0.5
padding_im = np.zeros((imgC, imgH, imgW), dtype=np.float32)
padding_im[:, :, 0:resized_w] = resized_image
return padding_im
#把上面这个函数改成下面这个
def resize_norm_img(self, img, max_wh_ratio):
imgC, imgH, imgW = self.rec_image_shape
hh=imgW #源码没有这个,导致数据处理不对,会影响推理识别效果
assert imgC == img.shape[2]
if self.character_type == "ch":
imgW = int((32 * max_wh_ratio))
h, w = img.shape[:2]
ratio = w / float(h)
if math.ceil(imgH * ratio) > imgW:
resized_w = imgW
else:
resized_w = int(math.ceil(imgH * ratio))
resized_image = cv2.resize(img, (resized_w, imgH))
resized_image = resized_image.astype('float32')
resized_image = resized_image.transpose((2, 0, 1)) / 255
resized_image -= 0.5
resized_image /= 0.5
padding_im = np.zeros((imgC, imgH, hh), dtype=np.float32) #hh用在这里
padding_im[:, :, 0:resized_w] = resized_image
return padding_im
使用gen_label.py报错
如果直接用官网下载下来的程序,安装官网操作走,会出现如下这个错误
UnicodeDecodeError: 'gbk' codec can't decode byte 0xbf in position 2: illegal multibyte sequence
修改方式是在open的参数里面加入encoding=‘utf-8’,但是加入之后,还会出现一个错误,如下。
UnicodeDecodeError: 'gbk' codec can't decode byte 0xbf in position 2: illegal multibyte sequence
这个错误的修改方式得知道程序的具体处理原理才行,修改方式如下:
#把程序中的这一行
b = [int(t) for t in b]
#改成如下
b = [int(b[0].encode('utf-8').decode('utf-8-sig')),int(b[1])]
然后gen_label.py就可以正常运行了!
将paddleOCR转成pytorch框架
如果要将paddleOCR部署在arm架构上,这是非常不方便的一件事,因为针对arm结构的paddlepaddle框架不是很常用,容易出现各种各样的bug,特别是要用Nvidia jetson盒子部署paddle算法,使用tensorrt或deepstream加速推理的时候,几乎无从下手。这个时候我们可以避免这个难坑,先把paddlepaddle版的paddleOCR转换成pytorch框架的paddleOCR(参考https://github.com/frotms/PaddleOCR2Pytorch),然后再在arm架构上部署pytorch框架的算法,这样就会顺利很多了。
但是在这个把paddleOCR转成pytorch框架的项目里,有一个地方有点错误,导致如果检测网络的backbone用的是MobileNetV3small时,会出错。解决方案如下。
找到文件pytorchocr/modeling/backbones/det_mobilenet_v3.py
然后将类MobileNetV3中的
se = se and not self.disable_se
if s == 2 and i > 2:
改成:
se = se and not self.disable_se
start_idx = 2 if model_name == 'large' else 0
if s == 2 and i > start_idx: