【论文阅读】SRGAN

学习资料

  • 论文题目:基于生成对抗网络的照片级单幅图像超分辨率(Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network)
  • 论文地址:https://arxiv.org/abs/1609.04802
  • 代码:GitHub - xiph/daala: Modern video compression for the internetGitHub - jbhuang0604/SelfExSR: Single Image Super-Resolution from Transformed Self-Exemplars (CVPR 2015)http://cv.snu.ac.kr/research/DRCN/https://twitter.box.com/s/lcue6vlrd01ljkdtdkhmfvk7vtjhetogGitHub - david-gpu/srez: Image super-resolution through deep learning

1. WHY

现有方法的局限性

特点/优点:主要关注最小化均方重建误差(MSE)(目标函数);能提高峰值信噪比(PSNR)(目标函数)

缺点:恢复的图像缺乏高频细节;在感知上不令人满意;无法匹配在更高分辨率下预期的保真度,尤其在大放大因子下问题更明显。

GAN 的优势及应用潜力

GAN 为生成具有高感知质量的逼真自然图像提供了框架,可使重建向自然图像流形移动,有潜力解决超分辨率问题中的感知质量不佳问题。

2. WHAT

问题设定

在单图像超分辨率(SISR)的任务中:

目标阐述

其目的在于依据低分辨率输入图像I^{LR}来估计出超分辨率图像I^{SR}。其中I^{LR}是其对应的高分辨率图像I^{HR}的低分辨率版本,高分辨率图像仅在训练期间提供。

低分辨率图像的来源

这里所提到的低分辨率输入图像(I^{LR})是与之对应的高分辨率图像(I^{HR})的低分辨率版本。并且,高分辨率图像仅在训练阶段才会被提供。

