mirror of
https://github.com/DarthAffe/StableDiffusion.NET.git
synced 2025-12-12 13:28:35 +00:00
Add project files.
This commit is contained in:
parent
c4dce3c24e
commit
e741cc14d1
255
.gitignore
vendored
Normal file
255
.gitignore
vendored
Normal file
@ -0,0 +1,255 @@
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
|
||||
# User-specific files
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# Documentation - till it's done
|
||||
Documentation
|
||||
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
[Rr]elease/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Ll]og/
|
||||
|
||||
# Visual Studio 2015 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUNIT
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# DNX
|
||||
project.lock.json
|
||||
artifacts/
|
||||
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_i.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.svclog
|
||||
*.scc
|
||||
|
||||
# Chutzpah Test files
|
||||
_Chutzpah*
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opendb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
*.VC.db
|
||||
*.VC.VC.opendb
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
*.sap
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# JustCode is a .NET coding add-in
|
||||
.JustCode
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
nCrunchTemp_*
|
||||
|
||||
# MightyMoose
|
||||
*.mm.*
|
||||
AutoTest.Net/
|
||||
|
||||
# Web workbench (sass)
|
||||
.sass-cache/
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
# TODO: Comment the next line if you want to checkin your web deploy settings
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||
# in these scripts will be unencrypted
|
||||
PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/packages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/packages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/packages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignoreable files
|
||||
*.nuget.props
|
||||
*.nuget.targets
|
||||
|
||||
# Microsoft Azure Build Output
|
||||
csx/
|
||||
*.build.csdef
|
||||
|
||||
# Microsoft Azure Emulator
|
||||
ecf/
|
||||
rcf/
|
||||
|
||||
# Windows Store app package directories and files
|
||||
AppPackages/
|
||||
BundleArtifacts/
|
||||
Package.StoreAssociation.xml
|
||||
_pkginfo.txt
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
ClientBin/
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.dbproj.schemaview
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
node_modules/
|
||||
orleans.codegen.cs
|
||||
|
||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||
#bower_components/
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file
|
||||
# to a newer Visual Studio version. Backup files are not needed,
|
||||
# because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# GhostDoc plugin setting file
|
||||
*.GhostDoc.xml
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
|
||||
# Visual Studio 6 build log
|
||||
*.plg
|
||||
|
||||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/ModelManifest.xml
|
||||
**/*.Server/GeneratedArtifacts
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
|
||||
# Paket dependency manager
|
||||
.paket/paket.exe
|
||||
paket-files/
|
||||
|
||||
# FAKE - F# Make
|
||||
.fake/
|
||||
|
||||
# JetBrains Rider
|
||||
.idea/
|
||||
*.sln.iml
|
||||
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2023 leejet
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
16
README.md
Normal file
16
README.md
Normal file
@ -0,0 +1,16 @@
|
||||
# StableDiffusion.NET
|
||||
|
||||
Based on
|
||||
https://github.com/seasonjs/stable-diffusion.cpp-build
|
||||
https://github.com/leejet/stable-diffusion.cpp
|
||||
|
||||
## Usage
|
||||
### Setup
|
||||
Run `build.bat` to build the native libs (modify params like CUDA-builds if needed)
|
||||
|
||||
### Example
|
||||
```csharp
|
||||
using StableDiffusionModel sd = new(@"<path_to_model>", new ModelParameter());
|
||||
using StableDiffusionParameter parameter = new StableDiffusionParameter();
|
||||
using Image image = sd.TextToImage("<prompt>", parameter);
|
||||
```
|
||||
25
StableDiffusion.NET.sln
Normal file
25
StableDiffusion.NET.sln
Normal file
@ -0,0 +1,25 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.8.34322.80
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StableDiffusion.NET", "StableDiffusion.NET\StableDiffusion.NET.csproj", "{ED9336F9-7C5F-47DD-A120-272F4835E95F}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{ED9336F9-7C5F-47DD-A120-272F4835E95F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{ED9336F9-7C5F-47DD-A120-272F4835E95F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{ED9336F9-7C5F-47DD-A120-272F4835E95F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{ED9336F9-7C5F-47DD-A120-272F4835E95F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {8DD53974-8766-4659-97B6-4AEDF4323F65}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
20
StableDiffusion.NET/Attributes/NativeName.cs
Normal file
20
StableDiffusion.NET/Attributes/NativeName.cs
Normal file
@ -0,0 +1,20 @@
|
||||
namespace StableDiffusion.NET;
|
||||
|
||||
[AttributeUsage(AttributeTargets.Field)]
|
||||
internal class NativeName : Attribute
|
||||
{
|
||||
#region Properties & Fields
|
||||
|
||||
public string Name { get; set; }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
|
||||
public NativeName(string name)
|
||||
{
|
||||
this.Name = name;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
16
StableDiffusion.NET/Enums/LogLevel.cs
Normal file
16
StableDiffusion.NET/Enums/LogLevel.cs
Normal file
@ -0,0 +1,16 @@
|
||||
namespace StableDiffusion.NET;
|
||||
|
||||
public enum LogLevel
|
||||
{
|
||||
[NativeName("DEBUG")]
|
||||
Debug,
|
||||
|
||||
[NativeName("INFO")]
|
||||
Info,
|
||||
|
||||
[NativeName("WARN")]
|
||||
Warn,
|
||||
|
||||
[NativeName("ERROR")]
|
||||
Error
|
||||
}
|
||||
28
StableDiffusion.NET/Enums/Quantization.cs
Normal file
28
StableDiffusion.NET/Enums/Quantization.cs
Normal file
@ -0,0 +1,28 @@
|
||||
namespace StableDiffusion.NET;
|
||||
|
||||
public enum Quantization
|
||||
{
|
||||
[NativeName("DEFAULT")]
|
||||
Default,
|
||||
|
||||
[NativeName("F32")]
|
||||
F32,
|
||||
|
||||
[NativeName("F16")]
|
||||
F16,
|
||||
|
||||
[NativeName("Q4_0")]
|
||||
Q4_0,
|
||||
|
||||
[NativeName("Q4_1")]
|
||||
Q4_1,
|
||||
|
||||
[NativeName("Q5_0")]
|
||||
Q5_0,
|
||||
|
||||
[NativeName("Q5_1")]
|
||||
Q5_1,
|
||||
|
||||
[NativeName("Q8_0")]
|
||||
Q8_0
|
||||
}
|
||||
10
StableDiffusion.NET/Enums/RngType.cs
Normal file
10
StableDiffusion.NET/Enums/RngType.cs
Normal file
@ -0,0 +1,10 @@
|
||||
namespace StableDiffusion.NET;
|
||||
|
||||
public enum RngType
|
||||
{
|
||||
[NativeName("STD_DEFAULT_RNG")]
|
||||
Standard,
|
||||
|
||||
[NativeName("CUDA_RNG")]
|
||||
Cuda
|
||||
}
|
||||
31
StableDiffusion.NET/Enums/Sampler.cs
Normal file
31
StableDiffusion.NET/Enums/Sampler.cs
Normal file
@ -0,0 +1,31 @@
|
||||
namespace StableDiffusion.NET;
|
||||
|
||||
public enum Sampler
|
||||
{
|
||||
[NativeName("EULER_A")]
|
||||
Euler_A,
|
||||
|
||||
[NativeName("EULER")]
|
||||
Euler,
|
||||
|
||||
[NativeName("HEUN")]
|
||||
Heun,
|
||||
|
||||
[NativeName("DPM2")]
|
||||
DPM2,
|
||||
|
||||
[NativeName("DPMPP2S_A")]
|
||||
DPMPP2SA,
|
||||
|
||||
[NativeName("DPMPP2M")]
|
||||
DPMPP2M,
|
||||
|
||||
[NativeName("DPMPP2Mv2")]
|
||||
DPMPP2Mv2,
|
||||
|
||||
[NativeName("LCM")]
|
||||
LCM,
|
||||
|
||||
[NativeName("N_SAMPLE_METHODS")]
|
||||
N_Sample_Methods
|
||||
}
|
||||
16
StableDiffusion.NET/Enums/Schedule.cs
Normal file
16
StableDiffusion.NET/Enums/Schedule.cs
Normal file
@ -0,0 +1,16 @@
|
||||
namespace StableDiffusion.NET;
|
||||
|
||||
public enum Schedule
|
||||
{
|
||||
[NativeName("DEFAULT")]
|
||||
Default,
|
||||
|
||||
[NativeName("DISCRETE")]
|
||||
Discrete,
|
||||
|
||||
[NativeName("KARRAS")]
|
||||
Karras,
|
||||
|
||||
[NativeName("N_SCHEDULES")]
|
||||
N_Schedules
|
||||
}
|
||||
17
StableDiffusion.NET/Extensions/EnumExtension.cs
Normal file
17
StableDiffusion.NET/Extensions/EnumExtension.cs
Normal file
@ -0,0 +1,17 @@
|
||||
using System.Reflection;
|
||||
|
||||
namespace StableDiffusion.NET;
|
||||
|
||||
internal static class EnumExtension
|
||||
{
|
||||
#region Methods
|
||||
|
||||
public static string? GetNativeName(this Enum value)
|
||||
{
|
||||
FieldInfo? fieldInfo = value.GetType().GetField(value.ToString());
|
||||
NativeName? nativeName = fieldInfo?.GetCustomAttribute<NativeName>();
|
||||
return nativeName?.Name;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
45
StableDiffusion.NET/Image.cs
Normal file
45
StableDiffusion.NET/Image.cs
Normal file
@ -0,0 +1,45 @@
|
||||
namespace StableDiffusion.NET;
|
||||
|
||||
public sealed unsafe class Image : IDisposable
|
||||
{
|
||||
#region Constants
|
||||
|
||||
public const int BPP = 3;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Properties & Fields
|
||||
|
||||
private readonly byte* _imagePtr;
|
||||
|
||||
public int Width { get; }
|
||||
public int Height { get; }
|
||||
|
||||
public ReadOnlySpan<byte> Data => new(_imagePtr, Width * Height * BPP);
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
|
||||
internal Image(byte* ptr, int width, int height)
|
||||
{
|
||||
this._imagePtr = ptr;
|
||||
this.Width = width;
|
||||
this.Height = height;
|
||||
}
|
||||
|
||||
~Image() => Dispose();
|
||||
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Native.stable_diffusion_free_buffer(_imagePtr);
|
||||
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
17
StableDiffusion.NET/ModelParameter.cs
Normal file
17
StableDiffusion.NET/ModelParameter.cs
Normal file
@ -0,0 +1,17 @@
|
||||
namespace StableDiffusion.NET;
|
||||
|
||||
public class ModelParameter
|
||||
{
|
||||
#region Properties & Fields
|
||||
|
||||
public int ThreadCount { get; set; } = 8;
|
||||
public bool VaeDecodeOnly { get; set; } = false;
|
||||
public string TaesdPath { get; set; } = string.Empty;
|
||||
public string LoraModelDir { get; set; } = string.Empty;
|
||||
public RngType RngType { get; set; } = RngType.Standard;
|
||||
public string VaePath { get; set; } = string.Empty;
|
||||
public Quantization Quantization { get; set; } = Quantization.Default;
|
||||
public Schedule Schedule { get; set; } = Schedule.Default;
|
||||
|
||||
#endregion
|
||||
}
|
||||
98
StableDiffusion.NET/Native.cs
Normal file
98
StableDiffusion.NET/Native.cs
Normal file
@ -0,0 +1,98 @@
|
||||
#pragma warning disable CS0169 // Field is never used
|
||||
#pragma warning disable CS8500 // This takes the address of, gets the size of, or declares a pointer to a managed type
|
||||
#pragma warning disable IDE1006
|
||||
#pragma warning disable IDE0051
|
||||
#pragma warning disable IDE0044
|
||||
// ReSharper disable InconsistentNaming
|
||||
// ReSharper disable ArrangeTypeMemberModifiers
|
||||
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace StableDiffusion.NET;
|
||||
|
||||
internal unsafe partial class Native
|
||||
{
|
||||
#region Constants
|
||||
|
||||
private const string LIB_NAME = "sd-abi.dll";
|
||||
|
||||
#endregion
|
||||
|
||||
#region DLL-Import
|
||||
|
||||
internal struct stable_diffusion_ctx;
|
||||
|
||||
internal struct stable_diffusion_full_params
|
||||
{
|
||||
string negative_prompt;
|
||||
float cfg_scale;
|
||||
int width;
|
||||
int height;
|
||||
int sample_method;
|
||||
int sample_steps;
|
||||
long seed;
|
||||
int batch_count;
|
||||
float strength;
|
||||
}
|
||||
|
||||
[LibraryImport(LIB_NAME, EntryPoint = "stable_diffusion_full_default_params_ref")]
|
||||
internal static partial stable_diffusion_full_params* stable_diffusion_full_default_params_ref();
|
||||
|
||||
[LibraryImport(LIB_NAME, EntryPoint = "stable_diffusion_full_params_set_negative_prompt")]
|
||||
internal static partial void stable_diffusion_full_params_set_negative_prompt(stable_diffusion_full_params* @params, [MarshalAs(UnmanagedType.LPStr)] string negative_prompt);
|
||||
|
||||
[LibraryImport(LIB_NAME, EntryPoint = "stable_diffusion_full_params_set_cfg_scale")]
|
||||
internal static partial void stable_diffusion_full_params_set_cfg_scale(stable_diffusion_full_params* @params, float cfg_scale);
|
||||
|
||||
[LibraryImport(LIB_NAME, EntryPoint = "stable_diffusion_full_params_set_width")]
|
||||
internal static partial void stable_diffusion_full_params_set_width(stable_diffusion_full_params* @params, int width);
|
||||
|
||||
[LibraryImport(LIB_NAME, EntryPoint = "stable_diffusion_full_params_set_height")]
|
||||
internal static partial void stable_diffusion_full_params_set_height(stable_diffusion_full_params* @params, int height);
|
||||
|
||||
[LibraryImport(LIB_NAME, EntryPoint = "stable_diffusion_full_params_set_sample_method")]
|
||||
internal static partial void stable_diffusion_full_params_set_sample_method(stable_diffusion_full_params* @params, [MarshalAs(UnmanagedType.LPStr)] string sample_method);
|
||||
|
||||
[LibraryImport(LIB_NAME, EntryPoint = "stable_diffusion_full_params_set_sample_steps")]
|
||||
internal static partial void stable_diffusion_full_params_set_sample_steps(stable_diffusion_full_params* @params, int sample_steps);
|
||||
|
||||
[LibraryImport(LIB_NAME, EntryPoint = "stable_diffusion_full_params_set_seed")]
|
||||
internal static partial void stable_diffusion_full_params_set_seed(stable_diffusion_full_params* @params, long seed);
|
||||
|
||||
[LibraryImport(LIB_NAME, EntryPoint = "stable_diffusion_full_params_set_batch_count")]
|
||||
internal static partial void stable_diffusion_full_params_set_batch_count(stable_diffusion_full_params* @params, int batch_count);
|
||||
|
||||
[LibraryImport(LIB_NAME, EntryPoint = "stable_diffusion_full_params_set_strength")]
|
||||
internal static partial void stable_diffusion_full_params_set_strength(stable_diffusion_full_params* @params, float strength);
|
||||
|
||||
[LibraryImport(LIB_NAME, EntryPoint = "stable_diffusion_init")]
|
||||
internal static partial stable_diffusion_ctx* stable_diffusion_init(int n_threads, [MarshalAs(UnmanagedType.I1)] bool vae_decode_only, [MarshalAs(UnmanagedType.LPStr)] string taesd_path, [MarshalAs(UnmanagedType.I1)] bool free_params_immediately, [MarshalAs(UnmanagedType.LPStr)] string lora_model_dir, [MarshalAs(UnmanagedType.LPStr)] string rng_type);
|
||||
|
||||
[LibraryImport(LIB_NAME, EntryPoint = "stable_diffusion_load_from_file")]
|
||||
[return: MarshalAs(UnmanagedType.I1)]
|
||||
internal static partial bool stable_diffusion_load_from_file(stable_diffusion_ctx* ctx, [MarshalAs(UnmanagedType.LPStr)] string file_path, [MarshalAs(UnmanagedType.LPStr)] string vae_path, [MarshalAs(UnmanagedType.LPStr)] string wtype, [MarshalAs(UnmanagedType.LPStr)] string schedule);
|
||||
|
||||
[LibraryImport(LIB_NAME, EntryPoint = "stable_diffusion_predict_image")]
|
||||
internal static partial byte* stable_diffusion_predict_image(stable_diffusion_ctx* ctx, stable_diffusion_full_params* @params, [MarshalAs(UnmanagedType.LPStr)] string prompt);
|
||||
|
||||
[LibraryImport(LIB_NAME, EntryPoint = "stable_diffusion_image_predict_image")]
|
||||
internal static partial byte* stable_diffusion_image_predict_image(stable_diffusion_ctx* ctx, stable_diffusion_full_params* @params, byte* init_image, [MarshalAs(UnmanagedType.LPStr)] string prompt);
|
||||
|
||||
[LibraryImport(LIB_NAME, EntryPoint = "stable_diffusion_set_log_level")]
|
||||
internal static partial void stable_diffusion_set_log_level([MarshalAs(UnmanagedType.LPStr)] string level);
|
||||
|
||||
[LibraryImport(LIB_NAME, EntryPoint = "stable_diffusion_get_system_info")]
|
||||
[return: MarshalAs(UnmanagedType.LPStr)]
|
||||
internal static partial string stable_diffusion_get_system_info();
|
||||
|
||||
[LibraryImport(LIB_NAME, EntryPoint = "stable_diffusion_free")]
|
||||
internal static partial void stable_diffusion_free(stable_diffusion_ctx* ctx);
|
||||
|
||||
[LibraryImport(LIB_NAME, EntryPoint = "stable_diffusion_free_full_params")]
|
||||
internal static partial void stable_diffusion_free_full_params(stable_diffusion_full_params* @params);
|
||||
|
||||
[LibraryImport(LIB_NAME, EntryPoint = "stable_diffusion_free_buffer")]
|
||||
internal static partial void stable_diffusion_free_buffer(byte* buffer);
|
||||
|
||||
#endregion
|
||||
}
|
||||
66
StableDiffusion.NET/Program.cs
Normal file
66
StableDiffusion.NET/Program.cs
Normal file
@ -0,0 +1,66 @@
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using StableDiffusion.NET;
|
||||
using Image = StableDiffusion.NET.Image;
|
||||
|
||||
using StableDiffusionModel sd = new(@"N:\StableDiffusion\stable-diffusion-webui\models\Stable-diffusion\ghostmix_v20Bakedvae.safetensors",
|
||||
new ModelParameter
|
||||
{
|
||||
Quantization = Quantization.Q5_1,
|
||||
Schedule = Schedule.Karras
|
||||
});
|
||||
|
||||
using StableDiffusionParameter parameter = new StableDiffusionParameter { SampleMethod = Sampler.DPMPP2M };
|
||||
parameter.Width = 768;
|
||||
|
||||
using Image image = sd.TextToImage("der ohne gesicht wo im aquarium schwimmt", parameter);
|
||||
using Bitmap bitmap = ToBitmap2(image);
|
||||
bitmap.Save("test.jpg");
|
||||
|
||||
|
||||
//unsafe
|
||||
//{
|
||||
// Console.WriteLine(Native.stable_diffusion_get_system_info());
|
||||
|
||||
// Native.stable_diffusion_set_log_level("DEBUG");
|
||||
|
||||
// Native.stable_diffusion_ctx* ctx = Native.stable_diffusion_init(16, false, string.Empty, false, string.Empty, "STD_DEFAULT_RNG");
|
||||
|
||||
// Native.stable_diffusion_load_from_file(ctx, @"N:\StableDiffusion\stable-diffusion-webui\models\Stable-diffusion\ghostmix_v20Bakedvae.safetensors", string.Empty, "Q5_1", "KARRAS");
|
||||
|
||||
// Native.stable_diffusion_full_params* @params = Native.stable_diffusion_full_default_params_ref();
|
||||
|
||||
// Native.stable_diffusion_full_params_set_cfg_scale(@params, 7.5f);
|
||||
// Native.stable_diffusion_full_params_set_width(@params, 512);
|
||||
// Native.stable_diffusion_full_params_set_height(@params, 512);
|
||||
// Native.stable_diffusion_full_params_set_batch_count(@params, 1);
|
||||
// Native.stable_diffusion_full_params_set_sample_steps(@params, 30);
|
||||
// Native.stable_diffusion_full_params_set_sample_method(@params, "DPMPP2M");
|
||||
|
||||
// byte* result = Native.stable_diffusion_predict_image(ctx, @params, "a wizard in a purple t-shirt casting a spell that causes a mountain to explode");
|
||||
|
||||
// Span<byte> image = new(result, 512 * 512 * 3);
|
||||
|
||||
// using Bitmap bitmap = ToBitmap(image, 512, 512);
|
||||
// bitmap.Save("test.jpg");
|
||||
|
||||
// Native.stable_diffusion_free_buffer(result);
|
||||
// Native.stable_diffusion_free_full_params(@params);
|
||||
// Native.stable_diffusion_free(ctx);
|
||||
//}
|
||||
|
||||
|
||||
static Bitmap ToBitmap2(Image image) => ToBitmap(image.Data, image.Width, image.Height);
|
||||
|
||||
static unsafe Bitmap ToBitmap(ReadOnlySpan<byte> image, int width, int height)
|
||||
{
|
||||
Bitmap output = new(width, height, PixelFormat.Format24bppRgb);
|
||||
Rectangle rect = new(0, 0, width, height);
|
||||
BitmapData bmpData = output.LockBits(rect, ImageLockMode.ReadWrite, output.PixelFormat);
|
||||
|
||||
nint ptr = bmpData.Scan0;
|
||||
image.CopyTo(new Span<byte>((void*)ptr, width * height * 3));
|
||||
|
||||
output.UnlockBits(bmpData);
|
||||
return output;
|
||||
}
|
||||
15
StableDiffusion.NET/StableDiffusion.NET.csproj
Normal file
15
StableDiffusion.NET/StableDiffusion.NET.csproj
Normal file
@ -0,0 +1,15 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="System.Drawing.Common" Version="8.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@ -0,0 +1,4 @@
|
||||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=attributes/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=enums/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=extensions/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
||||
66
StableDiffusion.NET/StableDiffusion.cs
Normal file
66
StableDiffusion.NET/StableDiffusion.cs
Normal file
@ -0,0 +1,66 @@
|
||||
namespace StableDiffusion.NET;
|
||||
|
||||
public sealed unsafe class StableDiffusionModel : IDisposable
|
||||
{
|
||||
#region Properties & Fields
|
||||
|
||||
private readonly string _modelPath;
|
||||
private readonly ModelParameter _parameter;
|
||||
|
||||
private Native.stable_diffusion_ctx* _ctx;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
|
||||
public StableDiffusionModel(string modelPath, ModelParameter parameter)
|
||||
{
|
||||
this._modelPath = modelPath;
|
||||
this._parameter = parameter;
|
||||
|
||||
Initialize();
|
||||
}
|
||||
|
||||
~StableDiffusionModel() => Dispose();
|
||||
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
|
||||
private void Initialize()
|
||||
{
|
||||
_ctx = Native.stable_diffusion_init(_parameter.ThreadCount, _parameter.VaeDecodeOnly, _parameter.TaesdPath, false, _parameter.LoraModelDir, _parameter.RngType.GetNativeName() ?? "STD_DEFAULT_RNG");
|
||||
if (_ctx == null) throw new NullReferenceException("Failed to initialize Stable Diffusion");
|
||||
|
||||
bool success = Native.stable_diffusion_load_from_file(_ctx, _modelPath, _parameter.VaePath, _parameter.Quantization.GetNativeName() ?? "DEFAULT", _parameter.Schedule.GetNativeName() ?? "DEFAULT");
|
||||
if (!success) throw new IOException("Failed to load model");
|
||||
}
|
||||
|
||||
public Image TextToImage(string prompt, StableDiffusionParameter parameter)
|
||||
{
|
||||
byte* result = Native.stable_diffusion_predict_image(_ctx, parameter.ParamPtr, prompt);
|
||||
return new Image(result, parameter.Width, parameter.Height);
|
||||
}
|
||||
|
||||
public Image ImageToImage(string prompt, Span<byte> image, StableDiffusionParameter parameter)
|
||||
{
|
||||
fixed (byte* imagePtr = image)
|
||||
{
|
||||
byte* result = Native.stable_diffusion_image_predict_image(_ctx, parameter.ParamPtr, imagePtr, prompt);
|
||||
return new Image(result, parameter.Width, parameter.Height);
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Native.stable_diffusion_free(_ctx);
|
||||
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
public static string GetSystemInfo() => Native.stable_diffusion_get_system_info();
|
||||
|
||||
public static void SetLogLevel(LogLevel level) => Native.stable_diffusion_set_log_level(level.GetNativeName() ?? "ERROR");
|
||||
|
||||
#endregion
|
||||
}
|
||||
145
StableDiffusion.NET/StableDiffusionParameter.cs
Normal file
145
StableDiffusion.NET/StableDiffusionParameter.cs
Normal file
@ -0,0 +1,145 @@
|
||||
namespace StableDiffusion.NET;
|
||||
|
||||
public sealed unsafe class StableDiffusionParameter : IDisposable
|
||||
{
|
||||
#region Properties & Fields
|
||||
|
||||
#pragma warning disable CS8500 // This takes the address of, gets the size of, or declares a pointer to a managed type
|
||||
internal readonly Native.stable_diffusion_full_params* ParamPtr;
|
||||
#pragma warning restore CS8500 // This takes the address of, gets the size of, or declares a pointer to a managed type
|
||||
|
||||
private string _negativePrompt;
|
||||
public string NegativePrompt
|
||||
{
|
||||
get => _negativePrompt;
|
||||
set
|
||||
{
|
||||
_negativePrompt = value;
|
||||
Native.stable_diffusion_full_params_set_negative_prompt(ParamPtr, _negativePrompt);
|
||||
}
|
||||
}
|
||||
|
||||
private float _cfgScale;
|
||||
public float CfgScale
|
||||
{
|
||||
get => _cfgScale;
|
||||
set
|
||||
{
|
||||
_cfgScale = value;
|
||||
Native.stable_diffusion_full_params_set_cfg_scale(ParamPtr, _cfgScale);
|
||||
}
|
||||
}
|
||||
|
||||
private int _width;
|
||||
public int Width
|
||||
{
|
||||
get => _width;
|
||||
set
|
||||
{
|
||||
_width = value;
|
||||
Native.stable_diffusion_full_params_set_width(ParamPtr, _width);
|
||||
}
|
||||
}
|
||||
|
||||
private int _height;
|
||||
public int Height
|
||||
{
|
||||
get => _height;
|
||||
set
|
||||
{
|
||||
_height = value;
|
||||
Native.stable_diffusion_full_params_set_height(ParamPtr, _height);
|
||||
}
|
||||
}
|
||||
|
||||
private Sampler _sampleMethod;
|
||||
public Sampler SampleMethod
|
||||
{
|
||||
get => _sampleMethod;
|
||||
set
|
||||
{
|
||||
_sampleMethod = value;
|
||||
Native.stable_diffusion_full_params_set_sample_method(ParamPtr, _sampleMethod.GetNativeName() ?? "EULER_A");
|
||||
}
|
||||
}
|
||||
|
||||
private int _sampleSteps;
|
||||
public int SampleSteps
|
||||
{
|
||||
get => _sampleSteps;
|
||||
set
|
||||
{
|
||||
_sampleSteps = value;
|
||||
Native.stable_diffusion_full_params_set_sample_steps(ParamPtr, _sampleSteps);
|
||||
}
|
||||
}
|
||||
|
||||
private long _seed;
|
||||
public long Seed
|
||||
{
|
||||
get => _seed;
|
||||
set
|
||||
{
|
||||
_seed = value;
|
||||
Native.stable_diffusion_full_params_set_seed(ParamPtr, _seed);
|
||||
}
|
||||
}
|
||||
|
||||
private int _batchCount;
|
||||
public int BatchCount
|
||||
{
|
||||
get => _batchCount;
|
||||
set
|
||||
{
|
||||
_batchCount = value;
|
||||
Native.stable_diffusion_full_params_set_batch_count(ParamPtr, _batchCount);
|
||||
}
|
||||
}
|
||||
|
||||
private float _strength;
|
||||
public float Strength
|
||||
{
|
||||
get => _strength;
|
||||
set
|
||||
{
|
||||
_strength = value;
|
||||
Native.stable_diffusion_full_params_set_strength(ParamPtr, _strength);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
|
||||
#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
|
||||
public StableDiffusionParameter()
|
||||
{
|
||||
ParamPtr = Native.stable_diffusion_full_default_params_ref();
|
||||
|
||||
NegativePrompt = string.Empty;
|
||||
CfgScale = 7.5f;
|
||||
Width = 512;
|
||||
Height = 512;
|
||||
SampleMethod = Sampler.Euler_A;
|
||||
SampleSteps = 25;
|
||||
Seed = -1;
|
||||
BatchCount = 1;
|
||||
Strength = 0.7f;
|
||||
}
|
||||
#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
|
||||
|
||||
~StableDiffusionParameter() => Dispose();
|
||||
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Native.stable_diffusion_free_full_params(ParamPtr);
|
||||
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
26
build.bat
Normal file
26
build.bat
Normal file
@ -0,0 +1,26 @@
|
||||
if not exist stable-diffusion.cpp-build (
|
||||
git clone https://github.com/seasonjs/stable-diffusion.cpp-build
|
||||
)
|
||||
|
||||
cd stable-diffusion.cpp-build
|
||||
git checkout 4b95d98404bbfe91698fd41b0f514656e358163a
|
||||
|
||||
if not exist build (
|
||||
mkdir build
|
||||
)
|
||||
|
||||
cd build
|
||||
|
||||
rem remove -DSD_CUBLAS=ON to disable cuda support
|
||||
cmake .. -DCMAKE_BUILD_TYPE=Release -DSD_CUBLAS=ON
|
||||
cmake --build . --config Release
|
||||
|
||||
cd ..\..
|
||||
|
||||
dotnet publish -c Release -o bin
|
||||
|
||||
copy .\stable-diffusion.cpp-build\build\bin\Release\sd-abi.dll .\StableDiffusion.NET\bin\Debug\net8.0\sd-abi.dll
|
||||
copy .\stable-diffusion.cpp-build\build\bin\Release\sd-abi.dll .\StableDiffusion.NET\bin\Debug\net8.0\sd-abi.dll
|
||||
copy .\stable-diffusion.cpp-build\build\bin\Release\sd-abi.dll .\StableDiffusion.NET\bin\Debug\net8.0\sd-abi.dll
|
||||
|
||||
pause
|
||||
Loading…
x
Reference in New Issue
Block a user