【AI绘画】Midjourney进阶:垂直方向视角变化详解 https://blog.csdn.net/2201_75539691?type=blog
正面视角是指摄像机直接面对拍摄对象进行拍摄的视角。
原图:
photography of 1 person, medium shot, upper body, natural expression, cinematic light, high quality --ar 16:9
原图+正面:
photography of 1 person, front view, medium shot, upper body, natural expression, cinematic light, high quality --ar 16:9
正侧面拍摄指的是摄影师在拍摄对象的侧面并且正对着拍摄对象进行拍摄。
原图:
photography of 1 person, medium shot, upper body, natural expression, cinematic light, high quality --ar 16:9
原图+正侧面:
photography of 1 person, medium shot, upper body, natural expression, cinematic light, high quality --ar 16:9
侧面视角是指摄像机以侧面的角度拍摄对象。
原图:
photography of 1 person, medium shot, upper body, natural expression, cinematic light, high quality --ar 16:9
原图 + profile:
photography of 1 person, profile, medium shot, upper body, natural expression, cinematic light, high quality --ar 16:9
原图 + from side:
photography of 1 person, from side, medium shot, upper body, natural expression, cinematic light, high quality --ar 16:9
原图 + profile + from side:
photography of 1 person, profile, from side, medium shot, upper body, natural expression, cinematic light, high quality --ar 16:9
侧背面拍摄是一种常见的摄影角度,也就是指从拍摄对象的背面侧面进行拍摄。
原图:
photography of 1 man talking with 1 woman, medium shot, upper body, natural expression, cinematic light, high quality --ar 16:9
原图 + 侧背面:
photography of 1 person, rear side view, medium shot, upper body, natural expression, cinematic light, high quality --ar 16:9
背面视角是指摄像机从拍摄对象的背后进行拍摄的视角
原图:
photography of 1 woman sitting by the river, full body, natural expression, cinematic light, sunset, high quality --ar 16:9
原图 + 背面:
photography of 1 woman sitting by the river, full body, from back, cinematic light, sunset, high quality --ar 16:9
在本文中,我们详细探讨了水平方向视角变化在AI绘画中的应用,包括正面、侧面、背面等多种视角如何影响情感表达和叙事结构。通过对这些不同视角的深入理解,我们不仅仅看到了AI技术生成图像的强大能力,更看到了AI在艺术表现力方面的潜力。
import tensorflow as tf;from tensorflow.keras.applications import VGG19;from tensorflow.keras.preprocessing.image import load_img, img_to_array;from tensorflow.keras.models import Model;import numpy as np;import matplotlib.pyplot as plt;content_image_path = 'path_to_content_image.jpg';style_image_path = 'path_to_style_image.jpg';content_weight = 1.0;style_weight = 1.0;total_variation_weight = 1e-4;content_layers = ['block5_conv2'];style_layers = ['block1_conv1', 'block2_conv1', 'block3_conv1', 'block4_conv1', 'block5_conv1'];def preprocess_image(image_path): img = load_img(image_path, target_size=(224, 224)); img = img_to_array(img); img = np.expand_dims(img, axis=0); return tf.keras.applications.vgg19.preprocess_input(img);def deprocess_image(img): x = img.copy(); if len(x.shape) == 4: x = np.squeeze(x, 0); assert len(x.shape) == 3; x[:, :, 0] += 103.939; x[:, :, 1] += 116.779; x[:, :, 2] += 123.68; x = x[:, :, ::-1]; x = np.clip(x, 0, 255).astype('uint8'); return x;def compute_loss(model, loss_weights, init_image, gram_style_features, content_features): input_tensor = tf.concat([init_image, *gram_style_features, *content_features], axis=0); features = model(input_tensor); loss = tf.zeros(shape=()); style_output_features = features[:len(style_layers)]; content_output_features = features[len(style_layers):]; style_score = tf.add_n([tf.reduce_mean((gram_style_features[i] - style_output_features[i]) ** 2) for i in range(len(style_layers))]); content_score = tf.add_n([tf.reduce_mean((content_output_features[i] - content_features[i]) ** 2) for i in range(len(content_layers))]); style_score *= loss_weights[0]; content_score *= loss_weights[1]; loss += style_score + content_score; return loss;def gram_matrix(input_tensor): result = tf.linalg.einsum('bijc,bijd->bcd', input_tensor, input_tensor); input_shape = tf.shape(input_tensor); num_locations = tf.cast(input_shape[1]*input_shape[2], tf.float32); return result / num_locations;def get_feature_representations(model, content_path, style_path): content_image = preprocess_image(content_path); style_image = preprocess_image(style_path); content_outputs = model(content_image); style_outputs = model(style_image); content_features = [content_outputs[i] for i in range(len(content_layers))]; style_features = [gram_matrix(style_outputs[i]) for i in range(len(style_layers))]; return style_features, content_features;def compute_grads(cfg): with tf.GradientTape() as tape: all_loss = compute_loss(**cfg); total_loss = all_loss[0]; return tape.gradient(total_loss, cfg['init_image']), all_loss;def run_style_transfer(content_path, style_path, num_iterations=1000, content_weight=1e3, style_weight=1e-2): model = get_model(); for layer in model.layers: layer.trainable = False; style_features, content_features = get_feature_representations(model, content_path, style_path); init_image = preprocess_image(content_path); init_image = tf.Variable(init_image, dtype=tf.float32); opt = tf.optimizers.Adam(learning_rate=5.0, beta_1=0.99, epsilon=1e-1); best_loss, best_img = float('inf'), None; cfg = {'model': model, 'loss_weights': (style_weight, content_weight), 'init_image': init_image, 'gram_style_features': style_features, 'content_features': content_features}; norm_means = np.array([103.939, 116.779, 123.68]); min_vals = -norm_means; max_vals = 255 - norm_means; for i in range(num_iterations): grads, all_loss = compute_grads(cfg); loss, style_score, content_score = all_loss; opt.apply_gradients([(grads, init_image)]); clipped = tf.clip_by_value(init_image, min_vals, max_vals); init_image.assign(clipped); if loss < best_loss: best_loss = loss; best_img = deprocess_image(init_image.numpy()); return best_img, best_loss;best_img, best_loss = run_style_transfer(content_image_path, style_image_path);plt.imshow(best_img);plt.show();