Hızlı Başlangıç: Özel Görüntü İşleme istemci kitaplığı ile nesne algılama projesi oluşturma

.NET için Özel Görüntü İşleme istemci kitaplığını kullanmaya başlayın. Paketi yüklemek için bu adımları izleyin ve nesne algılama modeli oluşturmaya yönelik örnek kodu deneyin. Bir proje oluşturacak, etiketler ekleyecek, örnek görüntülerde projeyi eğitecek ve program aracılığıyla test etmek için projenin tahmin uç noktası URL'sini kullanacaksınız. Bu örneği kendi görüntü tanıma uygulamanızı oluşturmak için şablon olarak kullanın.

Not

Kod yazmadan bir nesne algılama modeli oluşturmak ve eğitmek istiyorsanız bunun yerine tarayıcı tabanlı kılavuza bakın.

Başvuru belgeleri | Kitaplık kaynak kodu (eğitim)(tahmin) | Paket (NuGet) (eğitim)(tahmin) | Örnekler

Önkoşullar

  • Azure aboneliği - Ücretsiz olarak oluşturun
  • Visual Studio IDE veya .NET Core'un geçerli sürümü.
  • Azure aboneliğinizi aldıktan sonra, eğitim ve tahmin kaynağı oluşturmak için Azure portalında bir Özel Görüntü İşleme kaynağı oluşturun.
    • Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (F0) kullanabilirsiniz.

Ortam değişkenlerini oluşturma

Bu örnekte, kimlik bilgilerinizi uygulamayı çalıştıran yerel makinedeki ortam değişkenlerine yazacaksınız.

Azure portalına gidin. Önkoşullar bölümünde oluşturduğunuz Özel Görüntü İşleme kaynaklar başarıyla dağıtıldıysa, Sonraki Adımlar'ın altındaki Kaynağa Git düğmesini seçin. Anahtarlarınızı ve uç noktalarınızı kaynakların anahtar ve uç nokta sayfalarında, kaynak yönetimi altında bulabilirsiniz. API uç noktalarıyla birlikte hem eğitim hem de tahmin kaynaklarınızın anahtarlarını almanız gerekir.

Tahmin kaynağı kimliğini Azure portalındaki Tahmin kaynağının Özellikler sekmesinde Kaynak Kimliği olarak listelenmiş olarak bulabilirsiniz.

İpucu

Bu değerleri almak için de kullanırsınız https://www.customvision.ai/ . Oturum açıldıktan sonra sağ üstteki Ayarlar simgesini seçin. Ayar sayfalarında tüm anahtarları, kaynak kimliğini ve uç noktaları görüntüleyebilirsiniz.

Dikkat

Anahtarı doğrudan kodunuz içinde eklemeyin ve asla herkese açık olarak göndermeyin. Azure Key Vault gibi daha fazla kimlik doğrulama seçeneği için Azure AI hizmetleri güvenlik makalesine bakın.

Ortam değişkenlerini ayarlamak için bir konsol penceresi açın ve işletim sisteminizle geliştirme ortamınıza yönelik yönergeleri izleyin.

  1. Ortam değişkenini VISION_TRAINING KEY ayarlamak için öğesini eğitim kaynağınızın anahtarlarından biriyle değiştirin your-training-key .
  2. Ortam değişkenini VISION_TRAINING_ENDPOINT ayarlamak için öğesini eğitim kaynağınızın uç noktasıyla değiştirin your-training-endpoint .
  3. Ortam değişkenini VISION_PREDICTION_KEY ayarlamak için değerini tahmin kaynağınızın anahtarlarından biriyle değiştirin your-prediction-key .
  4. Ortam değişkenini VISION_PREDICTION_ENDPOINT ayarlamak için değerini tahmin kaynağınızın uç noktasıyla değiştirin your-prediction-endpoint .
  5. Ortam değişkenini VISION_PREDICTION_RESOURCE_ID ayarlamak için değerini tahmin kaynağınızın kaynak kimliğiyle değiştirin your-resource-id .
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

Ortam değişkenlerini ekledikten sonra, konsol penceresi de dahil olmak üzere ortam değişkenlerini okuyacak tüm çalışan programları yeniden başlatmanız gerekebilir.

Ayarlama

Yeni bir C# uygulaması oluşturma

Visual Studio'yu kullanarak yeni bir .NET Core uygulaması oluşturun.

İstemci kitaplığını yükleme

Yeni bir proje oluşturduktan sonra, Çözüm Gezgini proje çözümüne sağ tıklayıp NuGet Paketlerini Yönet'i seçerek istemci kitaplığını yükleyin. Açılan paket yöneticisinde Gözat'ı seçin, Ön sürümü dahil et'i işaretleyin ve ve Microsoft.Azure.CognitiveServices.Vision.CustomVision.Predictionaraması yapınMicrosoft.Azure.CognitiveServices.Vision.CustomVision.Training. En son sürümü ve ardından Yükle'yi seçin.

İpucu

Tüm hızlı başlangıç kodunu aynı anda görüntülemek mi istiyorsunuz? Bunu, bu hızlı başlangıçtaki kod örneklerini içeren GitHub’da bulabilirsiniz.

Proje dizininden program.cs dosyasını açın ve aşağıdaki using yönergeleri ekleyin:

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;

Uygulamanın Main yönteminde, kaynak anahtarlarınızı ve uç noktanızı ortam değişkenlerinden alan değişkenler oluşturun. Ayrıca, daha sonra kullanılacak bazı temel nesneleri de bildireceksiniz.

    string trainingEndpoint = Environment.GetEnvironmentVariable("VISION_TRAINING_ENDPOINT");

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

    private static Iteration iteration;
    private static string publishedModelName = "CustomODModel";

Uygulamanın Main yönteminde, bu hızlı başlangıçta kullanılan yöntemler için çağrılar ekleyin. Bunları daha sonra uygulayacaksınız.

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);

İstemcinin kimliğini doğrulama

Yeni bir yöntemde, uç noktanızı ve anahtarlarınızı kullanarak eğitim ve tahmin istemcilerinin örneğini oluşturun.

private CustomVisionTrainingClient AuthenticateTraining(string endpoint, string trainingKey, string predictionKey)
{
    // 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 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;
}

Yeni bir Özel Görüntü İşleme projesi oluşturma

Bu sonraki yöntem bir nesne algılama projesi oluşturur. Oluşturulan proje Özel Görüntü İşleme web sitesinde gösterilir. Projenizi oluştururken diğer seçenekleri belirtmek için CreateProject yöntemine bakın (Algılayıcı oluşturma web portalı kılavuzunda açıklanmıştır).

private Project CreateProject(CustomVisionTrainingClient trainingApi)
{
    // Find the object detection domain
    var domains = trainingApi.GetDomains();
    var objDetectionDomain = domains.FirstOrDefault(d => d.Type == "ObjectDetection");

    // Create a new project
    Console.WriteLine("Creating new project:");
    project = trainingApi.CreateProject("My New Project", null, objDetectionDomain.Id);

    return project;
}

Projeye etiketleri ekleme

Bu yöntem, modeli eğitecek etiketleri tanımlar.

private void AddTags(CustomVisionTrainingClient trainingApi, Project project)
{
    // Make two tags in the new project
    var forkTag = trainingApi.CreateTag(project.Id, "fork");
    var scissorsTag = trainingApi.CreateTag(project.Id, "scissors");
}

Görüntüleri karşıya yükleme ve etiketleme

İlk olarak, bu proje için örnek görüntüleri indirin. Örnek Görüntüler klasörünün içeriğini yerel cihazınıza kaydedin.

Nesne algılama projelerinde görüntüleri etiketlediğinizde etiketli her nesnenin bölgesini normalleştirilmiş koordinatları kullanarak belirtmeniz gerekir. Aşağıdaki kod, örnek görüntülerin her birini etiketlendikleri bölgeyle ilişkilendirir.

private void UploadImages(CustomVisionTrainingClient trainingApi, Project project)
{
    Dictionary<string, double[]> fileToRegionMap = new Dictionary<string, double[]>()
    {
        // FileName, Left, Top, Width, Height
        {"scissors_1", new double[] { 0.4007353, 0.194068655, 0.259803921, 0.6617647 } },
        {"scissors_2", new double[] { 0.426470578, 0.185898721, 0.172794119, 0.5539216 } },
        {"scissors_3", new double[] { 0.289215684, 0.259428144, 0.403186262, 0.421568632 } },
        {"scissors_4", new double[] { 0.343137264, 0.105833367, 0.332107842, 0.8055556 } },
        {"scissors_5", new double[] { 0.3125, 0.09766343, 0.435049027, 0.71405226 } },
        {"scissors_6", new double[] { 0.379901975, 0.24308826, 0.32107842, 0.5718954 } },
        {"scissors_7", new double[] { 0.341911763, 0.20714055, 0.3137255, 0.6356209 } },
        {"scissors_8", new double[] { 0.231617644, 0.08459154, 0.504901946, 0.8480392 } },
        {"scissors_9", new double[] { 0.170343131, 0.332957536, 0.767156839, 0.403594762 } },
        {"scissors_10", new double[] { 0.204656869, 0.120539248, 0.5245098, 0.743464053 } },
        {"scissors_11", new double[] { 0.05514706, 0.159754932, 0.799019635, 0.730392158 } },
        {"scissors_12", new double[] { 0.265931368, 0.169558853, 0.5061275, 0.606209159 } },
        {"scissors_13", new double[] { 0.241421565, 0.184264734, 0.448529422, 0.6830065 } },
        {"scissors_14", new double[] { 0.05759804, 0.05027781, 0.75, 0.882352948 } },
        {"scissors_15", new double[] { 0.191176474, 0.169558853, 0.6936275, 0.6748366 } },
        {"scissors_16", new double[] { 0.1004902, 0.279036, 0.6911765, 0.477124184 } },
        {"scissors_17", new double[] { 0.2720588, 0.131977156, 0.4987745, 0.6911765 } },
        {"scissors_18", new double[] { 0.180147052, 0.112369314, 0.6262255, 0.6666667 } },
        {"scissors_19", new double[] { 0.333333343, 0.0274019931, 0.443627447, 0.852941155 } },
        {"scissors_20", new double[] { 0.158088237, 0.04047389, 0.6691176, 0.843137264 } },
        {"fork_1", new double[] { 0.145833328, 0.3509314, 0.5894608, 0.238562092 } },
        {"fork_2", new double[] { 0.294117659, 0.216944471, 0.534313738, 0.5980392 } },
        {"fork_3", new double[] { 0.09191177, 0.0682516545, 0.757352948, 0.6143791 } },
        {"fork_4", new double[] { 0.254901975, 0.185898721, 0.5232843, 0.594771266 } },
        {"fork_5", new double[] { 0.2365196, 0.128709182, 0.5845588, 0.71405226 } },
        {"fork_6", new double[] { 0.115196079, 0.133611143, 0.676470637, 0.6993464 } },
        {"fork_7", new double[] { 0.164215669, 0.31008172, 0.767156839, 0.410130739 } },
        {"fork_8", new double[] { 0.118872553, 0.318251669, 0.817401946, 0.225490168 } },
        {"fork_9", new double[] { 0.18259804, 0.2136765, 0.6335784, 0.643790841 } },
        {"fork_10", new double[] { 0.05269608, 0.282303959, 0.8088235, 0.452614367 } },
        {"fork_11", new double[] { 0.05759804, 0.0894935, 0.9007353, 0.3251634 } },
        {"fork_12", new double[] { 0.3345588, 0.07315363, 0.375, 0.9150327 } },
        {"fork_13", new double[] { 0.269607842, 0.194068655, 0.4093137, 0.6732026 } },
        {"fork_14", new double[] { 0.143382356, 0.218578458, 0.7977941, 0.295751631 } },
        {"fork_15", new double[] { 0.19240196, 0.0633497, 0.5710784, 0.8398692 } },
        {"fork_16", new double[] { 0.140931368, 0.480016381, 0.6838235, 0.240196079 } },
        {"fork_17", new double[] { 0.305147052, 0.2512582, 0.4791667, 0.5408496 } },
        {"fork_18", new double[] { 0.234068632, 0.445702642, 0.6127451, 0.344771236 } },
        {"fork_19", new double[] { 0.219362751, 0.141781077, 0.5919118, 0.6683006 } },
        {"fork_20", new double[] { 0.180147052, 0.239820287, 0.6887255, 0.235294119 } }
    };

Not

Kendi projelerinizde, bölgelerin koordinatlarını işaretlemek için bir tıklama ve sürükleme yardımcı programınız yoksa, Özel Görüntü İşleme web sitesindeki web kullanıcı arabirimini kullanabilirsiniz. Bu örnekte koordinatlar zaten sağlanmıştır.

Ardından her örnek görüntüyü bölge koordinatlarıyla karşıya yüklemek için bu ilişki haritası kullanılır. Tek bir toplu işlemde en fazla 64 görüntü yükleyebilirsiniz. Değeri doğru klasör konumlarına işaret eden şekilde değiştirmeniz imagePath gerekebilir.

    // Add all images for fork
    var imagePath = Path.Combine("Images", "fork");
    var imageFileEntries = new List<ImageFileCreateEntry>();
    foreach (var fileName in Directory.EnumerateFiles(imagePath))
    {
        var region = fileToRegionMap[Path.GetFileNameWithoutExtension(fileName)];
        imageFileEntries.Add(new ImageFileCreateEntry(fileName, File.ReadAllBytes(fileName), null, new List<Region>(new Region[] { new Region(forkTag.Id, region[0], region[1], region[2], region[3]) })));
    }
    trainingApi.CreateImagesFromFiles(project.Id, new ImageFileCreateBatch(imageFileEntries));

    // Add all images for scissors
    imagePath = Path.Combine("Images", "scissors");
    imageFileEntries = new List<ImageFileCreateEntry>();
    foreach (var fileName in Directory.EnumerateFiles(imagePath))
    {
        var region = fileToRegionMap[Path.GetFileNameWithoutExtension(fileName)];
        imageFileEntries.Add(new ImageFileCreateEntry(fileName, File.ReadAllBytes(fileName), null, new List<Region>(new Region[] { new Region(scissorsTag.Id, region[0], region[1], region[2], region[3]) })));
    }
    trainingApi.CreateImagesFromFiles(project.Id, new ImageFileCreateBatch(imageFileEntries));
}

