PaddleOCR的方向分类器代码解析(二)

本文详细介绍了PaddleOCR中方向分类器的作用和工作流程,包括模型结构、数据处理、训练与评估。方向分类器主要用于识别文本框内文字的正向或倒向,并进行矫正。模型主要由AdaptiveAvgPool2D和全连接层组成,通过softmax进行概率输出。
摘要由CSDN通过智能技术生成

2021SC@SDUSC
  方向分类器是文本检测矫正的一部分。文本检测一般是检测四个点,通过对四个点的水平变化,把文本框矫正成水平方向,这一步在PaddleOCR中称为几何变换。但是文本框内的输入方向可能不是正向的。方向分类器的作用就是判断水平文本框中的文字是正向的还是倒向的(根据yml配置文件的label_list项可知,文本分类器仅支持这两种)。倒向的文字由方向分类器正向化后再去识别。
  具体的方向分类器模型的构造步骤依次为确立使用的神经网络,处理数据集,训练和评估模型,处理模型损失,反向推演优化学习率,后处理模型。在之前的博客中我介绍了方向分类器所使用的MobileNetV3_small_x0.35模型,所以我在这里就不赘述方向分类器的backbone了。现在来看它的head。在神经网络中,head是获取网络输出内容的网络,利用之前提取的特征,做出预测。以下是方向分类器的head代码。PaddleOCR-release-2.2->ppocr->modeling->heads->cls_head.py:

# copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import math
import paddle
from paddle import nn, ParamAttr
import paddle.nn.functional as F


class ClsHead(nn.Layer):
    """
    Class orientation

    Args:

        params(dict): super parameters for build Class network
    """

    #__init__函数主要用来做参数初始化用,比如我们要初始化卷积的一些参数,就可以放到这里面。
    def __init__(self, in_channels, class_dim, **kwargs):
        super(ClsHead, self).__init__()
        self.pool = nn.AdaptiveAvgPool2D(1)
        stdv = 1.0 / math.sqrt(in_channels * 1.0)
        self.fc = nn.Linear(
            in_channels,
            class_dim,
            weight_attr=ParamAttr(
                name="fc_0.w_0",
                initializer=nn.initializer.Uniform(-stdv, stdv)),
            bias_attr=ParamAttr(name="fc_0.b_0"), )

    #forward函数是表示一个前向传播,构建网络层的先后运算步骤。
    def forward(self, x, targets=None):
        x = self.pool(x)
        x = paddle.reshape(x, shape=[x.shape[0], x.shape[1]])
        x = self.fc(x)
        if not self.training:
            x = F.softmax(x, axis=1)
        return x

  __init__函数中的super(ClsHead, self).init()为调用父类的初始函数以构造父类的对象。AdaptiveAvgPool2D(二元自适应均值池化函数)主要是对二维数据进行处理。其中2D是二维数据的意思。Pool指池化层,它主要负责对数据在空间维度(宽度和高度)上进行降采样(downsampling)操作。降采样就是从样本里再选样本的过程。通过这样的操作,池化层能够抽取出图像数据中最重要的特征,减小了数据尺寸,也降低了计算量,还能有效控制过拟合。Avg(均值)指定了池化层在进行降采样操作时所采用的计算方法。Adaptive(自适应)能够在我们给定输入数据和输出数据的大小后自动帮助我们计算核的大小和每次移动的步长。所以第二行代码的作用是将head的汇聚层的张量定义为1。第四行的代码中,nn.Linear()函数是用于设置网络中的全连接层的,代码中的in_channels是每个输入样本的大小,class_dim是每个输出样本的大小(在PPOCR中含义为输出分类数,并在yml文件中定义方向分类器的class_dim值为2),weight_attr是权重,bias_attr是偏差,在函数中定义了后面两个的变量和weight_attr的初值。fc代表全连接层,即将前面经过多次卷积后高度抽象化的特征进行整合,然后可以进行归一化,对各种分类情况都输出一个概率,之后的分类器(Classifier)可以根据全连接得到的概率进行分类。
  forward函数中先后定义了池化层和全连接层。倒数第二行中的softmax函数又称归一化指数函数。它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类。在最后选取输出结点的时候,我们就可以选取概率最大(也就是值对应最大的)结点,作为我们的预测目标。

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值