当前位置: 首页 > news >正文

基于深度学习的图像背景剔除

在过去几年的机器学习领域,我一直想打造真正的机器学习产品。

几个月前,在参加了精彩的 Fast.AI 深度学习课程后,似乎一切皆有可能,我有机会:深度学习技术的进步使许多以前不可能实现的事情成为可能,而且开发了新工具,使部署过程比以往任何时候都更容易。

在上述课程中,我遇到了经验丰富的 Web 开发人员 Alon Burg,我们合作追求这一目标。我们共同设定了以下目标:

  • 提高我们的深度学习技能
  • 提高我们的 AI 产品部署技能
  • 制造一款有用的产品,满足市场需求
  • 享受乐趣(对我们和我们的用户而言)
  • 分享我们的经验

考虑到上述情况,我们正在探索以下想法:

  • 尚未完成(或尚未正确完成)
  • 计划和实施不会太难——我们的计划是 2-3 个月的工作,每周工作 1 天。
  • 将拥有一个简单且吸引人的用户界面——我们希望开发一款人们会使用的产品,而不仅仅是用于演示目的。
  • 将随时提供训练数据——正如任何机器学习从业者都知道的那样,有时数据比算法更昂贵。
  • 将使用尖端的深度学习技术(谷歌、亚马逊和朋友的云平台尚未将其商品化),但不会太过尖端(因此我们将能够在网上找到一些示例)
  • 将有可能实现“生产就绪”的结果。

我们最初的想法是承担一些医疗项目,因为这个领域与我们息息相关,我们觉得(现在仍然觉得)在医疗领域,深度学习有大量唾手可得的成果。然而,我们意识到我们将遇到数据收集问题,也许还有合法性和监管问题,这与我们保持简单的意愿相矛盾。我们的第二个选择是背景去除产品。

背景去除是一项相当容易手动或半手动完成的任务(Photoshop,甚至 Power Point 都有这样的工具),如果你使用某种“标记”和边缘检测,请参见此处的示例。然而,全自动背景去除是一项相当具有挑战性的任务,据我们所知,尽管有些产品确实尝试过,但仍然没有产品能取得令人满意的效果。

我们要去除什么背景?这是一个重要的问题,因为模型在对象、角度等方面越具体,分离的质量就越高。在开始我们的工作时,我们想得很远:一个通用的背景去除器,可以自动识别每种类型图像中的前景和背景。但在训练了我们的第一个模型后,我们明白最好将精力集中在一组特定的图像上。因此,我们决定专注于自拍和人物肖像。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 

自拍照是一张具有突出且聚焦的前景(一个或多个“人”)的图像,它保证了我们将物体(脸部+上身)与背景很好地分开,同时保持相当恒定的角度,并且始终是同一个物体(人)。

考虑到这些假设,我们开始了研究、实施和数小时的培训之旅,以创建一键式易于使用的背景去除服务。

我们工作的主要部分是训练模型,但我们不能低估正确部署的重要性。 良好的分割模型仍然不像分类模型(例如 SqueezeNet)那样紧凑,我们积极研究了服务器和浏览器部署选项。

1、语义分割

当研究与我们的任务相似的深度学习和计算机视觉任务时,很容易看出我们的最佳选择是语义分割任务。

其他策略,如通过深度检测进行分离,也存在,但似乎还不够成熟,无法满足我们的目的。

语义分割是一个众所周知的计算机视觉任务,与分类和对象检测并列为前三大任务。分割实际上是一个分类任务,即将每个像素分类到一个类。与图像分类或检测不同,分割模型确实显示了对图像的一些“理解”,不仅可以说“这张图片中有一只猫”,还可以在像素级别指出猫在哪里以及是什么。

那么分割是如何工作的呢?为了更好地理解,我们必须研究该领域的一些早期作品。

最早的想法是采用一些早期的分类网络,如 VGG 和 Alexnet。 VGG 是 2014 年图像分类领域最先进的模型,由于其架构简单直接,如今非常有用。在检查 VGG 早期层时,可能会注意到待分类项目周围有较高的激活值。较深的层具有更强的激活值,但由于重复池化操作,它们的性质较粗糙。考虑到这些理解,我们假设分类训练也可以通过一些调整来查找/分割对象。

语义分割的早期结果与分类算法一起出现。在这篇文章中,你可以看到使用 VGG 得到的一些粗略分割结果:

后期层结果:

巴士图像分割,浅紫色(29)为校车类

双线性上采样后:

这些结果仅仅来自于将全连接层转换(或保持)为原始形状,保持其空间特征,得到一个全卷积网络。在上面的例子中,我们将 7681024 的图像输入到 VGG,得到一个 24321000 的层。2432 是图像的池化版本(乘以 32),1000 是图像网络类别计数,我们可以从中得出上面的分割。

为了平滑预测,研究人员使用了一个简单的双线性上采样层。

在 FCN 论文中,研究人员改进了上述想法。他们一路连接了一些层,以提供更丰富的解释,根据上采样率,这些层被命名为 FCN-32、FCN-16 和 FCN-8:

在层之间添加一些跳跃连接可以让预测从原始图像中编码出更精细的细节。进一步的训练进一步改善了结果。

这种技术并没有人们想象的那么糟糕,并证明了深度学习在语义分割方面确实具有潜力。

论文中的 FCN 结果

FCN 解锁了分割的概念,研究人员尝试了不同的架构来完成这项任务。主要思想保持不变:使用已知架构、上采样和使用跳跃连​​接在较新的模型中仍然很突出。

你可以在几篇好文章中阅读有关该领域的进展:这里、这里和这里。你还可以看到大多数架构都保留了编码器-解码器架构。

2、回到我们的项目

经过一番研究,我们确定了三个可用的模型:FCN、Unet 和 Tiramisu — 非常深的编码器-解码器架构。我们也对 mask-RCNN 有一些想法,但实现它似乎超出了我们项目的范围。

FCN 似乎并不相关,因为它的结果不如我们所希望的那么好(即使作为起点),但我们提到的另外两个模型显示的结果还不错:CamVid 数据集上的 tiramisu 和 Unet 的主要优势是它的紧凑性和速度。在实现方面,Unet 非常容易实现(我们使用了 keras),Tiramisu 也很容易实现。为了入门,我们在 Jeremy Howard 的深度学习课程的最后一节课中使用了 Tiramisu 的良好实现。

有了这两个模型,我们继续对一些数据集进行训练。我必须说,在我们第一次尝试 Tiramisu 之后,我们发现它的结果对我们来说更有潜力,因为它能够捕捉图像中的锐利边缘。另一方面,unet 似乎不够精细,结果看起来有点模糊。

Unet 斑点

3、数据

在确定了模型的总体方向后,我们开始寻找合适的数据集。分割数据并不像分类或检测那样常见。此外,手动标记实际上是不可能的。最常见的分割数据集是 COCO 数据集,其中包括约 80K 张图像和 90 个类别,VOC pascal 数据集包含 11K 张图像和 20 个类别,以及较新的 ADE20K 数据集。

我们选择使用 COCO 数据集,因为它包含更多属于“人”类别的图像,而这正是我们感兴趣的类别。

考虑到我们的任务,我们考虑是否只使用与我们高度相关的图像,还是使用更通用的数据集。一方面,使用包含更多图像和类别的更通用的数据集将使模型能够处理更多的场景和挑战。另一方面,一夜之间,我们就训练了超过约 150K 张图像。如果我们使用整个 COCO 数据集引入模型,最终模型将看到每幅图像两次(平均而言),因此稍微修剪一下会很有帮助。此外,这将使我们的模型更专注于我们的目的。

还有一件事值得一提——Tiramisu 模型最初是在 CamVid 数据集上训练的,该数据集存在一些缺陷,但最重要的是它的图像非常单调:所有图像都是汽车的道路照片。你可以轻松理解,从这样的数据集中学习(即使其中包含人物)对我们的任务没有任何好处,因此经过短暂的尝试后,我们继续前进。

来自 CamVid 数据集的图像

COCO 数据集附带了相当直观的 API,让我们能够准确地知道每幅图像中的对象是什么(根据 90 个预定义类别)

经过一些实验,我们决定稀释数据集:首先,我们只过滤其中有人的图像,剩下 40K 幅图像。然后,我们删除所有有很多人的图像,只留下 1 或 2 幅,因为这是我们的产品应该找到的。最后,我们只留下 20%-70% 的图像被标记为人的图像,删除背景中有一个非常小的人或某种怪异怪物的图像(不幸的是,不是全部)。我们的最终数据集由 11K 幅图像组成,我们认为在这个阶段已经足够了。

左:图像合适 中:人太多 右:目标太小

4、Tiramisu 模型

如前所述,我们在 Jeremy Howard 的课程中​​介绍了 Tiramisu 模型。虽然它的全名“100 层 Tiramisu”意味着一个巨大的模型,但它实际上非常经济,只有 9M 个参数。相比之下,VGG16 有超过 130M 个参数。

Tiramisu 模型基于 DensNet,这是一种最新的图像分类模型,其中所有层都是互连的。此外,Tiramisu 为上采样层添加了跳跃连接,就像 Unet 一样。

如果你还记得的话,这种架构与 FCN 中提出的想法是一致的:使用分类架构、上采样并添加跳跃连接以进行细化。

