二元函数图像生成器_GAN生成图像综述

点击上方“CVer”,选择加"星标"或“置顶”

重磅干货,第一时间送达ea0a74c3bbf8e30a4809fca4e2411d11.png

作者:YTimo(PKU EECS)   研究方向:深度学习,计算机视觉

本文转载自:SIGAI

摘要

生成对抗网络(Generative adversarial network, GAN)[1]自2014年由Ian Goodfellow等人提出后,就越来越受到学术界和工业界的重视。而随着GAN在理论与模型上的高速发展,它在计算机视觉、自然语言处理、人机交互等领域有着越来越深入的应用,并不断向着其它领域继续延伸。其中,GAN在图像生成上取得了巨大的成功,这取决于GAN在博弈下不断提高建模能力,最终实现以假乱真的图像生成。

围绕GAN的研究可以分为两条主线,一是理论主线,从数学理论上研究如何解决GAN的不稳定性和模式崩塌问题,或者从信息理论和基于能量的模型等不同角度重新阐述它。二是应用主线,致力于将GAN应用于计算机视觉领域、利用GAN进行图像生成(指定图像合成、文本到图像,图像到图像、视频)以及将GAN应用于NLP或其它领域。利用GAN进行图像生成和转换是当前研究最多的,并且该领域的研究已经证明了GAN在图像合成中的巨大潜力。

本文从GAN的基本模型开始,简要总结GAN的原理和改进,介绍其在图像生成与转换中的研究和应用,并讨论其理论和应用中尚存在的挑战。

正文

引言

在机器学习中,生成模型可以用来直接对数据建模,也可以用来建立变量间的条件概率分布。它的应用十分广泛,可以用来不同的数据进行建模,比如图像、文本、声音等。以图像生成为例,我们将图像表示为一个随机向量X,其中每一维都表示一个像素值。假设自然场景的图像都服从一个未知的分布p(x),我们希望通过一些观测样本来估计其分布,高维随机向量一般比较难以直接建模,需要通过一些条件独立性来简化模型。但是,自然图像中不同像素之间存在的复杂的依赖关系,很难用一个明确的图模型来描述其依赖关系,因此直接建模p(x)比较困难,对生成模型的要求很高。

在GAN之前,人们就已经研究了很多生成模型,随着深度神经网络的发展,生成模型也得到了巨大的飞跃。目前有影响力的生成模型主要有Autoregressive model(自回归模型)[2][3]、VAE[4]、GLOW[5]和GAN[1]:

1.自回归模型(Autoregressive model)

自回归模型在PixelRNN[2]和PixelCNN[3]上展示了很不错的实验效果,但是由于是按照像素点去生成图像,导致计算成本高,在可并行性上受限,在处理大型数据如大型图像或视频具有一定的麻烦。

2. 变分自编码器(VAE)

VAE是在Autoencoder的基础上让图像编码的潜在向量服从高斯分布从而实现图像的生成,优化了数据对数似然的下界,VAE在图像生成上是可并行的, 但是VAE存在着生成图像模糊的问题。

3.基于流的方法(Glow)

Glow提出了一种新的基于流的生成模型,通过寻找可逆的双射来实现输入和潜在空间的相互转换,其在标准图像建模基准上的对数似然性方面展示了改进的定量性能,特别是在高分辨率人脸图像合成和插值生成上取得了惊艳的效果。

4. 生成对抗网络(GAN)

GAN的思想就是利用博弈不断的优化生成器和判别器从而使得生成的图像与真实图像在分布上越来越相近。GAN生成的图像比较清晰,在很多GAN的拓展工作中也取得了很大的提高。但是GAN生成中的多样性不足以及训练过程不稳定是GAN一直以来的问题。

