Düzenle

Aracılığıyla paylaş


Azure IoT Edge cihazında makine öğrenmesi çıkarımını etkinleştirme

Azure IoT Edge
Azure IoT Hub

Uçta yapay zeka, en popüler uç senaryolarından biridir. Bu senaryonun uygulamaları görüntü sınıflandırma, nesne algılama, gövde, yüz ve hareket analizi ile görüntü işlemeyi içerir. Bu mimari kılavuzunda, bu senaryoları desteklemek için Azure IoT Edge'in nasıl kullanılacağı açıklanmaktadır.

Yapay zeka modelini güncelleştirerek yapay zeka doğruluğunu geliştirebilirsiniz, ancak bazı senaryolarda uç cihaz ağ ortamı iyi değildir. Örneğin, rüzgar enerjisi ve petrol endüstrilerinde ekipman çölde veya okyanusta bulunabilir.

IoT Edge modül ikizleri, dinamik olarak yüklenen yapay zeka modelini uygulamak için kullanılır. IoT Edge modülleri Docker'a dayanır. Yapay zeka ortamında ioT Edge modülü için bir görüntünün boyutu genellikle en az 1 GB olduğundan, dar bant genişliğine sahip bir ağda yapay zeka modelini artımlı olarak güncelleştirmek önemlidir. Bu makalenin ana odak noktası bu konudur. Fikir, TensorFlow Lite veya Açık Sinir Ağı Değişimi (ONNX) nesne algılama modellerini yükleyebilen bir IoT Edge AI modülü oluşturmaktır. Modülü web API'si olarak etkinleştirerek diğer uygulamalara veya modüllere fayda sağlamak için de kullanabilirsiniz.

Bu makalede açıklanan çözüm şu yollarla size yardımcı olabilir:

  • Uç cihazlarda yapay zeka çıkarımını etkinleştirin.
  • Uçta yapay zeka modellerini dağıtma ve güncelleştirme ağ maliyetini en aza indirin. Çözüm, özellikle dar bant genişliğine sahip bir ağ ortamında sizin veya müşterilerinizin tasarrufunu sağlayabilir.
  • IoT edge cihazının yerel depolama alanında yapay zeka modeli deposu oluşturma ve yönetme.
  • Uç cihaz yapay zeka modellerini değiştirirken neredeyse sıfır kapalı kalma süresi elde edin.

TensorFlow , Google Inc.'in ticari markasıdır. Bu işaretin kullanılmasıyla ilgili herhangi bir onay yoktur.

Mimari

Makine öğrenmesi çıkarımlarını destekleyen bir mimariyi gösteren diyagram.

Bu mimarinin bir Visio dosyasını indirin.

Veri akışı

  1. Yapay zeka modeli Azure Blob Depolama veya bir web hizmetine yüklenir. Model, önceden eğitilmiş bir TensorFlow Lite veya ONNX modeli ya da Azure Machine Learning'de oluşturulmuş bir model olabilir. IoT Edge modülü bu modele erişebilir ve daha sonra uç cihaza indirebilir. Daha iyi bir güvenliğe ihtiyacınız varsa Blob Depolama ile uç cihaz arasında özel uç nokta bağlantıları kullanmayı göz önünde bulundurun.
  2. Azure IoT Hub, cihaz modülü ikizlerini yapay zeka modeli bilgileriyle otomatik olarak eşitler. Eşitleme, IoT Edge çevrimdışı olsa bile gerçekleşir. (Bazı durumlarda IoT cihazları, güç tasarrufu sağlamak veya ağ trafiğini azaltmak için zamanlanmış saatlik, günlük veya haftalık zamanlarda ağlara bağlanır.)
  3. Yükleyici modülü, API aracılığıyla modül ikizlerinin güncelleştirmelerini izler. Bir güncelleştirme algıladığında makine öğrenmesi modeli SAS belirtecini alır ve ardından yapay zeka modelini indirir.
    • Daha fazla bilgi için bkz . Kapsayıcı veya blob için SAS belirteci oluşturma.
    • Kaynakların sona erme tarihini ayarlamak için ExpiresOn özelliğini kullanabilirsiniz. Cihazınız uzun süre çevrimdışı olacaksa, süre sonunu uzatabilirsiniz.
  4. Yükleyici modülü, yapay zeka modelini IoT Edge modülünün paylaşılan yerel depolama alanına kaydeder. IoT Edge dağıtım JSON dosyasında paylaşılan yerel depolamayı yapılandırmanız gerekir.
  5. Yükleyici modülü, TensorFlow Lite veya ONNX API aracılığıyla yerel depolamadan yapay zeka modelini yükler.
  6. Yükleyici modülü, POST isteği aracılığıyla ikili fotoğrafı alan ve sonuçları bir JSON dosyasında döndüren bir web API'si başlatır.

Yapay zeka modelini güncelleştirmek için yeni sürümü Blob Depolama'ya yükleyebilir ve artımlı güncelleştirme için cihaz modülü ikizlerini yeniden eşitleyebilirsiniz. IoT Edge modül görüntüsünün tamamını güncelleştirmeye gerek yoktur.

Senaryo ayrıntıları

Bu çözümde, yapay zeka modelini indirmek ve ardından makine öğrenmesi çıkarımını etkinleştirmek için ioT Edge modülü kullanılır. Bu çözümde önceden eğitilmiş TensorFlow Lite veya ONNX modellerini kullanabilirsiniz.

Sonraki iki bölümde, makine öğrenmesi çıkarım modülleri, TensorFlow Lite ve ONNX ile ilgili bazı kavramlar açıklanmıştır.

TensorFlow Lite

  • *.tflite dosyası önceden eğitilmiş bir yapay zeka modelidir. TensorFlow.org'dan indirebilirsiniz. iOS ve Android gibi platformlar arası uygulamalarda kullanabileceğiniz genel bir yapay zeka modelidir. Meta veriler ve ilişkili alanlar (örneğin, labels.txt) hakkında daha fazla bilgi için bkz . Modellerden meta verileri okuma.

  • Nesne algılama modeli, birden çok nesne sınıfının varlığını ve konumunu algılamak için eğitilir. Örneğin, bir model çeşitli meyve parçaları içeren görüntülerle ve temsil ettikleri meyve sınıfını (örneğin, elma) belirten bir etiketle ve her nesnenin görüntüde nerede görüneceğini belirten verilerle eğitilebilir.

    Modele bir görüntü sağlandığında algılandığı nesnelerin listesini, her nesne için sınırlayıcı kutunun konumunu ve algılamanın güvenilirliğini gösteren bir puan verir.

  • Yapay zeka modeli oluşturmak veya özel ayar yapmak istiyorsanız bkz . TensorFlow Lite Model Oluşturucu.

  • Algılama Hayvanat Bahçesi'nde çeşitli gecikme süresi ve duyarlık özelliklerine sahip daha ücretsiz önceden eğitilmiş algılama modelleri alabilirsiniz. Her model aşağıdaki kod örneklerinde gösterilen giriş ve çıkış imzalarını kullanır.

ONNX

ONNX, makine öğrenmesi modellerini temsil eden açık standart bir biçimdir. Bunu birçok çerçevede ve araçta uygulayan bir iş ortakları topluluğu tarafından desteklenir.

  • ONNX, model oluşturmaya ve dağıtmaya ve diğer görevleri gerçekleştirmeye yönelik araçları destekler. Daha fazla bilgi için bkz . Desteklenen ONNX araçları.
  • ONNX Çalışma Zamanı'nı kullanarak ONNX önceden eğitilmiş modelleri çalıştırabilirsiniz. Önceden eğitilmiş modeller hakkında bilgi için bkz . ONNX Model Hayvanat Bahçesi.
  • Bu senaryo için bir nesne algılama ve görüntü segmentasyonu modeli kullanabilirsiniz: Tiny YOLOv3.

ONNX topluluğu , derin öğrenme modelinizi oluşturmanıza ve dağıtmanıza yardımcı olacak araçlar sağlar.

Eğitilmiş yapay zeka modellerini indirme

Eğitilmiş yapay zeka modellerini indirmek için yeni bir model hazır olduğunda bildirim almak için cihaz ikizlerini kullanmanızı öneririz. Cihaz çevrimdışı olsa bile, uç cihaz yeniden çevrimiçi olana kadar ileti IoT Hub'da önbelleğe alınabilir. İleti otomatik olarak eşitlenir.

Aşağıda, cihaz ikizleri için bildirimleri kaydeden ve ardından bir ZIP dosyasına yapay zeka modelini indiren bir Python kodu örneği verilmiştir. Ayrıca indirilen dosyada daha fazla işlem gerçekleştirir.

Kod şu görevleri gerçekleştirir:

  1. Cihaz ikizleri bildirimini alın. Bildirim dosya adını, dosya indirme adresini ve MD5 kimlik doğrulama belirtecini içerir. (Dosya adına 1.0 gibi sürüm bilgileri ekleyebilirsiniz.)
  2. Yerel depolama alanına ZIP dosyası olarak yapay zeka modelini indirin.
  3. İsteğe bağlı olarak, MD5 sağlama toplamı gerçekleştirin. MD5 doğrulaması, ağ iletimi sırasında üzerinde oynanan ZIP dosyalarının önlenmesine yardımcı olur.
  4. ZIP dosyasının sıkıştırmasını açın ve yerel olarak kaydedin.
  5. Yeni yapay zeka modelinin hazır olduğunu bildirmek için IoT Hub'a bir bildirim veya yönlendirme iletisi gönderin.
# define behavior for receiving a twin patch
async def twin_patch_handler(patch):
    try:
        print( "######## The data in the desired properties patch was: %s" % patch)
        if "FileName" in patch:
            FileName = patch["FileName"]
        if "DownloadUrl" in patch:
            DownloadUrl = patch["DownloadUrl"]
        if "ContentMD5" in patch:
            ContentMD5 = patch["ContentMD5"]
        FilePath = "/iotedge/storage/" + FileName

        # download AI model
        r = requests.get(DownloadUrl)
        print ("######## download AI Model Succeeded.")
        ffw = open(FilePath, 'wb')
        ffw.write(r.content)
        ffw.close()
        print ("######## AI Model File: " + FilePath)

        # MD5 checksum
        md5str = content_encoding(FilePath)
        if md5str == ContentMD5:
            print ( "######## New AI Model MD5 checksum succeeded")
            # decompressing the ZIP file
            unZipSrc = FilePath
            targeDir = "/iotedge/storage/"
            filenamenoext = get_filename_and_ext(unZipSrc)[0]
            targeDir = targeDir + filenamenoext
            unzip_file(unZipSrc,targeDir)

            # ONNX
            local_model_path = targeDir + "/tiny-yolov3-11.onnx"
            local_labelmap_path = targeDir + "/coco_classes.txt"

            # TensorFlow flite
            # local_model_path = targeDir + "/ssd_mobilenet_v1_1_metadata_1.tflite"
            # local_labelmap_path = targeDir + "/labelmap.txt"

            # message to module
            if client is not None:
                print ( "######## Send AI Model Info AS Routing Message")
                data = "{\"local_model_path\": \"%s\",\"local_labelmap_path\": \"%s\"}" % (filenamenoext+"/tiny-yolov3-11.onnx", filenamenoext+"/coco_classes.txt")
                await client.send_message_to_output(data, "DLModelOutput")
                # update the reported properties
                reported_properties = {"LatestAIModelFileName": FileName }
                print("######## Setting reported LatestAIModelName to {}".format(reported_properties["LatestAIModelFileName"]))
                await client.patch_twin_reported_properties(reported_properties)
        else:
            print ( "######## New AI Model MD5 checksum failed")

    except Exception as ex:
        print ( "Unexpected error in twin_patch_handler: %s" % ex )

Çıkarım

Yapay zeka modeli indirildikten sonra, sonraki adım modeli uç cihazda kullanmaktır. Modeli dinamik olarak yükleyebilir ve uç cihazlarda nesne algılama gerçekleştirebilirsiniz. Aşağıdaki kod örneği, uç cihazlardaki nesneleri algılamak için TensorFlow Lite AI modelinin nasıl kullanılacağını gösterir.

Kod şu görevleri gerçekleştirir:

  1. TensorFlow Lite AI modelini dinamik olarak yükleyin.
  2. Görüntü standardizasyonu gerçekleştirin.
  3. Nesneleri algılama.
  4. İşlem algılama puanları.
class InferenceProcedure():

    def detect_object(self, imgBytes):

        results = []
        try:
            model_full_path = AI_Model_Path.Get_Model_Path()
            if(model_full_path == ""):
                raise Exception ("PLEASE SET AI MODEL FIRST")
            if '.tflite' in model_full_path:
                interpreter = tf.lite.Interpreter(model_path=model_full_path)
                interpreter.allocate_tensors()
                input_details = interpreter.get_input_details()
                output_details = interpreter.get_output_details()
                input_shape = input_details[0]['shape']

                # bytes to numpy.ndarray
                im_arr = np.frombuffer(imgBytes, dtype=np.uint8)
                img = cv2.imdecode(im_arr, flags=cv2.IMREAD_COLOR)
                im_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
                im_rgb = cv2.resize(im_rgb, (input_shape[1], input_shape[2]))
                input_data = np.expand_dims(im_rgb, axis=0)

                interpreter.set_tensor(input_details[0]['index'], input_data)
                interpreter.invoke()
                output_data = interpreter.get_tensor(output_details[0]['index'])
                detection_boxes = interpreter.get_tensor(output_details[0]['index'])
                detection_classes = interpreter.get_tensor(output_details[1]['index'])
                detection_scores = interpreter.get_tensor(output_details[2]['index'])
                num_boxes = interpreter.get_tensor(output_details[3]['index'])

                label_names = [line.rstrip('\n') for line in open(AI_Model_Path.Get_Labelmap_Path())]
                label_names = np.array(label_names)
                new_label_names = list(filter(lambda x : x != '???', label_names))

                for i in range(int(num_boxes[0])):
                    if detection_scores[0, i] > .5:
                        class_id = int(detection_classes[0, i])
                        class_name = new_label_names[class_id]
                        # top, left, bottom, right
                        results_json = "{'Class': '%s','Score': '%s','Location': '%s'}" % (class_name, detection_scores[0, i],detection_boxes[0, i])
                        results.append(results_json)
                        print(results_json)
        except Exception as e:
            print ( "detect_object unexpected error %s " % e )
            raise

        # return results
        return json.dumps(results)

Yukarıdaki kodun ONNX sürümü aşağıdadır. Adımlar çoğunlukla aynıdır. Tek fark algılama puanının nasıl işlenme şeklidir, çünkü Labelmap ve model çıkış parametreleri farklıdır.

class InferenceProcedure():

    def letterbox_image(self, image, size):
        '''resize image with unchanged aspect ratio using padding'''
        iw, ih = image.size
        w, h = size
        scale = min(w/iw, h/ih)
        nw = int(iw*scale)
        nh = int(ih*scale)

        image = image.resize((nw,nh), Image.BICUBIC)
        new_image = Image.new('RGB', size, (128,128,128))
        new_image.paste(image, ((w-nw)//2, (h-nh)//2))
        return new_image

    def preprocess(self, img):
        model_image_size = (416, 416)
        boxed_image = self.letterbox_image(img, tuple(reversed(model_image_size)))
        image_data = np.array(boxed_image, dtype='float32')
        image_data /= 255.
        image_data = np.transpose(image_data, [2, 0, 1])
        image_data = np.expand_dims(image_data, 0)
        return image_data

    def detect_object(self, imgBytes):
        results = []
        try:
            model_full_path = AI_Model_Path.Get_Model_Path()
            if(model_full_path == ""):
                raise Exception ("PLEASE SET AI MODEL FIRST")
            if '.onnx' in model_full_path:

                # input
                image_data = self.preprocess(imgBytes)
                image_size = np.array([imgBytes.size[1], imgBytes.size[0]], dtype=np.float32).reshape(1, 2)

                labels_file = open(AI_Model_Path.Get_Labelmap_Path())
                labels = labels_file.read().split("\n")

                # Loading ONNX model
                print("loading Tiny YOLO...")
                start_time = time.time()
                sess = rt.InferenceSession(model_full_path)
                print("loaded after", time.time() - start_time, "s")

                input_name00 = sess.get_inputs()[0].name
                input_name01 = sess.get_inputs()[1].name
                pred = sess.run(None, {input_name00: image_data,input_name01:image_size})

                boxes = pred[0]
                scores = pred[1]
                indices = pred[2]

                results = []
                out_boxes, out_scores, out_classes = [], [], []
                for idx_ in indices[0]:
                    out_classes.append(idx_[1])
                    out_scores.append(scores[tuple(idx_)])
                    idx_1 = (idx_[0], idx_[2])
                    out_boxes.append(boxes[idx_1])
                    results_json = "{'Class': '%s','Score': '%s','Location': '%s'}" % (labels[idx_[1]], scores[tuple(idx_)],boxes[idx_1])
                    results.append(results_json)
                    print(results_json)

        except Exception as e:
            print ( "detect_object unexpected error %s " % e )
            raise

        # return results
        return json.dumps(results)

IoT edge cihazınız önceki kodu ve özellikleri barındırıyorsa edge cihazınızda yapay zeka görüntü nesnesi algılama özelliği vardır ve yapay zeka modellerinin dinamik güncelleştirmesini destekler. Edge modülünün web API'si aracılığıyla diğer uygulamalara veya modüllere yapay zeka işlevselliği sağlamasını istiyorsanız, modülünüzde bir web API'si oluşturabilirsiniz.

Flask çerçevesi, hızlı bir şekilde API oluşturmak için kullanabileceğiniz bir araç örneğidir. Görüntüleri ikili veri olarak alabilir, algılama için bir yapay zeka modeli kullanabilir ve ardından sonuçları JSON biçiminde döndürebilirsiniz. Daha fazla bilgi için bkz . Visual Studio Code'da Flask: Flask Öğreticisi.

Katkıda Bulunanlar

Bu makale Microsoft tarafından yönetilir. Başlangıçta aşağıdaki katkıda bulunanlar tarafından yazılmıştır.

Asıl yazar:

  • Bo Wang | Kıdemli Yazılım Mühendisi

Diğer katkıda bulunan:

Genel olmayan LinkedIn profillerini görmek için LinkedIn'de oturum açın.

Sonraki adımlar