教學課程:在 Azure Functions 中使用 Python 和 TensorFlow 來套用機器學習模型

在本文中,您將了解如何使用 Python、TensorFlow 和 Azure Functions 搭配機器學習模型根據影像的內容對影像進行分類。 您將在本機上執行所有工作,且不會在雲端中建立任何 Azure 資源,因此完成本教學課程並不會產生任何費用。

  • 初始化本機環境以在 Python 中開發 Azure Functions。
  • 將自訂 TensorFlow 機器學習模型匯入至函式應用程式。
  • 建置無伺服器 HTTP API,將影像分類為包含狗或貓的影像。
  • 從 Web 應用程式取用 API。

必要條件

先決條件檢查

  1. 在終端機或命令視窗中,執行 func --version,以確認 Azure Functions Core Tools 為 2.7.1846 版或更新版本。
  2. 執行 python --version (Linux/MacOS) 或 py --version (Windows),以確認您的 Python 版本回報為 3.7.x。

複製教學課程存放庫

  1. 在終端機或命令視窗中,使用 Git 複製下列存放庫:

    git clone https://github.com/Azure-Samples/functions-python-tensorflow-tutorial.git
    
  2. 瀏覽至資料夾,並檢查其內容。

    cd functions-python-tensorflow-tutorial
    
    • start 是教學課程的工作資料夾。
    • end 是供您參考的最終結果和完整實作。
    • resources 包含機器學習模型和協助程式庫。
    • frontend 是呼叫函式應用程式的網站。

建立並啟用 Python 虛擬環境

瀏覽至start 資料夾,並執行下列命令以建立並啟用名為 .venv 的虛擬環境。 請務必使用受 Azure Functions 支援的 Python 3.7。

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

如果 Python 未在您的 Linux 發行版本上安裝 venv 套件,請執行下列命令:

sudo apt-get install python3-venv

您將在這個已啟用的虛擬環境中執行所有後續命令。 (若要退出虛擬環境,請執行 deactivate。)

建立本機 Functions 專案

在 Azure Functions 中,函式專案是包含一或多個個別函式的容器,而每個函式分別會回應特定的觸發程序。 專案中的所有函式會共用相同的本機和裝載設定。 在本節中,您將建立一個函式專案,其中包含名為 classify 的單一重複使用函式,可提供 HTTP 端點。 您將在後續章節中新增更具體的程式碼。

  1. 在 start 資料夾中,使用 Azure Functions Core Tools 來初始化 Python 函式應用程式:

    func init --worker-runtime python
    

    初始化之後,start 資料夾會包含專案的各種檔案,包括名為 local.settings.jsonhost.json 的組態檔。 由於 local.settings.json 可能會包含從 Azure 下載的秘密,因此 .gitignore 檔案依預設會將該檔案排除在原始檔控制以外。

    提示

    由於函式專案會繫結至特定執行階段,因此專案中的所有函式都必須以相同的語言撰寫。

  2. 使用下列命令,將函式新增至您的專案,其中 --name 引數是函式的唯一名稱,而 --template 引數可指定函式的觸發程序。 func new 建立符合函式名稱的子資料夾,其中包含適合專案所選語言的程式碼檔案,以及名為 function.json 的組態檔。

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

    此命令會建立符合函式名稱的資料夾,即 classify。 該資料夾中有兩個檔案:__init__.py 包含函式程式碼,而 function.json 則描述函式的觸發程序及其輸入和輸出繫結。 如需這些檔案內容的詳細資料,請參閱 Python 開發人員指南中的 程式設計模型

在本機執行函式

  1. 啟動 start 資料夾中的本機 Azure Functions 執行階段主機,以啟動函式:

    func start
    
  2. 如果您看到 classify 端點出現在輸出中,請瀏覽至 URL http://localhost:7071/api/classify?name=Azure。 輸出結果應顯示訊息「Hello Azure!」。

  3. 使用 Ctrl-C 將主機停止。

匯入 TensorFlow 模型並新增協助程式碼

若要修改 classify 函式以根據影像的內容將影像分類,請使用預先建置的 TensorFlow 模型,該模型已透過 Azure 自訂視覺服務進行定型並匯出。 此模型包含在您先前複製之範例的 resources 資料夾中,可根據影像中是否包含狗或貓將影像分類。 接著,您可以將一些協助程式碼和相依性新增至您的專案。

若要使用自訂視覺服務的免費層來建置自己的模型,請遵循範例專案存放庫中的指示。

提示

如果您想裝載獨立於函式應用程式的 TensorFlow 模型,可以改為將包含模型的檔案共用掛接至您的 Linux 函式應用程式。 若要深入了解,請參閱 使用 Azure CLI 將檔案共用掛接至 Python 函式應用程式

  1. 在 start 資料夾中執行下列命令,將模型檔案複製到 classify 資料夾中。 請務必在命令中包含 \*

    cp ../resources/model/* classify
    
  2. 確認 classify 資料夾包含名為 model.pb 和 labels.txt 的檔案。 如果沒有,請確認您已執行 start 資料夾中的命令。

  3. 在 start 資料夾中執行下列命令,將含有協助程式碼的檔案複製到 classify 資料夾中:

    cp ../resources/predict.py classify
    
  4. 確認 classify 資料夾此時包含名為 predict.py 的檔案。

  5. 在文字編輯器中開啟 start/requirements.txt,並新增協助程式碼所需的下列相依性:

    tensorflow==1.14
    Pillow
    requests
    
  6. 儲存 requirements.txt

  7. start 資料夾中執行下列命令,以安裝相依性。 安裝可能需要幾分鐘的時間,在這段期間,您可以繼續修改下一節中的函式。

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

    在 Windows 上,如果檔案的路徑名稱較長 (例如 sharded_mutable_dense_hashtable.cpython-37.pyc),則可能會出現錯誤「無法安裝套件,因為發生 EnvironmentError:[Errno 2] 沒有此類檔案或目錄:」。 之所以發生此錯誤,通常是因為資料夾路徑的深度太長所致。 在此情況下,請將登錄機碼 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem@LongPathsEnabled 設定為 1,以啟用長路徑。 或者,請檢查 Python 解譯器的安裝位置。 如果該位置具有長路徑,請嘗試在路徑較短的資料夾中重新安裝。

提示

在 predict.py 上呼叫以進行第一次預測時,名為 _initialize 的函式會從磁碟載入 TensorFlow 模型,並將其快取到全域變數中。 此快取可加速後續預測的執行。 如需使用全域變數的詳細資訊,請參閱 Azure Functions Python 開發人員指南

更新函式以執行預測

  1. 在文字編輯器中開啟 classify/__init__.py,並在現有的 import 陳述式後面新增以下幾行,以匯入標準 JSON 程式庫和 predict 協助程式:

    import logging
    import azure.functions as func
    import json
    
    # Import helper script
    from .predict import predict_image_from_url
    
  2. main 函式的整個內容取代為下列程式碼:

    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)
    

    此函式會在名為 img 的查詢字串參數中接收影像 URL。 這會從協助程式庫呼叫 predict_image_from_url,以下載影像並使用 TensorFlow 模型將影像分類。 然後,函式會傳回包含結果的 HTTP 回應。

    重要

    由於此 HTTP 端點會由裝載於另一個網域的網頁呼叫,因此回應會包含 Access-Control-Allow-Origin 標頭以符合瀏覽器的跨原始來源資源共用 (CORS) 需求。

    在生產應用程式中,將 * 變更為網頁的特定來源以提高安全性。

  3. 儲存您的變更,然後假設相依性已完成安裝,使用 func start 重新啟動本機函式主機。 請務必在已啟用虛擬環境的 start 資料夾中執行主機。 否則,主機將會啟動,但您會在叫用函式時會看到錯誤。

    func start
    
  4. 在瀏覽器中開啟下列 URL,以使用貓影像的 URL 叫用函式,並確認傳回的 JSON 將影像分類為貓。

    http://localhost:7071/api/classify?img=https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/cat1.png
    
  5. 讓主機保持執行狀態,因為您在後續步驟將會用到此主機。

執行本機 Web 應用程式前端以測試函式

若要測試從另一個 Web 應用程式叫用函式端點的功能,存放庫的 frontend 資料夾中有一個簡單的應用程式可供使用。

  1. 開啟新的終端機或命令提示字元,並啟用虛擬環境 (如先前的建立並啟用 Python 虛擬環境所說明)。

  2. 瀏覽至存放庫的 frontend 資料夾。

  3. 使用 Python 啟動 HTTP 伺服器:

    python -m http.server
    
  4. 在瀏覽器中瀏覽至 localhost:8000,然後在文字方塊中輸入下列其中一個相片 URL,或使用任何可公開存取之影像的 URL。

    • 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. 選取 [提交] 叫用函式端點,以進行影像分類。

    Screenshot of finished project

    如果瀏覽器在您提交影像 URL 時回報了錯誤,請檢查函式應用程式執行所在的終端機。 如果您看到「找不到模組 'PIL'」之類的錯誤,表示您可能未事先啟用先前建立的虛擬環境,即在 start 資料夾中啟動了函式應用程式。 如果您仍看到錯誤,請在啟用虛擬環境後再次執行 pip install -r requirements.txt,並觀察是否有錯誤。

注意

無論影像中是否包含貓或狗,模型一律會將影像的內容分類為貓或狗 (預設為狗)。 例如,虎和豹的影像通常會分類為貓,但象、紅蘿蔔或飛機的影像則會分類為狗。

清除資源

本教學課程全都會在機器本機上執行,因此並沒有需要清除的 Azure 資源或服務。

下一步

在本教學課程中,您已了解如何使用 Azure Functions 來建置和自訂 HTTP API 端點,以使用 TensorFlow 模型將影像分類。 您也已了解如何從 Web 應用程式呼叫 API。 不論多麼複雜的 API 都可以使用本教學課程的技術來建置,而且都在 Azure Functions 提供的無伺服器計算模型上執行。

另請參閱: