2021SC@SDUSC
我之前在PaddleOCR的整体理解中写道,方向分类器依靠BDA数据增强和增大输入分辨率以提高识别精度,“图像的分辨率与识别精度有关,PP-OCR将归一化图像的高度和宽度分别设置为48和192,以此来提高方向分类器的准确率”。但是我却在写博客时忽略了增大输入分辨率这个方法。所以我这周的博客就来分析增大图像输入分辨率如何优化方向分类器。
人们通常使用24x24的图像进行方向分辨的模型训练,但将图像转换成320x320时,指标就能提高1-2个百分点,模型表达能力就有一个非常显著的提升。当图像的分辨率较大时,图像的一些细节就会展现出来,这样模型就能更好地捕获图片的信息。增大图像分辨率也有利有弊,预测的速率可能会变慢。由于方向分类器使用的骨干网络是MobileNetV3_small_x0.35,这是最小的网络,所以就算是增大图像分辨率,预测时间也不会增加很多。比如将32x100的图像放大为48x192,方向分类器的识别精度有很明显的提升,快了将近两个点,而预测时间仅慢了0.02ms。如下图所示。
所以PaddleOCR就采用48x192作为方向分类器识别图像的分辨率。这部分的代码如下所示:PaddleOCR-release-2.2>ppocr>data>imaug>rec_img_aug.py
class ClsResizeImg(object):
def __init__(self, image_shape, **kwargs):
self.image_shape = image_shape
def __call__(self, data):
img = data['image']
norm_img = resize_norm_img(img, self.image_shape)
data['image'] = norm_img
return data
def resize_norm_img(img, image_shape):
imgC, imgH, imgW = image_shape
h = img.shape[0]
w = img.shape[1]
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')
if image_shape[0] == 1:
resized_image = resized_image / 255
resized_image = resized_image[np.newaxis, :]
else:
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
配置文件内容:PaddleOCR-release-2.2>configs>cls>cls_mv3.yml
Train:
dataset:
name: SimpleDataSet
data_dir: ./train_data/cls
label_file_list:
- ./train_data/cls/train.txt
transforms:
- DecodeImage: # load image
img_mode: BGR
channel_first: False
- ClsLabelEncode: # Class handling label
- RecAug:
use_tia: False
- RandAugment:
- ClsResizeImg:
image_shape: [3, 48, 192] #更改方向分类器输入图片的分辨率
- KeepKeys:
keep_keys: ['image', 'label'] # dataloader will return list in this order
loader:
shuffle: True
batch_size_per_card: 512
drop_last: True
num_workers: 8