التشغيل السريع: إنشاء مشروع الكشف عن كائن باستخدام مكتبة عميل Custom Vision

البدء مع مكتبة عميل الرؤية المخصصة لـ .NET. اتبع هذه الخطوات لتثبيت الحزمة وتجربة مثال التعليمات البرمجية لإنشاء نموذج اكتشاف الكائنات. ستُنشئ مشروعاً وتضيف علامات وتتدرب عليه وتستخدم عنوان "URL" لنقطة نهاية التنبؤ بالمشروع لاختباره برمجياً. استخدم هذا المثال كنموذج لإنشاء تطبيقك الخاص بالتعرف على الصور.

إشعار

إذا كنت ترغب في إنشاء نموذج اكتشاف الكائنات وتدريبه دون كتابة التعليمات البرمجية، يُرجى مراجعة الإرشادات المستندة إلى المتصفح بدلاً من ذلك.

نماذجوثائق مرجعية | تعليمة مصدر المكتبة البرمجية (تدريب)(تنبؤ) | حزمة (NuGet) (تدريب)(تنبؤ) | نماذج

المتطلبات الأساسية

  • اشتراك Azure - إنشاء اشتراك مجانًا
  • إصدار Visual Studio IDE أو الإصدار الحالي من .NET Core.
  • بمجرد أن يكون لديك اشتراك Azure، قم بإنشاء مورد Custom Vision في مدخل Microsoft Azure لإنشاء مورد تدريب وتنبؤ.
    • يمكنك استخدام مستوى التسعير الحر (F0) لتجربة الخدمة، والترقية لاحقًا إلى مستوى مدفوع للإنتاج.

إنشاء متغيرات البيئة

في هذا المثال، ستكتب بيانات الاعتماد الخاصة بك إلى متغيرات البيئة على الجهاز المحلي الذي يقوم بتشغيل التطبيق.

انتقل إلى مدخل Azure. إذا تم نشر موارد Custom Vision التي أنشأتها في قسم المتطلبات الأساسية بنجاح، فحدد الزر Go to Resource ضمن Next Steps. يمكنك العثور على المفاتيح ونقاط النهاية في صفحات مفتاح الموارد ونقطة النهاية، ضمن إدارة الموارد. ستحتاج إلى الحصول على مفاتيح لكل من موارد التدريب والتنبؤ، جنبا إلى جنب مع نقاط نهاية واجهة برمجة التطبيقات.

يمكنك العثور على معرف مورد التنبؤ في علامة تبويب خصائص مورد التنبؤ في مدخل Microsoft Azure، المدرجة كمعرف المورد.

تلميح

يمكنك أيضا استخدام https://www.customvision.ai/ للحصول على هذه القيم. بعد تسجيل الدخول، حدد أيقونة Settings في أعلى اليمين. في صفحات الإعداد ، يمكنك عرض جميع المفاتيح ومعرف المورد ونقاط النهاية.

تنبيه

لا تقم بتضمين المفتاح مباشرة في التعليمات البرمجية الخاصة بك، ولا تنشره بشكل عام. راجع مقالة أمان خدمات Azure الذكاء الاصطناعي لمزيد من خيارات المصادقة مثل Azure Key Vault.

لتعيين متغيرات البيئة، افتح نافذة وحدة التحكم واتبع الإرشادات الخاصة بنظام التشغيل وبيئة التطوير.

  1. لتعيين VISION_TRAINING KEY متغير البيئة، استبدل your-training-key بأحد مفاتيح مورد التدريب الخاص بك.
  2. لتعيين VISION_TRAINING_ENDPOINT متغير البيئة، استبدل your-training-endpoint بنقطة النهاية لمورد التدريب الخاص بك.
  3. لتعيين VISION_PREDICTION_KEY متغير البيئة، استبدل your-prediction-key بأحد مفاتيح مورد التنبؤ الخاص بك.
  4. لتعيين VISION_PREDICTION_ENDPOINT متغير البيئة، استبدل your-prediction-endpoint بنقطة النهاية لمورد التنبؤ الخاص بك.
  5. لتعيين VISION_PREDICTION_RESOURCE_ID متغير البيئة، استبدل 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

بعد إضافة متغيرات البيئة، قد تحتاج إلى إعادة تشغيل أي برامج قيد التشغيل ستقرأ متغيرات البيئة، بما في ذلك نافذة وحدة التحكم.

الإعداد

إنشاء تطبيق C# جديد

باستخدام Visual Studio، قم بإنشاء تطبيق .NET Core جديد.

تثبيت مكتبة العميل

بمجرد إنشاء مشروع جديد، تثبيت مكتبة العميل بالنقر بزر الماوس الأيمن فوق حل المشروع في "Solution Explorer" وتحديد "Manage NuGet Packages". في إدارة الحزمة المراد فتحها، حدد "Browse"، "check" تضمين الإصدار المسبق والبحث عن Microsoft.Azure.CognitiveServices.Vision.CustomVision.TrainingوMicrosoft.Azure.CognitiveServices.Vision.CustomVision.Prediction. حدد أحدث إصدار ثم ثبته.

تلميح

هل تريد عرض ملف التعليمات البرمجية للبدء السريع بالكامل في الحال؟ يُمكن العثور على GitHub، والذي يحتوي على أمثلة التعليمات البرمجية في التشغيل السريع.

من دليل المشروع، افتح الملف program.cs ثم أضف التوجيهات using التالية:

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

في الأسلوب الرئيسي للتطبيق، قم بإنشاء متغيرات تسترد مفاتيح المورد ونقطة النهاية من متغيرات البيئة. وسوف تعلن أيضًا عن بعض الكائنات الأساسية لاستخدامها لاحقًا.

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

في أسلوب التطبيق، الرئيسيأضف المكالمات للأساليب المستخدمة في التشغيل السريع. وستُنفذ ذلك لاحقًا.

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

مصادقة العميل

وفقاً للأسلوب الجديد، أنشئ مثيل تدريب وتنبؤ العملاء باستخدام نقطة النهاية والمفاتيح.

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

إنشاء مشروع Custom Vision جديد

تُنشئ الطريقة التالية مشروع الكشف عن الكائن. سيظهر المشروع الذي تم إنشاؤه على موقع الرؤية المخصصة. يُرجى الاطلاع على أسلوب "CreateProject" لتحديد الخيارات الأخرى عند إنشاء مشروعك (الموضح في دليل بوابة الويب إنشاء مصنف).

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

إضافة علامات للمشروع

تُحدد هذه الطريقة العلامات التي ستقوم بتدريب الطراز عليها.

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

تحميل الصور ووضع علامات عليها

أولا، قم بتنزيل نموذج الصور لهذا المشروع. حفظ محتويات نموذج مجلد الصور على جهازك المحلي.

