当前位置:   article > 正文

2024年MathorCup高校数学建模挑战赛(B题)深度剖析_建模完整过程+详细思路+代码全解析_2024 mathorcup b题u-net+efficientnet

2024 mathorcup b题u-net+efficientnet

问题1

甲骨文图像预处理模型的主要目的是对图像进行初步处理,去除干扰元素,提取图像中的文字特征。其中,干扰元素主要包括点状噪声、人工纹理和固有纹理,其干扰程度不同,需要采用不同的方法进行处理。本模型采用图像滤波和形态学运算相结合的方法,对图像进行预处理,然后再进行特征提取。

首先,对图像进行灰度化处理,将彩色图像转换为灰度图像。然后,对图像进行高斯滤波,去除图像中的噪声。高斯滤波器的公式如下:
G ( x , y ) = 1 2 π σ 2 e − x 2 + y 2 2 σ 2 G(x,y) = \dfrac{1}{2\pi\sigma^2}e^{-\frac{x^2+y^2}{2\sigma^2}} G(x,y)=2πσ21e2σ2x2+y2
其中, G ( x , y ) G(x,y) G(x,y)为高斯滤波器, σ \sigma σ为标准差, x , y x,y x,y为像素坐标。

接着,采用形态学运算中的腐蚀和膨胀操作,对图像进行进一步的处理。腐蚀操作可以消除图像中的小斑点,使图像中的文字更加清晰,其公式如下:
A ⊖ B = { z ∣ ( B ) z ⊆ A } A \ominus B = \{ z | (B)_z \subseteq A \} AB={z(B)zA}
其中, A A A为原始图像, B B B为结构元素, ( B ) z (B)_z (B)z表示结构元素在图像 A A A的坐标为 z z z的位置进行覆盖, ⊖ \ominus 表示腐蚀操作。

膨胀操作则可以填补文字中的空隙,使得文字更加完整,其公式如下:
A ⊕ B = ⋃ b ∈ B { a + b ∣ a ∈ A } A \oplus B = \bigcup_{b\in B} \{ a+b | a\in A \} AB=bB{a+baA}
其中, A A A为原始图像, B B B为结构元素, + + +表示图像的平移, ⊕ \oplus 表示膨胀操作。

经过上述处理后,再采用二值化的方法,将图像转换为黑白图像,便于后续的特征提取。二值化的公式如下:
g ( x , y ) = { 0 , f ( x , y ) < T 1 , f ( x , y ) ≥ T g(x,y) = \left\{

0,f(x,y)<T1,f(x,y)T
\right. g(x,y)={0,1,f(x,y)<Tf(x,y)T
其中, g ( x , y ) g(x,y) g(x,y)为二值图像, f ( x , y ) f(x,y) f(x,y)为灰度图像, T T T为阈值。

最后,对图像进行轮廓提取,得到图像中的文字区域。轮廓提取的公式如下:
C = { x ∣ x ∈ X , D ( x ) ⊇ G ( x ) } \boldsymbol{C} = \{\boldsymbol{x} | \boldsymbol{x}\in \boldsymbol{X}, \boldsymbol{D}(\boldsymbol{x})\supseteq \boldsymbol{G}(\boldsymbol{x})\} C={xxX,D(x)G(x)}
其中, C \boldsymbol{C} C为轮廓, X \boldsymbol{X} X为图像的像素集合, D ( x ) \boldsymbol{D}(\boldsymbol{x}) D(x)为图像的膨胀结果, G ( x ) \boldsymbol{G}(\boldsymbol{x}) G(x)为图像的轮廓结果。

甲骨文图像分割模型的主要目的是对图像中的文字进行分割,将不同的文字分割出来。本模型采用基于深度学习的方法,通过卷积神经网络对图像进行分割。
首先对已标注的甲骨文图像进行预处理,得到干净的图像,然后将图像划分为训练集和验证集,其中训练集用于训练模型,验证集用于评估模型的性能。接着构建卷积神经网络,采用卷积层、池化层和全连接层构成,最后通过Softmax函数输出图像的分割结果。卷积神经网络的公式如下:
f i + 1 ( x ) = σ ( W i f i ( x ) + b i ) f_{i+1}(x) = \sigma(W_if_i(x)+b_i) fi+1(x)=σ(Wifi(x)+bi)
其中, f i ( x ) f_i(x) fi(x)为第 i i i层的输出, σ \sigma σ为激活函数, W i W_i Wi为权重, b i b_i bi为偏置。

最后,训练模型,通过反向传播算法更新网络中的参数,使得模型的预测结果与标注结果尽可能接近。训练的目标函数如下:
min ⁡ w , b 1 N ∑ i = 1 N L ( f ( x i ; w , b ) , y i ) + λ ∑ j = 1 n w j 2 \min_{w,b} \dfrac{1}{N}\sum_{i=1}^{N}L(f(x_i;w,b),y_i) + \lambda \sum_{j=1}^{n} w_j^2 w,bminN1i=1NL(f(xi;w,b),yi)+λj=1nwj2
其中, L L L为损失函数, w w w b b b为网络中的参数, λ \lambda λ为正则化参数。

经过上述步骤,便可以得到一个快速准确的甲骨文图像分割模型,如图4所示。

利用建立的甲骨文图像分割模型,对附件3中的200张甲骨文原始拓片图像进行单字分割,并将分割结果放在“Test_results.xlsx”中,如图5所示。其中,每个单元格表示一个文字,其分割结果为0或1,0表示该位置不是文字,1表示该位置是文字。

甲骨文文字识别模型的主要目的是对图像中的文字进行识别,通过识别出的文字,可以推断出图像中的问题。本模型采用基于深度学习的方法,通过卷积神经网络对图像进行识别。

首先,对训练集中的甲骨文字形进行预处理,得到干净的图像,然后将图像划分为训练集和验证集,其中训练集用于训练模型,验证集用于评估模型的性能。

接着,构建卷积神经网络,采用卷积层、池化层和全连接层构成,最后通过Softmax函数输出图像的识别结果。卷积神经网络的公式如下:
f i + 1 ( x ) = σ ( W i f i ( x ) + b i ) f_{i+1}(x) = \sigma(W_if_i(x)+b_i) fi+1(x)=σ(Wifi(x)+bi)
其中, f i ( x ) f_i(x) fi(x)为第 i i i层的输出, σ \sigma σ为激活函数, W i W_i Wi为权重, b i b_i bi为偏置。

最后,训练模型,通过反向传播算法更新网络中的参数,使得模型的识别结果与标注结果尽可能接近。训练的目标函数如下:
min ⁡ w , b 1 N ∑ i = 1 N L ( f ( x i ; w , b ) , y i ) + λ ∑ j = 1 n w j 2 \min_{w,b} \dfrac{1}{N}\sum_{i=1}^{N}L(f(x_i;w,b),y_i) + \lambda \sum_{j=1}^{n} w_j^2 w,bminN1i=1NL(f(xi;w,b),yi)+λj=1nwj2
其中, L L L为损失函数, w w w b b b为网络中的参数, λ \lambda λ为正则化参数。

Python代码如下:

# 导入所需的库
import cv2
import numpy as np
from skimage import morphology, measure

# 读取图像
image = cv2.imread("Pre_test/1.png", 0)

# 图像预处理
# 灰度化
gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 二值化
ret, binary_img = cv2.threshold(gray_img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
# 去噪
dilated_img = cv2.morphologyEx(binary_img, cv2.MORPH_OPEN, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)))
# 边缘检测
edges = cv2.Canny(dilated_img, 100, 200)

# 去除点状噪声和人工纹理
kernel = np.ones((3, 3), np.uint8)
opening = cv2.morphologyEx(edges, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel)

# 利用轮廓检测算法提取甲骨文字轮廓
contours, hierarchy = cv2.findContours(closing, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 根据轮廓的几何特征对文字和干扰元素进行初步判别
for contour in contours:
    area = cv2.contourArea(contour)
    perimeter = cv2.arcLength(contour, True)
    circularity = 4 * np.pi * area / (perimeter * perimeter)
    # 根据圆形度阈值判别
    if circularity < 0.9:
        # 去除干扰元素
        cv2.drawContours(image, contour, -1, (0, 0, 0), -1)

# 显示结果图像
cv2.imshow("result", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

问题2

问题2的数学建模如下:

甲骨文图像分割模型的建立可分为以下几个步骤:

  1. 数据预处理:对甲骨文原始拓片图像进行降噪处理,去除图像中的点状噪声、人工纹理和固有纹理。可以利用图像处理中的滤波算法来实现降噪处理,如中值滤波、高斯滤波等。
  2. 特征提取:对预处理后的甲骨文图像提取特征,可以选择使用深度学习中的卷积神经网络(CNN)来提取图像特征。首先将甲骨文图像转换为灰度图像,然后使用卷积核对图像进行卷积运算得到特征图,最后使用池化操作来减小特征图的尺寸。
  3. 建立分割模型:可以采用基于深度学习的图像分割模型,如FCN、U-Net等。这些模型可以有效地处理图像中的干扰元素,同时可以保留图像中的细节信息。模型的输入为特征图,输出为分割结果。
  4. 模型训练:使用标注好的数据集来训练分割模型。训练过程中需要选择合适的损失函数,如交叉熵损失函数,来评估模型分割结果的准确性。可以使用梯度下降法来优化模型的参数,使得损失函数最小化。
  5. 模型评估:使用训练好的模型对测试集中的图像进行分割,然后与标注好的结果进行比较,计算模型的准确率、召回率和F1值等指标来评估模型的性能。
  6. 参数调优:根据模型评估的结果,可以调整模型的参数,如卷积核大小、网络层数、学习率等,来进一步优化模型的性能。
  7. 模型应用:最后,可以使用建立好的甲骨文图像分割模型来对新的甲骨文图像进行分割,并将分割结果用于文字识别等后续处理。

模型建立的数学表达为:

假设原始甲骨文图像为 I I I,经过预处理和特征提取后得到特征图 F F F,分割模型 M M M的输入为 F F F,输出为分割结果 S S S,则有:
S = M ( F ) S = M(F) S=M(F)
模型训练过程中,需要选择合适的损失函数 L L L来评估分割结果的准确性,可以选择交叉熵损失函数,即:
L = − ∑ i = 1 n y i log ⁡ ( p i ) L = -\sum_{i=1}^n y_i \log(p_i) L=i=1nyilog(pi)
其中 n n n为分割结果的像素数量, y i y_i yi为标注好的结果, p i p_i pi为模型预测的结果。模型的优化目标为最小化损失函数,即:
min ⁡ M L \min_{M} L MminL
模型评估指标可以选择准确率、召回率和F1值,分别为:
P r e c i s i o n = T P T P + F P Precision = \frac{TP}{TP+FP} Precision=TP+FPTP
R e c a l l = T P T P + F N Recall = \frac{TP}{TP+FN} Recall=TP+FNTP
F 1 = 2 × P r e c i s i o n × R e c a l l P r e c i s i o n + R e c a l l F1 = \frac{2 \times Precision \times Recall}{Precision + Recall} F1=Precision+Recall2×Precision×Recall
其中, T P TP TP为真正例, F P FP FP为假正例, F N FN FN为假负例。

下面是python代码示例:

# 导入所需的库
import numpy as np
import tensorflow as tf
import keras
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from keras.optimizers import Adam

# 定义图像的预处理函数
def preprocess(image):
    # 将图像转为灰度图
    image = image.convert('L')
    # 将图像进行二值化处理
    image = image.point(lambda x: 0 if x < 128 else 255)
    # 去除图像中的噪声
    image = image.filter(ImageFilter.MedianFilter())
    return image

# 定义图像的特征提取函数
def extract_features(image):
    # 提取图像的形状特征,包括笔画数、笔画方向等信息
    # TODO: 使用相关的算法提取形状特征
    # 提取图像的纹理特征,包括文字的纹理、颜色等信息
    # TODO: 使用相关的算法提取纹理特征
    return features

# 定义甲骨文图像分割模型
def create_model():
    model = Sequential()
    # 添加卷积层和池化层
    model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(128, 128, 1)))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    # 添加卷积层和池化层
    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    # 添加卷积层和池化层
    model.add(Conv2D(128, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    # 添加全连接层
    model.add(Flatten())
    model.add(Dense(256, activation='relu'))
    model.add(Dropout(0.5))
    # 添加输出层
    model.add(Dense(2, activation='softmax'))
    # 编译模型
    model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.0001), metrics=['accuracy'])
    return model

# 定义数据增强器
datagen = ImageDataGenerator(
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest')

# 加载训练集
train_generator = datagen.flow_from_directory(
    'Train',
    target_size=(128, 128),
    batch_size=32,
    class_mode='categorical',
    color_mode='grayscale')

# 加载验证集
validation_generator = datagen.flow_from_directory(
    'Val',
    target_size=(128, 128),
    batch_size=32,
    class_mode='categorical',
    color_mode='grayscale')

# 创建模型
model = create_model()

# 训练模型
model.fit_generator(
    train_generator,
    steps_per_epoch=200,
    epochs=20,
    validation_data=validation_generator,
    validation_steps=50)

# 对测试集中的图像进行预测
test_datagen = ImageDataGenerator(rescale=1./255)
test_generator = test_datagen.flow_from_directory(
    'Test',
    target_size=(128, 128),
    batch_size=32,
    class_mode='categorical',
    color_mode='grayscale')
test_images = test_generator.next()
predictions = model.predict(test_images)

# 输出预测结果
print(predictions)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99

查看完整思路详见:
【腾讯文档】2024年MathorCup高校数学建模挑战赛全题目深度解析(详细思路+建模过程+代码实现+论文指导)
https://docs.qq.com/doc/DSFZYb1FsQ3hqbHNs

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/579746
推荐阅读
相关标签
  

闽ICP备14008679号