然而GAN存在的问题并没有限制GAN的发展,在GAN改进和应用方面的文章层出不穷。其中GAN在图像生成上的应用最为突出,当然在计算机视觉中还有许多其他应用,如图像绘画,图像标注,物体检测和语义分割。在自然语言处理中应用GAN的研究也是一种增长趋势,如文本建模,对话生成,问答和机器翻译。在不同的任务中训练GAN可能面临不同的问题并且需要更多技术,这也使其成为具有挑战性但有趣的研究领域。

GAN的基本原理与研究进展

朴素GAN的基本模型

GAN受博弈论中的零和博弈启发,将生成问题视作判别器和生成器这两个网络的对抗和博弈:生成器从给定噪声中(一般是指均匀分布或者正态分布)产生合成数据,判别器分辨生成器的的输出和真实数据。前者试图产生更接近真实的数据,相应地,后者试图更完美地分辨真实数据与生成数据。由此,两个网络在对抗中进步,在进步后继续对抗,由生成网络得到的数据也就越来越完美,逼近真实数据,从而可以生成想要得到的数据(图片、序列、视频等)。

70aaf0e985fa5c33ff1474240f5696f2.png

图一:GAN的基本结构

理论上GAN可以将任意的分布作为输入,如上图所示,z输入为随机噪声,在实验中我们多取z ∼ (0,1) 或z ~ [-1,1] 的均匀分布作为输入。生成器G的参数为θ,输入z在生成器下得到7e38fdc10736b40053cb333304747de9.png,输出可以被视为从分布中抽取的样本17f10f58f02db94e23afe2104df4a211.png。对于训练样本x的数据分布为176dcbba96c25791df00466ea68bea57.png,生成器G的目标是使pg近似176dcbba96c25791df00466ea68bea57.png,判别器D的目标则是尽可能区分生成样本和真实样本的真假,通过最大-最小博弈来进行训练,这种博弈可公式化为:

adbf08426d9f7559b22fd4b7ee978c63.png

其中第一项的logD(x)表示判别器对真实数据的判断,第二项737dccc7e79682c1c97e762f0d8cb27a.png表示对合成数据的判断。通过这样一个最大最小(Max-min)博弈,循环交替地分别优化G和D来训练所需要的生成式网络与判别式网络,直到到达Nash均衡点。

GAN的问题与研究进展

最早GAN的提出是为了通过生成模型和判别模型对抗来达到对生成图片最大相似度的伪装,比起VAE生成的图片会比较清晰。但是原始GAN模型本身也存在一些问题,主要的问题有两个:

(1)判别器越好,生成器的梯度消失越严重,这样会导致在网络训练上很多时候生成器的参数基本上不会发生改变。

(2)由于网络是对抗式的,常常会造成训练时模型的崩溃(collapse mode),在训练时往往需要权衡训练的生成器与鉴别器的参数来防止崩溃的发生。这样在实际的应用上也带了很多不便。

WGAN[6]和WGAN-GP[7]首先分析了原始GAN的问题,前者通过对生成样本和真实样本加噪声使得两个分布产生重叠,理论上可以解决训练不稳定;后者引入梯度惩罚,使得GAN训练更加稳定,收敛更快,同时能够生成更高质量的样本。LSGAN[8] 使用最小二乘损失函数代替了原始GAN的损失函数,让模型在训练的过程中更多的关注真实度不高的样本,缓解了GAN训练不稳定和生成图像质量差多样性不足的问题。DCGAN[9]将CNN引入生成器和判别器,借助CNN更强的拟合与表达能力,缓解GAN的问题的同时,大大提高了生成图像的能力。

a12c613a51306c3c586265b126cdac64.png

图二:DCGAN生成器结构图

此外,在研究中也产生了很多GAN的变种,比较突出的有将GAN与Encoder结合起来的BiGAN[10]和ALI[11],与VAE结合起来的VAE-GAN[12],添加额外辅助分类器的ACGAN[13],以及添加监督信息的cGAN[14],引入信息理论的infoGAN[15],和引入能量的概念与方法的EBGAN[16]等。这些变种在不同的目标上增强了GAN模型的拟合能力与鲁棒性,极大地扩展了GAN的应用范围。

