다음을 통해 공유


빠른 시작: Custom Vision 클라이언트 라이브러리 또는 REST API를 사용하여 이미지 분류 프로젝트 만들기

.NET용 Custom Vision 클라이언트 라이브러리를 시작합니다. 이러한 단계에 따라 패키지를 설치하고 이미지 분류 모델을 빌드하기 위한 예제 코드를 사용해 봅니다. 프로젝트를 만들고, 태그를 추가하고, 프로젝트를 학습시키고, 프로젝트의 예측 엔드포인트 URL을 사용하여 프로그래밍 방식으로 테스트합니다. 자체 이미지 인식 앱을 빌드하기 위한 템플릿으로 이 예제를 사용합니다.

참고 항목

코드를 작성하지 않고 분류 모델을 빌드하고 학습시키려면 브라우저 기반 지침을 대신 참조하세요.

참조 설명서 | 라이브러리 소스 코드 (학습) (예측) | 패키지(NuGet) (학습) (예측) | 샘플

필수 조건

환경 변수 만들기

이 예제에서는 애플리케이션을 실행하는 로컬 컴퓨터의 환경 변수에 자격 증명을 작성합니다.

Azure Portal로 이동합니다. 필수 조건 섹션에서 생성한 Custom Vision 리소스가 성공적으로 배포된 경우 다음 단계 아래에서 리소스로 이동 버튼을 선택합니다. 리소스 관리 아래 리소스의 키 및 엔드포인트 페이지에서 키와 엔드포인트를 찾을 수 있습니다. API 엔드포인트와 함께 학습 및 예측 리소스에 대한 키를 가져와야 합니다.

Azure Portal에 있는 예측 리소스의 속성 탭에서 리소스 ID로 나열된 예측 리소스 ID를 찾을 수 있습니다.

또한 https://www.customvision.ai/을 사용하여 이러한 값을 얻습니다. 로그인한 후 오른쪽 위에 있는 설정 아이콘을 선택합니다. 설정 페이지에서 모든 키, 리소스 ID 및 엔드포인트를 볼 수 있습니다.

환경 변수를 설정하려면 콘솔 창을 열고 운영 체제 및 개발 환경에 대한 지침을 따르세요.

  • VISION_TRAINING KEY 환경 변수를 설정하려면 your-training-key를 학습 리소스의 키 중 하나로 바꾸세요.
  • VISION_TRAINING_ENDPOINT 환경 변수를 설정하려면 your-training-endpoint를 학습 리소스의 엔드포인트로 바꾸세요.
  • VISION_PREDICTION_KEY 환경 변수를 설정하려면 your-prediction-key를 예측 리소스의 키 중 하나로 바꾸세요.
  • VISION_PREDICTION_ENDPOINT 환경 변수를 설정하려면 your-prediction-endpoint를 예측 리소스의 엔드포인트로 바꾸세요.
  • VISION_PREDICTION_RESOURCE_ID 환경 변수를 설정하려면 your-resource-id를 예측 리소스의 리소스 ID로 바꾸세요.

Important

API 키를 사용하는 경우 Azure Key Vault와 같이 다른 곳에 안전하게 저장합니다. API 키를 코드에 직접 포함하지 말고, 공개적으로 게시하지 마세요.

AI 서비스 보안에 대한 자세한 내용은 Azure AI 서비스에 대한 요청 인증을 참조하세요.

setx VISION_TRAINING_KEY your-training-key
setx VISION_TRAINING_ENDPOINT your-training-endpoint
setx VISION_PREDICTION_KEY your-prediction-key
setx VISION_PREDICTION_ENDPOINT your-prediction-endpoint
setx VISION_PREDICTION_RESOURCE_ID your-resource-id

환경 변수가 추가되면 콘솔 창을 포함하여 환경 변수를 읽는 실행 중인 프로그램을 다시 시작해야 할 수 있습니다.

설정

새 C# 애플리케이션 만들기

Visual Studio를 사용하여 새 .NET Core 애플리케이션을 만듭니다.

클라이언트 라이브러리 설치

새 프로젝트가 만들어지면 솔루션 탐색기에서 마우스 오른쪽 단추로 프로젝트 솔루션을 클릭하고, NuGet 패키지 관리를 선택하여 클라이언트 라이브러리를 설치합니다. 열리는 패키지 관리자에서 찾아보기를 선택하고, 시험판 포함을 선택하고, Microsoft.Azure.CognitiveServices.Vision.CustomVision.TrainingMicrosoft.Azure.CognitiveServices.Vision.CustomVision.Prediction을 검색합니다. 최신 버전을 선택한 다음, 설치를 선택합니다.

한 번에 전체 빠른 시작 코드 파일을 보시겠습니까? GitHub에서 찾을 수 있으며 이 빠른 시작의 코드 예제를 포함합니다.

프로젝트 디렉터리에서 program.cs 파일을 열고 using 지시문을 추가합니다.

using Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction;
using Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training;
using Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;

애플리케이션의 Main 메소드에서 환경 변수에서 리소스의 키와 엔드포인트를 검색하는 변수를 만듭니다. 또한 나중에 사용할 몇 가지 기본 개체도 선언합니다.

// Retrieve the environment variables for your credentials:
private static string trainingEndpoint = Environment.GetEnvironmentVariable("VISION_TRAINING_ENDPOINT");

private static string trainingKey = Environment.GetEnvironmentVariable("VISION_TRAINING_KEY");
private static string predictionEndpoint = Environment.GetEnvironmentVariable("VISION_PREDICTION_ENDPOINT");
private static string predictionKey = Environment.GetEnvironmentVariable("VISION_PREDICTION_KEY");

private static string predictionResourceId = Environment.GetEnvironmentVariable("VISION_PREDICTION_RESOURCE_ID");

private static List<string> hemlockImages;
private static List<string> japaneseCherryImages;
private static Tag hemlockTag;
private static Tag japaneseCherryTag;
private static Iteration iteration;
private static string publishedModelName = "treeClassModel";
private static MemoryStream testImage;

애플리케이션의 Main 메서드에서 이 빠른 시작에서 사용되는 메서드에 대한 호출을 추가합니다. 이러한 메서드는 나중에 구현합니다.

CustomVisionTrainingClient trainingApi = AuthenticateTraining(trainingEndpoint, trainingKey);
CustomVisionPredictionClient predictionApi = AuthenticatePrediction(predictionEndpoint, predictionKey);

Project project = CreateProject(trainingApi);
AddTags(trainingApi, project);
UploadImages(trainingApi, project);
TrainProject(trainingApi, project);
PublishIteration(trainingApi, project);
TestIteration(predictionApi, project);
DeleteProject(trainingApi, project);

클라이언트 인증

새 메서드에서 엔드포인트와 키를 사용하여 학습 및 예측 클라이언트를 인스턴스화합니다.

private static CustomVisionTrainingClient AuthenticateTraining(string endpoint, string trainingKey)
{
    // Create the Api, passing in the training key
    CustomVisionTrainingClient trainingApi = new CustomVisionTrainingClient(new Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training.ApiKeyServiceClientCredentials(trainingKey))
    {
        Endpoint = endpoint
    };
    return trainingApi;
}
private static CustomVisionPredictionClient AuthenticatePrediction(string endpoint, string predictionKey)
{
    // Create a prediction endpoint, passing in the obtained prediction key
    CustomVisionPredictionClient predictionApi = new CustomVisionPredictionClient(new Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction.ApiKeyServiceClientCredentials(predictionKey))
    {
        Endpoint = endpoint
    };
    return predictionApi;
}

새 Custom Vision 프로젝트 만들기

여기에 있는 코드의 다음 비트는 이미지 분류 프로젝트를 만듭니다. 만든 프로젝트는 Custom Vision 웹 사이트에 표시됩니다. 프로젝트를 만들 때 다른 옵션을 지정하려면 CreateProject 메서드를 참조하세요(분류자 빌드 웹 포털 가이드에 설명되어 있음).

private static Project CreateProject(CustomVisionTrainingClient trainingApi)
{
    // Create a new project
    Console.WriteLine("Creating new project:");
    return trainingApi.CreateProject("My New Project");
}

프로젝트에 태그 추가

다음 메서드는 모델을 학습시키는 태그를 정의합니다.

private static void AddTags(CustomVisionTrainingClient trainingApi, Project project)
{
    // Make two tags in the new project
    hemlockTag = trainingApi.CreateTag(project.Id, "Hemlock");
    japaneseCherryTag = trainingApi.CreateTag(project.Id, "Japanese Cherry");
}

이미지 업로드 및 태그 지정

먼저 이 프로젝트에 대한 샘플 이미지를 다운로드합니다. 샘플 이미지 폴더의 내용을 로컬 디바이스에 저장합니다.

그런 다음, 이미지를 이 디렉터리에 업로드하는 도우미 메서드를 정의합니다. 이미지가 저장되는 위치를 가리키도록 GetFiles 인수를 편집해야 할 수 있습니다.

private static void LoadImagesFromDisk()
{
    // this loads the images to be uploaded from disk into memory
    hemlockImages = Directory.GetFiles(Path.Combine("Images", "Hemlock")).ToList();
    japaneseCherryImages = Directory.GetFiles(Path.Combine("Images", "Japanese_Cherry")).ToList();
    testImage = new MemoryStream(File.ReadAllBytes(Path.Combine("Images", "Test", "test_image.jpg")));
}

다음으로 이미지를 업로드하는 메서드를 정의하고, 폴더 위치에 따라 태그를 적용합니다(이미지는 이미 정렬되어 있음). 이미지를 반복적으로 또는 일괄적으로(일괄 처리당 최대 64개) 업로드하고 태그를 지정할 수 있습니다. 다음 코드 조각에는 두 가지 예제가 모두 포함되어 있습니다.

private static void UploadImages(CustomVisionTrainingClient trainingApi, Project project)
{
    // Add some images to the tags
    Console.WriteLine("\tUploading images");
    LoadImagesFromDisk();

    // Images can be uploaded one at a time
    foreach (var image in hemlockImages)
    {
        using (var stream = new MemoryStream(File.ReadAllBytes(image)))
        {
            trainingApi.CreateImagesFromData(project.Id, stream, new List<Guid>() { hemlockTag.Id });
        }
    }

    // Or uploaded in a single batch 
    var imageFiles = japaneseCherryImages.Select(img => new ImageFileCreateEntry(Path.GetFileName(img), File.ReadAllBytes(img))).ToList();
    trainingApi.CreateImagesFromFiles(project.Id, new ImageFileCreateBatch(imageFiles, new List<Guid>() { japaneseCherryTag.Id }));

}

프로젝트 학습

다음 메서드는 프로젝트의 첫 번째 학습 반복을 만듭니다. 학습이 완료될 때까지 서비스를 쿼리합니다.

private static void TrainProject(CustomVisionTrainingClient trainingApi, Project project)
{
    // Now there are images with tags start training the project
    Console.WriteLine("\tTraining");
    iteration = trainingApi.TrainProject(project.Id);

    // The returned iteration will be in progress, and can be queried periodically to see when it has completed
    while (iteration.Status == "Training")
    {
        Console.WriteLine("Waiting 10 seconds for training to complete...");
        Thread.Sleep(10000);

        // Re-query the iteration to get it's updated status
        iteration = trainingApi.GetIteration(project.Id, iteration.Id);
    }
}

선택한 태그로 학습

적용된 태그의 하위 집합에 대해서만 선택적으로 학습을 수행할 수 있습니다. 특정 태그는 아직 충분히 적용하지 않았지만 다른 태그는 충분히 적용한 경우 이 작업을 수행할 수 있습니다. TrainProject 호출에서 trainingParameters 매개 변수를 사용합니다. TrainingParameters를 생성하고 SelectedTags 속성을 사용하려는 태그의 ID 목록으로 설정합니다. 모델은 해당 목록의 태그만 인식하도록 학습됩니다.

현재 반복 게시

다음 메서드는 모델의 현재 반복을 쿼리에 사용할 수 있도록 합니다. 모델 이름을 참조로 사용하여 예측 요청을 보낼 수 있습니다. predictionResourceId에 대한 고유한 값을 입력해야 합니다. Azure Portal에 있는 리소스의 속성 탭에서 리소스 ID로 나열된 예측 리소스 ID를 찾을 수 있습니다.

private static void PublishIteration(CustomVisionTrainingClient trainingApi, Project project)
{
    trainingApi.PublishIteration(project.Id, iteration.Id, publishedModelName, predictionResourceId);
    Console.WriteLine("Done!\n");

    // Now there is a trained endpoint, it can be used to make a prediction
}

예측 엔드포인트 테스트

이 스크립트 부분은 테스트 이미지를 로드하고, 모델 엔드포인트를 쿼리하고, 예측 데이터를 콘솔에 출력합니다.

private static void TestIteration(CustomVisionPredictionClient predictionApi, Project project)
{

    // Make a prediction against the new project
    Console.WriteLine("Making a prediction:");
    var result = predictionApi.ClassifyImage(project.Id, publishedModelName, testImage);

    // Loop over each prediction and write out the results
    foreach (var c in result.Predictions)
    {
        Console.WriteLine($"\t{c.TagName}: {c.Probability:P1}");
    }
}

애플리케이션 실행

IDE 창의 위쪽에서 디버그 단추를 클릭하여 애플리케이션을 실행합니다.

애플리케이션이 실행되면 콘솔 창이 열리고 다음 출력이 기록됩니다.

Creating new project:
        Uploading images
        Training
Done!

Making a prediction:
        Hemlock: 95.0%
        Japanese Cherry: 0.0%

그러면 테스트 이미지(Images/Test/에 있음)에 태그가 적절하게 지정되는지 확인할 수 있습니다. 애플리케이션을 종료하려면 아무 키나 누릅니다. Custom Vision 웹 사이트로 돌아가서 새로 만든 프로젝트의 현재 상태를 살펴볼 수도 있습니다.

리소스 정리

고유한 이미지 분류 프로젝트를 구현하려면(또는 개체 검색 프로젝트를 시도하려면) 이 예제에서 트리 식별 프로젝트를 삭제하는 것이 좋습니다. 체험 구독은 두 개의 Custom Vision 프로젝트를 허용합니다.

Custom Vision 웹 사이트에서 프로젝트로 이동하여 [내 새 프로젝트] 아래에서 휴지통을 선택합니다.

내 새 프로젝트라는 레이블이 붙은 패널과 휴지통 아이콘이 있는 스크린샷.

다음 단계

이제 코드에서 이미지 분류 프로세스의 모든 단계를 완료했습니다. 이 샘플은 학습을 한 번만 반복하지만, 정확도를 높이기 위해 모델을 여러 차례 학습하고 테스트해야 하는 경우가 많습니다.

이 가이드는 Go용 Custom Vision 클라이언트 라이브러리를 사용하여 이미지 분류 모델을 빌드하는 데 유용한 지침과 샘플 코드를 제공합니다. 프로젝트를 만들고, 태그를 추가하고, 프로젝트를 학습시키고, 프로젝트의 예측 엔드포인트 URL을 사용하여 프로그래밍 방식으로 테스트합니다. 자체 이미지 인식 앱을 빌드하기 위한 템플릿으로 이 예제를 사용합니다.

참고 항목

코드를 작성하지 않고 분류 모델을 빌드하고 학습시키려면 브라우저 기반 지침을 대신 참조하세요.

Go용 Custom Vision 클라이언트 라이브러리를 사용하여 다음을 수행합니다.

  • 새 Custom Vision 프로젝트 만들기
  • 프로젝트에 태그 추가
  • 이미지 업로드 및 태그 지정
  • 프로젝트 학습
  • 현재 반복 게시
  • 예측 엔드포인트 테스트

참조 설명서(학습)(예측)

필수 조건

  • Azure 구독 - 체험 구독 만들기
  • Go 1.8+
  • Azure 구독이 있으면 Azure portal에서 Custom Vision 리소스를 생성하여 교육 및 예측 리소스를 생성합니다.
    • 평가판 가격 책정 계층(F0)을 통해 서비스를 사용해보고, 나중에 프로덕션용 유료 계층으로 업그레이드할 수 있습니다.

환경 변수 만들기

이 예제에서는 애플리케이션을 실행하는 로컬 컴퓨터의 환경 변수에 자격 증명을 작성합니다.

Azure Portal로 이동합니다. 필수 조건 섹션에서 생성한 Custom Vision 리소스가 성공적으로 배포된 경우 다음 단계 아래에서 리소스로 이동 버튼을 선택합니다. 리소스 관리 아래 리소스의 키 및 엔드포인트 페이지에서 키와 엔드포인트를 찾을 수 있습니다. API 엔드포인트와 함께 학습 및 예측 리소스에 대한 키를 가져와야 합니다.

Azure Portal에 있는 예측 리소스의 속성 탭에서 리소스 ID로 나열된 예측 리소스 ID를 찾을 수 있습니다.

또한 https://www.customvision.ai/을 사용하여 이러한 값을 얻습니다. 로그인한 후 오른쪽 위에 있는 설정 아이콘을 선택합니다. 설정 페이지에서 모든 키, 리소스 ID 및 엔드포인트를 볼 수 있습니다.

환경 변수를 설정하려면 콘솔 창을 열고 운영 체제 및 개발 환경에 대한 지침을 따르세요.

  • VISION_TRAINING KEY 환경 변수를 설정하려면 your-training-key를 학습 리소스의 키 중 하나로 바꾸세요.
  • VISION_TRAINING_ENDPOINT 환경 변수를 설정하려면 your-training-endpoint를 학습 리소스의 엔드포인트로 바꾸세요.
  • VISION_PREDICTION_KEY 환경 변수를 설정하려면 your-prediction-key를 예측 리소스의 키 중 하나로 바꾸세요.
  • VISION_PREDICTION_ENDPOINT 환경 변수를 설정하려면 your-prediction-endpoint를 예측 리소스의 엔드포인트로 바꾸세요.
  • VISION_PREDICTION_RESOURCE_ID 환경 변수를 설정하려면 your-resource-id를 예측 리소스의 리소스 ID로 바꾸세요.

Important

API 키를 사용하는 경우 Azure Key Vault와 같이 다른 곳에 안전하게 저장합니다. API 키를 코드에 직접 포함하지 말고, 공개적으로 게시하지 마세요.

AI 서비스 보안에 대한 자세한 내용은 Azure AI 서비스에 대한 요청 인증을 참조하세요.

setx VISION_TRAINING_KEY your-training-key
setx VISION_TRAINING_ENDPOINT your-training-endpoint
setx VISION_PREDICTION_KEY your-prediction-key
setx VISION_PREDICTION_ENDPOINT your-prediction-endpoint
setx VISION_PREDICTION_RESOURCE_ID your-resource-id

환경 변수가 추가되면 콘솔 창을 포함하여 환경 변수를 읽는 실행 중인 프로그램을 다시 시작해야 할 수 있습니다.

설정

Custom Vision 클라이언트 라이브러리 설치

Go용 Custom Vision을 사용하여 이미지 분석 앱을 작성하려면 Custom Vision 서비스 클라이언트 라이브러리가 필요합니다. PowerShell에서 다음 명령을 실행합니다.

go get -u github.com/Azure/azure-sdk-for-go/...

dep를 사용하는 경우에는 리포지토리 내에서 다음을 실행합니다.

dep ensure -add github.com/Azure/azure-sdk-for-go

샘플 이미지 가져오기

이 예에서는 GitHub의 Azure AI 서비스 Python SDK 샘플 저장소의 이미지를 사용합니다. 이 리포지토리를 개발 환경에 복제 또는 다운로드합니다. 이후 단계에 대한 폴더 위치를 기억하세요.

Custom Vision 프로젝트 만들기

원하는 프로젝트 디렉터리에 sample.go라는 새 파일을 만들고, 원하는 코드 편집기에서 이 파일을 엽니다.

새 Custom Vision Service 프로젝트를 만드는 다음 코드를 스크립트에 추가합니다.

프로젝트를 만들 때 다른 옵션을 지정하려면 CreateProject 메서드를 참조하세요(분류자 빌드 웹 포털 가이드에 설명되어 있음).

import(
    "context"
    "bytes"
    "fmt"
    "io/ioutil"
    "path"
    "log"
    "time"
    "github.com/Azure/azure-sdk-for-go/services/cognitiveservices/v3.0/customvision/training"
    "github.com/Azure/azure-sdk-for-go/services/cognitiveservices/v3.0/customvision/prediction"
)

