IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 基于SophonSDK的算法服务封装与打包参考流程(Python) -> 正文阅读

[Python知识库]基于SophonSDK的算法服务封装与打包参考流程(Python)

我们使用SophonSDK来移植算法和模型,并在X86主机的开发环境上封装和打包算法服务。这里以LPRNet车牌识别算法服务为例进行介绍。相关文件已上传至SOPHGO的demo目录下,主要流程包括以下几步:

1 封装算法服务

我们在x86文件下的main.py中封装了算法接口和HTTP服务。

1.1 算法封装

车牌识别算法比较简单,我们可以把整个算法流程封装到main.py中,并提供算法调用接口。

class LPRNet(object):
 ? ?...
if __name__ == "__main__":
 ? ?lprnet = LPRNet()

如果算法比较复杂,涉及多个模型,我们可以把算法的相关代码放至x86文件夹下,在main.py中提供算法调用接口即可。

1.2 服务封装

我们需要在SimpleHTTPRequestHandler中的do_POST函数下定义访问地址、请求方式、返回码、返回信息、调用算法接口、返回结果等。

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
 ? ?......
 ? ?def do_POST(self):#ip:port/lprnet
 ? ? ? ?path = str(self.path) ?# 获取请求的url
 ? ? ? ?if path == '/lprnet':
 ? ? ? ? ? ?content_length = int(self.headers['Content-Length'])
 ? ? ? ? ? ?body = self.rfile.read(content_length).decode('utf-8')
 ? ? ? ? ? ?print('body:',body)
 ? ? ? ? ? ?jsdata = json.loads(body)
 ? ? ? ? ? ?if 'image' not in jsdata:
 ? ? ? ? ? ? ? ?ret_json = {"Code":1,"Msg":"请求失败,未输入图片"}
 ? ? ? ? ? ? ? ?self.send_ret(ret_json)
 ? ? ? ? ? ? ? ?return
 ? ? ? ? ? ?image = jsdata['image']
 ? ? ? ? ? ?img = base64_to_cv2(image)
 ? ? ? ? ? ?if img is None:
 ? ? ? ? ? ? ? ?ret_json = {"Code":1,"Msg":"请求失败,图片读取失败"}
 ? ? ? ? ? ? ? ?self.send_ret(ret_json)
 ? ? ? ? ? ? ? ?return
 ? ? ? ? ? ?res = lprnet(img)[0] ? ? ? ? ? 
 ? ? ? ? ? ?ret_json = {"Code":0,"Msg":"请求成功","res":res}
 ? ? ? ? ? ?self.send_ret(ret_json)
 ? ? ? ?elif path == '/query':
 ? ? ? ? ? ?content_length = int(self.headers['Content-Length'])
 ? ? ? ? ? ?body = self.rfile.read(content_length).decode('utf-8')
 ? ? ? ? ? ?jsdata = json.loads(body)
 ? ? ? ? ? ?# if jsdata['name'] == 'font':
 ? ? ? ? ? ?ret_json = {'Code':0,'Msg':'请求成功','result':[{'url':'/lprnet','status':0}]}
 ? ? ? ? ? ?self.send_ret(ret_json)
 ? ? ? ?else:
 ? ? ? ? ? ?ret_json = {"Code":1,"Msg":"请求失败,url路径错误","res":''}
 ? ? ? ? ? ?self.send_ret(ret_json)

我们还需要设置HTTPServer的访问端口。

if __name__ == "__main__":
 ? ?lprnet = LPRNet()
 ? ?httpd = HTTPServer(('0.0.0.0', 9093), SimpleHTTPRequestHandler)
 ? ?httpd.serve_forever()

我们可以在main.sh中定义服务启动命令,并保存相关日志。

#!/bin/bash
python3 main.py >> log.txt 2>&1

1.3 服务测试

算法服务封装好后,我们可以在开发环境的容器中直接运行main.sh,启动服务。

然后在宿主机或其他连通的主机上调用该服务,主要修改访问的IP、端口、地址、请求值、获取返回值等,具体可参考test.py。

python3 test.py

2 准备镜像文件

服务测试通过后,我们需要在开发环境的容器中,将服务所需的文件,包括环境链接库、sail包、代码、模型等,统一拷贝到指定文件夹,方便后续打包服务镜像。具体可参考assemble_x86.sh,需要视情况修改脚本中的文件路径。

./assemble_x86.sh

3 打包服务镜像

3.1 修改Dockerfile

包括安装所需的工具和依赖库、将镜像文件夹添加到镜像中、设置启动命令等等。

FROM debian:9
# 尽量将所有的工具安装放到本层,以减少size
# 不需要的工具尽量移除,调试工具可以在docker中runtime安装,没有必要预装
RUN apt -y update \
 ? ?# && add-apt-repository ppa:deadsnakes/ppa \
 ?  && apt install -y python3 \
 ?  && apt install -y python3-pip \
 ?  && apt-get install ffmpeg libsm6 libxext6  -y
 
# Python依赖包在本层安装,并且请指明需要的版本号,以确保每次编译能编译出相同的镜像
RUN python3 -m pip install --upgrade pip \ ? ?
 ?  && pip3 install pybind11 \ ? ?
 ?  && pip3 install numpy \ ? 
 ?  && pip3 install requests \ ? 
 ?  && pip3 install Pillow \
 ?  && pip3 install urllib3 \
 ?  && pip3 install opencv-python
 ? 
# 设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
# 将镜像文件夹添加到镜像中
ADD x86  /avs_l1
# 安装sail包
RUN pip3 install /avs_l1/sophon-2.7.0-py3-none-any.whl
# 指定工作目录
WORKDIR /avs_l1
# 指定链接库路径
ENV LD_LIBRARY_PATH=.
# 设置启动命令
ENTRYPOINT ["./main.sh"]

3.2 打包服务镜像

然后,执行./build_docker_x86.sh进行服务镜像打包。需要进入到与镜像文件夹同级的目录中,主要修改dockerfile的相对路径、镜像名、镜像文件名。

# 进入到与镜像文件夹同级的目录中
cd ../../docker
# 创建docker镜像,通过-f指定dockerfile路径,-t指定镜像名
sudo docker build -f ../projects/lprnet_serve/Dockerfile_x86_sail -t avs_lprnet .
# 保存docker镜像,通过-o指定保存的文件名称
sudo docker save avs_lprnet -o avs_lprnet_x86.docker
# 修改镜像文件权限
sudo chmod 666 avs_lprnet_x86.docker
# 删除镜像
sudo docker rmi avs_lprnet ? ?

4 服务测试

第一步:加载服务镜像

docker load -i avs_lprnet_x86.docker

注意修改服务镜像路径。

第二步:创建镜像容器,启动服务

./run_docker.sh avs_lprnet:latest lprnet

注意修改镜像名(第1个参数)和容器名(第2个参数),可在脚本中自行更改容器端口映射。

第三步:服务调用与测试示例

sudo python3 test.py

注意修改测试脚本里面的测试图片路径、访问IP、端口、地址、请求值、获取返回值等。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:10:10  更:2022-09-13 11:11:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 9:44:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码