عند وضع علامة على الصور في مشاريع الكشف عن الكائنات، تحتاج إلى تحديد منطقة كل كائن معلم باستخدام الإحداثيات التي تم تسويتها. يعمل الرمز التالي على توصيل كل صورة من نماذج الصور بالمنطقة ذات العلامات.

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

إشعار

فيما يتعلق بمشروعك، إذا لم تكن لديك أداة مساعدة للنقر والسحب لوضع علامة على إحداثيات المناطق، يُمكنك استخدام واجهة مستخدم الويب في Custom Vision website. في هذا المثال، يتم توفير الإحداثيات بالفعل.

بعد ذلك، تُستخدم خريطة الارتباطات لتحميل كل نموذج من نماذج الصور بإحداثيات المنطقة الخاصة بها. يمكنك تحميل ما يصل إلى 64 صورة دفعة واحدة. قد تحتاج إلى تغيير قيمة imagePath للإشارة إلى مواقع المجلدات الصحيحة.

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

في هذه المرحلة، يُمكنك تحميل جميع نماذج الصور ووضع علامة على كل واحدة ("fork" أو "scissors") باستخدام مستطيل بكسل ذات الصلة.

التدريب على المشروع

يُنشئ هذا الأسلوب تكرار التدريب الأول في المشروع. إنه يوضح الخدمة حتى اكتمال التدريب.

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

تلميح

التدريب باستخدام علامات محددة

اختيارياً، يمكنك التدريب على مجموعة فرعية فقط من العلامات المطبقة. قد ترغب في القيام بذلك إذا لم تكن قد طبقت ما يكفي من العلامات المُحددة حتى الآن، ولكن لديك ما يكفي من العلامات الأخرى. في استدعاء"TrainProject"، استخدام المعلمة الخاصة بـ trainingParameters. أنشئ "TrainingParameters" وتعيين خاصية "SelectedTags" لإدراجها في قائمة معرفات العلامات التي تريد استخدامها. سيدربك النموذج على التعرف فقط على العلامات المُدرجة في تلك القائمة.

نشر التكرار الحالي

يتيح هذا الأسلوب الاستعلام عن التكرار الحالي للنموذج. يُمكن استخدام اسم الطراز كمرجع لإرسال طلبات التنبؤ. تحتاج إلى إدخال القيمة لـ predictionResourceId. يُمكن العثور على معرف مورد التنبؤ في علامة التبويب "Properties" الخاصة بالمورد في مدخل Microsoft Azure، المُدرجة باسم معرف المورد.

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

اختبار نقطة نهاية التنبؤ

يقوم هذا الأسلوب بتحميل صورة الاختبار والاستعلام عن نقطة نهاية النموذج وإخراج بيانات التنبؤ إلى وحدة التحكم.

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

شغّل التطبيق

قم بتشغيل التطبيق بنقر الزر Debug أعلى نافذة IDE.

عند تشغيل التطبيق، فإنه يجب فتح نافذة وحدة تحكم وكتابة الإخراج التالي:

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 ]

يمكنك التحقق من أن صورة الاختبار (الموجودة في ⁦⁩Images/Test/⁦⁩⁩) تم وضع عليها علامة بشكل مناسب وأن منطقة الكشف صحيحة. في هذه المرحلة، يُمكنك الضغط على أي مفتاح للخروج من التطبيق.

تنظيف الموارد

إذا كنت ترغب في تنفيذ مشروع اكتشاف الكائنات الخاص بك (أو تجربة مشروع تصنيف الصور بدلاً من ذلك)، فقد ترغب في حذف مشروع اكتشاف Azure Storage من هذا المثال. يسمح الاشتراك المجاني بمشروعي Custom Vision.

على موقع ويب Custom Vision، انتقل إلى Projects وحدِّد سلة المهملات ضمن My New Project.

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

الخطوات التالية

قمت الآن بكل خطوة تخص عملية الكشف عن الكائن في التعليمات البرمجية. ينفذ هذا النموذج تكراراً مفرداً للتدريب، ولكن غالباً ما ستحتاج إلى التدريب على نموذجك واختباره عدة مرات لزيادة دقته. يتناول الدليل التالي تصنيف الصور، ولكن تتشابه مبادئه مع الكشف عن الكائنات.

يوفر هذا الدليل إرشادات ونماذج من التعليمات البرمجية لمساعدتك على البدء باستخدام مكتبة عميل رؤية مخصصة للانتقال إلى إنشاء نموذج الكشف عن الكائنات. ستقوم بإنشاء مشروع وإضافة علامات وتدريب المشروع واستخدام عنوان URL لنقطة نهاية التنبؤ للمشروع لاختباره برمجيًا. استخدم هذا المثال كنموذج لإنشاء تطبيقك الخاص بالتعرف على الصور.

إشعار

إذا كنت ترغب في إنشاء نموذج اكتشاف الكائنات وتدريبه دون كتابة التعليمات البرمجية، يُرجى مراجعة الإرشادات المستندة إلى المتصفح بدلاً من ذلك.

استخدام مكتبة عميل الرؤية المخصصة للانتقال إلى:

  • إنشاء مشروع Custom Vision جديد
  • إضافة علامات للمشروع
  • تحميل الصور ووضع علامات عليها
  • التدريب على المشروع
  • نشر التكرار الحالي
  • اختبار نقطة نهاية التنبؤ

الوثائق المرجعية (التدريب)(التنبؤ)

المتطلبات الأساسية

  • اشتراك Azure - إنشاء اشتراك مجانًا
  • Go 1.8+
  • بمجرد أن يكون لديك اشتراك Azure، قم بإنشاء مورد Custom Vision في مدخل Microsoft Azure لإنشاء مورد تدريب وتنبؤ.
    • يمكنك استخدام مستوى التسعير الحر (F0) لتجربة الخدمة، والترقية لاحقًا إلى مستوى مدفوع للإنتاج.

إنشاء متغيرات البيئة

في هذا المثال، ستكتب بيانات الاعتماد الخاصة بك إلى متغيرات البيئة على الجهاز المحلي الذي يقوم بتشغيل التطبيق.

انتقل إلى مدخل Azure. إذا تم نشر موارد Custom Vision التي أنشأتها في قسم المتطلبات الأساسية بنجاح، فحدد الزر Go to Resource ضمن Next Steps. يمكنك العثور على المفاتيح ونقاط النهاية في صفحات مفتاح الموارد ونقطة النهاية، ضمن إدارة الموارد. ستحتاج إلى الحصول على مفاتيح لكل من موارد التدريب والتنبؤ، جنبا إلى جنب مع نقاط نهاية واجهة برمجة التطبيقات.

يمكنك العثور على معرف مورد التنبؤ في علامة تبويب خصائص مورد التنبؤ في مدخل Microsoft Azure، المدرجة كمعرف المورد.

تلميح

يمكنك أيضا استخدام https://www.customvision.ai/ للحصول على هذه القيم. بعد تسجيل الدخول، حدد أيقونة Settings في أعلى اليمين. في صفحات الإعداد ، يمكنك عرض جميع المفاتيح ومعرف المورد ونقاط النهاية.

تنبيه

لا تقم بتضمين المفتاح مباشرة في التعليمات البرمجية الخاصة بك، ولا تنشره بشكل عام. راجع مقالة أمان خدمات Azure الذكاء الاصطناعي لمزيد من خيارات المصادقة مثل Azure Key Vault.

لتعيين متغيرات البيئة، افتح نافذة وحدة التحكم واتبع الإرشادات الخاصة بنظام التشغيل وبيئة التطوير.

  1. لتعيين VISION_TRAINING KEY متغير البيئة، استبدل your-training-key بأحد مفاتيح مورد التدريب الخاص بك.
  2. لتعيين VISION_TRAINING_ENDPOINT متغير البيئة، استبدل your-training-endpoint بنقطة النهاية لمورد التدريب الخاص بك.
  3. لتعيين VISION_PREDICTION_KEY متغير البيئة، استبدل your-prediction-key بأحد مفاتيح مورد التنبؤ الخاص بك.
  4. لتعيين VISION_PREDICTION_ENDPOINT متغير البيئة، استبدل your-prediction-endpoint بنقطة النهاية لمورد التنبؤ الخاص بك.
  5. لتعيين VISION_PREDICTION_RESOURCE_ID متغير البيئة، استبدل 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

بعد إضافة متغيرات البيئة، قد تحتاج إلى إعادة تشغيل أي برامج قيد التشغيل ستقرأ متغيرات البيئة، بما في ذلك نافذة وحدة التحكم.

الإعداد

تثبيت مكتبة عميل الرؤية المخصصة

لكتابة تطبيق تحليل الصور باستخدام الرؤية المخصصة للانتقال، ستحتاج إلى مكتبة عميل خدمة الرؤية المخصصة. شغّل الأمر التالي في PowerShell :

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

أو إذا كنت تستخدم dep، في نطاق مستودعك:

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

احصل على التعليمات البرمجية للنموذج

يستخدم هذا المثال الصور من مستودع نماذج Python SDK لخدمات Azure الذكاء الاصطناعي على GitHub. استنساخ أو تحميل هذا المستودع إلى بيئة التطوير الخاصة بك. تذكر موقع المجلد الخاص به لخطوة لاحقة.

إنشاء مشروع الرؤية المخصصة

أنشئ ملفًا جديدًا يُسمى sample.go في دليل مشروعك المفضل وافتحه في برنامج محرر التعليمات البرمجية المفضل لديك.

إضافة التعليمات البرمجية التالية إلى البرنامج النصي لإنشاء مشروع خدمة رؤية مخصصة جديدة.

يُرجى الاطلاع على أسلوب "CreateProject" لتحديد الخيارات الأخرى عند إنشاء مشروعك (الموضح في دليل بوابة الويب إنشاء مصنف).

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

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

إضافة علامات في المشروع

لإضافة علامات تصنيف إلى مشروعك، أضف التعليمات البرمجية التالية بنهاية ملف sample.go :

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

تحميل الصور ووضع علامات عليها

عند وضع علامة على الصور في مشاريع الكشف عن الكائنات، تحتاج إلى تحديد منطقة كل كائن معلم باستخدام الإحداثيات التي تم تسويتها.

إشعار

إذا لم يكن لديك أداة مساعدة للنقر والسحب لوضع علامة على إحداثيات المناطق، يُمكنك استخدام واجهة مستخدم الويب في Customvision.ai. في هذا المثال، يتم توفير الإحداثيات بالفعل.

لإضافة الصور والعلامات والمناطق إلى المشروع، أدرج التعليمات البرمجية التالية بعد إنشاء العلامة. لاحظ أن في هذا البرنامج التعليمي تشفير المناطق المضمنة. تحدد المناطق المربع المحيط في الإحداثيات العادية، ويتم إعطاء الإحداثيات بالترتيب التالي: اليسار، الأعلى، العرض، الارتفاع.

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

بعد ذلك، استخدم خريطة الارتباطات لتحميل كل نموذج من نماذج الصور بإحداثيات المنطقة الخاصة بها (يمكنك تحميل ما يصل إلى 64 صورة دفعة واحدة). أضف التعليمات البرمجية التالية.

إشعار

ستحتاج إلى تغيير المسار إلى الصور استنادا إلى المكان الذي قمت بتنزيل مشروع Azure الذكاء الاصطناعي services Go SDK Samples سابقا.

// 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.")
}     

التدريب على المشروع ونشره

ينشئ هذا الرمز التكرار الأول لنموذج التنبؤ ثم ينشر هذا التكرار إلى نقطة النهاية التنبؤ. يُمكن استخدام الاسم المُطلق على التكرار المنشور لإرسال طلبات التنبؤ. لا يتوفر التكرار في نقطة النهاية التنبؤ حتى يتم نشره.

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

استخدام نقطة نهاية التنبؤ

لإرسال صورة إلى نقطة نهاية التنبؤ واسترداد التنبؤ، أضف التعليمات البرمجية التالية إلى نهاية الملف:

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

شغّل التطبيق

شغِّل sample.go .

go run sample.go

يجب أن يظهر إخراج التطبيق في وحدة التحكم. يمكنك بعد ذلك التحقق من أن صورة الاختبار (الموجودة في العينات / الرؤية / الصور / الاختبار) وُضِع عليها علامة بشكل مناسب وأن منطقة الكشف صحيحة.

تنظيف الموارد

إذا كنت ترغب في تنفيذ مشروع اكتشاف الكائنات الخاص بك (أو تجربة مشروع تصنيف الصور بدلاً من ذلك)، فقد ترغب في حذف مشروع اكتشاف Azure Storage من هذا المثال. يسمح الاشتراك المجاني بمشروعي Custom Vision.

على موقع ويب Custom Vision، انتقل إلى Projects وحدِّد سلة المهملات ضمن My New Project.

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

الخطوات التالية

قمت الآن بكل خطوة تخص عملية الكشف عن الكائن في التعليمات البرمجية. ينفذ هذا النموذج تكراراً مفرداً للتدريب، ولكن غالباً ما ستحتاج إلى التدريب على نموذجك واختباره عدة مرات لزيادة دقته. يتناول الدليل التالي تصنيف الصور، ولكن تتشابه مبادئه مع الكشف عن الكائنات.

البدء باستخدامCustom Vision client library الخاصة بـ Java لبناء نموذج الكشف عن الكائنات. اتبع هذه الخطوات لتثبيت الحزمة وتجربة نموذج تعليمات البرمجة للمهام الأساسية. استخدم هذا المثال كنموذج لإنشاء تطبيقك الخاص بالتعرف على الصور.

