|
|
@ -31,16 +31,17 @@ class ModelManager: |
|
|
|
self.fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 使用 mp4 编码 |
|
|
|
#基于模型运行环境进行相应初始化工作 |
|
|
|
self.model_platform = myCongif.get_data("model_platform") |
|
|
|
self.device_id = myCongif.get_data("device_id") |
|
|
|
# acl初始化 -- 一个线程一个 -- 需要验证 |
|
|
|
# acl初始化 -- 一个线程一个 |
|
|
|
if self.model_platform == "acl": |
|
|
|
self.device_id = myCongif.get_data("device_id") |
|
|
|
ACLModeManger.init_acl(self.device_id) #acl -- 全程序初始化 |
|
|
|
self.model_dic = {} # model_id model |
|
|
|
#self.model_dic = {} # model_id model |
|
|
|
# 报警处理线程-全进程独立一个线程处理 |
|
|
|
self.warnM = None |
|
|
|
|
|
|
|
def __del__(self): |
|
|
|
self.logger.debug("释放资源") |
|
|
|
self.stop_work(0) #停止所有工作 |
|
|
|
del self.verify_list #应该需要深入的删除--待完善 |
|
|
|
if self.model_platform == "acl": |
|
|
|
ACLModeManger.del_acl(self.device_id) #acl -- 全程序反初始化 需要确保在执行析构前,其它资源已释放 |
|
|
@ -168,19 +169,22 @@ class ModelManager: |
|
|
|
buffer_bgr_webp = frame_bgr_webp.tobytes() |
|
|
|
return buffer_bgr_webp,img,warntext |
|
|
|
|
|
|
|
def dowork_thread(self,channel_id,model_data,schedule,m,verify_rate,warn_interval): |
|
|
|
def dowork_thread(self,channel_id,model_data,schedule,verify_rate,warn_interval): |
|
|
|
'''一个通道一个线程,关联的模型在一个线程检测,局部变量都是一个通道独有''' |
|
|
|
channel_data = self.verify_list.get_channel(channel_id) #是对ChannelData 对象的引用 |
|
|
|
context = None |
|
|
|
model = self._import_model("", model_data[5], model_data[8], model_data[9]) # 动态加载模型处理文件py |
|
|
|
if not model: |
|
|
|
print("实例化自定义模型文件出错,退出线程!") |
|
|
|
return |
|
|
|
# 线程ACL初始化 |
|
|
|
if self.model_platform == "acl": # ACL线程中初始化内容 |
|
|
|
context = ACLModeManger.th_inti_acl(self.device_id) |
|
|
|
#初始化模型资源 |
|
|
|
ret = m.init_acl_resource() |
|
|
|
#初始化模型资源 -- 加载模型文件 |
|
|
|
ret = model.init_acl_resource() |
|
|
|
if not ret: |
|
|
|
print("初始化模型资源出错,退出线程!") |
|
|
|
return |
|
|
|
channel_data.b_model = True |
|
|
|
result = [0 for _ in range(model_data[3] * verify_rate)] # 初始化时间*验证帧率数量的结果list |
|
|
|
proportion = model_data[4] # 判断是否报警的占比 |
|
|
|
|
|
|
@ -191,6 +195,7 @@ class ModelManager: |
|
|
|
#开始拉取画面循环检测 |
|
|
|
cap = channel_data.cap |
|
|
|
last_frame_time = time.time() #初始化个读帧时间 |
|
|
|
channel_data.b_model = True |
|
|
|
while channel_data.bool_run: #基于tag 作为运行标识。 线程里只是读,住线程更新,最多晚一轮,应该不用线程锁。需验证 |
|
|
|
# 帧率控制帧率 |
|
|
|
current_time = time.time() |
|
|
@ -203,7 +208,7 @@ class ModelManager: |
|
|
|
if not ret: |
|
|
|
continue #没读到画面继续 |
|
|
|
#执行图片推理 |
|
|
|
buffer_bgr_webp,img_bgr_ndarray,warn_text = self.verify(frame,m,model_data,channel_id,schedule,result) |
|
|
|
buffer_bgr_webp,img_bgr_ndarray,warn_text = self.verify(frame,model,model_data,channel_id,schedule,result) |
|
|
|
#分析图片放入内存中 |
|
|
|
channel_data.add_deque(img_bgr_ndarray) # 缓冲区大小由maxlen控制 超上限后,删除最前的数据 |
|
|
|
#channel_data.increment_counter() #帧序列加一 |
|
|
@ -250,15 +255,15 @@ class ModelManager: |
|
|
|
channel_data.b_model = False |
|
|
|
if self.model_platform == "acl": # ACL线程中初始化内容 |
|
|
|
try: |
|
|
|
m.release() #释放模型资源资源 |
|
|
|
model.release() #释放模型资源资源 |
|
|
|
# 删除模型对象 |
|
|
|
del model |
|
|
|
#释放context |
|
|
|
if context: # ACL线程中反初始化内容 -- 若线程异常退出,这些资源就不能正常释放了 |
|
|
|
# 再释放context |
|
|
|
ACLModeManger.th_del_acl(context) |
|
|
|
except Exception as e: |
|
|
|
print(e) |
|
|
|
#删除模型对象 |
|
|
|
del m |
|
|
|
#cv2.destroyAllWindows() |
|
|
|
print("线程结束!!!!") |
|
|
|
|
|
|
@ -293,7 +298,6 @@ class ModelManager: |
|
|
|
#3.启动工作线程 ************************** |
|
|
|
self.start_work_th(channel_id,c_data) |
|
|
|
|
|
|
|
|
|
|
|
# 启动告警线程 |
|
|
|
if self.warnM is None: |
|
|
|
self.warnM = WarnManager() |
|
|
@ -321,16 +325,13 @@ class ModelManager: |
|
|
|
f"from channel2model t1 left join model t2 on t1.model_id = t2.ID where t1.channel_id ={channel_id};") |
|
|
|
model_data = mDBM.do_select(strsql, 1) # 2024-7-12调整规则,一个通道只关联一个模型,表结构暂时不动 |
|
|
|
if model_data and model_data[0]: # 如果该通道关联了模型 |
|
|
|
# 基于基类实例化模块类 |
|
|
|
m = self._import_model("", model_data[5], model_data[8], model_data[9]) # 动态加载模型处理文件py |
|
|
|
if m: |
|
|
|
schedule = self.getschedule(model_data[6]) # 获取布防计划 |
|
|
|
# 数据准备OK-开始工作线程 |
|
|
|
c_data.bool_run = True |
|
|
|
c_data.work_th = threading.Thread(target=self.dowork_thread, |
|
|
|
args=(channel_id, model_data, schedule, m, verify_rate, |
|
|
|
warn_interval)) # 一个视频通道一个线程 |
|
|
|
c_data.work_th.start() |
|
|
|
schedule = self.getschedule(model_data[6]) # 获取布防计划 |
|
|
|
# 数据准备OK-开始工作线程 |
|
|
|
c_data.bool_run = True |
|
|
|
c_data.work_th = threading.Thread(target=self.dowork_thread, |
|
|
|
args=(channel_id, model_data, schedule, verify_rate, |
|
|
|
warn_interval)) # 一个视频通道一个线程 |
|
|
|
c_data.work_th.start() |
|
|
|
|
|
|
|
|
|
|
|
def restartC2M(self,channel_id): |
|
|
|