var (
    training_key string = os.Getenv("VISION_TRAINING_KEY")
    prediction_key string = os.Getenv("VISION_PREDICTION_KEY")
    prediction_resource_id = os.Getenv("VISION_PREDICTION_RESOURCE_ID")
    endpoint string = os.Getenv("VISION_ENDPOINT")    

    project_name string = "Go Sample Project"
    iteration_publish_name = "classifyModel"
    sampleDataDirectory = "<path to sample images>"
)

func main() {
    fmt.Println("Creating project...")

    ctx = context.Background()

    trainer := training.New(training_key, endpoint)

    project, err := trainer.CreateProject(ctx, project_name, "sample project", nil, string(training.Multilabel))
    if (err != nil) {
        log.Fatal(err)
    }

프로젝트에서 태그 만들기

프로젝트에 분류 태그를 만들려면 sample.go 끝에 다음 코드를 추가합니다.

// Make two tags in the new project
hemlockTag, _ := trainer.CreateTag(ctx, *project.ID, "Hemlock", "Hemlock tree tag", string(training.Regular))
cherryTag, _ := trainer.CreateTag(ctx, *project.ID, "Japanese Cherry", "Japanese cherry tree tag", string(training.Regular))

이미지 업로드 및 태그 지정

프로젝트에 샘플 이미지를 추가하려면 태그를 만든 후 다음 코드를 삽입합니다. 이 코드는 해당 태그를 사용하여 각 이미지를 업로드합니다. 단일 일괄 처리에서 최대 64개의 이미지를 업로드할 수 있습니다.

참고 항목

이전에 Azure AI 서비스 Go SDK 샘플 프로젝트를 다운로드한 위치에 따라 이미지 경로를 변경해야 합니다.

fmt.Println("Adding images...")
japaneseCherryImages, err := ioutil.ReadDir(path.Join(sampleDataDirectory, "Japanese Cherry"))
if err != nil {
    fmt.Println("Error finding Sample images")
}

hemLockImages, err := ioutil.ReadDir(path.Join(sampleDataDirectory, "Hemlock"))
if err != nil {
    fmt.Println("Error finding Sample images")
}

for _, file := range hemLockImages {
    imageFile, _ := ioutil.ReadFile(path.Join(sampleDataDirectory, "Hemlock", file.Name()))
    imageData := ioutil.NopCloser(bytes.NewReader(imageFile))

    trainer.CreateImagesFromData(ctx, *project.ID, imageData, []string{ hemlockTag.ID.String() })
}

for _, file := range japaneseCherryImages {
    imageFile, _ := ioutil.ReadFile(path.Join(sampleDataDirectory, "Japanese Cherry", file.Name()))
    imageData := ioutil.NopCloser(bytes.NewReader(imageFile))
    trainer.CreateImagesFromData(ctx, *project.ID, imageData, []string{ cherryTag.ID.String() })
}

프로젝트 학습 및 게시

이 코드는 예측 모델의 첫 번째 반복을 만든 다음, 해당 반복을 예측 엔드포인트에 게시합니다. 게시된 반복에 부여된 이름은 예측 요청을 보내는 데 사용할 수 있습니다. 반복은 게시될 때까지 예측 엔드포인트에서 사용할 수 없습니다.

fmt.Println("Training...")
iteration, _ := trainer.TrainProject(ctx, *project.ID)
for {
    if *iteration.Status != "Training" {
        break
    }
    fmt.Println("Training status: " + *iteration.Status)
    time.Sleep(1 * time.Second)
    iteration, _ = trainer.GetIteration(ctx, *project.ID, *iteration.ID)
}
fmt.Println("Training status: " + *iteration.Status)

trainer.PublishIteration(ctx, *project.ID, *iteration.ID, iteration_publish_name, prediction_resource_id))

예측 엔드포인트 사용

예측 엔드포인트에 이미지를 보내고 예측을 검색하려면 파일의 끝에 다음 코드를 추가합니다.

    fmt.Println("Predicting...")
    predictor := prediction.New(prediction_key, endpoint)

    testImageData, _ := ioutil.ReadFile(path.Join(sampleDataDirectory, "Test", "test_image.jpg"))
    results, _ := predictor.ClassifyImage(ctx, *project.ID, iteration_publish_name, ioutil.NopCloser(bytes.NewReader(testImageData)), "")

    for _, prediction := range *results.Predictions    {
        fmt.Printf("\t%s: %.2f%%", *prediction.TagName, *prediction.Probability * 100)
        fmt.Println("")
    }
}

애플리케이션 실행

sample.go를 실행합니다.

go run sample.go

애플리케이션의 출력은 다음 텍스트와 비슷할 것입니다.

Creating project...
Adding images...
Training...
Training status: Training
Training status: Training
Training status: Training
Training status: Completed
Done!
        Hemlock: 93.53%
        Japanese Cherry: 0.01%

그런 다음, 테스트 이미지(<base_image_url>/Images/Test/에 있음)에 태그가 적절하게 지정되는지 확인할 수 있습니다. Custom Vision 웹 사이트로 돌아가서 새로 만든 프로젝트의 현재 상태를 살펴볼 수도 있습니다.

리소스 정리

고유한 이미지 분류 프로젝트를 구현하려면(또는 개체 검색 프로젝트를 시도하려면) 이 예제에서 트리 식별 프로젝트를 삭제하는 것이 좋습니다. 체험 구독은 두 개의 Custom Vision 프로젝트를 허용합니다.

Custom Vision 웹 사이트에서 프로젝트로 이동하여 [내 새 프로젝트] 아래에서 휴지통을 선택합니다.

내 새 프로젝트라는 레이블이 붙은 패널과 휴지통 아이콘이 있는 스크린샷.

다음 단계

지금까지 개체 검색 프로세스의 모든 단계를 코드로 수행하는 방법을 살펴보았습니다. 이 샘플은 학습을 한 번만 반복하지만, 정확도를 높이기 위해 모델을 여러 차례 학습하고 테스트해야 하는 경우가 많습니다.

Java용 Custom Vision 클라이언트 라이브러리를 사용하여 이미지 분류 모델을 빌드합니다. 이러한 단계에 따라 패키지를 설치하고 기본 작업을 위한 예제 코드를 사용해 봅니다. 자체 이미지 인식 앱을 빌드하기 위한 템플릿으로 이 예제를 사용합니다.

참고 항목

코드를 작성하지 않고 분류 모델을 빌드하고 학습시키려면 브라우저 기반 지침을 대신 참조하세요.

Java용 Custom Vision 클라이언트 라이브러리를 사용하여 다음을 수행합니다.

  • 새 Custom Vision 프로젝트 만들기
  • 프로젝트에 태그 추가
  • 이미지 업로드 및 태그 지정
  • 프로젝트 학습
  • 현재 반복 게시
  • 예측 엔드포인트 테스트

참조 설명서 | 라이브러리 소스 코드 (학습) (예측) | 아티팩트(Maven) (학습) (예측) | 샘플

필수 조건

환경 변수 만들기

이 예제에서는 애플리케이션을 실행하는 로컬 컴퓨터의 환경 변수에 자격 증명을 작성합니다.

Azure Portal로 이동합니다. 필수 조건 섹션에서 생성한 Custom Vision 리소스가 성공적으로 배포된 경우 다음 단계 아래에서 리소스로 이동 버튼을 선택합니다. 리소스 관리 아래 리소스의 키 및 엔드포인트 페이지에서 키와 엔드포인트를 찾을 수 있습니다. API 엔드포인트와 함께 학습 및 예측 리소스에 대한 키를 가져와야 합니다.

Azure Portal에 있는 예측 리소스의 속성 탭에서 리소스 ID로 나열된 예측 리소스 ID를 찾을 수 있습니다.

또한 https://www.customvision.ai/을 사용하여 이러한 값을 얻습니다. 로그인한 후 오른쪽 위에 있는 설정 아이콘을 선택합니다. 설정 페이지에서 모든 키, 리소스 ID 및 엔드포인트를 볼 수 있습니다.

환경 변수를 설정하려면 콘솔 창을 열고 운영 체제 및 개발 환경에 대한 지침을 따르세요.

  • VISION_TRAINING KEY 환경 변수를 설정하려면 your-training-key를 학습 리소스의 키 중 하나로 바꾸세요.
  • VISION_TRAINING_ENDPOINT 환경 변수를 설정하려면 your-training-endpoint를 학습 리소스의 엔드포인트로 바꾸세요.
  • VISION_PREDICTION_KEY 환경 변수를 설정하려면 your-prediction-key를 예측 리소스의 키 중 하나로 바꾸세요.
  • VISION_PREDICTION_ENDPOINT 환경 변수를 설정하려면 your-prediction-endpoint를 예측 리소스의 엔드포인트로 바꾸세요.
  • VISION_PREDICTION_RESOURCE_ID 환경 변수를 설정하려면 your-resource-id를 예측 리소스의 리소스 ID로 바꾸세요.

Important

API 키를 사용하는 경우 Azure Key Vault와 같이 다른 곳에 안전하게 저장합니다. API 키를 코드에 직접 포함하지 말고, 공개적으로 게시하지 마세요.

AI 서비스 보안에 대한 자세한 내용은 Azure AI 서비스에 대한 요청 인증을 참조하세요.

setx VISION_TRAINING_KEY your-training-key
setx VISION_TRAINING_ENDPOINT your-training-endpoint
setx VISION_PREDICTION_KEY your-prediction-key
setx VISION_PREDICTION_ENDPOINT your-prediction-endpoint
setx VISION_PREDICTION_RESOURCE_ID your-resource-id

환경 변수가 추가되면 콘솔 창을 포함하여 환경 변수를 읽는 실행 중인 프로그램을 다시 시작해야 할 수 있습니다.

설정

새 Gradle 프로젝트 만들기

콘솔 창(예: cmd, PowerShell 또는 Bash)에서 앱에 대한 새 디렉터리를 만들고 이 디렉터리로 이동합니다.

mkdir myapp && cd myapp

작업 디렉터리에서 gradle init 명령을 실행합니다. 이 명령은 build.gradle.kts를 포함하여 런타임에 애플리케이션을 만들고 구성하는 데 사용되는 Gradle용 필수 빌드 파일을 만듭니다.

gradle init --type basic

DSL을 선택하라는 메시지가 표시되면 Kotlin을 선택합니다.

클라이언트 라이브러리 설치

build.gradle.kts를 찾고, 원하는 IDE 또는 텍스트 편집기에서 엽니다. 그런 다음, 다음 빌드 구성을 복사합니다. 이 구성은 프로젝트를 Java 애플리케이션(진입점이 CustomVisionQuickstart 클래스임)으로 정의합니다. Custom Vision 라이브러리를 가져옵니다.

plugins {
    java
    application
}
application { 
    mainClassName = "CustomVisionQuickstart"
}
repositories {
    mavenCentral()
}
dependencies {
    compile(group = "com.azure", name = "azure-cognitiveservices-customvision-training", version = "1.1.0-preview.2")
    compile(group = "com.azure", name = "azure-cognitiveservices-customvision-prediction", version = "1.1.0-preview.2")
}

Java 파일 만들기

작업 디렉터리에서 다음 명령을 실행하여 프로젝트 원본 폴더를 만듭니다.

mkdir -p src/main/java

새 폴더로 이동하여 CustomVisionQuickstart.java라는 파일을 만듭니다. 원하는 편집기 또는 IDE에서 이 파일을 열고, 다음 import 문을 추가합니다.

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;

import com.google.common.io.ByteStreams;

import com.microsoft.azure.cognitiveservices.vision.customvision.training.models.Classifier;
import com.microsoft.azure.cognitiveservices.vision.customvision.training.models.Domain;
import com.microsoft.azure.cognitiveservices.vision.customvision.training.models.DomainType;
import com.microsoft.azure.cognitiveservices.vision.customvision.training.models.ImageFileCreateBatch;
import com.microsoft.azure.cognitiveservices.vision.customvision.training.models.ImageFileCreateEntry;
import com.microsoft.azure.cognitiveservices.vision.customvision.training.models.Iteration;
import com.microsoft.azure.cognitiveservices.vision.customvision.training.models.Project;
import com.microsoft.azure.cognitiveservices.vision.customvision.training.models.Region;
import com.microsoft.azure.cognitiveservices.vision.customvision.training.models.TrainProjectOptionalParameter;
import com.microsoft.azure.cognitiveservices.vision.customvision.training.CustomVisionTrainingClient;
import com.microsoft.azure.cognitiveservices.vision.customvision.training.Trainings;
import com.microsoft.azure.cognitiveservices.vision.customvision.training.CustomVisionTrainingManager;
import com.microsoft.azure.cognitiveservices.vision.customvision.prediction.models.ImagePrediction;
import com.microsoft.azure.cognitiveservices.vision.customvision.prediction.models.Prediction;
import com.microsoft.azure.cognitiveservices.vision.customvision.prediction.CustomVisionPredictionClient;
import com.microsoft.azure.cognitiveservices.vision.customvision.prediction.CustomVisionPredictionManager;
import com.microsoft.azure.cognitiveservices.vision.customvision.training.models.Tag;

한 번에 전체 빠른 시작 코드 파일을 보시겠습니까? GitHub에서 찾을 수 있으며 이 빠른 시작의 코드 예제를 포함합니다.

애플리케이션의 CustomVisionQuickstart 클래스에서 환경 변수에서 리소스의 키와 엔드포인트를 검색하는 변수를 만듭니다.

// retrieve environment variables
final static String trainingApiKey = System.getenv("VISION_TRAINING_KEY");
final static String trainingEndpoint = System.getenv("VISION_TRAINING_ENDPOINT");
final static String predictionApiKey = System.getenv("VISION_PREDICTION_KEY");
final static String predictionEndpoint = System.getenv("VISION_PREDICTION_ENDPOINT");
final static String predictionResourceId = System.getenv("VISION_PREDICTION_RESOURCE_ID");

Important

Azure Portal로 이동합니다. 필수 조건 섹션에서 생성한 Custom Vision 리소스가 성공적으로 배포된 경우 다음 단계 아래에서 리소스로 이동 버튼을 선택합니다. 리소스의 키 및 엔드포인트 페이지에서 키 및 엔드포인트를 찾을 수 있습니다. 학습 리소스에 대한 API 엔드포인트와 함께 학습 및 예측 리소스 모두에 대한 키를 가져와야 합니다.

Azure Portal에 있는 리소스의 속성 탭에서 리소스 ID로 나열된 예측 리소스 ID를 찾을 수 있습니다.

Important

완료되면 코드에서 키를 제거하고 공개적으로 게시하지 마세요. 프로덕션의 경우 Azure Key Vault와 같은 자격 증명을 안전하게 저장하고 액세스하는 방법을 사용합니다. 자세한 내용은 Azure AI 서비스 보안 문서를 참조하세요.

애플리케이션의 main 메서드에서 이 빠른 시작에서 사용되는 메서드에 대한 호출을 추가합니다. 나중에 이를 정의합니다.

Project project = createProject(trainClient);
addTags(trainClient, project);
uploadImages(trainClient, project);
trainProject(trainClient, project);
publishIteration(trainClient, project);
testProject(predictor, project);

개체 모델

다음 클래스 및 인터페이스는 Custom Vision Java 클라이언트 라이브러리의 몇 가지 주요 기능을 처리합니다.

이름 설명
CustomVisionTrainingClient 이 클래스는 모델의 생성, 학습 및 게시를 처리합니다.
CustomVisionPredictionClient 이 클래스는 이미지 분류 예측에 대한 모델의 쿼리를 처리합니다.
ImagePrediction 이 클래스는 단일 이미지에 대한 단일 예측을 정의합니다. 여기에는 개체 ID 및 이름에 대한 속성과 신뢰도 점수가 포함됩니다.

코드 예제

이러한 코드 조각에서는 Java용 Custom Vision 클라이언트 라이브러리를 사용하여 다음 작업을 수행하는 방법을 보여줍니다.

클라이언트 인증

main 메서드에서 엔드포인트와 키를 사용하여 학습 및 예측 클라이언트를 인스턴스화합니다.

// Authenticate
CustomVisionTrainingClient trainClient = CustomVisionTrainingManager
        .authenticate(trainingEndpoint, trainingApiKey)
        .withEndpoint(trainingEndpoint);
CustomVisionPredictionClient predictor = CustomVisionPredictionManager
        .authenticate(predictionEndpoint, predictionApiKey)
        .withEndpoint(predictionEndpoint);

Custom Vision 프로젝트 만들기

T## 새 Custom Vision 프로젝트 만들기

다음 메서드는 이미지 분류 프로젝트를 만듭니다. 생성된 프로젝트는 앞에서 방문한 Custom Vision 웹 사이트에 표시됩니다. 프로젝트를 만들 때 다른 옵션을 지정하려면 CreateProject 메서드 오버로드를 참조하세요(탐지기 빌드 웹 포털 가이드에 설명되어 있음).

public static Project createProject(CustomVisionTrainingClient trainClient) {
    System.out.println("ImageClassification Sample");
    Trainings trainer = trainClient.trainings();

    System.out.println("Creating project...");
    Project project = trainer.createProject().withName("Sample Java Project").execute();

    return project;
}

프로젝트에 태그 추가

다음 메서드는 모델을 학습시키는 태그를 정의합니다.

public static void addTags(CustomVisionTrainingClient trainClient, Project project) {

    Trainings trainer = trainClient.trainings();

    // create hemlock tag
    Tag hemlockTag = trainer.createTag().withProjectId(project.id()).withName("Hemlock").execute();
    // create cherry tag
    Tag cherryTag = trainer.createTag().withProjectId(project.id()).withName("Japanese Cherry").execute();
}

이미지 업로드 및 태그 지정

먼저 이 프로젝트에 대한 샘플 이미지를 다운로드합니다. 샘플 이미지 폴더의 내용을 로컬 디바이스에 저장합니다.

public static void uploadImages(CustomVisionTrainingClient trainClient, Project project) {
    Trainings trainer = trainClient.trainings();
    System.out.println("Adding images...");
    for (int i = 1; i <= 10; i++) {
        String fileName = "hemlock_" + i + ".jpg";
        byte[] contents = GetImage("/Hemlock", fileName);
        AddImageToProject(trainer, project, fileName, contents, hemlockTag.id(), null);
    }

    for (int i = 1; i <= 10; i++) {
        String fileName = "japanese_cherry_" + i + ".jpg";
        byte[] contents = GetImage("/Japanese_Cherry", fileName);
        AddImageToProject(trainer, project, fileName, contents, cherryTag.id(), null);
    }
}

이전 코드 조각은 이미지를 리소스 스트림으로 검색하여 서비스에 업로드하는 두 개의 도우미 함수를 사용합니다(단일 일괄 처리에서 최대 64개의 이미지를 업로드할 수 있음).

private static void AddImageToProject(Trainings trainer, Project project, String fileName, byte[] contents,
        UUID tag, double[] regionValues) {
    System.out.println("Adding image: " + fileName);
    ImageFileCreateEntry file = new ImageFileCreateEntry().withName(fileName).withContents(contents);

    ImageFileCreateBatch batch = new ImageFileCreateBatch().withImages(Collections.singletonList(file));

    // If Optional region is specified, tack it on and place the tag there,
    // otherwise
    // add it to the batch.
    if (regionValues != null) {
        Region region = new Region().withTagId(tag).withLeft(regionValues[0]).withTop(regionValues[1])
                .withWidth(regionValues[2]).withHeight(regionValues[3]);
        file = file.withRegions(Collections.singletonList(region));
    } else {
        batch = batch.withTagIds(Collections.singletonList(tag));
    }

    trainer.createImagesFromFiles(project.id(), batch);
}

private static byte[] GetImage(String folder, String fileName) {
    try {
        return ByteStreams.toByteArray(CustomVisionSamples.class.getResourceAsStream(folder + "/" + fileName));
    } catch (Exception e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
    }
    return null;
}

프로젝트 학습

다음 메서드는 프로젝트의 첫 번째 학습 반복을 만듭니다. 학습이 완료될 때까지 서비스를 쿼리합니다.

