【山东大学软件学院 21 级项目实训】后端推理实现

引言

下面展示的是我们智能车运行过程中的推理后端服务,通过该服务实现图像的实时推理处理。本部分记录了推理后端服务的详细步骤和代码示例。

推理后端服务

推理后端服务是智能车实现实时图像处理的重要组成部分。该服务通过多线程和zmq通信实现多个推理任务的并行处理。以下是实现该功能的代码。

  1. 导入必要的库 首先,我们需要导入相关库:

import zmq, json, cv2
import numpy as np
from threading import Thread
from infer_front import ClintInterface
import time
  • zmq 用于实现消息队列通信。

  • json 用于处理JSON格式的数据。

  • cv2 用于图像处理。

  • numpy 用于数值计算。

  • Thread 用于多线程操作。

  • ClintInterface 用于导入推理客户端的配置。

  • time 用于时间控制。

  1. 定义推理服务器类 编写 InferServer 类,初始化推理服务和模型,并启动后台线程处理推理任务:

class InferServer:
    def __init__(self):
        # 导入推理客户端的配置
        configs = ClintInterface.configs
        
        self.flag_infer_initok = False
        self.flag_end = False
        self.threads_list = []
        self.server_dict = {}
​
        for conf in configs:
            server = self.get_server(conf['port'])
            self.server_dict[conf['name']] = server
            thread_tmp = Thread(target=self.process_demo, args=(conf['name'],))
            thread_tmp.daemon = True
            thread_tmp.start()
            self.threads_list.append(thread_tmp)
        
        from paddle_jetson import YoloeInfer, LaneInfer, OCRReco, HummanAtrr, MotHuman
        self.infer_dict = {}
        for conf in configs:
            infer_tmp = eval(conf['infer_type'])(*conf['params'])
            self.infer_dict[conf['name']] = infer_tmp
​
        img = np.zeros((240, 240, 3), np.uint8)
        for i in range(3):
            for conf in configs:
                infer_tmp = self.infer_dict[conf['name']]
                infer_tmp(img)
        print("infer init ok")
​
        self.flag_infer_initok = True
​
    def get_server(self, port):
        context = zmq.Context()
        socket = context.socket(zmq.REP)
        socket.bind(f"tcp://127.0.0.1:{port}")
        return socket
  • __init__ 方法初始化推理客户端配置、推理服务和模型。

  • get_server 方法创建并绑定zmq服务。

  1. 定义推理处理函数process_demo 方法中,实现推理任务的处理逻辑:

def process_demo(self, name):
    print(time.strftime("%Y-%m-%d %H:%M:%S"), "{} process start".format(name))
    server = self.server_dict[name]
    func = lambda x: self.infer_dict[name](x, True)
​
    while True:
        if self.flag_end:
            return
        response = server.recv()
        head = response[:5]
        res = []
        if head == b"ATATA":
            res = self.flag_infer_initok
        elif head == b"image":
            img = cv2.imdecode(np.frombuffer(response[5:], dtype=np.uint8), 1)
            if self.flag_infer_initok:
                res = func(img)
        json_data = json.dumps(res)
        json_data = bytes(json_data, encoding='utf-8')
        server.send(json_data)
  • process_demo 方法处理接收到的消息,执行对应的推理任务,并返回结果。

  • 使用 lambda 函数定义推理函数。

  1. 关闭推理服务close 方法中,实现关闭推理服务的逻辑:

def close(self):
    print("closing...")
    self.flag_end = True
    for thread in self.threads_list:
        thread.join()
  • close 方法用于停止所有线程,并关闭推理服务。

  1. 主函数 编写主函数,启动推理服务器:

def main():
    infer_back = InferServer()
    while True:
        try:
            time.sleep(1)
        except Exception as e:
            print(e)
            break
    time.sleep(0.1)
    infer_back.close()
​
if __name__ == "__main__":
    main()
  • __name__ == "__main__" 判断用于确保代码在作为脚本执行时运行 InferServer 类实例。

总结

通过以上代码,智能车实现了实时推理后端服务。该服务通过多线程和zmq通信实现多个推理任务的并行处理,为智能车的智能决策提供了强大的支持。

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值