毕业设计:基于机器学习的黑白图像自动上色系统 人工智能

 前言

       📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。

        🚀对毕设有任何疑问都可以问学长哦!

         选题指导:

        最新最全计算机专业毕设选题精选推荐汇总

        大家好,这里是海浪学长毕设专题,本次分享的课题是

        🎯基于机器学习的黑白图像自动上色系统

设计思路

一、课题背景与意义

        图像自动上色是计算机视觉领域的一个重要研究方向。传统的图像上色方法通常需要人工干预和专业知识,耗时且效果有限。而基于深度学习的图像自动上色系统通过学习大量图像数据的颜色分布和特征,能够自动、高效地为灰度图像添加逼真的颜色,具有广泛的应用潜力。该系统可以广泛应用于电影、动画、游戏、图像修复等领域,为用户提供更加生动、真实的视觉体验。

二、算法理论原理

2.1 卷积神经网络

        注意力机制在深度学习中有两种常见形式:空间注意力机制和通道注意力机制。空间注意力机制通过对输入中不同位置进行加权,以实现对空间信息的关注,帮助网络关注图像中不同部分的重要性。通道注意力机制通过对输入中不同通道进行加权,以实现对不同特征的关注,帮助网络关注重要的特征。

        在U-Net中添加注意力机制可以改进模型的性能。具体而言,可以在U-Net的编码器和解码器中分别添加注意力机制。编码器中的注意力机制可以对每个卷积层的输出进行加权,使网络更加关注重要的特征区域。解码器中的注意力机制可以对每个上采样层的输入进行加权,使网络更好地关注重要的特征通道。注意力机制的具体实现可以有不同的结构,但目标都是通过加权输入的不同部分来使网络更好地关注重要的特征。通过添加注意力机制,可以在保持U-Net结构的情况下显著提高模型的性能。

毕业设计:基于机器学习的黑白图像自动上色系统 人工智能

        SENet是一种用于图像分类任务的注意力机制结构,其核心思想是通过全局池化操作和特征重新缩放机制自适应地学习每个通道的重要性,并将其应用于每个通道的特征映射中。SENet包含两个主要操作:Squeeze操作和Excitation操作。Squeeze操作是一种全局池化操作,用于将每个通道的特征映射压缩为一个数字。Excitation操作是一种特征重新缩放机制,通过对全局特征进行加权来自适应地学习每个通道的重要性。SENet能够提高模型对关键特征的关注程度,从而改善图像分类任务的性能。

毕业设计:基于机器学习的黑白图像自动上色系统 人工智能

        CBAM是一种用于图像分类任务的注意力机制结构,其核心思想是通过通道注意力和空间注意力来自适应地学习每个通道和空间位置的重要性,并将其应用于每个通道和空间位置的特征映射中。它可以同时关注每个通道和每个空间位置的重要性,从而提高模型的性能。CBAM包含两个注意力模块:通道注意力模块和空间注意力模块。通道注意力模块利用全局平均池化和全连接网络来学习每个通道的重要性。空间注意力模块利用1×1卷积和2D最大池化来学习每个空间位置的重要性。

毕业设计:基于机器学习的黑白图像自动上色系统 人工智能

         ECANet的核心思想是利用高效的通道注意力机制来学习每个通道的重要性,以提高网络的性能和效率。它具有高效的通道注意力机制,可以自适应地学习每个通道的重要性,并将其应用于每个通道的特征映射中,从而提高模型的性能和效率。全局平均池化层对输入特征在通道维度上进行平均池化操作,以获取通道的全局信息。1D卷积层在通道维度上对全局信息进行卷积操作,学习通道之间的相关性。Sigmoid激活函数对卷积输出进行激活,得到通道注意力系数。

        ECANet的整体结构包括对输入特征进行卷积和池化操作,然后使用通道注意力机制对每个通道的特征进行加权,得到增强的特征表示。接下来,使用残差连接和多层卷积来提取更高级别的特征。最后,通过全局池化和全连接层进行分类或回归。