Bu noktada tüm örnek görüntülerini karşıya yüklediniz ve her birini (çatal veya makas) ilişkili bir piksel dikdörtgeniyle etiketlediniz.

Projeyi eğitme

Bu yöntem, projede ilk eğitim yinelemesini oluşturur. Eğitim tamamlanana kadar hizmeti sorgular.

private 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")
    {
        Thread.Sleep(1000);

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

İpucu

Seçili etiketlerle eğit

İsteğe bağlı olarak, uygulanan etiketlerinizin yalnızca bir alt kümesi üzerinde eğitebilirsiniz. Henüz belirli etiketlerden yeterince uygulamadıysanız ancak daha fazla etiketiniz varsa bunu yapmak isteyebilirsiniz. TrainProject çağrısında trainingParameters parametresini kullanın. TrainingParameters oluşturun ve SelectedTags özelliğini kullanmak istediğiniz etiketlerin kimlik listesi olarak ayarlayın. Model yalnızca bu listedeki etiketleri tanıyacak şekilde eğitilecektir.

Geçerli yinelemeyi yayımlama

Bu yöntem, modelin geçerli yinelemesini sorgulama için kullanılabilir hale getirir. Tahmin istekleri göndermek için model adını başvuru olarak kullanabilirsiniz. için predictionResourceIdkendi değerinizi girmeniz gerekir. Tahmin kaynak kimliğini, Kaynağın Özellikler sekmesinde, Azure portalında Kaynak Kimliği olarak listelenmiş olarak bulabilirsiniz.

private void PublishIteration(CustomVisionTrainingClient trainingApi, Project project)
{

    // The iteration is now trained. Publish it to the prediction end point.
    var predictionResourceId = Environment.GetEnvironmentVariable("VISION_PREDICTION_RESOURCE_ID");
    trainingApi.PublishIteration(project.Id, iteration.Id, publishedModelName, predictionResourceId);
    Console.WriteLine("Done!\n");
}

Tahmin uç noktasını test edin

Bu yöntem test görüntüsünü yükler, model uç noktasını sorgular ve tahmin verilerini konsola gönderir.

private void TestIteration(CustomVisionPredictionClient predictionApi, Project project)
{

    // Make a prediction against the new project
    Console.WriteLine("Making a prediction:");
    var imageFile = Path.Combine("Images", "test", "test_image.jpg");
    using (var stream = File.OpenRead(imageFile))
    {
        var result = predictionApi.DetectImage(project.Id, publishedModelName, stream);

        // Loop over each prediction and write out the results
        foreach (var c in result.Predictions)
        {
            Console.WriteLine($"\t{c.TagName}: {c.Probability:P1} [ {c.BoundingBox.Left}, {c.BoundingBox.Top}, {c.BoundingBox.Width}, {c.BoundingBox.Height} ]");
        }
    }
    Console.ReadKey();
}

Uygulamayı çalıştırma

IDE penceresinin üst kısmındaki Hata Ayıkla düğmesine tıklayarak uygulamayı çalıştırın.

Uygulama çalışırken bir konsol penceresi açmalı ve aşağıdaki çıkışı yazmalıdır:

Creating new project:
        Training
Done!

Making a prediction:
        fork: 98.2% [ 0.111609578, 0.184719115, 0.6607002, 0.6637112 ]
        scissors: 1.2% [ 0.112389535, 0.119195729, 0.658031344, 0.7023591 ]

Ardından test görüntüsünün (Images/Test/ yolunda bulunur) uygun etiketlendiğini ve algılama bölgesinin doğru olduğunu onaylayabilirsiniz. Bu noktada, uygulamadan çıkmak için herhangi bir tuşa basabilirsiniz.

Kaynakları temizleme

Kendi nesne algılama projenizi gerçekleştirmek (veya bunun yerine görüntü sınıflandırma projesi oluşturmak) istiyorsanız, bu örnekteki çatal/makas algılama projesini silmek isteyebilirsiniz. Ücretsiz abonelik iki Özel Görüntü İşleme projesine izin verir.

Özel Görüntü İşleme web sitesindeProjeler’e gidin ve Yeni Projem’in altından çöp kutusunu secin.

Screenshot of a panel labeled My New Project with a trash can icon.

Sonraki adımlar

Artık kodda nesne algılama işleminin her adımını gerçekleştirdiniz. Bu örnek tek bir eğitim yinelemesi yürütür, ancak genellikle modelinizi daha doğru hale getirmek için birden çok kez eğitip test etmeniz gerekir. Sonraki kılavuzda görüntü sınıflandırma konusu üstünde durulur ancak temel ilkeleri nesne algılamaya benzer.

Bu kılavuzda, git için Özel Görüntü İşleme istemci kitaplığını kullanarak nesne algılama modeli oluşturmaya başlamanıza yardımcı olacak yönergeler ve örnek kod sağlanır. Program aracılığıyla test etmek için bir proje oluşturacak, etiketler ekleyecek, projeyi eğitecek ve projenin tahmin uç noktası URL'sini kullanacaksınız. Bu örneği kendi görüntü tanıma uygulamanızı oluşturmak için şablon olarak kullanın.

Not

Kod yazmadan bir nesne algılama modeli oluşturmak ve eğitmek istiyorsanız bunun yerine tarayıcı tabanlı kılavuza bakın.

Git için Özel Görüntü İşleme istemci kitaplığını kullanın:

  • Yeni bir Özel Görüntü İşleme projesi oluşturma
  • Projeye etiketleri ekleme
  • Görüntüleri karşıya yükleme ve etiketleme
  • Projeyi eğitme
  • Geçerli yinelemeyi yayımlama
  • Tahmin uç noktasını test edin

Başvuru belgeleri (eğitim)(tahmin)

Önkoşullar

Ortam değişkenlerini oluşturma

Bu örnekte, kimlik bilgilerinizi uygulamayı çalıştıran yerel makinedeki ortam değişkenlerine yazacaksınız.

Azure portalına gidin. Önkoşullar bölümünde oluşturduğunuz Özel Görüntü İşleme kaynaklar başarıyla dağıtıldıysa, Sonraki Adımlar'ın altındaki Kaynağa Git düğmesini seçin. Anahtarlarınızı ve uç noktalarınızı kaynakların anahtar ve uç nokta sayfalarında, kaynak yönetimi altında bulabilirsiniz. API uç noktalarıyla birlikte hem eğitim hem de tahmin kaynaklarınızın anahtarlarını almanız gerekir.

Tahmin kaynağı kimliğini Azure portalındaki Tahmin kaynağının Özellikler sekmesinde Kaynak Kimliği olarak listelenmiş olarak bulabilirsiniz.

İpucu

Bu değerleri almak için de kullanırsınız https://www.customvision.ai/ . Oturum açıldıktan sonra sağ üstteki Ayarlar simgesini seçin. Ayar sayfalarında tüm anahtarları, kaynak kimliğini ve uç noktaları görüntüleyebilirsiniz.

Dikkat

Anahtarı doğrudan kodunuz içinde eklemeyin ve asla herkese açık olarak göndermeyin. Azure Key Vault gibi daha fazla kimlik doğrulama seçeneği için Azure AI hizmetleri güvenlik makalesine bakın.

Ortam değişkenlerini ayarlamak için bir konsol penceresi açın ve işletim sisteminizle geliştirme ortamınıza yönelik yönergeleri izleyin.

  1. Ortam değişkenini VISION_TRAINING KEY ayarlamak için öğesini eğitim kaynağınızın anahtarlarından biriyle değiştirin your-training-key .
  2. Ortam değişkenini VISION_TRAINING_ENDPOINT ayarlamak için öğesini eğitim kaynağınızın uç noktasıyla değiştirin your-training-endpoint .
  3. Ortam değişkenini VISION_PREDICTION_KEY ayarlamak için değerini tahmin kaynağınızın anahtarlarından biriyle değiştirin your-prediction-key .
  4. Ortam değişkenini VISION_PREDICTION_ENDPOINT ayarlamak için değerini tahmin kaynağınızın uç noktasıyla değiştirin your-prediction-endpoint .
  5. Ortam değişkenini VISION_PREDICTION_RESOURCE_ID ayarlamak için değerini tahmin kaynağınızın kaynak kimliğiyle değiştirin your-resource-id .
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

Ortam değişkenlerini ekledikten sonra, konsol penceresi de dahil olmak üzere ortam değişkenlerini okuyacak tüm çalışan programları yeniden başlatmanız gerekebilir.

Ayarlama

Özel Görüntü İşleme istemci kitaplığını yükleme

Go için Özel Görüntü İşleme içeren bir görüntü analizi uygulaması yazmak için Özel Görüntü İşleme hizmeti istemci kitaplığı gerekir. PowerShell'de aşağıdaki komutu çalıştırın:

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

veya kullanıyorsanız dep, depo çalıştırmanızda:

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

Örnek görüntüleri alma

Bu örnekte GitHub'daki Azure AI hizmetleri Python SDK Örnekleri deposundaki görüntüler kullanılmaktadır. Bu depoyu geliştirme ortamınıza kopyalayın veya indirin. Sonraki bir adım için klasör konumunu anımsayın.

Özel Görüntü İşleme projesini oluşturma

Tercih ettiğiniz proje dizininde sample.go adlı yeni bir dosya oluşturun ve bunu tercih ettiğiniz kod düzenleyicisinde açın.

Yeni bir Özel Görüntü İşleme hizmeti projesi oluşturmak için betiğinize aşağıdaki kodu ekleyin.

Projenizi oluştururken diğer seçenekleri belirtmek için CreateProject yöntemine bakın (Algılayıcı oluşturma web portalı kılavuzunda açıklanmıştır).

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"
)

// retrieve environment variables:
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 OD Project"
    iteration_publish_name = "detectModel"
    sampleDataDirectory = "<path to sample images>"
)

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

    ctx = context.Background()

    trainer := training.New(training_key, endpoint)

    var objectDetectDomain training.Domain
    domains, _ := trainer.GetDomains(ctx)

    for _, domain := range *domains.Value {
        fmt.Println(domain, domain.Type)
        if domain.Type == "ObjectDetection" && *domain.Name == "General" {
            objectDetectDomain = domain
            break
        }
    }
    fmt.Println("Creating project...")
    project, _ := trainer.CreateProject(ctx, project_name, "", objectDetectDomain.ID, "")

Projede etiketler oluşturma

Projenize sınıflandırma etiketleri oluşturmak için sample.go dosyasının sonuna aşağıdaki kodu ekleyin:

# Make two tags in the new project
forkTag, _ := trainer.CreateTag(ctx, *project.ID, "fork", "A fork", string(training.Regular))
scissorsTag, _ := trainer.CreateTag(ctx, *project.ID, "scissors", "Pair of scissors", string(training.Regular))

Görüntüleri karşıya yükleme ve etiketleme

Nesne algılama projelerinde görüntüleri etiketlediğinizde etiketli her nesnenin bölgesini normalleştirilmiş koordinatları kullanarak belirtmeniz gerekir.

Not

Bölgelerin koordinatlarını işaretlemek için tıklama ve sürükleme yardımcı programınız yoksa, Customvision.ai'da web kullanıcı arabirimini kullanabilirsiniz. Bu örnekte koordinatlar zaten sağlanmıştır.

Projeye görüntüler, etiket ve bölgeler eklemek için etiket oluşturduktan sonra aşağıdaki kodu ekleyin. Bu öğreticide bölgelerin satır içinde sabit olarak kodlandığını unutmayın. Bölgeler, sınırlayıcı kutuyu normalleştirilmiş koordinatlarıyla belirtir ve koordinatlar şu sırayla verilir: sol, üst, genişlik, yükseklik.

forkImageRegions := map[string][4]float64{
    "fork_1.jpg": [4]float64{ 0.145833328, 0.3509314, 0.5894608, 0.238562092 },
    "fork_2.jpg": [4]float64{ 0.294117659, 0.216944471, 0.534313738, 0.5980392 },
    "fork_3.jpg": [4]float64{ 0.09191177, 0.0682516545, 0.757352948, 0.6143791 },
    "fork_4.jpg": [4]float64{ 0.254901975, 0.185898721, 0.5232843, 0.594771266 },
    "fork_5.jpg": [4]float64{ 0.2365196, 0.128709182, 0.5845588, 0.71405226 },
    "fork_6.jpg": [4]float64{ 0.115196079, 0.133611143, 0.676470637, 0.6993464 },
    "fork_7.jpg": [4]float64{ 0.164215669, 0.31008172, 0.767156839, 0.410130739 },
    "fork_8.jpg": [4]float64{ 0.118872553, 0.318251669, 0.817401946, 0.225490168 },
    "fork_9.jpg": [4]float64{ 0.18259804, 0.2136765, 0.6335784, 0.643790841 },
    "fork_10.jpg": [4]float64{ 0.05269608, 0.282303959, 0.8088235, 0.452614367 },
    "fork_11.jpg": [4]float64{ 0.05759804, 0.0894935, 0.9007353, 0.3251634 },
    "fork_12.jpg": [4]float64{ 0.3345588, 0.07315363, 0.375, 0.9150327 },
    "fork_13.jpg": [4]float64{ 0.269607842, 0.194068655, 0.4093137, 0.6732026 },
    "fork_14.jpg": [4]float64{ 0.143382356, 0.218578458, 0.7977941, 0.295751631 },
    "fork_15.jpg": [4]float64{ 0.19240196, 0.0633497, 0.5710784, 0.8398692 },
    "fork_16.jpg": [4]float64{ 0.140931368, 0.480016381, 0.6838235, 0.240196079 },
    "fork_17.jpg": [4]float64{ 0.305147052, 0.2512582, 0.4791667, 0.5408496 },
    "fork_18.jpg": [4]float64{ 0.234068632, 0.445702642, 0.6127451, 0.344771236 },
    "fork_19.jpg": [4]float64{ 0.219362751, 0.141781077, 0.5919118, 0.6683006 },
    "fork_20.jpg": [4]float64{ 0.180147052, 0.239820287, 0.6887255, 0.235294119 },
}

scissorsImageRegions := map[string][4]float64{
    "scissors_1.jpg": [4]float64{ 0.4007353, 0.194068655, 0.259803921, 0.6617647 },
    "scissors_2.jpg": [4]float64{ 0.426470578, 0.185898721, 0.172794119, 0.5539216 },
    "scissors_3.jpg": [4]float64{ 0.289215684, 0.259428144, 0.403186262, 0.421568632 },
    "scissors_4.jpg": [4]float64{ 0.343137264, 0.105833367, 0.332107842, 0.8055556 },
    "scissors_5.jpg": [4]float64{ 0.3125, 0.09766343, 0.435049027, 0.71405226 },
    "scissors_6.jpg": [4]float64{ 0.379901975, 0.24308826, 0.32107842, 0.5718954 },
    "scissors_7.jpg": [4]float64{ 0.341911763, 0.20714055, 0.3137255, 0.6356209 },
    "scissors_8.jpg": [4]float64{ 0.231617644, 0.08459154, 0.504901946, 0.8480392 },
    "scissors_9.jpg": [4]float64{ 0.170343131, 0.332957536, 0.767156839, 0.403594762 },
    "scissors_10.jpg": [4]float64{ 0.204656869, 0.120539248, 0.5245098, 0.743464053 },
    "scissors_11.jpg": [4]float64{ 0.05514706, 0.159754932, 0.799019635, 0.730392158 },
    "scissors_12.jpg": [4]float64{ 0.265931368, 0.169558853, 0.5061275, 0.606209159 },
    "scissors_13.jpg": [4]float64{ 0.241421565, 0.184264734, 0.448529422, 0.6830065 },
    "scissors_14.jpg": [4]float64{ 0.05759804, 0.05027781, 0.75, 0.882352948 },
    "scissors_15.jpg": [4]float64{ 0.191176474, 0.169558853, 0.6936275, 0.6748366 },
    "scissors_16.jpg": [4]float64{ 0.1004902, 0.279036, 0.6911765, 0.477124184 },
    "scissors_17.jpg": [4]float64{ 0.2720588, 0.131977156, 0.4987745, 0.6911765 },
    "scissors_18.jpg": [4]float64{ 0.180147052, 0.112369314, 0.6262255, 0.6666667 },
    "scissors_19.jpg": [4]float64{ 0.333333343, 0.0274019931, 0.443627447, 0.852941155 },
    "scissors_20.jpg": [4]float64{ 0.158088237, 0.04047389, 0.6691176, 0.843137264 },
}

Ardından, her örnek görüntüyü kendi bölge koordinatlarıyla karşıya yüklemek için bu ilişkilendirme haritasını kullanın (tek bir toplu işte en fazla 64 görüntü yükleyebilirsiniz). Aşağıdaki kodu ekleyin.

Not

Daha önce Azure AI hizmetleri Go SDK Örnekleri projesini indirdiğiniz yere göre görüntülerin yolunu değiştirmeniz gerekir.

// Go through the data table above and create the images
fmt.Println("Adding images...")
var fork_images []training.ImageFileCreateEntry
for file, region := range forkImageRegions {
    imageFile, _ := ioutil.ReadFile(path.Join(sampleDataDirectory, "fork", file))

    regiontest := forkImageRegions[file]
    imageRegion := training.Region{
        TagID:  forkTag.ID,
        Left:   &regiontest[0],
        Top:    &regiontest[1],
        Width:  &regiontest[2],
        Height: &regiontest[3],
    }
    var fileName string = file

    fork_images = append(fork_images, training.ImageFileCreateEntry{
        Name:     &fileName,
        Contents: &imageFile,
        Regions:  &[]training.Region{imageRegion}
    })
}
    
fork_batch, _ := trainer.CreateImagesFromFiles(ctx, *project.ID, training.ImageFileCreateBatch{ 
    Images: &fork_images,
})

if (!*fork_batch.IsBatchSuccessful) {
    fmt.Println("Batch upload failed.")
}

var scissor_images []training.ImageFileCreateEntry
for file, region := range scissorsImageRegions {
    imageFile, _ := ioutil.ReadFile(path.Join(sampleDataDirectory, "scissors", file))

    imageRegion := training.Region { 
        TagID:scissorsTag.ID,
        Left:&region[0],
        Top:&region[1],
        Width:&region[2],
        Height:&region[3],
    }

    scissor_images = append(scissor_images, training.ImageFileCreateEntry {
        Name: &file,
        Contents: &imageFile,
        Regions: &[]training.Region{ imageRegion },
    })
}
    
scissor_batch, _ := trainer.CreateImagesFromFiles(ctx, *project.ID, training.ImageFileCreateBatch{ 
    Images: &scissor_images,
})
    
if (!*scissor_batch.IsBatchSuccessful) {
    fmt.Println("Batch upload failed.")
}     

Projeyi eğitin ve yayımlayın

Bu kod, tahmin modelinin ilk yinelemesini oluşturur ve ardından bu yinelemeyi tahmin uç noktasında yayımlar. Yayımlanan yinelemeye verilen ad, tahmin istekleri göndermek için kullanılabilir. Bir yineleme, yayımlanana kadar tahmin uç noktasında kullanılamaz.

iteration, _ := trainer.TrainProject(ctx, *project.ID)
fmt.Println("Training status:", *iteration.Status)
for {
    if *iteration.Status != "Training" {
        break
    }
    time.Sleep(5 * 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))

Tahmin uç noktasını kullanma

Tahmin uç noktasına bir görüntü göndermek ve tahmini almak için dosyanın sonuna aşağıdaki kodu ekleyin:

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

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

    for _, prediction := range *results.Predictions    {
        boundingBox := *prediction.BoundingBox

        fmt.Printf("\t%s: %.2f%% (%.2f, %.2f, %.2f, %.2f)", 
            *prediction.TagName,
            *prediction.Probability * 100,
            *boundingBox.Left,
            *boundingBox.Top,
            *boundingBox.Width,
            *boundingBox.Height)
        fmt.Println("")
    }
}

Uygulamayı çalıştırma

sample.go dosyasını çalıştırın.

go run sample.go

Uygulamanın çıkışı konsolda görüntülenmelidir. Ardından test görüntüsünün (samples/vision/images/Test yolunda bulunur) uygun etiketlendiğini ve algılama bölgesinin doğru olduğunu onaylayabilirsiniz.

Kaynakları temizleme

Kendi nesne algılama projenizi gerçekleştirmek (veya bunun yerine görüntü sınıflandırma projesi oluşturmak) istiyorsanız, bu örnekteki çatal/makas algılama projesini silmek isteyebilirsiniz. Ücretsiz abonelik iki Özel Görüntü İşleme projesine izin verir.

Özel Görüntü İşleme web sitesindeProjeler’e gidin ve Yeni Projem’in altından çöp kutusunu secin.

Screenshot of a panel labeled My New Project with a trash can icon.

Sonraki adımlar

Artık kodda nesne algılama işleminin her adımını gerçekleştirdiniz. Bu örnek tek bir eğitim yinelemesi yürütür, ancak genellikle modelinizi daha doğru hale getirmek için birden çok kez eğitip test etmeniz gerekir. Sonraki kılavuzda görüntü sınıflandırma konusu üstünde durulur ancak temel ilkeleri nesne algılamaya benzer.

Nesne algılama modeli oluşturmak için Java için Özel Görüntü İşleme istemci kitaplığını kullanmaya başlayın. Paketi yüklemek ve temel görevler için örnek kodu denemek için bu adımları izleyin. Bu örneği kendi görüntü tanıma uygulamanızı oluşturmak için şablon olarak kullanın.

Not

Kod yazmadan bir nesne algılama modeli oluşturmak ve eğitmek istiyorsanız bunun yerine tarayıcı tabanlı kılavuza bakın.

Java için Özel Görüntü İşleme istemci kitaplığını kullanarak:

  • Yeni bir Özel Görüntü İşleme projesi oluşturma
  • Projeye etiketleri ekleme
  • Görüntüleri karşıya yükleme ve etiketleme
  • Projeyi eğitme
  • Geçerli yinelemeyi yayımlama
  • Tahmin uç noktasını test edin

Başvuru belgeleri | Kitaplık kaynak kodu (eğitim)(tahmin)| Yapıt (Maven) (eğitim)(tahmin) | Örnekler

Önkoşullar

Ortam değişkenlerini oluşturma

Bu örnekte, kimlik bilgilerinizi uygulamayı çalıştıran yerel makinedeki ortam değişkenlerine yazacaksınız.

Azure portalına gidin. Önkoşullar bölümünde oluşturduğunuz Özel Görüntü İşleme kaynaklar başarıyla dağıtıldıysa, Sonraki Adımlar'ın altındaki Kaynağa Git düğmesini seçin. Anahtarlarınızı ve uç noktalarınızı kaynakların anahtar ve uç nokta sayfalarında, kaynak yönetimi altında bulabilirsiniz. API uç noktalarıyla birlikte hem eğitim hem de tahmin kaynaklarınızın anahtarlarını almanız gerekir.

Tahmin kaynağı kimliğini Azure portalındaki Tahmin kaynağının Özellikler sekmesinde Kaynak Kimliği olarak listelenmiş olarak bulabilirsiniz.

İpucu

Bu değerleri almak için de kullanırsınız https://www.customvision.ai/ . Oturum açıldıktan sonra sağ üstteki Ayarlar simgesini seçin. Ayar sayfalarında tüm anahtarları, kaynak kimliğini ve uç noktaları görüntüleyebilirsiniz.

Dikkat

Anahtarı doğrudan kodunuz içinde eklemeyin ve asla herkese açık olarak göndermeyin. Azure Key Vault gibi daha fazla kimlik doğrulama seçeneği için Azure AI hizmetleri güvenlik makalesine bakın.

Ortam değişkenlerini ayarlamak için bir konsol penceresi açın ve işletim sisteminizle geliştirme ortamınıza yönelik yönergeleri izleyin.

  1. Ortam değişkenini VISION_TRAINING KEY ayarlamak için öğesini eğitim kaynağınızın anahtarlarından biriyle değiştirin your-training-key .
  2. Ortam değişkenini VISION_TRAINING_ENDPOINT ayarlamak için öğesini eğitim kaynağınızın uç noktasıyla değiştirin your-training-endpoint .
  3. Ortam değişkenini VISION_PREDICTION_KEY ayarlamak için değerini tahmin kaynağınızın anahtarlarından biriyle değiştirin your-prediction-key .
  4. Ortam değişkenini VISION_PREDICTION_ENDPOINT ayarlamak için değerini tahmin kaynağınızın uç noktasıyla değiştirin your-prediction-endpoint .
  5. Ortam değişkenini VISION_PREDICTION_RESOURCE_ID ayarlamak için değerini tahmin kaynağınızın kaynak kimliğiyle değiştirin your-resource-id .
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

Ortam değişkenlerini ekledikten sonra, konsol penceresi de dahil olmak üzere ortam değişkenlerini okuyacak tüm çalışan programları yeniden başlatmanız gerekebilir.

Ayarlama

Yeni Gradle projesi oluşturma

Konsol penceresinde (cmd, PowerShell veya Bash gibi), uygulamanız için yeni bir dizin oluşturun ve bu dizine gidin.

mkdir myapp && cd myapp

gradle init Komutunu çalışma dizininizden çalıştırın. Bu komut, uygulamanızı oluşturmak ve yapılandırmak için çalışma zamanında kullanılan build.gradle.kts de dahil olmak üzere Gradle için temel derleme dosyaları oluşturur.

gradle init --type basic

DSL seçmeniz istendiğinde Kotlin'i seçin.

İstemci kitaplığını yükleme

build.gradle.kts dosyasını bulun ve tercih ettiğiniz IDE veya metin düzenleyici ile açın. Ardından aşağıdaki derleme yapılandırmasını kopyalayın. Bu yapılandırma, projeyi giriş noktası CustomVisionQuickstart sınıfı olan bir Java uygulaması olarak tanımlar. Özel Görüntü İşleme kitaplıklarını içeri aktarır.

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 dosyası oluşturma

Çalışma dizininizden aşağıdaki komutu çalıştırarak bir proje kaynak klasörü oluşturun:

mkdir -p src/main/java

Yeni klasöre gidin ve CustomVisionQuickstart.java adlı bir dosya oluşturun. Tercih ettiğiniz düzenleyicide veya IDE'de açın ve aşağıdaki import deyimleri ekleyin:

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;

İpucu

Tüm hızlı başlangıç kodunu aynı anda görüntülemek mi istiyorsunuz? Bunu, bu hızlı başlangıçtaki kod örneklerini içeren GitHub’da bulabilirsiniz.

Uygulamanın CustomVisionQuickstart sınıfında, kaynak anahtarlarınızı ve uç noktanızı ortam değişkenlerinden alan değişkenler oluşturun.

// 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");

Uygulamanın ana yönteminde, bu hızlı başlangıçta kullanılan yöntemler için çağrılar ekleyin. Bunları daha sonra tanımlayacaksınız.

Project projectOD = createProjectOD(trainClient);
addTagsOD(trainClient, projectOD);
uploadImagesOD(trainClient, projectOD);
trainProjectOD(trainClient, projectOD);
publishIterationOD(trainClient, project);
testProjectOD(predictor, projectOD);

Nesne modeli

Aşağıdaki sınıflar ve arabirimler, Özel Görüntü İşleme Java istemci kitaplığının bazı önemli özelliklerini işler.

Veri Akışı Adı Açıklama
CustomVisionTrainingClient Bu sınıf modellerinizin oluşturulmasını, eğitılmasını ve yayımlanmasını işler.
CustomVisionPredictionClient Bu sınıf, nesne algılama tahminleri için modellerinizi sorgulamayı işler.
ImagePrediction Bu sınıf, tek bir görüntüde tek bir nesne tahmini tanımlar. Nesne kimliği ve adı, nesnenin sınırlayıcı kutu konumu ve güvenilirlik puanı özelliklerini içerir.

Kod örnekleri

Bu kod parçacıkları, Java için Özel Görüntü İşleme istemci kitaplığıyla aşağıdaki görevlerin nasıl yapılacağını gösterir:

İstemcinin kimliğini doğrulama

Ana yönteminizde, uç noktanızı ve anahtarlarınızı kullanarak eğitim ve tahmin istemcilerinin örneğini oluşturun.

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

Yeni bir Özel Görüntü İşleme projesi oluşturma

Bu sonraki yöntem bir nesne algılama projesi oluşturur. Oluşturulan proje, daha önce ziyaret ettiğiniz Özel Görüntü İşleme web sitesinde gösterilir. Projenizi oluştururken diğer seçenekleri belirtmek için CreateProject yöntemi aşırı yüklemelerine bakın (Algılayıcı oluşturma web portalı kılavuzunda açıklanmıştır).

public static Project createProjectOD(CustomVisionTrainingClient trainClient) {
    Trainings trainer = trainClient.trainings();

    // find the object detection domain to set the project type
    Domain objectDetectionDomain = null;
    List<Domain> domains = trainer.getDomains();
    for (final Domain domain : domains) {
        if (domain.type() == DomainType.OBJECT_DETECTION) {
            objectDetectionDomain = domain;
            break;
        }
    }

    if (objectDetectionDomain == null) {
        System.out.println("Unexpected result; no objects were detected.");
    }

    System.out.println("Creating project...");
    // create an object detection project
    Project project = trainer.createProject().withName("Sample Java OD Project")
            .withDescription("Sample OD Project").withDomainId(objectDetectionDomain.id())
            .withClassificationType(Classifier.MULTILABEL.toString()).execute();

    return project;
}

Projenize etiketler ekleme

Bu yöntem, modeli eğitecek etiketleri tanımlar.

public static void addTagsOD(CustomVisionTrainingClient trainClient, Project project) {
    Trainings trainer = trainClient.trainings();
    // create fork tag
    Tag forkTag = trainer.createTag().withProjectId(project.id()).withName("fork").execute();

    // create scissors tag
    Tag scissorsTag = trainer.createTag().withProjectId(project.id()).withName("scissor").execute();
}

Görüntüleri karşıya yükleme ve etiketleme

İlk olarak, bu proje için örnek görüntüleri indirin. Örnek Görüntüler klasörünün içeriğini yerel cihazınıza kaydedin.

Not

Eğitiminizi tamamlamak için daha geniş bir görüntü kümesine mi ihtiyacınız var? Bir Microsoft Garage projesi olan Trove, eğitim amacıyla görüntü kümelerini toplamanıza ve satın almanızı sağlar. Görüntülerinizi topladıktan sonra, bunları indirip her zamanki gibi Özel Görüntü İşleme projenize aktarabilirsiniz. Daha fazla bilgi edinmek için Trove sayfasını ziyaret edin.

