今天,我被二维码卷到了...

news2024/12/23 9:52:52

f4f25d012f8b8353e54cd198c5c1a71b.gif

# 关注并星标腾讯云开发者
# 每周4 | 鹅厂一线程序员,为你“试毒”新技术
# 第1期 | 腾讯王锐:测评二维码艺术画生成体验

90e1817657b73cf66a66534175508a36.png

都说AI绘画来势汹汹,但论创意,还是人类玩得花🤫。下面这几张乍一看平平无奇、却在网上疯传的AI生成图片,你能看出其中暗藏的玄机吗?

21a076fb487a1c6a74ea5477afbc6517.jpeg

05b2b163aef99af45559b778dfc32c01.jpeg

35426816b10c463f41ed41167e547a38.jpeg


f6dd9b791de7e7e2584ac2d6801e5619.jpeg

建议大家在手机上手动缩放一下这些图。缩得越小,图片夹带的文字/二维码能展示得更清晰。

还有网友给了别的“认字”秘诀,比如摘下你的近视眼镜:

94e282d1143580db586eab6d04ab458f.jpeg

大家可以发现,这些图片生成的思路如出一辙——通过光影、着色等等控制手段,确保文字或者二维码作为光影、衣服图案等,融入图像中。

令本人震惊的是,艺术画二维码还是由几位在校学生使用 ControlNet+StableDiffusion 生成的。后生可畏!他们训练的 ControlNet 生成的二维码图片极具艺术感。二维码不再是经典的黑白格子矩阵,而是被巧妙地融合在图片的内容当中。

aa49400def5706efb8fe18777b55f3ef.jpeg

@倪豪@陈柏宇(时辰) @王照涵 @陈智勇的 QR Code ControlNet 作品

我不禁思考这种图为什么依然是一个可用的二维码呢?怎样才能制作这样的二维码图片呢?遂开始一次小实验。

a0c9e61c7474709f7e5ab2e89b7eb744.png

首先我们需要快速了解二维码识别的原理。

d64f80688b633c066e61cf045e4ea357.jpeg

二维码图片主要包含定位图案(图上的三个大“回”形方框)、中间的点阵数据图案。二维码的扫描过程看上去也很复杂,我看了一下网上的介绍,粗略地将其解码过程总结为:

  • 根据三个定位图案检测以及“摆正”二维码。

  • 将二维码区域转换为灰度图,切分成不重叠的区块,每个区块内单独计算得到一个阈值,高于阈值的为1,小于阈值的为0。

  • 根据一定的规则,从读取的一串010110...数据流中解码得到信息。二维码的编码有一定的冗余,数据流中偶然几位的0,1被搞混也不会影响解码。

因此,虽然上面这些艺术画二维码看上去不再是黑白格子矩阵,但只要它:

  • 依然包含关键的三个定位图案。

  • 定位图案包围的数据区域有明显的亮暗关系变化,可以被解码为0,1数据流。

  • 数据流中被扰乱的0,1比特还没有那么多,还能被冗余信息恢复。

那么它就是一个二维码。

总结一下:只要二维码的亮暗关系还没被破坏得太多,那就还是一个可用的二维码?

好的,现在我们已经知道关键点是保留亮暗关系了,接着一个问题就是,怎么才能制作满足这种亮暗关系的二维码图片?

引子中提到的文章作者并没有透露他们使用的 ControlNet 方案。现网制作这些二维码的方案很多,而且效果上差距还挺明显。

下面我尽量多介绍几种合成艺术画二维码的方案,例如开源社区很快有人提出可以用 tile_resample ControlNet ,来模拟一下类似的效果。

4e13db88a941ae4865985a6198536a60.png

ControlNet 1.1 Tile 是 ControlNet 作者(github: lllyasviel)制作的一个功能类似于补充细节的 ControlNet。

当被输入丢失了很多细节纹理的图片(如下面的模糊狗狗图)时:

52c331fb7a6ff4e9e6bbc4c0da6e9435.jpeg


输出则是一幅正常的细节完善的图片:

e09284bcfb3eb26b862396069e18b1af.jpeg

利用其补细节这一特性,我们使用一张包含黑白格子二维码的图片作为 ControlNet 的输入,同时用 ControlNet 的输入当作 img2img 的垫图,即基于 resample ControlNet + img2img,可以搞出类似于下图的效果:

b39c2da49af6b8caf041a8fd8c9a84ae.jpeg

具体来说,用这种图同时当作 img2img 的垫图及 ControlNet 的输入:

03afdfb4a31731a5a24515fdd05790ff.jpeg

在 Stable Diffusion WebUI 的 img2img Tab,设置调整那一系列参数,然后点 Generate 就可以“开盲盒”了。

为了降低大家“开盲盒”的难度,我这里分享下我使用的 WebUI 参数:

Tony Stark, bruise wounded, wet soaked, water splash, torn apart, ripped clothes, random background vintage, neons lights, (high detailed skin:1.2), 8k uhd, dslr, soft lighting, hyperdetailed, intricately detailed, unreal engine, fantastical, ideal human, high quality, film grain, bokeh, Fujifilm XT3, hyper realisticNegative prompt: ugly, disfigured, low quality, blurry, nsfwSteps: 50, Sampler: DPM++ 2M Karras, CFG scale: 10, Seed: 3724036266, Size: 768x768, Model hash: 4199bcdd14, Model: revAnimated_v122, Denoising strength: 0.85, Mask blur: 4, ControlNet 1: "preprocessor: tile_resample, model: control_v11f1e_sd15_tile [a371b31b], weight: 0.8, starting/ending: (0.23, 0.9), resize mode: Just Resize, pixel perfect: False, control mode: Balanced, preprocessor params: (512, 1, 64)"

我用了 revAnimated_v122 模型,Prompt 和 Negative Prompt 已经包含在上面。

最关键的 ControlNet 参数是:

ControlNet 1: "preprocessor: tile_resample, model: control_v11f1e_sd15_tile [a371b31b], weight: 0.8, starting/ending: (0.23, 0.9), resize mode: Just Resize, pixel perfect: False, control mode: Balanced, preprocessor params: (512, 1, 64)"

这里 weight: 0.8, starting/ending: (0.23, 0.9),是我主要调整的参数。分别对应了 ControlNet 起效的力度、起效的 diffusion step 开始与结束。这本质上是在调整 ControlNet 在图生图过程中的作用大小

ControlNet 作用太大,出来的图格子感太重;反之作用太小,生成图很有可能已经不是二维码了。

当然,你可以预先调整一下输入图的二维码颜色位置,提前安排一下生成结果中二维码大概的颜色和位置。比如把二维码设置成红色,那么你就能得到下面这幅铠甲颜色更为自然的图片。

6e862ff4488b39b0f3178b0fb5f0162a.jpeg

这种方案我测试了很久,真实体验就是:摸奖的成分很重。

比如上面的钢铁侠二维码,调整好 ControlNet+img2img 参数后,大部分随机数种子对应的图片中钢铁侠的人脸都有黑白格子对应的”污损“:

3da866c501c8a2ada40dda970887ab80.jpeg

7dcaa7e980a3760a68694f14ff683b22.jpeg

想得到上面那种脸没有污损的图片,要抽很多随机数种子(随机数选42结果不好,我试了ヾ(•ω•)o)。

自然而然地,我又有一个问题:有没有办法指定图中人物的位置 or 姿势呢?用多了 WebUI 的开发者,能立马想到再加一个 ControlNet 控制人物的方案(当然我没想到,在 reddit 上盯了半天才学到这个方案)。

7bdc481283cfbdebd40b75f16374d59b.png

这一方案是上面的方案改进版。

ControlNet tile 负责补充二维码区域的纹理细节,ControlNet OpenPose 负责控制人物位置。

依然是用 Stable Diffusion WebUI 的 img2img tab,但开启了两个 ControlNet。其中 ControlNet1 是 Openpose:输入图及其提供的火柴人 pose 图如下:

de2e351521c3abc15a2b17740e495f4f.jpeg

ControlNet2 则是和上一个方案类似的一个带二维码的图片:

70dd1e5cd06a2d5da6a1df404ddcd2a9.jpeg

依然公开一下我调出来的 webui 参数,供大家参考:

futobot, cyborg, ((masterpiece),(best quality),(ultra-detailed), (full body:1.2), 1 female, solo, hood up, upper body, mask, 1 girl, female focus, black gloves, cloak, long sleevesNegative prompt: paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochrome)), ((grayscale)), skin spots, acnes, skin blemishes, age spot, glans, nsfw, nipples, (((necklace))), (worst quality, low quality:1.2), watermark, username, signature, text, multiple breasts, lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry, bad feet, single color, ((((ugly)))), (((duplicate))), ((morbid)), ((mutilated)), (((tranny))), (((trans))), (((trannsexual))), (hermaphrodite), extra fingers, mutated hands, ((poorly drawn hands)), ((poorly drawn face)), (((mutation))), (((deformed))), ((ugly)), blurry, ((bad anatomy)), (((bad proportions))), ((extra limbs)), (((disfigured))), (bad anatomy), gross proportions, (malformed limbs), ((missing arms)), (missing legs), (((extra arms))), (((extra legs))), mutated hands,(fused fingers), (too many fingers), (((long neck))), (bad body perspect:1.1)Steps: 60, Sampler: DPM++ 2M Karras, CFG scale: 11, Seed: 2912497446, Size: 768x768, Model hash: ed4f26c284, Model: camelliamix25D_v2, Denoising strength: 1, Mask blur: 4, ControlNet 0: "preprocessor: openpose_full, model: control_sd15_openpose [fef5e48e], weight: 1, starting/ending: (0, 1), resize mode: Resize and Fill, pixel perfect: False, control mode: Balanced, preprocessor params: (512, 64, 64)", ControlNet 1: "preprocessor: tile_resample, model: control_v11f1e_sd15_tile [a371b31b], weight: 0.75, starting/ending: (0.23, 1), resize mode: Resize and Fill, pixel perfect: False, control mode: Balanced, preprocessor params: (512, 1, 64)"

这种方案生成的图片类似于这样:

97c1791e59e6204e9d5b637debb65ac0.jpeg

更换一下提供姿势的图片,就能调整生成图片中人物的姿势:

e666a83d0b89915dc3b7c18491b1aa5d.jpeg

这个方案的生成效果格子感很重,但成功率较高。基本上每个随机数种子的结果都大差不差,毕竟使用了两个 ControlNet,对生成图片的控制程度提升了很多。

以上两个方案虽然能搞出一些惊艳的效果,但是整体上看成功率不高,生成图格子感也比较重。

看来,针对二维码这个特定的场景,单独训练一个对应的 QRCode ControlNet 还是很有必要的。

8e90c445b079fd3f642238161e11713d.png

本人在研究上面两个方案的同时,发现huggingface 上有人开源了一个 QRCode ControlNet。这个 ControlNet 效果怎么样呢?

社区开源的 QRCodeControlNet 在:DionTimmer/controlnet_qrcode-control_v1p_sd15 · Hugging Face 其展示的效果类似于:

37ee603735deaa4afc646486554321c8.jpeg

我个人评价不是特别好。它使用成对的二维码及其艺术二维码图片作为训练集,生成的图片二维码感非常强,可扫性很高,但不好看。

但即使是这样,开源到社区后,还是很快有人用这个模型搞出来类似于下图这样的效果:

0d8cb9ea2d1c4a8a2a164d86451d574e.jpeg

是不是感觉还可以?开源社区调 Prompt 的技巧还是很强的!但我觉得它这种思路还是有点问题。

我们期望的是生成的图片看不出来是二维码。如果训练时就用了一堆二维码图片当作输出,那么网络就会很快地过拟合到二维码域,二维码感会很强。我们需要的是没有“二维码感”的二维码!有没有什么更好的思路呢?

f9333969ed407a9f510268d4e090e29c.png

在尝试训练 ControlNet 前,先要理清楚如何构造数据。回顾一下,我们期望的 ControlNet 有两个关键点:

ControlNet tile 实际上解决了第一个问题,配合着 img2img,它能够把输入二维码的明暗关系保留下来,但同时也过多地保留了输入图的颜色,以及“格子感”。保留明暗,忽略颜色、格子......

这些需求启发我设计了对应的数据处理策略,训练一个专门的 QRCode ControlNet。初步测试的结果也支持了我的想法。

上述两个关键点启发的 QRCode ControlNet 能得到一些类似于这样的输出:

0fb56f6ff60960c15585c194eb820985.jpeg


但是还有一个问题:二维码出现的位置还是很突兀。感觉二维码和图片没有很自然地融合在一起。之后,我又思考了一下突兀问题的解法,给上面的思路增加了一点细节。可以得到下面这样的二维码艺术画:

27917d1cb3e9ddadab6f935e603eb66a.jpeg

c9551393dcb59ac7bf1903c067c601c5.jpeg

自训练的 QRCode ControlNet 制作的图片美观程度,相较于其它方法改进了很多。我也制作了一个生成 demo 分享给了同事,大家基本上很容易就能生成一些很美观的二维码图片,远胜于之前我一个人用 Stable Diffusion WebUI 频繁“开盲盒”。

也许会有读者朋友想要个艺术二维码生成体验链接?先卖个关子,相关的体验活动近期会在QQ上线。上面提到的多个生成思路,非常推荐大家动手体验!!

整体来说,萌生 AIGC 二维码这个想法后的这个探索过程,我学着用起了 Stable Diffusion WebUI,尝试了很多方案最终才有了一个还不错的效果,体验到了一种解密的快感。实际效果其实也超出了我原先预期,这就是 AIGC的奇妙可能性。欢迎大家转发分享~

-End-

原创作者|王锐

古有神农尝百草,一日而遇七十毒。今有码农尝百技,拥抱变化、让星火燎原。我们推出《码农尝百草》栏目,每期邀请腾讯工程师“试毒”新技术。

你还想看腾讯工程师体验测评哪些新产品、新技术?对本栏目有什么建议和看法?欢迎留言。我们将为1位提案提供者送出腾讯定制程序员文化衫。8月3日中午12点开奖。

c958ba9cb686b56fabb023c1016447e9.png

*如果您不希望您的留言被精选公开,可以在留言时加入文字备注。

0432cc29ebd68aac86d4faca0f8e08c4.png

51d071932aa0412bb3405c61ad9444a7.png

de2bc84a85984678ec127ec7784029a9.png

e5ac8f3c87b8f9e4a7a5eac767369009.png

f7f036305efe2a37d03462b0d5fd7783.png

关注并星标腾讯云开发者

每周4看鹅厂程序员测评新技术

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

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

相关文章

rcu链表综合实践

基础知识 rcu-read copy update的缩写。和读写锁起到相同的效果。据说牛逼一点。对于我们普通程序员,要先学会使用,再探究其内部原理。 链表的数据结构: struct list_head {struct list_head *next, *prev; };还有一种:struct h…

自建纯内网iot平台服务,软硬件服务器全栈实践

基于以下几个考虑,自制硬件设备,mqtt内网服务器。 1.米家app不稳定,逻辑在云端或xiaomi中枢网关只支持少部分在本地计算。 2.监控homeassistant官方服务有大量数据交互。可能与hass安装小米账户有关。 3.硬件:原理图,l…

apifox 调用camunda engine-rest接口报错“type“: “NotFoundException“

官方文档在这: https://docs.camunda.org/rest/camunda-bpm-platform/7.19/ 现象 engine-rest本是可以直接请求的,我把openapi导入到apifox之中了,我测试一下接口没有能请求成功的,基本都报以下的错。 报错如下 {"type&qu…

【iOS】Frame与Bounds的区别详解

iOS的坐标系 iOS特有的坐标是,是在iOS坐标系的左上角为坐标原点,往右为X正方向,向下为Y正方向。 bounds和frame都是属于CGRect类型的结构体,系统的定义如下,包含一个CGPoint(起点)和一个CGSiz…

《向量数据库指南》:向量数据库Pinecone如何集成Haystack库

目录 安装Haystack库 初始化PineconeDocumentStore 数据准备 初始化检索器 检查文档和嵌入 初始化提取式问答管道 提问 在这个指南中,我们将看到如何集成Pinecone和流行的Haystack库进行问答。 安装Haystack库 我们首先安装最新版本的Haystack,其中包括PineconeDocum…

【爬虫案例】用Python爬取iPhone14的电商平台评论

用python爬取某电商网站的iPhone14评论数据, 爬取目标: 核心代码如下: 爬取到的5分好评: 爬取到的3分中评: 爬取到的1分差评: 所以说,用python开发爬虫真的很方面! 您好&…

Shell ❀ 一键配置Iptables规则脚本 (HW推荐)

文章目录 注意事项1. 地址列表填写规范2. 代码块3. 执行结果4. 地址与端口获取方法4.1 tcpdump抓包分析(推荐使用)4.2 TCP连接分析(仅能识别TCP连接) 注意事项 请务必按照格式填写具体参数,否则会影响到匹配规则的创建…

【腾讯云 Cloud Studio】构建基于 React 的实时聊天应用

关于腾讯云 Cloud Studio构建基于 Cloud Studio 的聊天应用(项目实战)1. 注册并登录 Cloud Studio2. 配置 Git 环境2.1 复制 SSH 公钥2.2 添加 SSH 公钥至 GIt 平台 3. 创建项目4. 项目开发4.1 安装依赖4.2 集成 tailwind css4.3 编写代码4.4 项目运行示…

windows中文界面乱码问题

我的便携是内部返修机,买来时就是英文版,在设置中改成简体中文就可以了,与中文版没有什么区别,已经升级成win11。windows自身的应用、360之类的界面都能正常显示,但是个别应用总是乱码,根据客服的提示设置一…

【lesson5】linux vim介绍及使用

文章目录 vim的基本介绍vim的基本操作vim常见的命令命令模式下的命令yypnyynpuctrlrGggnG$^wbh,j,k,lddnddnddp~shiftrrnrxnx 底行模式下的命令set nuset nonuvs 源文件wq!command(命令) vim配置解决无法使用sudo问题 vim的基本介绍 首先vim是linux下的…

企业服务器数据库被360后缀勒索病毒攻击后采取的措施

近期,360后缀勒索病毒的攻击事件频发,造成很多企业的服务器数据库遭受严重损失。360后缀勒索病毒是Beijingcrypt勒索家族中的一种病毒,该病毒的加密形式较为复杂,目前网络上没有解密工具,只有通过专业的技术人员对其进…

vlan 绑定端口号

<s2>system-view Enter system view, return user view with CtrlZ. # 创建 vlan 10 和 20 [s2]vlan 10 [s2-vlan10]vlan 20# display vlan# 删除 vlan 10 # [s2-vlan20]quit # [s2]undo vlan 10# 设置 interface 为 access port [s2]interface Eth0/0/1 [s2-Ethernet0/…

【雕爷学编程】MicroPython动手做(02)——尝试搭建K210开发板的IDE环境3

4、下载MaixPy IDE&#xff0c;MaixPy 使用Micropython 脚本语法&#xff0c;所以不像 C语言 一样需要编译&#xff0c;要使用MaixPy IDE , 开发板固件必须是V0.3.1 版本以上&#xff08;这里使用V0.5.0&#xff09;, 否则MaixPy IDE上会连接不上&#xff0c; 使用前尽量检查固…

diffusion model(五)stable diffusion底层原理(latent diffusion model, LDM)

LDM: 在隐空间用diffusion model合成高质量的图片&#xff01; [论文地址] High-Resolution Image Synthesis with Latent Diffusion Models [github] https://github.com/compvis/latent-diffusion 文章目录 LDM: 在隐空间用diffusion model合成高质量的图片&#xff01;系列…

3D工厂模拟仿真 FACTORY I/O 2.55 Crack

FACTORY I/O 提供超过20个典型的工业应用场景让您如身临其境般地练习控制任务。选择一种场景直接使用或以其作为一个新项目的开端。学生可以利用内嵌的可编辑的典型工业系统模板&#xff0c;也可以自由搭建并编辑工业系统。同时该系统具有全方位3D视觉漫游&#xff0c;可随意放…

存储重启后,ceph挂载信息没了,手动定位osd序号并挂载到对应磁盘操作流程、ceph查看不到osd信息处理方法

文章目录 故障说明处理流程定位硬盘中的osd序号挂载osd到ceph上验证并拉起osd重复上面操作故障说明 我们的一个存储节点莫名其妙的重启了,不知道咋回事 但这样的问题就是,所有osd都down了 因为挂载信息没有写到fstab里面,所以不会自动up,并且没有挂载信息,并且也看不到o…

如何用Java代码写出二维码!!!

什么你说你不会&#xff1a; 1.首先加入二维码需要的架包。&#xff08;认真看了&#xff0c;我只教一遍&#xff09;安装包已经放上来了&#xff0c;需要的直接下载。 2.将架包接入项目。 3.编写代码。 //支持中文格式Map<EncodeHintType,String> hintsnew HashMap<&…

适配器模式——不兼容结构的协调

1、简介 有的笔记本电脑的工作电压是20V&#xff0c;而我国的家庭用电是220V&#xff0c;如何让20V的笔记本电脑能够在220V的电压下工作&#xff1f;答案是引入一个电源适配器&#xff08;AC Adapter&#xff09;&#xff0c;俗称充电器&#xff0f;变压器。有了这个电源适配器…

【JAVA】你可知JAVA中的运算符|重温运算符

作者主页&#xff1a;paper jie的博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《JAVASE语法系列》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精…

MySQL之深入InnoDB存储引擎——Checkpoint机制

文章目录 一、引入二、LSN三、触发时机 一、引入 由于页的操作首先都是在缓冲池中完成的&#xff0c;那么如果一条DML语句改变了页中的记录&#xff0c;那么此时页就是脏的&#xff0c;即缓冲池中页的版本要比磁盘的新。那么数据库需要将新版本的页刷新到磁盘。倘若每次一个页…