【论文阅读】SRCNN

  • 学习资料
  • 论文题目:Learning a Deep Convolutional Network for Image Super-Resolution(学习深度卷积网络用于图像超分辨率)
  • 论文地址:link.springer.com/content/pdf/10.1007/978-3-319-10593-2_13.pdf
  • 代码:作者提出的代码(matlab、caffe)Learning a Deep Convolutional Network for Image Super-Resolution其他人复现的代码(pytorch)fuyongXu/SRCNN_Pytorch_1.0: The implemention of SRCNN by pytorch1.0 (github.com)

Abstract

研究主题:这篇论文提出了一种用于单图像超分辨率(SR)的深度学习方法。

核心方法:

  • 直接学习映射(ours):方法是直接学习低分辨率和高分辨率图像之间的端到端映射。这个映射是通过一个深度卷积神经网络(CNN)来表示的,也就是把低分辨率图像作为输入,让网络输出高分辨率图像。
  • 与传统方法的关联:研究还表明传统的基于稀疏编码的超分辨率方法也能被看作是一个深度卷积网络。不过传统方法是分开处理各个组件的,而本文提出的方法是联合优化所有层

模型优势:

  • 结构轻巧且效果好:这个深度 CNN 结构很轻巧,但却展示出了最先进的恢复质量。
  • 速度快:在实际的在线使用中能够实现快速处理。

关键词:超分辨率、深度卷积神经网络

直接学习映射:想象我们有一个神奇的 “机器”(也就是深度卷积神经网络),它的任务是把模糊的小图片(低分辨率图像)变成清晰的大图片(高分辨率图像)。这个 “机器” 不是通过一些复杂的中间步骤去猜测如何变清晰,而是直接去学习模糊图片和清晰图片之间的一种对应关系,就像小孩子直接学习认识苹果和苹果的图片之间的联系一样,这就是端到端的映射。这个学习过程是让网络自己去发现规律,输入模糊的,输出清晰的,不断调整自己内部的设置来达到最好的效果。

与传统方法的关联:传统的基于稀疏编码的超分辨率方法也有点像一个处理图片的 “工具”,但这个 “工具” 的内部结构和我们提出的新方法不太一样。传统的这个 “工具” 就像一个组装不太好的玩具,它里面各个零件(组件)是分开处理的,比如先处理图片的一部分,再处理另一部分,没有整体地去优化。而我们提出的新方法呢,就像一个设计精良的智能机器人,它会把所有的零件(层)都联合起来考虑,一起优化,让整个 “机器” 运行得更好,更能准确地把模糊图片变成清晰图片。

1. 介绍 

1.1. 研究背景

单图像超分辨率(SR)是计算机视觉中的经典问题。

目前最先进的单图像超分辨率方法大多基于样例,包括利用同一图像内部相似性或外部低和高分辨率样本对学习映射函数,但外部基于样例的方法面临有效和紧凑建模数据的困难。

基于稀疏编码的方法是基于外部样本的图像超分辨率代表性方法之一,其流程包括补丁提取和预处理、编码、重建、聚合输出等步骤,以往方法主要关注字典学习和优化,对流水线其他步骤很少统一优化。

基于稀疏编码的 SR 方法流水线相当于一个深度卷积神经网络,并受此启发进行研究。

1.2. 研究内容

提出一个名为SRCNN的卷积神经网络,它是低分辨率图像和高分辨率图像之间的端到端映射。

SRCNN有几个吸引人的特性:

1. 首先,其结构故意设计为简单,但与最先进的基于实例的方法相比,提供了卓越的准确性(根据峰值信噪比(Peak Signal - to - Noise Ratio,PSNR)进行数值评估)

2. 适度的过滤器和层数,我们的方法实现了快速的实际在线使用,即使在CPU上。我们的方法比一系列基于实例的方法更快,因为它是完全前馈的,不需要解决使用上的任何优化问题。

3. 对于这个网络(SRCNN)来说,如果满足以下两个条件中的一个或者两个同时满足,它的恢复质量就能进一步提高。

  • 条件一:有更大的数据集可用。就好比学生学习,如果有更多的练习题(数据),那么学生对知识的掌握和运用能力可能会更强。对于网络来说,更多的数据意味着它可以学习到更多不同的低分辨率和高分辨率图像之间的关系模式,从而更好地恢复图像。(更勤奋)
  • 条件二:使用更大的模型。可以把模型想象成一个更复杂、功能更强大的工具。更大的模型可能有更多的层、神经元或者参数,就像一个更复杂的机器能够处理更复杂的任务一样,它能够更好地学习和拟合低分辨率和高分辨率图像之间的映射关系,进而提高恢复质量。(更聪明)

3. 当有更大的数据集或者更大的模型时,不仅对提出的 SRCNN 网络有好处,同时也会给现有的基于样例的方法带来挑战。

现有的基于样例的方法往往依赖于特定的样例数据和相对固定的模型结构来学习低分辨率和高分辨率图像之间的映射关系。当出现更大的数据集时,它们可能无法像 SRCNN 那样有效地利用这些数据,因为它们的学习方式可能不够灵活。

而且如果使用更大的模型,基于样例的方法可能需要重新调整它们的算法和策略,因为它们的核心是基于样例的学习,而不是像 SRCNN 那样基于网络结构自身的优化和学习。

2. 相关工作

2.1. Image SR

先进 SR 方法的核心:一些先进的 SR 方法是学习低 / 高分辨率斑块之间的映射。

差异所在:在如何构建关联低 / 高分辨率补丁的紧凑字典或流形空间,以及在该空间中的表示方案上存在差异。

具体方法示例:

  • Freeman 等人:字典以低 / 高分辨率补丁对形式呈现,通过找最近邻居重建。
  • Chang 等人:引入流形嵌入技术替代最近邻居策略。
  • Yang 等人:将对应关系发展为稀疏编码公式,其及改进是先进方法之一,重点优化补丁,提取和聚合分别处理。

2.2. CNN

历史与流行原因:卷积神经网络(CNN)历史悠久,可追溯到几十年前。它最近非常流行,部分是因为在图像分类方面取得了成功。

关键进展因素

  • 高效训练:能够在现代强大的 gpu 上高效训练,这使得模型能够更快地学习和调整参数。
  • ReLU 单元:修正线性单元(ReLU)的应用加快了收敛速度,同时保证了良好的质量。
  • 丰富数据:容易获取如 ImageNet 等丰富的数据来训练更大的模型,从而提高模型的性能和泛化能力。

我们的方法也从这些进展中受益。

2.3. 图像恢复(深度学习)

深度学习用于去噪

多层感知器(MLP),其所有层都是全连接的(与卷积相比),用于自然图像去噪和去模糊后去噪。

卷积神经网络被应用于自然图像去噪和去除噪声模式(污垢/雨水)。

深度学习用于图像超分辨率问题

相反,就我们所知,图像超分辨率问题并没有见证深度学习技术的使用。

3. 用于超分辨率的卷积神经网络

3.1. 构想

3.1.1. 预处理操作

对于一张低分辨率图片,首先使用双三次插值将其放大到所需大小,这是唯一的预处理操作。经过插值后的图像记为Y,虽然它与真实高分辨率图像X大小相同,但仍称为 “低分辨率” 图像。


目的

对于低分辨率图片,我们希望将其恢复为高分辨率图像。

双三次插值是这个过程中的第一步预处理操作,它的目的是将低分辨率图像的尺寸放大到我们期望的高分辨率图像的大致尺寸。

原理

双三次插值是一种基于周围像素值来估计新像素值的方法。它考虑了目标像素周围一个较大区域(通常是 4×4 的像素邻域)的像素信息,通过复杂的加权计算来确定新的像素值。这样可以使放大后的图像在一定程度上保持平滑和自然的过渡,避免出现明显的锯齿状或块状的不连续现象。

“低分辨率” 称呼的原因