إشعار

إذا كنت ترغب في إنشاء نموذج اكتشاف الكائنات وتدريبه دون كتابة التعليمات البرمجية، يُرجى مراجعة الإرشادات المستندة إلى المتصفح بدلاً من ذلك.

استخدم مكتبة عميلCustom Vision client library الخاص بـ Java لـ:

  • إنشاء مشروع Custom Vision جديد
  • إضافة علامات للمشروع
  • تحميل الصور ووضع علامات عليها
  • التدريب على المشروع
  • نشر التكرار الحالي
  • اختبار نقطة نهاية التنبؤ

نماذج التوثيق المرجعي | التعليمة البرمجية لمصدر المكتبة (تدريب)(تنبؤ)| بيانات اصطناعية (Maven) (تدريب)(تنبؤ) | نماذج

المتطلبات الأساسية

إنشاء متغيرات البيئة

في هذا المثال، ستكتب بيانات الاعتماد الخاصة بك إلى متغيرات البيئة على الجهاز المحلي الذي يقوم بتشغيل التطبيق.

انتقل إلى مدخل Azure. إذا تم نشر موارد Custom Vision التي أنشأتها في قسم المتطلبات الأساسية بنجاح، فحدد الزر Go to Resource ضمن Next Steps. يمكنك العثور على المفاتيح ونقاط النهاية في صفحات مفتاح الموارد ونقطة النهاية، ضمن إدارة الموارد. ستحتاج إلى الحصول على مفاتيح لكل من موارد التدريب والتنبؤ، جنبا إلى جنب مع نقاط نهاية واجهة برمجة التطبيقات.

يمكنك العثور على معرف مورد التنبؤ في علامة تبويب خصائص مورد التنبؤ في مدخل Microsoft Azure، المدرجة كمعرف المورد.

تلميح

يمكنك أيضا استخدام https://www.customvision.ai/ للحصول على هذه القيم. بعد تسجيل الدخول، حدد أيقونة Settings في أعلى اليمين. في صفحات الإعداد ، يمكنك عرض جميع المفاتيح ومعرف المورد ونقاط النهاية.

تنبيه

لا تقم بتضمين المفتاح مباشرة في التعليمات البرمجية الخاصة بك، ولا تنشره بشكل عام. راجع مقالة أمان خدمات Azure الذكاء الاصطناعي لمزيد من خيارات المصادقة مثل Azure Key Vault.

لتعيين متغيرات البيئة، افتح نافذة وحدة التحكم واتبع الإرشادات الخاصة بنظام التشغيل وبيئة التطوير.

  1. لتعيين VISION_TRAINING KEY متغير البيئة، استبدل your-training-key بأحد مفاتيح مورد التدريب الخاص بك.
  2. لتعيين VISION_TRAINING_ENDPOINT متغير البيئة، استبدل your-training-endpoint بنقطة النهاية لمورد التدريب الخاص بك.
  3. لتعيين VISION_PREDICTION_KEY متغير البيئة، استبدل your-prediction-key بأحد مفاتيح مورد التنبؤ الخاص بك.
  4. لتعيين VISION_PREDICTION_ENDPOINT متغير البيئة، استبدل your-prediction-endpoint بنقطة النهاية لمورد التنبؤ الخاص بك.
  5. لتعيين VISION_PREDICTION_RESOURCE_ID متغير البيئة، استبدل 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

بعد إضافة متغيرات البيئة، قد تحتاج إلى إعادة تشغيل أي برامج قيد التشغيل ستقرأ متغيرات البيئة، بما في ذلك نافذة وحدة التحكم.

الإعداد

إنشاء مشروع Gradle جديد

في إطار نافذة وحدة التحكم (مثل cmd أو PowerShell أو Bash)، يمكنك إنشاء دليل جديد لتطبيقك وانتقل إليه.

mkdir myapp && cd myapp

بادر بتشغيل الأمر gradle init من دليل العمل خاصتك. سينشئ هذا الأمر ملفات بناء أساسية لـ Gradle، بما في ذلك build.gradle.kts، والذي يجري استخدامه في وقت التشغيل لإنشاء تطبيقك وتكوينه.

gradle init --type basic

عند طلب اختيار DSL، حدد Kotlin.

تثبيت مكتبة العميل

حدد build.gradle.kts وافتحه باستخدام IDE أو محرر النص المفضل لديك. ثم انسخ في تكوين البناء التالي. يُعرّف هذا التكوين المشروع على أنه تطبيق Java التي تُعد نقطة دخوله هي الفئة CustomVisionQuickstart. إنه يستورد مكتبات الرؤية المُخصصة.

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

إنشاء ملف Java

من دليل العمل الخاص بك، قم بتشغيل الأمر التالي لإنشاء مجلد مصدر المشروع:

mkdir -p src/main/java

الانتقال إلى المجلد الجديد وأنشِئ ملفاً باسم CustomVisionQuickstart.java. افتحه في المحرر المفضل لديك أو IDE وأضف عبارات import التالية:

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

import com.google.common.io.ByteStreams;

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

تلميح

هل تريد عرض ملف التعليمات البرمجية للبدء السريع بالكامل في الحال؟ يُمكن العثور على GitHub، والذي يحتوي على أمثلة التعليمات البرمجية في التشغيل السريع.

في فئة CustomVisionQuickstart للتطبيق، أنشئ متغيرات تسترد مفاتيح المورد ونقطة النهاية من متغيرات البيئة.

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

في أسلوب التطبيق الرئيسيأضف المكالمات للأساليب المستخدمة في التشغيل السريع. ستحدد هذا لاحقاً.

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

نموذج الكائن

تتعامل الفئات والواجهات التالية مع بعض الميزات الرئيسية لمكتبة عميل Java الخاصة بالرؤية المُخصصة.

الاسم ‏‏الوصف
CustomVisionTrainingClient يُعالج هذا الفصل إنشاء نماذجك وتدريبها ونشرها.
CustomVisionPredictionClient تُعالج هذه الفئة الاستعلام عن نماذجك لتنبؤات الكشف عن الكائنات.
ImagePrediction تُحدد هذه الفئة تنبؤاً لكائن واحد على صورة واحدة. يتضمن خصائص معرف الكائن واسمه وموقع المربع المحيط للكائن ودرجة الثقة.

أمثلة على التعليمات البرمجية

توضح لك هذه المقتطفات البرمجية كيفية القيام بالمهام التالية باستخدام مكتبة عميل الرؤية المخصصة لـ Java:

مصادقة العميل

وفقاً للأسلوب الرئيسي، أنشئ مثيل تدريب وتنبؤ العملاء باستخدام نقطة النهاية والمفاتيح.

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

إنشاء مشروع Custom Vision جديد

تُنشئ الطريقة التالية مشروع الكشف عن الكائن. سيظهر المشروع الذي تم إنشاؤه على موقع ويب الرؤية المُخصصة الذي زرته سابقاً. يُرجى الاطلاع على التحميلات الزائدة لأسلوب "CreateProject" لتحديد الخيارات الأخرى عند إنشاء مشروعك (الموضح في دليل بوابة الويبإنشاء مصنف).

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

إضافة العلامات للمشروع

تُحدد هذه الطريقة العلامات التي ستقوم بتدريب الطراز عليها.

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

تحميل الصور ووضع علامات عليها

أولا، قم بتنزيل نموذج الصور لهذا المشروع. حفظ محتويات نموذج مجلد الصور على جهازك المحلي.

إشعار

هل تحتاج إلى مجموعة أوسع من الصور لإكمال التدريب الخاص بك؟ يسمح لك Trove، وهو مشروعMicrosoft Garage، بجمع وشراء مجموعات من الصور لأغراض التدريب. بمجرد جمع الصور، يمكنك تنزيلها ثم استيرادها إلى مشروع الرؤية المُخصصة بالطريقة المعتادة. قم بزيارة صفحة Trove لمعرفة المزيد.

عند وضع علامة على الصور في مشاريع الكشف عن الكائنات، تحتاج إلى تحديد منطقة كل كائن معلم باستخدام الإحداثيات التي تم تسويتها. يعمل الرمز التالي على توصيل كل صورة من نماذج الصور بالمنطقة ذات العلامات.

إشعار

إذا لم يكن لديك أداة مساعدة للنقر والسحب لوضع علامة على إحداثيات المناطق، يُمكنك استخدام واجهة مستخدم الويب في Customvision.ai. في هذا المثال، يتم توفير الإحداثيات بالفعل.

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

تُضيف كتلة التعليمات البرمجية التالية الصور إلى المشروع. يلزم تغيير وسائط المكالمات GetImage للإشارة إلى مواقع مجلدات "fork" و"scissors" التي قمت بتنزيلها.

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

تستخدم القصاصة البرمجية السابقة وظيفتين مساعدتين لاسترداد الصور كتدفقات موارد وتحميلها إلى الخدمة (يُمكن تحميل ما يصل إلى 64 صورة في دفعة واحدة). تحديد الأساليب ذات الصلة.

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

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

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

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

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

التدريب على المشروع

يُنشئ هذا الأسلوب تكرار التدريب الأول في المشروع. إنه يوضح الخدمة حتى اكتمال التدريب.

public static 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());
}

نشر التكرار الحالي

يتيح هذا الأسلوب الاستعلام عن التكرار الحالي للنموذج. يُمكن استخدام اسم الطراز كمرجع لإرسال طلبات التنبؤ. تحتاج إلى إدخال القيمة لـ predictionResourceId. يُمكن العثور على معرف مورد التنبؤ في علامة التبويب "Properties" الخاصة بالمورد في مدخل Microsoft Azure، المُدرجة باسم معرف المورد.

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

اختبار نقطة نهاية التنبؤ

يقوم هذا الأسلوب بتحميل صورة الاختبار والاستعلام عن نقطة نهاية النموذج وإخراج بيانات التنبؤ إلى وحدة التحكم.

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

شغّل التطبيق

يمكنك إنشاء التطبيق باستخدام:

gradle build

قم بتشغيل التطبيق باستخدام الأمر gradle run:

gradle run

تنظيف الموارد

إذا كنت ترغب في تنظيف اشتراك خدمات Azure الذكاء الاصطناعي وإزالته، يمكنك حذف المورد أو مجموعة الموارد. يؤدي حذف مجموعة الموارد إلى حذف أية موارد أخرى مقترنة بها أيضًا.

إذا كنت ترغب في تنفيذ مشروع اكتشاف الكائنات الخاص بك (أو تجربة مشروع تصنيف الصور بدلاً من ذلك)، فقد ترغب في حذف مشروع اكتشاف Azure Storage من هذا المثال. يسمح الاشتراك المجاني بمشروعي Custom Vision.

على موقع ويب Custom Vision، انتقل إلى Projects وحدِّد سلة المهملات ضمن My New Project.

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

الخطوات التالية

قمت الآن بكل خطوة تخص عملية الكشف عن الكائن في التعليمات البرمجية. ينفذ هذا النموذج تكراراً مفرداً للتدريب، ولكن غالباً ما ستحتاج إلى التدريب على نموذجك واختباره عدة مرات لزيادة دقته. يتناول الدليل التالي تصنيف الصور، ولكن تتشابه مبادئه مع الكشف عن الكائنات.

يوفر هذا الدليل إرشادات ونماذج من التعليمات البرمجية لمساعدتك على البدء في استخدام مكتبة عميل Custom Vision لـ Node.js لإنشاء نموذج الكشف عن الكائنات. ستقوم بإنشاء مشروع وإضافة علامات وتدريب المشروع واستخدام عنوان URL لنقطة نهاية التنبؤ للمشروع لاختباره برمجيًا. استخدم هذا المثال كنموذج لإنشاء تطبيقك الخاص بالتعرف على الصور.

إشعار

إذا كنت ترغب في إنشاء نموذج اكتشاف الكائنات وتدريبه دون كتابة التعليمات البرمجية، يُرجى مراجعة الإرشادات المستندة إلى المتصفح بدلاً من ذلك.

قم باستخدام مكتبة عميل Custom Vision لـ.NET لـ:

  • إنشاء مشروع Custom Vision جديد
  • إضافة علامات للمشروع
  • تحميل الصور ووضع علامات عليها
  • التدريب على المشروع
  • نشر التكرار الحالي
  • اختبار نقطة نهاية التنبؤ

نماذج التوثيق المرجعي (تدريب)(تنبؤ) | التعليمة البرمجية لمصدر المكتبة (تدريب)(تنبؤ) | حزمة (npm)(تدريب)(تنبؤ) | نماذج

المتطلبات الأساسية

  • اشتراك Azure - إنشاء اشتراك مجانًا
  • الإصدار الحالي من Node.js
  • بمجرد أن يكون لديك اشتراك Azure، قم بإنشاء مورد Custom Vision في مدخل Microsoft Azure لإنشاء مورد تدريب وتنبؤ.
    • يمكنك استخدام مستوى التسعير الحر (F0) لتجربة الخدمة، والترقية لاحقًا إلى مستوى مدفوع للإنتاج.

إنشاء متغيرات البيئة

في هذا المثال، ستكتب بيانات الاعتماد الخاصة بك إلى متغيرات البيئة على الجهاز المحلي الذي يقوم بتشغيل التطبيق.

