阅读视图

发现新文章,点击刷新页面。
🔲 ⭐

赛博偶像速成指南(二)- SD进阶篇

在第一篇关于AI绘图的文章中,我主要介绍了stable diffusion的各种使用方法

在midjounry收费之后,除非你对AI绘图这个操作本身有强需求,否则在免费自建的stable diffusion上做拓展就成了现在最好的解决方案。

这篇文章就聊一些stable diffusion的一些进阶操作和关键点。其中有不少还是很有意思的。

在线部署stable diffusion

AI相关的东西都有一个很大的共同点就是对GPU的算力要求太高,相比在服务器上运行,更靠谱的方案是在本地电脑上跑,比起动辄5、6位数的服务器,一个入门级的4070ti就已经能应对大量的ai训练场景了。

在Google Colab白嫖GPU

但有个很特殊的东西是Google Colab,这是Google提供的免费GPU算力

img

现在有很多现成的脚本可以允许你一键部署脚本,就比如

点击打开之后,先点击右上角的连接,会随机分配一个机器给你

img

连接成功就会变成绿色

img

免费的计算单元式有限的,你也可以考虑升级Colab Pro或者Pro+来获得稳定的计算资源。Colab Pro的价格是大概每月75.

img

在登陆成功并里连接好机器之后,你就可以按照步骤逐步点击操作,每一步点开箭头按钮即可

img

这里需要下载的各种内容都会直接下载到你账号对应的Google云端硬盘。

然后是一些比较重要的设置,首先基础的模型包中选择合适的模型,在上篇文章提到过Chilloutmix是一个人像的写实通用模型,正常来说我们都会选择这个。

img

当然,如果你想要下载其他模型,你也可以在这里填入相应的包链接下载。包括后面的LoRa也是一样。其他的大部分内容都不用更改,直接跑完即可。

最后点击运行启动web ui

img

img

然后你就可以直接使用在线版本的stable了,要注意的是免费的colab会有两个问题

1、免费的colab只能连续运行十几小时,再用就必须停一段时间,就又会获得新的免费时间。

2、在使用人数比较多的时候,免费账户可能会申请不到GPU算力。

当然如果你用的是colab pro就不用这么麻烦了。

在Stable diffusion基础上的第三方

其实市面上有很多很多的第三方开发AI绘图工具是基于Stable diffusion做的,其中很多都很好用,适当的付费就可以换来非常好用的工具,就比如Civitai中,你就可以直接点击跳转到第三方网站付费运行相应的模型。

img

除了这些内置的以外,其中有个我感觉比较好用的是Vega AI

img

这个网站已经把Stable diffusion包装成很接近midjounry的工具了,你可以非常简单的选择模型并输出描述文案,并且可以在图片基础上做反复微调,虽然这都是Stable diffusion本身的功能,但不得不说在包装后更好用了。

img

Stable diffusion拓展插件

在上篇文章讲到Stable diffusion本身的各种用法,其实除了本体以外,Stable diffusion还支持拓展插件,可以有非常不错的功能拓展。

Openpose 骨骼绑定

Openpose Editor是一个最近比较流行的骨骼动作编辑插件,你可以直接在下面的链接下载这个插件。

img

通过这个插件,你可以在一定程度上设定生成图片的人物骨骼结构。从而生成指定的图片。

在导入Openpose插件之后,你可以在上面选择Openpose编辑器

img

然后选择简单的骨骼结构之后推导到文生图继续编辑,在左下角勾选启用,和低vram模式,其他的基本不用动。

img

这样就可以跑出来一张指定骨骼样子的图片

img

除了指定骨骼以外,你还可以通过上传图片来解构图片本身的骨骼,然后再用来指定和生成,这个Openpose在生成人物图片的优先级以及效果远比图生图效果要好,尤其是可以很大程度还原图片本身的样式。

在OpenPose编辑器中使用Detect from image获取图片中的人物骨骼

img

然后发送到文生图或者图生图里传入关键字。等待一会儿就会生成对应的图了

img

当然这里这个简单的骨骼绑定还是比较简单的一种,配合适当的ControlNet插件你还可以做到线稿成图、色块成图等等类似的操作。

ChatGPT关键字

其实我觉得Stable diffusion里最不实用的关键点就是正向和负向关键字,关键字系统本身相当复杂而且还只能识别英语,并且里面的优先级问题和竞争问题相当复杂,对于使用者来说,这点就是一个相当大的门槛。反之在midjounry中这方面就做的非常好,你可以用中文描述场景在逐步优化。

而现在,你可以用一个简单的ChatGPT插件来实现类似的功能,在配置上chatgpt的api之后你就可以用GPT3.5来解构和构造关键字。

成功安装之后,可以在设置里找到ChatGPT Utilities,点开并配置Chatgpt 的apikey

img

然后在对应文生图中,script中选择对应的ChatGPT,就会弹出以下的选项卡,我们可以在这里自动生成prompt.

后台会用你设定的ChatGPT apikey去生成图片的prompt

img

然后会生成对应的图

img

当然让chatgpt去生成prompt是比较简单的应用方式,你也可以指定部分prompt,然后进一步生成图片。比如

1
基于 {prompt},生成不同姿势的粉色头发美女

这种情况下,你先去搞一个比较靠谱的prompt,再自定义做修改,就不会像以前一样对超长的prompt无从下手了。当然,我试了几次之后发现,其实chatgpt不太能理解这个预设的prompt,效果没有直接描述场景更好。

img

生成的图有点儿崩了,这里我就打码了

写在最后

在研究Stable diffusion的过程中,真的感觉现在这个东西好成熟,没想到AI革命,很多行业都还没革明白,但再设计圈已经掀起翻天波浪了。下次文章会聊聊另一个神器midjounry

🔲 ⭐

Maya 拍屏方案汇总

前言

  最近接到了一个需求,又是熟悉的 拍屏工具。
  其实老早之前我就有写过类似的需求,只是表现形式各不相同。
  这里打算将不同的拍屏方案汇总到一起,这样大家可以挑选一个合适的情景的方式完成这个任务。

拍屏方案汇总

Maya Python Publish 检查功能开发

  最早在华强实习的时候,就写过将 Arnold 渲染的界面合成并打开 RV 进行预览。
  背后主要用 renderWindowEditor 命令导出。


https://github.com/FXTD-ODYSSEY/MayaViewportCapture

  后来进入腾讯前,我写了 Maya Viewport Capture 工具。
  那个时候写的比较粗糙,我通过 UI 可以定义几个相机的位置,然后规定进行拍屏。
  当时研究用 Maya 或者 Qt 的 API 将 Viewport 的画面截取下来。
  背后主要用 Maya API M3dViewreadColorBuffer
  Qt 部分其实也是在拿到 Maya 的 MImage 之后转成 QImage 而已。


Maya Python 模型拍屏合并工具

  后来正式工作之后,发现前辈用的是 ogsRender 命令将 Maya Hardware 2.0 输出来。
  相较于 renderWindowEditor 命令不需要打开渲染窗口。


playblast

  实现拍屏有太多的方案,当然最为基础的方法就是使用 playblast 命令。
  建议安装上 QuickTime 这样可以极大压缩 Maya 拍屏的文件大小,同时提升 Maya 拍屏的质量。
  playblast 命令既可以直接生成视频也可以拍屏序列帧。

拍屏需求汇总

  上面提供四种拍屏方案,最常用的时 playblast 方案,因为可以直接输出视频。
  如果是图片序列还需要借助 ffmpeg 等命令行工具将图片序列合成为视频。

  拍屏的需求千变万化,但是有一些点其实大差不差。

  1. 拍屏信息
  2. 镜头角度

  比较常见的信息有 时间,影片的归属名字(比如动画的某一段),影片负责人 等等。
  添加这些信息可以用 headsUpMessage 将相关信息叠加到 Viewport 上。
  但是 headsUpMessage 非常难用,而且字体大小等各种非常不方便自定义。
  要解决这个问题可以用 插件,它通过 OpenMaya API 扩展了 headsUpMessage 的功能。
  作者是 zurbrigg ,只可惜它之前免费的工具现在变成付费了。
  劲爆羊工具盒 里面有拍屏王,它就是通过 ZShotmask VP2 插件,将各种信息贴到屏幕上。
  具体可以在 劲爆羊工具盒 里面找到脚本 resource\tools\MSTools\MST_DATA\plug-ins\zshotmask.py
  当然它是一个 Maya Python 插件,注册之后提供了一个节点,只要设置节点的属性就可以了。


  这个方式可以结合 playblast 解决大部分拍屏的问题。
  但有些情况并不能很好解决,比如我遇到的问题就是,每一帧都要重新矫正一下镜头的位置。
  而且这个矫正还不能单纯使用约束,需要每一帧单独进行计算。
  所以我只能改用 ogsRender 的方式,在后台进行拍屏。

Maya ogsRender 输出序列帧

  使用 ogsRender 输出序列帧只能输出到默认工程 images 文件夹的路径。
  因此要控制 ogsRender 输出的位置只能通过修改工程位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import contextlib
@contextlib.contextmanager
def change_workspace_images(folder):
"""Change maya project images folder temporarily.

Args:
folder (str): Image folder path.
"""
workspace_settings = pm.workspace(q=1, fr=1)
image_index = workspace_settings.index("images")
original_image_folder = workspace_settings[image_index + 1]
pm.workspace(fr=["images", folder])
yield
pm.workspace(fr=["images", original_image_folder])

  我写了一个函数,可以修改输出位置,在修改回去。
  这样我可以输出到任意路径。

Python ThreadPool 多线程后处理

  上面拍屏生成的图片,可以放到 imagemagick 进行图片后处理。
  imagemagick 是 maya 自带的命令行图形处理库。
  在 Maya 2022 之前叫做 imconvert.exe, 2022 之后叫做 magick.exe

  之前也研究过通过 imagemagick 处理图片,真的是拳打 Pillow 脚踢 QImage

ImageMagick 图像处理介绍

  imagemagick 用 C 和 C++ 编写的,非常小巧,而且运行速度很快~
  这里我没有使用 ZShotmask VP2 直接拍屏输出我要的信息,因为有些信息想要通过 imagemagick 叠加到图片上。
  于是我想到可以利用 Pool 线程池的方式多线程后台调用命令行。

  其中 from multiprocessing.dummy import Pool 可以导入 Python 隐藏的线程池。
  这个用起来比起使用 threading 库要简单方便很多。
注: from multiprocessing import Pool 导入进程池, Maya 不太支持这个。
  下面来个实例演示一下多线程调度后处理函数的好处。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
from multiprocessing.dummy import Pool
from functools import partial
from functools import wraps
import time

def log_time(func=None, msg="elapsed time:"):
if not func:
return partial(log_time, msg=msg)

@wraps(func)
def wrapper(*args, **kwargs):
curr = time.time()
res = func(*args, **kwargs)
print("[{0}]".format(func.__name__),msg, time.time() - curr)
return res

return wrapper

def post_process(index):
time.sleep(0.1)
print("test", index)


@log_time
def multi_thread():
pool = Pool()

results = []
for index in range(10):
time.sleep(0.1)
results.append(pool.apply_async(partial(post_process, index)))

[result.wait() for result in results]
pool.close()
print("done")

@log_time
def sequence_run():
for index in range(10):
time.sleep(0.1)
post_process(index)
print("done")

if __name__ == "__main__":
multi_thread()
sequence_run()

  执行上面的代码

1
2
[sequence_run] elapsed time: 2.201172351837158
[multi_thread] elapsed time: 1.2311382293701172

  最后会得到用线程池的方式可以比直接执行快1倍。
  而且这个代码是 py2 兼容的。
  通过这个方式可以在 Maya 拍屏的时候用多线程调用 imagemagick 来对生成的图像进行处理。
  这样用户几乎感受不到图像后处理的时间。

总结

  以上就是 Maya 各种拍屏方案汇总,使用序列帧的自由度比较高,但是需要 ffmpeg 和 imagemagick 等依赖进行处理。
  简单的需求可以直接用 playblast 加上 ZShotmask VP2 完成。

🔲 ⭐

漫展初体验

在八月初,今年香港漫展(ACGHK 2022)的最后一天下午,达成了人生第一次的漫展体验。作为一个不怎么关注二次元 ACG 的人来说,无论是现场的表演、同人摊位,还是各类 Coser,都十分新奇有趣。

因为是最后一天,加上提前买好了门票,所以没怎么花时间排队就进场了。之前看新闻报道,开幕最初几天虽然天气炎热,也是需要大排长龙等候许久才能进场。漫展面积挺大的,除了同人展外,还有电子消费品展区、艺术玩具展览,楼上展厅还有一大块专门的 cosplay 活动区。

因为不是二次元 ACG 爱好者,同人摊位展区基本上一扫而过,没什么特别兴趣。在电子消费品展区发现几个不错产品,奈何荷包并不充足且没有很强的使用需求,最后还是没有买(微笑)。

现场演出舞台感觉是全场最嗨的区域,除了真人演员上场表演外,还有 当下很火的 VTuber 参与。很有趣的是,VTuber 唱歌的时候不仅台前的观众在呼应,远在其他展台的一位观众也忍不住大声呼应,气氛相当火热。Cosplay 活动区域堪称百花齐放,各色动漫角色都有。不过因为去太晚了,只能匆匆一带而过,没怎么拍 Coser 的照片(比如现场很多可爱的小姐姐),甚是遗憾。

在疫情依旧严重的当下,举办这样规模的漫展也挺不容易的。第一次看展,没怎么留意拍照片,就随便拍了几张,下次一定!

❌