Начало работы с образами искусственного интеллекта в пакете SDK для приложений Windows
Внимание
Доступно в последнем экспериментальном канале выпуске пакета SDK для приложений Windows.
Экспериментальный канал пакета SDK для приложений Windows включает API и функции на ранних этапах разработки. Все API-интерфейсы в экспериментальном канале подвергаются обширным исправлениям и критическим изменениям и могут быть удалены из последующих выпусков в любое время. Экспериментальные функции не поддерживаются для использования в рабочих средах и приложениях, которые используют их, не могут быть опубликованы в Microsoft Store.
- Функции описания изображений недоступны в материковом Китае.
- Автономные приложения не поддерживаются.
Функции визуализации предоставляются пакетом SDK для приложений Windows через набор API, поддерживаемых искусственным интеллектом (ИИ), которые поддерживают следующие возможности:
- Суперразрешение изображений: масштабирование и улучшение резкости изображений
- описание изображения: создание текста, описывающего изображение
- сегментация изображений: идентификация объектов в изображении
Сведения о APIсм. в справочнике по API для возможностей создания изображений ИИ в пакете SDK для приложений Windows.
Сведения о модерации содержимого см. в безопасности содержимого с генеративными API ИИ.
Совет
Предоставьте отзыв об этих API и их функциональных возможностях путем создания новой задачи в репозитории GitHub пакета SDK для приложений для Windows (включите Imaging в заголовке) или отвечая на существующей задаче.
Необходимые компоненты
-
Copilot+ PC от Qualcomm, Intel или AMD.
- Компьютеры на базе AMD с Copilot+ в настоящее время не поддерживают суперразрешение изображений.
- Arm64EC (совместимая с эмуляцией) в настоящее время не поддерживается.
- Windows 11 Insider Preview Build 26120.3073 (каналы для разработчиков и бета-каналы) или более поздняя версия должны быть установлены на вашем устройстве.
Что можно сделать с суперразрешением изображения?
API-интерфейсы супер разрешения изображений в пакете SDK для приложений Windows позволяют увеличить и масштабировать изображения.
Масштабирование ограничено максимальным коэффициентом 8x. Более высокие коэффициенты масштабирования могут привести к артефактам и компрометации точности изображений. Если окончательная ширина или высота больше 8x исходных значений, будет создано исключение.
В следующем примере показано, как изменить масштаб (targetWidth
, targetHeight
) существующего растрового изображения программного обеспечения (softwareBitmap
) и улучшить резкость изображения (чтобы повысить степень резкости без масштабирования изображения, просто указать существующую ширину изображения и высоту) с помощью объекта ImageScaler
.
Убедитесь, что модель суперразрешения изображений доступна, вызвав метод
ImageScaler.IsAvailable
, а затем дождитесь успешного завершения методаImageScaler.MakeAvailableAsync
.Как только модель сверхразрешения изображения станет доступна, создайте объект
ImageScaler
для ссылки на неё.Получите улучшенную и масштабированную версию существующего изображения, передав текущий образ и желаемую ширину и высоту в модель с помощью метода
ScaleSoftwareBitmap
.
using Microsoft.Graphics.Imaging;
using Microsoft.Windows.Management.Deployment;
using Windows.Graphics.Imaging;
if (!ImageScaler.IsAvailable())
{
var result = await ImageScaler.MakeAvailableAsync();
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/Windows.Foundation.h>
#include <winrt/Windows.Graphics.Imaging.h>
using namespace winrt::Microsoft::Graphics::Imaging;
using namespace winrt::Windows::Foundation;
using namespace winrt::Windows::Graphics::Imaging;
if (!ImageScaler::IsAvailable())
{
winrt::PackageDeploymentResult result = ImageScaler::MakeAvailableAsync().get();
if (result.Status() != PackageDeploymentStatus::CompletedSuccess)
{
throw result.ExtendedError();
}
}
ImageScaler imageScaler = ImageScaler::CreateAsync().get();
SoftwareBitmap finalImage = imageScaler.ScaleSoftwareBitmap(softwareBitmap, targetWidth, targetHeight);
Что можно сделать с описанием изображения?
Внимание
Описание изображения в настоящее время недоступно в материковом Китае.
API описания изображений в пакете SDK для приложений Windows предоставляют возможность создавать различные типы текстовых описаний для изображения.
Поддерживаются следующие типы текстовых описаний:
- Доступность - Содержит подробное описание, предназначенное для пользователей с особыми потребностями доступности.
- Подпись — содержит короткое описание, подходящее для подписи под изображением. Значение по умолчанию, если значение не указано.
- Подробное описание - Предоставляет длинное описание.
- OfficeCharts . Предоставляет описание, подходящее для диаграмм и схем.
Так как эти API используют модели машинного обучения, иногда могут возникать ошибки, в которых текст не описывает изображение правильно. Поэтому мы не рекомендуем использовать эти API для образов в следующих сценариях:
- Где изображения содержат потенциально конфиденциальное содержимое и неточные описания могут быть спорными, такими как флаги, карты, глобусы, культурные символы или религиозные символы.
- Если точные описания являются критически важными, например для медицинских консультаций или диагностики, юридического содержимого или финансовых документов.
Получение текстового описания из изображения
API описания изображений принимает изображение, нужный тип описания текста (необязательно) и уровень модерации содержимого, который требуется использовать (необязательно) для защиты от вредного использования.
В следующем примере показано, как получить текстовое описание изображения.
Примечание.
Изображение должно быть объектом ImageBuffer
, так как SoftwareBitmap
в настоящее время не поддерживается. В этом примере показано, как преобразовать SoftwareBitmap
в ImageBuffer
.
Убедитесь, что модель суперразрешения изображений доступна, вызвав метод
ImageDescriptionGenerator.IsAvailable
, а затем дождитесь успешного завершения методаImageDescriptionGenerator.MakeAvailableAsync
.Как только модель сверхразрешения изображения станет доступна, создайте объект
ImageDescriptionGenerator
для ссылки на неё.(Необязательно) Создайте объект
ContentFilterOptions
и укажите предпочитаемые значения. Если вы решили использовать значения по умолчанию, можно передать null-объект.Получите описание изображения (
LanguageModelResponse.Response
) путем вызова методаImageDescriptionGenerator.DescribeAsync
с исходным изображением, перечисления предпочтительного типа описания (необязательно) и объектаContentFilterOptions
(необязательно).
using Microsoft.Graphics.Imaging;
using Microsoft.Windows.Management.Deployment;
using Microsoft.Windows.AI.Generative;
using Microsoft.Windows.AI.ContentModeration;
using Windows.Storage.StorageFile;
using Windows.Storage.Streams;
using Windows.Graphics.Imaging;
if (!ImageDescriptionGenerator.IsAvailable())
{
var result = await ImageDescriptionGenerator.MakeAvailableAsync();
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.ContentModeration.h>
#include <winrt/Microsoft.Windows.AI.Generative.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::ContentModeration;
using namespace winrt::Microsoft::Windows::AI::Generative;
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::IsAvailable())
{
winrt::PackageDeploymentResult result = ImageDescriptionGenerator::MakeAvailableAsync().get();
if (result.Status() != PackageDeploymentStatus::CompletedSuccess)
{
throw result.ExtendedError();
}
}
ImageDescriptionGenerator imageDescriptionGenerator = ImageDescriptionGenerator::CreateAsync().get();
// Convert already available softwareBitmap to ImageBuffer.
auto inputBuffer = ImageBuffer::CreateCopyFromBitmap(softwareBitmap);
// Create content moderation thresholds object.
ContentFilterOptions contentFilter{};
contentFilter.PromptMinSeverityLevelToBlock().ViolentContentSeverity(SeverityLevel::Medium);
contentFilter.ResponseMinSeverityLevelToBlock().ViolentContentSeverity(SeverityLevel::Medium);
// Get text description.
LanguageModelResponse languageModelResponse = imageDescriptionGenerator.DescribeAsync(inputImage, ImageDescriptionScenario::Caption, contentFilter).get();
string text = languageModelResponse.Response();
Что можно сделать с сегментацией изображений?
Сегментация изображений может использоваться для идентификации определенных объектов в изображении. Модель принимает как изображение, так и объект "подсказки" и возвращает маску идентифицированного объекта.
Подсказки можно предоставить с помощью любого сочетания следующих значений:
- Координаты для точек, принадлежащих к определяемому вами элементу.
- Координаты для точек, которые не относятся к определяемому вами элементу.
- Прямоугольник координаты, включающий определяемый вами объект.
Чем больше подсказок вы предоставляете, тем более точным может быть модель. Следуйте этим советам, чтобы минимизировать неточные результаты или ошибки.
- Избегайте использования нескольких прямоугольников в подсказке, так как они могут создавать неточные маски.
- Избегайте использования точек исключения исключительно без включения точек или прямоугольника.
- Не указывайте больше, чем поддерживаемые максимум 32 координат (1 для точки, 2 для прямоугольника), так как это приведет к ошибке.
Возвращаемая маска находится в формате серой шкалы-8 с пикселями маски для идентифицированного объекта со значением 255 (все остальные имеют значение 0).
Определение объекта в изображении
В следующих примерах показаны способы идентификации объекта в изображении. В примерах предполагается, что у вас уже есть объект растрового изображения программного обеспечения (softwareBitmap
) для входных данных.
Убедитесь, что модель сегментации изображений доступна путем вызова метода
IsAvailable
и ожидания успешного возврата методаMakeAvailableAsync
.После того как модель сегментации изображений будет доступна, создайте объект
ImageObjectExtractor
для ссылки на него.Передайте изображение в
ImageObjectExtractor.CreateWithSoftwareBitmapAsync
.Создайте объект
ImageObjectExtractorHint
. Далее показаны другие способы создания объекта подсказки с различными входными данными.Отправьте указание модели с помощью метода
GetSoftwareBitmapObjectMask
, который возвращает окончательный результат.
using Microsoft.Graphics.Imaging;
using Microsoft.Windows.Management.Deployment;
using Windows.Graphics.Imaging;
if (!ImageObjectExtractor.IsAvailable())
{
var result = await ImageObjectExtractor.MakeAvailableAsync();
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/Windows.Graphics.Imaging.h>
#include <winrt/Windows.Foundation.h>
using namespace winrt::Microsoft::Graphics::Imaging;
using namespace winrt::Windows::Graphics::Imaging;
using namespace winrt::Windows::Foundation;
if (!ImageObjectExtractor::IsAvailable())
{
winrt::PackageDeploymentResult result = ImageObjectExtractor::MakeAvailableAsync().get();
if (result.Status() != PackageDeploymentStatus::CompletedSuccess)
{
throw result.ExtendedError();
}
}
ImageObjectExtractor imageObjectExtractor = ImageObjectExtractor::CreateWithSoftwareBitmapAsync(softwareBitmap).get();
ImageObjectExtractorHint hint(
{},
{
PointInt32{306, 212},
PointInt32{216, 336}
},
{}
);
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}
},
{},
{}
);
Ответственный ИИ
Эти API-интерфейсы для работы с изображениями предоставляют разработчикам мощные, надежные модели для создания приложений с безопасным и защищенным использованием искусственного интеллекта. Мы использовали сочетание следующих шагов, чтобы гарантировать, что эти API-интерфейсы визуализации являются надежными, безопасными и созданными ответственно. Мы рекомендуем ознакомиться с рекомендациями, описанными в разделе Ответственная разработка ИИ на Windows при реализации функций ИИ в приложении.
- Тщательное тестирование и оценка качества модели для выявления и устранения потенциальных рисков.
- Поэтапное развертывание экспериментальных выпусков имиджевой API. После окончательного экспериментального выпуска развертывание будет расширено для подписанных приложений, чтобы убедиться, что проверки вредоносных программ были применены к приложениям с возможностями локальной модели.
- Предоставьте локальную модель ИИ для модерации содержимого, которая определяет и фильтрует вредное содержимое как входных, так и созданных ИИ выходных данных любых API, использующих созданные модели искусственного интеллекта. Эта локальная модель con режим палатки ration основана на модели безопасности содержимого ИИ Azure для модерации текста и обеспечивает аналогичную производительность.
Внимание
Система безопасности содержимого не является неразрешимой и иногда возникает ошибка, поэтому мы рекомендуем интегрировать дополнительные инструменты и методики ответственного ИИ. Дополнительные сведения см. в статье "Разработка ответственного искусственного интеллекта" в Windows.