选题背景意义
手写汉字作为中国传统文化的重要载体,在日常生活和工作中仍然被广泛使用。随着信息化时代的发展,如何将手写汉字高效地转换为电子文本成为一个重要的研究课题。特别是对于手写潦草汉字,由于其笔画变形、结构松散等特点,识别难度较大,传统的识别方法难以满足实际需求。深度学习技术的快速发展为手写汉字识别提供了新的解决方案,通过构建深度神经网络模型,可以自动学习手写汉字的特征表示,从而提高识别准确率;手写潦草汉字识别的研究具有重要的理论意义和实际应用价值。从理论角度来看,手写潦草汉字识别涉及图像处理、模式识别、机器学习等多个学科领域的交叉融合,研究手写潦草汉字识别算法可以推动这些学科的发展。从实际应用角度来看,手写潦草汉字识别技术可以应用于文档数字化、手写笔记识别、手写签名验证等多个领域,提高信息处理效率,降低人力成本。

深度学习技术的快速发展为手写汉字识别提供了新的思路和方法。与传统的模式识别方法相比,深度学习方法具有更强的特征学习能力和泛化能力,能够自动学习手写汉字的深层特征表示,从而提高识别准确率。特别是卷积神经网络(CNN)在图像识别领域取得了显著的成果,为手写汉字识别提供了有效的技术支持。手写汉字识别领域,研究者们已经提出了多种基于卷积神经网络的识别方法,如LeNet、AlexNet、VGG、ResNet等。这些方法在不同的数据集上取得了较好的识别结果,但对于手写潦草汉字的识别仍然存在一些挑战。因此,需要进一步改进卷积神经网络的结构,提高其对潦草汉字的特征提取能力和识别能力。

