На основе Serverless архитектуры развёртывание универсального распознавания текста PaddleOCR
Проектный фон В повседневной практике проектов, мы полагаем, что все хотят, чтобы их Restful API-сервисы были надёжными и работали стабильно, а также обладали высокой степенью параллелизма и доступности. Сервисами Serverless от облачных провайдеров является оптимальным выбором. Они не требуют администраторов, не нужно создавать k8s, и можно не беспокоиться о недоступности сервиса из-за сбоев.
PaddleOCR стремится создать богатую, передовую и практичную библиотеку инструментов для распознавания текста, помогая пользователям обучать более совершенные модели и применять их на практике. Адрес проекта PaddleOCR: https://github.com/PaddlePaddle/PaddleOCR.
Мы упаковываем PaddleOCR в образ Docker, чтобы его можно было быстро развернуть в среде Docker или k8s для использования в сети.
Эта статья предоставит стандартизированный код для достижения этой цели.
С помощью образа Docker, предоставленного этим проектом, вы можете быстро развернуть PaddleOCR как вызываемый Restful API сервис.
После прочтения этой статьи вы узнаете:
Готовое к использованию решение Здесь предоставляется готовый к использованию образ Docker, который позволяет легко развернуть PaddleOCR на локальном сервере, в Alibaba Cloud Function Compute и Tencent Cloud Function, обеспечивая универсальные API распознавания текста.
Опыт работы с PaddleOCR одним щелчком мыши в центре приложений Alibaba Cloud Serverless
1. Развёртывание PaddleOCR на локальной машине Адрес образа Docker на сайте PaddleOCR: https://hub.docker.com/repository/docker/duolabmeng666/paddlehub_ppocr
# Адрес репозитория образов Docker на Alibaba Cloud
docker run -itd --name ppocr -p 9000:9000 registry.cn-hongkong.aliyuncs.com/llapi/ppocr:1.8 /bin/bash -c "sh /PaddleOCR/start.sh"
# Адрес сервера модели на Alibaba Cloud
docker run -itd --name ppocr -p 9000:9000 registry.cn-hongkong.aliyuncs.com/llapi/ppocr:1.6.server /bin/bash -c "sh /PaddleOCR/start.sh"
Вызов OCR
curl -H "Content-Type:application/json" -X POST --data "{\"images\": [\"iVBORw0KGgoAAAANSUhEUgAAAHkAAAAnCAYAAAArfufOAAAEvElEQVR4nO1bMWsbSRT+clyv4sAWGAS5wpUN8UGuSmlQEBHpsp0LgZy4cOkuwhHqrDKFkERcpMqWQZcgkRQurrJBNifjwo3BYEcSpNAv2Huzu5JWu7Pe2dWubDLzNV7P7r5987733rx5Yz8yCFD4pfHbfSugkDwUyRJAkSwBFMkSQJEsARTJEkCRLAEUyRJAkSwBFMkSQJEsAbwkn+nQdqo4PBN4W+jZATrlKrTydww5d4dfGyRDx7mgwg8Vsc+D2bbZE/tuwHO/x6WTL/o9/NsHVvPrWIoqg024fj2XGtnXeyg8mf7OjLPbGoWWs5rfQiW3LPSs8DfSG3i/vzljn/MTmm/3mhznAqWahjXee2QXS/4FOdc6/xmMSe5/R6l8ikvHjU69io7QVJzPplDY30Y27VC2xeRmUGKGsclyGzwQTzToNb+bLFN8xCG8hgpGxt+AHvRwuNPGVSj5wd84b1ZRufWOrxX3oNv2quw0PHY19WGOz3EQNyyS05uo1DatkTBEBD1LzqN3WRSJGtImrM+uvQ4jHZhzvyYbfwZWZm4wO7UpsMiBBBw7wXRNitQpisnTdn2dpYd/zHQzIm+twiJ2D++7LM0lp9kU1/Z3xbHquPam49FUHs279DS8Rn4pvlLm6cnR/6/n0IvrM0O+JIdJ11ycHVkRyYnEqewMCvkU0ErNpDSrQEthJfEoni9dL+W2oeesazPtdmflMcLCwinTg4jLnS/JYdK1B2yNd4671nyn7CiGeHjo4bjrd08gWyTszAmkaztNU9oooW0VFeM1P4YqOV7Ml64nOLuYZL1jiujjp84AiVZ4xYn40zXbMrFKl9aFYbMdXbOFIJ7qmm13VtMpXPavcXVLP+sNrFDRuBGvspERf7pmUbtvXfKaH8EY4PSECo/0n9H31YuEuYPI4Fl+hMtWBtq+BrDoLOtUb4QR5NxZ3I3AAHRtq5JvhojCs26H3fNGwfzpmvUBkN+iqP08GVsrbqHQPAJuwkheRpZ2Flnf+1MnCNOQYXg4JDv36gvDnOmaMplZURfJ4F+dN4iwomYVld2YCi97t5LNb+CqdYTznKjeNsm8vVm0jhe4+7RIsCP7cdju2AIxvB1Rxtk2je2/NMVReE27Wy9ymxje0DvNnrCdTZLv3JvdF/o/zdT9OFaZ7vbtKHS6RusjNLNRY3XkConv5b3drSW2HFDq1poQIvrOdG15mbs3OkevOP0HrWmzhZqfg7EoYVHwd5xRfC9LwjwYr8PMoZzZgK3fz3FDy4cI0dzzZOvYjAgGpV4OkRuUQvWXP7FLz2g7DXQEKkIT6WUzMjsnQUdodruTnGIRFTZzZt6R6Xjc75g0UZjHuHYw1Xg9/HUUahTRt+1ADh5N/xfKUcKHWVcnKZBzAsXLBKINEXsbgIhHgjxMq1KriOq4xof9AZbSnKrVpTNve2nVNSlPWzP0UaPjW8Lty8k7Poc6jOTBl7rx6s2B8eHUiI4f34y3JOPtl/5kqNc4MF69+2YM5hAbL/pG+92BOVennqFgz9M9L8uGn4xewJgbUxv9Z3xgct/UjfaPaKqNeXR/0xHJCr8q1N94SQBFsgRQJEsARbIEUCRLAEWyBFAkSwBFsgT4HxQ8/CE4B3ErAAAAAElFTkSuQmCC\"]}" http://127.0.0.1:9000/predict/ocr_system
{"msg":"","results":[[{"confidence":0.9853195548057556,"text":"测试图像路径,可以是单张图片路径,也可以是图像集合目录路径","text_region":[[5,10],[466,10],[466,24],[5,24]]}]],"status":"000"}
Пример вызова OCR-кода Посмотреть пример вызова кода
import requests
import base64
def ocr(файл_адрес):
с открытым(файл_адрес, 'rb') как f:
данные = f.read(-1)
изображение = str(base64.b64encode(данные), кодировка='utf-8')
данные = '{"images":["' + изображение + '"]}'
txt = requests.post("http://127.0.0.1:9000/predict/ocr_system", данные=данные,
``` **Перевод текста на русский язык:**
## 2. Развёртывание в функции вычислений Али Облако
Очень просто!
[Serverless приложение центр один ключ опыт PaddleOCR](https://fcnext.console.aliyun.com/applications/create?template=PaddleOCR)
## 3. Развёртывание в функциях Тсенгюн (Tencent) Облако
Немного сложнее, пожалуйста, посмотрите следующее руководство:
# Проект разработки
Используйте [PaddleHub Serving для развёртывания сервиса PaddleOCR](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.2/deploy/hubserving/readme.md)
Шаги следующие:
1. Построить среду выполнения paddle;
2. Использовать PaddleHub Serving сервис для развёртывания;
3. Скачать проект PaddleOCR обратно и написать файл Dockerfile;
4. Сред развёртывания Serverless архитектуры.
# Построение среды выполнения paddle в docker
## 1. Построение python3.7 среды выполнения
Создать следующие файлы и каталоги:
/test_ppocr -- PaddleOCR (https://github.com/PaddlePaddle/PaddleOCR проект файлов) -- Dockerfile (файл построения docker)
```shell
# Создание базовой среды выполнения python
docker run -itd --name testppocr -p 9000:9000 -v /test_ppocr:/test_ppocr python:3.7.10-slim /bin/bash #
# Ввод в контейнер для установки среды выполнения paddle
docker exec -it testppocr /bin/bash
При развёртывании модели глубокого обучения, не рекомендуется использовать версию alpine в среде выполнения python, например
python:3.7-alpine
. Причина использования версии alpine заключается в том, что требуется много времени для установки системных зависимостей, а выгода невелика, и конечный размер образа примерно такой же, как у версии slim. Если среда установки сложна, вы также можете выбратьpython:3.7-buster
образ. Конечный размер сборки обычно больше на 100 МБ–300 МБ, но сложность установки значительно снижается, и это также приемлемо. Рекомендуется новичкам использовать buster версию для создания образов. Если требуется небольшой размер образа, используйте slim версию для создания образа. В среде Serverless требуется небольшой размер образа для повышения скорости запуска функций, поэтому выберите slim версию для создания образа.
Определите, какие зависимости нужны системе, путём запуска кода.
docker exec -it testppocr /bin/bash
введите работающую базовую среду, затем войдите в терминал запущенной системы и запустите свой код, чтобы определить необходимые зависимости.
requirements.txt
, обратите внимание на версию пакета зависимостей, иначе версия будет слишком высокой и установка завершится неудачно. Рекомендуется зафиксировать версию, чтобы предотвратить невозможность восстановления образа в будущем.
shapely==1.8.1.post1
scikit-image==0.17.2
imgaug==0.4.0
pyclipper==1.3.0.post2
lmdb==1.3.0
tqdm==4.64.0
numpy==1.21.6
visualdl==2.2.3
python-Levenshtein==0.12.2
opencv-contrib-python==4.2.0.32
paddlenlp==2.0.0
paddle2onnx==0.5.1
paddlepaddle==2.0.2
paddlehub==2.1.0
Начните установку системных зависимостей и зависимостей Python:
apt install g++
apt install libglib2.0-dev
apt install libgl1-mesa-glx
apt install libsm6
apt install libxrender1
# Загрузка пакетов Python в автономном режиме. Поскольку сборка часто повторяется, загрузка пакетов в автономном режиме может ускорить отладку.
pip download -r requirements.txt -d ./pg
pip download paddlepaddle==2.0.2 -i https://mirror.baidu.com/pypi/simple -d ./pg
pip download paddlehub -d ./pg
# Установка пакетов Python
pip install -r requirements.txt --find-links ./pg
pip install paddlepaddle --find-links ./pg
pip install paddlehub -U --no-index --find-links ./pg
hub install deploy/hubserving/ocr_system/
hub install deploy/hubserving/ocr_cls/
hub install deploy/hubserving/ocr_det/
hub install deploy/hubserving/ocr_rec/
Здесь среда выполнения PaddleHub Serving установлена, запустите её и проверьте эффект:
hub serving start --modules ocr_system ocr_cls ocr_det ocr_rec -p 9000
Адрес распознавания — http://127.0.0.1:9000/predict/ocr_system.
Если проблем нет, то здесь образ готов к запуску.
Наконец, удалите ненужные файлы из контейнера, уменьшите размер контейнера:
rm -rf /root/.cache/* \
&& rm -rf /var/lib/apt/lists/* \
&& rm -rf /app/test/pg/*
Сохраните и отправьте в соответствующий репозиторий контейнеров облачного провайдера.
В качестве примера здесь используется репозиторий образов контейнеров Alibaba Cloud.
Пожалуйста, измените параметры отправки самостоятельно, здесь приведена моя команда учётной записи:
docker commit testppocr paddlehub_ppocr:1.0
docker tag paddlehub_ppocr:1.0 registry.cn-hongkong.aliyuncs.com/llapi/ppocr:1.0
docker push registry.cn-hongkong.aliyuncs.com/llapi/ppocr:1.0
Предыдущий процесс представляет собой создание базовой среды выполнения для paddle. Таким образом, можно использовать этот базовый образ для развёртывания любой модели paddle в будущем.
FROM registry.cn-hongkong.aliyuncs.com/llapi/pphub:base
COPY PaddleOCR /PaddleOCR
WORKDIR /PaddleOCR
RUN mkdir -p /PaddleOCR/inference/
ADD https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar /PaddleOCR/inference/
RUN tar xf /PaddleOCR/inference/ch_ppocr_mobile_v2.0_det_infer.tar -C /PaddleOCR/inference/
ADD https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar /PaddleOCR/inference/
RUN tar xf /PaddleOCR/inference/ch_ppocr_mobile_v2.0_cls_infer.tar -C /PaddleOCR/inference/
ADD https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar /PaddleOCR/inference/
RUN tar xf /PaddleOCR/inference/ch_ppocr_mobile_v2.0_rec_infer.tar -C /PaddleOCR/inference/
RUN hub install deploy/hubserving/ocr_system/
RUN hub install deploy/hubserving/ocr_cls/
RUN hub install deploy/hubserving/ocr_det/
RUN hub install deploy/hubserving/ocr_rec/
EXPOSE 9000
CMD ["/bin/bash","-c","hub serving start --modules ocr_system ocr_cls ocr_det ocr_rec -p 9000"]
Обратите внимание, что данный текст является переводом исходного текста и может содержать неточности или ошибки. Необходимо отправить образ Docker в репозиторий образов соответствующей платформы.
Здесь в качестве примера рассматривается репозиторий образов контейнеров Alibaba Cloud.
Пожалуйста, самостоятельно измените параметры отправки. Здесь представлена команда моего аккаунта:
docker commit testppocr paddlehub_ppocr:1.0
docker tag paddlehub_ppocr:1.0 registry.cn-hongkong.aliyuncs.com/llapi/ppocr:1.0
docker push registry.cn-hongkong.aliyuncs.com/llapi/ppocr:1.0
Развёртывание на платформе Alibaba Cloud Function Compute
В консоли управления Alibaba Cloud Function Compute создайте новую службу, создайте функцию и заполните информацию, как показано ниже. После создания функции свяжите её с доменом, чтобы предоставить API для распознавания интерфейса.
Адрес образа контейнера: registry.cn-hongkong.aliyuncs.com/llapi/ppocr:1.0
Команда запуска: ["sh","/PaddleOCR/start.sh"]
Необходимо связать домен.
Распознаваемый адрес: http://связанный домен/predict/ocr_system
Рисунок 2
Рисунок 3
Развертывание на платформе Tencent Cloud Function
Здесь уже подготовлен доступный образ.
На платформе Tencent Cloud Function Console необходимо отправить образ в собственный репозиторий изображений, а затем создать облачную функцию, чтобы обеспечить API распознавания интерфейса.
docker pull duolabmeng666/paddlehub_ppocr:1.2
docker tag duolabmeng666/paddlehub_ppocr:1.2 ccr.ccs.tencentyun.com/llapixxx/ppocr:1.2
docker push ccr.ccs.tencent.com/llapixxx/ppocr:1.2
После отправки изображения в Tencent Cloud можно создать облачную функцию. Распознаваемый адрес будет выглядеть следующим образом: https://созданная облачная функция.gz.apigw.tencentcs.com/release/predict/ocr_system
.
Поскольку файлы в контейнере облачной функции Tencent ограничены и разрешают доступ только к /tmp
, необходимо изменить код для поддержки развёртывания облачных функций.
Решение проблемы
Анализ файлов, записанных в образе Docker
Запустите подготовленный образ на своём компьютере.
docker run -itd --name ppocr -p 9000:9000 ccr.ccs.tencent.com/llapi/pphubocr:1.0
Просмотрите информацию о различиях файлов и обнаружите, что после запуска в каталоге, отличном от /tmp
, были выполнены операции записи файлов. Поэтому контейнер не может быть запущен в облачной функции. Теперь необходимо переместить пути обработки в каталог /tmp
.
docker diff ppocr
C /root
C /root/.paddlehub
C /root/.paddlehub/conf
A /root/.paddlehub/conf/serving_9000.json
C /root/.paddlehub/log
A /root/.paddlehub/log/HubServing-2021_08_12.log
Изучив исходный код, вы обнаружите, что файл ./tx/env.py
контролирует каталог, в который записываются эти файлы. Скопируйте файл и поместите его в ./tx/env.py
, а затем добавьте следующий код в конец файла.
CONF_HOME = "/tmp"
LOG_HOME = "/tmp"
TMP_HOME = "/tmp"
Создание файла Dockerfile
Создайте файл Dockerfile_TX
в корневом каталоге проекта.
FROM ccr.ccs.tencentyun.com/llapi/pphubocr:1.0
WORKDIR /PaddleOCR
COPY ./tx/env.py /usr/local/lib/python3.7/site-packages/paddlehub/env.py
CMD ["/bin/bash","-c","hub serving start --modules ocr_system ocr_cls ocr_det ocr_rec -p 9000"]
Сборка образа и тестирование
docker build -f ./Dockerfile_TX -t paddlehub_ppocr:1.0 .
docker rm -f ppocr
docker run -itd --name ppocr -p 9000:9000 paddlehub_ppocr:1.0
docker logs ppocr
docker diff ppocr
Вы увидите, что в образе всё ещё существуют файлы, которые могут быть прочитаны и записаны вне каталога /tmp
. Однако эти файлы не будут доступны для чтения и записи после сохранения образа. Поэтому достаточно сохранить и отправить образ.
docker diff ppocr
C /usr
C /usr/local
C /usr/local/lib
C /usr/local/lib/python3.7
C /usr/local/lib/python3.7/site-packages
C /usr/local/lib/python3.7/site-packages/paddlehub
C /usr/local/lib/python3.7/site-packages/paddlehub/__pycache__
C /usr/local/lib/python3.7/site-packages/paddlehub/__pycache__/env.cpython-37.pyc
C /tmp
A /tmp/HubServing-2021_08_12.log
A /tmp/cache.yaml
A /tmp/config.yaml
A /tmp/serving_9000.json
Упаковка и отправка образа
# Сохранить образ
docker commit ppocr ccr.ccs.tencent.com/llapi/pphubocr:1.2
# Проверить, есть ли проблемы с этим образом. Если нет проблем, можно отправить его.
docker rm -f ppocr
docker run -itd --name ppocr -p 9000:9000 ccr.ccs.tencent.com/llapi/pphubocr:1.2
docker logs ppocr
docker diff ppocr
# После проверки того, что образ не имеет проблем, отправьте образ.
docker push ccr.ccs.tencent.com/llapi/pphubocr:1.2
Создайте облачную функцию в Tencent
Выберите образ и разверните его напрямую, чтобы получить распознаваемый адрес.
Рисунок 4
Рисунок 5
Использование Serverless Devs для развёртывания на платформе Alibaba Cloud Function Computing
Serverless Devs — это открытая платформа для разработчиков Serverless. Вам не нужно беспокоиться о базовых ресурсах. С помощью Serverless Devs вы можете использовать услуги и фреймворки Serverless по принципу «подключи и работай», а также участвовать в разработке компонентов и плагинов для повышения эффективности эксплуатации. Кроме того, вы можете более просто, быстро и эффективно разрабатывать, создавать, тестировать и развёртывать проекты, а также управлять проектами на протяжении всего жизненного цикла.
Установите Serverless Devs.
npm install @serverless-devs/s -g
Настройте Serverless Devs (на примере конфигурации с использованием ключа Alibaba Cloud).
Перейдите в каталог проекта deploy\aliyun_fc
.
# Перейдите в каталог
cd deploy\aliyun_fc
# Введите команду и следуйте инструкциям для добавления ключа Alibaba Cloud
s config add
# Разверните ppocr
s deploy
Рисунок 7
После успешного выполнения вы получите распознаваемый адрес, например http://ppocr.ppocr.создать.cn-shenzhen.fc.devsapp.net/predict/ocr_system
. Опыт применения
Рекомендуется посмотреть видео, затем скачать проект todolist-app и внести изменения.
https://github.com/devsapp/start-web-framework/tree/master/example/todolist-app
s cli registry login # авторизоваться один раз
s cli registry publish # опубликовать пакет
s cli registry list # просмотреть опубликованные пакеты на дочерней машине
s init PaddleOCR # протестировать приложение
s deploy # развернуть проект
Использование серверной модели
Измените файл dockerfile следующим образом:
RUN mkdir -p /PaddleOCR/inference/
ADD https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar /PaddleOCR/inference/
RUN tar xf /PaddleOCR/inference/ch_ppocr_mobile_v2.0_det_infer.tar -C /PaddleOCR/inference/
ADD https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar /PaddleOCR/inference/
RUN tar xf /PaddleOCR/inference/ch_ppocr_mobile_v2.0_cls_infer.tar -C /PaddleOCR/inference/
ADD https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_rec_infer.tar /PaddleOCR/inference/
RUN tar xf /PaddleOCR/inference/ch_ppocr_server_v2.0_rec_infer.tar -C /PaddleOCR/inference/
\PaddleOCR\deploy\hubserving\ocr_rec\params.py
# cfg.rec_model_dir = "./inference/ch_ppocr_mobile_v2.0_rec_infer/"
cfg.rec_model_dir = "./inference/ch_ppocr_server_v2.0_rec_infer/"
\PaddleOCR\deploy\hubserving\ocr_system\params.py
# cfg.rec_model_dir = "./inference/ch_ppocr_mobile_v2.0_rec_infer/"
cfg.rec_model_dir = "./inference/ch_ppocr_server_v2.0_rec_infer/"
Заключение
Развёртывание моделей глубокого обучения в архитектуре Serverless становится очень простым и обеспечивает бесконечную параллельную поддержку. Мы можем развернуть образы в различных сервисах Serverless и предоставить стабильные, надёжные и эластичные услуги по анализу данных.
Что касается создания образов, официальные образы Docker от PaddlePaddle имеют большой размер — 4 ГБ или 8 ГБ, что делает их непригодными для использования в Serverless.
Созданный образ имеет размер всего 564 МБ, что идеально подходит для развёртывания в архитектуре Serverless.
Благодарности
Спасибо за техническую поддержку от следующих компаний:
Рекомендованные книги
«Практика Serverless: от начала до продвинутого уровня» (https://item.jd.com/13366562.html).
Автор статьи
Много Лабмэн (Duolabmeng6) на GitHub (https://github.com/duolabmeng6).
При перепечатке статьи укажите источник. Спасибо!
Пожертвования
Если вы считаете, что статья была вам полезна, можете поддержать автора чашкой кофе.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )