مشاركة عبر


البرنامج التعليمي: تنفيذ تصنيف الصور على الحافة مع خدمة Custom Vision Service

ينطبق على:علامة اختيار IoT Edge 1.5 IoT Edge 1.5

هام

IoT Edge 1.5 LTS هو الإصدار المدعوم. IoT Edge 1.4 LTS هو نهاية العمر الافتراضي اعتبارا من 12 نوفمبر 2024. إذا كنت تستخدم إصدارا سابقا، فشاهد تحديث IoT Edge.

يجعل Azure IoT Edge حلول IoT أكثر كفاءة من خلال نقل أحمال العمل من السحابة إلى الحافة. هذه الإمكانية تصلح جيدا للخدمات التي تعالج كميات كبيرة من البيانات، مثل نماذج رؤية الكمبيوتر. تتيح لك Azure الذكاء الاصطناعي Custom Vision إنشاء مصنفات صور مخصصة ونشرها على الأجهزة كحاويات. معا، تتيح هاتان الخدمتان للمستخدمين العثور على رؤى من الصور أو تدفقات الفيديو دون نقل جميع البيانات خارج الموقع أولا. توفر الرؤية المخصصة مصنفا يقارن الصور بنموذج مدرب لإنشاء رؤى.

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

في هذا البرنامج التعليمي، تتعلم كيفية:

  • إنشاء مصنف صور باستخدام Custom Vision.
  • تطوير وحدة IoT Edge التي يستعلم عن خادم ويب Custom Vision على الجهاز.
  • إرسال نتائج مصنف الصور إلى IoT Hub.

المخطط - بنية البرنامج التعليمي، تنظيم المصنف ونشره

إذا لم يكن لديك حساب Azure، فأنشئ حساباً مجانياً قبل أن تبدأ.

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

تلميح

يُمثل هذا البرنامج التعليمي نسخة مبسطة من نموذج مشروع Custom Vision and Azure IoT Edge on a Raspberry Pi 3. يعمل على جهاز ظاهري سحابي ويستخدم صورا ثابتة لتدريب مصنف الصور واختباره، مما يساعد شخصا جديدا على Custom Vision على IoT Edge. يستخدم نموذج المشروع الأجهزة المادية ويجهز موجز كاميرا مباشر لتدريب مصنف الصور واختباره، وهو أمر مفيد لشخص يستكشف سيناريو أكثر تفصيلا وواقعيا.

إنشاء مصنف صور باستخدام Custom Vision

لإنشاء مصنف صور، قم بإنشاء مشروع Custom Vision وتوفير صور التدريب. لمزيد من المعلومات حول الخطوات التي يتعين عليك إجراؤها في هذا القسم، راجع How to build a classifier with Custom Vision.

بعد إنشاء مصنف الصور وتدريبه، قم بتصديره كحاوية Docker ونشره على جهاز IoT Edge.

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

  1. في متصفح الويب، انتقل إلى Custom Vision web page.

  2. حدد Sign in ثم قم بتسجيل الدخول باستخدام الحساب ذاته الذي تستخدمه للوصول إلى موارد Azure.

  3. حدد New project.

  4. إنشاء مشروعك باستخدام القيم التالية:

    الحقل القيمة
    الاسم توفير اسم لمشروعك، مثل EdgeTreeClassifier.
    ‏‏الوصف وصف اختياري للمشروع.
    مورد حدد إحدى مجموعات موارد Azure التي تتضمن مورد خدمة ustom Vision Service أو create new إذا لم تقم بإضافة مورد بعد.
    نوع الكائن تصنيف
    أنواع التصنيف متعدد الفئات (علامة واحدة لكل صورة)
    المجالات عام (ضغط)
    قدرات التصدير الأنظمة الأساسية (TensorFlow، CoreML، ONNX، ...)
  5. حدد إنشاء مشروع

تحميل الصور وتدريب المصنف

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

  1. استنساخ نماذج من صور أو تنزيلها من Cognitive-CustomVision-Windows الريبو على آلة التطوير المحلية.

    git clone https://github.com/Microsoft/Cognitive-CustomVision-Windows.git
    
  2. العودة إلى مشروع Custom Vision وحدد Add images.

  3. تصفح مستودع git الذي قمت باستنساخه محليًّا، وانتقل إلى مجلد الصورة الأولى، Cognitive-CustomVision-Windows / Samples / Images / Hemlock. حدد جميع الصور العشر في المجلد، ثم حدد فتح.

  4. أضف العلامة hemlock إلى هذه المجموعة من الصور، ثم اضغط على Enter لتطبيق العلامة.

  5. حدد Upload 10 files.

    تحميل الملفات التي تحمل علامة hemlock إلى Custom Vision

  6. عند تحميل الصور بنجاح، حدد Done.

  7. حدد Add images مرة أخرى.

  8. تصفح مجلد الصورة الثانية، Cognitive-CustomVision-Windows / Samples / Images / Japanese Cherry. حدد الصور الـ 10 كافة في المجلد ثم Open.

  9. إضافة العلامة japanese cherry إلى هذه المجموعة من الصور واضغط على enter لتطبيق العلامة.

  10. حدد Upload 10 files. عند تحميل الصور بنجاح، حدد Done.

  11. بعد وضع علامات وتحميل مجموعتي الصور، حدد تدريب لتدريب المصنف.

تصدير المصنف

  1. بعد تدريب المصنف، حدد Export على صفحة أداء المصنف.

    تصدير مصنف الصور الذي تم تدريبه

  2. حدد DockerFile للنظام الأساسي.

  3. حدد Linux للإصدار.

  4. حدد تصدير.

  5. بعد اكتمال التصدير، حدد تنزيل حزمة .zip وحفظها محليا على الكمبيوتر. استخراج كافة الملفات من الحزمة. استخدم هذه الملفات لإنشاء وحدة IoT Edge تحتوي على خادم تصنيف الصور.

عند الوصول إلى هذه النقطة، فإنك بذلك تنتهي من إنشاء مشروع Custom Vision وتدريبه. ستستخدم الملفات التي يتم تصديرها في القسم التالي، ولكن يمكنك الانتهاء من صفحة ويب Custom Vision.

إنشاء حل IoT Edge

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

إنشاء حل جديد

الحل عبارة عن طريقة منطقية لتطوير وحدات متعددة وتنظيمها لنشر IoT Edge واحد. يحتوي الحل على تعليمات برمجية لوحدات نمطية واحدة أو أكثر وبيان النشر الذي يعلن كيفية تكوينها على جهاز IoT Edge. إنشاء الحل باستخدام أداة تطوير سطر أوامر Azure IoT Edge Dev Tool (CLI). أبسط طريقة لاستخدام الأداة هي تشغيل حاوية تطوير IoT Edge مع Docker.

  1. إنشاء دليل باسم المصنف وتغييره إلى الدليل.

    mkdir CustomVisionSolution
    cd CustomVisionSolution
    
  2. قم بتشغيل الأمر iotedgedev tool init لإنشاء حل IoT Edge جديد. في حاوية IoT Edge Dev Docker، أدخل الأمر التالي:

    iotedgedev solution init --template python --module classifier
    

    يطالبك البرنامج النصي iotedgedev solution init بإكمال عدة خطوات بما في ذلك:

    • مصادقة Azure
    • اختيار اشتراك Azure
    • اختيار مجموعة موارد أو إنشائها
    • اختر أو أنشئ Azure IoT Hub
    • اختيار جهاز Azure IoT Edge أو إنشائه

    يقوم الأمر بإنشاء حل IoT Edge جديد مع وحدة نمطية تسمى المصنف في دليل العمل الحالي.

  3. افتح الحل في Visual Studio Code.

إضافة مصنف الصور

يحتوي قالب وحدة Python في Visual Studio Code على بعض نماذج التعليمات البرمجية التي يمكنك تشغيلها لاختبار IoT Edge. لن تستخدم التعليمات البرمجية في هذا السيناريو. بدلًا من ذلك، استخدم الخطوات الموجودة في هذا القسم لاستبدال نموذج التعليمات البرمجية مع حاوية مصنف الصور التي قمت بتصديرها مسبقًا.

  1. في مستكشف الملفات، تصفح للوصول إلى حزمة Custom Vision التي قمت بتنزيلها واستخراجها. قم بنسخ المحتويات كافة من الحزمة المستخرجة. ينبغي أن يظهر لك مجلدان، app و azuremlوملفان، Dockerfile و README.

  2. في مستكشف الملفات، تصفح للوصول إلى الدليل حيث طلبت من Visual Studio Code إنشاء حل IoT Edge.

  3. افتح مجلد الوحدة النمطية المصنف. إذا كنت تستخدم الأسماء المقترحة في القسم السابق، فستبدو بنية المجلد كما يلي CustomVisionSolution / modules / classifier.

  4. قم بلصق الملفات في المجلد classifier.

  5. ارجع إلى نافذة Visual Studio Code. يجب أن تعرض مساحة عمل الحل ملفات مصنف الصور في مجلد الوحدة النمطية.

  6. استبدل ملف Dockerfile.amd64 الأصلي ب Dockerfile من حزمة الرؤية المخصصة عن طريق حذف Dockerfile.amd64 الأصلي وإعادة تسمية Dockerfile إلى Dockerfile.amd64.

  7. احفظ تغييراتك.

إنشاء وحدة نمطية لمحاكاة الكاميرا

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

في هذا القسم، يمكنك إضافة وحدة نمطية جديدة إلى CustomVisionSolution نفسها وتوفير التعليمات البرمجية لإنشاء محاكاة الكاميرا.

  1. استخدم أداة iotedgedev إضافة وحدة نمطية جديدة إلى الحل. ينشئ الأمر مجلدا جديدا باسم cameracapture في مجلد الوحدات النمطية للحل الخاص بك.

    iotedgedev solution add --template python cameracapture
    
  2. افتح ملف main.py في مجلد الوحدات / النمطية cameracapture .

  3. استبدل الملف بأكمله بالتعليمات البرمجية التالية. يُرسل نموذج التعليمات البرمجية هذا طلبات POST إلى خدمة معالجة الصور قيد التشغيل في الوحدة النمطية للمصنف. نقدم وحدة الحاوية هذه مع نموذج من الصورة لاستخدامها في الطلبات. ومن ثم يتم حزم الاستجابة كرسالة IoT Hub وإرسالها إلى قائمة انتظار الإخراج.

    # Copyright (c) Microsoft. All rights reserved.
    # Licensed under the MIT license. See LICENSE file in the project root for
    # full license information.
    
    import time
    import sys
    import os
    import requests
    import json
    from azure.iot.device import IoTHubModuleClient, Message
    
    # global counters
    SENT_IMAGES = 0
    
    # global client
    CLIENT = None
    
    # Send a message to IoT Hub
    # Route output1 to $upstream in deployment.template.json
    def send_to_hub(strMessage):
        message = Message(bytearray(strMessage, 'utf8'))
        CLIENT.send_message_to_output(message, "output1")
        global SENT_IMAGES
        SENT_IMAGES += 1
        print( "Total images sent: {}".format(SENT_IMAGES) )
    
    # Send an image to the image classifying server
    # Return the JSON response from the server with the prediction result
    def sendFrameForProcessing(imagePath, imageProcessingEndpoint):
        headers = {'Content-Type': 'application/octet-stream'}
    
        with open(imagePath, mode="rb") as test_image:
            try:
                response = requests.post(imageProcessingEndpoint, headers = headers, data = test_image)
                print("Response from classification service: (" + str(response.status_code) + ") " + json.dumps(response.json()) + "\n")
            except Exception as e:
                print(e)
                print("No response from classification service")
                return None
    
        return json.dumps(response.json())
    
    def main(imagePath, imageProcessingEndpoint):
        try:
            print ( "Simulated camera module for Azure IoT Edge. Press Ctrl-C to exit." )
    
            try:
                global CLIENT
                CLIENT = IoTHubModuleClient.create_from_edge_environment()
            except Exception as iothub_error:
                print ( "Unexpected error {} from IoTHub".format(iothub_error) )
                return
    
            print ( "The sample is now sending images for processing and will indefinitely.")
    
            while True:
                classification = sendFrameForProcessing(imagePath, imageProcessingEndpoint)
                if classification:
                    send_to_hub(classification)
                time.sleep(10)
    
        except KeyboardInterrupt:
            print ( "IoT Edge module sample stopped" )
    
    if __name__ == '__main__':
        try:
            # Retrieve the image location and image classifying server endpoint from container environment
            IMAGE_PATH = os.getenv('IMAGE_PATH', "")
            IMAGE_PROCESSING_ENDPOINT = os.getenv('IMAGE_PROCESSING_ENDPOINT', "")
        except ValueError as error:
            print ( error )
            sys.exit(1)
    
        if ((IMAGE_PATH and IMAGE_PROCESSING_ENDPOINT) != ""):
            main(IMAGE_PATH, IMAGE_PROCESSING_ENDPOINT)
        else: 
            print ( "Error: Image path or image-processing endpoint missing" )
    
  4. احفظ الملف main.py.

  5. افتح ملف requirements.txt.

  6. إضافة سطر جديد لمكتبة لتضمينها في الحاوية.

    requests
    
  7. احفظ الملف requirements.txt.

