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.
- Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (
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.
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.
- Ortam değişkenini
VISION_TRAINING KEY
ayarlamak için öğesini eğitim kaynağınızın anahtarlarından biriyle değiştirinyour-training-key
. - Ortam değişkenini
VISION_TRAINING_ENDPOINT
ayarlamak için öğesini eğitim kaynağınızın uç noktasıyla değiştirinyour-training-endpoint
. - Ortam değişkenini
VISION_PREDICTION_KEY
ayarlamak için değerini tahmin kaynağınızın anahtarlarından biriyle değiştirinyour-prediction-key
. - Ortam değişkenini
VISION_PREDICTION_ENDPOINT
ayarlamak için değerini tahmin kaynağınızın uç noktasıyla değiştirinyour-prediction-endpoint
. - Ortam değişkenini
VISION_PREDICTION_RESOURCE_ID
ayarlamak için değerini tahmin kaynağınızın kaynak kimliğiyle değiştirinyour-resource-id
.
Önemli
API anahtarı kullanıyorsanız, bunu Azure Key Vault gibi başka bir yerde güvenli bir şekilde depolayın. API anahtarını doğrudan kodunuzla eklemeyin ve hiçbir zaman herkese açık olarak göndermeyin.
Yapay zeka hizmetleri güvenliği hakkında daha fazla bilgi için bkz . Azure AI hizmetlerine yönelik isteklerin kimliğini doğrulama.
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.Prediction
araması 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 predictionResourceId
kendi 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.
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.
- Özel Görüntü İşleme nedir?
- Bu örneğin kaynak kodu GitHub'da bulunabilir
- SDK başvuru belgeleri
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
- Azure aboneliği - Ücretsiz olarak oluşturun
- Go 1.8+
- 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.
- Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (
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.
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.
- Ortam değişkenini
VISION_TRAINING KEY
ayarlamak için öğesini eğitim kaynağınızın anahtarlarından biriyle değiştirinyour-training-key
. - Ortam değişkenini
VISION_TRAINING_ENDPOINT
ayarlamak için öğesini eğitim kaynağınızın uç noktasıyla değiştirinyour-training-endpoint
. - Ortam değişkenini
VISION_PREDICTION_KEY
ayarlamak için değerini tahmin kaynağınızın anahtarlarından biriyle değiştirinyour-prediction-key
. - Ortam değişkenini
VISION_PREDICTION_ENDPOINT
ayarlamak için değerini tahmin kaynağınızın uç noktasıyla değiştirinyour-prediction-endpoint
. - Ortam değişkenini
VISION_PREDICTION_RESOURCE_ID
ayarlamak için değerini tahmin kaynağınızın kaynak kimliğiyle değiştirinyour-resource-id
.
Önemli
API anahtarı kullanıyorsanız, bunu Azure Key Vault gibi başka bir yerde güvenli bir şekilde depolayın. API anahtarını doğrudan kodunuzla eklemeyin ve hiçbir zaman herkese açık olarak göndermeyin.
Yapay zeka hizmetleri güvenliği hakkında daha fazla bilgi için bkz . Azure AI hizmetlerine yönelik isteklerin kimliğini doğrulama.
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: ®iontest[0],
Top: ®iontest[1],
Width: ®iontest[2],
Height: ®iontest[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:®ion[0],
Top:®ion[1],
Width:®ion[2],
Height:®ion[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.
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
- Azure aboneliği - Ücretsiz bir abonelik oluşturun
- Java Development Kit'in (JDK) geçerli sürümü
- Gradle derleme aracı veya başka bir bağımlılık yöneticisi.
- 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.
- Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (
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.
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.
- Ortam değişkenini
VISION_TRAINING KEY
ayarlamak için öğesini eğitim kaynağınızın anahtarlarından biriyle değiştirinyour-training-key
. - Ortam değişkenini
VISION_TRAINING_ENDPOINT
ayarlamak için öğesini eğitim kaynağınızın uç noktasıyla değiştirinyour-training-endpoint
. - Ortam değişkenini
VISION_PREDICTION_KEY
ayarlamak için değerini tahmin kaynağınızın anahtarlarından biriyle değiştirinyour-prediction-key
. - Ortam değişkenini
VISION_PREDICTION_ENDPOINT
ayarlamak için değerini tahmin kaynağınızın uç noktasıyla değiştirinyour-prediction-endpoint
. - Ortam değişkenini
VISION_PREDICTION_RESOURCE_ID
ayarlamak için değerini tahmin kaynağınızın kaynak kimliğiyle değiştirinyour-resource-id
.
Önemli
API anahtarı kullanıyorsanız, bunu Azure Key Vault gibi başka bir yerde güvenli bir şekilde depolayın. API anahtarını doğrudan kodunuzla eklemeyin ve hiçbir zaman herkese açık olarak göndermeyin.
Yapay zeka hizmetleri güvenliği hakkında daha fazla bilgi için bkz . Azure AI hizmetlerine yönelik isteklerin kimliğini doğrulama.
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
- Yeni Özel Görüntü İşleme projesi oluşturma
- Projeye etiket ekleme
- Görüntüleri karşıya yükleme ve etiketleme
- Projeyi eğitin
- Geçerli yinelemeyi yayımlama
- Tahmin uç noktasını test edin
İ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 GetImage
iş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 predictionResourceId
kendi 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.
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.
- Özel Görüntü İşleme nedir?
- Bu örneğin kaynak kodu GitHub'da bulunabilir
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) | 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.
- Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (
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.
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.
- Ortam değişkenini
VISION_TRAINING KEY
ayarlamak için öğesini eğitim kaynağınızın anahtarlarından biriyle değiştirinyour-training-key
. - Ortam değişkenini
VISION_TRAINING_ENDPOINT
ayarlamak için öğesini eğitim kaynağınızın uç noktasıyla değiştirinyour-training-endpoint
. - Ortam değişkenini
VISION_PREDICTION_KEY
ayarlamak için değerini tahmin kaynağınızın anahtarlarından biriyle değiştirinyour-prediction-key
. - Ortam değişkenini
VISION_PREDICTION_ENDPOINT
ayarlamak için değerini tahmin kaynağınızın uç noktasıyla değiştirinyour-prediction-endpoint
. - Ortam değişkenini
VISION_PREDICTION_RESOURCE_ID
ayarlamak için değerini tahmin kaynağınızın kaynak kimliğiyle değiştirinyour-resource-id
.
Önemli
API anahtarı kullanıyorsanız, bunu Azure Key Vault gibi başka bir yerde güvenli bir şekilde depolayın. API anahtarını doğrudan kodunuzla eklemeyin ve hiçbir zaman herkese açık olarak göndermeyin.
Yapay zeka hizmetleri güvenliği hakkında daha fazla bilgi için bkz . Azure AI hizmetlerine yönelik isteklerin kimliğini doğrulama.
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
- Yeni Özel Görüntü İşleme projesi oluşturma
- Projeye etiket ekleme
- Görüntüleri karşıya yükleme ve etiketleme
- Projeyi eğitin
- Geçerli yinelemeyi yayımlama
- Tahmin uç noktasını test edin
İ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.
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.
- Özel Görüntü İşleme nedir?
- Bu örneğin kaynak kodu GitHub'da bulunabilir
- SDK başvuru belgeleri (eğitim)
- SDK başvuru belgeleri (tahmin)
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.
- Python yüklemeniz pip içermelidir. Pip'in yüklü olup olmadığını denetlemek için komut satırında komutunu çalıştırabilirsiniz
- 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.
- Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (
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.
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.
- Ortam değişkenini
VISION_TRAINING KEY
ayarlamak için öğesini eğitim kaynağınızın anahtarlarından biriyle değiştirinyour-training-key
. - Ortam değişkenini
VISION_TRAINING_ENDPOINT
ayarlamak için öğesini eğitim kaynağınızın uç noktasıyla değiştirinyour-training-endpoint
. - Ortam değişkenini
VISION_PREDICTION_KEY
ayarlamak için değerini tahmin kaynağınızın anahtarlarından biriyle değiştirinyour-prediction-key
. - Ortam değişkenini
VISION_PREDICTION_ENDPOINT
ayarlamak için değerini tahmin kaynağınızın uç noktasıyla değiştirinyour-prediction-endpoint
. - Ortam değişkenini
VISION_PREDICTION_RESOURCE_ID
ayarlamak için değerini tahmin kaynağınızın kaynak kimliğiyle değiştirinyour-resource-id
.
Önemli
API anahtarı kullanıyorsanız, bunu Azure Key Vault gibi başka bir yerde güvenli bir şekilde depolayın. API anahtarını doğrudan kodunuzla eklemeyin ve hiçbir zaman herkese açık olarak göndermeyin.
Yapay zeka hizmetleri güvenliği hakkında daha fazla bilgi için bkz . Azure AI hizmetlerine yönelik isteklerin kimliğini doğrulama.
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
- Yeni Özel Görüntü İşleme projesi oluşturma
- Projeye etiket ekleme
- Görüntüleri karşıya yükleme ve etiketleme
- Projeyi eğitin
- Geçerli yinelemeyi yayımlama
- Tahmin uç noktasını test edin
İ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.
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.
- Özel Görüntü İşleme nedir?
- Bu örneğin kaynak kodu GitHub'da bulunabilir
- SDK başvuru belgeleri