毕业设计:基于机器学习的黑白图像自动上色系统 人工智能

        ECANet利用高效的通道注意力机制自适应地学习每个通道的重要性,提高了网络的性能和效率。它通过加权输入特征的每个通道来增强特征表示,从而更好地捕捉关键信息,提升图像分类任务的准确性。 

2.2 图像着色算法

        传统的卷积神经网络在处理灰度图像时可能存在颜色和亮度边缘不对齐的问题,导致颜色溢出现象。为了解决这个问题,引入了耦合亮度和色度全变分模型的正则化方法。耦合全变分着色模型在原变分模型的基础上添加了图像亮度梯度的正则项。这样做的目的是通过约束网络在训练过程中考虑目标图像的边缘信息和亮度梯度,使着色后的颜色能够更好地匹配目标灰度图像中的物体,并有效控制颜色溢出现象。

毕业设计:基于机器学习的黑白图像自动上色系统 人工智能

        通过将卷积神经网络和全变分方法相结合,并引入耦合全变分着色模型的正则化,提出的图像着色网络能够更准确地着色图像,并改善着色结果中的颜色和亮度边缘对齐问题。

毕业设计:基于机器学习的黑白图像自动上色系统 人工智能

相关代码:

class CoupledTotalVariationLoss(nn.Module):
    def __init__(self, lambda_tv):
        super(CoupledTotalVariationLoss, self).__init__()
        self.lambda_tv = lambda_tv
        self.tv_loss = nn.SmoothL1Loss()

    def forward(self, colored_image, grayscale_image):
        dx_colored = torch.abs(colored_image[:, :, :, :-1] - colored_image[:, :, :, 1:])
        dy_colored = torch.abs(colored_image[:, :, :-1, :] - colored_image[:, :, 1:, :])
        dx_gray = torch.abs(grayscale_image[:, :, :, :-1] - grayscale_image[:, :, :, 1:])
        dy_gray = torch.abs(grayscale_image[:, :, :-1, :] - grayscale_image[:, :, 1:, :])

        tv_loss = self.tv_loss(dx_colored - dx_gray, 0) + self.tv_loss(dy_colored - dy_gray, 0)

        return tv_loss * self.lambda_tv

三、检测的实现

3.1 数据集

        由于网络上没有现有的合适的数据集,我决定自己进行数据集的制作。我收集了大量带有真实场景的灰度图像,并为这些图像手动上色,作为自制数据集的基础。我选取了各种不同的图像主题和风格,包括自然风景、人物肖像、动物等。通过手动上色的方式,我能够捕捉到真实的颜色分布和特征,为我的研究提供更准确、可靠的数据。我相信这个自制的数据集将为基于深度学习的图像自动上色系统的研究提供有力的支持,并为该领域的发展做出积极贡献。

        为了增加数据集的多样性和数量,我使用了数据增强技术对自制的数据集进行扩充。这包括图像旋转、缩放、平移、亮度调整等操作,以生成更多样的图像样本。通过数据扩充,我能够增加数据集的丰富性,提高模型的泛化能力,并改善图像自动上色系统在不同场景下的表现。数据扩充是一个重要的步骤,它能够帮助我们更好地训练和评估基于深度学习的图像自动上色系统,从而提升系统的性能和鲁棒性。通过数据扩充,我们能够更好地应对各种图像变化和挑战,使得我们的系统在实际应用中更加有效和可靠。

transform = transforms.Compose([
    transforms.RandomRotation(10),  # 随机旋转角度范围为±10度
    transforms.RandomResizedCrop(224),  # 随机裁剪和缩放到指定大小
    transforms.RandomHorizontalFlip(),  # 随机水平翻转
    transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),  # 随机调整亮度、对比度、饱和度和色调
    transforms.ToTensor()  # 转换为张量
])