public static void trainProject(CustomVisionTrainingClient trainClient, Project project) {
    System.out.println("Training...");
    Trainings trainer = trainClient.trainings();

    Iteration iteration = trainer.trainProject(project.id(), new TrainProjectOptionalParameter());

    while (iteration.status().equals("Training")) {
        System.out.println("Training Status: " + iteration.status());
        Thread.sleep(1000);
        iteration = trainer.getIteration(project.id(), iteration.id());
    }
    System.out.println("Training Status: " + iteration.status());
}

현재 반복 게시

다음 메서드는 모델의 현재 반복을 쿼리에 사용할 수 있도록 합니다. 모델 이름을 참조로 사용하여 예측 요청을 보낼 수 있습니다. predictionResourceId에 대한 고유한 값을 입력해야 합니다. Azure Portal에 있는 리소스의 속성 탭에서 리소스 ID로 나열된 예측 리소스 ID를 찾을 수 있습니다.

public static String publishIteration(CustomVisionTrainingClient trainClient, Project project) {
    Trainings trainer = trainClient.trainings();
    // The iteration is now trained. Publish it to the prediction endpoint.
    String publishedModelName = "myModel";
    trainer.publishIteration(project.id(), iteration.id(), publishedModelName, predictionResourceId);
}

예측 엔드포인트 테스트

이 메서드는 테스트 이미지를 로드하고, 모델 엔드포인트를 쿼리하고, 예측 데이터를 콘솔에 출력합니다.

// load test image
public static void testProject(CustomVisionPredictionClient predictor, Project project) {

    byte[] testImage = GetImage("/Test", "test_image.jpg");

    // predict
    ImagePrediction results = predictor.predictions().classifyImage().withProjectId(project.id())
            .withPublishedName(publishedModelName).withImageData(testImage).execute();

    for (Prediction prediction : results.predictions()) {
        System.out.println(String.format("\t%s: %.2f%%", prediction.tagName(), prediction.probability() * 100.0f));
    }
}

애플리케이션 실행

다음을 사용하여 앱을 빌드할 수 있습니다.

gradle build

gradle run 명령을 사용하여 애플리케이션을 실행합니다.

gradle run

리소스 정리

Azure AI 서비스 구독을 정리하고 제거하려면 리소스 또는 리소스 그룹을 삭제할 수 있습니다. 리소스 그룹을 삭제하면 해당 리소스 그룹에 연결된 다른 모든 리소스가 함께 삭제됩니다.

고유한 이미지 분류 프로젝트를 구현하려면(또는 개체 검색 프로젝트를 시도하려면) 이 예제에서 트리 식별 프로젝트를 삭제하는 것이 좋습니다. 체험 구독은 두 개의 Custom Vision 프로젝트를 허용합니다.

Custom Vision 웹 사이트에서 프로젝트로 이동하여 [내 새 프로젝트] 아래에서 휴지통을 선택합니다.

내 새 프로젝트라는 레이블이 붙은 패널과 휴지통 아이콘이 있는 스크린샷.

다음 단계

이미지 분류 프로세스의 모든 단계를 코드로 수행하는 방법을 살펴보았습니다. 이 샘플은 학습을 한 번만 반복하지만, 정확도를 높이기 위해 모델을 여러 차례 학습하고 테스트해야 하는 경우가 많습니다.

이 가이드는 Node.js용 Custom Vision 클라이언트 라이브러리를 사용하여 이미지 분류 모델을 빌드하는 데 유용한 지침과 샘플 코드를 제공합니다. 프로젝트를 만들고, 태그를 추가하고, 프로젝트를 학습시키고, 프로젝트의 예측 엔드포인트 URL을 사용하여 프로그래밍 방식으로 테스트합니다. 자체 이미지 인식 앱을 빌드하기 위한 템플릿으로 이 예제를 사용합니다.

참고 항목

코드를 작성하지 않고 분류 모델을 빌드하고 학습시키려면 브라우저 기반 지침을 대신 참조하세요.

.NET용 Custom Vision 클라이언트 라이브러리를 사용하여 다음을 수행합니다.

  • 새 Custom Vision 프로젝트 만들기
  • 프로젝트에 태그 추가
  • 이미지 업로드 및 태그 지정
  • 프로젝트 학습
  • 현재 반복 게시
  • 예측 엔드포인트 테스트

참조 설명서(학습)(예측) | 패키지(npm)(학습)(예측) | 샘플

필수 조건

  • Azure 구독 - 체험 구독 만들기
  • 현재 버전의 Node.js
  • Azure 구독이 있으면 Azure portal에서 Custom Vision 리소스를 생성하여 교육 및 예측 리소스를 생성합니다.
    • 평가판 가격 책정 계층(F0)을 통해 서비스를 사용해보고, 나중에 프로덕션용 유료 계층으로 업그레이드할 수 있습니다.

환경 변수 만들기

이 예제에서는 애플리케이션을 실행하는 로컬 컴퓨터의 환경 변수에 자격 증명을 작성합니다.

Azure Portal로 이동합니다. 필수 조건 섹션에서 생성한 Custom Vision 리소스가 성공적으로 배포된 경우 다음 단계 아래에서 리소스로 이동 버튼을 선택합니다. 리소스 관리 아래 리소스의 키 및 엔드포인트 페이지에서 키와 엔드포인트를 찾을 수 있습니다. API 엔드포인트와 함께 학습 및 예측 리소스에 대한 키를 가져와야 합니다.

Azure Portal에 있는 예측 리소스의 속성 탭에서 리소스 ID로 나열된 예측 리소스 ID를 찾을 수 있습니다.

또한 https://www.customvision.ai/을 사용하여 이러한 값을 얻습니다. 로그인한 후 오른쪽 위에 있는 설정 아이콘을 선택합니다. 설정 페이지에서 모든 키, 리소스 ID 및 엔드포인트를 볼 수 있습니다.

환경 변수를 설정하려면 콘솔 창을 열고 운영 체제 및 개발 환경에 대한 지침을 따르세요.

  • VISION_TRAINING KEY 환경 변수를 설정하려면 your-training-key를 학습 리소스의 키 중 하나로 바꾸세요.
  • VISION_TRAINING_ENDPOINT 환경 변수를 설정하려면 your-training-endpoint를 학습 리소스의 엔드포인트로 바꾸세요.
  • VISION_PREDICTION_KEY 환경 변수를 설정하려면 your-prediction-key를 예측 리소스의 키 중 하나로 바꾸세요.
  • VISION_PREDICTION_ENDPOINT 환경 변수를 설정하려면 your-prediction-endpoint를 예측 리소스의 엔드포인트로 바꾸세요.
  • VISION_PREDICTION_RESOURCE_ID 환경 변수를 설정하려면 your-resource-id를 예측 리소스의 리소스 ID로 바꾸세요.

Important

API 키를 사용하는 경우 Azure Key Vault와 같이 다른 곳에 안전하게 저장합니다. API 키를 코드에 직접 포함하지 말고, 공개적으로 게시하지 마세요.

AI 서비스 보안에 대한 자세한 내용은 Azure AI 서비스에 대한 요청 인증을 참조하세요.

setx VISION_TRAINING_KEY your-training-key
setx VISION_TRAINING_ENDPOINT your-training-endpoint
setx VISION_PREDICTION_KEY your-prediction-key
setx VISION_PREDICTION_ENDPOINT your-prediction-endpoint
setx VISION_PREDICTION_RESOURCE_ID your-resource-id

환경 변수가 추가되면 콘솔 창을 포함하여 환경 변수를 읽는 실행 중인 프로그램을 다시 시작해야 할 수 있습니다.

설정

새 Node.js 애플리케이션 만들기

콘솔 창(예: cmd, PowerShell 또는 Bash)에서 앱에 대한 새 디렉터리를 만들고 이 디렉터리로 이동합니다.

mkdir myapp && cd myapp

package.json 파일을 사용하여 노드 애플리케이션을 만들려면 npm init 명령을 실행합니다.

npm init

클라이언트 라이브러리 설치

Node.js용 Custom Vision을 사용하여 이미지 분석 앱을 작성하려면 Custom Vision NPM 패키지가 필요합니다. 이를 설치하려면 PowerShell에서 다음 명령을 실행합니다.

npm install @azure/cognitiveservices-customvision-training
npm install @azure/cognitiveservices-customvision-prediction

종속성이 있는 앱의 package.json 파일이 업데이트됩니다.

파일 index.js를 만들고 다음 라이브러리를 가져옵니다.

const util = require('util');
const fs = require('fs');
const TrainingApi = require("@azure/cognitiveservices-customvision-training");
const PredictionApi = require("@azure/cognitiveservices-customvision-prediction");
const msRest = require("@azure/ms-rest-js");

한 번에 전체 빠른 시작 코드 파일을 보시겠습니까? GitHub에서 찾을 수 있으며 이 빠른 시작의 코드 예제를 포함합니다.

리소스의 Azure 엔드포인트 및 키에 대한 변수를 만듭니다.

// retrieve environment variables
const trainingKey = process.env["VISION_TRAINING_KEY"];
const trainingEndpoint = process.env["VISION_TRAINING_ENDPOINT"];

const predictionKey = process.env["VISION_PREDICTION_KEY"];
const predictionResourceId = process.env["VISION_PREDICTION_RESOURCE_ID"];
const predictionEndpoint = process.env["VISION_PREDICTION_ENDPOINT"];

또한 프로젝트 이름의 필드와 비동기 호출에 대한 시간 제한 매개 변수를 추가합니다.

const publishIterationName = "classifyModel";
const setTimeoutPromise = util.promisify(setTimeout);

개체 모델

이름 설명
TrainingAPIClient 이 클래스는 모델의 생성, 학습 및 게시를 처리합니다.
PredictionAPIClient 이 클래스는 이미지 분류 예측에 대한 모델의 쿼리를 처리합니다.
예측 이 인터페이스는 단일 이미지에 대한 단일 예측을 정의합니다. 여기에는 개체 ID 및 이름에 대한 속성과 신뢰도 점수가 포함됩니다.

코드 예제

이러한 코드 조각에서는 JavaScript용 Custom Vision 클라이언트 라이브러리를 사용하여 다음 작업을 수행하는 방법을 보여줍니다.

클라이언트 인증