数据集构建
数据来源
数据集是深度学习模型训练的基础,构建高质量的数据集对于提高模型的性能至关重要。手写潦草汉字数据集的构建需要考虑多个因素,包括数据来源、数据量、数据多样性等。常用的手写汉字数据集包括CASIA-HWDB、SCUT-EPT、HCL2000等,这些数据集包含了大量的手写汉字样本,涵盖了不同的书写风格和潦草程度。
CASIA-HWDB数据集是由中国科学院自动化研究所构建的大型手写汉字数据集,包含了3755类汉字和171类符号,共1172904张图片。该数据集的样本数量大,覆盖范围广,包含了不同书写者的手写汉字样本,具有较高的代表性和实用性。因此,选择CASIA-HWDB1.1数据集作为基础数据集,为模型的训练提供丰富的数据支持。
除了基础数据集外,还需要构建模板字库,用于与手写汉字进行对比,提取结构特征。模板字库包含了所有汉字的正楷印刷体图片,通过扫描正楷印刷体字典,然后对扫描图像进行预处理和分割,得到每个汉字的正楷印刷体图片。模板字库的构建需要保证图片的质量和准确性,为结构特征的提取提供可靠的基础。
数据标注
数据标注是数据集构建的关键环节,准确的标注信息对于模型的训练至关重要。手写汉字数据集的标注包括汉字类别标注和质量等级标注。汉字类别标注是指确定每张图片对应的汉字类别,质量等级标注是指根据汉字的潦草程度划分质量等级。
质量等级的划分是手写汉字评价的基础,根据汉字的潦草程度将其划分为不同的等级。一般来说,手写汉字的质量等级可以划分为L1-L4四个等级,其中L1表示书写规范的汉字,L2表示书写较规范的汉字,L3表示书写较潦草的汉字,L4表示书写非常潦草的汉字。质量等级的划分需要考虑笔画的变形程度、结构的松散程度、整体的可读性等因素。
数据标注的方法包括人工标注和自动标注。人工标注是由专业人员对样本进行标注,标注结果准确但效率较低。自动标注是通过训练评价模型对样本进行自动标注,标注效率高但准确性依赖于评价模型的性能。为了提高标注的效率和准确性,可以采用人工标注和自动标注相结合的方法,首先由人工对部分样本进行标注,然后通过训练评价模型对其余样本进行自动标注。
功能模块介绍
图像预处理模块
图像预处理模块是手写汉字识别与评价系统的基础,负责对输入的手写汉字图像进行预处理,提高图像的质量,为后续的特征提取和识别提供良好的基础。图像预处理模块的主要功能包括灰度化、二值化、去噪、位置标准化、大小统一化等。
灰度化是将彩色图像转换为灰度图像的过程,采用加权平均法,根据人眼对不同颜色的敏感度,对RGB三个通道的像素值进行加权平均。二值化是将灰度图像转换为黑白图像的过程,使用阈值分割法,将灰度值大于阈值的像素设置为白色,小于阈值的像素设置为黑色。去噪是去除图像中的噪声的过程,采用中值滤波,去除图像中的椒盐噪声和脉冲噪声。
位置标准化是调整图像中汉字位置的过程,通过计算汉字的最小外接矩形,使汉字位于图像的中心位置。大小统一化是调整图像大小的过程,采用双三次插值,将图像的大小统一为固定尺寸,便于后续的特征提取和模型训练。图像预处理模块的设计考虑了各种手写汉字的特点,能够适应不同的书写风格和潦草程度,为后续的处理提供高质量的图像数据。
手写汉字识别模块
手写汉字识别模块是系统的核心模块之一,负责对预处理后的手写汉字图像进行识别,确定汉字的类别。手写汉字识别模块采用了基于深度学习的方法,使用RepVGG网络作为基础模型,并结合注意力机制和SoftPool池化进行改进,提高了对潦草汉字的识别能力。
RepVGG网络是一种轻量级的卷积神经网络,具有训练简单、推理快速的特点。该网络在训练阶段采用多分支结构,包含主分支和多个旁路分支,通过残差连接和1×1卷积提高特征提取能力;在测试阶段,通过重参数化技术将多分支结构转换为单分支结构,提高推理速度。RepVGG网络的设计兼顾了训练性能和推理效率,非常适合手写汉字识别任务。
为了提高模型对汉字特征的关注能力,在RepVGG网络中嵌入了注意力机制模块。注意力机制能够自动学习特征的重要性,对重要的特征赋予较高的权重,对不重要的特征赋予较低的权重。常用的注意力机制包括SE、ECA、CBAM等,其中CBAM注意力机制结合了通道注意力和空间注意力,能够同时关注通道特征和空间特征,提高特征表示能力。
手写汉字评价模块
手写汉字评价模块负责对识别出的手写汉字进行质量评价,确定汉字的潦草程度。评价模块采用了结构特征与神经网络特征融合的方法,综合考虑了汉字的笔画特征、部件布局特征和整字形状特征,构建了科学的评价标准。
结构特征提取是评价模块的重要组成部分,包括笔画特征、部件布局特征和整字形状特征。笔画特征包括笔画位置、笔画长短、笔画区域比例、相对位置偏移等;部件布局特征包括部件区域占比、部件相对位置等;整字形状特征包括宽高比例、重心位置等。结构特征的提取通过比较手写汉字与模板字库中的正楷印刷体汉字,计算两者之间的相似度。

神经网络特征提取是评价模块的另一个重要组成部分,使用RepVGG-B3g4模型作为特征提取器,提取手写汉字图像的深度特征。神经网络特征能够捕捉汉字的高层语义信息,弥补结构特征的不足。通过将结构特征和神经网络特征进行加权融合,可以综合利用两种特征的优势,提高评价的准确性。
评价模型的构建采用了加权融合的方法,将结构特征和神经网络特征的得分进行加权平均,得到最终的评价分数。权重的确定通过训练评价模型,学习结构特征和神经网络特征对评价结果的贡献度。评价分数的范围为0-100分,根据分数将汉字的质量等级划分为L1-L4四个等级。
算法理论
RepVGG网络结构设计
RepVGG网络是一种轻量级的卷积神经网络,其设计思想是在训练阶段采用多分支结构,提高模型的训练性能;在测试阶段,通过重参数化技术将多分支结构转换为单分支结构,提高推理速度。RepVGG网络的结构简洁,仅由卷积块和激活函数组成,没有显式的池化层,而是使用步幅为2的卷积操作来替代传统的池化层,实现特征图尺寸的减小。

RepVGG网络的基本构建块是RepVGGBlock,每个RepVGGBlock包含主分支和多个旁路分支。主分支是一个3×3卷积层,旁路分支包括1×1卷积层和恒等映射。在训练阶段,多个分支并行计算,通过残差连接将结果相加,提高特征提取能力。在测试阶段,通过将多个分支的参数合并到主分支中,将多分支结构转换为单分支结构,减少计算量,提高推理速度。
RepVGG网络的优点在于训练简单、推理快速、性能优异。通过重参数化技术,RepVGG网络在保持较高识别准确率的同时,显著提高了推理速度,非常适合部署在资源受限的设备上。在手写汉字识别任务中,RepVGG网络能够高效地提取汉字的特征,提高识别准确率。
注意力机制原理与应用
注意力机制是一种模仿人类视觉注意力的机制,能够自动学习特征的重要性,对重要的特征赋予较高的权重,对不重要的特征赋予较低的权重。注意力机制在深度学习中得到了广泛的应用,能够显著提高模型的性能。在手写汉字识别任务中,注意力机制能够帮助模型关注汉字的关键特征,提高对潦草汉字的识别能力。
常见的注意力机制包括SE注意力机制、ECA注意力机制、CBAM注意力机制等。SE注意力机制是一种通道注意力机制,通过全局平均池化和全连接层学习通道间的关系,对通道特征进行加权。ECA注意力机制是SE注意力机制的改进,通过一维卷积学习通道间的局部关系,减少了参数量。CBAM注意力机制结合了通道注意力和空间注意力,能够同时关注通道特征和空间特征,提高特征表示能力。

在手写汉字识别任务中,CBAM注意力机制能够帮助模型关注汉字的关键笔画和结构,提高对潦草汉字的识别能力。通过在RepVGG网络中嵌入CBAM注意力机制,可以提高模型的特征表示能力,从而提高识别准确率。同时,通过将SoftPool池化嵌入到CBAM注意力机制的通道注意力模块中,可以保留更多的特征信息,进一步提高模型的性能。
SoftPool池化的改进方法
池化层是卷积神经网络中的重要组成部分,负责减小特征图的尺寸,减少参数量,提高模型的泛化能力。传统的池化层包括最大池化和平均池化,最大池化取池化窗口内的最大值,平均池化取池化窗口内的平均值。然而,这些池化方法在池化过程中会丢失大量的特征信息,影响模型的性能。

