stable diffusionを使って画像生成する簡単なc#プログラム
AIと言えば画像生成が有名ですが今まであまり興味がありませんでした。がしかし自分の作成したDaz3DのCGをもっとリアルにエロくできるのではないかと思い付いて少しチャレンジしてみようかなと考えました。
巷ではすばらしいWebUIプログラムがありますが、どこがどうなってるのか理解できてないと不用意に画像をアップするのも心配なのでLLM同様ローカル環境でc#で動かしたいと思います。
StableDiffusion.netという便利なものを作成いただいているので、それを使ってプログラミングしますね。
まずはNugetです。下記の4つをNugetしてください。自分はCudaを使用しますのでBackend.Cudaを使います。Backend.CPUもありますのでCUDAが使えないひとはそちらをNugetしてください。
下記がプログラムです。「beautiful woman」をいうプロンプトで横1024X縦512の画像を10枚作成します。
モデルは、「yayoiMix_v25」を使用しています。Vaeは、「vae-ft-mse-840000-ema-pruned」を使用。
1枚作成するごとにSeed値を乱数で変更して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\yayoiMix_v25.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 = 1024;
private const int intHeight = 512;
private const float fltScale = 11f;
private const int intSteps = 36;
public static async Task MainAsync()
{
IImage objImage;
try
{
//Load Model
StableDiffusionModel sdModel = await Task.Run(() => new StableDiffusionModel(ModelPath, new ModelParameter { VaePath = VaePath, Schedule = Schedule.Karras }));
string strPrompt = "beautiful woman";
string strAntiPrompt = "";
long lngSeed = 0;
for (int i = 0; i < 10; i++)
{
//Seed Random
Random rSeed = new Random();
lngSeed = rSeed.Next(0, int.MaxValue);
string savePath = Environment.GetEnvironmentVariable("TESTDATA", System.EnvironmentVariableTarget.User) + $"test{i+1}.png";
objImage = await Task.Run(() => sdModel?.TextToImage(strPrompt, new StableDiffusionParameter
{
NegativePrompt = strAntiPrompt,
Width = intWidth,
Height = intHeight,
CfgScale = fltScale,
SampleSteps = intSteps,
Seed = lngSeed,
SampleMethod = Sampler.DPMPP2Mv2
}));
File.WriteAllBytes(savePath, objImage.ToPng());
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
}
生成した10枚です。腕が変なのもありますが美しい女性が生成できていますね。
次はAIに画像を与えて生成するプログラムに挑戦したいと思います。