انتقل إلى مدخل Azure. إذا تم نشر موارد Custom Vision التي أنشأتها في قسم المتطلبات الأساسية بنجاح، فحدد الزر Go to Resource ضمن Next Steps. يمكنك العثور على المفاتيح ونقاط النهاية في صفحات مفتاح الموارد ونقطة النهاية، ضمن إدارة الموارد. ستحتاج إلى الحصول على مفاتيح لكل من موارد التدريب والتنبؤ، جنبا إلى جنب مع نقاط نهاية واجهة برمجة التطبيقات.

يمكنك العثور على معرف مورد التنبؤ في علامة تبويب خصائص مورد التنبؤ في مدخل Microsoft Azure، المدرجة كمعرف المورد.

تلميح

يمكنك أيضا استخدام https://www.customvision.ai/ للحصول على هذه القيم. بعد تسجيل الدخول، حدد أيقونة Settings في أعلى اليمين. في صفحات الإعداد ، يمكنك عرض جميع المفاتيح ومعرف المورد ونقاط النهاية.

تنبيه

لا تقم بتضمين المفتاح مباشرة في التعليمات البرمجية الخاصة بك، ولا تنشره بشكل عام. راجع مقالة أمان خدمات Azure الذكاء الاصطناعي لمزيد من خيارات المصادقة مثل Azure Key Vault.

لتعيين متغيرات البيئة، افتح نافذة وحدة التحكم واتبع الإرشادات الخاصة بنظام التشغيل وبيئة التطوير.

  1. لتعيين VISION_TRAINING KEY متغير البيئة، استبدل your-training-key بأحد مفاتيح مورد التدريب الخاص بك.
  2. لتعيين VISION_TRAINING_ENDPOINT متغير البيئة، استبدل your-training-endpoint بنقطة النهاية لمورد التدريب الخاص بك.
  3. لتعيين VISION_PREDICTION_KEY متغير البيئة، استبدل your-prediction-key بأحد مفاتيح مورد التنبؤ الخاص بك.
  4. لتعيين VISION_PREDICTION_ENDPOINT متغير البيئة، استبدل your-prediction-endpoint بنقطة النهاية لمورد التنبؤ الخاص بك.
  5. لتعيين VISION_PREDICTION_RESOURCE_ID متغير البيئة، استبدل 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

بعد إضافة متغيرات البيئة، قد تحتاج إلى إعادة تشغيل أي برامج قيد التشغيل ستقرأ متغيرات البيئة، بما في ذلك نافذة وحدة التحكم.

الإعداد

إنشاء تطبيق Node.js جديد

في إطار نافذة وحدة التحكم (مثل cmd أو PowerShell أو Bash)، يمكنك إنشاء دليل جديد لتطبيقك وانتقل إليه.

mkdir myapp && cd myapp

شغّل الأمر npm init لإنشاء تطبيق node باستخدام ملف package.json.

npm init

تثبيت مكتبة العميل

لكتابة تطبيق تحليل الصور باستخدامCustom Vision لـ Node.js، ستحتاج إلى حزم NPM الخاصة بـ Custom Vision. لتثبيتها، قم بتشغيل الأمر التالي في PowerShell:

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

تحديث ملف تطبيقك package.json باستخدام التبعيات.

أنشئ ملفاً جديداً باسم index.js ومن ثم استورد المكتبات التالية:

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

تلميح

هل تريد عرض ملف التعليمات البرمجية للبدء السريع بالكامل في الحال؟ يُمكن العثور على GitHub، والذي يحتوي على أمثلة التعليمات البرمجية في التشغيل السريع.

إنشاء متغيرات لنقطة نهاية ومفاتيح Azure للمورد الخاص بك.

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

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

علاوة على ذلك، أضف حقولاً لاسم مشروعك ومعلمة مهلة للمكالمات غير المتزامنة.

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

نموذج الكائن

الاسم ‏‏الوصف
TrainingAPIClient يُعالج هذا الفصل إنشاء نماذجك وتدريبها ونشرها.
PredictionAPIClient تُعالج هذه الفئة الاستعلام عن نماذجك لتنبؤات الكشف عن الكائنات.
التنبؤ تُحدد هذه الفئة تنبؤاً لكائن واحد على صورة واحدة. يتضمن خصائص معرف الكائن واسم ودرجة الثقة.

أمثلة على التعليمات البرمجية

توضح لك هذه المقتطفات البرمجية كيفية تنفيذ المهام التالية باستخدام مكتبة عميل Custom Vision لـ JavaScript:

مصادقة العميل

إنشاء مثيل لكائنات العميل مع نقطة النهاية والمفتاح. قم بإنشاء كائن ApiKeyCredentials باستخدام المفتاح، واستخدامه مع نقطة النهاية لإنشاء TrainingAPIClient وPredictionAPIClient.

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

إضافة دالة مساعدة

إضافة الدالة التالية للمساعدة في إجراء مكالمات غير متزامنة متعددة. سوف تستخدم هذا في وقت لاحق.

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

إنشاء مشروع Custom Vision جديد

بدء تشغيل دالة جديدة لاحتواء جميع استدعاءات دالة Custom Vision. إضافة التعليمات البرمجية التالية لإنشاء مشروع خدمة Custom Vision الجديد.

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

إضافة علامات للمشروع

لإضافة علامات تصنيف إلى مشروعك، أضف التعليمات البرمجية التالية إلى الدالة:

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

تحميل الصور ووضع علامات عليها

أولا، قم بتنزيل نموذج الصور لهذا المشروع. حفظ محتويات نموذج مجلد الصور على جهازك المحلي.

لإضافة نموذج الصور إلى المشروع، قم بإدراج التعليمات البرمجية التالية بعد إنشاء العلامة. ترفع التعليمات البرمجية هذه كل صورة بعلامتها المقابلة لها. عند وضع علامة على الصور في مشاريع الكشف عن الكائنات، تحتاج إلى تحديد منطقة كل كائن معلم باستخدام الإحداثيات التي تم تسويتها. لهذا البرنامج التعليمي، يتم تضمين المناطق مع التعليمات البرمجية. تحدد المناطق المربع المحيط في الإحداثيات العادية، ويتم إعطاء الإحداثيات بالترتيب التالي: اليسار، الأعلى، العرض، الارتفاع. يمكنك تحميل ما يصل إلى 64 صورة دفعة واحدة.

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

هام

ستحتاج إلى تغيير المسار إلى الصور (sampleDataRoot) استنادا إلى المكان الذي قمت بتنزيل Azure الذكاء الاصطناعي services Python SDK Samples repo.

إشعار

إذا لم يكن لديك أداة مساعدة للنقر والسحب لوضع علامة على إحداثيات المناطق، يُمكنك استخدام واجهة مستخدم الويب في Customvision.ai. في هذا المثال، يتم توفير الإحداثيات بالفعل.

التدريب على المشروع

تُنشئ التعليمة البرمجية التكرار الأول لنموذج التنبؤ.

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

نشر التكرار الحالي

ينشر هذا الرمز التكرار الذي تم التدريب عليه إلى نقطة نهاية التنبؤ. يُمكن استخدام الاسم المُطلق على التكرار المنشور لإرسال طلبات التنبؤ. لا يتوفر التكرار في نقطة نهاية التنبؤ حتى يتم نشره.

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

اختبار نقطة نهاية التنبؤ

لإرسال صورة إلى نقطة نهاية التنبؤ واسترداد التنبؤ، أضف التعليمات البرمجية التالية إلى الدالة.

const testFile = fs.readFileSync(`${sampleDataRoot}/test/test_image.jpg`);
const results = await predictor.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}`);
});

وبالتالي، أغلق دالة Custom Vision ثم استدعها.

})()

شغّل التطبيق

شغّل التطبيق باستخدام الأمر node المُتاح على ملف التشغيل السريع.

node index.js

يجب أن يظهر إخراج التطبيق في وحدة التحكم. يمكنك بعد ذلك التحقق من أن صورة الاختبار (الموجودة في < عينة DataRoot >/اختبار/) موسومة بشكل مناسب وأن منطقة الاكتشاف صحيحة. يمكنك أيضاً العودة إلى الموقع الإلكتروني لـ Custom Vision ورؤية الحالة الحالية لمشروعك الذي تم إنشاؤه حديثاً.

تنظيف الموارد

إذا كنت ترغب في تنفيذ مشروع اكتشاف الكائنات الخاص بك (أو تجربة مشروع تصنيف الصور بدلاً من ذلك)، فقد ترغب في حذف مشروع اكتشاف Azure Storage من هذا المثال. يسمح الاشتراك المجاني بمشروعي Custom Vision.

على موقع ويب Custom Vision، انتقل إلى Projects وحدِّد سلة المهملات ضمن My New Project.

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

الخطوات التالية

قمت الآن بكل خطوة تخص عملية الكشف عن الكائن في التعليمات البرمجية. ينفذ هذا النموذج تكراراً مفرداً للتدريب، ولكن غالباً ما ستحتاج إلى التدريب على نموذجك واختباره عدة مرات لزيادة دقته. يتناول الدليل التالي تصنيف الصور، ولكن تتشابه مبادئه مع الكشف عن الكائنات.

بدء استخدام مكتبة عميل Custom Vision لـ Python. اتبع هذه الخطوات لتثبيت الحزمة وتجربة مثال التعليمات البرمجية لإنشاء نموذج اكتشاف الكائنات. ستقوم بإنشاء مشروع وإضافة علامات وتدريب المشروع واستخدام عنوان URL لنقطة نهاية التنبؤ للمشروع لاختباره برمجيًا. استخدم هذا المثال كنموذج لإنشاء تطبيقك الخاص بالتعرف على الصور.

إشعار

إذا كنت ترغب في إنشاء نموذج اكتشاف الكائنات وتدريبه دون كتابة التعليمات البرمجية، يُرجى مراجعة الإرشادات المستندة إلى المتصفح بدلاً من ذلك.

استخدم مكتبة عميل Custom Vision لـ Python:

  • إنشاء مشروع Custom Vision جديد
  • إضافة علامات للمشروع
  • تحميل الصور ووضع علامات عليها
  • التدريب على المشروع
  • نشر التكرار الحالي
  • اختبار نقطة نهاية التنبؤ

نماذج التوثيق المرجعي | التعليمة البرمجية لمصدر المكتبة | حزمة (PyPi) | عينات

المتطلبات الأساسية

  • اشتراك Azure - إنشاء اشتراك مجانًا
  • Python 3.x
    • يجب أن يتضمن تثبيت Python خاصتك pip. يمكنك التحقق مما إذا كانت لديك نقطة مثبتة عن طريق تشغيل pip --version على سطر الأوامر. الحصول على نقطة عن طريق تثبيت أحدث إصدار من Python.
  • بمجرد أن يكون لديك اشتراك Azure، قم بإنشاء مورد Custom Vision في مدخل Microsoft Azure لإنشاء مورد تدريب وتنبؤ.
    • يمكنك استخدام مستوى التسعير الحر (F0) لتجربة الخدمة، والترقية لاحقًا إلى مستوى مدفوع للإنتاج.

إنشاء متغيرات البيئة

في هذا المثال، ستكتب بيانات الاعتماد الخاصة بك إلى متغيرات البيئة على الجهاز المحلي الذي يقوم بتشغيل التطبيق.

انتقل إلى مدخل Azure. إذا تم نشر موارد Custom Vision التي أنشأتها في قسم المتطلبات الأساسية بنجاح، فحدد الزر Go to Resource ضمن Next Steps. يمكنك العثور على المفاتيح ونقاط النهاية في صفحات مفتاح الموارد ونقطة النهاية، ضمن إدارة الموارد. ستحتاج إلى الحصول على مفاتيح لكل من موارد التدريب والتنبؤ، جنبا إلى جنب مع نقاط نهاية واجهة برمجة التطبيقات.

يمكنك العثور على معرف مورد التنبؤ في علامة تبويب خصائص مورد التنبؤ في مدخل Microsoft Azure، المدرجة كمعرف المورد.

تلميح

يمكنك أيضا استخدام https://www.customvision.ai/ للحصول على هذه القيم. بعد تسجيل الدخول، حدد أيقونة Settings في أعلى اليمين. في صفحات الإعداد ، يمكنك عرض جميع المفاتيح ومعرف المورد ونقاط النهاية.

تنبيه

لا تقم بتضمين المفتاح مباشرة في التعليمات البرمجية الخاصة بك، ولا تنشره بشكل عام. راجع مقالة أمان خدمات Azure الذكاء الاصطناعي لمزيد من خيارات المصادقة مثل Azure Key Vault.

لتعيين متغيرات البيئة، افتح نافذة وحدة التحكم واتبع الإرشادات الخاصة بنظام التشغيل وبيئة التطوير.

  1. لتعيين VISION_TRAINING KEY متغير البيئة، استبدل your-training-key بأحد مفاتيح مورد التدريب الخاص بك.
  2. لتعيين VISION_TRAINING_ENDPOINT متغير البيئة، استبدل your-training-endpoint بنقطة النهاية لمورد التدريب الخاص بك.
  3. لتعيين VISION_PREDICTION_KEY متغير البيئة، استبدل your-prediction-key بأحد مفاتيح مورد التنبؤ الخاص بك.
  4. لتعيين VISION_PREDICTION_ENDPOINT متغير البيئة، استبدل your-prediction-endpoint بنقطة النهاية لمورد التنبؤ الخاص بك.
  5. لتعيين VISION_PREDICTION_RESOURCE_ID متغير البيئة، استبدل 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

بعد إضافة متغيرات البيئة، قد تحتاج إلى إعادة تشغيل أي برامج قيد التشغيل ستقرأ متغيرات البيئة، بما في ذلك نافذة وحدة التحكم.

الإعداد

تثبيت مكتبة العميل

لكتابة تطبيق تحليل الصور باستخدامCustom Vision الخاصة بلغة Python، ستحتاج إلى مكتبة عميل Custom Vision. بعد تثبيت Python، قم بتشغيل الأمر التالي في PowerShell أو نافذة وحدة التحكم:

pip install azure-cognitiveservices-vision-customvision

إنشاء تطبيق Python جديد

قم بإنشاء ملف Python جديد واستيراد المكتبات التالية.

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

تلميح

هل تريد عرض ملف التعليمات البرمجية للبدء السريع بالكامل في الحال؟ يُمكن العثور على GitHub، والذي يحتوي على أمثلة التعليمات البرمجية في التشغيل السريع.

إنشاء متغيرات لنقطة نهاية ومفاتيح Azure للمورد الخاص بك.

# 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"]

نموذج الكائن

الاسم ‏‏الوصف
CustomVisionTrainingClient يُعالج هذا الفصل إنشاء نماذجك وتدريبها ونشرها.
CustomVisionPredictionClient تُعالج هذه الفئة الاستعلام عن نماذجك لتنبؤات الكشف عن الكائنات.
ImagePrediction تُحدد هذه الفئة تنبؤاً لكائن واحد على صورة واحدة. يتضمن خصائص معرف الكائن واسمه وموقع المربع المحيط للكائن ودرجة الثقة.

أمثلة على التعليمات البرمجية

توضح لك هذه المقتطفات البرمجية كيفية القيام بالمهام التالية مع مكتبة عميل Custom Vision لـ Python:

مصادقة العميل

قم بإنشاء عميل تدريب وتوقع باستخدام نقطة النهاية والمفاتيح لديك. أنشئ كائنات ApiKeyServiceClientCredentials باستخدام مفاتيحك، واستخدمها مع نقطة النهاية لإنشاء كائن CustomVisionTrainingClient وCustomVisionPredictionClient.

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

إنشاء مشروع Custom Vision جديد

إضافة التعليمات البرمجية التالية إلى البرنامج النصي لإنشاء مشروع خدمة رؤية مخصصة جديدة.

يُرجى الاطلاع على أسلوب "create_project" لتحديد الخيارات الأخرى عند إنشاء مشروعك (الموضح في دليل بوابة الويب إنشاء مصنف).

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)

إضافة علامات للمشروع

لإنشاء علامات الكائن في مشروعك، أضف الكود التالي:

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

تحميل الصور ووضع علامات عليها

أولا، قم بتنزيل نموذج الصور لهذا المشروع. حفظ محتويات نموذج مجلد الصور على جهازك المحلي.

عند وضع علامة على الصور في مشاريع الكشف عن الكائنات، تحتاج إلى تحديد منطقة كل كائن معلم باستخدام الإحداثيات التي تم تسويتها. يعمل الرمز التالي على توصيل كل صورة من نماذج الصور بالمنطقة ذات العلامات. تحدد المناطق المربع المحيط في الإحداثيات العادية، ويتم إعطاء الإحداثيات بالترتيب التالي: اليسار، الأعلى، العرض، الارتفاع.

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

إشعار

إذا لم يكن لديك أداة مساعدة للنقر والسحب لوضع علامة على إحداثيات المناطق، يُمكنك استخدام واجهة مستخدم الويب في Customvision.ai. في هذا المثال، يتم توفير الإحداثيات بالفعل.

بعد ذلك، استخدم خريطة الارتباطات لتحميل كل نموذج من نماذج الصور بإحداثيات المنطقة الخاصة بها (يمكنك تحميل ما يصل إلى 64 صورة دفعة واحدة). أضف التعليمات البرمجية التالية.

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)

إشعار

ستحتاج إلى تغيير المسار إلى الصور استنادا إلى المكان الذي قمت بتنزيل Azure الذكاء الاصطناعي services Python SDK Samples repo سابقا.

التدريب على المشروع

تُنشئ التعليمة البرمجية التكرار الأول لنموذج التنبؤ.

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)

تلميح

التدريب باستخدام علامات محددة

اختيارياً، يمكنك التدريب على مجموعة فرعية فقط من العلامات المطبقة. قد ترغب في القيام بذلك إذا لم تكن قد طبقت ما يكفي من العلامات المُحددة حتى الآن، ولكن لديك ما يكفي من العلامات الأخرى. في الاستدعاء "train_project"، حدد المعلمة الاختيارية "selected_tags" إلى قائمة سلاسل المعرفات الخاصة بالعلامات التي تريد استخدامها. سيدربك النموذج على التعرف فقط على العلامات المُدرجة في تلك القائمة.

نشر التكرار الحالي

لا يتوفر التكرار في نقطة نهاية التنبؤ حتى يتم نشره. تتيح التعليمات البرمجية التالية الاستعلام عن التكرار الحالي للنموذج.

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

اختبار نقطة نهاية التنبؤ

لإرسال صورة إلى نقطة نهاية التنبؤ واسترداد التنبؤ، أضف التعليمات البرمجية التالية إلى نهاية الملف:

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

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

شغّل التطبيق

شَغّل CustomVisionQuickstart.py.

python CustomVisionQuickstart.py

يجب أن يظهر إخراج التطبيق في وحدة التحكم. يمكنك بعد ذلك التحقق من أن صورة الاختبار (الموجودة في < قاعدة _ الصورة _ الموقع >/الصور/الاختبار ) موسومة بشكل مناسب وأن منطقة الاكتشاف صحيحة. يمكنك أيضاً العودة إلى الموقع الإلكتروني لـ Custom Vision ورؤية الحالة الحالية لمشروعك الذي تم إنشاؤه حديثاً.

تنظيف الموارد

إذا كنت ترغب في تنفيذ مشروع اكتشاف الكائنات الخاص بك (أو تجربة مشروع تصنيف الصور بدلاً من ذلك)، فقد ترغب في حذف مشروع اكتشاف Azure Storage من هذا المثال. يسمح الاشتراك المجاني بمشروعي Custom Vision.

على موقع ويب Custom Vision، انتقل إلى Projects وحدِّد سلة المهملات ضمن My New Project.

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

الخطوات التالية

قمت الآن بكل خطوة تخص عملية الكشف عن الكائن في التعليمات البرمجية. ينفذ هذا النموذج تكراراً مفرداً للتدريب، ولكن غالباً ما ستحتاج إلى التدريب على نموذجك واختباره عدة مرات لزيادة دقته. يتناول الدليل التالي تصنيف الصور، ولكن تتشابه مبادئه مع الكشف عن الكائنات.