前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【AI绘画】Midjourney后置指令--ar、--iw 、 --s 、--r、--stop详解

【AI绘画】Midjourney后置指令--ar、--iw 、 --s 、--r、--stop详解

作者头像
CSDN-Z
发布2024-10-17 18:22:03
1000
发布2024-10-17 18:22:03
举报
文章被收录于专栏:AIGC

💯前言


💯什么是后置指令?

  • 作用:写在提示词最后部分,对图片属性进行规定。

后置指令格式

代码语言:javascript
复制
文本提示词 --<后置指令名> <参数值> 
  • 注意:
  • 文本提示词和后置指令之间有空格
  • --与后置指令之间无空格
  • 后置指令名与参数间有空格
  • 不同后置指令名之间有空格

💯Midjourney后置指令–ar (or --aspect)

  • 在这部分内容中,我们将讨论一个关键的后置指令 --ar(也可写作--aspect),它用于调整图像的比例或画幅。这个参数的作用是改变生成图像的宽高比例。具体而言,这个参数通过两个数字用冒号分隔的形式来表示。
  • Midjourney官方使用手册
代码语言:javascript
复制
提示词 --ar 宽:高
  • 一般格式:

注意点

  1. 当不设置时,默认参数是1:1
  1. 参数数值必须时整数,不能是小数
  1. 生成或放大出来的图片,图片比例可能略微调整
  • 16/9=1.7777,而这里生成和放大的图片宽高比是1.784,我们--ar设置的分辨率与实际效果有差别,差几个像素。这有什么影响呢,就是当我们使用 Midjourney 生成图片后,再将其导入到 Stable Diffusion 进行进一步处理时,可能会发现图像的尺寸差了几个像素,这会让人有些头疼。为了让图像完全匹配,可能需要你自己在 Photoshop 中手动调整,或者使用 Stable Diffusion 的某些技术来进行修正。

常用的分辨率

  • 在 Midjourney 中,–ar 参数有一些常用的宽高比例,不同的比例适用于不同的场景。例如,1:1 比例适合突出主体,如人像和静物;3:2 比例传承自 35mm 胶片,适合大多数场景;4:3 比例与人眼看到的比例接近,适合表现静谧的氛围;16:9 比例则常用于电影场景,适合拍摄开阔风光或人文题材。每种比例都有其优缺点,用户可以根据创作需求选择合适的比例。

分辨率

优点

缺点

1:1

它可以让人们的注意力更集中在图像的中心,给人一种视觉上的“稳定感”,适合用来直接强调拍摄主体,突出主体的存在感。该比例几乎适用于所有题材,包括:人像、静物、风光等等

空间受限,不适合拍摄广阔的风景或群体照片

3:2

这个比例是从35mm胶片中继承下来的。它提供了一种自然的视觉效果,适合大多数场景

对于一些特殊的构图可能会显得略微紧凑

4:3

和人眼看到的比例更接近。这种篇幅拍出来的照片会显得比较紧凑,在表达气氛上显得较冷静,它更适合用来表现一些安静肃穆的画面以及人像

在横构图时,由于画面两边缺少延展,不太常用在风光摄影上

16:9

这是电影常常采用的比例。在拍摄照片的时候,使用这个比例可以拍出电影场景般的效果。比较适合拍摄大开大合的风光和人文题材。也电脑桌面的比例

2:1

电影画幅,更具有电影感、史诗感

多数情况下有点太扁了,工作场景使用不方便

竖画幅

在制作人像半身、全身特写的时候很有帮助

在短视频平台上传播很有帮助

💯Midjourney后置指令–iw

  • iw全称illustration weight,用于调整图像提示词相比较于文本部分的重要性。使用更高的--iw值意味着图像提示将对生成的图片产生更大的影响。
  • Midjourney官方使用手册

测试

  • 接下来我们对--iw的效果做一个测试,以下是案例图,我们使用Midjourney图生图功能生成香水静物图
代码语言:javascript
复制
still life,perfume,photo,realistic
  1. 当我们在提示词中不使用 --iw 参数时,虽然生成的图像仍然保持了香水的主题和类似的风格,但和原图相比还原度不高。图像的背景较为杂乱,包含了花卉、水果等多种元素,颜色也显得较为丰富多样。这种情况下,AI在生成图像时加入了更多自己的创意,可能偏离了我们对主题的具体要求。
  1. 当我们将 --iw 参数设置为0.5 时,虽然香水瓶的形状大致保持了矩形或菱形的感觉,但背景变得更加丰富多样。可以看到,整体样式和色调与原图相比有了显著的变化。
  1. 当我们将 --iw 参数设置为 2 时,生成的香水图像在形状和风格上都更加贴近原始参考图像。可以看到,甚至连碎裂的花纹都得到了高度还原,这说明使用 --iw 参数能够显著提高生成图像与参考图像之间的相似度。这个参数的使用帮助我们在细节上达到了与原图一致的效果,使得最终输出的图像在风格和细节上都更加符合预期。
  • 这表明,通过调整 --iw 参数,我们可以有效控制图像的生成方式,特别是对背景和细节的影响程度。–iw 参数的作用类似于文本提示词中的权重设置,决定了参考图像对最终生成图像的影响力度。

注意点

  1. 当未指定–iw时,将使用默认值1
  1. --iw取值范围在0-2之间,值可以是小数

💯Midjourney后置指令–s (or --stylize)

  • 在Midjourney中,当你在尾缀中添加 --s 后跟一个数字时,这意味着你对图片的风格化程度进行了设定。这个设定与 settings 中的四个 “Stylize” 按钮(低、中、高、非常高风格化)相关。当你调整这些风格化选项时,Midjourney会自动在命令尾部添加一个 --s 参数,并且这个参数后面的数字会根据你选择的风格化程度而变化。每次设置不同的风格化值时,所对应的 --s 数值都会有所不同,从而影响最终生成图像的风格效果。

测试

  • 我们做一个测试,以下是关于陶瓷的提示词:
代码语言:javascript
复制
Elegant ceramic vase with intricate patterns, soft lighting, and minimalist background.
  1. Stylize high对应 --s 250,生成的陶瓷图像保留了较多的现实元素,看起来像是一个精致的艺术品。
  1. Stylize very high对应 --s 750,图像的风格化程度显著提高,艺术感大大增强,但同时也开始偏离现实,呈现出更加夸张和理想化的效果。这表明 --s 参数直接影响了图像的风格化程度,数值越高,生成的图像越具有强烈的艺术风格,可能会脱离现实的约束。

  • 那我们如果既在/settings里面设置Stylize程度,又在提示词后置指令--s写上一个不一样的值会发生什么呢?
  • 我们看到最终生成图片依据的是手动输入的--s 200,而不是/settings里的Stylize。

注意点

  1. --s与/setting里的stylize四个按钮相关。

/setting里Stylize

对应--s的值

Stylize low

--s 50

Stylize med

--s 100

Stylize high

--s 250

Stylize very high

--s 750

  1. 当未指定--s时,将使用默认值100。
  1. 取值范围在0-1000之间。
  1. 一般来说,–s在100-500的范围内,效果较好。

💯Midjourney后置指令–r(or --repeat)

  • –r 参数的作用非常简单,它允许你多次使用同一套参数来生成图片。这个功能特别适合在你想要通过多次尝试来获得理想的底图时使用。有时候,即使你写对了提示词,也可能需要生成几十甚至上百张图片才能找到最符合预期的那一张。为了避免手动重复操作并节省时间,你可以使用 --repeat 参数来自动生成多张图片,从而解放双手,避免一遍遍按下回车键。
  • Midjourney官方使用手册

测试

  • 当你在提示词后加入 --repeat 参数并指定重复次数,例如 --repeat 3,系统会提示你确认是否希望重复生成三次。如果确认无误,点击 “Yes”,Midjourney 就会开始排队处理这些任务,并同时生成三组图像。

注意点

  1. 不同的会员等级可以设置的次数不同

不同价格的会员

可设置repeat范围

10美金一个月的会员

可以设置2-4

30美金一个月的会员

可以设置2-10

60美金以上一个月会员

可以设置2-40

  1. repeat模式消耗快速生成时间

💯Midjourney后置指令–stop

  • --stop 参数的作用是让Midjourney在生成图像的过程中提前停止,并直接输出当前的结果。这意味着图像可能会比完整生成的版本更加模糊,细节较少。 Midjourney官方使用手册

测试

  • 当我们将 --stop 参数设置为 20% 时,Midjourney 在生成到20%的进度时就直接输出结果。可以看到,这种情况下生成的图像非常模糊,细节也未完全展现出来。这种效果可能在某些特定场合或需求下会有用,例如需要一种模糊或低质量的效果,但通常情况下,较少使用这个参数来获得最终图像。这个参数更多地用于快速查看生成的初步效果或用于创意性的低分辨率实验
-
-

注意点

  • --stop后面的数字是百分比(范围是10到100),代表着进度在百分之多少的时候中止。

💯小结

