引言
下面展示的是我们智能车运行过程中的推理后端服务,通过该服务实现图像的实时推理处理。本部分记录了推理后端服务的详细步骤和代码示例。
推理后端服务
推理后端服务是智能车实现实时图像处理的重要组成部分。该服务通过多线程和zmq通信实现多个推理任务的并行处理。以下是实现该功能的代码。
-
导入必要的库 首先,我们需要导入相关库:
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
用于时间控制。
-
定义推理服务器类 编写
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服务。
-
定义推理处理函数 在
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
函数定义推理函数。
-
关闭推理服务 在
close
方法中,实现关闭推理服务的逻辑:
def close(self): print("closing...") self.flag_end = True for thread in self.threads_list: thread.join()
-
close
方法用于停止所有线程,并关闭推理服务。
-
主函数 编写主函数,启动推理服务器:
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通信实现多个推理任务的并行处理,为智能车的智能决策提供了强大的支持。