إضافة صورة اختبار إلى الحاوية

بدلًا من استخدام كاميرا حقيقية لتوفير موجز بالصور لهذا السيناريو، سنستخدم صورة اختبار واحدة. يتم تضمين صورة اختبار في GitHub repo التي قمت بتنزيلها لصور التدريب سابقًا في البرنامج التعليمي هذا.

  1. انتقل إلى صورة الاختبار، الموجودة في Cognitive-CustomVision-Windows / Samples / Images / Test.

  2. قم بنسخ test_image.jpg

  3. استعرض للوصول إلى دليل حل IoT Edge والصق صورة الاختبار في مجلد الوحدات / النمطية cameracapture . يجب أن تكون الصورة في المجلد ذاته مثل ملف main.py الذي قمت بتحريره في القسم السابق.

  4. في Visual Studio Code، افتح ملف Dockerfile.amd64 لوحدة التقاط الكاميرا.

  5. بعد السطر الذي يؤسس دليل العمل WORKDIR /app، قم بإضافة السطر التالي من التعليمات البرمجية:

    ADD ./test_image.jpg .
    
  6. احفظ ملف Dockerfile.

قم بإعداد بيان النشر

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

يوفر ملحق IoT Edge لـ Visual Studio Code قالبًا في كل حل من حلول IoT Edge لمساعدتك في إنشاء بيان نشر.

  1. افتح الملف deployment.template.json في مجلد الحل.

  2. تعيين بيانات اعتماد السجل للوحدات النمطية في بيان التوزيع.

    "registryCredentials": {
        "<registryName>": {
            "username": "<AcrUsername>",
            "password": "<AcrPassword>",
            "address": "<registryName>.azurecr.io"
        }
    }
    

    استبدل <registryName> باسم سجل حاوية Azure، واستبدل <AcrUsername>وAdcrPassword<> باسم المستخدم وكلمة المرور للسجل الخاص بك. يمكنك العثور على هذه القيم في قسم مفاتيح الوصول في سجل حاوية Azure في مدخل Microsoft Azure.

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

  4. احذف الوحدة النمطية tempSensor مع جميع معلماتها. توفر هذه الوحدة بيانات نموذجية لسيناريوهات الاختبار، ولكنها ليست مطلوبة في هذا النشر.

  5. إذا قمت بتسمية وحدة تصنيف الصور شيئًا آخر غير classifier، فتحقق من الاسم الآن وتأكد من أنه يتكون من أحرف صغيرة. تستدعي الوحدة النمطية cameracapture وحدة المصنف باستخدام مكتبة طلبات تنسق جميع الطلبات بأحرف صغيرة، وIoT Edge حساس لحالة الأحرف.

  6. لكل وحدة نمطية للنظام edgeAgentوedgeHub، قم بتغيير قيمة createOptions إلى إصدار سلسلة. على سبيل المثال:

    "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
    
  7. لكل وحدة نمطية للنظام edgeAgentوedgeHub، قم بتغيير إصدار الصورة إلى أحدث إصدار 1.5. على سبيل المثال:

    "image": "mcr.microsoft.com/azureiotedge-agent:1.5",
    "image": "mcr.microsoft.com/azureiotedge-hub:1.5",
    
  8. تحديث معلمة createOptions لوحدة المصنف إلى إصدار سلسلة. على سبيل المثال:

    "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
    
  9. قم بتحديث معلمة createOptions لوحدة التقاط الكاميرا باستخدام JSON التالي. تؤدي هذه المعلومات إلى إنشاء متغيرات البيئة في حاوية الوحدة النمطية التي يتم استردادها في عملية main.py. يتيح لك تضمين هذه المعلومات في بيان النشر تغيير الصورة أو نقطة النهاية دون إعادة إنشاء صورة الوحدة النمطية.

    "createOptions": "{\"Env\":[\"IMAGE_PATH=test_image.jpg\",\"IMAGE_PROCESSING_ENDPOINT=http://classifier/image\"]}"
    

    إذا قمت بتسمية الوحدة النمطية لـ Custom Vision باسم آخر غير classifier، فقم بتحديث قيمة نقطة النهاية لمعالجة الصور لمطابقتها.

    على سبيل المثال، يجب أن يكون تكوين المصنفوالكاميرا مشابها لما يلي:

    "modules": {
        "classifier": {
            "version": "1.0",
            "type": "docker",
            "status": "running",
            "restartPolicy": "always",
            "settings": {
                "image": "${MODULES.classifier}",
                "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
            }
        },
        "cameracapture": {
            "version": "1.0",
            "type": "docker",
            "status": "running",
            "restartPolicy": "always",
            "settings": {
                "image": "${MODULES.cameracapture}",
                "createOptions": "{\"Env\":[\"IMAGE_PATH=test_image.jpg\",\"IMAGE_PROCESSING_ENDPOINT=http://classifier/image\"]}"
            }
        }
    }
    
  10. احفظ ملف deployment.template.js.