在本文中,我与大家分享了几种常用的 Midjourney 后置指令的应用。这些指令, --ar、–iw、–s、–r 和 --stop,在调整图像的比例、权重、风格化程度以及生成过程等方面提供了很多灵活性。通过具体的测试案例,我希望能够帮助大家更好地理解这些参数的作用,从而在创作中能够更加精准地实现想要的效果。这些工具虽然简单,但在实际应用中却能带来丰富的创意表达空间。希望本文能对大家在使用 Midjourney 时有所帮助,让创作过程更加顺利。

  • 展望未来,AI绘画无疑将继续在艺术创作领域发挥更大的作用。通过不断进化的工具和技术,我们不仅能在生成图像的精度和细节上取得突破,还能在创作自由度和个性化表达上达到新的高度。随着 AI 算法的日益成熟,创作者们将能够更加直观和自然地与这些工具互动,从而实现更加复杂和丰富的艺术构思。
  • 这种变化不仅会影响艺术创作的过程,也会改变我们对艺术的理解和定义。通过 AI,我们有机会重新审视创作与技术之间的关系,进而推动艺术走向新的未来。希望随着这些技术的进步,能够为更多的创作者带来灵感和创作的动力,让 AI 绘画成为我们探索艺术世界的一扇新的窗口。

代码语言:javascript
复制
/*
* 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释 
* import torch, torch.nn as nn, torch.optim as optim; from torch.utils.data import Dataset, DataLoader; from torchvision import transforms, utils; from PIL import Image; import numpy as np, cv2, os, random; class PaintingDataset(Dataset): def __init__(self, root_dir, transform=None): self.root_dir = root_dir; self.transform = transform; self.image_files = os.listdir(root_dir); def __len__(self): return len(self.image_files); def __getitem__(self, idx): img_name = os.path.join(self.root_dir, self.image_files[idx]); image = Image.open(img_name).convert('RGB'); if self.transform: image = self.transform(image); return image; class ResidualBlock(nn.Module): def __init__(self, in_channels): super(ResidualBlock, self).__init__(); self.conv_block = nn.Sequential(nn.Conv2d(in_channels, in_channels, kernel_size=3, stride=1, padding=1), nn.InstanceNorm2d(in_channels), nn.ReLU(inplace=True), nn.Conv2d(in_channels, in_channels, kernel_size=3, stride=1, padding=1), nn.InstanceNorm2d(in_channels)); def forward(self, x): return x + self.conv_block(x); class Generator(nn.Module): def __init__(self): super(Generator, self).__init__(); self.downsampling = nn.Sequential(nn.Conv2d(3, 64, kernel_size=7, stride=1, padding=3), nn.InstanceNorm2d(64), nn.ReLU(inplace=True), nn.Conv2d(64, 128, kernel_size=3, stride=2, padding=1), nn.InstanceNorm2d(128), nn.ReLU(inplace=True), nn.Conv2d(128, 256, kernel_size=3, stride=2, padding=1), nn.InstanceNorm2d(256), nn.ReLU(inplace=True)); self.residuals = nn.Sequential(*[ResidualBlock(256) for _ in range(9)]); self.upsampling = nn.Sequential(nn.ConvTranspose2d(256, 128, kernel_size=3, stride=2, padding=1, output_padding=1), nn.InstanceNorm2d(128), nn.ReLU(inplace=True), nn.ConvTranspose2d(128, 64, kernel_size=3, stride=2, padding=1, output_padding=1), nn.InstanceNorm2d(64), nn.ReLU(inplace=True), nn.Conv2d(64, 3, kernel_size=7, stride=1, padding=3), nn.Tanh()); def forward(self, x): x = self.downsampling(x); x = self.residuals(x); x = self.upsampling(x); return x; class Discriminator(nn.Module): def __init__(self): super(Discriminator, self).__init__(); self.model = nn.Sequential(nn.Conv2d(3, 64, kernel_size=4, stride=2, padding=1), nn.LeakyReLU(0.2, inplace=True), nn.Conv2d(64, 128, kernel_size=4, stride=2, padding=1), nn.InstanceNorm2d(128), nn.LeakyReLU(0.2, inplace=True), nn.Conv2d(128, 256, kernel_size=4, stride=2, padding=1), nn.InstanceNorm2d(256), nn.LeakyReLU(0.2, inplace=True), nn.Conv2d(256, 512, kernel_size=4, stride=2, padding=1), nn.InstanceNorm2d(512), nn.LeakyReLU(0.2, inplace=True), nn.Conv2d(512, 1, kernel_size=4, stride=1, padding=1)); def forward(self, x): return self.model(x); def initialize_weights(model): for m in model.modules(): if isinstance(m, (nn.Conv2d, nn.ConvTranspose2d)): nn.init.normal_(m.weight.data, 0.0, 0.02); elif isinstance(m, nn.InstanceNorm2d): nn.init.normal_(m.weight.data, 1.0, 0.02); nn.init.constant_(m.bias.data, 0); device = torch.device("cuda" if torch.cuda.is_available() else "cpu"); generator = Generator().to(device); discriminator = Discriminator().to(device); initialize_weights(generator); initialize_weights(discriminator); transform = transforms.Compose([transforms.Resize(256), transforms.ToTensor(), transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])]); dataset = PaintingDataset(root_dir='path_to_paintings', transform=transform); dataloader = DataLoader(dataset, batch_size=16, shuffle=True); criterion = nn.MSELoss(); optimizerG = optim.Adam(generator.parameters(), lr=0.0002, betas=(0.5, 0.999)); optimizerD = optim.Adam(discriminator.parameters(), lr=0.0002, betas=(0.5, 0.999)); def generate_noise_image(height, width): return torch.randn(1, 3, height, width, device=device); for epoch in range(100): for i, data in enumerate(dataloader): real_images = data.to(device); batch_size = real_images.size(0); optimizerD.zero_grad(); noise_image = generate_noise_image(256, 256); fake_images = generator(noise_image); real_labels = torch.ones(batch_size, 1, 16, 16, device=device); fake_labels = torch.zeros(batch_size, 1, 16, 16, device=device); output_real = discriminator(real_images); output_fake = discriminator(fake_images.detach()); loss_real = criterion(output_real, real_labels); loss_fake = criterion(output_fake, fake_labels); lossD = (loss_real + loss_fake) / 2; lossD.backward(); optimizerD.step(); optimizerG.zero_grad(); output_fake = discriminator(fake_images); lossG = criterion(output_fake, real_labels); lossG.backward(); optimizerG.step(); with torch.no_grad(): fake_image = generator(generate_noise_image(256, 256)).detach().cpu(); grid = utils.make_grid(fake_image, normalize=True); utils.save_image(grid, f'output/fake_painting_epoch_{epoch}.png'); def apply_style_transfer(content_img, style_img, output_img, num_steps=500, style_weight=1000000, content_weight=1): vgg = models.vgg19(pretrained=True).features.to(device).eval(); for param in vgg.parameters(): param.requires_grad = False; content_img = Image.open(content_img).convert('RGB'); style_img = Image.open(style_img).convert('RGB'); content_img = transform(content_img).unsqueeze(0).to(device); style_img = transform(style_img).unsqueeze(0).to(device); target = content_img.clone().requires_grad_(True).to(device); optimizer = optim.LBFGS([target]); content_layers = ['conv_4']; style_layers = ['conv_1', 'conv_2', 'conv_3', 'conv_4', 'conv_5']; def get_features(image, model): layers = {'0': 'conv_1', '5': 'conv_2', '10': 'conv_3', '19': 'conv_4', '28': 'conv_5'}; features = {}; x = image; for name, layer in model._modules.items(): x = layer(x); if name in layers: features[layers[name]] = x; return features; def gram_matrix(tensor): _, d, h, w = tensor.size(); tensor = tensor.view(d, h * w); gram = torch.mm(tensor, tensor.t()); return gram; content_features = get_features(content_img, vgg); style_features = get_features(style_img, vgg); style_grams = {layer: gram_matrix(style_features[layer]) for layer in style_features}; for step in range(num_steps): def closure(): target_features = get_features(target, vgg); content_loss = torch.mean((target_features[content_layers[0]] - content_features[content_layers[0]])**2); style_loss = 0; for layer in style_layers: target_gram = gram_matrix(target_features[layer]); style_gram = style_grams[layer]; layer_style_loss = torch.mean((target_gram - style_gram)**2); style_loss += layer_style_loss / (target_gram.shape[1] ** 2); total_loss = content_weight * content_loss + style_weight * style_loss; optimizer.zero_grad(); total_loss.backward(); return total_loss; optimizer.step(closure); target = target.squeeze().cpu().clamp_(0, 1); utils.save_image(target, output_img);
*/
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 💯前言
  • 💯什么是后置指令?
    • 后置指令格式
    • 💯Midjourney后置指令–ar (or --aspect)
      • 注意点
        • 常用的分辨率
        • 💯Midjourney后置指令–iw
          • 测试
            • 注意点
            • 💯Midjourney后置指令–s (or --stylize)
              • 测试
                • 注意点
                • 💯Midjourney后置指令–r(or --repeat)
                  • 测试
                    • 注意点
                    • 💯Midjourney后置指令–stop
                      • 测试
                        • 注意点
                        • 💯小结
                        相关产品与服务
                        大模型图像创作引擎
                        大模型图像创作引擎是一款提供 AI 图像生成与处理能力的 API 技术服务,可以结合输入的文本或图像智能创作图像内容,具有更精美的绘图品质、更强大的中文理解能力、更多样的风格选择与更广泛的应用场景,为高质量的图像内容创作、内容运营提供技术支持。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档