Tiramisu架构

DenseNet 模型可以看作是 Resnet 模型的自然演化,但 DenseNet 不会“记住”每一层直到下一层,而是记住整个模型中的所有层。这些连接称为高速公路连接。它会导致滤波器数量膨胀,这被定义为“增长率”。Tiramisu的增长率为 16,因此我们每增加一层就增加 16 个新滤波器,直到达到 1072 个滤波器的层数。你可能期望有 1600 层,因为它是 100 层Tiramisu,但是,上采样层会丢弃一些滤波器。

Densenet 模型草图——早期的过滤器堆叠在整个模型中

5、训练

我们按照原始论文中描述的时间表训练我们的模型:标准交叉熵损失、RMSProp 优化器,学习率为 1e-3,衰减较小。我们将 11K 幅图像分为 70% 训练、20% 验证和 10% 测试。以下所有图像均取自我们的测试集。

为了使我们的训练时间表与原始论文保持一致,我们将 epoch 大小设置为 500 幅图像。这也使我们能够在每次结果改进时定期保存模型,因为我们在更多数据上对其进行了训练(本文中使用的 CamVid 数据集包含不到 1K 幅图像)

此外,我们只在 2 个类别上对其进行了训练:背景和人物,而论文中有 12 个类别。我们首先尝试在 coco 的一些类别上进行训练,但我们发现这对我们的训练没有太大帮助。

6、数据问题

一些数据集缺陷阻碍了我们的得分:

  • 动物——我们的模型有时会分割动物。这当然会导致 IOU 较低。将动物添加到我们的任务中,放在同一个主类中或另一个类中,可能会删除我们的结果
  • 身体部位——因为我们以编程方式过滤数据集,所以我们无法判断人物类实际上是人还是某个身体部位,比如手或脚。这些图像不在我们的范围内,但仍然到处出现。

动物、身体部位、手持物体

  • 手持物体 - 数据集中的许多图像与运动有关。棒球棒、网球拍和滑雪板随处可见。我们的模型对如何对它们进行分割感到困惑。与动物的情况一样,我们认为将它们添加为主类的一部分或单独的类将有助于提高模型的性能。

带有物体的运动图像

  • 粗略的基准真值 ——coco 数据集不是逐像素注释的,而是用多边形注释的。有时这已经足够好了,但有时基准真值非常粗糙,这可能会阻碍模型学习细微之处

图像和(非常)粗略的基准真值

7、结果

我们的结果令人满意,但并不完美:我们的测试集上的 IoU 达到了 84.6,而目前最先进的水平是 85。不过这个数字有点棘手:它在不同的数据集和类别中会波动。有些类别本质上更容易分割,例如房屋、道路,大多数模型很容易达到 90 IoU 的结果。其他更具挑战性的类别是树木和人类,大多数模型在这些类别上达到约 60 IoU 的结果。为了衡量这种难度,我们帮助我们的网络专注于单一类别和有限类型的照片。

我们仍然觉得我们的工作还没有像我们希望的那样“准备好投入生产”,但我们认为现在是停下来讨论我们的结果的好时机,因为大约 50% 的照片会产生良好的效果。

以下是一些很好的例子,可以让你感受一下应用程序的功能:

图像、基准真值、我们的结果

8、调试和记录

调试是训练神经网络的一个非常重要的部分。当我们开始工作时,我们很想直接开始,抓取数据和网络,开始训练,然后看看结果如何。然而,我们发现跟踪每一个动作,为自己制作工具以便能够检查每一步的结果,这一点非常重要。

以下是常见的挑战,以及我们为它们所做的工作:

  • 早期问题——模型可能没有训练。这可能是因为一些固有的问题,或者因为某种预处理错误,比如忘记对一些数据块进行规范化。无论如何,简单的结果可视化可能会非常有帮助。这里有一篇关于这个主题的好文章。
  • 调试网络本身——在确保没有关键问题后,训练开始,使用预定义的损失和指标。在分割中,主要测量是 IoU——相交除以并集。我们花了一些时间才开始使用 IoU 作为我们模型的主要测量(而不是交叉熵损失)。另一个有用的做法是展示我们模型在每个时期的一些预测。这是一篇关于调试机器学习模型的好文章。请注意,IoU 不是 keras 中的标准指标/损失,但你可以在网上轻松找到它,例如这里。我们还使用这个要点绘制了每个时期的损失和一些预测。
  • 机器学习版本控制——在训练模型时,有许多参数,其中一些参数很难理解。我必须说,我们还没有找到完美的方法,除了热切地编写我们的配置(并使用 keras 回调自动保存最佳模型,见下文)。
  • 调试工具——完成上述所有操作后,我们可以在每一步检查我们的工作,但不是无缝的。因此,最重要的步骤是将上述步骤结合在一起,并创建一个 Jupyter 笔记本,它允许我们无缝加载每个模型和每个图像,并快速检查其结果。这样我们就可以轻松地看到模型之间的差异、陷阱和其他问题。

以下是我们模型改进的示例,包括参数调整和额外训练:

用于保存迄今为止具有最佳验证 IoU 的模型,Keras 提供了非常好的回调以使这些事情变得更容易:

callbacks = [keras.callbacks.ModelCheckpoint(hist_model, verbose=1,save_best_only =True, monitor= ’val_IOU_calc_loss’), plot_losses]

除了常规调试可能的代码错误之外,我们还注意到模型错误是“可预测的”,例如“切割”似乎超出一般身体部位的身体部位、大段“咬伤”、不必要地继续延伸身体部位、光线不足、质量差以及许多细节。其中一些警告在添加来自不同数据集的特定图像时得到了处理,但其他警告仍然是需要处理的挑战。为了改善下一版本的结果,我们将专门针对模型的“困难”图像使用增强。

我们已经在上面提到了这个问题,以及数据集问题。现在让我们看看我们的一些模型难题:

  • 衣服——非常暗或非常浅的衣服有时往往会被解释为背景
  • “咬伤”——否则结果很好,但有一些咬伤

  • 照明 - 光线不足和模糊在图像中很常见,但在 COCO 数据集中却并非如此。因此,除了处理这些问题的标准模型难度之外,我们的模型甚至还没有为更难的图像做好准备。这可以通过获取更多数据来改进,此外,还可以通过数据增强来改进。同时,最好不要在晚上尝试我们的应用程序 :)

9、未来计划

进一步训练

我们的生产结果是在对训练数据进行约 300 次训练后得出的。在此之后,模型开始过度拟合。我们在发布前非常接近地达到了这些结果,因此我们还没有机会应用数据增强的基本实践。

我们在将图像大小调整为 224X224 后训练了模型。使用更多数据和更大图像(COCO 图像的原始大小约为 600X1000)进行进一步训练也有望改善结果。

CRF 和其他增强功能

在某些阶段,我们发现我们的结果在边缘处有点嘈杂。可以改进这一点的模型是 CRF。在这篇博文中,作者展示了使用 CRF 的简单示例。

然而,它对我们的工作不是很有用,也许是因为它通常在结果较粗糙时有帮助。

抠图

即使使用我们目前的结果,分割也不完美。头发、精致的衣服、树枝和其他精细物体永远无法完美分割,即使基准真值分割不包含这些细微之处。分离这种精细分割的任务称为抠图(matting),并定义了不同的挑战。这是最先进的抠图示例,于今年早些时候在 NVIDIA 会议上发布:

抠图示例——输入也包括三元图

抠图任务与其他图像相关任务不同,因为它的输入不仅包括图像,还包括三分图——图像边缘的轮廓,这使它成为一个“半监督”问题。

我们对抠图进行了一些实验,使用我们的分割作为三分图,但是没有得到显著的结果。

另一个问题是缺乏合适的数据集进行训练。

10、结束语

正如开头所说,我们的目标是构建一个重要的深度学习产品。正如你在 Alon 的帖子中看到的那样,部署变得越来越容易和快速。另一方面,训练模型是棘手的——训练,尤其是一夜之间进行的训练,需要仔细规划、调试和记录结果。

在研究和尝试新事物与平凡的训练和改进之间取得平衡也不容易。由于我们使用深度学习,我们总是觉得最好的模型,或者我们需要的确切模型就在眼前,另一个谷歌搜索或文章会引导我们找到它。但在实践中,我们真正的改进仅仅来自于从原始模型中“榨干”更多东西。正如上面所说,我们仍然觉得还有更多东西可以深入。


原文链接:图像背景剔除AI模型 - BimAnt

相关文章:

基于深度学习的图像背景剔除

在过去几年的机器学习领域,我一直想打造真正的机器学习产品。 几个月前,在参加了精彩的 Fast.AI 深度学习课程后,似乎一切皆有可能,我有机会:深度学习技术的进步使许多以前不可能实现的事情成为可能,而且开…...

Python使用(...)连接字符串

Python 字符串连接的灵活性。 使用括号来组织多行字符串时的自动拼接。 e e var_str g*3connect_str (fa{e}bcvar_strh )print(connect_str) print(type(connect_str)) 运行结果&#xff1a; aebcgggh <class str> 解释&#xff1a; 定义变量&#xff1a; e e:…...

鸿蒙:1.入门

概述 简介 鸿蒙操作系统&#xff08;HarmonyOS&#xff09;是华为公司发布的一款智能终端系统&#xff0c;是基于微内核的面向全场景的分布式操作系统。它致力于提供更加安全、高效、低延迟、低功耗的操作体验&#xff0c;可通过技术手段对应用程序和设备进行智能协同&#xf…...

【matlab】智能优化算法——求解目标函数

智能优化算法在求解目标函数方面发挥着重要作用&#xff0c;它通过迭代、筛选等方法来寻找目标函数的最优值&#xff08;极值&#xff09;。以下是关于智能优化算法求解目标函数的详细介绍&#xff1a; 一、智能优化算法概述 智能优化算法是一种搜索算法&#xff0c;旨在通过…...

不改代码,实现web.config或app.config的连接字符串加密解密

目的&#xff1a;加密字符串&#xff0c;防止明文显示。 好处&#xff1a;不用修改代码&#xff0c;微软自带功能&#xff0c;自动解密。 web.config 参考相关文章&#xff1a; Walkthrough: Encrypting Configuration Information Using Protected Configuration | Microso…...

Python创建MySQL数据库

一、使用Docker部署本地MySQL数据库 docker run --restartalways -p 3307:3306 --name mysql -e MYSOL_ROOT_PASSWORDlms123456 -d mysql:8.0.25 参数解析: 用户名:root 密码:lms123456 端口:3307 二、在Pycharm开发工具中配置连接MySQL数据库 三、安装zdppy_mysql pip inst…...

【C++】unordered系列容器的封装

你很自由 充满了无限可能 这是很棒的事 我衷心祈祷你可以相信自己 无悔地燃烧自己的人生 -- 东野圭吾 《解忧杂货店》 unordered系列的封装 1 unordered_map 和 unordered_set2 改造哈希桶2.1 模版参数2.2 加入迭代器 3 上层封装3.1 unordered_set3.2 unordered_map 4 面…...

matlab 超越椭圆函数图像绘制

matlab 超越椭圆函数图像绘制 超越椭圆函数图像绘制xy交叉项引入斜线负向斜线成分正向斜线成分 x^2 y^2 xy 1 &#xff08;负向&#xff09;绘制结果 x^2 y^2 - xy 1 &#xff08;正向&#xff09;绘制结果 超越椭圆函数图像绘制 xy交叉项引入斜线 相对于标准圆&#xf…...

本地文件同步上传到Gitee远程仓库

1、打开我们的项目所在文件夹 2、在项目文件夹【鼠标右击】弹出菜单&#xff0c;在【鼠标右击】弹出的菜单中&#xff0c;点击【Git Bash Here】&#xff0c;弹出运行窗口&#xff08;前提条件是已装好git环境&#xff09; 3、在命令窗口中输入&#xff1a;git init 4、在 Gite…...

RESTful Web 服务详解

RESTful Web 服务是一种基于 Representational State Transfer (REST) 架构风格的 Web 服务&#xff0c;它利用 HTTP 协议来传输数据&#xff0c;支持多种数据格式如 JSON 和 XML。在 Spring 框架中&#xff0c;通过简单配置和注解可以轻松实现 RESTful Web 服务。在本文中&…...

【ARMv8/v9 GIC 系列 5.3 -- 系统寄存器对中断的处理】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 ARMv8/v9系统寄存器对中断的控制Group 0中断的寄存器Group 1中断的寄存器安全状态与中断分组中断处理过程中断确认处理代码中断完成处理代码ARMv8/v9系统寄存器对中断的控制 在ARM GIC 体系结构中,中断分组通过一系列系统寄存器进…...

MUNIK解读ISO26262--系统架构

功能安全之系统阶段-系统架构 我们来浅析下功能安全系统阶段重要话题——“系统架构” 目录概览&#xff1a; 系统架构的作用系统架构类型系统架构层级的相关安全机制梳理 1.系统架构的作用 架构的思维包括抽象思维、分层思维、结构化思维和演化思维。通过将复杂系统分解…...

STM32第十五课:LCD屏幕及应用

文章目录 需求一、LCD显示屏二、全屏图片三、数据显示1.显示欢迎词2.显示温湿度3.显示当前时间 四、需求实现代码 需求 1.在LCD屏上显示一张全屏图片。 2.在LCD屏上显示当前时间&#xff0c;温度&#xff0c;湿度。 一、LCD显示屏 液晶显示器&#xff0c;简称 LCD(Liquid Cry…...

Java--继承

1.继承的本质是对某一批类的抽象&#xff0c;从而实现对世界更好的建模 2.extends的意思是“扩展”&#xff0c;子类是父亲的扩展 3.Java中只有单继承&#xff0c;没有多继承 4.继承关系的两个类&#xff0c;一个为子类&#xff08;派生类&#xff09;&#xff0c;一个为父类…...

Github与本地仓库建立链接、Git命令(或使用Github桌面应用)

一、Git命令&#xff08;不嫌麻烦可以使用Github桌面应用&#xff09; git clone [] cd [] git branch -vv #查看本地对应远程的分支对应关系 git branch -a #查看本地和远程所有分支 git checkout -b [hongyuan] #以当前的本地分支作为基础新建一个【】分支,命名为h…...

c++之旅第十一弹——顺序表

大家好啊&#xff0c;这里是c之旅第十一弹&#xff0c;跟随我的步伐来开始这一篇的学习吧&#xff01; 如果有知识性错误&#xff0c;欢迎各位指正&#xff01;&#xff01;一起加油&#xff01;&#xff01; 创作不易&#xff0c;希望大家多多支持哦&#xff01; 一,数据结构…...

深入了解 PXE:定义、架构、原理、应用场景及常见命令体系

引言 PXE&#xff08;Preboot Execution Environment&#xff0c;预启动执行环境&#xff09;是一种允许计算机通过网络启动操作系统而无需本地存储设备的技术。本文将详细介绍 PXE 的定义、架构、原理、应用场景及常见命令体系&#xff0c;特别是以 CentOS 为例&#xff0c;展…...

《每天5分钟用Flask搭建一个管理系统》第9章:API设计

第9章&#xff1a;API设计 9.1 RESTful API的概念 RESTful API是一种基于HTTP协议的网络服务接口设计方法&#xff0c;它使用标准的HTTP方法&#xff0c;如GET、POST、PUT、DELETE等&#xff0c;来执行资源的操作。 9.2 Flask-RESTful扩展的使用 Flask-RESTful是一个Flask扩…...

CCM的作用及原理

CCM调试的理论依据_ccm矩阵sat调试-CSDN博客 CCM是在WB之后&#xff0c;就是当AWB将白色校正之后其他颜色也会跟着有明显变化&#xff0c;CCM的作用就是要保持白色不变&#xff0c;把其他色彩校正到非常精准的地步。 校正后的颜色(target值是一个固定的值)CCM矩阵*原始的颜色…...

10.09面试题目记录

艾融软件 - 线上面试题 排序算法的时间复杂度 O(n^2&#xff09;&#xff1a;冒泡&#xff0c;选择&#xff0c;插入 O(logn&#xff09;&#xff1a;折半插入排序 O(nlogn)&#xff1a;希尔&#xff0c;归并&#xff0c;快速&#xff0c;堆 O(nk)&#xff1a;桶&#xff0c;…...

14-29 剑和诗人3 – 利用知识图谱增强 LLM 推理能力

知识图谱提供了一种结构化的方式来表示现实世界的事实及其关系。通过将知识图谱整合到大型语言模型中&#xff0c;我们可以增强它们的事实知识和推理能力。让我们探索如何实现这一点。 知识图谱构建 在利用知识图谱进行语言模型增强之前&#xff0c;我们需要从可靠的来源构建…...

【代码大全2 选读】看看骨灰级高手消灭 if-else 逻辑的瑞士军刀长啥样

文章目录 1 【写在前面】2 【心法】这把瑞士军刀长啥样3 【示例1】确定某个月份的天数&#xff08;Days-in-Month Example&#xff09;4 【示例2】确定保险费率&#xff08;Insurance Rates Example&#xff09;5 【示例3】灵活的消息格式&#xff08;Flexible-Message-Format …...

深度学习 --- stanford cs231学习笔记八(训练神经网络之dropout)

6&#xff0c;dropout 6&#xff0c;1 线性分类器中的正则化 在线性分类器中&#xff0c;我们提到过正则化&#xff0c;其目的就是为了防止过度拟合。例如&#xff0c;当我们要用一条curve去拟合一些散点的数据时&#xff0c;常常是不希望训练出来的curve过所有的点&#xff0c…...

【C++】 解决 C++ 语言报错:Undefined Reference

文章目录 引言 未定义引用&#xff08;Undefined Reference&#xff09;是 C 编程中常见的错误之一&#xff0c;通常在链接阶段出现。当编译器无法找到函数或变量的定义时&#xff0c;就会引发未定义引用错误。这种错误会阻止生成可执行文件&#xff0c;影响程序的正常构建。本…...

【博士每天一篇文献-算法】Adult neurogenesis acts as a neural regularizer

阅读时间&#xff1a;2023-12-20 1 介绍 年份&#xff1a;2022 作者&#xff1a;Lina M. Tran&#xff0c;Adam Santoro&#xff0c;谷歌DeepMind 期刊&#xff1a; Proceedings of the National Academy of Sciences 引用量&#xff1a;13 代码&#xff1a;https://github.c…...

在Spring Boot项目中引入本地JAR包的步骤和配置

在Spring Boot项目中&#xff0c;有时需要引入本地JAR包以便重用已有的代码库或者第三方库。本文将详细介绍如何在Spring Boot项目中引入本地JAR包的步骤和配置&#xff0c;并提供相应的代码示例。 1. 为什么需要本地JAR包 在开发过程中&#xff0c;可能会遇到以下情况需要使…...

Android Studio中使用命令行gradle查看签名信息

Android Studio中使用命令行gradle查看签名信息&#xff1a; 使用 Gradle 插件生成签名报告 打开 Android Studio 的 Terminal。 运行以下命令&#xff1a;./gradlew signingReport 将生成一个签名报告&#xff0c;其中包含 MD5、SHA1 和 SHA-256 的信息。 如果失败&#xf…...

昇思25天学习打卡营第5天 | 神经网络构建

1. 神经网络构建 神经网络模型是由神经网络层和Tensor操作构成的&#xff0c;mindspore.nn提供了常见神经网络层的实现&#xff0c;在MindSpore中&#xff0c;Cell类是构建所有网络的基类&#xff0c;也是网络的基本单元。一个神经网络模型表示为一个Cell&#xff0c;它由不同…...

Web缓存—Nginx和CDN应用

目录 一、代理的工作机制 二、概念 三、作用 四、常用的代理服务器 二.Nginx缓存代理服务器部署 1.在三台服务器上部署nginx 此处yum安装 2.准备测试界面 三、CDN概念及作用 1.CDN的工作过程 一、代理的工作机制 &#xff08;1&#xff09;代替客户机向网站请求数据…...

Linux 端口

什么是虚拟端口 计算机程序之间的通讯&#xff0c;通过IP只能锁定计算机&#xff0c;但是无法锁定具体的程序。通过端口可以锁定计算机上具体的程序&#xff0c;确保程序之间进行沟通。 IP地址相当于小区地址&#xff0c;在小区内可以有许多用户&#xff08;程序&#xff09;&…...

菜鸡的原地踏步史02(◐‿◑)

每日一念 改掉自己想到哪写哪的坏习惯 二叉树 二叉树的中序遍历 class Solution {/**中序遍历左 - 中 - 右*/private List<Integer> res new ArrayList<>();public List<Integer> inorderTraversal(TreeNode root) {if(root null) {return res;}tranve…...

实现Java应用的数据加密与解密技术

实现Java应用的数据加密与解密技术 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 数据加密与解密的重要性 数据安全是当今互联网应用开发中的重要问题之…...

赛博解压板

目录 开头程序程序的流程图程序的解压效果(暂无&#xff0c;但可以运行一下上面的代码)结尾 开头 大家好&#xff0c;我叫这是我58。今天&#xff0c;我们要看关于赛博解压板的一些东西。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #define ROW 6//ROW表示行数&#xff0c;可…...

微信小程序常用的事件

1.点击事件 WXML 中绑定点击事件&#xff1a; <!-- index.wxml --> <button bindtap"handleTap">点击我</button> 对应的 JS 文件中编写点击事件处理函数&#xff1a; // index.js Page({handleTap: function() {console.log(按钮被点击了);} }…...

js时间转成xx前

// 时间戳转多少分钟之前 export default function getDateDiff(dateTimeStamp) {// console.log(dateTimeStamp,dateTimeStamp)// 时间字符串转时间戳var timestamp new Date(dateTimeStamp).getTime();var minute 1000 * 60;var hour minute * 60;var day hour * 24;var …...

iOS 锁总结(cc)

iOS中atomic和synchrosize锁的本质是什么? 在iOS中,atomic和@synchronized锁的本质涉及底层的多线程同步机制。以下是关于这两者本质的详细解释: atomic 定义与用途: atomic是Objective-C属性修饰符的一种,用于指示属性的存取方法是线程安全的。当一个属性被声明为ato…...

【CSAPP】-binarybomb实验

目录 实验目的与要求 实验原理与内容 实验设备与软件环境 实验过程与结果&#xff08;可贴图&#xff09; 操作异常问题与解决方案 实验总结 实验目的与要求 1. 增强学生对于程序的机器级表示、汇编语言、调试器和逆向工程等方面原理与技能的掌握。 2. 掌握使用gdb调试器…...

SpringBoot实战:轻松实现XSS攻击防御(注解和过滤器)

文章目录 引言一、XSS攻击概述1.1 XSS攻击的定义1.2 XSS攻击的类型1.3 XSS攻击的攻击原理及示例 二、Spring Boot中的XSS防御手段2.1 使用注解进行XSS防御2.1.1 引入相关依赖2.1.2 使用XSS注解进行参数校验2.1.3 实现自定义注解处理器2.1.4 使用注解 2.2 使用过滤器进行XSS防御…...

如何改善提示词,让 GPT-4 更高效准确地把视频内容整体转换成文章?

&#xff08;注&#xff1a;本文为小报童精选文章。已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 让我们来讨论一下大语言模型应用中的一个重要原则 ——「欲速则不达」。 作为一个自认为懒惰的人&#xff0c;我一直有一个愿望&#xff1a;完成视频制作…...

TensorBoard进阶

文章目录 TensorBoard进阶1.设置TensorBoard2.图像数据在TensorBoard中可视化3.模型结构在TensorBoard中可视化&#xff08;重点✅&#xff09;4.高维数据在TensorBoard中低维可视化5.利用TensorBoard跟踪模型的训练过程&#xff08;重点✅&#xff09;6.利用TensorBoard给每个…...

使用AES加密数据传输的iOS客户端实现方案

在现代应用开发中&#xff0c;确保数据传输的安全性是至关重要的。本文将介绍如何在iOS客户端中使用AES加密数据传输&#xff0c;并与服务器端保持加密解密的一致性。本文不会包含服务器端代码&#xff0c;但会解释其实现原理。 加密与解密的基本原理 AES&#xff08;Advance…...

vue3【实战】语义化首页布局

技术要点&#xff0c;详见注释 <script setup></script><template><div class"page"><header>页头</header><nav>导航</nav><!-- 主体内容 --><main class"row"><aside>左侧边栏<s…...

FANG:利用社交网络图进行虚假新闻检测

1.概述 社交媒体已逐渐演变成为公众获取信息的主要途径。然而,值得警惕的是,并非所有流通的信息都具备真实性。特别是在政治选举、疫情爆发等关键节点,带有恶意企图的虚假信息(即“假新闻”)可能会对社会秩序、公平性和理性思考造成严重的干扰。作为全球抗击COVID-19的一部…...

Vue2 基础八电商后台管理项目——中

代码下载 商品分类页 新商品分类组件 goods/Cate.vue&#xff0c;在router.js中导入子级路由组件 Cate.vue&#xff0c;并设置路由规则。 绘制商品分类基本结构 在Cate.vue组件中添加面包屑导航以及卡片视图中的添加分类按钮&#xff1a; <template><div><…...

Typescript window.localStorage 存储 Obj Value区别

window.localStorage.setItem(UserC, JSON.stringify(userC)) const userC JSON.parse(window.localStorage.getItem(UserC) || {}) 不能获得UserC&#xff0c;所有保存的时候需要存储value&#xff0c;而不是对象。 {"__v_isShallow":false, "__v_isRef&quo…...

Linux要解压 .rar 文件,你应该使用 unrar 命令

命令 sudo tar -zxf ~/WebDemo.rar -C /usr/local 有一些问题。tar 命令通常用于解压 .tar、.tar.gz 或 .tar.bz2 文件&#xff0c;而不是 .rar 文件。要解压 .rar 文件&#xff0c;你应该使用 unrar 命令。下面是正确的步骤&#xff1a; 首先&#xff0c;安装 unrar&#xff0…...

【qt】如何获取网卡的信息?

网卡不只一种,有有线的,有无线的等等 我们用QNetworkInterface类的静态函数allInterfaces() 来获取所有的网卡 返回的是一个网卡的容器. 然后我们对每个网卡来获取其设备名称和硬件地址 可以通过静态函数humanReadableName() 来获取设备名称 可以通过静态函数**hardwareAddre…...

使用Netty框架实现WebSocket服务端与客户端通信(附ssl)

仓库地址&#xff1a; https://gitee.com/lfw1024/netty-websocket 导入后可直接运行 预览页面 自签证书&#xff1a; #换成自己的本地ip keytool -genkey -alias server -keyalg RSA -validity 3650 -keystore D:\mystore.jks -ext sanip:192.168.3.7,ip:127.0.0.1,dns:lo…...

ssm校园志愿服务信息系统-计算机毕业设计源码97697

摘 要 随着社会的进步和信息技术的发展&#xff0c;越来越多的学校开始重视志愿服务工作&#xff0c;通过组织各种志愿服务活动&#xff0c;让学生更好地了解社会、服务社会。然而&#xff0c;在实际操作中&#xff0c;志愿服务的组织和管理面临着诸多问题&#xff0c;如志愿者…...

JVM原理(二):JVM之HotSpot虚拟机中对象的创建寻位与定位整体流程

1. 对象的创建 遇到new指令时 当Java虚拟机遇到一个字节码new指令时。 首先会去检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否被加载、解析和初始化过。 如果没有&#xff0c;那么必须执行类的加载过程(加载、检查…...