Nesne algılama projelerinde görüntüleri etiketlediğinizde etiketli her nesnenin bölgesini normalleştirilmiş koordinatları kullanarak belirtmeniz gerekir. Aşağıdaki kod, örnek görüntülerin her birini etiketlendikleri bölgeyle ilişkilendirir.

Not

Bölgelerin koordinatlarını işaretlemek için tıklama ve sürükleme yardımcı programınız yoksa, Customvision.ai'da web kullanıcı arabirimini kullanabilirsiniz. Bu örnekte koordinatlar zaten sağlanmıştır.

public static void uploadImagesOD(CustomVisionTrainingClient trainClient, Project project) {
    // Mapping of filenames to their respective regions in the image. The
    // coordinates are specified
    // as left, top, width, height in normalized coordinates. I.e. (left is left in
    // pixels / width in pixels)

    // This is a hardcoded mapping of the files we'll upload along with the bounding
    // box of the object in the
    // image. The boudning box is specified as left, top, width, height in
    // normalized coordinates.
    // Normalized Left = Left / Width (in Pixels)
    // Normalized Top = Top / Height (in Pixels)
    // Normalized Bounding Box Width = (Right - Left) / Width (in Pixels)
    // Normalized Bounding Box Height = (Bottom - Top) / Height (in Pixels)
    HashMap<String, double[]> regionMap = new HashMap<String, double[]>();
    regionMap.put("scissors_1.jpg", new double[] { 0.4007353, 0.194068655, 0.259803921, 0.6617647 });
    regionMap.put("scissors_2.jpg", new double[] { 0.426470578, 0.185898721, 0.172794119, 0.5539216 });
    regionMap.put("scissors_3.jpg", new double[] { 0.289215684, 0.259428144, 0.403186262, 0.421568632 });
    regionMap.put("scissors_4.jpg", new double[] { 0.343137264, 0.105833367, 0.332107842, 0.8055556 });
    regionMap.put("scissors_5.jpg", new double[] { 0.3125, 0.09766343, 0.435049027, 0.71405226 });
    regionMap.put("scissors_6.jpg", new double[] { 0.379901975, 0.24308826, 0.32107842, 0.5718954 });
    regionMap.put("scissors_7.jpg", new double[] { 0.341911763, 0.20714055, 0.3137255, 0.6356209 });
    regionMap.put("scissors_8.jpg", new double[] { 0.231617644, 0.08459154, 0.504901946, 0.8480392 });
    regionMap.put("scissors_9.jpg", new double[] { 0.170343131, 0.332957536, 0.767156839, 0.403594762 });
    regionMap.put("scissors_10.jpg", new double[] { 0.204656869, 0.120539248, 0.5245098, 0.743464053 });
    regionMap.put("scissors_11.jpg", new double[] { 0.05514706, 0.159754932, 0.799019635, 0.730392158 });
    regionMap.put("scissors_12.jpg", new double[] { 0.265931368, 0.169558853, 0.5061275, 0.606209159 });
    regionMap.put("scissors_13.jpg", new double[] { 0.241421565, 0.184264734, 0.448529422, 0.6830065 });
    regionMap.put("scissors_14.jpg", new double[] { 0.05759804, 0.05027781, 0.75, 0.882352948 });
    regionMap.put("scissors_15.jpg", new double[] { 0.191176474, 0.169558853, 0.6936275, 0.6748366 });
    regionMap.put("scissors_16.jpg", new double[] { 0.1004902, 0.279036, 0.6911765, 0.477124184 });
    regionMap.put("scissors_17.jpg", new double[] { 0.2720588, 0.131977156, 0.4987745, 0.6911765 });
    regionMap.put("scissors_18.jpg", new double[] { 0.180147052, 0.112369314, 0.6262255, 0.6666667 });
    regionMap.put("scissors_19.jpg", new double[] { 0.333333343, 0.0274019931, 0.443627447, 0.852941155 });
    regionMap.put("scissors_20.jpg", new double[] { 0.158088237, 0.04047389, 0.6691176, 0.843137264 });
    regionMap.put("fork_1.jpg", new double[] { 0.145833328, 0.3509314, 0.5894608, 0.238562092 });
    regionMap.put("fork_2.jpg", new double[] { 0.294117659, 0.216944471, 0.534313738, 0.5980392 });
    regionMap.put("fork_3.jpg", new double[] { 0.09191177, 0.0682516545, 0.757352948, 0.6143791 });
    regionMap.put("fork_4.jpg", new double[] { 0.254901975, 0.185898721, 0.5232843, 0.594771266 });
    regionMap.put("fork_5.jpg", new double[] { 0.2365196, 0.128709182, 0.5845588, 0.71405226 });
    regionMap.put("fork_6.jpg", new double[] { 0.115196079, 0.133611143, 0.676470637, 0.6993464 });
    regionMap.put("fork_7.jpg", new double[] { 0.164215669, 0.31008172, 0.767156839, 0.410130739 });
    regionMap.put("fork_8.jpg", new double[] { 0.118872553, 0.318251669, 0.817401946, 0.225490168 });
    regionMap.put("fork_9.jpg", new double[] { 0.18259804, 0.2136765, 0.6335784, 0.643790841 });
    regionMap.put("fork_10.jpg", new double[] { 0.05269608, 0.282303959, 0.8088235, 0.452614367 });
    regionMap.put("fork_11.jpg", new double[] { 0.05759804, 0.0894935, 0.9007353, 0.3251634 });
    regionMap.put("fork_12.jpg", new double[] { 0.3345588, 0.07315363, 0.375, 0.9150327 });
    regionMap.put("fork_13.jpg", new double[] { 0.269607842, 0.194068655, 0.4093137, 0.6732026 });
    regionMap.put("fork_14.jpg", new double[] { 0.143382356, 0.218578458, 0.7977941, 0.295751631 });
    regionMap.put("fork_15.jpg", new double[] { 0.19240196, 0.0633497, 0.5710784, 0.8398692 });
    regionMap.put("fork_16.jpg", new double[] { 0.140931368, 0.480016381, 0.6838235, 0.240196079 });
    regionMap.put("fork_17.jpg", new double[] { 0.305147052, 0.2512582, 0.4791667, 0.5408496 });
    regionMap.put("fork_18.jpg", new double[] { 0.234068632, 0.445702642, 0.6127451, 0.344771236 });
    regionMap.put("fork_19.jpg", new double[] { 0.219362751, 0.141781077, 0.5919118, 0.6683006 });
    regionMap.put("fork_20.jpg", new double[] { 0.180147052, 0.239820287, 0.6887255, 0.235294119 });

Sonraki kod bloğu, görüntüleri projeye ekler. İndirdiğiniz çatal ve makas klasörlerinin konumlarına GetImageişaret etmek için çağrıların bağımsız değişkenlerini değiştirmeniz gerekir.

    Trainings trainer = trainClient.trainings();

    System.out.println("Adding images...");
    for (int i = 1; i <= 20; i++) {
        String fileName = "fork_" + i + ".jpg";
        byte[] contents = GetImage("/fork", fileName);
        AddImageToProject(trainer, project, fileName, contents, forkTag.id(), regionMap.get(fileName));
    }

    for (int i = 1; i <= 20; i++) {
        String fileName = "scissors_" + i + ".jpg";
        byte[] contents = GetImage("/scissors", fileName);
        AddImageToProject(trainer, project, fileName, contents, scissorsTag.id(), regionMap.get(fileName));
    }
}

Önceki kod parçacığı, görüntüleri kaynak akışları olarak alan ve hizmete yükleyen iki yardımcı işlevi kullanır (tek bir toplu işte en fazla 64 görüntü yükleyebilirsiniz). Bu yöntemleri tanımlayın.

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;
}

Projeyi eğitme

Bu yöntem, projede ilk eğitim yinelemesini oluşturur. Eğitim tamamlanana kadar hizmeti sorgular.

