ToB企服应用市场:ToB评测及商务社交产业平台

标题: AIGC | Midjourney——图片同等性操作及深度学习原理分析 [打印本页]

作者: 钜形不锈钢水箱    时间: 2025-1-17 20:38
标题: AIGC | Midjourney——图片同等性操作及深度学习原理分析
目录

# 一、前言
# 二、生成高度相似图片详解 
 # 三、人物同等性操作详解
  #后缀参数调整
#优化提示词
#借助变体功能
# 四、相似或同等性图片原明白析
垫图原理
风格迁徙原理
人物同等性原理
# 五、声明
# 六、写在最后


# 一、前言

MJ作为AI圈很抗打的AI生图工具,在其强大的功能里,人物同等性的保持堪称一大亮点。我们在制作插画或角色故事时,人物同等性至关重要。此操作不仅仅靠单一的后缀参数调整来实现,要想更大程度上挖掘MJ进阶用法,必要打出一套组合拳并明白背后严谨的数学原理和机器学习。
# 二、生成高度相似图片详解 

我们在第一篇博客中讲过,垫图、风格迁徙......都可以高度还原理想图片。
不相识MJ基本操作的朋友们可以先阅读这篇博客:《AIGC | Midjourney使用指南,直接拿捏~》
但是要想充实使用MJ这一工具必要调用多个功能:
第一步:  使用/describe,对目的图片进行描述

第二步:将描述结果进行翻译,选择更为全面的描述,同时也可以综合四条结果自己整合出更全面的提示词。 

第三步:复制目的图片链接在提示词前进行垫图,垫图后输入空格后再写入提示词 ,写入提示词后,空格 参加后缀参数,每个后缀参数间要插入空格。
注:--iw(范围为0-2)数值越大,对垫图链接的参考越大。--sref空格+链接+空格+--sw空格(0-1000)数值越大,对链接图片的风格参考性更大。--cref空格+链接+空格+--cw空格(0-100)数值为0时,只是对图片脸部进行参考,数值为100时,是对全图细节元素进行参考。
--sref --sw & --cref --cw 使用贴士
--sref与--sw不一定要同时使用,但--sw 不能单独使用,故只能出现:--sref空格+链接或--sref空格+链接+空格+--sw空格(0-1000)这两种情势。
--cref与--cw必须同时使用,故只能出现:-cref空格+链接+空格+--cw空格(0-100)否则会报错。

此外,我们在一张图中也可以融合多张图的元素,比如人脸参考图A,风格参考图B,大抵垫图为图C,也就是说,这三张图不一定要是一张图。
 # 三、人物同等性操作详解

  #后缀参数调整

垫图+--iw +--cref --cw 0+--seed,对提示词进行修改,从而呈现不同画面。


提示词:https://s.mj.run/RiqmbDqC2HA , A little girl plays the guitar in the garden --seed 2023957784 --cref https://s.mj.run/RiqmbDqC2HA --cw 0 --iw 2 --niji 6
在垫图中我们可以多次垫不同的图,确保有更大的发挥性,垫图的先后序次有关权重,我们也可以在链接后输入::+数值来调整权重。
#优化提示词

我们在提示词中参加特定指令也可实现,人物同等性操作。
如:不同动作:Different actions
一连动作:Continuous action
多视角动作:Multi-view action
不同心情:Different expressions
正在做什么:What is being done
一连拍摄:Continuous shooting
序列拍摄:Sequence shooting
#借助变体功能


详情请看: 《AIGC | Midjourney使用指南,直接拿捏~》
# 四、相似或同等性图片原明白析

垫图原理

通过提供视觉参考,垫图资助 AI 抓取并应用关键元素,如风格、纹理等,与文本提示相团结来指导创作。重要有 “克隆” 和 “牵引” 两种用途,“克隆” 是尽大概复刻风格,“牵引” 是引导创作方向而非完全复制。

风格迁徙原理

核心是使用深度学习中的卷积神经网络(CNN)等技能,将内容图像的内容与风格图像的风格进行融合。

代码实现: 以 Python 和 TensorFlow 为例,使用 VGG19 模型实现风格迁徙。
  1. import tensorflow as tf
  2. from tensorflow import keras
  3. from keras.applications.vgg19 import VGG19
  4. from keras.preprocessing.image import load_img, img_to_array
  5. import numpy as np
  6. # 定义内容层和风格层
  7. content_layers = ['block3_conv1']
  8. style_layers = ['block1_conv1', 'block2_conv1', 'block3_conv1', 'block4_conv1', 'block5_conv1']
  9. # 加载预训练的VGG19模型
  10. base_model = VGG19(weights='imagenet', include_top=False)
  11. # 构建内容模型
  12. content_model = keras.Model(inputs=base_model.input, outputs=[base_model.get_layer(layer).output for layer in content_layers])
  13. # 构建风格模型
  14. style_model = keras.Model(inputs=base_model.input, outputs=[base_model.get_layer(layer).output for layer in style_layers])
  15. # 加载并预处理图像
  16. def preprocess_img(img_path, target_size=(224, 224)):
  17.     img = load_img(img_path, target_size=target_size)
  18.     img = img_to_array(img)
  19.     img = np.expand_dims(img, axis=0)
  20.     img = keras.applications.vgg19.preprocess_input(img)
  21.     return img
  22. # 计算Gram矩阵
  23. def gram_matrix(feature_map):
  24.     shape = tf.shape(feature_map)
  25.     height, width, channels = shape[1], shape[2], shape[3]
  26.     feature_map = tf.reshape(feature_map, [height * width, channels])
  27.     gram = tf.matmul(tf.transpose(feature_map), feature_map)
  28.     return gram
  29. # 计算内容损失
  30. def content_loss(generated_content, content_target):
  31.     return tf.reduce_mean(tf.square(generated_content - content_target))
  32. # 计算风格损失
  33. def style_loss(generated_style, style_target):
  34.     style_loss = 0.0
  35.     for gen, target in zip(generated_style, style_target):
  36.         gen_gram = gram_matrix(gen)
  37.         target_gram = gram_matrix(target)
  38.         style_loss += tf.reduce_mean(tf.square(gen_gram - target_gram))
  39.     return style_loss
  40. # 图像风格迁移
  41. def style_transfer(content_img_path, style_img_path, num_iterations=1000, content_weight=1.0, style_weight=100.0):
  42.     content_img = preprocess_img(content_img_path)
  43.     style_img = preprocess_img(style_img_path)
  44.     # 初始化生成图像为内容图像
  45.     generated_img = tf.Variable(content_img, dtype=tf.float32)
  46.     optimizer = tf.optimizers.Adam(learning_rate=5, beta_1=0.99, epsilon=1e-1)
  47.     for i in range(num_iterations):
  48.         with tf.GradientTape() as tape:
  49.             generated_content = content_model(generated_img)
  50.             generated_style = style_model(generated_img)
  51.             content_loss_value = content_weight * content_loss(generated_content, content_model(content_img))
  52.             style_loss_value = style_weight * style_loss(generated_style, style_model(style_img))
  53.             total_loss = content_loss_value + style_loss_value
  54.         gradients = tape.gradient(total_loss, generated_img)
  55.         optimizer.apply_gradients([(gradients, generated_img)])
  56.     return generated_img
  57. content_img_path = 'content.jpg'
  58. style_img_path = 'style.jpg'
  59. generated_img = style_transfer(content_img_path, style_img_path)
  60. # 保存生成的图像
  61. keras.preprocessing.image.save_img('output.jpg', generated_img.numpy()[0])
复制代码
 

人物同等性原理


代码实现: 
  1. import tensorflow as tf
  2. # 定义生成器和判别器网络结构
  3. def generator(inputs):
  4.     # 生成器网络架构
  5.     return generated_image
  6. def discriminator(image):
  7.     # 判别器网络架构
  8.     return discrimination_result
  9. # 定义损失函数
  10. cross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=True)
  11. # 定义生成器损失
  12. def generator_loss(fake_output):
  13.     return cross_entropy(tf.ones_like(fake_output), fake_output)
  14. # 定义判别器损失
  15. def discriminator_loss(real_output, fake_output):
  16.     real_loss = cross_entropy(tf.ones_like(real_output), real_output)
  17.     fake_loss = cross_entropy(tf.zeros_like(fake_output), fake_output)
  18.     return real_loss + fake_loss
  19. # 定义优化器
  20. generator_optimizer = tf.keras.optimizers.Adam(learning_rate=0.0002, beta_1=0.5)
  21. discriminator_optimizer = tf.keras.optimizers.Adam(learning_rate=0.0002, beta_1=0.5)
  22. # 训练循环
  23. for epoch in range(num_epochs):
  24.     for batch in data_loader:
  25.         real_images = batch
  26.         # 生成随机噪声作为生成器输入
  27.         noise = tf.random.normal([batch_size, noise_dim])
  28.         with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:
  29.             # 生成假图像
  30.             fake_images = generator(noise)
  31.             # 判别器对真实图像和假图像的判别结果
  32.             real_output = discriminator(real_images)
  33.             fake_output = discriminator(fake_images)
  34.             # 计算生成器和判别器损失
  35.             gen_loss = generator_loss(fake_output)
  36.             disc_loss = discriminator_loss(real_output, fake_output)
  37.         # 计算生成器和判别器的梯度
  38.         gen_gradients = gen_tape.gradient(gen_loss, generator.trainable_variables)
  39.         disc_gradients = disc_tape.gradient(disc_loss, discriminator.trainable_variables)
  40.         # 更新生成器和判别器的参数
  41.         generator_optimizer.apply_gradients(zip(gen_gradients, generator.trainable_variables))
  42.         discriminator_optimizer.apply_gradients(zip(disc_gradients, discriminator.trainable_variables))
复制代码

# 五、声明

本文代码实现来自:豆包
数学原理参考文献:







# 六、写在最后

不作溢美之词,不作浮夸文章,此文与功名进取绝不相干也!
与各人共勉~感谢您的阅读!您的三联是我更新最大的动力!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4