Browse Source

工作线程修改到ChannelData内前版本(尽量独立)

zfbox
张龙 8 months ago
parent
commit
7879ffc1af
  1. 2
      .idea/FristProject.iml
  2. 11
      .idea/deployment.xml
  3. 2
      .idea/misc.xml
  4. 2
      core/ChannelManager.py
  5. 45
      core/ModelManager.py
  6. 7
      model/plugins/ModelBase.py
  7. BIN
      zfbox.db

2
.idea/FristProject.iml

@ -2,7 +2,7 @@
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="jdk" jdkName="Remote Python 3.9.2 (sftp://root@192.168.3.103:22/usr/local/miniconda3/bin/python)" jdkType="Python SDK" />
<orderEntry type="jdk" jdkName="Remote Python 3.9.2 (sftp://root@192.168.3.104:22/usr/local/miniconda3/bin/python)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

11
.idea/deployment.xml

@ -1,8 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PublishConfigData" autoUpload="Always" serverName="root@192.168.3.103:22" remoteFilesAllowedToDisappearOnAutoupload="false">
<component name="PublishConfigData" autoUpload="Always" serverName="root@192.168.1.100:22" remoteFilesAllowedToDisappearOnAutoupload="false">
<serverData>
<paths name="root@192.168.3.103:22">
<paths name="root@192.168.1.100:22">
<serverdata>
<mappings>
<mapping deploy="/tmp/pycharm_project_725" local="$PROJECT_DIR$" />
</mappings>
</serverdata>
</paths>
<paths name="root@192.168.3.104:22">
<serverdata>
<mappings>
<mapping deploy="/mnt/zfbox" local="$PROJECT_DIR$" />

2
.idea/misc.xml

@ -3,7 +3,7 @@
<component name="Black">
<option name="sdkName" value="PyTorch" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Remote Python 3.9.2 (sftp://root@192.168.3.103:22/usr/local/miniconda3/bin/python)" project-jdk-type="Python SDK" />
<component name="ProjectRootManager" version="2" project-jdk-name="Remote Python 3.9.2 (sftp://root@192.168.3.104:22/usr/local/miniconda3/bin/python)" project-jdk-type="Python SDK" />
<component name="PyCharmProfessionalAdvertiser">
<option name="shown" value="true" />
</component>

2
core/ChannelManager.py

@ -108,8 +108,6 @@ class ChannelData:
execution_time = end_time - start_time
print(f"停止一个通道线程,花费了: {execution_time} seconds")
def stop_run(self):
self.bool_run = False
class ChannelManager:

45
core/ModelManager.py

@ -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):

7
model/plugins/ModelBase.py

@ -89,7 +89,6 @@ class ModelBase(ABC):
# print('ACL finalize Successfully')
def init_acl_resource(self):
#self._init_acl() #测试使用
''' 初始化模型、输出相关资源。相关数据类型: aclmdlDesc aclDataBuffer aclmdlDataset'''
print("Init model resource")
# 加载模型文件
@ -144,6 +143,7 @@ class ModelBase(ABC):
if ret == FAILED:
self._release_dataset(self.input_dataset) # 失败时释放dataset
self.input_dataset = None
return ret
#print("[Model] create model input dataset success")
def _unpack_bytes_array(self, byte_array, shape, datatype):
@ -195,7 +195,10 @@ class ModelBase(ABC):
def execute(self, input_list):
'''创建输入dataset对象, 推理完成后, 将输出数据转换为numpy格式'''
self._gen_input_dataset(input_list) # 创建模型输入dataset结构
ret = self._gen_input_dataset(input_list) # 创建模型输入dataset结构
if ret == FAILED:
self.mylogger.error(f"_gen_input_dataset fail!--{ret}")
return None
ret = acl.mdl.execute(self.model_id, self.input_dataset, self.output_dataset) # 调用离线模型的execute推理数据
if ret:
self.mylogger.error(f"acl.mdl.execute fail!--{ret}")

BIN
zfbox.db

Binary file not shown.
Loading…
Cancel
Save