java web怎么用emma进行代码覆盖率测试

java web怎么用emma进行代码覆盖率测试,第1张

使用 emma 2.1 (emma-stable-2.1.5320-lib) 1. 新建 /home/q/java/emmalib 目录, 将emma.jar 与 emma_ant.jar 放入 2. 复制 /server/bin/mobileserver/runServer.sh 到 runServer_emma.sh 修改启动语句。

使用 emma 2.1 (emma-stable-2.1.5320-lib)

1. 新建 /home/q/java/emmalib 目录, 将emma.jar 与 emma_ant.jar 放入

2. 复制 /server/bin/mobileserver/runServer.sh 到 runServer_emma.sh

修改启动语句

nohup java -Xmx1800M -Xms800m -Xbootclasspath/p:/home/q/java/emmalib/emma.jar -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider -XX:+AggressiveOpts -XX:+UseParallelGC -server -classpath "$jarFile" com.qunar.common.mobileArc.MobileServer conf/TaLog.property conf/TripServer.property >>$LOG_HOME/error.log 2>&1 &

复制 /server/bin/mobileserver/stopServer.sh 到 stopServer_emma.sh

   添加覆盖率导出命令

   插入 emma 统计代码

   使用root账号

   1. 备份mobileserver.jar

   cp /server/TripAssistant/mobile-server.jar $MOB_JAR_BAK/mobile-server.jar.{$timestamp}

   2. 执行插入命令

java -cp /home/q/java/emmalib/emma.jar emma instr -m overwrite -cp mobile-server.jar -out coverage.em

输出如下:

EMMA: processing instrumentation path ...

   EMMA: instrumentation path processed in 3117 ms

   EMMA: [1000 class(es) instrumented, 126 resource(s) copied]

   EMMA: metadata merged into [/server/TripAssistant/coverage.em]

3. 运行mobileserver runServer_emma.sh

   sudo sh /server/bin/mobileserver/stopServer.sh &&sudo sh /server/bin/mobileserver/runServer_emma.sh

   在 /server/mobileserverlog/error.log中可见:

   EMMA: collecting runtime coverage data ...

   EMMA: runtime controller started on port [47653]

   emma control 进程已启动

[root@l-wap4.beta.cn1.qunar.com /server/mobileserverlog]# netstat -na | grep 47653

tcp 0 0 0.0.0.0:47653 0.0.0.0:* LISTEN 20926/java

4. 执行 覆盖率文件导出命令

java -cp /home/q/java/emmalib/emma.jar emma ctl -connect localhost:47653 -command coverage.get,coverage.ec

   可见输出:

   EMMA: processing control command sequence ...

   EMMA: executing [coverage.get (coverage.ec,true,true)] ...

   EMMA: coverage.get: local copy of coverage data merged into [/server/TripAssistant/coverage.ec]

   EMMA: coverage.get: command completed in 79 ms

   EMMA: control command sequence complete

   并且当前目录生成文件 coverage.ec

5. 生成报告

java -cp /home/q/java/emmalib/emma.jar emma report -r html -in coverage.em,coverage.ec

指定源代码生产覆盖率报告(需先上传源码)

   java -cp /home/q/java/emmalib/emma.jar emma report -r html -in /server/TripAssistant/coverage.em,/server/TripAssistant/coverage.ec -Dreport.html.out.file=mycoverage/coverage.html -sp /home/liang.zhou/mob_code_dir/mobs_trunk/src/main/java

emma 方式启动 mobserver

   ==================================

   1. 判断mobserver.jar size, 大于5M 为已插入过, 小于5M为未插入(需要执行插入)

   2. 执行插入

   3. 启动

4. 检查启动状态

47653 端口打开

   mobileserver 进程打开

emma 方式停止 mobserver

==================================

   1. 检查47653端口打开状态, 检查coverage.em是否存在

2. 导出覆盖率文件 coverage.ec, 备份coverage.em (加上时间戳)

   3. 导出覆盖率HTML report (加上对应时间戳)

   4. kill mobserver 进程

   ls -lt mobile-server.jar

   判断 $? == 0

判断mobile-server.jar size是否大于 5M

#!/bin/bash

   function stop_mob_server(){

   #!/bin/bash

   function stop_mob_server(){

   pid=`ps aux | grep MobileServer | grep -v grep | awk '

   Unknown macro: {print $2}

'`

   ` kill -9 $

   Unknown macro: {pid}

   `

   sleep 1

   echo "Stop mobileserver success."

   }

   #判断 emma ctl 是否启动

   port_check_result=`netstat -na | grep 47653 | awk '

   Unknown macro: {print $1}

   '`

   if [ -z $

   Unknown macro: {port_check_result}

   ]then

echo "Emma ctl port 47653 is not LISTEN. Coverage.ec export operation aborted."

   else

   #emma ctl 为启动状态,导出 coverage.ec, 并备份至 /home/q/mobsrv_cov

   if []

   fi

安装的时候,把“Contact all update sites during install to find required software”这个勾去掉。

开发过程中的常用Eclipse插件,按字母排序:

(1)    AmaterasUML

介绍:Eclipse的UML插件,支持UML活动图,class图,sequence图,usecase图等;支持与Java class/interface之间的相互导入导出。

官方网站:http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=AmaterasUML

插件下载URL:http://sourceforge.jp/projects/amateras/downloads/56447/AmaterasUML_1.3.4.zip/  (目前最新版本)

注:安装时需要GEF插件的支持。

(2)    Bravo JSP

介绍:Bravo JSP编辑器是一款WYSIWYG(所见即所得的)JSP/html页面编辑器。Code Editor(代码编辑器)与Eclipse Web Tools的JSP编辑器相同,所以支持代码建议,代码模板和其它相同的功能。可视化部分:支持CSS样式、图片、JSP表达式/标签库/标签文件、外部included的文件。改变HTML/CSS/JSP代码可以立即看到效果。提供DOM查找/替换对话框。JSTL的变量查看功能。

官方网站:http://bravo.comxa.com/index.php

Eclipse在线安装URL:http://bravo.comxa.com/update

(3)   Checkstyle

介绍:CheckStyle是Source.orge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具。它能够自动化代码规范检查过程,从而使得开发人员从这项重要,但是枯燥的任务中解脱出来。CheckStyle检验的主要内容有:Javadoc注释、命名约定、标题、import语句、体积大小、空白、修饰符、块、代码问题、类设计以及混合检查(包括一些有用的比如非必须的System.out和printstackTrace)等。

官方网站:http://checkstyle.sourceforge.net/

Eclipse在线安装URL:http://eclipse-cs.sourceforge.net/update/

(4)    Easy Explorer

介绍:如果你经常需要在Eclipse里打开相关资源文件所在的文件夹,比较麻烦,要右键,属性,在Location一栏中把所在的文件夹拷贝一下,然后再去资源管理器里输入这个路径,回车,然后打开它,比较麻烦。Easy Explorer是一个Eclipse的小插件,它能直接打开选中文件所在的目录,很方便好用.

官方网站:http://sourceforge.net/projects/easystruts/

(5)    EasySQL

介绍:EasySQL:Eclipse SQL插件。包含SQL编辑器和执行器,表格编辑器,数据导出工具。EasySQL设计成易于与其它插件相集成。如果在你的项目中需要数据库

*** 作功能,可以考虑该插件。

官方网站:http://easysql.sourceforge.net/

插件下载URL:http://sourceforge.net/projects/easysql/files/latest/download?source=files

(6)    EclEmma

介绍:提到 EclEmma 首先就要说到著名的 Java 覆盖测试工具 Emma。从某种程度上说,EclEmma 可以看作是 Emma 的一个图形界面。EclEmma的出现弥补了 Emma 用户一个大的遗憾 ---- 缺乏图形界面以及对集成开发环境的支持。将 Eclipse 和 Emma 这两个在各自领域最为优秀的工具结合起来,这就是 EclEmma 为我们提供的。

官方网站:http://www.eclemma.org/

Eclipse在线安装URL:http://update.eclemma.org/

(7)    Eclipse SWT Designer Plugin

介绍:Eclipse SWT Designer Plugin是一个用于快速构建J2SE的桌面化GUI开发的Eclipse插件。

官方网站:http://sourceforge.net/projects/eclipsedesigner/

插件下载URL:http://sourceforge.net/projects/eclipsedesigner/files/latest/download

(8)    FindBugs

介绍:Findbugs 是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。它可以帮助改进代码的质量。它是寻找代码缺陷的,很多我们写的不好的地方,可以优化的地方,它都能检查出来。例如:未关闭的数据库连接,缺少必要的null check,多余的 null check,多余的if后置条件,相同的条件分支,重复的代码块,错误的使用了"==",不同数据类型的比较,建议使用StringBuffer代替字符串连加等等。

官方网站:http://findbugs.sourceforge.net/

Eclipse在线安装URL:http://findbugs.cs.umd.edu/eclipse 

(9)    FreeMarker IDE

介绍:FreeMarker IDE是一个FreeMarker(模板引擎)感知编辑器,支持:语法高亮显示(Syntax Hilighting)、内容辅助(Content Assist)、大纲视图(Outline View)。其主页上提供了如何使用该插件进行开发的Flash视频。FreeMarker还有另外一个插件FreeMarker Eclipse Plugin。

官方网站:http://freemarker-ide.sourceforge.net/

插件下载URL:http://sourceforge.net/projects/freemarker-ide/files/

(10) Spket

介绍:Spket IDE是功能强大的JavaScript 和XML开发工具包。这个强大的编辑器可以进行JavaScript、XUL/XBL以及Yahoo! Widget开发。其中JavaScript编辑器具有代码完成(code completion)、语法标记以及内容概览等功能,协助开发人员创建高效的JavaScript代码。

官方网站:http://www.spket.com

Eclipse在线安装URL:http://www.agpad.com/update

(11)  JadClipse

介绍:JadClipse是一个Eclipse插件,无缝地集成了Jad(快速Java反编译器)与Eclipse。通常,当打开一个类文件,类文件查看器将显示一个简短的API类的轮廓。如果你安装这个插件,JadClipse类文件查看器将替换类文件查看器并显示了类的反编译源代码。这个任务可以通过在后台使用Jad反编译相应的类文件来完成。可以支持正常的Java语法高亮以及大纲视图。

官方网站:http://sourceforge.net/projects/jadclipse/

Eclipse在线安装URL:http://feeling.sourceforge.net/update

(12) Javascript Debug Toolkit

介绍:JSDT(Javascript Debug Toolkit)是一个用于javascript调试的Eclipse 插件,用于调试javascript。JSDT可以跨浏览器调试,支持在IE,Firefox,Safari,Chrome等主流浏览器中调试javascript。JSDT支持设置断点,单步调试等调试工具的基本特性。

官方网站:http://code.google.com/p/jsdt/

Eclipse在线安装URL:http://jsdt.googlecode.com/svn/trunk/org.ayound.js.debug.update

(13) Mybatis Editor

介绍:MyBatis Editor是一个Eclipse的插件,用来编辑MyBatis的配置文件。

官方网站:http://code.google.com/a/eclipselabs.org/p/mybatiseditor/

Eclipse在线安装URL:http://mybatiseditor.eclipselabs.org.codespot.com/git/org.eclipselabs.mybatiseditor.updatesite

(14) MAT

介绍:Eclipse Memory Analyzer(MAT)是著名的跨平台集成开发环境 Eclipse Galileo 版本的 33 个组成项目中之一,它是一个功能丰富的JAVA 堆转储文件分析工具,可以帮助你发现内存漏洞和减少内存消耗。对于大型 JAVA 应用程序来说,再精细的测试也难以堵住所有的漏洞,即便我们在测试阶段进行了大量卓有成效的工作,很多问题还是会在生产环境下暴露出来,并且很难在测试环境中进行重现。JVM 能够记录下问题发生时系统的部分运行状态,并将其存储在堆转储 (Heap Dump) 文件中,从而为我们分析和诊断问题提供了重要的依据。

官方网站:http://www.eclipse.org/mat/

Eclipse在线安装URL:http://download.eclipse.org/mat/1.2/update-site/

(15) m2eclipse

介绍:这是一个在Eclipse环境中集成的Maven插件。

官方网站:http://www.sonatype.org/m2eclipse/

Eclipse在线安装URL: http://m2eclipse.sonatype.org/sites/m2e

(16) PatternBox

介绍:PatternBox是一个Java设计模式编辑器。它提供一个基于模板的代码生成器。这个基于XML的模板机制使得你能够定义自己的代码模板。PatternBox当前能够为16种GoF设计模式生成代码。

官方网站:http://www.patternbox.com/

参考资料

CSDN:http://bbs.csdn.net/topics/391841460

搬运正文前简单说两句:

AI绘图22年刚出的时候就关注并且试玩了一下,很快就弃掉了,无他,卖家秀与买家秀差别太大了,看着自己生成的一张张垃圾图去比对其他人生成的精美作画实在是劝退。直到最近出来ControlNet刷了一波屏,感觉离可用的生产工具又进了一步,这才又重新研究了起来。结果发现仅仅几个月,整个AI绘画的进步速度让我着实感觉到了后脊发凉。大家现在发了疯的用AI搞图,玩儿新的工具(Controlnet)、插件(LORA, Dreambooth, Hypernetwork)和模型(ChilloutMix dddd),但是在B站和知乎上却都没有看到比较系统的关于Stable Diffusion的使用介绍,让我一时有些不知道从何入手。

这篇新手教学文章援引自 https://stable-diffusion-art.com/tutorials/ 这个网站,强烈建议刚入门的新手把这个网站下的每篇文章都读一遍,可以说涵盖了Stable Diffusion最前沿使用的方方面面,能让你以最快的速度,来对最新的各个模型、插件的原理、技术及使用方式都有所了解。

Prompt是AI绘图中最重要的输入控制项,即是现在已经有了非常多的定制化模型能够让你更直接简单的生成某一特定风格的图像,你仍然需要会写一个好的Prompt才能够得到一张值得展示的图像。相信大部分中文用户和我一样大概都是英文阅读3星+,写作0星的选手,看别人改别人的Prompt还行,纯自己写的话脑中除了very very beautiful ☝️ 以外就蹦不出别的啥词儿来了。而这篇基础教学文章通过对关键词分类的方式,让你可以更加明确的知道应该使用或查询哪些词汇来构建你所需要的图像,另外文章还介绍了关键词权重及混合等非常实用的技巧,以及SD是如何理解你的输入词汇等基础知识,相信无论你是想要修改Prompt还是从零自己写Prompt,无论是新手还是老手,即使已经开始使用chatGPT来辅助生成prompt了,这篇文章都仍然非常值得一看。

本文原文链接为 https://stable-diffusion-art.com/prompt-guide/ 以下是正文翻译,请勿转载:

Stable Diffusion prompt: a definitive guide

了解如何构建出优秀的提示指令(prompt)的方法,是每个SD用户首先要学习的事情。本文通过总结实验与前人的经验,给出构建指令的方法与相关技巧。总之,在这篇文章里,你将了解到有关prompt的所有信息。

何为优秀的提示指令

一个优秀的提示指令应该是详尽而具体的。一个好的方法是在关键词(keywords)分组列表中找到一个与你的需求所匹配的词汇。

关键词的分组如下:

1. 主体(Subject)

2. 绘画介质 (Medium)

3. 绘画风格(Style)

4. 艺术家名(Artist)

5. 网站(Website)

6. 清晰度(Resolution)

7. 细节描述(Additional details)

8. 颜色(Color)

9. 光线(Lighting)

在实际编写的一组提示指令中,并不需要包含以上所有的分组里的关键词。你只需要把这个分组列表当作一个提示清单,在添加新的提示词时知道要如何选用即可。

接下来我们将逐一来测试这些分组中的关键词,下面的测试中将使用的是默认模型sd v1.5 base model。 为了能够明确各个关键词的作用,测试中将不使用否定提示指令(negative prompts)。不过别着急,在文章的后面我们还是会学习如何使用否定提示指令的。以下所有的图片都以30 steps , DPM++ 2M Karas sampler以及512x704分辨率参数进行生成。【翻译注:后续翻译文章中所使用的图片都不是原文中的图片,而是译者本人在Colab上使用v1-5-pruned-emaonly.ckpt基础模型复刻的,以防作者胡说八道。其中CFG为7,BatchCount=8,Seed使用-1的随机设置,勾选了Restore face,一般生成3次乃至更多次来选出可用的示例图。另外不同于作者,我添加了"cut off, nude"的否定指令用以提升出图率以及规避审核风险】

主体(Subject)

主体表示的是你在图片中所看到的实体。在书写指令时,最通常的错误就是缺少足够的实体关键词。

比如我现在想要生成一张魔女释放法术(a sorceress casting magic)的图片。一个SD的新玩家可能会这么写

A sorceress

这么写也是OK的,但是留下了太多的想象空间。这个魔女长什么样子?是否能有任何描述她的词汇可以更明确她的样子?她穿的是什么?她释放的是什么魔法?她是站着,跑着还是漂浮在空中?图像的背景是什么?

Stable Diffusion不能读取我们的想法,我们必须切实的告诉全部我们所需要的细节内容。

对于人物主体来说,一个常用的技巧是使用明星的名字,因为这些词对输出结果会有很强的效果,也是一个非常好的用来控制输出主体样貌的方法。不过需要注意的是,使用这些人名除了会导致输出结果的面部不易产生变化外,也会导致输出同质化的姿势、风格以及其他物件。关于这一点,在文章的后面的“关联效果”章节会有详细介绍。

作为示例,我们首先让这个魔女看起来像艾玛沃森,Emma Watson也是在SD中使用最广泛的关键词。我们希望这个魔女充满力量而又神秘,并且使用闪电魔法,她的造型是充满细节点缀的。这样看看能否生成一些有意思的图片。

Emma Watson as a powerful mysterious sorceress, casting lightning magic, detailed clothing

Emma Watson在模型中实在是太常见又太出效果了。我认为SD用户这么喜欢使用她的名字,是因为她看起来十分的优雅、年轻,同时在目前网络中的大部分图片中形象是一致的。相信我,不是所有女演员都是这样的,尤其是那些活跃在90年代甚至更早期的女演员们。

绘画介质(Medium)

介质表示的是制作绘画所用到的材质。举一些例子如:插画(illustration),油画(oil painting),3D渲染(3D rendering)和摄影(photography)等。介质关键词对输出结果也有较强的作用,一个相关词汇的修改会改变整个输出结果的风格。

我们来添加一个相关的关键词 digital painting

Emma Watson as a powerful mysterious sorceress, casting lightning magic, detailed clothing, digital painting

输出结果变成了我们想要的风格!图片从照片变成了数字绘画。

绘画风格(Style)

风格代表了一种绘画的艺术风格,举例如:印象派(impressionist),超现实主义(surrealist),流行艺术(pop art)等。

我们向指令中添加一些风格类的关键字试试:hyperrealistic(超写实), fantasy(幻想风), surrealist, full body

Emma Watson as a powerful mysterious sorceress, casting lightning magic, detailed clothing, digital painting, hyperrealistic, fantasy, surrealist, full body

嗯....不太好说这些词对结果产生了多大影响,可能是因为这些风格类的关键词已经被前面的关键词所隐含。不过看上去保留他们也没有什么问题。

艺术家(Artist)

艺术家的名字也是有高影响权重的关键词。通过指定一个艺术家的名字可以让你输出的内容与其具体的艺术风格所匹配。另外通常也会使用多个艺术家的名字,以得到一种混合的艺术风格。下面我们将添加两个艺术家关键词: Stanley Artgerm Lau,一个超级英雄漫画家,以及 Alphonse Mucha,一个19世纪的肖像画家。

Emma Watson as a powerful mysterious sorceress, casting lightning magic, detailed clothing, digital painting, hyperrealistic, fantasy, surrealist, full body, by Stanley Artgerm Lau and Alphonse Mucha

我们可以看到这两种艺术家的绘画风格融合出来的效果非常好。【翻译注:慕夏是非常有名的画家,在我这个非专业人士的认知中他可以算是塔罗牌画风的创始人了,其绘画有很突出的古典、巴洛克、平面风格,另外一位画家不熟。在生成的示例图中可以看到慕夏风格表现的十分显著,这里我在制作示例图的时候把闪电的英文拼错了,所以你可以看到生成图中基本没有闪电了,不过因为慕夏+艾玛实在有点好看,我也就不修改了】

网站名(Website)

图片收集网站像 Artstation 和 Deviant Art 里聚集了大量的有明确流派的图片。 添加这类关键词可以使我们的输出结果趋同于网站上的图像艺术风格。

Emma Watson as a powerful mysterious sorceress, casting lightning magic, detailed clothing, digital painting, hyperrealistic, fantasy, surrealist, full body, by Stanley Artgerm Lau and Alphonse Mucha, artstation

看起来变化不大,但是生成的图片确实看起来像你能从Artstation上找到的图。【翻译注:在复刻的过程中我并不确定作者所说的Website是个有效的关键词类别,当我在webui中输入artstation时,token数量从43变成了45,非常怀疑模型把它拆分为art和station两个单词作为输入处理了(原因见文章后面的“指令可以有多长”章节)。另外网站的画风本身就是多元的,我也不太能理解他会对输出结果产生怎样的影响,在后续的示例中我会删除该关键词,以防止其造成不好的影响。至于与上一节相比,闪电又有了,那只是因为我把lightning拼写修改正确了】

清晰度(Resolution)

清晰度代表了输出的图像的锐度与细节度。我们尝试添加这两个关键词:highly detailed,sharp focus。

Emma Watson as a powerful mysterious sorceress, casting lightning magic, detailed clothing, digital painting, hyperrealistic, fantasy, Surrealist, full body, by Stanley Artgerm Lau and Alphonse Mucha, artstation, highly detailed, sharp focus

好吧,看上去没有太大的效果,应该是之前的图片已经很锐化且细节化了,但是添加上也并无坏处。

细节描述(Additional details)

细节描述是调整图片的调味剂。我们尝试添加 sci-fi(科幻), stunningly beautiful(绝美)与 dystopian (反乌托邦)来对图像进行一些调整。

Emma Watson as a powerful mysterious sorceress, casting lightning magic, detailed clothing, digital painting, hyperrealistic, fantasy, Surrealist, full body, by Stanley Artgerm Lau and Alphonse Mucha, artstation, highly detailed, sharp focus, sci-fi, stunningly beautiful, dystopian

颜色(Color)

通过添加颜色关键字,你可以控制图像整体的色彩。你所添加的颜色有可能作为图像整体的色调,或某个物体的颜色。

我们尝试使用关键词 iridescent gold来为图像添加一点金色。

Emma Watson as a powerful mysterious sorceress, casting lightning magic, detailed clothing, digital painting, hyperrealistic, fantasy, Surrealist, full body, by Stanley Artgerm Lau and Alphonse Mucha, artstation, highly detailed, sharp focus, sci-fi, stunningly beautiful, dystopian, iridescent gold

金色的效果很不错!

光照(Lighting)

所有摄影师都会告诉你,出片的要素之一就是光照。光照关键字对于生成的图片也有着巨大的影响。我们尝试一下在指令中添加cinematic lighting 与 dark

Emma Watson as a powerful mysterious sorceress, casting lightning magic, detailed clothing, digital painting, hyperrealistic, fantasy, Surrealist, full body, by Stanley Artgerm Lau and Alphonse Mucha, artstation, highly detailed, sharp focus, sci-fi, stunningly beautiful, dystopian, iridescent gold, cinematic lighting, dark

以上我们完成了整个演示demo的提示指令的构建

总结

可能你注意到了,仅仅向基础的目标对象再添加几个关键关键词(keywords)就已经可以生成出不错的图像出来了。对于构建Stable Diffusion的输入指令来说,通常你并不需要添加太多的关键词

否定提示指令 (Negative prompt)

否定提示指令 是另一个非常有效的调整图像的输入,通过输入你不想要的内容,而不是想要的,来实现对图像的调整。否定提示指令并非只能排除实体对象,也可以是风格或者其他一些不想要的图像特征(比如:难看(ugly),异型(deformed))

如果你使用的是SD的二代模型版本的话(注:目前大部分人使用的是1.4/1.5的一代模型版本),否定提示指令是一个必填项,否则你会得到与一代版本相比差的多的图像。对于一代版本来说,否定指令是可选的,不过在实际使用时都会对其进行设置,毕竟否定指令即使没有提升图像的效果,也不会对其造成什么损害。

我将使用一个通用的否定提示指令。有关其原理与更详细的使用方式,你可以在这篇文章中进行深入了解。

ugly, tiling, poorly drawn hands, poorly drawn feet, poorly drawn face, out of frame, extra limbs, disfigured, deformed, body out of frame, bad anatomy, watermark, signature, cut off, low contrast, underexposed, overexposed, bad art, beginner, amateur, distorted face, blurry, draft, grainy

可以看出否定提示指令使得图像中的主体更加凸显,不会显得过于平面化。

构建良好指令的流程

迭代构建

你应该使用迭代的过程来构建提示指令,就像前面的示例所演示的,随着关键字逐一添加到主体中,我们最终可以生成非常棒的图片。

我总是从只包含主体(Subject)、介质(Medium)、与风格(Style)关键词的简单指令开始进行构建。生成至少4张图片来观察结果。大部分这样的基础指令并不是能100%起效的。你需要对你所使用的基础关键词能获得什么有一些统计学上的感知。

迭代过程中一次最多添加2个关键词,同样生成至少4张图片来观察其效果

使用否定提示指令

使用通用否定提示指令永远是个不会出错的开始。

添加关键词到否定提示指令中也是迭代话构建的一部分。这些否定关键词可以是你希望避免在图像中生成的物体、或者身体部位。(由于一代模型并不太善于渲染手部,通过在否定指令中添加“hand”关键词以在图像中将其直接隐藏也是个不错的选择)

提示指令书写技巧

你可以调整一个关键词的影响因子,也可以控制在特定的生成步数(sampling step)后切换关键词。

下面所介绍的语法都可以在 AUTOMATIC111 GUI 【翻译注:就是stable-diffusion-webui】中进行使用。你可以在 Colab notebook 上使用这个工具,也可以将其部署到本地的 Windows 或 Mac 电脑上。

关键词权重

(这个语法可以在webui中使用)

你可以使用`(关键词: 权重)`这个语法来控制关键词的影响因子。权重是一个数值,小于1代表其重要度较低,大于1代表其重要度更高。

比如,我们可以在下面的指令中对狗这个关键词添加权重

dog, autumn in paris, ornate, beautiful, atmosphere, vibe, mist, smoke, fire, chimney, rain, wet, pristine, puddles, melting, dripping, snow, creek, lush, ice, bridge, forest, roses, flowers, by stanley artgerm lau, greg rutkowski, thomas kindkade, alphonse mucha, loish, norman rockwell.

添加狗的权重导致图像中出现了更多的狗,而反之则减少。并不是对于所有图片权重起到的都是这样的效果,但是绝大多数情况下,你都可以预期权重会产生这样的效果。

这个技巧不仅可以使用在主体关键词上,对所有关键词类别例如风格或光照都可以使用。

()与[]语法

(这个语法可以在webui中使用)

()与[]是与调整关键词权重等价的语法。`(关键词)`会将括弧中的关键词权重增加1.1倍,其等价于`(关键词:1.1)`。`[关键词]`将括弧中的关键词权重调低至0.9倍,其等价于`(关键词:0.9)`。

你可以像代数公式一样使用多个括弧来倍增其权重影响效果

(keyword):1.1

((keyword)):1.21

(((keyword))):1.33

与之相似的,使用多个中括弧的效果如下:

[keyword]: 0.9

[[keyword]]: 0.81

[[[keyword]]]: 0.73

关键词混合

(这个语法可以在webui中使用)

你可以混合两个关键词,这种用法准确的来说称作指令调度(prompt scheduling)。语法如下:

[关键词1:关键词2:影响因子]

`影响因子` 控制在采样的哪一步(step)中提示指令中的关键词1会切换到关键词2,它是一个0到1之间的参数

比如使用如下的指令

Oil painting portrait of [Joe Biden:Donald Trump:0.5]

将输入的step参数设置为30

这意味着在生成过程的前15步使用的是下面的指令

Oil painting portrait of Joe Biden

而在接下来第16到30步的生成过程中指令将变成下面这样

Oil painting portrait of Donald Trump

影响因子参数将决定关键词在何时发生变化,在上面的例子中它将在 30 steps x 0.5 = 15 steps后执行。

调整影响因子所产生的效果可以看作是将两位总统的肖像在不同程度上进行混合。

你也许注意到Trump身着白色西服更想是Biden的服饰搭配,这其实非常好的展现了使用关键词混合中很重要的一个规则:关键词1决定了总体的混合效果。越靠前的diffusion生成步骤越对图像整体的混合结果产生影响,而较靠后的生成步骤则只负责逐渐改进细节。

小测试:如果在上面的例子中将Joe Biden与Donald Trump调换顺序,你觉得对于生成的图片会产生什么影响呢?

面部混合

关键词混合的常用于借用两个不同的明星来创建出新的面容。举例来说,[Emma Watson: Amber heard: 0.85],40 steps,将会产生一个介于二者之间的面孔:

[Emma Watson: Amber heard: 0.85] oil painting, blur background, elegant

选择两个合适的名字再加上调整参数,就可以获得我们想要的样貌。

破产版prompt-to-prompt

使用关键词混合,你可以获得到类似于 prompt-to-prompt 的效果,即通过编辑生成出一对高度相似的图像。下面的两张图像使用了同样的提示指令,除了使用指令调度语法将苹果替换为了火焰,两张图的seed与steps参数设置也是一样的【翻译注:这里使用的示例图片是我自己做的,与原文不一致,提示指令改成了将苹果替换成了火球,主要原因是替换成火焰没有做出太好的效果图来】

[Emma Watson: Amber heard: 0.75] holding an [apple: fire ball:0.9], shining bokeh depth of field background, classic, oil painting, portrait, elegant, upper class, red lips, ear wearing. Steps: 40, Sampler: DPM++ 2M Karras, CFG scale: 6, Seed: 805277495

混合因子需要精细的调整。它具体是如何工作的?其背后的理论其实就是:输出图像的整体效果是由早期的扩散过程(diffusion process)决定的。当扩散过程开始聚焦于更小的区域时,切换任何的关键词都不会对图像的整体结果产生较大的影响。这使得这种方式可以仅仅改变图像中的一小部分。

指令可以有多长?

指令长度取决于你使用的是哪个Stable Diffusion应用,应用中可能会对你指令(prompt)中的关键词(keyword)数量进行限制。在SD一代的基础版本中,指令的限制是75个词元(token)

需要注意的是词元(token)并不等同于单词(word)。SD所使用的 CLIP模型 会自动将提示指令转化为一组词元,即该模型所知晓的单词的数字表示。如果你使用了该模型所不知道的单词或词组,该单词将会被切分为两个或更多的子单词(sub-words)直到他知道每个单词的含义。因此能够被CLIP模型所认知的单词(word)才被称为词元(token),举例来说`dream`是一个词元,`beach`是一个词元,但是`dreambeach`是两个词元,因为CLIP模型并不知道这个单


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8087105.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存