尽管经过双三次插值后图像的尺寸与真实高分辨率图像相同,但它仍然被称为 “低分辨率” 图像。这是因为仅仅通过插值操作并没有真正恢复图像的细节和清晰度,它只是在尺寸上进行了放大,图像的实质内容仍然是低分辨率的质量水平。后续还需要通过一系列的操作(如 SRCNN 中的 Patch 提取和表示、非线性映射和重建等操作)来进一步提高图像的分辨率和质量,使其真正接近或达到高分辨率图像的水平。

就比如说把 4×4 的低分辨率图像通过双三次插值变为 16×16 后,虽然图像的像素数量增多了(尺寸变大),但每个像素所包含的信息并没有实质性的改变,图像仍然缺乏高分辨率图像应有的细节和清晰度,所以分辨率还是低的。这种放大后的图像只是在空间维度上进行了扩展,但并没有在分辨率这个关键属性上得到本质提升。后续需要进一步的处理才能让它真正具有高分辨率图像的质量。

3.1.2. 目标任务

目标是从Y中恢复出图像F(Y),使其尽可能与真实高分辨率图像X相似,也就是要学习映射F

3.1.3. 映射F的组成概念

映射F在概念上由三个操作组成,所有这些操作形成一个卷积神经网络,如图所示。

第一层:Patch提取和表示

就像是把低分辨率图像分成很多小块(patch)。传统方法是用一些预先准备好的工具(基)来表示这些小块,但 SRCNN 把这些工具的优化放到网络里一起做。


F_{1}(Y)=max(0,W_{1}\ast Y+B_{1})

W_{1}是滤波器,大小为c\times f_{1}\times f_{1}\times n_{1},其中c是输入图像通道数,f_{1}是滤波器空间大小,n_{1}是滤波器数量。它在图像上应用n_{1}个卷积,每个卷积核大小为c\times f_{1}\times f_{1},输出由n_{1}个特征图组成。

B_{1}n_{1}维向量,每个元素与一个过滤器相关联。

在滤波器响应上应用ReLU\left ( max(0,x) \right )

第二层:非线性映射

该操作将每个高维向量非线性映射到另一个高维向量上。每个映射的向量在概念上是一个高分辨率patch的表示。这些向量组成了另一组特征图。

把上一步得到的高维向量再进行变化。就好像把一种语言翻译成另一种语言,但是这个翻译过程不是简单的对应,而是有一些复杂的规则。


F_{2}(Y)=max(0,W_{2}\ast F_{1}(Y)+B_{2})

第一层为每个 patch 提取了n_{1}-dimensional特征,第二层要将这些特征向量中的每一个映射为 n_{2}-dimensional向量。

W_{2}的大小是n_{1}\times 1\times 1\times n_{2},相当于应用n_{2}个具有1\times 1空间支持的过滤器。B_{2}n_{2}-dimensional

第三层:重建

把第二步得到的所有代表高分辨率小块的向量再组合起来,就像把很多拼图碎片拼成一幅完整的图,最终得到一个高分辨率的图像,这个图像要尽可能和原始的高分辨率图像X相似。

F(Y)=W_{3}\ast F_{2}(Y)+B_{3}

3.2. 与基于稀疏编码的方法的关系

3.2.1. 共同点

基于稀疏编码的SR方法与SRCNN在三个操作上的共同点

3.2.2. 不同点

基于稀疏编码的 SR 方法的优化中,没有考虑到所有的操作。

在卷积神经网络中,低分辨率字典、高分辨率字典、非线性映射,以及均值减法和平均,都涉及到要优化的滤波器中,优化了一个由所有操作组成的端到端映射。

3.3.3. 通过类比帮助设计超参数

可以将最后一层的滤波器尺寸设置为比第一层小,更依赖于高分辨率 patch 的中心部分。

可以设置n_{2}< n_{1},因为预计它会更稀疏,一个典型的设置是f_{1}=9,f_{3}=5,n_{1}=64,n_{2}=32

3.3. 损失函数

3.3.1. 定义

公式

使用均方误差(Mean Squared Error, MSE)作为损失函数

L\left ( \Theta \right )=\frac{1}{n}\sum_{i=1}^{n}\left \| F\left ( Y_{i;} \Theta \right ) -X_{i}\right \|^{2}

参数说明

给定一组高分辨率图像\left \{ X_{i} \right \}及其对应的低分辨率图像\left \{ Y_{i} \right \},再重建出图像F\left ( Y_{i} \right )

学习端到端的映射函数F需要估计参数\Theta =\left \{W_{1},W_{2},W_{3},B_{1},B_{2},B_{3}\right \}

其中n是训练样本的数量。

3.3.2. 优化方法

采用标准反向传播的随机梯度下降来最小化损失函数L\left ( \Theta \right )

3.3.3. 选择的考量

MSE 的优势

  • 使用 MSE 作为损失函数有利于获得高 PSNR(峰值信噪比)。
  • PSNR 是广泛用于定量评价图像恢复质量的度量,且至少部分与感知质量相关。

卷积神经网络的灵活性

  • 卷积神经网络并不局限于使用 MSE 作为损失函数,只要其他损失函数是可导的,就可以使用。
  • 如果在训练过程中给出更好的感知激励指标,网络能够灵活适应,这是传统方法难以做到的。

4. 实验

4.1. 实验准备

4.1.1. 数据集

使用与Anchored Neighborhood Regression for Fast Example-Based Super-Resolution (cv-foundation.org)中相同的训练集、测试集和协议。


训练集由 91 张图像组成

使用 Set5(5 张图片)评估放大因子2、3、4的性能

使用 Set14(14 张图片)评估放大因子3的性能


在 5.2 节还研究了一个更大的训练集(ILSVRC 2013 ImageNet 检测训练分区中的 395,909 张图像)。

4.1.2. 比较方法

将 SRCNN 与最先进的 SR 方法进行比较:

包括 Yang 等人的 SC(稀疏编码)方法

基于K-SVD的方法

NE + LLE(邻居嵌入 + 局部线性嵌入)

NE + NNLS(邻居嵌入 + 非负最小二乘)

ANR(锚定邻域回归)方法

(看到表格中还加了双三次插值(BiCubic插值)方法,应该是作为baseline,SC、K-SVD、NE + LLE、NE + NNLS、ANR、SRCNN都是在BiCubic处理后的基础上进行处理)

4.1.3. 实现细节

根据 3.2 节,设置f_{1}=9,f_{3}=5,n_{1}=64,n_{2}=32,并在第 5 节评估备选设置。

对于每个上尺度因子\in \left \{ 2,3,4\right \},训练一个特定的网络。

准备训练数据:将 ground truth imagesX_{i}裁剪为32\times 32-pixel的子图像,通过适当处理合成低分辨率样本Y_{i}。91 张训练图像提供约 24800 张子图像。

网络设置:所有卷积层无填充;网络产生更小输出\left ( 20\times 20 \right ),MSE 损失函数通过X_{i}中心20\times 20裁剪与网络输出差异评估;测试时,卷积层给予零填充使输出与输入同大小,并对输出进行归一化处理;仅考虑亮度通道\left ( c=1 \right ),可扩展到彩色图像\left ( c=3 \right );各层滤波器权重初始化,前两层学习率为10^{-4},最后一层学习率为10^{-5}

4.2. 实验结果分析

4.2.1. 定量评价(PSNR)

PSNR 指标对比

在所有实验中,本文提出的 SRCNN 平均 PSNR 最高。

Set5 数据集上,对于三个放大因子,SRCNN 实现的平均增益分别为 0.51dB、0.47dB 和 0.40dB,高于次优方法 ANR。尽管 Set5 可能不是结论性测试集,但表明模型能处理不同上尺度因子。

在更大的 Set14 数据集上,SRCNN 始终优于其他方法(平均≥0.3dB)。

当使用 SSIM 作为性能指标时,也有类似趋势,结果在补充文件中。

与其他方法对比的起始表现和训练效果

SRCNN 在学习阶段一开始就超过了双立方基线,并且在适度训练下,性能优于现有的最先进的方法。但性能还远远没有收敛,推测给定更长的训练时间,可以获得更好的结果。

超分辨率结果的视觉效果

展示了放大因子 3 下不同方法的超分辨率结果图。可以观察到,SRCNN 比其他方法产生更清晰的边缘,并且在图像上没有任何明显的伪影。

尽管 SRCNN 在 Set5 的 “婴儿” 和 “头部” 图像上并没有达到最高的 PSNR,但结果在视觉上仍然很吸引人。

4.2.2. 运行时间(Time)

运行时间比较

比较了几种最先进方法的运行时间和恢复性能。所有基线方法从相应作者的 MATLAB 实现中获得,而 SRCNN 用c++实现。在同一台机器(Intel CPU 3.10GHz 和 16GB 内存)上分析运行时间。

速度优势原因

SRCNN 在 Set14 中平均每张图像花费 0.39 秒,比其他方法快几倍甚至几个数量级。速度差距主要不是由不同的 MATLAB/c++实现引起,而是因为其他方法需要在使用上解决复杂的优化问题(例如,稀疏编码或嵌入),而 SRCNN 是完全前馈的。

还注意到 SRCNN 的处理时间与测试图像分辨率高度线性,因为所有图像都经过相同数量的卷积。

5. 进一步的分析

5.1. 学习超分辨率滤波器

滤波器功能展示

展示了在 91 张放大因子为 2 的图像(24800 个子图像)上训练得到的第一层滤波器示例。

每个滤波器具有特定功能,如有的像拉普拉斯 / 高斯滤波器,有的像边缘检测器,有的像纹理提取器,同时存在一些权重接近于零的 “死” 滤波器。

“死” 滤波器现象探讨

  • 观察到一些 “死” 滤波器,类似已有研究中的现象。
  • 推测如果训练时间足够长,部分 “死” 滤波器可能会出现模式,此现象将在未来工作中进一步研究。

5.2. 从 ImageNet 学习超分辨率

训练集介绍

使用 ILSVRC 2013 ImageNet 检测训练分区中的 395,909 张图像进行 SRCNN 学习,这些图像被分解为超过 500 万个小图像,步幅为 33。

实验设置与结果

使用与之前实验相同的网络设置\left ( f_{1}=9,f_{3}=5,n_{1}=64,n_{2}=32\right )

在 Set5 上进行放大系数为 3 的测试,结果表明在相同反向传播次数下,在 ImageNet 上训练的 SRCNN 达到的 PSNR 高于在 91 张图像上训练的结果,证明使用更大、更多样化的图像训练集可进一步提高 SRCNN 性能。

5.3. 滤波器数量

实验设置

基于网络默认设置n_{1}=64n_{2}=32,进行两个额外实验:一个使用n_{1}=128n_{2}=64的较大网络,另一个使用n_{1}=32n_{2}=16的较小网络。

两个模型都在 ImageNet 上训练,并在 Set5 上使用升级因子 3 进行测试。

结果分析

结果显示使用更多的过滤器可以实现更优越的性能,但如果想要快速的恢复速度,较小的网络规模是首选,且仍能实现比最先进性能更好的效果。

5.4. 过滤器的大小

实验设置

将第一层的滤波器大小从f_{1}=9放大为f_{1}=11,最后一层的滤波器大小从f_{3}=5放大为f_{3}=7,其他设置保持与在 ImageNet 上训练的相关设置相同。

结果分析

在 Set5 上放大因子为 3 的结果表明,合理大的滤波器尺寸可以掌握更丰富的结构信息,带来更好的结果,但过滤器尺寸越大,部署速度会降低,因此网络规模的选择应权衡性能和速度。

6. 结论

6.1. 研究成果总结

提出新方法:提出一种新的单幅图像超分辨率(SR)深度学习方法。

