Поделиться через


Начало работы с искусственным интеллектом

Функции визуализации в Windows AI Foundry поддерживают следующие возможности:

Дополнительные сведения об API см. в справочнике по API для функций создания образов искусственного интеллекта.

Сведения о модерации содержимого см. в разделе "Безопасность содержимого" с помощью api создания искусственного интеллекта.

Внимание

Требования к манифесту пакета: Чтобы использовать API создания изображений Windows AI, ваше приложение должно быть упаковано в формате пакета MSIX с systemAIModels возможностью, объявленной в Package.appxmanifest. Кроме того, убедитесь, что атрибут манифеста MaxVersionTested установлен на актуальную версию Windows (например, 10.0.26226.0 или более позднюю), чтобы правильно поддерживать функции ИИ Windows. Использование старых значений может привести к ошибкам "Не объявленные приложением" при загрузке модели.

<Dependencies>
  <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.17763.0" MaxVersionTested="10.0.26226.0" />
  <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.26226.0" />
</Dependencies>

Что можно сделать с суперразрешением изображения?

API-интерфейсы суперснимания изображений позволяют увеличить и масштабировать изображения.

Масштабирование ограничено максимальным коэффициентом 8x, так как более высокие коэффициенты масштабирования могут привести к артефактам и компрометации точности изображения. Если окончательная ширина или высота больше 8x исходных значений, будет создано исключение.

Пример суперразрешения изображений

В следующем примере показано, как изменить масштаб (targetWidth,) targetHeightсуществующего растрового изображения программного обеспечения () и улучшить резкость изображения с помощью softwareBitmap объекта (ImageScalerдля повышения резкости без масштабирования изображения, просто укажите существующую ширину и высоту изображения).

  1. Убедитесь, что модель разрешения изображений доступна, вызвав метод GetReadyState , а затем дождитесь успешного возврата метода EnsureReadyAsync .

  2. После того как модель суперразрежение изображений будет доступна, создайте объект ImageScaler , чтобы ссылаться на него.

  3. Получите точимую и масштабируемую версию существующего изображения, передав существующий образ и нужную ширину и высоту модели с помощью метода ScaleSoftwareBitmap .

using Microsoft.Graphics.Imaging;
using Microsoft.Windows.Management.Deployment;
using Microsoft.Windows.AI;
using Windows.Graphics.Imaging;

if (ImageScaler.GetReadyState() == AIFeatureReadyState.EnsureNeeded) 
{
    var result = await ImageScaler.EnsureReadyAsync();
    if (result.Status != PackageDeploymentStatus.CompletedSuccess)
    {
        throw result.ExtendedError;
    }
}
ImageScaler imageScaler = await ImageScaler.CreateAsync();
SoftwareBitmap finalImage = imageScaler.ScaleSoftwareBitmap(softwareBitmap, targetWidth, targetHeight);
#include <winrt/Microsoft.Graphics.Imaging.h>
#include <winrt/Microsoft.Windows.AI.h>
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Graphics.Imaging.h>

using namespace winrt::Microsoft::Graphics::Imaging;
using namespace winrt::Microsoft::Windows::AI;
using namespace winrt::Windows::Foundation; 
using namespace winrt::Windows::Graphics::Imaging; 

if (ImageScaler::GetReadyState() == AIFeatureReadyState::NotReady)
{
    auto loadResult = ImageScaler::EnsureReadyAsync().get();

    if (loadResult.Status() != AIFeatureReadyResultState::Success)
    {
        throw winrt::hresult_error(loadResult.ExtendedError());
    }
}
int targetWidth = 100;
int targetHeight = 100;
ImageScaler imageScaler = ImageScaler::CreateAsync().get();
Windows::Graphics::Imaging::SoftwareBitmap finalImage = 
    imageScaler.ScaleSoftwareBitmap(softwareBitmap, targetWidth, targetHeight);

Что можно сделать с описанием изображения?

Внимание

Описание изображения в настоящее время недоступно в Китае.

API описания изображений предоставляют возможность создавать различные типы текстовых описаний для изображения.

