博舍

从文本生成图像(Text2Image,以GAN为主) 文本生成图片原理

从文本生成图像(Text2Image,以GAN为主)

目录概述背景目地分类发展(1)Generatingimagesfromcaptionswithattention(使用注意力机制的从文本生成图像)(2)GenerativeAdversarialTexttoImageSynthesis(生成对抗式从文本生成图像)(3)Learningwhatandwheretodraw(学习画什么和画在哪)(3)Learningwhatandwheretodraw(学习画什么和画在哪)(4)Plug&playgenerativenetworks:Conditionaliterativegenerationofimagesinlatentspace(即插即用的生成网络:潜在空间中图像的条件迭代生成)(5)StackGAN:TexttoPhoto-realisticImageSynthesiswithStackedGenerativeAdversarialNetworks(StackGAN:使用堆叠的生成对抗式网络从文本生成照片般类似的图像)(6)StackGAN++:RealisticImageSynthesiswithStackedGenerativeAdversarialNetworks(StackGAN++:具有堆叠式生成对抗网络的逼真的图像合成)(7)AttnGAN:Fine-GrainedTexttoImageGenerationwithAttentionalGenerativeAdversarialNetworks(AttnGAN:带有注意的生成对抗网络细化文本到图像生成)(8)MirrorGAN:LearningText-to-imageGenerationbyRedescription(MirrorGAN:通过重新定义学习文本到图像的生成)(9)DM-GAN:DynamicMemoryGenerativeAdversarialNetworksforText-to-ImageSynthesis(DM-GAN:用于文本到图像合成的动态记忆生成对抗网络)参考

概述

背景

图像生成是人工智能中一个重要的研究领域,现在的图像生成效果已经能够达到以假乱真的地步,但是不能按照要求正确的生成图像。所以研究者们将目光转向了从文本生成图像(Text2Image),它可以从描述图像的文本中生成目标图像。

目地

定义:根据给定的文本条件(Text)准确的生成一张精度足够高的图像(Image)。

因为传统的图像生成只是简单的通过学习模拟真实图像的分布,再经过优化处理从而生成和真实图像相似的图像,相当于一个判别任务(生成图像能够和真实图像分到一类中即可),而基于描述生成逼真图像却要困难得多,需要更多的训练。在机器学习中,这是一项生成任务,比判别任务难多了,因为生成模型必须基于更小的种子输入产出更丰富的信息(如具有某些细节和变化的完整图像)。

分类

近年来图像生成邻域不断发展,出现了许多优秀的模型和方法,目前来说,使用最多的模型应当是GAN。它的效果也是最好的,从方法的层面上来分,可以分为以下两类:Single-stage:学习自然语言和真实图像的关系,并且训练之后能够生成一张类似真实图像的高质量图像,一次生成图像即完成任务,这样的话速度较快,网络结构相对简单一些。Multi-stage:最初是StackGAN和StackGAN++,通过首先生成低质量的初始图像,再结合注意力机制,多次精炼生成图像,达到将其细化为高分辨率图像的目的。这样的话网络的结构可能比较庞大,需要的计算力较高,训练速度较慢,但是效果较好。

发展

在图像生成的发展过程中,涌现过许许多多的新奇思路和精妙构想,在此主要以GAN模型为例,列举一些经典的论文进行分析。

(1)Generatingimagesfromcaptionswithattention(使用注意力机制的从文本生成图像)

论文作者:ElmanMansimov,EmilioParisotto,JimmyLeiBa&RuslanSalakhutdinov会议:ICLR.2016.论文地址:https://arxiv.org/pdf/1511.02793.pdf代码地址:https://github.com/mansimov/text2image论文简介:文章的核心在于提出了一个align-DRAW,引入了一个深度重复注意力写入模块来扩展VAE。利用GAN在最后一步来优化图片。总的来说该模型生成的图像不够真实,物体比较模糊,生成的图像是低分辨率36x36的,因为VAE是直接计算生成图片和原始图片的均方误差,而不是像GAN那样对抗学习。

(2)GenerativeAdversarialTexttoImageSynthesis(生成对抗式从文本生成图像)

论文作者:Reed,Scott,Akata,Zeynep,Yan,Xinchen,Logeswaran,Lajanugen,Schiele,Bernt,andLee,Honglak.会议:ICML2016论文地址:https://arxiv.org/pdf/1605.05396.pdf代码地址:https://github.com/zsdonghao/text-to-image论文简介:文章文本根据DC-GAN模型,提出改进两点改进,GAN-CLS和GAN-INT,增强判别器学习文本内容和图像内容对应关系的能力并弥补了文本描述较少的缺点,生成了肉眼可以接受的64x64分辨率的图像,但是细节部分还是不够完善而且模型上只有简单的一个GAN结构,如果盲目的上采样增加分辨率,会导致GAN训练不稳定,并且产生无意义的输出,也就是模型限制了分辨率的大小。

(3)Learningwhatandwheretodraw(学习画什么和画在哪)

论文作者:Reed,ScottE,Akata,Zeynep,Mohan,Santosh,Tenka,Samuel,Schiele,Bernt,andLee,Honglak.会议:NIPS2016论文地址:https://arxiv.org/pdf/1610.02454.pdf代码地址:https://github.com/reedscot/nips2016论文简介:文章主要分为两个部分:1.where:采用基于边界框的文本到图片的生成模型(Bounding-box-conditionaltext-to-imagemodel)2.what:采用基于关键点的文本到图片的生成模型(Keypoint-conditionaltext-to-imagemodel)文章证明了图片中目标对象的(额外信息)位置和尺寸可以帮助提升生成图像的质量和对文本的解释质量,生成了128x128的高分辨率图像。

(3)Learningwhatandwheretodraw(学习画什么和画在哪)

论文作者:Reed,ScottE,Akata,Zeynep,Mohan,Santosh,Tenka,Samuel,Schiele,Bernt,andLee,Honglak.会议:NIPS2016论文地址:https://arxiv.org/pdf/1610.02454.pdf代码地址:https://github.com/reedscot/nips2016论文简介:文章主要分为两个部分:1.where:采用基于边界框的文本到图片的生成模型(Bounding-box-conditionaltext-to-imagemodel)2.what:采用基于关键点的文本到图片的生成模型(Keypoint-conditionaltext-to-imagemodel)文章证明了图片中目标对象的(额外信息)位置和尺寸可以帮助提升生成图像的质量和对文本的解释质量,生成了128x128的高分辨率图像。

(4)Plug&playgenerativenetworks:Conditionaliterativegenerationofimagesinlatentspace(即插即用的生成网络:潜在空间中图像的条件迭代生成)

论文作者:Nguyen,Anh,Clune,Jeff,Bengio,Yoshua,Dosovitskiy,Alexey,andYosinski,Jason.会议:CVPR2017论文地址:https://arxiv.org/pdf/1612.00005.pdf代码地址:https://github.com/Evolving-AI-Lab/ppgn论文简介:文章主用预训练的分类器当作编码器对图片x提取特征h,这个h当作初始输入,然后通过不断迭代去修改h的值,去获得效果更好的图片需要多次低效的迭代来优化,最终生成了227x227的高分辨率图像

(5)StackGAN:TexttoPhoto-realisticImageSynthesiswithStackedGenerativeAdversarialNetworks(StackGAN:使用堆叠的生成对抗式网络从文本生成照片般类似的图像)

论文作者:Zhang,Han,Xu,Tao,Li,Hongsheng,Zhang,Shaoting,Wang,Xiaogang,Huang,Xiaolei,andMetaxas,Dim-itrisN.会议:ICCV2017论文地址:https://arxiv.org/pdf/1612.03242.pdf代码地址:https://github.com/hanzhanggit/StackGAN论文简介:文章提出了StackGAN,实现了根据描述性文本生成高分辨率图像,提出了一种新的条件增强技术,增强训练过程的稳定性、增加生成图像的多样性,通过多个实验证明了整体模型以及部分构件的有效性,为后面的模型构建提供了有益信息。主要包括两个阶段:Stage-IGAN:根据给定的文本描绘出主要的形状和基本颜色组合;并从随机噪声向量中绘制背景布局,生成低分辨率图像Stage-IIGAN:修正第一阶段生成的低分辨率图像中的不足之处,再添加一些细节部分,生成高分辨率图像

(6)StackGAN++:RealisticImageSynthesiswithStackedGenerativeAdversarialNetworks(StackGAN++:具有堆叠式生成对抗网络的逼真的图像合成)

论文作者:Zhang,Han,Xu,Tao,Li,Hongsheng,Zhang,Shaoting,Wang,Xiaogang,Huang,Xiaolei,andMetaxas,Dim-itrisN.会议:ICCV2017论文地址:https://arxiv.org/pdf/1710.10916v3.pdf代码地址:https://github.com/hanzhanggit/StackGAN-v2论文简介:文章是之前的Stack-GAN的改进版本,虽然仍然是采用多阶段逐级提高生成图像的分辨率的方式,但是不同于之前的两阶段分开训练,StackGAN++可以采用end-to-end的方式进行训练,提出了一种新的正则化方式color-consistencyregularization来帮助在不同的分辨率下生成更一致的图像;既可以用于text-to-image这样的条件图像生成任务,也可以用于更一般的无条件图像生成任务,均可以取得比其他模型更优异的结果

(7)AttnGAN:Fine-GrainedTexttoImageGenerationwithAttentionalGenerativeAdversarialNetworks(AttnGAN:带有注意的生成对抗网络细化文本到图像生成)

论文作者:Xu,Tao,Zhang,Pengchuan,Huang,Qiuyuan,Zhang,Han,Gan,Zhe,Huang,Xiaolei,andHe,Xiaodong.会议:CVPR,2018.论文地址:https://arxiv.org/pdf/1711.10485.pdf代码地址:https://github.com/taoxugit/AttnGAN论文简介:文章主AttnGAN是端到端的、注意力驱动的、多阶段精细化的、用于细粒度文字到图像生成的架构,相比stackGAN,它提供了端到端的训练、并且注意到了句子级别的细粒度的信息,在生成网络中引入了注意力机制在绘制图像的不同区域时,会关注到和该子区域最相关的文本区域使用了DAMSM,其功能是计算生成的图像和句子之间的相似度,可以作为loss直接训练,让GAN可以从图像和文本匹配的角度和生成的图片是否真实的角度来训练生成器和判别器

(8)MirrorGAN:LearningText-to-imageGenerationbyRedescription(MirrorGAN:通过重新定义学习文本到图像的生成)

withStackedGenerativeAdversarialNetworks(学习画什么和画在哪)论文作者:TingtingQiao,JingZhang,DuanqingXu,andDachengTao会议:CVPR2019论文地址:http://openaccess.thecvf.com/content_CVPR_2019/papers/Qiao_MirrorGAN_Learning_Text-To-Image_Generation_by_Redescription_CVPR_2019_paper.pdf代码地址:暂无论文简介:文章该模型结合了“全局到局部”的注意力机制和保留语义的text-to-image-to-text框架。该模型由三个模块构成:STEM(语义文本嵌入模块,该模块产生文本或句子层次的嵌入),GLAM(全局到局部的注意力模块,该模块从粗到细生成目标图像,平衡局部文字注意力和全局句子注意力以增强生成图像的多样性和语义连续性),STREAM(语义文本再生和对齐模块,该模块对生成的图像再次描述)。

(9)DM-GAN:DynamicMemoryGenerativeAdversarialNetworksforText-to-ImageSynthesis(DM-GAN:用于文本到图像合成的动态记忆生成对抗网络)

论文作者:MinfengZhu,PingboPan,WeiChenYiYang,StateKeyLabofCAD&CG,ZhejiangUniversityBaiduResearchCentreforArtificialIntelligence,UniversityofTechnologySydney会议:CVPR2019论文地址:https://arxiv.org/abs/1904.01310?context=cs代码地址:https://github.com/MinfengZhu/DM-GAN论文简介:文章主要创新点是提出一个动态记忆模型(adynamicmemorymodule)去提炼图像,这个模型主要包括以下几个模块:1.MemoryWritingGate:计算上一层的featuremap与单词嵌入向量之间的attention2.Key-ValueMemories:通过Key来检索最相关的Value,并以权重总和的形式输出3.ResponeseGate:将权重和与featuremap融合输出一个新的imagefeature

参考

https://zhuanlan.zhihu.com/p/52272086https://blog.csdn.net/weixin_43551972/article/details/102983978https://blog.csdn.net/Forlogen/article/details/91473574https://blog.csdn.net/sean2100/article/details/84032930

未完待续…

java后台生成图片

目标功能

Java后台生成图片:

自定义图片内文字和图片位置。可背景透明。字体尺寸、颜色、间距等基本设置和透明度设置。文本换行与居中。加载外部字体。原理

使用java图形化工具绘制图片。

代码实现创建所需参数的实体类importlombok.Data;importjava.awt.*;importjava.awt.image.BufferedImage;/***生成图片参数控制**@authorh*@dateCreatedin2020/5/3017:25*/@DatapublicclassImageCreateEntity{/***宽度*/privateIntegerwidth=100;/***高度*/privateIntegerheight=100;/*==============图片内容==============*//***图片内容*/privateBufferedImageimgContent;/***图片宽度*/privateintimgWidth=100;/***图片宽度*/privateintimgHeight=100;/***图片渲染X起点*/privateintimgX;/***图片渲染Y轴起点*/privateintimgY;/*=====================文本内容===================*//***文本内容*/privateStringtextContent;/***字体名称*/privateStringfontName="";/***字体文件路径*/privateStringfontFilePath="";/***字体尺寸*/privatefloatfontSize=20f;/***字体风格*/privateintfontStyle=Font.PLAIN;/***字体颜色*/privateColorfontColor=Color.BLACK;/***字体间距,默认值为零,与当前字体尺寸相关*/privateIntegerfontSpace=0;/***行距*/privateIntegerlinePadding=10;/***文本透明度:值从0-1.0,依次变得不透明*/privatefloattextTransparency=1.0f;/***文本渲染X起点*/privateIntegertextX=0;/***文本渲染Y轴起点*/privateIntegertextY=0;/***左边距*/privateIntegertextLeftPadding=0;/***右边距*/privateIntegertextRightPadding=0;/***每行居中*/privatebooleanisCenterLine;/*=================背景==============*//***背景颜色*/privateColorbackgroundColor=Color.WHITE;/***背景是否透明*/privatebooleanisTransparentBackground=false;/***背景图片*/privateBufferedImagebackgroundImg;}复制代码生成图片基本方法

创建一个BufferedImage,再通过Graphics2D进行绘制,就可以得到一个简单的图片缓存。

Graphics2DclassextendstheGraphicsclasstoprovidemoresophisticatedcontrolovergeometry,coordinatetransformations,colormanagement,andtextlayout.Thisisthefundamentalclassforrendering2-dimensionalshapes,textandimagesontheJava(tm)platform.

Graphics2D类扩展了Graphics类,以提供对几何图形,坐标转换,颜色管理和文本布局的更复杂的控制。这是在Java(tm)平台上渲染二维形状,文本和图像的基本类。

BufferedImagebufferedImage=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);Graphics2Dg2d=bf.createGraphics();//设置图片背景颜色g2d.setBackground(Color.WHITE);g2d.clearRect(0,0,width,height);//绘制图片内容//中间内容框画到背景图上BufferedImageimgContent=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);//绘制图片g2d.drawImage(imgContent.getScaledInstance(imgWidth,imgHeight,Image.SCALE_DEFAULT),imgX,imgY,null);//绘制文本g2d.drawString(str,x,y);g2d.dispose();复制代码背景透明设置

使用Graphics2D创建一个新的支持透明度的BufferedImage即可,新创建的图片默认即是透明的。

bufferedImage=g2d.getDeviceConfiguration().createCompatibleImage(width,height,Transparency.TRANSLUCENT);g2d.dispose();Graphics2Dg2d=bf.createGraphics();//后续操作复制代码字体尺寸、间距等基本设置

通过tracking属性设置字体间距。

Thetrackingvalueismultipliedbythefontpointsizeandpassedthroughthefonttransformtodetermineanadditionalamounttoaddtotheadvanceofeachglyphcluster.Positivetrackingvalueswillinhibitformationofoptionalligatures.Trackingvaluesaretypicallybetween-0.1and0.3;valuesoutsidethisrangearegenerallynotdesireable.

跟踪值乘以字体点大小,然后通过字体变换来确定要添加到每个字形簇前移的附加量。正跟踪值将抑制可选连字的形成。跟踪值通常在-0.1和0.3之间;通常不希望超出此范围的值。

//设置字体透明度,字体透明度只在背景不透明时才生效g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,0.5f));//字体基本设置Fontfont=newFont(fontName,fontStyle,(int)fontSize);//字体间距设置Mapattributes=newHashMap();attributes.put(TextAttribute.TRACKING,imageCreateEntity.getFontSpace());font=font.deriveFont(attributes);g2d.setFont(font);g2d.setColor(Color.BLACK);复制代码文本换行与居中

实现思路:

先计算每一行可以容纳的字符个数然后将字符串按个数拆分成多个子字符串,作为每一行的文本计算每一行文本绘制的起始坐标注意:中文字符宽度一般来说,是因为英文或数字的两倍拆分行数/***获取字体分行后list**@paramtextContent文本内容*@paramcontentWith文本宽度*@paramfontSpace字体间距*@paramfontSize字体尺寸*@paramisChinese是否生成汉字*@returnjava.util.List*/privatestaticListgetLines(StringtextContent,IntegercontentWith,IntegerfontSpace,floatfontSize,booleanisChinese){//每一行的字体个数,intlineCont=(int)(contentWith/((1+fontSpace)*fontSize));if(isChinese){//英文和汉字的宽度不一样,一般为1:2,//计算个数为英文字体的个数,所以需要乘以2//如果传入的是英文字体,不需要生成汉字,这里就不需要乘以2lineCont=lineCont*2;}char[]chars=textContent.toCharArray();Listlines=newArrayList();char[]charArrayTemp=newchar[lineCont];intcount=0;intindexChar=0;for(charc:chars){if(count==lineCont){//一行数据已满,开始新的一行lines.add(newString(charArrayTemp));count=0;indexChar=0;charArrayTemp=newchar[lineCont];}charArrayTemp[indexChar]=c;//汉字的宽度一般是英文数字的2倍,if(checkCharCN(c)){count+=2;}else{count++;}indexChar++;}//最后一行if(ArrayUtil.isNotEmpty(charArrayTemp)){lines.add(newString(charArrayTemp));}returnlines;}复制代码每行居中//逐行渲染booleancenterLine=imageCreateEntity.isCenterLine();floattextX=imageCreateEntity.getTextX();IntegertextY=imageCreateEntity.getTextY();floatlineWidth;floatpaddingAdd=0;if(CollectionUtil.isNotEmpty(lines)){StringcontentLine;booleanb;intlineLength=0;for(inti=0;i

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇

下一篇