建立方法关系:表明传统的基于稀疏编码的图像超分辨率方法可以重新表述为深度卷积神经网络。

介绍提出方法的特点:提出的方法 SRCNN 学习低分辨率和高分辨率图像之间的端到端映射,除优化外几乎没有额外的预处理 / 后处理;由于结构轻巧,SRCNN 的性能优于最先进的方法。

6.2. 未来研究方向探讨

我们推测,可以通过探索网络中更多的隐藏层/过滤器,以及不同的训练策略来进一步获得额外的性能。

此外,所提出的结构具有简单和鲁棒性的优点,可以应用于其他低层次的视觉问题,如图像去模糊或同时SR+去噪。

人们还可以研究一个网络来应对不同的放大因素。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1560241.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Vue检测获取最新资源 解决浏览器缓存问题

Vue检测获取最新资源 解决浏览器缓存问题 1、在public文件夹下创建version.json文件2、vue.config.js中&#xff0c;每次打包动态更新version.json内容3、App.vue中使用定时器去检测版本号和本地是否有差异 背景&#xff1a;由于浏览器缓存问题&#xff0c;vue2项目发布后&…

【HTML】defer 和 async 属性在 script 标签中分别有什么作用?

需要这两个属性的原因&#xff1f; 首先我们要知道的是&#xff0c;浏览器在解析 HTML 的过程中&#xff0c;遇到了 script 元素是不能继续构建 DOM 树的。 它会停止解析构建&#xff0c;首先去下载 js 代码&#xff0c;并且执行 js 的脚本&#xff1b;只有在等到 js 脚本执行…

selenium自动化测试之Junit

1. 常用的注解 将junit的索引添加到pom文件&#xff1a; <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId&…

CPU超线程技术是什么,怎么启用超线程技术

超线程技术是一种允许单个物理CPU核心模拟成两个逻辑核心的技术&#xff0c;从而提升处理器的并行性能和效率。以下是对超线程技术的详细介绍&#xff1a; 基本概念&#xff1a;超线程&#xff08;Hyper-Threading&#xff0c;HT&#xff09;是Intel公司研发的一种技术&#x…

QD1-P12 HTML常用标签:表格

本节学习 HTML常用标签&#xff1a;表格标签table ‍ 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p12 ‍ 知识点1 表格的基本结构 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>P12-表格标签</title><…

SpringBoot整合web中使用jsp

1、在pom.xml文件中导入jsp依赖的jar包&#xff0c;一个是jstl标签&#xff0c;一个是jsp的引擎 <dependency><groupId>org.apache.taglibs</groupId><artifactId>taglibs-standard-spec</artifactId><version>1.2.5</version> <…

如何在RuoYi-Vue项目中去除`/dev-api`前缀

前言 在使用RuoYi-Vue框架进行Web应用开发时&#xff0c;有时会遇到API路径需要特定前缀的问题。例如&#xff0c;在某些情况下&#xff0c;开发者可能希望移除或更改默认的/dev-api前缀。 问题描述 当使用YApi直接请求后台接口时&#xff0c;无需添加/dev-api前缀。在生成和…

Java入门——变量

变量和内存紧密联系在一起&#xff0c;主要通过以下方式实现关联&#xff1a; 一、变量的定义与内存分配 变量声明&#xff1a; 当在编程语言中声明一个变量时&#xff0c;编译器或解释器会根据变量的类型在内存中为其分配一块特定大小的空间。 例如&#xff0c;在 C 语言中声明…

包材推荐中的算法应用|得物技术

目录 一、业务背景 二、算法架构 规则算法 三、算法原理 装箱装袋 四、衍生应用 切箱合包箱型设计包装方案推荐 五、作者结语 一、业务背景 任何一家电商的商品出库场景中&#xff0c;都涉及到打包——即把订单中的商品用包材进行包裹&#xff0c;常见的打包方式有装袋和装箱。…

算法复杂度 (数据结构)

一. 数据结构前言 1.1 什么是数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合。没有一种单一的数据结构对所有用途都有用&#xff0c;所以我们要学各式各样的数据结构&#xff0c;如&#xff1…

[Qt] 信号与槽:深入浅出跨UI与跨线程的信号发送

文章目录 如何自定义信号并使用自定义信号的步骤1.使用 signals 声明信号2. 信号的返回值是 void3. 在需要发送信号的地方使用 emit4. 使用 connect 链接信号和槽5. 完整代码示例总结 如何跨UI发送信号Qt跨UI发送信号机制详解案例概述Qt 信号与槽机制简介代码逻辑详解主窗口 Wi…

进程通讯方式区别(从不同角度看)

*常用到的不同主机间进程通讯&#xff1a;Socket。比如&#xff1a;host和引擎间socket指令通讯、分派和复判之间指令通讯&#xff1b; *共享内存&#xff1a;在Windows系统中&#xff0c;共享内存的实现通常有以下几种方式&#xff1a; 1.内存映射文件(最常用)&#xff1a;(…

计算机毕业设计 医院预约挂号系统的设计与实现 Python毕业设计 Python毕业设计选题【附源码+安装调试】

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【01】手把手教你0基础部署SpringCloud微服务商城教学-Mybatis篇(上)

序言&#xff1a; 微服务是一种软件架构风格&#xff0c;它是以专注于单一职责的很多小型项目为基础&#xff0c;组合出复杂的大型应用。 想学习SpringCloud搭建项目&#xff0c;首先我们需要学习的就是Mybatis和Docker。 大家在日常开发中应该能发现&#xff0c;单表的CRUD…

没人告诉你的职场人情世故

看到前同事在群里分享的新年开工遭遇&#xff0c;真是让人感同身受。 第一天就遇到挫折&#xff0c;因为工作做得太快、太早交付&#xff0c;结果反被领导批评&#xff0c;还得重做&#xff0c;头大如斗。这不就提醒我们得时时刻刻记着职场里的那些不成文的规矩吗&#xff1f;…

【C++】常用数据结构纲要(简易版)

非静无以成学。——诸葛亮 数据结构概括 1、什么是数据结构呢&#xff1f;2、讲述过的结构2、1、前言2、2、树->二叉树->两种平衡二叉树2、3、单链表->双链表->带有哨兵位的链表 3、B树3、1、概念及图示3、2、B树数据处理3、2、1、查找3、2、2、插入 4、哈希表4、1…

测试点总结 | 搜索功能如何测试?

这里仅针对通用搜索框的常见测试点进行总结分享&#xff0c;实际工作中需结合搜索功能的背景业务需求及其他依赖条件来综合设计测试点。 一、功能实现部分 &#xff08;1&#xff09;如果支持模糊查询&#xff0c;搜索名称中任意一个字符是否能搜索到 对于支持模糊查询的搜索…

猫头虎分享已解决Bug || AssertionError: Torch not compiled with CUDA enabled 解决方案

&#x1f42f; 猫头虎分享已解决Bug || AssertionError: Torch not compiled with CUDA enabled 解决方案 摘要 今天猫头虎收到粉丝提问&#xff1a;“猫哥&#xff0c;我在使用 PyTorch 进行 AI大模型训练 时&#xff0c;出现了 AssertionError: Torch not compiled with CUD…

10.9 LeetCode 3289 0001 3295

思路&#xff1a; 1、用数组下标来表示是否出现过&#xff0c;初始为 0&#xff0c;出现则加 1&#xff0c;判断大于等于 2 的数字即为多次出现。 2、先将数组排序&#xff0c;依次遍历排序过的数组&#xff0c;若第 i 位与第 i1 位相等&#xff0c;则说明是重复数字。 class …

mybatis解析异常

1.问题现象 Caused by: org.springframework.dao.TransientDataAccessResourceException: Error attempting to get column sale_id from result set. Cause: java.sql.SQLException: Cannot convert value from column 19 to TIMESTAMP. 造成原因:需要给表中中增加字段以满…