GAN-图像生成

根据不同的GAN所拥有的生成器和判别器的数量,可以将GAN图像生成的方法概括为三类:直接方法,迭代方法和分层方法[17]。

98e118e70454146e36dfd440bac62e9e.png

图三:GAN在图像生成中的三类方法

直接法

早期的GANs都遵循在其模型中使用一个生成器和一个判别器的原理,并且生成器和判别器的结构是直接的,没有分支。如GAN [1]、DCGAN [9]、ImprovedGAN [18],InfoGAN [15],f-GAN [19]和GANINT-CLS [20]。这类方法在设计和实现上比较容易,通常也能得到良好的效果。

分层法

分层法的主要思想是将图像分成两部分,如“样式和结构”和“前景和背景”,然后在其模型中使用两个生成器和两个鉴别器,其中不同的生成器生成图像的不同部分,然后再结合起来。两个生成器之间的关系可以是并联的或串联的。

以SS-GAN [21]为例,其使用两个GAN,一个Structure-GAN用于生成表面结构,然后再由Style-GAN补充图片细节,最后生成图片,整体结构如下所示:

27070363715a7a7b7a8531579886c726.png

图四:SS-GAN的分层结构

迭代法

迭代法使用具有相似或甚至相同结构的多个生成器,经过迭代生成从粗到细的图像。

以LAPGAN [22]为例:LAPGAN中的多个生成器执行相同的任务:最低级别的生成器仅将噪声向量作为输入并输出图像,而其他生成器都从前一个生成器获取图像并将噪声矢量作为输入,这些生成器结构的唯一区别在于输入/输出尺寸的大小,每一次迭代后的图像都拥有更多清晰的细节。

6295591a67885518dbf8b161a6c18c5a.png

图五:LAPGAN的迭代结构

GAN-图像转换

图像到图像的转换被定义为将一个场景的可能表示转换成另一个场景的问题,例如图像结构图映射到RGB图像,或者反过来。该问题与风格迁移有关,其采用内容图像和样式图像并输出具有内容图像的内容和样式图像的样式的图像。图像到图像转换可以被视为风格迁移的概括,因为它不仅限于转移图像的风格,还可以操纵对象的属性。

图像到图像的转换可分为有监督和无监督两大类,根据生成结果的多样性又可分为一对一生成和一对多生成两类:

有监督下图像到图像转换

在原始GAN中,因为输出仅依赖于随机噪声,所以无法控制生成的内容。但cGAN[14]的提出使得我们可以将条件输入y添加到随机噪声Z,以便生成的图像由G(z,y)定义。条件y可以是任何信息,如图像标注,对象的属性、文本描述,甚至是图片。

86f7d57fc7ec13a6474c4b12f049a45a.png

图六:CGAN的结构

如果引入图片作为监督信息,cGAN就可以完成一些paired data才能完成的任务,如把轮廓图转化成真实图片,把mask转化成真实图,把黑白图转化成真实图等。其中最具代表性的工作为pix2pix[23]:

f1983e0f556fe61a40175559c7275b7d.png

图七:pix2pix结构图

pix2pix提出将cGAN的损失与L1正则化损失相结合,使得生成器不仅被训练以欺骗判别器而且还生成尽可能接近真实标注的图像,使用L1而不是L2的原因是L1产生较少的模糊图像。其损失函数设计如下:

(1)含有条件信息的GAN损失

9616925d5bd1668bb82eade5d0b0b67b.png

(2)约束自相似性的L1损失

da2b6ef0b739f9950576ca55a00f2e11.png

(3)总的目标函数

589be81e7300d612587c693a13a4dd85.png11efa1972fcb1d16c18cb63d86205f11.png

图八:pix2pix生成效果

无监督的图像到图像转换

虽然有监督下图像转换可以得到很好的效果,但需要的条件信息以及paired image成为其很大的限制。但如果用无监督学习,学习到的网络可能会把相同的输入映射成不同的输出,这就意味着,我们输入任意xi并不能得到想要的输出yi。

CycleGAN [24]、DualGAN [25] 和DiscoGAN [26]突破了这个限制,这几项工作都提出了一致/重构损失(consistent loss),采取了一个直观的思想:即生成的图像再用逆映射生成回去应该与输入的图像尽可能接近。在转换中使用两个生成器和两个判别器,两个生成器和进行相反的转换,试图在转换周期后保留输入图像。

以CycleGAN为例,在CycleGAN中,有两个生成器,Gxy用于将图像从域X传输到Y,Gxy用于执行相反的转换。此外,还有两个判别器Dx和Dy判断图像是否属于该域。

b7a0cf10160c6db1425fffb17a293fd3.png

图九:cycleGAN结构

其Consistent loss由L1进行描述:

d8ff7857eee413ebbc7e7f9b7a8ac145.png

图十:CycleGAN的生成效果

当然,尽管CycleGAN 和DualGAN具有相同的模型结构,但它们对生成器使用不同的实现。CycleGAN使用卷积架构的生成器结构,而DualGAN遵循U-Net结构。在实践中可以根据不同的需求更换生成器和判别器的实现结构。

UNIT[27]在循环一致损失基础上为无监督图像生成增加了新的思路:将VAE与GAN结合起来,假设两个编码器共享相同的隐空间。我们知道,GAN的生成器的输入为一个已知分布 Z 的latent code z. 生成器把这个分布映射成另外一个分布,这个分布中的一个样本点就是G(z). 由于UNIT涉及到的是2个domain之间的关系,即latent code z 既要映射到domainX1它的样本点是G1(z),又要映射到domain X2 ,它的样本点是G2(z)。生成器G把latent code 变成图像,而编码器E把图像还原成latent code. 共享latent code其实就是afbcb7302b4a7d62b40c508451f966da.png。基于共享潜在空间假设,UNIT强制在编码器的最后几层之间以及发生器的前几层之间进行权重共享。

7ceaf818f27dd083c0e7207d05df0497.png

图十一:UNIT的思路和网络结构

如图十一所示,两个domainX1,X2的样本x1,x2 输入两个编码器中,G1(z1)= G1(E1(x1))是还原原图 x1,G1(z2)= G1(E2(x2))是生成有x1风格的图像;G2(z2)= G2(E2(x2))是还原原图x2, G2(z1)= G2(E1(x1))是生成有X2风格的图像。D1,D2分别是domainX1,X2 的判别器。在笔者所做的一些人脸数据集上的实验中,UNIT取得了比CycleGAN系列更好的效果。

从一对一生成到一对多生成(one-to-many translation)

从pix2pix[23]到CycleGAN系列[24][25][26],再到UNIT[27],这些方法实现的image-to-image translation不管是有监督的还是无监督的,都是一对一的,也就是说输入一张图片只能产生一种风格,缺乏多样性。但其实大多数情况下,image translation是多对多的,也就是一张图片对应不同风格的转换图片。比如我们设计衣服时,一张轮廓图其实可以设计成不同风格的衣服。再比如同一个场景,不同的光照条件就是一个模式,不一定只有白天和黑夜,还可能有傍晚,清晨等。

BicycleGAN[28]首先对此进行了尝试,其在模型中添加随机噪声,通过随机采样使噪声得到不同的表达,并在输出与潜在空间上添加双向映射。双向映射指的是:不仅仅可以由潜在编码映射得到输出也可以由输出反过来生成对应的潜在编码,这可以防止两个不同的潜在编码生成同样的输出,避免输出的单一性。

但直接用不同的随机噪声来产生多样化的结果,由于mode collapse的存在,很容易训练失败。MUNIT[29]和DRIT[30]在UNIT的基础上,将latent code进一步细化为内容编码 c 和风格编码 s 。不同domain的图像共享内容编码空间 C 而独享风格编码空间 S ,将内容编码c与不同的风格编码s结合起来就能得到更鲁棒的多样性的结果。

07f3c0980518597ba9bf1e33d2f15c6f.png

图十二:MUNIT将latent code分为内容c和风格c

如下所示,BicycleGAN、MUNIT和DRIT都取得了不错的生成结果:

920d1365f54812e4f882e1a24b7a47ac.png57b58772eebf5bf867b58dbad2c1ce62.png902384e1916d3963a8aa0b7edc0c800f.png

总结

GAN在图像生成和转换中的巨大潜力已经得到研究证明,利用GAN进行图像到图像间的生成和转换最好已经到达几乎无法分辨的地步。除此之外,利用GAN进行指定图像合成,生成高清图像和视频,以及将GAN应用于NLP和其他领域的研究都还受到研究者们的重点关注。GAN图像生成仍然会是一个充满挑战与价值的课题,存在很大的研究空间。

小编相关推荐:

http://www.tensorinfinity.com/paper_14.html(Largescale GANtraining for high fidelity natural image synthesis文章解读)

     生成式对抗网络模型综述

Generative Adversarial Nets 论文解读

参考文献:

[1] Goodfellow, Ian, et al. “Generative adversarial nets.” Advances in neural information processing systems. 2014.https://arxiv.org/abs/1406.2661

[2] Oord A, Kalchbrenner N, Kavukcuoglu K. Pixel recurrent neural networks[J]. arXiv preprint arXiv:1601.06759, 2016.

[3] Van den Oord A, Kalchbrenner N, Espeholt L, et al. Conditional image generation with pixelcnn decoders[C]//Advances in neural information processing systems. 2016: 4790-4798.

[4] Kingma D P, Welling M. Auto-encoding variational bayes[J]. arXiv preprint arXiv:1312.6114, 2013.https://arxiv.org/pdf/1312.6114.pdf

[5] Kingma D P, Dhariwal P. Glow: Generative flow with invertible 1x1 convolutions[C]//Advances in Neural Information Processing Systems. 2018: 10215-10224.

[6] M. Arjovsky, S. Chintala, and L. Bottou, “Wasserstein gan,” arXiv preprint arXiv:1701.07875, 2017.https://arxiv.org/abs/1701.07875

[7] I. Gulrajani, F. Ahmed, M. Arjovsky, V. Dumoulin, and A. Courville, “Improved training of wasserstein gan,” arXiv preprint arXiv:1704.00028, 2017.https://arxiv.org/abs/1704.00028

[8] Mao X, Li Q, Xie H, et al. Least squares generative adversarial networks[C]//Proceedings of the IEEE International Conference on Computer Vision. 2017: 2794-2802.

[9] Radford A, Metz L, Chintala S. Unsupervised representation learning with deep convolutional generative adversarial networks[J]. arXiv preprint arXiv:1511.06434, 2015.

[10] J. Donahue, P. Krähenbühl, and T. Darrell, “Adversarial feature learning,” arXiv preprint arXiv:1605.09782, 2016.https://arxiv.org/abs/1605.09782

[11] V. Dumoulin, I. Belghazi, B. Poole, A. Lamb, M. Arjovsky, O. Mastropietro, and A. Courville, “Adversarially learned inference,”arXiv preprint arXiv:1606.00704, 2016.https://arxiv.org/abs/1606.00704

[12] A. B. L. Larsen, S. K. Sønderby, H. Larochelle, and O. Winther,“Autoencoding beyond pixels using a learned similarity metric,”arXiv preprint arXiv:1512.09300, 2015.https://arxiv.org/abs/1512.09300

[13] Odena A, Olah C, Shlens J. Conditional image synthesis with auxiliary classifier gans[C]//Proceedings of the 34th International Conference on Machine Learning-Volume 70. JMLR. org, 2017: 2642-2651.

[14] M. Mirza and S. Osindero, “Conditional generative adversarial nets,”arXiv preprint arXiv:1411.1784, 2014.https://arxiv.org/abs/1411.1784

[15] Chen X, Duan Y, Houthooft R, et al. Infogan: Interpretable representation learning by information maximizing generative adversarial nets[C]//Advances in neural information processing systems. 2016: 2172-2180.

[16] Zhao J, Mathieu M, LeCun Y. Energy-based generative adversarial network[J]. arXiv preprint arXiv:1609.03126, 2016.

[17] Huang H, Yu P S, Wang C. An introduction to image synthesis with generative adversarial nets[J]. arXiv preprint arXiv:1803.04469, 2018.

[18] T. Salimans, I. Goodfellow, W. Zaremba, V. Cheung, A. Radford,and X. Chen, “Improved techniques for training gans,” in Advances in Neural Information Processing Systems, 2016, pp. 2226–2234.https://arxiv.org/abs/1606.03498

[19] S. Nowozin, B. Cseke, and R. Tomioka, “f-gan: Training generative neural samplers using variational divergence minimization,”arXiv preprint arXiv:1606.00709, 2016.https://arxiv.org/abs/1606.00709

[20] S. Reed, Z. Akata, X. Yan, L. Logeswaran, B. Schiele, and H. Lee,“Generative adversarial text to image synthesis,” arXiv preprint arXiv:1605.05396, 2016.https://arxiv.org/abs/1605.05396

[21] X. Wang and A. Gupta, “Generative image modeling using style and structure adversarial networks,” arXiv preprint arXiv:1603.05631, 2016.https://arxiv.org/abs/1603.05631

[22] E. L. Denton, S. Chintala, a. szlam, and R. Fergus, “Deep generative image models using a laplacian pyramid of adversarial networks,” in Advances in Neural Information Processing Systems Curran Associates, Inc., 2015, pp. 1486–1494.https://arxiv.org/abs/1506.05751

[23] P. Isola, J.-Y. Zhu, T. Zhou, and A. A. Efros, “Image-to-image translation with conditional adversarial networks,” arXiv preprint arXiv:1611.07004, 2016.https://arxiv.org/abs/1611.07004

[24] J.-Y. Zhu, T. Park, P. Isola, and A. A. Efros, “Unpaired image-to-image translation using cycle-consistent adversarial networks,”arXiv preprint arXiv:1703.10593, 2017.https://arxiv.org/abs/1703.10593

[25] Z. Yi, H. Zhang, P. T. Gong et al., “Dualgan: Unsupervised dual learning for image-to-image translation,” arXiv preprint arXiv:1704.02510, 2017.https://arxiv.org/abs/1704.02510

[26] T. Kim, M. Cha, H. Kim, J. Lee, and J. Kim, “Learning to discover crossdomain relations with generative adversarial networks,”arXiv preprint arXiv:1703.05192, 2017.https://arxiv.org/abs/1703.05192

[27] Liu M Y, Breuel T, Kautz J. Unsupervised image-to-image translation networks[C]//Advances in Neural Information Processing Systems. 2017: 700-708.

[28] Zhu J Y, Zhang R, Pathak D, et al. Toward multimodal image-to-image translation[C]//Advances in Neural Information Processing Systems. 2017: 465-476.

[29] Huang X, Liu M Y, Belongie S, et al. Multimodal unsupervised image-to-image translation[C]//Proceedings of the European Conference on Computer Vision (ECCV). 2018: 172-189.

[30] Lee H Y, Tseng H Y, Huang J B, et al. Diverse image-to-image translation via disentangled representations[C]//Proceedings of the European Conference on Computer Vision (ECCV). 2018: 35-51.

CVer-GAN交流群

扫码添加CVer助手,可申请加入CVer-GAN交流群。一定要备注:研究方向+地点+学校/公司+昵称(如GAN+上海+上交+卡卡),不根据格式申请,一律不通过。

a54c05e50ef98f03c5bcba2b59060cd8.png

▲长按加群

这么硬的综述分享,麻烦给我一个在在看

7393e5cc7ce9fb3d95c05b82b5a93436.png

▲长按关注我们

麻烦给我一个在看

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sublime写网页代码,里面的中文字符会出现乱码

经过百度后解决了这个问题: <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>Document</title></head><body>你设置编码了吗&#xff1f;</body></html>追问&#xff1a;没…

mysql 5.5.修改库名_安全快速修改Mysql数据库名的5种方法

1. RENAME DATABASE db_name TO new_db_name这个。。这个语法在mysql 5.1.7中被添加进来&#xff0c;到了5.1.23又去掉了。据说有可能丢失数据。还是不要用的好。详见&#xff1a; http://dev.mysql.com/doc/refman/5.1/en/rename-database.html2.如果所有表都是MyISAM类型的话…

设计模式之禅读书笔记

》设计原则《 》Single Responsibility Principle&#xff08;单一职责原则&#xff09;类只有一个修改的原因。 ●类的复杂性降低&#xff0c;实现什么职责都有明确的定义。 ●可读性高 ●可维护性高 ●变更引起的风险降低。 PS&#xff1a;基本不可能实现 》里氏替换原则&…

mysql mysql_set_charset_SQL注入攻击之 mysql_set_charset [转]

本文转载地址&#xff1a;http://hi.baidu.com/cuttinger/blog/item/e9a93901934755147bec2cb0.html1。老话题&#xff0c;mysql_real_escape_string单引号&#xff0c;大多数情况下&#xff0c;防止sql注入攻击足够了。$mysql mysql_connect("host","user&quo…

idea导入maven项目依赖报错_解决Maven依赖冲突的好帮手,这款IDEA插件了解一下?

1、何为依赖冲突Maven是个很好用的依赖管理工具&#xff0c;但是再好的东西也不是完美的。Maven的依赖机制会导致Jar包的冲突。举个例子&#xff0c;现在你的项目中&#xff0c;使用了两个Jar包&#xff0c;分别是A和B。现在A需要依赖另一个Jar包C&#xff0c;B也需要依赖C。但…

Xilinx实习一年总结

从去年7月4号来到上海xilinx。转眼间已经一年。这一年学了非常多知识&#xff0c;也长了非常多见识。 去年七月一到公司&#xff0c;马上投入到摄像头-DDR-HDMI图像通路的研发中。就是在ZEDboard板卡上。通过外置摄像头採集图像&#xff0c;在PL部分将採集的像素数据进行拼接&a…

java线程创建方式_Java创建线程安全的方法

原文链接 译者&#xff1a;秦建平 校对&#xff1a;方腾飞首先来看一个问题&#xff1a;下面这个方法是线程安全的吗&#xff1f;如何才能让这个方法变成线程安全的&#xff1f;public class MyCount {private static int counter 0;public static int getCount(){return coun…

win7 能下node什么版本_微软从未公开的win10版本,3GB+极度精简,老爷机有救了

在windows家族中&#xff0c;最好用的就是win7和XP系统。堪称经典&#xff0c;而且还是发展最成功的系统版本。前几天韩博士也发布一篇关于XP系统的文章&#xff0c;评论区引发极大争论。大家众说纷纭&#xff0c;觉得XP系统是顺畅&#xff0c;但是很多软件硬件都不支持&#x…

【Swift学习】Swift编程之旅(一)

学习一门新语言最经典的例子就是输出“Hello World&#xff01;” print("Hello World!")  swift就是这样来输出的。 如果你使用过其他语言&#xff0c;那么看上去是非常的熟悉吧。但比一些c要简单的多吧 1、不需要导入一些单独的库&#xff0c;比如输入/输出或字符…

孔夫子二手书采集

文章目录 项目演示软件采集单本数据网页搜索数据对比 使用场景概述部分核心逻辑Vb工程图数据导入与读取下拉框选择参数设置线程 使用方法下载软件授权导入文件预览处理后的数据 项目结构附件说明 项目演示 操作视频详见演示视频&#xff0c;以下为图文演示 软件采集单本数据 …

java总结体会_Java课程总结心得体会

不知不觉中以学习Java将近4个月了&#xff0c;在这几个月的学习中我从一开始的迷茫懵逼&#xff0c;到现在的懵逼迷茫中&#xff0c;写下了这篇这个学期课程的Java学习心得体会。首先&#xff0c;我认为作为一个该开始学习Java的小白&#xff0c;在开始学习之前无论你有多大的热…

为什么用redis做缓存而不是mybatis自带的缓存_如何用Java设计一个本地缓存,涨姿势了...

最近在看Mybatis的源码&#xff0c;刚好看到缓存这一块&#xff0c;Mybatis提供了一级缓存和二级缓存&#xff1b;一级缓存相对来说比较简单&#xff0c;功能比较齐全的是二级缓存&#xff0c;基本上满足了一个缓存该有的功能。当然如果拿来和专门的缓存框架如ehcache来对比可能…

process 类 java_编写可执行jar——java的Process类的使用(二)

你知道怎么在控制台使用ping吗&#xff1f;那你知道怎么在java中使用ping吗&#xff1f;1.批处理文件批处理文件大家一定不陌生。接触最多的应该就是tomcat中的start.bat或者start.sh了。bat是在windows环境下运行的批处理文件&#xff0c;sh则是linux的shell脚本。2.adb指令安…

python从爬虫到数据分析项目_零基础学习Python web开发、Python爬虫、Python数据分析,从基础到项目实战!...

随着大数据和人工智能的发展&#xff0c;目前Python语言的上升趋势比较明显&#xff0c;而且由于Python语言简单易学&#xff0c;所以不少初学者往往也会选择Python作为入门语言。Python语言目前是IT行业内应用最为广泛的编程语言之一&#xff0c;尤其是近几年来随着大数据和人…

java filedialog 打开文件_java 用文件对话框打开文件

//文件的打开import java.awt.FileDialog;import java.awt.event.*;import java.io.*;import java.io.File;import java.io.FileReader;public class FileOpen {private FileDialog filedialog_open;private String fileopen null, filename null;// 用于存放打开文件地址 和…

2782: [HNOI2006]最短母串

2782: [HNOI2006]最短母串 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 3 Solved: 2[Submit][Status][Web Board]Description 给定n个字符串&#xff08;S1,S2,„,Sn&#xff09;&#xff0c;要求找到一个最短的字符串T&#xff0c;使得这n个字符串&#xff08;S1,S2,„,…

c java 内部类_java程序中能否在内部类当中再定义一个内部类?

展开全部我被你的想62616964757a686964616fe78988e69d8331333363386664法震撼了,哈哈.亏你想的出来...这么弄代码不好理解,Java看起来醒目,也是Java中的一个规范!可以吗?必须可以..看代码演示...声明下,我也第一次,多次嵌套,看你想法后去试验下是可行的我用的两种办法!不多说看…

pythongui做计算器_python 实现简单的计算器(gui界面)

运行效果&#xff1a;完整代码from tkinter import *def click(num):global opopopstr(num)iptext.set(op)def evaluate():global opoutputstr(eval(op))iptext.set(output)def clearDisplay():global opop""iptext.set(op)calcTk()calc.title("TechVidvan Calc…

ios学习笔记——RunTime

Objective—C是面向运行时的语言&#xff0c;就是说它会尽可能的把编译和链接时要执行的逻辑延迟到运行时。这就给你很大的灵活性&#xff0c;你可以按需要把消息重定向给合适的对象&#xff0c;你甚至可以交换方法的实现。最重要的还是消息机制。 C语言使用“静态绑定”&#…

exhaustion java_Java Player.setExhaustion方法代碼示例

import org.bukkit.entity.Player; //導入方法依賴的package包/類/*** Set SamaGamesAPI*/Overridepublic void startGame(){this.getInGamePlayers().forEach(((uuid1, survivalPlayer) -> survivalPlayer.getPlayerIfOnline().closeInventory()));super.startGame();Objec…