使用.NET C#和Open AI的DALL-E模型生成图像的步骤

释放双眼,带上耳机,听听看~!
通过使用.NET C#,我们可以开发一个POC(概念验证),使用Open AI的DALL-E模型从文本输入生成图像。本文将介绍使用Open AI的DALL-E模型开发一个C# Console Application,生成图像的步骤。

通过使用.NET C#,我们可以开发一个POC(概念验证),使用Open AI的DALL-E模型从文本输入生成图像。

在这篇博文中,我们将探讨使用Open AI的DALL-E模型开发一个C#Console Application ,从文本中生成图像的步骤。

💬 什么是Open AI的DALL-E?

DALL-E几乎可以生成任何东西的图像,从黄色的潜水艇到有翅膀的猪。它已经在大量的图像和文本描述的数据集上进行了训练,使它能够学习如何从自然语言输入中生成图像。在这篇文章中,我们将探讨如何将C#与DALL-E结合起来,用代码生成图像。

使用.NET C#和Open AI的DALL-E模型生成图像的步骤

DALL-E生成的

🧵用C语言开发

在这个项目中,我们将使用Visual Studio和C#与.NET 6来创建一个控制台应用程序。

💡 如果你打算使用其他.NET版本,你可能需要做一些调整。

第1步:控制台应用程序和依赖性

让我们用C#和.NET 6创建我们的控制台应用程序,让我们安装依赖性。

项目名称: ConsoleAppOpenAI.DALL_E

dotnet add Microsoft.Extensions.Http

👇 these are for loading configuration from JSON files
dotnet add Microsoft.Extensions.Configuration
dotnet add Microsoft.Extensions.Configuration.Json

👇 this is optional
dotnet add Microsoft.Extensions.Configuration.UserSecrets

进入全屏模式 退出全屏模式

安装依赖项的命令

使用.NET C#和Open AI的DALL-E模型生成图像的步骤

已安装的依赖项

步骤2:IOpenAIProxy接口

在这个接口中,我们将只公开从Open AI生成和下载图片的方法。

namespace ConsoleAppOpenAI.DALL_E.HttpServices;

public interface IOpenAIProxy
{
    //👇 Send the Prompt Text with and return a list of image URLs
    Task<GenerateImageResponse> GenerateImages(
        GenerateImageRequest prompt, 
        CancellationToken cancellation = default);

    //👇 Download the Image as byte array
    Task<byte[]> DownloadImage(string url);
}

进入全屏模式 退出全屏模式

IOpenAIProxy.cs文件

第3步:生成图像模型

让我们用记录来定义我们的模型。记录简化了阅读,因为它们只是POCO类。

namespace ConsoleAppOpenAI.DALL_E.HttpServices
{
    public record class GenerateImageRequest(
        string Prompt, 
        int N, 
        string Size);

    public record class GenerateImageResponse(
        long Created, 
        GeneratedImageData[] Data);

    public record class GeneratedImageData(string Url);
}

进入全屏模式 退出全屏模式

生成图像模型DTO

第4步:创建一个Open AI账户

为了使用OpenAI的API,我们需要在OpenAI平台上创建一个账户。注册过程很简单,在几分钟内就可以完成。

  • 我们只需要访问OpenAI的网站:platform.openai.com/overview。
  • 然后点击右上角的 “注册 “按钮。
  • 点击该按钮,开始注册过程。

第5步:设置配置文件/appsettings.json

为了访问DALL-E模型,我们需要为我们的应用程序设置订阅ID和API密钥。

从这些菜单中收集它们:

使用.NET C#和Open AI的DALL-E模型生成图像的步骤

用这些值更新appsettings.json 或secrets.json 文件。

{
  "OpenAi": {

    "OrganizationId": "{Subscription Id goes here}",
    "ApiKey": "{API Key goes here}",

    "Url": "https://api.openai.com",
    "DALL-E": {
      "Size": "1024x1024",
      "N": 1
    }
  }
}

进入全屏模式 退出全屏模式

appsettings.json文件

💡 不要忘记将复制到输出目录设置为Copy if newerfor appsettings.json。

第6步:打开AI HTTP服务实现

创建一个名为OpenAIHttpService 的类,有一个接收IConfiguration 的构造函数,并读取我们刚才设置的配置。

using ConsoleAppOpenAI.DALL_E.HttpServices;
using Microsoft.Extensions.Configuration;
using System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json;

namespace ConsoleAppOpenAI.DALL_E.Services;

public class OpenAIHttpService : IOpenAIProxy
{
    readonly HttpClient _httpClient;

    readonly string _subscriptionId;

    readonly string _apiKey;

    public OpenAIHttpService(IConfiguration configuration)
    {
        //👇 reading settings from the configuration file
        var openApiUrl = configuration["OpenAi:Url"] ?? throw new ArgumentException(nameof(configuration));
        _httpClient = new HttpClient { BaseAddress = new Uri(openApiUrl) };

        _subscriptionId = configuration["OpenAi:SubscriptionId"];
        _apiKey = configuration["OpenAi:ApiKey"];
    }

    public async Task<GenerateImageResponse> GenerateImages(GenerateImageRequest prompt, CancellationToken cancellation = default)
    {
        throw new NotImplementedException();
    }

    public async Task<byte[]> DownloadImage(string url)
    {
        throw new NotImplementedException();
    }
}

进入全屏模式 退出全屏模式

接下来应该是GenerateImages() 方法的实现:

public async Task<GenerateImageResponse> GenerateImages(GenerateImageRequest prompt, CancellationToken cancellation = default)
{
    using var rq = new HttpRequestMessage(HttpMethod.Post, "/v1/images/generations");

    var jsonRequest = JsonSerializer.Serialize(prompt, new JsonSerializerOptions
    {
        PropertyNamingPolicy = JsonNamingPolicy.CamelCase
    });

    //serialize the content to JSON and set the correct content type
    rq.Content = new StringContent(jsonRequest);
    rq.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

    //👇 Including the Authorization Header with API Key
    var apiKey = _apiKey;
    rq.Headers.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);

    //👇 Including the Subscription Id Header
    var subscriptionId = _subscriptionId;
    rq.Headers.TryAddWithoutValidation("OpenAI-Organization", subscriptionId);

    var response = await _httpClient.SendAsync(rq, HttpCompletionOption.ResponseHeadersRead, cancellation);

    response.EnsureSuccessStatusCode();

    var content = response.Content;

    var jsonResponse = await content.ReadFromJsonAsync<GenerateImageResponse>(cancellationToken: cancellation);

    return jsonResponse;
}

进入全屏模式 退出全屏模式

最后是DownloadImage() 方法的实现:

public async Task<byte[]> DownloadImage(string url)
{
    var buffer = await _httpClient.GetByteArrayAsync(url);

    return buffer;
}

进入全屏模式 退出全屏模式

第7步:消耗API

回到Program.cs 文件,让我们把所有东西连在一起,开始调用 API 来生成图像。

using ConsoleAppOpenAI.DALL_E.HttpServices;
using ConsoleAppOpenAI.DALL_E.Services;
using Microsoft.Extensions.Configuration;
using System.Reflection;

Console.WriteLine("Starting commandline for DALL-E [Open AI]");

var config = BuildConfig();

IOpenAIProxy aiClient = new OpenAIHttpService(config);

Console.WriteLine("Type your first Prompt");
var msg = Console.ReadLine();

var nImages = int.Parse(config["OpenAi:DALL-E:N"]);
var imageSize = config["OpenAi:DALL-E:Size"];
var prompt = new GenerateImageRequest(msg, nImages, imageSize);

var result = await aiClient.GenerateImages(prompt);

foreach (var item in result.Data)
{
    Console.WriteLine(item.Url);

    var fullPath = Path.Combine(Directory.GetCurrentDirectory(), $"{Guid.NewGuid()}.png");
    var img = await aiClient.DownloadImage(item.Url);

    await File.WriteAllBytesAsync(fullPath, img);

    Console.WriteLine("New image saved at {0}", fullPath);
}

Console.WriteLine("Press any key to exit");
Console.ReadKey();

static IConfiguration BuildConfig()
{
    var dir = Directory.GetCurrentDirectory();
    var configBuilder = new ConfigurationBuilder()
        .AddJsonFile(Path.Combine(dir, "appsettings.json"), optional: false)
        .AddUserSecrets(Assembly.GetExecutingAssembly());

    return configBuilder.Build();
}

进入全屏模式 退出全屏模式

做完这些,我们应该有一个与DALL-E模型集成的运行POC。

生成我们的第一个图像

这是我第一次尝试的输出。

Prompt: Wide and green garden with a lot of flowers, with sunflowers, and a small dog running around

进入全屏模式 退出全屏模式

看看这个由我们的应用程序和DALL-E生成的美丽图像。

使用.NET C#和Open AI的DALL-E模型生成图像的步骤
生成的DALL-E

总结

将C#与DALL-E集成是一个简单的过程,它允许我们以编程方式生成图像。

通过使用Open AI的API,我们可以轻松地发送文本描述,并收到高质量的图像作为回应。

这种整合开辟了许多可能性,如为数据可视化生成图像,创建自定义艺术品,或自动化图像创建任务。随着DALL-E的不断完善,我们可以期待未来有更多令人兴奋的应用。

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

微软Build 2023中的Windows Copilot引领PC交互革命

2023-12-21 18:41:14

AI教程

PyTorch落地Linux基金会,AI社区讨论十年后的技术发展

2023-12-21 18:54:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索