بناء ودفع حل IoT Edge الخاص بك

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

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

أولا، بناء ودفع الحل إلى سجل الحاوية.

  1. افتح المحطة الطرفية المتكاملة Visual Studio Code عن طريق تحديد عرض>المحطة الطرفية.

  2. سجل الدخول إلى Docker عن طريق إدخال الأمر التالي في المحطة الطرفية باستخدام اسم المستخدم وكلمة المرور وخادم تسجيل الدخول من سجل حاوية Azure. يمكنك استرداد هذه القيم من قسم Access keys في السجل الخاص بك في منصة Azure.

    docker login -u <AcrUsername> -p <AcrPassword> <AcrLoginServer>
    

    قد تتلقى تحذير أمان يوصي باستخدام --password-stdin. على الرغم من أن أفضل الممارسات موصى بها لسيناريوهات الإنتاج، إلا أنها خارج نطاق هذا البرنامج التعليمي. لمزيد من المعلومات، راجع مرجع تسجيل دخول docker.

  3. استخدم Dockerfile الخاص بالوحدة لإنشاء صورة Docker للوحدة النمطية ووضع علامة عليها.

    docker build --rm -f "<DockerFilePath>" -t <ImageNameAndTag> "<ContextPath>" 
    

    على سبيل المثال، لإنشاء صورة للسجل المحلي أو سجل حاوية Azure، استخدم الأوامر التالية:

    
    # Build and tag the image for an Azure Container Registry. Replace <AcrRegistryName> with your own registry name.
    
    docker build --rm -f "./modules/classifier/Dockerfile.amd64" -t <AcrRegistryName>.azurecr.io/classifier:0.0.1-amd64 "./modules/classifier"
    docker build --rm -f "./modules/cameracapture/Dockerfile.amd64" -t <AcrRegistryName>.azurecr.io/cameracapture:0.0.1-amd64 "./modules/cameracapture"
    

صورة Docker لوحدة الدفع

قم بتوفير بيانات اعتماد سجل الحاوية إلى Docker بحيث يمكنه دفع صورة الحاوية إلى التخزين في السجل.

  1. سجل الدخول إلى Docker باستخدام بيانات اعتماد Azure Container Registry (ACR).

    docker login -u <AcrUsername> -p <AcrPassword> <AcrLoginServer>
    

    قد تتلقى تحذير أمان يوصي باستخدام --password-stdin. في حين أن هذه أفضل ممارسة موصى بها لسيناريوهات الإنتاج، فإنها خارج نطاق هذا البرنامج التعليمي. لمزيد من المعلومات، راجع مرجع تسجيل دخول docker.

  2. سجّل الدخول إلى Azure Container Registry. تحتاج إلى تثبيت Azure CLI لاستخدام az الأمر . يطلب هذا الأمر العثور على اسم المستخدم وكلمة المرور في سجل الحاوية في Settings>Access keys.

    az acr login -n <AcrRegistryName>
    

    تلميح

    إذا قمت بتسجيل الخروج في أي وقت في هذا البرنامج التعليمي، كرر خطوات تسجيل الدخول Docker وAzure Container Registry للمتابعة.

  3. ادفع صورة الوحدة النمطية إلى السجل المحلي أو سجل الحاوية.

    docker push <ImageName>
    

    على سبيل المثال:

    # Push the Docker image to an Azure Container Registry. Replace <AcrRegistryName> with your Azure Container Registry name.
    
    az acr login --name <AcrRegistryName>
    docker push <AcrRegistryName>.azurecr.io/classifier:0.0.1-amd64
    docker push <AcrRegistryName>.azurecr.io/cameracapture:0.0.1-amd64
    

تحديث قالب التوزيع

تحديث ملف deployment.template.json مع موقع صورة سجل الحاوية. قم بتغيير قيمة الصورة إلى الصورة التي دفعتها إلى السجل. على سبيل المثال، استبدل <AcrRegistryName> باسم السجل الخاص بك في قيم الصور للوحدات النمطية للمصنف والكاميرا:

"classifier": {
    "version": "1.0",
    "type": "docker",
    "status": "running",
    "restartPolicy": "always",
    "settings": {
        "image": "<AcrRegistryName>.azurecr.io/classifier:0.0.1-amd64",
        "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
    },
    "cameracapture": {
        "version": "1.0",
        "type": "docker",
        "status": "running",
        "restartPolicy": "always",
        "settings": {
            "image": "<AcrRegistryName>.azurecr.io/cameracapture:0.0.1-amd64",
            "createOptions": "{\"Env\":[\"IMAGE_PATH=test_image.jpg\",\"IMAGE_PROCESSING_ENDPOINT=http://classifier/image\"]}"
        }
    }
}

يبدو بيان التوزيع النهائي مشابها لما يلي:

{
  "$schema-template": "4.0.0",
  "modulesContent": {
    "$edgeAgent": {
      "properties.desired": {
        "schemaVersion": "1.1",
        "runtime": {
          "type": "docker",
          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {
              "<AcrRegistryName>": {
                "username": "<AcrUserName>",
                "password": "<AcrPassword>",
                "address": "<AcrRegistryName>.azurecr.io"
              }
            }
          }
        },
        "systemModules": {
          "edgeAgent": {
            "type": "docker",
            "settings": {
              "image": "mcr.microsoft.com/azureiotedge-agent:1.5",
              "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
            }
          },
          "edgeHub": {
            "type": "docker",
            "status": "running",
            "restartPolicy": "always",
            "settings": {
              "image": "mcr.microsoft.com/azureiotedge-hub:1.5",
              "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
            }
          }
        },
        "modules": {
          "classifier": {
            "version": "1.0",
            "type": "docker",
            "status": "running",
            "restartPolicy": "always",
            "settings": {
              "image": "<AcrRegistryName>.azurecr.io/classifier:0.0.1-amd64",
              "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
            }
          },
          "cameracapture": {
            "version": "1.0",
            "type": "docker",
            "status": "running",
            "restartPolicy": "always",
            "settings": {
              "image": "<AcrRegistryName>.azurecr.io/cameracapture:0.0.1-amd64",
              "createOptions": "{\"Env\":[\"IMAGE_PATH=test_image.jpg\",\"IMAGE_PROCESSING_ENDPOINT=http://classifier/image\"]}"
            }
          }
        }
      }
    },
    "$edgeHub": {
      "properties.desired": {
        "schemaVersion": "1.2",
        "routes": {
          "sensorToclassifier": "FROM /messages/modules/tempSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/classifier/inputs/input1\")",
          "classifierToIoTHub": "FROM /messages/modules/classifier/outputs/* INTO $upstream",
          "cameracaptureToIoTHub": "FROM /messages/modules/cameracapture/outputs/* INTO $upstream"
        },
        "storeAndForwardConfiguration": {
          "timeToLiveSecs": 7200
        }
      }
    }
  }
}

نشر الوحدات النمطية على الجهاز

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

استخدم الأمر IoT Edge Azure CLI set-modules لنشر الوحدات النمطية إلى Azure IoT Hub. على سبيل المثال، لنشر الوحدات النمطية المعرفة في ملف deployment.template.json إلى IoT Hub <IotHubName> لجهاز <IoT Edge DeviceName>، استخدم الأمر التالي. استبدل قيم اسم المركز ومعرف الجهاز وتسجيل الدخول سلسلة الاتصال IoT Hub بخاصيتك.

az iot edge set-modules --hub-name <IotHubName> --device-id <DeviceName> --content ./deployment.template.json --login "HostName=my-iot-hub.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=<SharedAccessKey>"

تلميح

يمكنك العثور على سلسلة الاتصال IoT Hub بما في ذلك مفتاح الوصول المشترك في مدخل Microsoft Azure. انتقل إلى إعدادات>المشترك iothubowner.

تأكد من تشغيل جهاز IoT Edge.

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

كما يمكنك أيضًا التحقق من أن جميع الوحدات النمطية تعمل على جهازك نفسه. على جهاز IoT Edge، قم بتشغيل الأمر التالي لمشاهدة حالة الوحدات النمطية.

iotedge list

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

عرض نتائج تحليلات التصنيف

على جهازك، اعرض سجلات وحدة التقاط الكاميرا لمشاهدة الرسائل المرسلة والتأكد من تلقيها من قبل IoT Hub.

iotedge logs cameracapture

على سبيل المثال، يجب أن تشاهد الإخراج كما يلي:

admin@vm:~$ iotedge logs cameracapture
Simulated camera module for Azure IoT Edge. Press Ctrl-C to exit.
The sample is now sending images for processing and will indefinitely.
Response from classification service: (200) {"created": "2023-07-13T17:38:42.940878", "id": "", "iteration": "", "predictions": [{"boundingBox": null, "probability": 1.0, "tagId": "", "tagName": "hemlock"}], "project": ""}

Total images sent: 1
Response from classification service: (200) {"created": "2023-07-13T17:38:53.444884", "id": "", "iteration": "", "predictions": [{"boundingBox": null, "probability": 1.0, "tagId": "", "tagName": "hemlock"}], "project": ""}

إشعار

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

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

تتضمن النتائج من الوحدة النمطية Custom Vision، المرسلة كرسائل من وحدة التقاط الكاميرا، احتمال أن تكون الصورة هي شجرة hemlock أو cherry. لأن الصورة هي hemlock، ترى الاحتمال على أنه 1.0.

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

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

وإلا، احذف التكوينات المحلية وموارد Azure التي استخدمتها في هذه المقالة لتجنب الرسوم.

قم بحذف موارد Azure.

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

لحذف الموارد:

  1. سجل الدخول إلى مدخل Azure، وحدد "Resource groups".
  2. حدد اسم مجموعة الموارد التي تحتوي على موارد اختبار IoT Edge.
  3. راجع قائمة الموارد التي تحتويها مجموعة الموارد الخاصة بك. إذا كنت تريد حذفها جميعاً، يمكنك تحديد Delete resource group. إذا كنت تريد حذف بعضها فقط، يمكنك تحديد كل مورد لحذفها بشكل فردي.

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

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

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