Это снова ежегодная ноябрьская Золотая неделя туризма. Вы наблюдаете за людьми в живописном месте или наблюдаете, как тетушки играют в тай-чи на шоссе? Я вообще стараюсь не выходить на улицу во время Золотой недели, и этот ноябрь не исключение. 1 октября я пробежал полумарафон, чтобы отметить Национальный день, а 2 октября я решил пойти к второстепенным достопримечательностям: Чжанчжидуну и Уханьскому музею. Сегодня я сижу дома, ем, пью и думаю об апплете WeChat для распознавания собак.
С тех пор, как я подумал о разработке приложения, которое распознает собак, моим первым побуждением было разработать апплет WeChat. По сравнению с собственными приложениями для мобильных телефонов мини-программы WeChat легко разрабатывать и развертывать, особенно без установки, просто используйте и работайте, что особенно подходит для такого рода приложений с одной функцией и случайным использованием.
Первое, что приходит мне на ум, это TensorFlow.js, который реализует глубокое обучение на мобильном телефоне без серверной части, но TensorFlow.js не поддерживает мини-программы WeChat, поэтому мне ничего не остается, как выбратьапплет + серверрежим. А я не силен в веб+серверной разработке, так что в "На Праздник середины осени я разработал приложение, которое распознает собак.Как упоминалось в статье, я сначала реализовал приложение для Android с помощью TensorFlow Lite. Это Android-приложение скорее экспериментальный проект, в этот Национальный день у меня больше свободного времени, поэтому я решил доделать апплет WeChat.
Так как принят режим добавления сервера, распознавание изображений выполняется на стороне сервера, поэтому основные функции реализуются на стороне сервера. Сначала поговорим о реализации серверной части.
TensorFlow Serving
На стороне сервера существует множество схем реализации, в том числе C++/Java/Python, в какой-то момент я даже рассматривал возможность использования Node.js для реализации. Просматривая материалы конференции разработчиков Google на прошлой неделе, я обнаружил, что TensorFlow уже предоставляет решение для развертывания сервера: TensorFlow Serving.
TensorFlow Serving — это гибкая высокопроизводительная система обслуживания моделей машинного обучения, разработанная для производственных сред. TensorFlow Serving упрощает развертывание новых алгоритмов и экспериментов, сохраняя при этом ту же архитектуру сервера и API. TensorFlow Serving предоставляет пакет интеграций с моделями TensorFlow, которые также можно легко расширить для обслуживания других типов моделей.
Для получения подробной информации посетите:tensorflow.google.cn/serving/
TensorFlow Serving постоянно совершенствуется.Прямая ссылка на примеры не может обеспечить требуемые функции.После поиска информации со многих сторон весь процесс, наконец, завершен.
SavedModel
TensorFlow предоставляет два формата моделей:
- checkpoints, который представляет собой формат, основанный на коде, создавшем модель.
- SavedModel, формат которого не зависит от кода, создавшего модель.
SaveModel — это независимый от языка, восстанавливаемый, запечатанный формат сериализации. TensorFlow предоставляет различные механизмы для взаимодействия с SavedModel, такие как API tf.saved_model, Estimator API и CLI. Для TensorFlow Serving требуются файлы моделей в формате SavedModel.
переобучить и сохранить как SavedModel
существует"На Праздник середины осени я разработал приложение, которое распознает собак.В статье упоминалось, что нам не нужно обучать модель глубокого обучения распознаванию собак с нуля, а использовать трансферное обучение для переобучения на основе существующей модели. Учитывая, что модель развертывается на стороне сервера, я выбрал модель Inception V3 с более сильными возможностями распознавания.
В помеченном наборе данных о собаках используются наборы данных о собаках из Стэнфорда. Загрузите и разархивируйте его самостоятельно, а затем выполните следующую команду для обучения:
python retrain.py --image_dir=./Images --saved_model_dir=models/inception_v3
Обученная модель сохраняется в models/inception_v3/1, где 1 — номер версии, который можно указать через параметры командной строки скрипта retrain.py.
Установить сервер модели тензорного потока
Это очень просто сделать в Ubuntu, просто используйте следующую команду:
sudo apt install tensorflow-model-server
Для удобства разработки необходимо установить TensorFlow Serving Python API:
pip install tensorflow-serving-api
Запустить сервер модели tensorflow
Согласно документации, запустить сервер модели тензорного потока очень просто.Добавление сюда параметра rest_api_port — это запуск сервера и предоставление RESTful API.Этот интерфейс API удобен для взаимодействия апплета WeChat с ним.
tensorflow_model_server --rest_api_port=8501 --model_base_path=$PWD/models/inception_v3
Однако, запустив таким образом сервер модели tensorflow, я долго не общался с клиентом.Когда я был в растерянности, я увидел проект на github:GitHub.com/to beg IT3 Хубэй…
Проще говоря, Simple TensorFlow Serving — это пакет TensorFlow Serving, универсальный и простой в использовании сервис для моделей машинного обучения.
Его амбиции также велики, претендуя на поддержку следующих функций:
- Поддержка распределенных моделей TensorFlow.
- Поддержка обычных RESTful/HTTP API
- Поддерживает вывод с ускорением на GPU
- Поддержка curl и других инструментов командной строки
- Поддерживает клиентов, использующих любой язык программирования
- Поддерживает автоматическую генерацию клиентского кода без написания кода.
- Поддержка логического вывода с использованием исходных файлов изображений в моделях изображений.
- Статистические показатели, поддерживающие подробные запросы
- Поддержка одновременного обслуживания нескольких моделей
- Поддерживает динамические онлайн- и офлайн-версии моделей
- Поддержка загрузки новых пользовательских операций для моделей TensorFlow.
- Поддерживает безопасную аутентификацию с настраиваемой базовой аутентификацией
- Поддержка TensorFlow/MXNet/PyTorch/Caffe2/CNTK/ONNX/H2o/Scikit-learn/XGBoost/PMML и других моделей
мне это нравится больше всегоАвтоматически генерировать клиентский кодФункция, перед этим я просмотрел много информации, но не получил связи между клиентом и сервером. Кроме того, он также предоставляет веб-интерфейс, вы можете просмотреть структуру модели и подпись (подпись), эта подпись меня тоже давно кидает.
Доступ через браузер:http://127.0.0.1:8500, веб-интерфейс выглядит следующим образом:
Установка Simple TensorFlow Serving очень проста:
pip install simple_tensorflow_serving
Далее запускаем сервер:
simple_tensorflow_serving --model_base_path="./models/inception_v3" &
клиент
Мы еще не начали изучать разработку апплета WeChat, сначала напишите клиент на питоне и сначала протестируйте его, мы можем использоватьАвтоматически генерировать клиентский кодФункции:
curl http://localhost:8500/v1/models/default/gen_client?language=python > test_client.py
Автоматически сгенерированный код выглядит следующим образом:
#!/usr/bin/env python
import requests
def main():
endpoint = "http://ilego.club:8500"
json_data = {"model_name": "default", "data": {"image": [[[[1.0, 1.0, 1.0], [1.0, 1.0, 1.0], [1.0, 1.0, 1.0], [1.0, 1.0, 1.0], [1.0, 1.0, 1.0]]]]}}
result = requests.post(endpoint, json=json_data)
print(result.text)
if __name__ == "__main__":
main()
Видно, что клиент отправляет на сервер кусок данных JSON и получает результат. На основе этого кода измените его, добавьте чтение изображения, масштабирование изображения и преобразуйте его в данные формата JSON, то есть выполните код тестового клиента, см. код:GitHub.com/mogo Web/голодание…
Вы можете попробовать протестировать изображение собаки:
python test_client.py --image=./Images/n02116738-African_hunting_dog/n02116738_1105.jpg
Результат выглядит следующим образом:
n02116738 african hunting dog 0.780203342438
n02115913 dhole 0.0102733308449
n02092002 scottish deerhound 0.00600153999403
Спереди — это метка категории, а сзади — вероятность принадлежности к определенной категории.В приведенных выше результатах вероятность попадания в топ-1 составляет 0,78.
Суммировать
Эта серверная часть далека от совершенства, и есть некоторые проблемы:
- Изображения на стороне клиента и на стороне сервера передаются в формате JSON, а данные изображения преобразуются из двоичного кода в строку JSON, что имеет низкую эффективность использования пространства.Кодирование данных изображения с помощью base64 мы рассмотрим позже.
- Эффективность прогноза относительно высока, от запроса до ответа десятки секунд, а узкое место пока не найдено.
- Поддержка параллелизма, поскольку сейчас это всего лишь простой тест, если, учитывая этап производства, апплет WeChat для нескольких мобильных телефонов может быть идентифицирован одновременно, предстоит еще много работы.
Что ж, давайте сначала поговорим о разработке и развертывании серверной части В следующей статье я расскажу о разработке апплета WeChat и связи с серверной частью, так что следите за обновлениями!
Полный код этой статьи см. по адресу:GitHub.com/mogo Web/голодание…