Поддерживаются следующие типы текстовых описаний:

  • Краткое описание , подходящее для диаграмм и схем.
  • Подробное описание: предоставляет развернутое описание.
  • Схема — предоставляет краткое описание, подходящее для заголовка изображения. Значение по умолчанию, если значение не указано.
  • Доступно . Предоставляет длинное описание с подробными сведениями, предназначенными для пользователей с потребностями специальных возможностей.

Так как эти API используют модели машинного обучения, иногда могут возникать ошибки, в которых текст не описывает изображение правильно. Поэтому мы не рекомендуем использовать эти API для образов в следующих сценариях:

  • Где изображения содержат потенциально конфиденциальное содержимое и неточные описания могут быть спорными, такими как флаги, карты, глобусы, культурные символы или религиозные символы.
  • Если точные описания являются критически важными, например для медицинских консультаций или диагностики, юридического содержимого или финансовых документов.

Пример описания изображения

В следующем примере показано, как получить текстовое описание изображения на основе указанного типа описания (необязательно) и уровня модерации содержимого (необязательно).

Примечание.

Изображение должно быть объектом ImageBuffer , так как SoftwareBitmap в настоящее время не поддерживается (в этом примере показано, как преобразовать SoftwareBitmap в ImageBuffer).

  1. Убедитесь, что модель разрешения изображений доступна, вызвав метод GetReadyState , а затем дождитесь успешного возврата метода EnsureReadyAsync .

  2. После того как модель суперразрешения изображений будет доступна, создайте объект ImageDescriptionGenerator , чтобы ссылаться на него.

  3. (Необязательно) Создайте объект ContentFilterOptions и укажите предпочитаемые значения. Если вы решили использовать значения по умолчанию, можно передать null-объект.

  4. Получите описание изображения (LanguageModelResponse.Response), вызвав метод DescriptionAsync , указывающий исходный образ, ImageDescriptionKind (необязательное значение для предпочтительного типа описания) и объект ContentFilterOptions (необязательно).

using Microsoft.Graphics.Imaging;
using Microsoft.Windows.Management.Deployment;  
using Microsoft.Windows.AI;
using Microsoft.Windows.AI.ContentModeration;
using Windows.Storage.StorageFile;  
using Windows.Storage.Streams;  
using Windows.Graphics.Imaging;

if (ImageDescriptionGenerator.GetReadyState() == AIFeatureReadyState.EnsureNeeded) 
{
    var result = await ImageDescriptionGenerator.EnsureReadyAsync();
    if (result.Status != PackageDeploymentStatus.CompletedSuccess)
    {
        throw result.ExtendedError;
    }
}

ImageDescriptionGenerator imageDescriptionGenerator = await ImageDescriptionGenerator.CreateAsync();

// Convert already available softwareBitmap to ImageBuffer.
ImageBuffer inputImage = ImageBuffer.CreateCopyFromBitmap(softwareBitmap);  

// Create content moderation thresholds object.
ContentFilterOptions filterOptions = new ContentFilterOptions();
filterOptions.PromptMinSeverityLevelToBlock.ViolentContentSeverity = SeverityLevel.Medium;
filterOptions.ResponseMinSeverityLevelToBlock.ViolentContentSeverity = SeverityLevel.Medium;

// Get text description.
LanguageModelResponse languageModelResponse = await imageDescriptionGenerator.DescribeAsync(inputImage, ImageDescriptionScenario.Caption, filterOptions);
string response = languageModelResponse.Response;

#include <winrt/Microsoft.Graphics.Imaging.h>
#include <winrt/Microsoft.Windows.AI.Imaging.h>
#include <winrt/Microsoft.Windows.AI.ContentSafety.h>
#include <winrt/Microsoft.Windows.AI.h>
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Graphics.Imaging.h> 
#include <winrt/Windows.Storage.Streams.h>
#include <winrt/Windows.Storage.StorageFile.h>

using namespace winrt::Microsoft::Graphics::Imaging; 
using namespace winrt::Microsoft::Windows::AI;
using namespace winrt::Microsoft::Windows::AI::ContentSafety; 
using namespace winrt::Microsoft::Windows::AI::Imaging; 
using namespace winrt::Windows::Foundation; 
using namespace winrt::Windows::Graphics::Imaging;
using namespace winrt::Windows::Storage::Streams;
using namespace winrt::Windows::Storage::StorageFile;    

if (ImageDescriptionGenerator::GetReadyState() == AIFeatureReadyState::NotReady)
{
    auto loadResult = ImageDescriptionGenerator::EnsureReadyAsync().get();
    auto loadResult = ImageScaler::EnsureReadyAsync().get();

    if (loadResult.Status() != AIFeatureReadyResultState::Success)
    {
        throw winrt::hresult_error(loadResult.ExtendedError());
    }
}

ImageDescriptionGenerator imageDescriptionGenerator = 
    ImageDescriptionGenerator::CreateAsync().get();

// Convert already available softwareBitmap to ImageBuffer.
auto inputBuffer = Microsoft::Graphics::Imaging::ImageBuffer::CreateForSoftwareBitmap(bitmap); (softwareBitmap);

// Create content moderation thresholds object.

ContentFilterOptions contentFilter{};
contentFilter.PromptMaxAllowedSeverityLevel().Violent(SeverityLevel::Medium);
contentFilter.ResponseMaxAllowedSeverityLevel().Violent(SeverityLevel::Medium);

// Get text description.
auto response = imageDescriptionGenerator.DescribeAsync(inputImage, ImageDescriptionKind::BriefDescription, contentFilter).get();
string text = response.Description();

Что можно сделать с сегментацией изображений?

Сегментация изображений может использоваться для идентификации определенных объектов в изображении. Модель принимает как изображение, так и объект "подсказки" и возвращает маску идентифицированного объекта.

Подсказки можно предоставить с помощью любого сочетания следующих значений:

  • Координаты для точек, принадлежащих к определяемому вами элементу.
  • Координаты для точек, которые не относятся к определяемому вами элементу.
  • Прямоугольник координаты, включающий определяемый вами объект.

Чем больше подсказок вы предоставляете, тем более точной может быть модель. Следуйте этим советам, чтобы минимизировать неточные результаты или ошибки.

  • Избегайте использования нескольких прямоугольников в подсказке, так как они могут создавать неточные маски.
  • Избегайте использования точек исключения исключительно без включения точек или прямоугольника.
  • Не указывайте больше, чем поддерживаемые максимум 32 координат (1 для точки, 2 для прямоугольника), так как это приведет к ошибке.

Возвращаемая маска находится в формате серой шкалы-8 с пикселями маски для идентифицированного объекта со значением 255 (все остальные имеют значение 0).

Пример сегментации изображений

В следующих примерах показаны способы идентификации объекта в изображении. В примерах предполагается, что у вас уже есть объект растрового изображения программного обеспечения (softwareBitmap) для входных данных.

  1. Убедитесь, что модель сегментации изображений доступна путем вызова метода GetReadyState и ожидания успешного возврата метода EnsureReadyAsync .

  2. После того как модель сегментации изображений будет доступна, создайте объект ImageObjectExtractor , чтобы ссылаться на него.

  3. Передайте изображение CreateWithSoftwareBitmapAsync.

  4. Создайте объект ImageObjectExtractorHint . Далее показаны другие способы создания объекта подсказки с различными входными данными.

  5. Отправьте указание модели с помощью метода GetSoftwareBitmapObjectMask , который возвращает окончательный результат.

using Microsoft.Graphics.Imaging;
using Microsoft.Windows.AI;
using Microsoft.Windows.Management.Deployment;
using Windows.Graphics.Imaging;

if (ImageObjectExtractor::GetReadyState() == AIFeatureReadyState.EnsureNeeded) 
{
    var result = await ImageObjectExtractor.EnsureReadyAsync();
    if (result.Status != PackageDeploymentStatus.CompletedSuccess)
    {
        throw result.ExtendedError;
    }
}

ImageObjectExtractor imageObjectExtractor = await ImageObjectExtractor.CreateWithSoftwareBitmapAsync(softwareBitmap);

ImageObjectExtractorHint hint = new ImageObjectExtractorHint{
    includeRects: null, 
    includePoints:
        new List<PointInt32> { new PointInt32(306, 212),
                               new PointInt32(216, 336)},
    excludePoints: null};
    SoftwareBitmap finalImage = imageObjectExtractor.GetSoftwareBitmapObjectMask(hint);
#include <winrt/Microsoft.Graphics.Imaging.h> 
#include <winrt/Microsoft.Windows.AI.Imaging.h>
#include <winrt/Windows.Graphics.Imaging.h>
#include <winrt/Windows.Foundation.h>
using namespace winrt::Microsoft::Graphics::Imaging; 
using namespace winrt::Microsoft::Windows::AI.Imaging;
using namespace winrt::Windows::Graphics::Imaging; 
using namespace winrt::Windows::Foundation;

if (ImageObjectExtractor::GetReadyState() == AIFeatureReadyState::NotReady)
{
    auto loadResult = ImageObjectExtractor::EnsureReadyAsync().get();

    if (loadResult.Status() != AIFeatureReadyResultState::Success)
    {
        throw winrt::hresult_error(loadResult.ExtendedError());
    }
}

ImageObjectExtractor imageObjectExtractor = ImageObjectExtractor::CreateWithSoftwareBitmapAsync(softwareBitmap).get();

ImageObjectExtractorHint hint(
    {},
    {
        Windows::Graphics::PointInt32{306, 212},        
        Windows::Graphics::PointInt32{216, 336}
    },
    {}
);

Windows::Graphics::Imaging::SoftwareBitmap finalImage = imageObjectExtractor.GetSoftwareBitmapObjectMask(hint);

Указание подсказок с включенными и исключенными точками

В этом фрагменте кода показано, как использовать как включенные, так и исключенные точки в качестве подсказок.

ImageObjectExtractorHint hint(
    includeRects: null,
    includePoints: 
        new List<PointInt32> { new PointInt32(150, 90), 
                               new PointInt32(216, 336), 
                               new PointInt32(550, 330)},
    excludePoints: 
        new List<PointInt32> { new PointInt32(306, 212) });
ImageObjectExtractorHint hint(
    {}, 
    { 
        PointInt32{150, 90}, 
        PointInt32{216, 336}, 
        PointInt32{550, 330}
    },
    { 
        PointInt32{306, 212}
    }
);

Указание подсказок с прямоугольником

В этом фрагменте кода показано, как использовать прямоугольник (RectInt32 является X, Y, Width, Height) в качестве указания.

ImageObjectExtractorHint hint(
    includeRects: 
        new List<RectInt32> {new RectInt32(370, 278, 285, 126)},
    includePoints: null,
    excludePoints: null ); 
ImageObjectExtractorHint hint(
    { 
        RectInt32{370, 278, 285, 126}
    }, 
    {},
    {}
);

Что можно сделать при помощи средства извлечения переднего плана изображения?

Используйте ImageForegroundExtractor для сегментирования переднего плана входного изображения и включения таких функций, как удаление фона и создание наклейки.

Возвращаемая маска находится в формате оттенков серого с глубиной 8 бит. Значения пикселей варьируются от 0 до 255, где 0 представляет фоновые пиксели, 255 представляет пиксели переднего плана, а промежуточные значения указывают на сочетание переднего плана и фоновых пикселей.

Создание маски из растрового изображения

  1. Вызовите GetReadyState и дождитесь, пока EnsureReadyAsync успешно завершится, чтобы убедиться, что объект ImageForegroundExtractor готов.
  2. После готовности модели вызовите CreateAsync , чтобы создать экземпляр объекта ImageForegroundExtractor.
  3. Вызовите GetMaskFromSoftwareBitmap с входным изображением, чтобы создать маску переднего плана.
using Microsoft.Windows.AI.Imaging;
using Microsoft.Windows.AI;

if (ImageForegroundExtractor.GetReadyState() == AIFeatureReadyState.NotReady)
{
    var result  = await ImageForegroundExtractor.EnsureReadyAsync();
    if (result.Status != AIFeatureReadyResultState.Success)
    {
        throw result.ExtendedError;
    }
}

var model = await ImageForegroundExtractor.CreateAsync();

// Insert your own softwareBitmap here.
var foregroundMask = model.GetMaskFromSoftwareBitmap(softwareBitmap);
#include <winrt/Microsoft.Graphics.Imaging.h> 
#include <winrt/Microsoft.Windows.AI.Imaging.h>
#include <winrt/Windows.Graphics.Imaging.h>
#include <winrt/Windows.Foundation.h>
using namespace winrt::Microsoft::Graphics::Imaging; 
using namespace winrt::Microsoft::Windows::AI.Imaging;
using namespace winrt::Windows::Graphics::Imaging; 
using namespace winrt::Windows::Foundation;

if (ImageForegroundExtractor::GetReadyState() == AIFeatureReadyState::NotReady)
{
    auto loadResult = ImageForegroundExtractor::EnsureReadyAsync().get();

    if (loadResult.Status() != AIFeatureReadyResultState::Success)
    {
        throw winrt::hresult_error(loadResult.ExtendedError());
    }
}

auto model = co_await ImageForegroundExtractor::CreateAsync();

// Insert your own softwareBitmap here.
auto foregroundMask = model.GetMaskFromSoftwareBitmap(softwareBitmap);

Что можно сделать с удалением объектов?

Удаление объектов можно использовать для удаления объектов из изображений. Модель принимает как изображение, так и маску с серой шкалой, указывающую на удаление объекта, удаляет маскированную область из изображения и заменяет стертую область фоном изображения.

Пример удаления объектов

В следующем примере показано, как удалить объект из изображения. В примере предполагается, что у вас уже есть объекты растрового изображения программного обеспечения (softwareBitmap) для изображения и маски. Маска должна быть в формате Gray8, где каждому пикселю области, подлежащей удалению, присвоено значение 255, а всем остальным пикселям — 0.

  1. Убедитесь, что модель сегментации изображений доступна путем вызова метода GetReadyState и ожидания успешного возврата метода EnsureReadyAsync .
  2. После того как модель удаления объектов будет доступна, создайте объект ImageObjectRemover , чтобы ссылаться на него.
  3. Наконец, отправьте изображение и маску в модель с помощью метода RemoveFromSoftwareBitmap , который возвращает окончательный результат.
using Microsoft.Graphics.Imaging;
using Microsoft.Windows.AI;
using Microsoft.Windows.Management.Deployment;
using Windows.Graphics.Imaging;

if (ImageObjectRemover::GetReadyState() == AIFeatureReadyState.EnsureNeeded) 
{
    var result = await ImageObjectRemover.EnsureReadyAsync();
    if (result.Status != PackageDeploymentStatus.CompletedSuccess)
    {
        throw result.ExtendedError;
    }
}
ImageObjectRemover imageObjectRemover = await ImageObjectRemover.CreateAsync();
SoftwareBitmap finalImage = imageObjectRemover.RemoveFromSoftwareBitmap(imageBitmap, maskBitmap); // Insert your own imagebitmap and maskbitmap
#include <winrt/Microsoft.Graphics.Imaging.h>
#include <winrt/Microsoft.Windows.AI.Imaging.h>
#include <winrt/Windows.Graphics.Imaging.h>
#include <winrt/Windows.Foundation.h>
using namespace winrt::Microsoft::Graphics::Imaging;
using namespace winrt::Microsoft::Windows::AI.Imaging;
using namespace winrt::Windows::Graphics::Imaging; 
using namespace winrt::Windows::Foundation;
if (ImageObjectRemover::GetReadyState() == AIFeatureReadyState::NotReady)
{
    auto loadResult = ImageObjectRemover::EnsureReadyAsync().get();

    if (loadResult.Status() != AIFeatureReadyResultState::Success)
    {
        throw winrt::hresult_error(loadResult.ExtendedError());
    }
}

ImageObjectRemover imageObjectRemover = ImageObjectRemover::CreateAsync().get();
// Insert your own imagebitmap and maskbitmap
Windows::Graphics::Imaging::SoftwareBitmap buffer = 
    imageObjectRemover.RemoveFromSoftwareBitmap(imageBitmap, maskBitmap);

Ответственный ИИ

Мы использовали сочетание следующих шагов, чтобы гарантировать, что эти API-интерфейсы визуализации являются надежными, безопасными и созданными ответственно. Мы рекомендуем ознакомиться с рекомендациями, описанными в статье "Разработка ответственного искусственного интеллекта" в Windows при реализации функций ИИ в приложении.

См. также