Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье вы узнаете, как использовать Python, TensorFlow и Azure Functions с моделью машинного обучения для классификации изображения на основе его содержимого. Поскольку вся работа выполняется локально и в облаке не создаются ресурсы Azure, выполнение этого руководства не требует затрат.
- Инициализация локальной среды для разработки Azure Functions в Python.
- Импорт настраиваемой модели машинного обучения TensorFlow в приложение-функцию.
- Создание бессерверного HTTP API для определения, содержит ли изображение собаку или кота.
- Вызвать API из веб-приложения.
Предварительные условия
- Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .
- Python 3.7.4. (Python 3.7.4 и Python 3.6.x проверяются с помощью Azure Functions; Python версии 3.8 и более поздних версий пока не поддерживаются.)
- Инструменты Core для Azure Functions
- Редактор кода, например Visual Studio Code
Проверка предварительных условий
- В окне терминала или командной строки запустите
func --version, чтобы убедиться, что Azure Functions Core Tools версии 2.7.1846 или более поздней. - Запустите
python --version(Linux/macOS) илиpy --version(Windows), чтобы проверить, что ваша версия Python — 3.7.x.
Клонирование репозитория руководства
В окне терминала или командном окне клонируйте следующий репозиторий, используя Git.
git clone https://github.com/Azure-Samples/functions-python-tensorflow-tutorial.gitПерейдите в папку и изучите ее содержимое.
cd functions-python-tensorflow-tutorial- start — это папка для работы с этим учебником;
- end — это итоговый результат и полная реализация для вашего ознакомления.
- resources — папка с моделью машинного обучения и вспомогательными библиотеками;
- frontend — папка с веб-сайтом, который вызывает приложение-функцию.
Создание и активация виртуальной среды Python
Перейдите к папке start и выполните следующие команды для создания и активации виртуальной среды с именем .venv. Обязательно используйте Python 3.7, который поддерживается Azure Functions.
cd start
python -m venv .venv
source .venv/bin/activate
Если Python не установил пакет venv в вашем дистрибутиве Linux, выполните следующую команду:
sudo apt-get install python3-venv
Все последующие команды будут выполняться в этой активированной виртуальной среде. (Чтобы выйти из виртуальной среды, выполните команду deactivate.)
Создать локальный проект функций
В Azure Functions проект функции — это контейнер для одной или нескольких отдельных функций, которые каждый отвечает на конкретный триггер. Все функции в проекте совместно используют те же локальные конфигурации и конфигурации размещения. В этом разделе вы создадите проект функции, содержащий одну шаблонную функцию с именем classify, которая предоставляет конечную точку HTTP. Вы добавите более конкретный код в одном из следующих разделов.
В папке start используйте Azure Functions Core Tools для инициализации приложения-функции Python:
func init --worker-runtime pythonПосле инициализации папка start содержит различные файлы проекта, включая файлы конфигурации local.settings.json и host.json. Так как local.settings.json может содержать секреты, скачанные из Azure, файл по умолчанию исключается из системы управления версиями в файле .gitignore.
Совет
Так как проект функций привязан к определенной среде выполнения, все функции в проекте должны быть написаны на одном языке.
Добавьте функцию в проект с помощью следующей команды, где аргумент
--name— уникальное имя функции, а аргумент--templateуказывает триггер функции. С помощьюfunc newсоздайте вложенную папку с именем функции, которая содержит файл кода на выбранном для проекта языке и файл конфигурации function.json.func new --name classify --template "HTTP trigger"Эта команда создает папку classify, которая соответствует имени функции. В этой папке содержатся два файла: __init__.py, содержащий код функции, и function.json, который описывает триггер функции и его входные и выходные привязки. Дополнительные сведения о содержимом этих файлов см. в разделе Программная модель руководства разработчика Python.
Локальное выполнение функции
Запустите функцию, запуская локальный узел среды выполнения Azure Functions в папке :
func startПосле отображения конечной точки
classifyв выходных данных перейдите по URL-адресуhttp://localhost:7071/api/classify?name=Azure. В выходных данных должно появиться сообщение "Hello Azure!".Чтобы остановить хост, используйте клавиши CTRL-C.
Импорт модели TensorFlow и добавление вспомогательного кода
Чтобы изменить функцию classify для классификации изображения на основе его содержимого, используйте предварительно созданную модель TensorFlow, которая была обучена и экспортирована из службы пользовательского визуального распознавания Azure. Модель, которая содержится в папке resources в примере, клонированном ранее, классифицирует изображение, определяя, кто на нем: кошка или собака. Затем вы добавите в проект вспомогательный код и зависимости.
Чтобы создать собственную модель с помощью бесплатного уровня службы пользовательского визуального распознавания, следуйте инструкциям в репозитории проекта sample.
Совет
Если вы хотите разместить модель TensorFlow независимо от приложения-функции, вы можете подключить общую папку, содержащую модель, к приложению-функции Linux. Дополнительные сведения см. в разделе "Подключение общих папок".
В папке start выполните следующую команду, чтобы скопировать файлы модели в папку classify. Не забудьте добавить
\*в эту команду.cp ../resources/model/* classifyУбедитесь, что файлы model.pb и labels.txt находятся в папке classify. В противном случае убедитесь, что вы выполнили команду в папке start.
В папке start выполните следующую команду, чтобы скопировать файл с вспомогательным кодом в папку classify:
cp ../resources/predict.py classifyУбедитесь, что файл predict.py находится в папке classify.
Откройте в текстовом редакторе файл start/requirements.txt и добавьте в него следующие зависимости, требуемые вспомогательному коду.
tensorflow==1.14 Pillow requestsСохраните файл requirements.txt.
Установите зависимости, выполнив следующую команду в папке start: Установка может занять несколько минут. В это время можно перейти к изменению функции в следующем разделе.
pip install --no-cache-dir -r requirements.txtНа Windows вы можете столкнуться с ошибкой: "Не удалось установить пакеты из-за ошибки среды: [Errno 2] Нет такого файла или каталога:", после которой следует длинное имя пути к файлу, например sharded_mutable_dense_hashtable.cpython-37.pyc. Как правило, эта ошибка возникает из-за слишком длинного пути к папке. В этом случае установите значение
1для ключа реестраHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem@LongPathsEnabled, чтобы включить длинные пути. Кроме того, проверьте, где установлен Python интерпретатор. Если у этого расположения длинный путь, попробуйте переустановить в папке с более коротким путем.
Совет
При вызове predict.py для создания первого прогноза функция _initialize загружает модель TensorFlow с диска и кэширует ее в глобальных переменных. Благодаря этому кэшированию последующие прогнозы ускоряются.
Обновление функции для выполнения прогнозов
Чтобы импортировать стандартную библиотеку JSON и вспомогательные функции predict, откройте файл
importв текстовом редакторе и добавьте приведенные ниже строки после существующих инструкций .import logging import azure.functions as func import json # Import helper script from .predict import predict_image_from_urlЗамените все содержимое функции
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)Эта функция получает URL-адрес изображения в параметре строки запроса с именем
img. Затем она вызываетpredict_image_from_urlиз вспомогательной библиотеки, чтобы скачать и классифицировать изображение с помощью модели TensorFlow. Затем функция возвращает ответ HTTP с результатами.Внимание
Так как конечная точка HTTP вызывается веб-страницей, размещенной в другом домене, ответ содержит заголовок
Access-Control-Allow-Originв соответствии с требованиями к общему доступу к ресурсам независимо от источника (CORS), предъявляемыми браузером.В рабочем приложении измените
*на источник веб-страницы для повышения безопасности.Сохраните изменения, а затем, при условии, что зависимости установлены, снова запустите локальный хост функций с помощью
func start. Не забудьте запустить хост в папке start с активированной виртуальной средой. В противном случае хост запустится, но при вызове функции возникнут ошибки.func startВ браузере откройте следующий 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Оставьте хост запущенным, поскольку он будет использоваться на следующем шаге.
Запуск интерфейса локального веб-приложения для проверки функции
Чтобы проверить вызов конечной точки функции из другого веб-приложения, можно воспользоваться простым приложением, расположенным в папке frontend репозитория.
Откройте новый терминал или командную строку и активируйте виртуальную среду (как описано ранее в разделе Create и активируйте виртуальную среду Python).
Перейдите в папку frontend в репозитории.
Запустите HTTP-сервер с Python:
python -m http.serverВ браузере перейдите по адресу
localhost:8000, введите один из следующих URL-адресов фотографий в текстовое поле или используйте URL-адрес любого общедоступного изображения.https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/cat1.pnghttps://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/cat2.pnghttps://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/dog1.pnghttps://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/dog2.png
Нажмите кнопку Отправить, чтобы вызвать конечную точку функции для классификации изображения.
Если при попытке отправить URL-адрес изображения браузер выдает сообщение об ошибке, проверьте терминал, в котором выполняется приложение-функция. Если отображается сообщение об ошибке наподобие "No module found 'PIL'" (Не найден модуль PIL), возможно, вы запустили приложение-функцию в папке start без предварительной активации созданной ранее виртуальной среды. Если ошибки по-прежнему отображаются, снова запустите
pip install -r requirements.txtс активированной виртуальной средой и найдите ошибки.
Примечание.
Модель всегда классифицирует содержимое изображения как "Кошка" или "Собака", независимо от того, есть ли на изображении одно из этих животных. По умолчанию изображение классифицируется как "Собака". Например, изображения тигров и пантер классифицируются как "Кошка", а изображения слонов, морковок или самолетов — как "Собака".
Очистка ресурсов
Поскольку данное руководство выполняется локально на вашем компьютере, нет необходимости удалять ресурсы или службы Azure.
Следующие шаги
В этом руководстве вы узнали, как создать и настроить конечную точку API HTTP с помощью Azure Functions для классификации изображений с помощью модели TensorFlow. Вы также научились вызывать API из веб-приложения. Вы можете использовать методы, описанные в этом руководстве, для создания API любой сложности, при этом задействуя бессерверную вычислительную модель, предоставляемую Azure Functions.
См. также: