Öğretici: Python ve TensorFlow ile Azure İşlevleri makine öğrenmesi modellerini uygulama

Bu makalede Python, TensorFlow ve Azure İşlevleri kullanarak bir görüntüyü içeriğine göre sınıflandırmayı öğreneceksiniz. Tümünü yerel olarak yaptığınız ve bulutta Azure kaynağı oluşturmadığınız için bu öğreticiyi tamamlamanın bir maliyeti yoktur.

  • Python'da Azure İşlevleri geliştirmek için yerel bir ortam başlatın.
  • Özel bir TensorFlow makine öğrenmesi modelini bir işlev uygulamasına içeri aktarma.
  • Bir görüntüyü köpek veya kedi içeren olarak sınıflandırmak için sunucusuz bir HTTP API'sini oluşturun.
  • Web uygulamasından API’yi kullanma.

Önkoşullar

Önkoşul denetimi

  1. Terminalde veya komut penceresinde komutunu çalıştırarak func --version Azure İşlevleri Core Tools'un 2.7.1846 veya sonraki bir sürüm olup olmadığını denetleyin.
  2. Python sürüm raporlarınızın 3.7.x sürümünü denetlemek için (Linux/MacOS) veya py --version (Windows) çalıştırın python --version .

Öğretici deposunu kopyalama

  1. Terminalde veya komut penceresinde Git kullanarak aşağıdaki depoyu kopyalayın:

    git clone https://github.com/Azure-Samples/functions-python-tensorflow-tutorial.git
    
  2. klasörüne gidin ve içeriğini inceleyin.

    cd functions-python-tensorflow-tutorial
    
    • başlangıç , öğretici için çalışma klasörünüzdür.
    • end , başvurunuzun nihai sonucu ve tam uygulamasıdır.
    • kaynakları makine öğrenmesi modelini ve yardımcı kitaplıklarını içerir.
    • ön uç , işlev uygulamasını çağıran bir web sitesidir.

Python sanal ortamı oluşturma ve etkinleştirme

başlangıç klasörüne gidin ve adlı .venvbir sanal ortam oluşturup etkinleştirmek için aşağıdaki komutları çalıştırın. Azure İşlevleri tarafından desteklenen Python 3.7'yi kullandığınızdan emin olun.

cd start
python -m venv .venv
source .venv/bin/activate

Python venv paketini Linux dağıtımınıza yüklemediyse aşağıdaki komutu çalıştırın:

sudo apt-get install python3-venv

Bu etkinleştirilmiş sanal ortamda sonraki tüm komutları çalıştırırsınız. (Sanal ortamdan çıkmak için komutunu çalıştırın deactivate.)

Yerel işlevler projesi oluşturma

Azure İşlevleri işlev projesi, her biri belirli bir tetikleyiciye yanıt veren bir veya daha fazla tek tek işlev için bir kapsayıcıdır. Projedeki tüm işlevler aynı yerel ve barındırma yapılandırmalarını paylaşır. Bu bölümde, HTTP uç noktası sağlayan adlı classify tek bir ortak işlevi içeren bir işlev projesi oluşturacaksınız. Daha sonraki bir bölümde daha belirli bir kod ekleyebilirsiniz.

  1. Başlangıç klasöründe, python işlev uygulamasını başlatmak için Azure İşlevleri Core Tools'u kullanın:

    func init --worker-runtime python
    

    Başlatma işleminden sonra başlangıç klasörü, local.settings.json ve host.json adlı yapılandırma dosyaları da dahil olmak üzere proje için çeşitli dosyalar içerir. local.settings.json Azure'dan indirilen gizli dizileri içerebileceğinden, dosya .gitignore dosyasında varsayılan olarak kaynak denetiminden dışlanır.

    İpucu

    İşlev projesi belirli bir çalışma zamanına bağlı olduğundan, projedeki tüm işlevler aynı dille yazılmalıdır.

  2. Aşağıdaki komutu kullanarak projenize bir işlev ekleyin. Burada --name bağımsız değişken işlevinizin benzersiz adıdır ve --template bağımsız değişken işlevin tetikleyicisini belirtir. func new projenin seçilen diline uygun bir kod dosyası ve function.json adlı bir yapılandırma dosyası içeren işlev adıyla eşleşen bir alt klasör oluşturun.

    func new --name classify --template "HTTP trigger"
    

    Bu komut işlevin adıyla eşleşen bir klasör oluşturur ve sınıflandırır. Bu klasörde iki dosya vardır: işlev kodunu içeren __init__.py ve işlevin tetikleyicisini ve giriş ve çıkış bağlamalarını açıklayan function.json. Bu dosyaların içeriği hakkında ayrıntılı bilgi için Python geliştirici kılavuzundaki Programlama modeli bölümüne bakın.

İşlevi yerel olarak çalıştırma

  1. Start klasöründeki yerel Azure İşlevleri çalışma zamanı ana bilgisayarını başlatarak işlevi başlatın:

    func start
    
  2. Çıkışta uç noktanın classify göründüğünü gördüğünüzde URL'ye http://localhost:7071/api/classify?name=Azuregidin. Çıkışta "Hello Azure!" iletisi görünmelidir.

  3. Konağıdurdurmak için Ctrl -C kullanın.

TensorFlow modelini içeri aktarma ve yardımcı kod ekleme

bir görüntüyü içeriğine göre sınıflandırmak üzere işlevini değiştirmek classify için, Azure Özel Görüntü İşleme Hizmeti ile eğitilmiş ve oradan dışarı aktarılan önceden oluşturulmuş bir TensorFlow modeli kullanırsınız. Daha önce kopyaladığınız örneğin resources klasöründe bulunan model, bir görüntüyü köpek mi yoksa kedi mi içerdiğine göre sınıflandırır. Ardından projenize bazı yardımcı kodlar ve bağımlılıklar eklersiniz.

Özel Görüntü İşleme Hizmeti'nin ücretsiz katmanını kullanarak kendi modelinizi oluşturmak için örnek proje deposundaki yönergeleri izleyin.

İpucu

TensorFlow modelinizi işlev uygulamasından bağımsız olarak barındırmak istiyorsanız, bunun yerine modelinizi içeren bir dosya paylaşımını Linux işlev uygulamanıza bağlayabilirsiniz. Daha fazla bilgi edinmek için bkz . Azure CLI kullanarak python işlev uygulamasına dosya paylaşımı bağlama.

  1. Start klasöründe aşağıdaki komutu çalıştırarak model dosyalarını classify klasörüne kopyalayın. komutuna eklediğinizden \* emin olun.

    cp ../resources/model/* classify
    
  2. classify klasörünün model.pb adlı dosyalar içerdiğini ve labels.txtdoğrulayın. Aksi takdirde , komutu başlat klasöründe çalıştırıp çalıştırmadığınızdan denetleyin.

  3. Start klasöründe aşağıdaki komutu çalıştırarak yardımcı kod içeren bir dosyayı classify klasörüne kopyalayın:

    cp ../resources/predict.py classify
    
  4. Classify klasörünün artık predict.py adlı bir dosya içerdiğini doğrulayın.

  5. Başlangıç/requirements.txt bir metin düzenleyicisinde açın ve yardımcı kodun gerektirdiği aşağıdaki bağımlılıkları ekleyin:

    tensorflow==1.14
    Pillow
    requests
    
  6. requirements.txtkaydedin.

  7. Başlangıç klasöründe aşağıdaki komutu çalıştırarak bağımlılıkları yükleyin. Yükleme birkaç dakika sürebilir ve bu süre boyunca sonraki bölümde işlevi değiştirmeye devam edebilirsiniz.

    pip install --no-cache-dir -r requirements.txt
    

    Windows'da, "EnvironmentError nedeniyle paketler yüklenemedi: [Errno 2] Böyle bir dosya veya dizin yok:" hatasını ve ardından sharded_mutable_dense_hashtable.cpython-37.pyc gibi bir dosyanın uzun yol adını alabilirsiniz. Genellikle bu hatanın nedeni klasör yolunun derinliğinin çok uzun olmasıdır. Bu durumda, uzun yolları etkinleştirmek için kayıt defteri anahtarını HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem@LongPathsEnabled olarak 1 ayarlayın. Alternatif olarak Python yorumlayıcınızın nereye yüklendiğini denetleyin. Bu konumun yolu uzunsa, yolu daha kısa olan bir klasöre yeniden yüklemeyi deneyin.

İpucu

adlı bir işlev _initialize, ilk tahminini yapmak için predict.py çağırırken TensorFlow modelini diskten yükler ve genel değişkenlerde önbelleğe alır. Bu önbelleğe alma, sonraki tahminleri hızlandırır. Genel değişkenleri kullanma hakkında daha fazla bilgi için Azure İşlevleri Python geliştirici kılavuzuna bakın.

İşlevi tahminleri çalıştıracak şekilde güncelleştirme

  1. Classify/__init__.py dosyasını bir metin düzenleyicisinde açın ve standart JSON kitaplığını ve tahmin yardımcılarını içeri aktarmak için var olan import deyimlerden sonra aşağıdaki satırları ekleyin:

    import logging
    import azure.functions as func
    import json
    
    # Import helper script
    from .predict import predict_image_from_url
    
  2. İşlevin tüm içeriğini main aşağıdaki kodla değiştirin:

    def main(req: func.HttpRequest) -> func.HttpResponse:
        image_url = req.params.get('img')
        logging.info('Image URL received: ' + image_url)
    
        results = predict_image_from_url(image_url)
    
        headers = {
            "Content-type": "application/json",
            "Access-Control-Allow-Origin": "*"
        }
    
        return func.HttpResponse(json.dumps(results), headers = headers)
    

    Bu işlev adlı imgsorgu dizesi parametresinde bir görüntü URL'si alır. Ardından TensorFlow modelini kullanarak görüntüyü indirmek ve sınıflandırmak için yardımcı kitaplığından çağrısır predict_image_from_url . İşlev daha sonra sonuçları içeren bir HTTP yanıtı döndürür.

    Önemli

    Bu HTTP uç noktası başka bir etki alanında barındırılan bir web sayfası tarafından çağrıldığından yanıt, tarayıcının Çıkış Noktaları Arası Kaynak Paylaşımı (CORS) gereksinimlerini karşılayan bir Access-Control-Allow-Origin üst bilgi içerir.

    Üretim uygulamasında, ek güvenlik için web sayfasının özel çıkış noktasıyla değiştirin * .

  3. Değişikliklerinizi kaydedin, sonra bağımlılıkların yüklenmesinin tamamlandığını varsayarsak, ile func startyerel işlev ana bilgisayarını yeniden başlatın. Sanal ortamın etkinleştirildiği başlangıç klasöründe konağı çalıştırdığınızdan emin olun. Aksi takdirde konak başlatılır, ancak işlevi çağrılırken hatalar görürsünüz.

    func start
    
  4. Bir tarayıcıda, bir kedi görüntüsünün URL'si ile işlevi çağırmak için aşağıdaki URL'yi açın ve döndürülen JSON'un görüntüyü kedi olarak sınıflandırır.

    http://localhost:7071/api/classify?img=https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/cat1.png
    
  5. Sonraki adımda kullandığınız için konağı çalışır durumda tutun.

İşlevi test etmek için yerel web uygulaması ön ucunu çalıştırma

İşlev uç noktasını başka bir web uygulamasından çağırmayı test etmek için deponun ön uç klasöründe basit bir uygulama vardır.

  1. Yeni bir terminal veya komut istemi açın ve sanal ortamı etkinleştirin (daha önce Python sanal ortamı oluşturma ve etkinleştirme bölümünde açıklandığı gibi).

  2. Deponun ön uç klasörüne gidin.

  3. Python ile bir HTTP sunucusu başlatın:

    python -m http.server
    
  4. Tarayıcıda adresine gidin, ardından metin kutusuna localhost:8000aşağıdaki fotoğraf URL'lerinden birini girin veya genel olarak erişilebilen herhangi bir resmin URL'sini kullanın.

    • https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/cat1.png
    • https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/cat2.png
    • https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/dog1.png
    • https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/dog2.png
  5. Görüntüyü sınıflandırmak üzere işlev uç noktasını çağırmak için Gönder'i seçin.

    Tamamlanmış projenin ekran görüntüsü

    Görüntü URL'sini gönderdiğinizde tarayıcı bir hata bildirirse işlev uygulamasını çalıştırdığınız terminali denetleyin. "'PIL' modülü bulunamadı" gibi bir hata görürseniz, işlev uygulamasını daha önce oluşturduğunuz sanal ortamı etkinleştirmeden başlangıç klasöründe başlatmış olabilirsiniz. Hala hatalar görüyorsanız, sanal ortam etkinleştirildiğinde yeniden çalıştırın pip install -r requirements.txt ve hataları arayın.

Not

Model, görüntünün içeriğini her zaman bir kedi veya köpek olarak sınıflandırır. Görüntüde olup olmadığına bakılmaksızın, varsayılan olarak köpek olarak ayarlanır. Örneğin kaplanların ve panterlerin görüntüleri genellikle kedi olarak sınıflandırılabilir, ancak fil, havuç veya uçak görüntüleri köpek olarak sınıflandırılabilir.

Kaynakları temizleme

Bu öğreticinin tamamı makinenizde yerel olarak çalıştırıldığından temizlenir azure kaynakları veya hizmetleri yoktur.

Sonraki adımlar

Bu öğreticide, Bir TensorFlow modeli kullanarak görüntüleri sınıflandırmak için Azure İşlevleri ile bir HTTP API uç noktası oluşturmayı ve özelleştirmeyi öğrendiniz. Ayrıca bir web uygulamasından API'yi çağırmayı da öğrendinsiniz. Bu öğreticideki teknikleri kullanarak her türlü karmaşıklıkta API'ler oluşturabilir ve bunların tümünü Azure İşlevleri tarafından sağlanan sunucusuz işlem modelinde çalıştırabilirsiniz.

Ayrıca bkz: