stable diffusionを使って画像生成する簡単なc#プログラム②(img2img)
前回に引き続き、プログラミングと言えないほど短いプログラムをやっていきます。
本来の目的は、こちらのimg2imgだったので楽しみです。自分で製作したDaz3DのCGに少しリアル感を持たせたいと思います。
前回とは違い別途用意した画像を読み込みます。画像に対してどれだけAIで影響を与えるかの数値Strengthを指定します。今回のテストでは0.2、0.4、0.7の画像を作成してみました。オリジナルの画像は下記のpngです。著作権フリーなのでご自由にお使いください。AI出力した画像は、著作権がよくわからないので無作為に拡散するのはご遠慮ください。
Daz3D キャラクター=マーカス君(こちらで販売しています⇒RenderHUB)
Nugetは前回と同じです
c#コードです。お好みの画像を得るためにStrengthを変更してみてください。モデルは「beautifulRealistic_v7」、Vaeは「vae-ft-mse-840000-ema-pruned」を使用。
PromptとAntiPromptは、EdgeHUB様の下記ページを参考にさせていただきました。
【Stable Diffusion】img2imgの使い方!画像から画像を生成する方法を解説
処理概要
基本の画像を読み込んでシード値を乱数で与え、10個の画像を作成する。
using HPPH;
using HPPH.System.Drawing;
using StableDiffusion.NET;
namespace StableDiffusion.Test
{
public class Program
{
static void Main(string[] args)
{
Task task = MainAsync();
task.Wait();
}
private static string ModelPath = Environment.GetEnvironmentVariable("LLMPATH", System.EnvironmentVariableTarget.User) + @"jiaowobaba02\stable-diffusion-v2-1-GGUF\beautifulRealistic_v7.safetensors";
private static string VaePath = Environment.GetEnvironmentVariable("LLMPATH", System.EnvironmentVariableTarget.User) + @"jiaowobaba02\stable-diffusion-v2-1-GGUF\vae-ft-mse-840000-ema-pruned.safetensors";
private const int intWidth = 512;
private const int intHeight = 1024;
private const float fltScale = 7f;
private const int intSteps = 36;
public static async Task MainAsync()
{
IImage objImage;
IImage<ColorRGB> Image2ImageSource;
//Load Model
StableDiffusionModel sdModel = await Task.Run(() => new StableDiffusionModel(ModelPath, new ModelParameter { VaePath = VaePath, Schedule = Schedule.Karras }));
string strPrompt = "((best quality, masterpiece, absurbres, super-resolution)), (photorealistic,realistic:1.2)";
string strAntiPrompt = "(worst quality:2) , (low quality:2) , (normal quality:2) , lowres";
string ImagePath = Environment.GetEnvironmentVariable("TESTDATA", System.EnvironmentVariableTarget.User) + @"Marcus_test01.png";
Image2ImageSource = ImageHelper.LoadImage(ImagePath).ConvertTo<ColorRGB>();
long lngSeed = -1;
for (int i = 0; i < 10; i++)
{
//Seed Random
Random rSeed = new Random();
lngSeed = rSeed.Next(0, int.MaxValue);
objImage = await Task.Run(() => sdModel?.ImageToImage(strPrompt, Image2ImageSource, new StableDiffusionParameter
{
NegativePrompt = strAntiPrompt,
Width = intWidth,
Height = intHeight,
CfgScale = fltScale,
SampleSteps = intSteps,
Seed = lngSeed,
SampleMethod = Sampler.DPMPP2Mv2,
Strength = 0.4f
}));
string savePath = Environment.GetEnvironmentVariable("TESTDATA", System.EnvironmentVariableTarget.User) + $"test{i+1}.png";
File.WriteAllBytes(savePath, objImage.ToPng());
}
}
}
}
テスト結果です。いきなり0.7からいきます。
いきなりワイルドな人が出てきましたね。立ち姿は雰囲気出てます。
なぜか女性が出てきました。StrengthとSeed値が大きい分、オリジナル画像と乖離していきます。
お次が0.2です。Strengthが小さいとSeed値の影響を受けにくいため、同じような画像が10枚作成されましたので1枚だけ掲載します。
お次は、0.4です。まあ、いい感じではないでしょうか?オリジナル画像の印象は残りつつリアル画像となっています。