public static String trainProjectOD(CustomVisionTrainingClient trainClient, Project project) {
    Trainings trainer = trainClient.trainings();
    System.out.println("Training...");
    Iteration iteration = trainer.trainProject(project.id(), new TrainProjectOptionalParameter());

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

Geçerli yinelemeyi yayımlama

Bu yöntem, modelin geçerli yinelemesini sorgulama için kullanılabilir hale getirir. Tahmin istekleri göndermek için model adını başvuru olarak kullanabilirsiniz. için predictionResourceIdkendi değerinizi girmeniz gerekir. Tahmin kaynak kimliğini, Kaynağın Özellikler sekmesinde, Azure portalında Kaynak Kimliği olarak listelenmiş olarak bulabilirsiniz.

public static String publishIterationOD(CustomVisionTrainingClient trainClient, Project project) {
    Trainings trainer = trainClient.trainings();

    // The iteration is now trained. Publish it to the prediction endpoint.
    String publishedModelName = "myModel";
    String predictionID = "<your-prediction-resource-ID>";
    trainer.publishIteration(project.id(), iteration.id(), publishedModelName, predictionID);
    return publishedModelName;
}

Tahmin uç noktasını test edin

Bu yöntem test görüntüsünü yükler, model uç noktasını sorgular ve tahmin verilerini konsola gönderir.

public static void testProjectOD(CustomVisionPredictionClient predictor, Project project) {

    // load test image
    byte[] testImage = GetImage("/ObjectTest", "test_image.jpg");

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

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

Uygulamayı çalıştırma

Uygulamayı şu şekilde oluşturabilirsiniz:

gradle build

Uygulamayı şu komutla gradle run çalıştırın:

gradle run

Kaynakları temizleme

Azure AI hizmetleri aboneliğini temizlemek ve kaldırmak istiyorsanız, kaynağı veya kaynak grubunu silebilirsiniz. Kaynak grubunun silinmesi, kaynak grubuyla ilişkili diğer tüm kaynakları da siler.

Kendi nesne algılama projenizi gerçekleştirmek (veya bunun yerine görüntü sınıflandırma projesi oluşturmak) istiyorsanız, bu örnekteki çatal/makas algılama projesini silmek isteyebilirsiniz. Ücretsiz abonelik iki Özel Görüntü İşleme projesine izin verir.

Özel Görüntü İşleme web sitesindeProjeler’e gidin ve Yeni Projem’in altından çöp kutusunu secin.

Screenshot of a panel labeled My New Project with a trash can icon.

Sonraki adımlar

Artık kodda nesne algılama işleminin her adımını gerçekleştirdiniz. Bu örnek tek bir eğitim yinelemesi yürütür, ancak genellikle modelinizi daha doğru hale getirmek için birden çok kez eğitip test etmeniz gerekir. Sonraki kılavuzda görüntü sınıflandırma konusu üstünde durulur ancak temel ilkeleri nesne algılamaya benzer.

Bu kılavuz, nesne algılama modeli oluşturmak üzere Node.js için Özel Görüntü İşleme istemci kitaplığını kullanmaya başlamanıza yardımcı olacak yönergeler ve örnek kod sağlar. Program aracılığıyla test etmek için bir proje oluşturacak, etiketler ekleyecek, projeyi eğitecek ve projenin tahmin uç noktası URL'sini kullanacaksınız. Bu örneği kendi görüntü tanıma uygulamanızı oluşturmak için şablon olarak kullanın.

Not

Kod yazmadan bir nesne algılama modeli oluşturmak ve eğitmek istiyorsanız bunun yerine tarayıcı tabanlı kılavuza bakın.

.NET için Özel Görüntü İşleme istemci kitaplığını kullanarak:

  • Yeni bir Özel Görüntü İşleme projesi oluşturma
  • Projeye etiketleri ekleme
  • Görüntüleri karşıya yükleme ve etiketleme
  • Projeyi eğitme
  • Geçerli yinelemeyi yayımlama
  • Tahmin uç noktasını test edin

Başvuru belgeleri (eğitim)(tahmin) | Kitaplık kaynak kodu (eğitim)(tahmin) | Paket (npm) (eğitim)(tahmin) | Örnekler

Önkoşullar

  • Azure aboneliği - Ücretsiz olarak oluşturun
  • Node.js'in geçerli sürümü
  • Azure aboneliğinizi aldıktan sonra, eğitim ve tahmin kaynağı oluşturmak için Azure portalında bir Özel Görüntü İşleme kaynağı oluşturun.
    • Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (F0) kullanabilirsiniz.

Ortam değişkenlerini oluşturma

Bu örnekte, kimlik bilgilerinizi uygulamayı çalıştıran yerel makinedeki ortam değişkenlerine yazacaksınız.

Azure portalına gidin. Önkoşullar bölümünde oluşturduğunuz Özel Görüntü İşleme kaynaklar başarıyla dağıtıldıysa, Sonraki Adımlar'ın altındaki Kaynağa Git düğmesini seçin. Anahtarlarınızı ve uç noktalarınızı kaynakların anahtar ve uç nokta sayfalarında, kaynak yönetimi altında bulabilirsiniz. API uç noktalarıyla birlikte hem eğitim hem de tahmin kaynaklarınızın anahtarlarını almanız gerekir.

Tahmin kaynağı kimliğini Azure portalındaki Tahmin kaynağının Özellikler sekmesinde Kaynak Kimliği olarak listelenmiş olarak bulabilirsiniz.

İpucu

Bu değerleri almak için de kullanırsınız https://www.customvision.ai/ . Oturum açıldıktan sonra sağ üstteki Ayarlar simgesini seçin. Ayar sayfalarında tüm anahtarları, kaynak kimliğini ve uç noktaları görüntüleyebilirsiniz.

Dikkat

Anahtarı doğrudan kodunuz içinde eklemeyin ve asla herkese açık olarak göndermeyin. Azure Key Vault gibi daha fazla kimlik doğrulama seçeneği için Azure AI hizmetleri güvenlik makalesine bakın.

Ortam değişkenlerini ayarlamak için bir konsol penceresi açın ve işletim sisteminizle geliştirme ortamınıza yönelik yönergeleri izleyin.

  1. Ortam değişkenini VISION_TRAINING KEY ayarlamak için öğesini eğitim kaynağınızın anahtarlarından biriyle değiştirin your-training-key .
  2. Ortam değişkenini VISION_TRAINING_ENDPOINT ayarlamak için öğesini eğitim kaynağınızın uç noktasıyla değiştirin your-training-endpoint .
  3. Ortam değişkenini VISION_PREDICTION_KEY ayarlamak için değerini tahmin kaynağınızın anahtarlarından biriyle değiştirin your-prediction-key .
  4. Ortam değişkenini VISION_PREDICTION_ENDPOINT ayarlamak için değerini tahmin kaynağınızın uç noktasıyla değiştirin your-prediction-endpoint .
  5. Ortam değişkenini VISION_PREDICTION_RESOURCE_ID ayarlamak için değerini tahmin kaynağınızın kaynak kimliğiyle değiştirin your-resource-id .
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

Ortam değişkenlerini ekledikten sonra, konsol penceresi de dahil olmak üzere ortam değişkenlerini okuyacak tüm çalışan programları yeniden başlatmanız gerekebilir.

Ayarlama

Yeni bir Node.js uygulaması oluşturma

Konsol penceresinde (cmd, PowerShell veya Bash gibi), uygulamanız için yeni bir dizin oluşturun ve bu dizine gidin.

mkdir myapp && cd myapp

Bir package.json dosyası ile bir düğüm uygulaması oluşturmak için npm init komutunu çalıştırın.

npm init

İstemci kitaplığını yükleme

Node.js için Özel Görüntü İşleme içeren bir görüntü analizi uygulaması yazmak için Özel Görüntü İşleme NPM paketleri gerekir. Bunları yüklemek için PowerShell'de aşağıdaki komutu çalıştırın:

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

Uygulamanızın package.json dosyası bağımlılıklarla güncelleştirilecek.

adlı index.js bir dosya oluşturun ve aşağıdaki kitaplıkları içeri aktarın:

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");

İpucu

Tüm hızlı başlangıç kodunu aynı anda görüntülemek mi istiyorsunuz? Bunu, bu hızlı başlangıçtaki kod örneklerini içeren GitHub’da bulabilirsiniz.

Kaynağınızın Azure uç noktası ve anahtarları için değişkenler oluşturun.

// 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"];

Ayrıca proje adınız için alanlar ve zaman uyumsuz çağrılar için bir zaman aşımı parametresi ekleyin.

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

Nesne modeli

Veri Akışı Adı Açıklama
TrainingAPIClient Bu sınıf modellerinizin oluşturulmasını, eğitılmasını ve yayımlanmasını işler.
PredictionAPIClient Bu sınıf, nesne algılama tahminleri için modellerinizi sorgulamayı işler.
Tahmin Bu arabirim, tek bir görüntüde tek bir tahmin tanımlar. Nesne kimliği ve adı için özellikler ve güvenilirlik puanı içerir.

Kod örnekleri

Bu kod parçacıkları, JavaScript için Özel Görüntü İşleme istemci kitaplığıyla aşağıdaki görevlerin nasıl yapılacağını gösterir:

İstemcinin kimliğini doğrulama

Uç noktanız ve anahtarınız ile istemci nesnelerinin örneğini oluşturun. Anahtarınız ile bir ApiKeyCredentials nesnesi oluşturun ve bunu uç noktanızla birlikte kullanarak TrainingAPIClient ve PredictionAPIClient nesnesi oluşturun.

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);

Yardımcı işlev ekleme

Birden çok zaman uyumsuz çağrı yapmanıza yardımcı olması için aşağıdaki işlevi ekleyin. Bunu daha sonra kullanacaksınız.

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);

Yeni bir Özel Görüntü İşleme projesi oluşturma

Tüm Özel Görüntü İşleme işlev çağrılarınızı içerecek yeni bir işlev başlatın. Yeni bir Özel Görüntü İşleme hizmet projesi oluşturmak için aşağıdaki kodu ekleyin.

(async () => {
    console.log("Creating project...");
    const domains = await trainer.getDomains()
    const objDetectDomain = domains.find(domain => domain.type === "ObjectDetection");
    const sampleProject = await trainer.createProject("Sample Obj Detection Project", { domainId: objDetectDomain.id });

Projeye etiketleri ekleme

Projenize sınıflandırma etiketleri oluşturmak için işlevinize aşağıdaki kodu ekleyin:

const forkTag = await trainer.createTag(sampleProject.id, "Fork");
const scissorsTag = await trainer.createTag(sampleProject.id, "Scissors");

Görüntüleri karşıya yükleme ve etiketleme

İlk olarak, bu proje için örnek görüntüleri indirin. Örnek Görüntüler klasörünün içeriğini yerel cihazınıza kaydedin.

Projeye örnek görüntüleri eklemek için etiket oluşturduktan sonra aşağıdaki kodu ekleyin. Bu kod, her görüntüyü ilgili etiketiyle birlikte karşıya yükler. Nesne algılama projelerinde görüntüleri etiketlediğinizde etiketli her nesnenin bölgesini normalleştirilmiş koordinatları kullanarak belirtmeniz gerekir. Bu öğreticide bölgeler kodla satır içinde sabit kodlanmıştır. Bölgeler, sınırlayıcı kutuyu normalleştirilmiş koordinatlarıyla belirtir ve koordinatlar şu sırayla verilir: sol, üst, genişlik, yükseklik. Tek bir toplu işlemde en fazla 64 görüntü yükleyebilirsiniz.

const sampleDataRoot = "Images";

const forkImageRegions = {
    "fork_1.jpg": [0.145833328, 0.3509314, 0.5894608, 0.238562092],
    "fork_2.jpg": [0.294117659, 0.216944471, 0.534313738, 0.5980392],
    "fork_3.jpg": [0.09191177, 0.0682516545, 0.757352948, 0.6143791],
    "fork_4.jpg": [0.254901975, 0.185898721, 0.5232843, 0.594771266],
    "fork_5.jpg": [0.2365196, 0.128709182, 0.5845588, 0.71405226],
    "fork_6.jpg": [0.115196079, 0.133611143, 0.676470637, 0.6993464],
    "fork_7.jpg": [0.164215669, 0.31008172, 0.767156839, 0.410130739],
    "fork_8.jpg": [0.118872553, 0.318251669, 0.817401946, 0.225490168],
    "fork_9.jpg": [0.18259804, 0.2136765, 0.6335784, 0.643790841],
    "fork_10.jpg": [0.05269608, 0.282303959, 0.8088235, 0.452614367],
    "fork_11.jpg": [0.05759804, 0.0894935, 0.9007353, 0.3251634],
    "fork_12.jpg": [0.3345588, 0.07315363, 0.375, 0.9150327],
    "fork_13.jpg": [0.269607842, 0.194068655, 0.4093137, 0.6732026],
    "fork_14.jpg": [0.143382356, 0.218578458, 0.7977941, 0.295751631],
    "fork_15.jpg": [0.19240196, 0.0633497, 0.5710784, 0.8398692],
    "fork_16.jpg": [0.140931368, 0.480016381, 0.6838235, 0.240196079],
    "fork_17.jpg": [0.305147052, 0.2512582, 0.4791667, 0.5408496],
    "fork_18.jpg": [0.234068632, 0.445702642, 0.6127451, 0.344771236],
    "fork_19.jpg": [0.219362751, 0.141781077, 0.5919118, 0.6683006],
    "fork_20.jpg": [0.180147052, 0.239820287, 0.6887255, 0.235294119]
};

const scissorsImageRegions = {
    "scissors_1.jpg": [0.4007353, 0.194068655, 0.259803921, 0.6617647],
    "scissors_2.jpg": [0.426470578, 0.185898721, 0.172794119, 0.5539216],
    "scissors_3.jpg": [0.289215684, 0.259428144, 0.403186262, 0.421568632],
    "scissors_4.jpg": [0.343137264, 0.105833367, 0.332107842, 0.8055556],
    "scissors_5.jpg": [0.3125, 0.09766343, 0.435049027, 0.71405226],
    "scissors_6.jpg": [0.379901975, 0.24308826, 0.32107842, 0.5718954],
    "scissors_7.jpg": [0.341911763, 0.20714055, 0.3137255, 0.6356209],
    "scissors_8.jpg": [0.231617644, 0.08459154, 0.504901946, 0.8480392],
    "scissors_9.jpg": [0.170343131, 0.332957536, 0.767156839, 0.403594762],
    "scissors_10.jpg": [0.204656869, 0.120539248, 0.5245098, 0.743464053],
    "scissors_11.jpg": [0.05514706, 0.159754932, 0.799019635, 0.730392158],
    "scissors_12.jpg": [0.265931368, 0.169558853, 0.5061275, 0.606209159],
    "scissors_13.jpg": [0.241421565, 0.184264734, 0.448529422, 0.6830065],
    "scissors_14.jpg": [0.05759804, 0.05027781, 0.75, 0.882352948],
    "scissors_15.jpg": [0.191176474, 0.169558853, 0.6936275, 0.6748366],
    "scissors_16.jpg": [0.1004902, 0.279036, 0.6911765, 0.477124184],
    "scissors_17.jpg": [0.2720588, 0.131977156, 0.4987745, 0.6911765],
    "scissors_18.jpg": [0.180147052, 0.112369314, 0.6262255, 0.6666667],
    "scissors_19.jpg": [0.333333343, 0.0274019931, 0.443627447, 0.852941155],
    "scissors_20.jpg": [0.158088237, 0.04047389, 0.6691176, 0.843137264]
};

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

const forkDir = `${sampleDataRoot}/fork`;
const forkFiles = fs.readdirSync(forkDir);

await asyncForEach(forkFiles, async (file) => {
    const region = { tagId: forkTag.id, left: forkImageRegions[file][0], top: forkImageRegions[file][1], width: forkImageRegions[file][2], height: forkImageRegions[file][3] };
    const entry = { name: file, contents: fs.readFileSync(`${forkDir}/${file}`), regions: [region] };
    const batch = { images: [entry] };
    // Wait one second to accommodate rate limit.
    await setTimeoutPromise(1000, null);
    fileUploadPromises.push(trainer.createImagesFromFiles(sampleProject.id, batch));
});

const scissorsDir = `${sampleDataRoot}/scissors`;
const scissorsFiles = fs.readdirSync(scissorsDir);

await asyncForEach(scissorsFiles, async (file) => {
    const region = { tagId: scissorsTag.id, left: scissorsImageRegions[file][0], top: scissorsImageRegions[file][1], width: scissorsImageRegions[file][2], height: scissorsImageRegions[file][3] };
    const entry = { name: file, contents: fs.readFileSync(`${scissorsDir}/${file}`), regions: [region] };
    const batch = { images: [entry] };
    // Wait one second to accommodate rate limit.
    await setTimeoutPromise(1000, null);
    fileUploadPromises.push(trainer.createImagesFromFiles(sampleProject.id, batch));
});

await Promise.all(fileUploadPromises);

Önemli

Azure AI hizmetleri Python SDK Örnekleri depoyu indirdiğiniz yere göre görüntülerin (sampleDataRoot) yolunu değiştirmeniz gerekir.

Not

Bölgelerin koordinatlarını işaretlemek için tıklama ve sürükleme yardımcı programınız yoksa, Customvision.ai'da web kullanıcı arabirimini kullanabilirsiniz. Bu örnekte koordinatlar zaten sağlanmıştır.

Projeyi eğitme

Bu kod tahmin modelinin ilk yinelemesini oluşturur.

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);
    // wait for ten seconds
    await setTimeoutPromise(10000, null);
    trainingIteration = await trainer.getIteration(sampleProject.id, trainingIteration.id)
}
console.log("Training status: " + trainingIteration.status);

Geçerli yinelemeyi yayımlama

Bu kod, eğitilen yinelemeyi tahmin uç noktasında yayımlar. Yayımlanan yinelemeye verilen ad, tahmin istekleri göndermek için kullanılabilir. Bir yineleme, yayımlanana kadar tahmin uç noktasında kullanılamaz.

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

Tahmin uç noktasını test edin

Tahmin uç noktasına görüntü göndermek ve tahmini almak için işlevinize aşağıdaki kodu ekleyin.

const testFile = fs.readFileSync(`${sampleDataRoot}/test/test_image.jpg`);
const results = await predictor.detectImage(sampleProject.id, publishIterationName, testFile)

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

Ardından Özel Görüntü İşleme işlevinizi kapatıp çağırabilirsiniz.

})()

Uygulamayı çalıştırma

Uygulamayı hızlı başlangıç dosyanızdaki node komutuyla çalıştırın.

node index.js

Uygulamanın çıkışı konsolda görüntülenmelidir. Daha sonra test görüntüsünün (sampleDataRoot>/Test/içinde <bulunur) uygun şekilde etiketlendiğini ve algılama bölgesinin doğru olduğunu doğrulayabilirsiniz. Ayrıca Özel Görüntü İşleme web sitesine geri dönebilir ve yeni oluşturulan projenizin geçerli durumunu görebilirsiniz.

Kaynakları temizleme

Kendi nesne algılama projenizi gerçekleştirmek (veya bunun yerine görüntü sınıflandırma projesi oluşturmak) istiyorsanız, bu örnekteki çatal/makas algılama projesini silmek isteyebilirsiniz. Ücretsiz abonelik iki Özel Görüntü İşleme projesine izin verir.

Özel Görüntü İşleme web sitesindeProjeler’e gidin ve Yeni Projem’in altından çöp kutusunu secin.

Screenshot of a panel labeled My New Project with a trash can icon.

Sonraki adımlar

Artık kodda nesne algılama işleminin her adımını gerçekleştirdiniz. Bu örnek tek bir eğitim yinelemesi yürütür, ancak genellikle modelinizi daha doğru hale getirmek için birden çok kez eğitip test etmeniz gerekir. Sonraki kılavuzda görüntü sınıflandırma konusu üstünde durulur ancak temel ilkeleri nesne algılamaya benzer.

Python için Özel Görüntü İşleme istemci kitaplığını kullanmaya başlayın. Paketi yüklemek için bu adımları izleyin ve nesne algılama modeli oluşturmaya yönelik örnek kodu deneyin. Program aracılığıyla test etmek için bir proje oluşturacak, etiketler ekleyecek, projeyi eğitecek ve projenin tahmin uç noktası URL'sini kullanacaksınız. Bu örneği kendi görüntü tanıma uygulamanızı oluşturmak için şablon olarak kullanın.

Not

Kod yazmadan bir nesne algılama modeli oluşturmak ve eğitmek istiyorsanız bunun yerine tarayıcı tabanlı kılavuza bakın.

Python için Özel Görüntü İşleme istemci kitaplığını kullanarak:

  • Yeni bir Özel Görüntü İşleme projesi oluşturma
  • Projeye etiketleri ekleme
  • Görüntüleri karşıya yükleme ve etiketleme
  • Projeyi eğitme
  • Geçerli yinelemeyi yayımlama
  • Tahmin uç noktasını test edin

Başvuru belgeleri | Kitaplık kaynak kodu | Paketi (PyPI)Örnekleri |

Önkoşullar

  • Azure aboneliği - Ücretsiz olarak oluşturun
  • Python 3.x
    • Python yüklemeniz pip içermelidir. Pip'in yüklü olup olmadığını denetlemek için komut satırında komutunu çalıştırabilirsiniz pip --version . Python'ın en son sürümünü yükleyerek pip alın.
  • Azure aboneliğinizi aldıktan sonra Azure portalında bir eğitim ve tahmin kaynağı oluşturmak için bir Özel Görüntü İşleme kaynağı oluşturun.
    • Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (F0) kullanabilirsiniz.

Ortam değişkenlerini oluşturma

Bu örnekte, kimlik bilgilerinizi uygulamayı çalıştıran yerel makinedeki ortam değişkenlerine yazacaksınız.

Azure portalına gidin. Önkoşullar bölümünde oluşturduğunuz Özel Görüntü İşleme kaynaklar başarıyla dağıtıldıysa, Sonraki Adımlar'ın altındaki Kaynağa Git düğmesini seçin. Anahtarlarınızı ve uç noktalarınızı kaynakların anahtar ve uç nokta sayfalarında, kaynak yönetimi altında bulabilirsiniz. API uç noktalarıyla birlikte hem eğitim hem de tahmin kaynaklarınızın anahtarlarını almanız gerekir.

Tahmin kaynağı kimliğini Azure portalındaki Tahmin kaynağının Özellikler sekmesinde Kaynak Kimliği olarak listelenmiş olarak bulabilirsiniz.

İpucu

Bu değerleri almak için de kullanırsınız https://www.customvision.ai/ . Oturum açıldıktan sonra sağ üstteki Ayarlar simgesini seçin. Ayar sayfalarında tüm anahtarları, kaynak kimliğini ve uç noktaları görüntüleyebilirsiniz.

Dikkat

Anahtarı doğrudan kodunuz içinde eklemeyin ve asla herkese açık olarak göndermeyin. Azure Key Vault gibi daha fazla kimlik doğrulama seçeneği için Azure AI hizmetleri güvenlik makalesine bakın.

Ortam değişkenlerini ayarlamak için bir konsol penceresi açın ve işletim sisteminizle geliştirme ortamınıza yönelik yönergeleri izleyin.

  1. Ortam değişkenini VISION_TRAINING KEY ayarlamak için öğesini eğitim kaynağınızın anahtarlarından biriyle değiştirin your-training-key .
  2. Ortam değişkenini VISION_TRAINING_ENDPOINT ayarlamak için öğesini eğitim kaynağınızın uç noktasıyla değiştirin your-training-endpoint .
  3. Ortam değişkenini VISION_PREDICTION_KEY ayarlamak için değerini tahmin kaynağınızın anahtarlarından biriyle değiştirin your-prediction-key .
  4. Ortam değişkenini VISION_PREDICTION_ENDPOINT ayarlamak için değerini tahmin kaynağınızın uç noktasıyla değiştirin your-prediction-endpoint .
  5. Ortam değişkenini VISION_PREDICTION_RESOURCE_ID ayarlamak için değerini tahmin kaynağınızın kaynak kimliğiyle değiştirin your-resource-id .
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

Ortam değişkenlerini ekledikten sonra, konsol penceresi de dahil olmak üzere ortam değişkenlerini okuyacak tüm çalışan programları yeniden başlatmanız gerekebilir.

Ayarlama

İstemci kitaplığını yükleme

Python için Özel Görüntü İşleme içeren bir görüntü analizi uygulaması yazmak için Özel Görüntü İşleme istemci kitaplığı gerekir. Python'ı yükledikten sonra PowerShell'de veya konsol penceresinde aşağıdaki komutu çalıştırın:

pip install azure-cognitiveservices-vision-customvision

Yeni Python uygulaması oluşturma

Yeni bir Python dosyası oluşturun ve aşağıdaki kitaplıkları içeri aktarın.

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

İpucu

Tüm hızlı başlangıç kodunu aynı anda görüntülemek mi istiyorsunuz? Bunu, bu hızlı başlangıçtaki kod örneklerini içeren GitHub’da bulabilirsiniz.

Kaynağınızın Azure uç noktası ve anahtarları için değişkenler oluşturun.

# Replace with valid values
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"]

Nesne modeli

Veri Akışı Adı Açıklama
CustomVisionTrainingClient Bu sınıf modellerinizin oluşturulmasını, eğitılmasını ve yayımlanmasını işler.
CustomVisionPredictionClient Bu sınıf, nesne algılama tahminleri için modellerinizi sorgulamayı işler.
ImagePrediction Bu sınıf, tek bir görüntüde tek bir nesne tahmini tanımlar. Nesne kimliği ve adı, nesnenin sınırlayıcı kutu konumu ve güvenilirlik puanı özelliklerini içerir.

Kod örnekleri

Bu kod parçacıkları, Python için Özel Görüntü İşleme istemci kitaplığıyla aşağıdakileri nasıl yapacağınızı gösterir:

İstemcinin kimliğini doğrulama

Uç noktanız ve anahtarlarınızla bir eğitim ve tahmin istemcisi örneği oluşturun. Anahtarlarınızla ApiKeyServiceClientCredentials nesneleri oluşturun ve bunları uç noktanızla birlikte kullanarak CustomVisionTrainingClient ve CustomVisionPredictionClient nesnesi oluşturun.

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)

Yeni bir Özel Görüntü İşleme projesi oluşturma

Yeni bir Özel Görüntü İşleme hizmeti projesi oluşturmak için betiğinize aşağıdaki kodu ekleyin.

Projenizi oluştururken diğer seçenekleri belirtmek için create_project yöntemine bakın (Algılayıcı oluşturma web portalı kılavuzunda açıklanmıştır).

publish_iteration_name = "detectModel"

# Find the object detection domain
obj_detection_domain = next(domain for domain in trainer.get_domains() if domain.type == "ObjectDetection" and domain.name == "General")

# Create a new project
print ("Creating project...")
# Use uuid to avoid project name collisions.
project = trainer.create_project(str(uuid.uuid4()), domain_id=obj_detection_domain.id)

Projeye etiketleri ekleme

Projenizde nesne etiketleri oluşturmak için aşağıdaki kodu ekleyin:

# Make two tags in the new project
fork_tag = trainer.create_tag(project.id, "fork")
scissors_tag = trainer.create_tag(project.id, "scissors")

Görüntüleri karşıya yükleme ve etiketleme

İlk olarak, bu proje için örnek görüntüleri indirin. Örnek Görüntüler klasörünün içeriğini yerel cihazınıza kaydedin.

Nesne algılama projelerinde görüntüleri etiketlediğinizde etiketli her nesnenin bölgesini normalleştirilmiş koordinatları kullanarak belirtmeniz gerekir. Aşağıdaki kod, örnek görüntülerin her birini etiketlendikleri bölgeyle ilişkilendirir. Bölgeler, sınırlayıcı kutuyu normalleştirilmiş koordinatlarıyla belirtir ve koordinatlar şu sırayla verilir: sol, üst, genişlik, yükseklik.

fork_image_regions = {
    "fork_1": [ 0.145833328, 0.3509314, 0.5894608, 0.238562092 ],
    "fork_2": [ 0.294117659, 0.216944471, 0.534313738, 0.5980392 ],
    "fork_3": [ 0.09191177, 0.0682516545, 0.757352948, 0.6143791 ],
    "fork_4": [ 0.254901975, 0.185898721, 0.5232843, 0.594771266 ],
    "fork_5": [ 0.2365196, 0.128709182, 0.5845588, 0.71405226 ],
    "fork_6": [ 0.115196079, 0.133611143, 0.676470637, 0.6993464 ],
    "fork_7": [ 0.164215669, 0.31008172, 0.767156839, 0.410130739 ],
    "fork_8": [ 0.118872553, 0.318251669, 0.817401946, 0.225490168 ],
    "fork_9": [ 0.18259804, 0.2136765, 0.6335784, 0.643790841 ],
    "fork_10": [ 0.05269608, 0.282303959, 0.8088235, 0.452614367 ],
    "fork_11": [ 0.05759804, 0.0894935, 0.9007353, 0.3251634 ],
    "fork_12": [ 0.3345588, 0.07315363, 0.375, 0.9150327 ],
    "fork_13": [ 0.269607842, 0.194068655, 0.4093137, 0.6732026 ],
    "fork_14": [ 0.143382356, 0.218578458, 0.7977941, 0.295751631 ],
    "fork_15": [ 0.19240196, 0.0633497, 0.5710784, 0.8398692 ],
    "fork_16": [ 0.140931368, 0.480016381, 0.6838235, 0.240196079 ],
    "fork_17": [ 0.305147052, 0.2512582, 0.4791667, 0.5408496 ],
    "fork_18": [ 0.234068632, 0.445702642, 0.6127451, 0.344771236 ],
    "fork_19": [ 0.219362751, 0.141781077, 0.5919118, 0.6683006 ],
    "fork_20": [ 0.180147052, 0.239820287, 0.6887255, 0.235294119 ]
}

scissors_image_regions = {
    "scissors_1": [ 0.4007353, 0.194068655, 0.259803921, 0.6617647 ],
    "scissors_2": [ 0.426470578, 0.185898721, 0.172794119, 0.5539216 ],
    "scissors_3": [ 0.289215684, 0.259428144, 0.403186262, 0.421568632 ],
    "scissors_4": [ 0.343137264, 0.105833367, 0.332107842, 0.8055556 ],
    "scissors_5": [ 0.3125, 0.09766343, 0.435049027, 0.71405226 ],
    "scissors_6": [ 0.379901975, 0.24308826, 0.32107842, 0.5718954 ],
    "scissors_7": [ 0.341911763, 0.20714055, 0.3137255, 0.6356209 ],
    "scissors_8": [ 0.231617644, 0.08459154, 0.504901946, 0.8480392 ],
    "scissors_9": [ 0.170343131, 0.332957536, 0.767156839, 0.403594762 ],
    "scissors_10": [ 0.204656869, 0.120539248, 0.5245098, 0.743464053 ],
    "scissors_11": [ 0.05514706, 0.159754932, 0.799019635, 0.730392158 ],
    "scissors_12": [ 0.265931368, 0.169558853, 0.5061275, 0.606209159 ],
    "scissors_13": [ 0.241421565, 0.184264734, 0.448529422, 0.6830065 ],
    "scissors_14": [ 0.05759804, 0.05027781, 0.75, 0.882352948 ],
    "scissors_15": [ 0.191176474, 0.169558853, 0.6936275, 0.6748366 ],
    "scissors_16": [ 0.1004902, 0.279036, 0.6911765, 0.477124184 ],
    "scissors_17": [ 0.2720588, 0.131977156, 0.4987745, 0.6911765 ],
    "scissors_18": [ 0.180147052, 0.112369314, 0.6262255, 0.6666667 ],
    "scissors_19": [ 0.333333343, 0.0274019931, 0.443627447, 0.852941155 ],
    "scissors_20": [ 0.158088237, 0.04047389, 0.6691176, 0.843137264 ]
}

Not

Bölgelerin koordinatlarını işaretlemek için tıklama ve sürükleme yardımcı programınız yoksa, Customvision.ai'da web kullanıcı arabirimini kullanabilirsiniz. Bu örnekte koordinatlar zaten sağlanmıştır.

Ardından, her örnek görüntüyü kendi bölge koordinatlarıyla karşıya yüklemek için bu ilişkilendirme haritasını kullanın (tek bir toplu işte en fazla 64 görüntü yükleyebilirsiniz). Aşağıdaki kodu ekleyin.

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

# Go through the data table above and create the images
print ("Adding images...")
tagged_images_with_regions = []

for file_name in fork_image_regions.keys():
    x,y,w,h = fork_image_regions[file_name]
    regions = [ Region(tag_id=fork_tag.id, left=x,top=y,width=w,height=h) ]

    with open(os.path.join (base_image_location, "fork", file_name + ".jpg"), mode="rb") as image_contents:
        tagged_images_with_regions.append(ImageFileCreateEntry(name=file_name, contents=image_contents.read(), regions=regions))

for file_name in scissors_image_regions.keys():
    x,y,w,h = scissors_image_regions[file_name]
    regions = [ Region(tag_id=scissors_tag.id, left=x,top=y,width=w,height=h) ]

    with open(os.path.join (base_image_location, "scissors", file_name + ".jpg"), mode="rb") as image_contents:
        tagged_images_with_regions.append(ImageFileCreateEntry(name=file_name, contents=image_contents.read(), regions=regions))

upload_result = trainer.create_images_from_files(project.id, ImageFileCreateBatch(images=tagged_images_with_regions))
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)

Not

Görüntülerin yolunu, Daha önce Azure AI hizmetleri Python SDK Örnekleri depounu indirdiğiniz yere göre değiştirmeniz gerekir.

Projeyi eğitme

Bu kod tahmin modelinin ilk yinelemesini oluşturur.

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)
    time.sleep(1)

İpucu

Seçili etiketlerle eğit

İsteğe bağlı olarak, uygulanan etiketlerinizin yalnızca bir alt kümesi üzerinde eğitebilirsiniz. Henüz belirli etiketlerden yeterince uygulamadıysanız ancak daha fazla etiketiniz varsa bunu yapmak isteyebilirsiniz. train_project çağrısında, selected_tags isteğe bağlı parametresini kullanmak istediğiniz etiketlerin kimlik dizelerinin listesine ayarlayın. Model yalnızca bu listedeki etiketleri tanıyacak şekilde eğitilecektir.

Geçerli yinelemeyi yayımlama

Bir yineleme, yayımlanana kadar tahmin uç noktasında kullanılamaz. Aşağıdaki kod, modelin geçerli yinelemesini sorgulama için kullanılabilir hale getirir.

# 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!")

Tahmin uç noktasını test edin

Tahmin uç noktasına bir görüntü göndermek ve tahmini almak için dosyanın sonuna aşağıdaki kodu ekleyin:

# Now there is a trained endpoint that can be used to make a prediction

# Open the sample image and get back the prediction results.
with open(os.path.join (base_image_location, "test", "test_image.jpg"), mode="rb") as test_data:
    results = predictor.detect_image(project.id, publish_iteration_name, test_data)

# Display the results.    
for prediction in results.predictions:
    print("\t" + prediction.tag_name + ": {0:.2f}% bbox.left = {1:.2f}, bbox.top = {2:.2f}, bbox.width = {3:.2f}, bbox.height = {4:.2f}".format(prediction.probability * 100, prediction.bounding_box.left, prediction.bounding_box.top, prediction.bounding_box.width, prediction.bounding_box.height))

Uygulamayı çalıştırma

CustomVisionQuickstart.py çalıştırın.

python CustomVisionQuickstart.py

Uygulamanın çıkışı konsolda görüntülenmelidir. Daha sonra test görüntüsünün (base_image_location>/görüntüler/Test'te< bulunur) uygun şekilde etiketlendiğini ve algılama bölgesinin doğru olduğunu doğrulayabilirsiniz. Ayrıca Özel Görüntü İşleme web sitesine geri dönebilir ve yeni oluşturulan projenizin geçerli durumunu görebilirsiniz.

Kaynakları temizleme

Kendi nesne algılama projenizi gerçekleştirmek (veya bunun yerine görüntü sınıflandırma projesi oluşturmak) istiyorsanız, bu örnekteki çatal/makas algılama projesini silmek isteyebilirsiniz. Ücretsiz abonelik iki Özel Görüntü İşleme projesine izin verir.

Özel Görüntü İşleme web sitesindeProjeler’e gidin ve Yeni Projem’in altından çöp kutusunu secin.

Screenshot of a panel labeled My New Project with a trash can icon.

Sonraki adımlar

Artık kodda nesne algılama işleminin her adımını gerçekleştirdiniz. Bu örnek tek bir eğitim yinelemesi yürütür, ancak genellikle modelinizi daha doğru hale getirmek için birden çok kez eğitip test etmeniz gerekir. Sonraki kılavuzda görüntü sınıflandırma konusu üstünde durulur ancak temel ilkeleri nesne algılamaya benzer.