在训练过程中,低分辨率输入图像(I^{LR})是通过以下方式获取的:

  • 首先对高分辨率图像(I^{HR})应用高斯滤波器。
  • 接着进行具有特定降采样因子(r)的降采样操作。(本文中r=4

图像的描述方式

对于具有C(channel)个颜色通道的图像:

  • 低分辨率输入图像(I^{LR})用大小为W\times H\times C来描述。
  • 超分辨率图像(I^{SR})则用rW\times rH\times C来描述。

2.1. SRGAN

\begin{aligned}\min_{\theta_{G}}\max_{\theta_{D}}&\mathbb{E}_{I^{HR}\sim p_{\mathrm{wain}}(I^{HR})}[\log D_{\theta_{D}}(I^{HR})]+\\&\mathbb{E}_{I^{LR}\sim p_{G}(I^{LR})}[\log(1-D_{\theta_{D}}(G_{\theta_{G}}(I^{LR}))]\end{aligned}

G:生成器网络的整体表示。

G_{\theta_{G}}:表示由参数\theta _G参数化的生成器函数。

$G_{\theta_{G}}(I^{LR})$:生成器函数G_{\theta_{G}}根据低分辨率图像I^{LR}生成的超分辨率图像。

D_{\theta_{D}}(I^{HR}):判别器函数D_{\theta_{D}}对真实高分辨率图像I^{HR}的判别输出。

D_{\theta_{D}}(G_{\theta_{G}}(I^{LR})):判别器函数D_{\theta_{D}}对生成的超分辨率图像$G_{\theta_{G}}(I^{LR})$的判别输出。

\mathbb{E}_{I^{HR}\sim p_{wain}(I^{HR})}:表示在真实高分辨率图像I^{HR}服从数据分布p_{wain}(I^{HR})的情况下数学期望。在概率论和统计学中,数学期望(或均值)是试验中每次可能结果的概率乘以其结果的总和。在这里,它用于衡量在给定的真实高分辨率图像分布p_{wain}(I^{HR})下,logD_{\theta_{D}}(I^{HR})的平均表现。

$\mathbb{E}_{I^{LR}\sim p_{G}(I^{LR})}$:表示在低分辨率图像I^{LR}服从数据分布p_{G}(I^{LR})的情况下的数学期望。

对于判别器D,当看到真实的高分辨率图像$I^{HR}$时,它希望$logD_{\theta_D}\left(I^{HR}\right)$越大越好,也就是判断正确的概率越高越好;当看到生成器生成的图像$G_{\theta_{G}}(I^{LR})$时,它希望log(1-D_{\theta_D}\left(G_{\theta_G}\left(I^{LR}\right)\right))越大越好,也就是判断为假的概率越高越好。

而生成器G呢,它就希望通过调整自己的参数\theta _G,让log(1-D_{\theta_D}\left(G_{\theta_G}\left(I^{LR}\right)\right))越小越好,这样生成的图像就越能骗过判别器D,让判别器以为它是真实的高分辨率图像。

2.1.1. 生成器网络

最终目标是训练生成函数G来估计给定LR输入图像对应的HR对应,即SR

SRResNet 在 SRGAN 中充当了生成器的基础架构部分,为 SRGAN 生成器提供了初始的网络结构和参数,是 SRGAN 生成器的重要组成部分。

B个残差块

这是生成器网络的核心结构。生成器网络的核心由B(在本文中B=16)个残差块组成。这些残差块具有相同的布局,它们是网络能够学习到有效特征表示的关键部分,有助于在提升图像分辨率的同时保留图像的重要信息。(就是那些深蓝色的矩形块,第一个矩形块详细描述了内部结构,图中画残差块有所省略,应该有16个深蓝色的矩形块)


每个残差块中使用了两个具有小3\times 3核和 64 个特征图的卷积层,这种小卷积核的设计有助于提取图像的局部特征,并且在不增加过多参数的情况下增加网络的表达能力。(就是深蓝色的矩形块里的浅蓝色矩形块)

k3n64s1是对卷积层的一种参数表示方式。

其中,k3表示卷积核的大小为3\times 3 ,这意味着在进行卷积操作时,卷积核会在输入图像或特征图上以3\times 3的窗口进行滑动计算。

n64表示卷积层输出的特征图数量为 64 个,即经过该卷积层处理后,图像的深度(通道数)变为 64。(说明有64个卷积核)

s1表示卷积的步长为 1,这意味着卷积核在滑动过程中每次移动 1 个像素的距离,较小的步长有助于提取更精细的图像特征,同时也能保持图像的空间分辨率相对不变,避免因过大的步长而丢失过多信息。

在卷积层之后,接着是批归一化层(Batch Normalization),其作用是加速网络训练过程中的收敛速度,减少内部协变量偏移问题,使得网络训练更加稳定。(就是深蓝色的矩形块里的橘色矩形块)

最后使用参数化 ReLU(Parametric ReLU)作为激活函数,引入了可学习的参数,增强了网络的非线性表达能力,有助于生成器生成更逼真的图像。(就是深蓝色的矩形块里的黄色矩形块)

亚像素卷积层与分辨率提升

在残差块之后,使用了 Shi 等人提出的两个经过训练的亚像素卷积层。这些亚像素卷积层的主要作用是增加输入图像的分辨率,将低分辨率图像逐步提升到高分辨率,从而实现超分辨率的目标。通过这种方式,生成器能够有效地将低分辨率图像转换为具有更多细节和更高清晰度的超分辨率图像。

跳跃连接

在生成器网络中还存在跳跃连接(Skip Connection),它将输入直接连接到残差块的输出,这种连接方式有助于缓解网络在学习身份映射时的困难,使得网络能够更好地处理深层次网络中的梯度消失问题,保证信息在网络中的有效传递,同时也有助于生成器在生成图像时保留更多的原始图像信息,提高生成图像的质量。

2.1.2. 判别器网络

为了区分真实的HR图像和生成的SR样本,训练一个判别器网络。

卷积层

这里的卷积层用于特征提取。判别器网络包含 8 个卷积层,其中滤波器核大小为3\times 3

从网络的浅层到深层,特征数量逐渐增加,从 64 个核开始,每次增加一倍,这种设计使得判别器能够逐步学习到图像更高级、更抽象的特征表示,从而更好地区分真实高分辨率图像和生成的超分辨率图像。在特征数量增加时,使用跨步卷积(Strided Convolution)来降低图像分辨率,这样可以在保持感受野大小不变的情况下,减少计算量并增加网络的感受野,使判别器能够关注到图像更广泛区域的特征信息。

(就是深蓝色的矩形块里的浅蓝色矩形块)

激活函数

整个判别器网络使用 LeakyReLU 激活函数(\alpha =0.2),LeakyReLU 函数在负数区间也有一定的斜率,避免了传统 ReLU 函数在负数区间导致的神经元 “死亡” 问题,使得网络在反向传播过程中能够更好地传递梯度信息,加快训练速度并提高训练效果。

同时,判别器网络避免了使用最大池化(Max Pooling)操作,这有助于保留更多的图像细节信息,使得判别器能够更准确地对图像进行分类判断。

(就是深蓝色的矩形块里的浅黄色矩形块)

全连接层

在经过一系列卷积层提取特征后,判别器网络接着使用两个密集层(全连接层),将前面卷积层提取到的特征映射到一个低维空间,进一步整合特征信息。(荧光色矩形块)

分类输出

最后通过一个 sigmoid 激活函数输出样本分类的概率,该概率值表示输入图像被判别为真实高分辨率图像的可能性,概率值越接近 1,表示判别器认为该图像是真实高分辨率图像的可能性越高;概率值越接近 0,表示判别器认为该图像是生成的超分辨率图像(即假图像)的可能性越高。通过这种方式,判别器能够有效地对输入图像进行分类,从而在生成对抗网络的训练过程中,与生成器相互竞争、相互学习,共同提高网络的性能。

2.2. 感知损失函数

论文中使用了感知损失函数(Perceptual Loss Function)来训练网络,同时使用平均意见得分(Mean Opinion Score,MOS)来评估不同方法重建图像的感知质量。

如果只是用普通的损失函数,比如只看像素是不是一样(像均方误差 MSE 那种),得到的高分辨率图像可能看起来还是不那么好,缺乏一些细节,看起来不真实。所以我们需要一个更好的方法来衡量生成的高分辨率图像好不好,这就有了感知损失函数。

感知损失函数l^{SR}是内容损失(L_{X}^{SR})和对抗损失(L_{Gen}^{SR})的加权组合,就像做一个蛋糕需要面粉和糖一样,公式为l^{SR}=L_{X}^{SR}+10^{-3}L_{Gen}^{SR}

2.2.1. 内容损失(L_{X}^{SR})

内容损失函数是看生成的超分辨率图像和原始的高分辨率图像在内容上像不像,包括像素级 MSE 损失(常用但有缺陷)和基于 VGG 网络特征图的 VGG 损失(更符合感知相似性)

像素级 MSE 损失

一个一个地对比两个图像I_{x,y}^{HR}G_{\theta_{G}}(I^{LR})_{x,y}的像素是不是一样,计算它们差值的平方和然后平均。

由于它只看像素,得到的图像可能很平滑,没有真实图像的那种细节,基于此优化的结果往往缺乏高频内容,感知上不够令人满意。

最常用的优化目标,计算公式为

l_{MSE}^{SR}=\frac{1}{r^{2}WH}\sum_{x = 1}^{rW}\sum_{y = 1}^{rH}(I_{x,y}^{HR}-G_{\theta_{G}}(I^{LR})_{x,y})^{2}

VGG 损失

这个就聪明一点啦。它是利用一个已经训练好的 VGG 网络,看生成的图像和原始图像经过 VGG 网络某些层后的特征是不是一样(通过计算它们特征之间的距离)。这样就不是只看像素啦,而是看图像更本质的特征,得到的结果会更符合我们人眼看到的真实感。

基于预训练的 19 层 VGG 网络的 ReLU 激活层定义。

l_{VGG/i.j}^{SR}=\frac{1}{W_{i,j}H_{i,j}}\sum_{x = 1}^{W_{i,j}}\sum_{y = 1}^{H_{i,j}}(\phi_{i,j}(I^{HR})_{x,y}-\phi_{i,j}(G_{\theta_{G}}(I^{LR}))_{x,y})^{2}

2.2.2. 对抗损失 (L_{Gen}^{SR})

l_{Gen}^{SR}=\sum_{n = 1}^{N}-logD_{\theta_{D}}(G_{\theta_{G}}(I^{LR}))

G_{\theta_{G}}(I^{LR})是生成器函数G_{\theta_{G}}生成的图像。

D_{\theta_{D}}觉得G_{\theta_{G}}(I^{LR})G_{\theta_{G}}生成的概率越大,logD_{\theta_{D}}(G_{\theta_{G}}(I^{LR}))越接近0,损失函数越小;

D_{\theta_{D}}觉得G_{\theta_{G}}(I^{LR})I^{HR}的概率越大,logD_{\theta_{D}}(G_{\theta_{G}}(I^{LR}))越接近1,损失函数越大。

2.3. 实验

2.3.1. 数据集

实验在三个广泛使用的基准数据集 Set5、Set14 和 BSD300 测试集 BSD100 上进行,所有实验均以 4 倍比例因子处理低分辨率与高分辨率图像,相当于图像像素减少 16 倍。为确保公平比较,PSNR 和 SSIM 度量在中心剪切的 y 通道上计算,从图像边界去除 4 像素宽的条带,使用 daala 包进行处理6。

2.3.2. 训练细节和参数

训练数据与预处理

使用 ImageNet 数据库中 35 万张图像的随机样本进行网络训练,这些图像与测试图像不同。对 HR 图像(BGR,C = 3)采用降采样因子 r = 4 的双三次核进行降采样得到 LR 图像。每个小批处理中,从 16 个随机 96×96 的不同训练图像中裁剪 HR 子图像。输入的 LR 图像范围缩放为 [0, 1],HR 图像范围缩放为 [-1, 1],在 [-1, 1] 强度范围的图像上计算 MSE 损失,VGG 特征图按 12.751 倍重新缩放,使 VGG 损失与 MSE 损失尺度相当(乘以约 0.006 的缩放因子)6。

优化器与学习率策略

采用 Adam 优化器(β1 = 0.9)。

SRResNet 网络的学习率分别为 10⁻⁴和 10⁻⁶次更新迭代;训练 SRGAN 时,先使用训练好的基于 MSE 的 SRResNet 网络初始化生成器,以避免局部最优,所有 SRGAN 变体先以 10⁻⁴的学习率进行 10⁵次更新迭代训练,再以 10⁻⁵的较低学习率进行 10⁵次迭代训练,且交替更新生成器和判别器网络(k = 1)6。

网络架构与测试设置

生成器网络有 16 个相同(B = 16)的残差块,基于 Theano 和 Lasagne 实现。测试期间关闭 batch - normalization 更新,以获得仅依赖于输入的确定性输出56。

训练过程

使用 ImageNet 数据库中 35 万张图像的随机样本在 NVIDIA Tesla M40 GPU 上训练网络,对 HR 图像降采样得到 LR 图像,裁剪随机 HR 子图像,缩放输入和 HR 图像范围,重新缩放 VGG 特征图,使用 Adam 优化器,设置不同学习率训练 SRResNet 和 SRGAN。

2.3.3. 平均意见评分(MOS)测试

测试方法与评分标准

进行 MOS 测试,邀请 26 名评分者为超分辨率图像打分(1 - 5 分,1 为质量差,5 为质量优秀)。

评分者对 Set5、Set14 和 BSD100 上的图像进行评分,包括多种方法(最近邻、双三次、SRCNN、SelfExSR、DRCN、ESPCN、SRResNet - MSE、SRResNet - VGG22、SRGAN - MSE、SRGAN - VGG22、SRGAN - VGG54 和原始 HR 图像)的重建结果。每个评分者对大量实例(1128 个)进行评分,图像以随机方式呈现,评分者事先在校准图像上进行校准,确保评分标准一致67。

测试结果分析

测试结果显示,评分者对不同方法的评分差异明显,如一致将 NN 插值的测试图像评为 1,将原始 HR 图像评为 5。SRGAN 在 Set14 和 BSD100 数据集上的表现显著优于其他方法,其 MOS 评分更接近原始高分辨率图像。在 Set5 上结果不太确定,但整体趋势仍表明 SRGAN 在感知质量方面具有优势。不同方法的 MOS 分数分布和平均排名进一步证实了 SRGAN 的优越性,其在 BSD100 上的表现尤为突出,与其他方法相比,MOS 差异显著(除 SRCNN 与 SelfExSR 外)714。

2.3.4. 含量损失的调查

研究内容与损失函数选择

研究不同内容损失选择对 GAN 感知损失的影响,具体调查了三种内容损失:SRGAN - MSE(以标准 MSE 作为内容损失)、SRGAN - VGG22(在表示低级特征的特征映射上定义损失)和 SRGAN - VGG54(在更深网络层的更高级别特征映射上定义损失)。在训练 SRResNet - VGG22 时,添加了权重为 2×10⁻⁸的额外总变异损失。通过比较这些不同损失函数下的网络性能,分析其对生成图像质量的影响7。

结果与观察

实验发现,MSE 优化虽能提供高 PSNR 值,但生成图像在感知上较平滑,不如对视觉感知更敏感的损失分量生成的图像令人信服,这是由于 MSE 内容损失和对抗性损失之间的竞争。在少数基于 SRGAN - MSE 的重建中观察到次要重建伪影,也归因于目标竞争。在 Set14 上,SRGAN - VGG54 在 MOS 方面显著优于其他 SRGAN 和 SRResNet 变体,表明使用更高级别的 VGG 特征图可产生更好的纹理细节。不同损失函数下的网络在 PSNR、SSIM 和 MOS 等指标上表现各异,体现了内容损失选择对生成器性能的重要影响7。...

3. HOW

MOS 测试结果:SRGAN 在感知质量方面取得显著进步,其 MOS 分数更接近原始高分辨率图像,优于其他参考方法。不同内容损失对 MOS 分数有影响,更深层的 VGG 特征图可产生更好纹理细节。

网络性能比较:SRResNet 在 PSNR/SSIM 方面设置了新技术水平,SRGAN 在很大程度上优于所有参考方法,为逼真图像 SR 设定了新技术水平。对抗性损失可提高感知质量,但也会使基于 MSE 的解决方案在感知上更平滑。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python爬虫实战】Selenium自动化网页操作入门指南

#1024程序员节|征文# 🌈个人主页:易辰君-CSDN博客 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、准备工作 (一)安装 Selenium 库 &#xff0…

SpringBoot项目里怎么简单高效使用Redis?我选择使用Lock4j

文章目录 前言正文1、Lock4j的代码仓库2、pine-manage-common-redis的项目结构3、pine-manage-common-redis 的完整代码3.1 maven依赖:pom.xml3.2 redis连接参数:application.yaml3.3 RedisCache.java3.4 CacheConfig.java3.5 RedissonClientUtil.java3.…

Python | Leetcode Python题解之第509题斐波那契数

题目&#xff1a; 题解&#xff1a; class Solution:def fib(self, n: int) -> int:if n < 2:return nq [[1, 1], [1, 0]]res self.matrix_pow(q, n - 1)return res[0][0]def matrix_pow(self, a: List[List[int]], n: int) -> List[List[int]]:ret [[1, 0], [0, …

Redisson(三)应用场景及demo

一、基本的存储与查询 分布式环境下&#xff0c;为了方便多个进程之间的数据共享&#xff0c;可以使用RedissonClient的分布式集合类型&#xff0c;如List、Set、SortedSet等。 1、demo <parent><groupId>org.springframework.boot</groupId><artifact…

spygalss cdc 检测的bug(二)

当allow_qualifier_merge设置为strict的时候&#xff0c;sg是要检查门的极性的。 如果qualifier和src经过与门汇聚&#xff0c;在同另一个src1信号或门汇聚&#xff0c;sg是报unsync的。 假设当qualifier为0时&#xff0c;0&&src||src1src1&#xff0c;src1无法被gat…

Mysql入门3——多表操作、事务、索引

Mysql入门3——多表操作、事务、索引 一、多表设计 ​ 在项目开发中&#xff0c;在进行数据库表的结构设计时&#xff0c;会根据业务需求及业务模块之前的关系&#xff0c;分析并设计表的结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表之间也存在着各种关系&am…

基于SSM的智慧篮球馆预约系统

前言 近些年&#xff0c;随着中国经济发展&#xff0c;人民的生活质量逐渐提高&#xff0c;对网络的依赖性越来越高&#xff0c;通过网络处理的事务越来越多。随着智慧篮球馆预约的常态化&#xff0c;如果依然采用传统的管理方式&#xff0c;将会为工作人员带来庞大的工作量&a…

css设置滚动条样式

效果图&#xff1a; // 滚动条样式 div::-webkit-scrollbar {width: 4px; } /* 滚动条滑块&#xff08;里面小方块&#xff09; */ div::-webkit-scrollbar-thumb {border-radius: 10px;-webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);opacity: 0.2;background-color…

【面试经典150】day 8

#1024程序员节 | 征文# 作为一个未来的程序员&#xff0c;现在我要继续刷题了。 力扣时刻。 目录 1.接雨水 2.罗马数字转整数 3.最后一个单词的长度 4.最长公共前缀 5.反转字符串中的单词 1.接雨水 好好好好好好&#xff0c;一开始就接雨水。我记得接了n次了。。。 痛苦战…

【读书笔记·VLSI电路设计方法解密】问题25:为什么时钟如此重要

时钟是一种在高电平和低电平之间振荡的电信号。它通常是一个具有预定周期(频率)的方波,如图3.6所示。在同步数字电路中,时钟信号协调芯片上所有电路元件的动作。电路在时钟信号的上升沿、下降沿或两者的边缘处变为活动状态以实现同步。时钟信号相关问题是任何VLSI芯片设计中…

ASP.NET Core 8.0 中使用 Hangfire 调度 API

在这篇博文中&#xff0c;我们将引导您完成将 Hangfire 集成到 ASP.NET Core NET Core 项目中以安排 API 每天运行的步骤。Hangfire 是一个功能强大的库&#xff0c;可简化 .NET 应用程序中的后台作业处理&#xff0c;使其成为调度任务的绝佳选择。继续阅读以了解如何设置 Hang…

HarmonyOS NEXT初级案例:网络数据请求

使用HTTP访问网络 “HTTP协议”的全称:超文本传输协议(Hyper Text Transfer Protocol)。 一、添加网络管理权限 在“module.json5”文件中添加网络访问权限配置: "module": {"requestPermissions": [{"name":"ohos.permission.INTER…

【leetcode】动态规划

19. 918 环形子数组的最大和 题目&#xff1a; 给定一个长度为 n 的环形整数数组 nums &#xff0c;返回 nums 的非空 子数组 的最大可能和 。 环形数组 意味着数组的末端将会与开头相连呈环状。形式上&#xff0c; nums[i] 的下一个元素是 nums[(i 1) % n] &#xff0c; nums…

《2024中国泛娱乐出海洞察报告》解析,垂直且多元化方向发展!

随着以“社交”为代表的全球泛娱乐市场规模不断扩大以及用户需求不断细化&#xff0c;中国泛娱乐出海产品正朝着更加垂直化、多元化的方向发展。基于此&#xff0c;《2024中国泛娱乐出海洞察报告》深入剖析了中国泛娱乐行业出海进程以及各细分赛道出海现状及核心特征。针对中国…

Python游戏开发超详细第二课/一个小游戏等制作过程(入门级篇共2节)

直播内容&#xff0c;这里都用大多用照片代替了哈&#xff0c;因为在写一遍很累&#xff0c;哥哥姐姐理解一下抱歉抱歉 一个是我懒的写一遍&#xff0c;但是刚学的兄弟姐妹可不许学我偷懒哈 二防止有人偷懒&#xff0c;直接复制粘贴代码&#xff0c;所以为了方便帮助你们学习&a…

【AIGC】ChatGPT应用之道:如何打破`专家`幻象,提升AI协作质量

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;ChatGPT的实际能力用户对ChatGPT的常见误解超越误解&#xff0c;合理设定期望总结 &#x1f4af;超越“专家”幻想设定合理的期望总结 &#x1f4af;提升人工智能协作质量…

寻找大自然的颜色

走在停停&#xff0c;停停走走&#xff0c;恍惚间一天过去了&#xff0c;转瞬间一年过去了&#xff0c;身边的一切在变化又不在变化&#xff0c;生活是自己的又不是自己的。 今天是个特殊的日子&#xff0c;其实前几天对我而言就算特殊的日子了&#xff0c;一个心里暗暗等待着却…

python之数据结构与算法(数据结构篇)-- 集合

一、集合的概念 所谓的编程中的”集合“&#xff0c;其实和高中数学中集合是一样的的。比如&#xff1a;羊村和狼堡看作一个集合&#xff0c;而狼堡中的"灰太狼"、"红太狼"、"小灰灰"则可看作狼堡中的元素&#xff0c;同理&#xff0c;羊村中的…

通过火山云API来实现:流式大模型语音对话

这里我们需要在火山云语音控制台开通大模型的流式语音对话、获取豆包模型的apiKey&#xff0c;开通语音合成项目。 这里使用的豆包模型是Doubao-lite&#xff0c;延迟会更低一些配置说明 这里一共有四个文件&#xff0c;分别是主要的fastAPI、LLM、STT、文件 TTS中需要配置 ap…

洛谷 U411986 数的范围(二分模板)

题意&#xff1a;在一个有序序列里面找某个值的初始出现下标和最后出现下标&#xff0c;如果该值不存在&#xff0c;输出-1 -1。 整数二分模板题&#xff0c;该题主要用来练习如何写两种情况下的二分函数的代码模板。 1&#xff09;upper_bound函数&#xff1a;用来寻找边界点A…