SoftPool池化是一种新型的池化方法,通过Softmax归一化计算平滑最大值,能够保留更多的特征信息。SoftPool池化的基本思想是将池化窗口内的特征值通过Softmax归一化转换为概率分布,然后计算加权平均值,作为池化后的结果。SoftPool池化的优点是能够保留更多的特征信息,减少信息损失,提高模型的性能。
在手写汉字识别任务中,SoftPool池化能够保留汉字的更多细节特征,提高模型对潦草汉字的识别能力。通过将SoftPool池化嵌入到CBAM注意力机制的通道注意力模块中,替换传统的最大池化,可以提高注意力机制的性能。这种改进方法能够帮助模型更好地提取手写汉字的特征,提高识别准确率。
相关代码介绍
图像预处理模块代码实现
图像预处理是手写汉字识别与评价系统的基础,负责对输入的手写汉字图像进行预处理,提高图像的质量,为后续的特征提取和识别提供良好的基础。图像预处理模块的主要功能包括灰度化、二值化、去噪、位置标准化、大小统一化等。以下是图像预处理模块的核心代码实现。
import cv2
import numpy as np
def preprocess_image(image_path, target_size=(64, 64)):
"""
手写汉字图像预处理函数
:param image_path: 图像文件路径
:param target_size: 目标图像尺寸
:return: 预处理后的图像
"""
# 读取图像
image = cv2.imread(image_path)
if image is None:
raise ValueError("无法读取图像文件")
# 灰度化
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 二值化
_, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# 去噪
denoised = cv2.medianBlur(binary, 3)
# 位置标准化
# 找到轮廓
contours, _ = cv2.findContours(denoised, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
if not contours:
raise ValueError("无法找到图像中的轮廓")
# 找到最大轮廓
max_contour = max(contours, key=cv2.contourArea)
# 计算最小外接矩形
x, y, w, h = cv2.boundingRect(max_contour)
# 裁剪图像
cropped = denoised[y:y+h, x:x+w]
# 居中放置
h_cropped, w_cropped = cropped.shape
padded = np.zeros((max(h_cropped, w_cropped), max(h_cropped, w_cropped)), dtype=np.uint8)
y_start = (padded.shape[0] - h_cropped) // 2
x_start = (padded.shape[1] - w_cropped) // 2
padded[y_start:y_start+h_cropped, x_start:x_start+w_cropped] = cropped
# 大小统一化
resized = cv2.resize(padded, target_size, interpolation=cv2.INTER_CUBIC)
return resized
RepVGG网络代码实现
RepVGG网络是手写汉字识别模块的基础模型,具有训练简单、推理快速的特点。RepVGG网络在训练阶段采用多分支结构,提高模型的训练性能;在测试阶段,通过重参数化技术将多分支结构转换为单分支结构,提高推理速度。以下是RepVGG网络的核心代码实现。
import torch
import torch.nn as nn
class RepVGGBlock(nn.Module):
"""
RepVGG块实现
"""
def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, deploy=False):
super(RepVGGBlock, self).__init__()
self.deploy = deploy
self.in_channels = in_channels
self.out_channels = out_channels
# 主分支
self.conv3x3 = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding, dilation, groups, bias=True)
# 旁路分支
if not deploy:
# 1x1卷积分支
self.conv1x1 = nn.Conv2d(in_channels, out_channels, 1, stride, 0, dilation, groups, bias=True)
# 恒等映射分支
if in_channels == out_channels and stride == 1:
self.identity = True
else:
self.identity = False
self.relu = nn.ReLU()
def forward(self, x):
if self.deploy:
return self.relu(self.conv3x3(x))
else:
out = self.conv3x3(x)
out += self.conv1x1(x)
if self.identity:
out += x
return self.relu(out)
def rep_to_deploy(self):
"""
将训练阶段的多分支结构转换为测试阶段的单分支结构
"""
if self.deploy:
return
# 合并主分支和旁路分支的参数
kernel3x3, bias3x3 = self.conv3x3.weight, self.conv3x3.bias
kernel1x1, bias1x1 = self.conv1x1.weight, self.conv1x1.bias
# 将1x1卷积转换为3x3卷积
kernel1x1_pad = nn.functional.pad(kernel1x1, [1, 1, 1, 1])
# 合并卷积核和偏置
kernel_merged = kernel3x3 + kernel1x1_pad
bias_merged = bias3x3 + bias1x1
# 处理恒等映射分支
if self.identity:
# 创建恒等映射的卷积核
kernel_identity = torch.zeros_like(kernel3x3)
kernel_identity[:, :, 1, 1] = 1.0
kernel_merged += kernel_identity
# 更新主分支的参数
self.conv3x3.weight.data = kernel_merged
self.conv3x3.bias.data = bias_merged
# 移除旁路分支
self.deploy = True
del self.conv1x1
self.identity = False
class RepVGG(nn.Module):
"""
RepVGG网络实现
"""
def __init__(self, num_classes=3755, deploy=False):
super(RepVGG, self).__init__()
self.deploy = deploy
# 构建网络
self.stage0 = RepVGGBlock(1, 64, 3, stride=2, padding=1, deploy=deploy)
self.stage1 = RepVGGBlock(64, 64, 3, stride=2, padding=1, deploy=deploy)
self.stage2 = nn.Sequential(
RepVGGBlock(64, 128, 3, stride=2, padding=1, deploy=deploy),
RepVGGBlock(128, 128, 3, stride=1, padding=1, deploy=deploy),
)
self.stage3 = nn.Sequential(
RepVGGBlock(128, 256, 3, stride=2, padding=1, deploy=deploy),
RepVGGBlock(256, 256, 3, stride=1, padding=1, deploy=deploy),
RepVGGBlock(256, 256, 3, stride=1, padding=1, deploy=deploy),
)
self.stage4 = nn.Sequential(
RepVGGBlock(256, 512, 3, stride=2, padding=1, deploy=deploy),
RepVGGBlock(512, 512, 3, stride=1, padding=1, deploy=deploy),
)
# 全连接层
self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
self.fc = nn.Linear(512, num_classes)
def forward(self, x):
x = self.stage0(x)
x = self.stage1(x)
x = self.stage2(x)
x = self.stage3(x)
x = self.stage4(x)
x = self.avgpool(x)
x = torch.flatten(x, 1)
x = self.fc(x)
return x
def rep_to_deploy(self):
"""
将整个网络转换为测试阶段的单分支结构
"""
if self.deploy:
return
self.stage0.rep_to_deploy()
self.stage1.rep_to_deploy()
for block in self.stage2:
block.rep_to_deploy()
for block in self.stage3:
block.rep_to_deploy()
for block in self.stage4:
block.rep_to_deploy()
self.deploy = True
CBAM注意力机制代码实现
CBAM注意力机制是手写汉字识别模块的重要改进,能够同时关注通道特征和空间特征,提高模型的特征表示能力。CBAM注意力机制结合了通道注意力和空间注意力,能够自动学习特征的重要性,对重要的特征赋予较高的权重,对不重要的特征赋予较低的权重。以下是CBAM注意力机制的核心代码实现。
import torch
import torch.nn as nn
import torch.nn.functional as F
class ChannelAttention(nn.Module):
"""
通道注意力模块
"""
def __init__(self, in_channels, reduction=16):
super(ChannelAttention, self).__init__()
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.max_pool = nn.AdaptiveMaxPool2d(1)
# 全连接层
self.fc = nn.Sequential(
nn.Linear(in_channels, in_channels // reduction, bias=False),
nn.ReLU(inplace=True),
nn.Linear(in_channels // reduction, in_channels, bias=False)
)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
b, c, _, _ = x.size()
# 平均池化
avg_out = self.avg_pool(x).view(b, c)
avg_out = self.fc(avg_out).view(b, c, 1, 1)
# 最大池化
max_out = self.max_pool(x).view(b, c)
max_out = self.fc(max_out).view(b, c, 1, 1)
# 相加并激活
out = avg_out + max_out
out = self.sigmoid(out)
return x * out
class SpatialAttention(nn.Module):
"""
空间注意力模块
"""
def __init__(self, kernel_size=7):
super(SpatialAttention, self).__init__()
self.conv = nn.Conv2d(2, 1, kernel_size, padding=kernel_size//2, bias=False)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
# 沿通道维度进行平均池化和最大池化
avg_out = torch.mean(x, dim=1, keepdim=True)
max_out, _ = torch.max(x, dim=1, keepdim=True)
# 拼接
out = torch.cat([avg_out, max_out], dim=1)
# 卷积和激活
out = self.conv(out)
out = self.sigmoid(out)
return x * out
class CBAM(nn.Module):
"""
CBAM注意力机制
"""
def __init__(self, in_channels, reduction=16, kernel_size=7):
super(CBAM, self).__init__()
self.channel_attention = ChannelAttention(in_channels, reduction)
self.spatial_attention = SpatialAttention(kernel_size)
def forward(self, x):
x = self.channel_attention(x)
x = self.spatial_attention(x)
return x
class RepVGGWithCBAM(nn.Module):
"""
嵌入CBAM注意力机制的RepVGG网络
"""
def __init__(self, num_classes=3755, deploy=False):
super(RepVGGWithCBAM, self).__init__()
self.repvgg = RepVGG(num_classes, deploy)
# 在每个阶段后添加CBAM注意力模块
self.cbam2 = CBAM(128)
self.cbam3 = CBAM(256)
self.cbam4 = CBAM(512)
def forward(self, x):
x = self.repvgg.stage0(x)
x = self.repvgg.stage1(x)
x = self.repvgg.stage2(x)
x = self.cbam2(x)
x = self.repvgg.stage3(x)
x = self.cbam3(x)
x = self.repvgg.stage4(x)
x = self.cbam4(x)
x = self.repvgg.avgpool(x)
x = torch.flatten(x, 1)
x = self.repvgg.fc(x)
return x
def rep_to_deploy(self):
"""
将整个网络转换为测试阶段的单分支结构
"""
self.repvgg.rep_to_deploy()
重难点和创新点
技术难点分析
基于深度学习的手写潦草汉字识别算法的研究与实现涉及多个技术难点,主要包括以下几个方面:
首先,手写潦草汉字的特征提取是一个重要的技术难点。手写潦草汉字的笔画变形严重,结构松散,传统的特征提取方法难以准确捕捉其特征。因此,需要设计一种能够有效提取潦草汉字特征的深度神经网络模型。RepVGG网络的设计考虑了这一点,通过多分支结构和重参数化技术,提高了特征提取能力和推理速度。
其次,注意力机制的设计和应用是另一个技术难点。注意力机制能够帮助模型关注汉字的关键特征,提高对潦草汉字的识别能力。但是,如何设计一种有效的注意力机制,使其能够同时关注通道特征和空间特征,是一个挑战。CBAM注意力机制的设计考虑了这一点,结合了通道注意力和空间注意力,提高了特征表示能力。
最后,手写汉字评价模型的构建是一个技术难点。手写汉字的质量评价涉及多个方面,如笔画的规范性、结构的合理性、整体的美观性等。如何构建一个全面的评价模型,客观、准确地评价汉字的质量,是一个挑战。结构特征与神经网络特征融合的方法考虑了这一点,综合利用了两种特征的优势,提高了评价的准确性。
技术创新点
基于深度学习的手写潦草汉字识别算法的研究与实现具有多个技术创新点,主要包括以下几个方面:
首先,基于注意力机制的RepVGG改进是一个创新点。通过在RepVGG网络中嵌入CBAM注意力机制,能够同时关注通道特征和空间特征,提高模型的特征表示能力。CBAM注意力机制能够帮助模型关注汉字的关键笔画和结构,提高对潦草汉字的识别能力。
其次,SoftPool池化的应用是另一个创新点。SoftPool池化通过Softmax归一化计算平滑最大值,能够保留更多的特征信息。通过将SoftPool池化嵌入到CBAM注意力机制的通道注意力模块中,替换传统的最大池化,可以保留更多的特征信息,进一步提高模型的性能。
最后,结构特征与神经网络特征融合的评价模型是一个创新点。通过提取手写汉字的结构特征和神经网络特征,构建全面的评价模型,客观、准确地评价汉字的质量。结构特征包括笔画特征、部件布局特征、整字形状特征等,神经网络特征能够捕捉汉字的高层语义信息。通过将两种特征进行加权融合,可以综合利用两种特征的优势,提高评价的准确性。
相关文献
[1] Ding X, Zhang X, Ma N, et al. RepVGG: Making VGG-style ConvNets Great Again[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2021: 13733-13742.
[2] Hu J, Shen L, Sun G. Squeeze-and-Excitation Networks[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018: 7132-7141.
[3] Wang Q, Wu B, Zhu P, et al. ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2020: 11531-11539.
[4] Woo S, Park J, Lee J Y, et al. CBAM: Convolutional Block Attention Module[C]//Proceedings of the European Conference on Computer Vision (ECCV). 2018: 3-19.
[5] Chu X, Zhang G, Li B, et al. SoftPool: Improving Image Recognition with Soft Pooling[J]. arXiv preprint arXiv:2101.00440, 2021.
[6] Liu C L, Yin F, Wang D H, et al. CASIA Online and Offline Chinese Handwriting Databases[C]//Proceedings of the Eighth International Conference on Document Analysis and Recognition. 2005: 306-310.
[7] Zhang Y, Yang J, Feng J, et al. Handwritten Chinese Character Recognition: A Comprehensive Study and New Benchmark[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2020, 43(3): 854-868.
[8] Li X, Wang W, Hu X, et al. Deep Learning for Handwritten Chinese Character Recognition: A Survey[J]. Pattern Recognition, 2022, 121: 108227.
2000

被折叠的 条评论
为什么被折叠?