클라이언트 개체를 엔드포인트와 키로 인스턴스화합니다. 키를 사용하여 ApiKeyCredentials 개체를 만들고 엔드포인트와 함께 사용하여 TrainingAPIClientPredictionAPIClient 개체를 만듭니다.

const credentials = new msRest.ApiKeyCredentials({ inHeader: { "Training-key": trainingKey } });
const trainer = new TrainingApi.TrainingAPIClient(credentials, trainingEndpoint);
const predictor_credentials = new msRest.ApiKeyCredentials({ inHeader: { "Prediction-key": predictionKey } });
const predictor = new PredictionApi.PredictionAPIClient(predictor_credentials, predictionEndpoint);

새 Custom Vision 프로젝트 만들기

모든 Custom Vision 함수 호출을 포함하도록 새 함수를 시작합니다. 다음 코드를 추가하여 새 Custom Vision 서비스 프로젝트를 만듭니다.

(async () => {
    console.log("Creating project...");
    const sampleProject = await trainer.createProject("Sample Project");

프로젝트에 태그 추가

프로젝트에 분류 태그를 만들려면 함수에 다음 코드를 추가합니다.

const hemlockTag = await trainer.createTag(sampleProject.id, "Hemlock");
const cherryTag = await trainer.createTag(sampleProject.id, "Japanese Cherry");

이미지 업로드 및 태그 지정

먼저 이 프로젝트에 대한 샘플 이미지를 다운로드합니다. 샘플 이미지 폴더의 내용을 로컬 디바이스에 저장합니다.

프로젝트에 샘플 이미지를 추가하려면 태그를 만든 후 다음 코드를 삽입합니다. 이 코드는 해당 태그를 사용하여 각 이미지를 업로드합니다.

const sampleDataRoot = "Images";

console.log("Adding images...");
let fileUploadPromises = [];

const hemlockDir = `${sampleDataRoot}/Hemlock`;
const hemlockFiles = fs.readdirSync(hemlockDir);
hemlockFiles.forEach(file => {
    fileUploadPromises.push(trainer.createImagesFromData(sampleProject.id, fs.readFileSync(`${hemlockDir}/${file}`), { tagIds: [hemlockTag.id] }));
});

const cherryDir = `${sampleDataRoot}/Japanese_Cherry`;
const japaneseCherryFiles = fs.readdirSync(cherryDir);
japaneseCherryFiles.forEach(file => {
    fileUploadPromises.push(trainer.createImagesFromData(sampleProject.id, fs.readFileSync(`${cherryDir}/${file}`), { tagIds: [cherryTag.id] }));
});

await Promise.all(fileUploadPromises);

Important

Azure AI 서비스 Python SDK 샘플 리포지토리를 다운로드한 위치에 따라 이미지(sampleDataRoot) 경로를 변경해야 합니다.

프로젝트 학습

이 코드는 예측 모델의 첫 번째 반복을 만듭니다.

console.log("Training...");
let trainingIteration = await trainer.trainProject(sampleProject.id);

// Wait for training to complete
console.log("Training started...");
while (trainingIteration.status == "Training") {
    console.log("Training status: " + trainingIteration.status);
    await setTimeoutPromise(1000, null);
    trainingIteration = await trainer.getIteration(sampleProject.id, trainingIteration.id)
}
console.log("Training status: " + trainingIteration.status);

현재 반복 게시

이 코드는 학습된 반복을 예측 엔드포인트에 게시합니다. 게시된 반복에 부여된 이름은 예측 요청을 보내는 데 사용할 수 있습니다. 반복은 게시될 때까지 예측 엔드포인트에서 사용할 수 없습니다.

// Publish the iteration to the end point
await trainer.publishIteration(sampleProject.id, trainingIteration.id, publishIterationName, predictionResourceId);

예측 엔드포인트 테스트

예측 엔드포인트에 이미지를 보내고 예측을 검색하려면 함수에 다음 코드를 추가합니다.

const testFile = fs.readFileSync(`${sampleDataRoot}/Test/test_image.jpg`);

const results = await predictor.classifyImage(sampleProject.id, publishIterationName, testFile);

// Show results
console.log("Results:");
results.predictions.forEach(predictedResult => {
    console.log(`\t ${predictedResult.tagName}: ${(predictedResult.probability * 100.0).toFixed(2)}%`);
});

그런 다음, Custom Vision 함수를 닫고 호출합니다.

})()

애플리케이션 실행

quickstart 파일의 node 명령을 사용하여 애플리케이션을 실행합니다.

node index.js

애플리케이션의 출력은 다음 텍스트와 비슷할 것입니다.

Creating project...
Adding images...
Training...
Training started...
Training status: Training
Training status: Training
Training status: Training
Training status: Completed
Results:
         Hemlock: 94.97%
         Japanese Cherry: 0.01%

그런 다음 테스트 이미지(<sampleDataRoot>/Test/에 있음)에 적절한 태그가 지정되었는지 확인할 수 있습니다. Custom Vision 웹 사이트로 돌아가서 새로 만든 프로젝트의 현재 상태를 살펴볼 수도 있습니다.

고유한 이미지 분류 프로젝트를 구현하려면(또는 개체 검색 프로젝트를 시도하려면) 이 예제에서 트리 식별 프로젝트를 삭제하는 것이 좋습니다. 체험 구독은 두 개의 Custom Vision 프로젝트를 허용합니다.

Custom Vision 웹 사이트에서 프로젝트로 이동하여 [내 새 프로젝트] 아래에서 휴지통을 선택합니다.

내 새 프로젝트라는 레이블이 붙은 패널과 휴지통 아이콘이 있는 스크린샷.

다음 단계

지금까지 개체 검색 프로세스의 모든 단계를 코드로 수행하는 방법을 살펴보았습니다. 이 샘플은 학습을 한 번만 반복하지만, 정확도를 높이기 위해 모델을 여러 차례 학습하고 테스트해야 하는 경우가 많습니다.

Python용 Custom Vision 클라이언트 라이브러리를 시작합니다. 이러한 단계에 따라 패키지를 설치하고 이미지 분류 모델을 빌드하기 위한 예제 코드를 사용해 봅니다. 프로젝트를 만들고, 태그를 추가하고, 프로젝트를 학습시키고, 프로젝트의 예측 엔드포인트 URL을 사용하여 프로그래밍 방식으로 테스트합니다. 자체 이미지 인식 앱을 빌드하기 위한 템플릿으로 이 예제를 사용합니다.

참고 항목

코드를 작성하지 않고 분류 모델을 빌드하고 학습시키려면 브라우저 기반 지침을 대신 참조하세요.

Python용 Custom Vision 클라이언트 라이브러리를 사용하여 다음을 수행합니다.

  • 새 Custom Vision 프로젝트 만들기
  • 프로젝트에 태그 추가
  • 이미지 업로드 및 태그 지정
  • 프로젝트 학습
  • 현재 반복 게시
  • 예측 엔드포인트 테스트

참조 설명서 | 라이브러리 소스 코드 | 패키지(PyPI) | 샘플

필수 조건

  • Azure 구독 - 체험 구독 만들기
  • Python 3.x
    • Python 설치에 pip가 포함되어야 합니다. 명령줄에서 pip --version을 실행하여 pip가 설치되어 있는지 확인할 수 있습니다. 최신 버전의 Python을 설치하여 pip를 받으세요.
  • Azure 구독이 있으면 Azure Portal에서 Custom Vision 리소스를 생성하여 훈련 및 예측 리소스를 생성합니다.
    • 평가판 가격 책정 계층(F0)을 통해 서비스를 사용해보고, 나중에 프로덕션용 유료 계층으로 업그레이드할 수 있습니다.

환경 변수 만들기

이 예제에서는 애플리케이션을 실행하는 로컬 컴퓨터의 환경 변수에 자격 증명을 작성합니다.

Azure Portal로 이동합니다. 필수 조건 섹션에서 생성한 Custom Vision 리소스가 성공적으로 배포된 경우 다음 단계 아래에서 리소스로 이동 버튼을 선택합니다. 리소스 관리 아래 리소스의 키 및 엔드포인트 페이지에서 키와 엔드포인트를 찾을 수 있습니다. API 엔드포인트와 함께 학습 및 예측 리소스에 대한 키를 가져와야 합니다.

Azure Portal에 있는 예측 리소스의 속성 탭에서 리소스 ID로 나열된 예측 리소스 ID를 찾을 수 있습니다.

또한 https://www.customvision.ai/을 사용하여 이러한 값을 얻습니다. 로그인한 후 오른쪽 위에 있는 설정 아이콘을 선택합니다. 설정 페이지에서 모든 키, 리소스 ID 및 엔드포인트를 볼 수 있습니다.

환경 변수를 설정하려면 콘솔 창을 열고 운영 체제 및 개발 환경에 대한 지침을 따르세요.

  • VISION_TRAINING KEY 환경 변수를 설정하려면 your-training-key를 학습 리소스의 키 중 하나로 바꾸세요.
  • VISION_TRAINING_ENDPOINT 환경 변수를 설정하려면 your-training-endpoint를 학습 리소스의 엔드포인트로 바꾸세요.
  • VISION_PREDICTION_KEY 환경 변수를 설정하려면 your-prediction-key를 예측 리소스의 키 중 하나로 바꾸세요.
  • VISION_PREDICTION_ENDPOINT 환경 변수를 설정하려면 your-prediction-endpoint를 예측 리소스의 엔드포인트로 바꾸세요.
  • VISION_PREDICTION_RESOURCE_ID 환경 변수를 설정하려면 your-resource-id를 예측 리소스의 리소스 ID로 바꾸세요.

Important

API 키를 사용하는 경우 Azure Key Vault와 같이 다른 곳에 안전하게 저장합니다. API 키를 코드에 직접 포함하지 말고, 공개적으로 게시하지 마세요.

AI 서비스 보안에 대한 자세한 내용은 Azure AI 서비스에 대한 요청 인증을 참조하세요.

setx VISION_TRAINING_KEY your-training-key
setx VISION_TRAINING_ENDPOINT your-training-endpoint
setx VISION_PREDICTION_KEY your-prediction-key
setx VISION_PREDICTION_ENDPOINT your-prediction-endpoint
setx VISION_PREDICTION_RESOURCE_ID your-resource-id

환경 변수가 추가되면 콘솔 창을 포함하여 환경 변수를 읽는 실행 중인 프로그램을 다시 시작해야 할 수 있습니다.

설정

클라이언트 라이브러리 설치

Python용 Custom Vision을 사용하여 이미지 분석 앱을 작성하려면 Custom Vision 클라이언트 라이브러리가 필요합니다. Python을 설치한 후 PowerShell 또는 콘솔 창에서 다음 명령을 실행합니다.

pip install azure-cognitiveservices-vision-customvision

새 Python 애플리케이션 만들기

새 Python 파일을 만들고 다음 라이브러리를 가져옵니다.

from azure.cognitiveservices.vision.customvision.training import CustomVisionTrainingClient
from azure.cognitiveservices.vision.customvision.prediction import CustomVisionPredictionClient
from azure.cognitiveservices.vision.customvision.training.models import ImageFileCreateBatch, ImageFileCreateEntry, Region
from msrest.authentication import ApiKeyCredentials
import os, time, uuid

한 번에 전체 빠른 시작 코드 파일을 보시겠습니까? GitHub에서 찾을 수 있으며 이 빠른 시작의 코드 예제를 포함합니다.

리소스의 Azure 엔드포인트 및 키에 대한 변수를 만듭니다.

# retrieve environment variables
ENDPOINT = os.environ["VISION_TRAINING_ENDPOINT"]
training_key = os.environ["VISION_TRAINING_KEY"]
prediction_key = os.environ["VISION_PREDICTION_KEY"]
prediction_resource_id = os.environ["VISION_PREDICTION_RESOURCE_ID"]

개체 모델

이름 설명
CustomVisionTrainingClient 이 클래스는 모델의 생성, 학습 및 게시를 처리합니다.
CustomVisionPredictionClient 이 클래스는 이미지 분류 예측에 대한 모델의 쿼리를 처리합니다.
ImagePrediction 이 클래스는 단일 이미지에서 단일 개체 예측을 정의합니다. 여기에는 개체 ID 및 이름, 개체의 경계 상자 위치 및 신뢰도 점수에 대한 속성이 포함됩니다.

코드 예제

이러한 코드 조각은 Python용 Custom Vision 클라이언트 라이브러리를 사용하여 다음 작업을 수행하는 방법을 보여줍니다.

클라이언트 인증

엔드포인트와 키를 사용하여 학습 및 예측 클라이언트를 인스턴스화합니다. 키를 사용하여 ApiKeyServiceClientCredentials 개체를 만들고 엔드포인트와 함께 사용하여 CustomVisionTrainingClientCustomVisionPredictionClient 개체를 만듭니다.

credentials = ApiKeyCredentials(in_headers={"Training-key": training_key})
trainer = CustomVisionTrainingClient(ENDPOINT, credentials)
prediction_credentials = ApiKeyCredentials(in_headers={"Prediction-key": prediction_key})
predictor = CustomVisionPredictionClient(ENDPOINT, prediction_credentials)

새 Custom Vision 프로젝트 만들기

새 Custom Vision Service 프로젝트를 만드는 다음 코드를 스크립트에 추가합니다.

프로젝트를 만들 때 다른 옵션을 지정하려면 create_project 메서드를 참조하세요(분류자 빌드 웹 포털 가이드에 설명되어 있음).

publish_iteration_name = "classifyModel"

credentials = ApiKeyCredentials(in_headers={"Training-key": training_key})
trainer = CustomVisionTrainingClient(ENDPOINT, credentials)

# Create a new project
print ("Creating project...")
project_name = uuid.uuid4()
project = trainer.create_project(project_name)

프로젝트에 태그 추가

프로젝트에 분류 태그를 추가하려면 다음 코드를 추가합니다.

# Make two tags in the new project
hemlock_tag = trainer.create_tag(project.id, "Hemlock")
cherry_tag = trainer.create_tag(project.id, "Japanese Cherry")

이미지 업로드 및 태그 지정

먼저 이 프로젝트에 대한 샘플 이미지를 다운로드합니다. 샘플 이미지 폴더의 내용을 로컬 디바이스에 저장합니다.

프로젝트에 샘플 이미지를 추가하려면 태그를 만든 후 다음 코드를 삽입합니다. 이 코드는 해당 태그를 사용하여 각 이미지를 업로드합니다. 단일 일괄 처리에서 최대 64개의 이미지를 업로드할 수 있습니다.

base_image_location = os.path.join (os.path.dirname(__file__), "Images")

print("Adding images...")

image_list = []

for image_num in range(1, 11):
    file_name = "hemlock_{}.jpg".format(image_num)
    with open(os.path.join (base_image_location, "Hemlock", file_name), "rb") as image_contents:
        image_list.append(ImageFileCreateEntry(name=file_name, contents=image_contents.read(), tag_ids=[hemlock_tag.id]))

for image_num in range(1, 11):
    file_name = "japanese_cherry_{}.jpg".format(image_num)
    with open(os.path.join (base_image_location, "Japanese_Cherry", file_name), "rb") as image_contents:
        image_list.append(ImageFileCreateEntry(name=file_name, contents=image_contents.read(), tag_ids=[cherry_tag.id]))

upload_result = trainer.create_images_from_files(project.id, ImageFileCreateBatch(images=image_list))
if not upload_result.is_batch_successful:
    print("Image batch upload failed.")
    for image in upload_result.images:
        print("Image status: ", image.status)
    exit(-1)

참고 항목

Azure AI 서비스 Python SDK 샘플 리포지토리를 다운로드한 위치에 따라 이미지 경로를 변경해야 합니다.

프로젝트 학습

이 코드는 예측 모델의 첫 번째 반복을 만듭니다.

print ("Training...")
iteration = trainer.train_project(project.id)
while (iteration.status != "Completed"):
    iteration = trainer.get_iteration(project.id, iteration.id)
    print ("Training status: " + iteration.status)
    print ("Waiting 10 seconds...")
    time.sleep(10)

선택한 태그로 학습

적용된 태그의 하위 집합에 대해서만 선택적으로 학습을 수행할 수 있습니다. 특정 태그는 아직 충분히 적용하지 않았지만 다른 태그는 충분히 적용한 경우 이 작업을 수행할 수 있습니다. train_project 호출에서 선택적 매개 변수 selected_tags를 사용하려는 태그의 ID 문자열 목록으로 설정합니다. 모델은 해당 목록의 태그만 인식하도록 학습됩니다.

현재 반복 게시

반복은 게시될 때까지 예측 엔드포인트에서 사용할 수 없습니다. 다음 코드는 모델의 현재 반복을 쿼리에 사용할 수 있도록 합니다.

# The iteration is now trained. Publish it to the project endpoint
trainer.publish_iteration(project.id, iteration.id, publish_iteration_name, prediction_resource_id)
print ("Done!")

예측 엔드포인트 테스트

예측 엔드포인트에 이미지를 보내고 예측을 검색하려면 파일의 끝에 다음 코드를 추가합니다.

# Now there is a trained endpoint that can be used to make a prediction
prediction_credentials = ApiKeyCredentials(in_headers={"Prediction-key": prediction_key})
predictor = CustomVisionPredictionClient(ENDPOINT, prediction_credentials)

with open(os.path.join (base_image_location, "Test/test_image.jpg"), "rb") as image_contents:
    results = predictor.classify_image(
        project.id, publish_iteration_name, image_contents.read())

    # Display the results.
    for prediction in results.predictions:
        print("\t" + prediction.tag_name +
              ": {0:.2f}%".format(prediction.probability * 100))

애플리케이션 실행

CustomVisionQuickstart.py를 실행합니다.

python CustomVisionQuickstart.py

애플리케이션의 출력은 다음 텍스트와 비슷할 것입니다.

Creating project...
Adding images...
Training...
Training status: Training
Training status: Completed
Done!
        Hemlock: 93.53%
        Japanese Cherry: 0.01%

그런 다음, 테스트 이미지(<base_image_location>/images/Test/에 있음)에 태그가 적절하게 지정되는지 확인할 수 있습니다. Custom Vision 웹 사이트로 돌아가서 새로 만든 프로젝트의 현재 상태를 살펴볼 수도 있습니다.

리소스 정리

고유한 이미지 분류 프로젝트를 구현하려면(또는 개체 검색 프로젝트를 시도하려면) 이 예제에서 트리 식별 프로젝트를 삭제하는 것이 좋습니다. 체험 구독은 두 개의 Custom Vision 프로젝트를 허용합니다.

Custom Vision 웹 사이트에서 프로젝트로 이동하여 [내 새 프로젝트] 아래에서 휴지통을 선택합니다.

내 새 프로젝트라는 레이블이 붙은 패널과 휴지통 아이콘이 있는 스크린샷.

다음 단계

이미지 분류 프로세스의 모든 단계를 코드로 수행하는 방법을 살펴보았습니다. 이 샘플은 학습을 한 번만 반복하지만, 정확도를 높이기 위해 모델을 여러 차례 학습하고 테스트해야 하는 경우가 많습니다.

Custom Vision REST API를 시작합니다. API를 호출하고 이미지 분류 모델을 빌드하려면 다음 단계를 수행합니다. 프로젝트를 만들고, 태그를 추가하고, 프로젝트를 학습시키고, 프로젝트의 예측 엔드포인트 URL을 사용하여 프로그래밍 방식으로 테스트합니다. 자체 이미지 인식 앱을 빌드하기 위한 템플릿으로 이 예제를 사용합니다.

참고 항목

Custom Vision은 클라이언트 라이브러리 SDK 또는 브라우저 기반 지침을 통해 가장 쉽게 사용할 수 있습니다.

.NET용 Custom Vision 클라이언트 라이브러리를 사용하여 다음을 수행합니다.

  • 새 Custom Vision 프로젝트 만들기
  • 프로젝트에 태그 추가
  • 이미지 업로드 및 태그 지정
  • 프로젝트 학습
  • 현재 반복 게시
  • 예측 엔드포인트 테스트

필수 조건

  • Azure 구독 - 체험 구독 만들기
  • Azure 구독이 있으면 Azure Portal에서 Custom Vision 리소스를 만들어 학습 및 예측 리소스를 만들고 키와 엔드포인트를 가져옵니다. 배포될 때까지 기다렸다가 리소스로 이동 단추를 클릭합니다.
    • 애플리케이션을 Custom Vision에 연결하려면 만든 리소스의 키와 엔드포인트가 필요합니다. 이 빠른 시작의 뒷부분에 나오는 코드에 키와 엔드포인트를 붙여넣습니다.
    • 평가판 가격 책정 계층(F0)을 통해 서비스를 사용해보고, 나중에 프로덕션용 유료 계층으로 업그레이드할 수 있습니다.
  • PowerShell 버전 6.0 이상 또는 유사한 명령줄 애플리케이션.

새 Custom Vision 프로젝트 만들기

다음과 같은 명령을 사용하여 이미지 분류 프로젝트를 만듭니다. 만든 프로젝트는 Custom Vision 웹 사이트에 표시됩니다.

curl -v -X POST -H "Training-key: {subscription key}" "https://{endpoint}/customvision/v3.3/Training/projects?name={name}"

명령을 텍스트 편집기에 복사하여 다음을 변경합니다.

  • {subscription key}를 유효한 Face 키로 바꿉니다.
  • {endpoint}를 키에 해당하는 엔드포인트로 바꿉니다.

    참고 항목

    2019년 7월 1일 이후에 만들어진 새 리소스는 사용자 지정 하위 도메인 이름을 사용합니다. 자세한 내용과 지역 엔드포인트의 전체 목록은 Azure AI 서비스에 대한 사용자 지정 하위 도메인 이름을 참조하세요.

  • {name}를 프로젝트의 이름으로 바꿉니다.
  • 필요한 경우 다른 URL 매개 변수를 설정하여 프로젝트에서 사용할 모델 유형을 구성합니다. 옵션은 CreatProject API를 참조하세요.

다음과 같은 JSON 응답이 수신됩니다. 프로젝트의 "id" 값을 임시 위치에 저장합니다.

{
  "id": "00000000-0000-0000-0000-000000000000",
  "name": "string",
  "description": "string",
  "settings": {
    "domainId": "00000000-0000-0000-0000-000000000000",
    "classificationType": "Multiclass",
    "targetExportPlatforms": [
      "CoreML"
    ],
    "useNegativeSet": true,
    "detectionParameters": "string",
    "imageProcessingSettings": {
      "augmentationMethods": {}
    }
  },
  "created": "string",
  "lastModified": "string",
  "thumbnailUri": "string",
  "drModeEnabled": true,
  "status": "Succeeded"
}

프로젝트에 태그 추가

다음 명령을 사용하여 모델을 학습시킬 태그를 정의합니다.

curl -v -X POST -H "Training-key: {subscription key}" "https://{endpoint}/customvision/v3.3/Training/projects/{projectId}/tags?name={name}"
  • 이 경우에도 고유한 키와 엔드포인트 URL을 삽입합니다.
  • {projectId}는 고유한 프로젝트 ID로 바꿉니다.
  • {name}은 사용하려는 태그의 이름으로 바꿉니다.

프로젝트에서 사용할 모든 태그에 대해 이 프로세스를 반복합니다. 제공된 예제 이미지를 사용하는 경우 "Hemlock""Japanese Cherry" 태그를 추가합니다.

다음과 같은 JSON 응답이 수신됩니다. 각 태그의 "id" 값을 임시 위치에 저장합니다.

{
  "id": "00000000-0000-0000-0000-000000000000",
  "name": "string",
  "description": "string",
  "type": "Regular",
  "imageCount": 0
}

이미지 업로드 및 태그 지정

다음으로, 이 프로젝트에 대한 샘플 이미지를 다운로드합니다. 샘플 이미지 폴더의 내용을 로컬 디바이스에 저장합니다.

다음 명령을 사용하여 이미지를 업로드하고 "Hemlock" 이미지에 대해 한 번, "Japanese Cherry" 이미지에 대해 별도로 태그를 적용합니다. 자세한 옵션은 Create Images From Data API를 참조하세요.

curl -v -X POST -H "Content-Type: multipart/form-data" -H "Training-key: {subscription key}" "https://{endpoint}/customvision/v3.3/Training/projects/{projectId}/images?tagIds={tagArray}"
--data-ascii "{binary data}"
  • 이 경우에도 고유한 키와 엔드포인트 URL을 삽입합니다.
  • {projectId}는 고유한 프로젝트 ID로 바꿉니다.
  • {tagArray}는 태그의 ID로 바꿉니다.
  • 그런 다음, 요청 본문을 태그를 지정할 이미지의 이진 데이터로 채웁니다.

프로젝트 학습

이 메서드는 업로드된 태그 지정 이미지를 모델에 학습시키고 현재 프로젝트 반복을 위한 ID를 반환합니다.

curl -v -X POST -H "Content-Type: application/json" -H "Training-key: {subscription key}" "https://{endpoint}/customvision/v3.3/Training/projects/{projectId}/train"
  • 이 경우에도 고유한 키와 엔드포인트 URL을 삽입합니다.
  • {projectId}는 고유한 프로젝트 ID로 바꿉니다.
  • {tagArray}는 태그의 ID로 바꿉니다.
  • 그런 다음, 요청 본문을 태그를 지정할 이미지의 이진 데이터로 채웁니다.
  • 필요한 경우 다른 URL 매개 변수를 사용합니다. 옵션은 Train Project API를 참조하세요.

선택한 태그로 학습

적용된 태그의 하위 집합에 대해서만 선택적으로 학습을 수행할 수 있습니다. 특정 태그는 아직 충분히 적용하지 않았지만 다른 태그는 충분히 적용한 경우 이 작업을 수행할 수 있습니다. 요청 본문에 선택적 JSON 콘텐츠를 추가합니다. "selectedTags" 배열을 사용하려는 태그의 ID로 채웁니다.

{
  "selectedTags": [
    "00000000-0000-0000-0000-000000000000"
  ]
}

JSON 응답에는 반복 ID("id")를 비롯하여 학습된 프로젝트에 대한 정보가 포함됩니다. 다음 단계를 위해 이 값을 저장합니다.

{
  "id": "00000000-0000-0000-0000-000000000000",
  "name": "string",
  "status": "string",
  "created": "string",
  "lastModified": "string",
  "trainedAt": "string",
  "projectId": "00000000-0000-0000-0000-000000000000",
  "exportable": true,
  "exportableTo": [
    "CoreML"
  ],
  "domainId": "00000000-0000-0000-0000-000000000000",
  "classificationType": "Multiclass",
  "trainingType": "Regular",
  "reservedBudgetInHours": 0,
  "trainingTimeInMinutes": 0,
  "publishName": "string",
  "originalPublishResourceId": "string"
}

현재 반복 게시

다음 메서드는 모델의 현재 반복을 쿼리에 사용할 수 있도록 합니다. 반환된 모델 이름을 참조로 사용하여 예측 요청을 보낼 수 있습니다.

curl -v -X POST -H "Training-key: {subscription key}" "https://{endpoint}/customvision/v3.3/Training/projects/{projectId}/iterations/{iterationId}/publish?publishName={publishName}&predictionId={predictionId}"
  • 이 경우에도 고유한 키와 엔드포인트 URL을 삽입합니다.
  • {projectId}는 고유한 프로젝트 ID로 바꿉니다.
  • {iterationId}를 이전 단계에서 반환된 ID로 바꿉니다.
  • {publishedName}은 예측 모델에 할당하려는 이름으로 바꿉니다.
  • {predictionId}는 고유한 예측 리소스 ID로 바꿉니다. Azure Portal에 있는 리소스의 속성 탭에서 리소스 ID로 나열된 예측 리소스 ID를 찾을 수 있습니다.
  • 필요한 경우 다른 URL 매개 변수를 사용합니다. Publish Iteration API를 참조하세요.

예측 엔드포인트 테스트

마지막으로, 이 명령을 사용하여 태그로 분류할 새 이미지를 업로드하는 방식으로 학습된 모델을 테스트합니다. 이전에 다운로드한 샘플 파일의 "Test" 폴더에 있는 이미지를 사용할 수 있습니다.

curl -v -X POST -H "Training-key: {subscription key}" "https://{endpoint}/customvision/v3.3/Training/projects/{projectId}/iterations/{iterationId}/publish?publishName={publishName}&predictionId={predictionId}"
  • 이 경우에도 고유한 키와 엔드포인트 URL을 삽입합니다.
  • {projectId}는 고유한 프로젝트 ID로 바꿉니다.
  • {publishedName}을 이전 단계에서 사용한 이름으로 바꿉니다.
  • 로컬 이미지의 이진 데이터를 요청 본문에 추가합니다.
  • 필요한 경우 다른 URL 매개 변수를 사용합니다. Classify Image API를 참조하세요.

반환된 JSON 응답에는 모델이 이미지에 적용한 각 태그와 각 태그의 가능성 점수가 나열됩니다.

{
  "id": "00000000-0000-0000-0000-000000000000",
  "project": "00000000-0000-0000-0000-000000000000",
  "iteration": "00000000-0000-0000-0000-000000000000",
  "created": "string",
  "predictions": [
    {
      "probability": 0.0,
      "tagId": "00000000-0000-0000-0000-000000000000",
      "tagName": "string",
      "boundingBox": {
        "left": 0.0,
        "top": 0.0,
        "width": 0.0,
        "height": 0.0
      },
      "tagType": "Regular"
    }
  ]
}

고유한 이미지 분류 프로젝트를 구현하려면(또는 개체 검색 프로젝트를 시도하려면) 이 예제에서 트리 식별 프로젝트를 삭제하는 것이 좋습니다. 체험 구독은 두 개의 Custom Vision 프로젝트를 허용합니다.

Custom Vision 웹 사이트에서 프로젝트로 이동하여 [내 새 프로젝트] 아래에서 휴지통을 선택합니다.

내 새 프로젝트라는 레이블이 붙은 패널과 휴지통 아이콘이 있는 스크린샷.

다음 단계

이제 REST API를 사용하여 이미지 분류 프로세스의 모든 단계를 완료했습니다. 이 샘플은 학습을 한 번만 반복하지만, 정확도를 높이기 위해 모델을 여러 차례 학습하고 테스트해야 하는 경우가 많습니다.