3.2 实验环境搭建

        在本实验中,采用了PyTorch 1.11.1作为深度学习框架,并在一台拥有两个GeForce GTX 3090 GPU的云服务器上运行。为了提高运行效率,使用了CUDA 11.3 GPU加速技术。操作系统选择了Ubuntu 20.04版本,以确保程序的稳定性和安全性。这些措施旨在确保程序能够高效地运行,并保证所得结果的可靠性和准确性。

3.3 实验及结果分析

        实验的训练过程分为三个主要步骤:

  1. 全图像着色网络的训练:使用预训练的权重进行初始化,并在训练集上进行了40个epoch的训练。采用学习率为1e-5的ADAM优化器进行优化。
  2. 实例着色网络的训练:使用全图像着色网络训练好的权重进行迁移学习,并在从数据集中提取的实例上进行了40个epoch的训练。采用学习率为5e-5的ADAM优化器进行优化。
  3. 融合模块的训练:将全图像着色网络和实例着色网络进行融合,并在训练集上进行了10个epoch的训练。采用学习率为2e-5的ADAM优化器进行优化。

        在所有训练过程中,使用了ADAM优化器,其中β1设为0.99,β2设为0.999。全图特征、实例特征和融合特征在所有13层中的通道数分别为64、128、256、512、512、512、512、256、256、128、128、128和128。 

        定量分析是通过数值指标来衡量模型性能的提升程度。一种常见的评估指标是均方根误差,它可以衡量模型生成图像与目标图像之间的差异。较低的RMSE值表示模型生成的图像与目标图像更接近,即模型性能更好。除了RMSE,还可以使用其他指标如结构相似性指数和峰值信噪比等来评估图像质量的提升。这些指标可以对比模型在引入正则项前后的性能差异,从而量化正则项的影响。

相关代码示例:

class ColorizationNetwork(nn.Module):
    def __init__(self):
        super(ColorizationNetwork, self).__init__()

    def forward(self, grayscale_image):

class ColorizationLoss(nn.Module):
    def __init__(self, lambda_tv):
        super(ColorizationLoss, self).__init__()
        self.lambda_tv = lambda_tv
        self.tv_loss = nn.SmoothL1Loss()

    def forward(self, colored_image, grayscale_image):
        dx_colored = torch.abs(colored_image[:, :, :, :-1] - colored_image[:, :, :, 1:])
        dy_colored = torch.abs(colored_image[:, :, :-1, :] - colored_image[:, :, 1:, :])
        dx_gray = torch.abs(grayscale_image[:, :, :, :-1] - grayscale_image[:, :, :, 1:])
        dy_gray = torch.abs(grayscale_image[:, :, :-1, :] - grayscale_image[:, :, 1:, :])

        tv_loss = self.tv_loss(dx_colored - dx_gray, 0) + self.tv_loss(dy_colored - dy_gray, 0)

        return tv_loss * self.lambda_tv

transform = ToTensor()

train_dataset = # 加载训练数据集
train_dataloader = DataLoader(train_dataset, batch_size=32, shuffle=True)

colorization_net = ColorizationNetwork()
colorization_loss = ColorizationLoss(lambda_tv=0.01)

optimizer = optim.Adam(colorization_net.parameters(), lr=0.001)

for epoch in range(num_epochs):
    for batch_images, batch_grayscale in train_dataloader:
        optimizer.zero_grad()

        colored_images = colorization_net(batch_grayscale)

        loss = colorization_loss(colored_images, batch_grayscale)

        loss.backward()
        optimizer.step()

        print(f"Epoch [{epoch+1}/{num_epochs}], Batch Loss: {loss.item()}")

test_image = # 加载测试图像
grayscale_image = transform(test_image).unsqueeze(0)

colorization_net.eval()
colored_image = colorization_net(grayscale_image)

实现效果图样例

创作不易,欢迎点赞、关注、收藏。

毕设帮助,疑难解答,欢迎打扰!

最后

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值