1019更新代码

V0.1.0
王莹 2 years ago
parent 95fde2086c
commit a051f44b9d

@ -2,6 +2,16 @@
from main_process import data_load from main_process import data_load
from analysis_data.config_load import get_configs from analysis_data.config_load import get_configs
from multiprocessing import Pool from multiprocessing import Pool
from loguru import logger
import os
import time
# 日志配置
log_path = os.path.join(__file__, "../logs/xbank.log")
logger.add(
log_path, rotation="60 MB", enqueue=True, backtrace=True, diagnose=True, retention=30
)
logger.info("*************************** xbank start ***************************")
def get_args_list(args_data): def get_args_list(args_data):
@ -18,19 +28,35 @@ def get_args_list(args_data):
return args_list return args_list
def start_worker(args_list):
while True:
try:
logger.info(f" process {args_list} crashed. Starting...")
if __name__ == "__main__": data_load(args_list)
except Exception as e:
logger.info(f" process {args_list} crashed. Restarting...")
logger.debug(e)
def main():
# 加载配置文件 # 加载配置文件
args = './config_det.yaml' args = '../config_det.yaml'
args_data = get_configs(yaml_files=args) args_data = get_configs(ymal_files=args)
args_list = get_args_list(args_data) args_list = get_args_list(args_data)
process_num = len(args_list) process_num = len(args_list)
print(f"args_list:{args_list}")
with Pool(process_num) as pool: with Pool(process_num) as pool:
pool.map(data_load, args_list) pool.map(start_worker, args_list)
if __name__ == "__main__":
main()

@ -3,25 +3,31 @@ from analysis_result.same_model_img import same_model_img_analysis_labels, model
from model_load.model_load import Load_model from model_load.model_load import Load_model
from drawing_img.drawing_img import drawing_frame from drawing_img.drawing_img import drawing_frame
from analysis_data.data_rtsp import rtsp_para from analysis_data.data_rtsp import rtsp_para
from analysis_data.data_dir_file import get_dir_file, get_imgframe from analysis_data.data_dir_file import get_dir_file
from analysis_data.config_load import get_configs from analysis_data.config_load import get_configs
from add_xml import add_xml from add_xml import add_xml
from create_xml import create_xml from create_xml import create_xml
from analysis_data.change_video import mp4_to_H264
import yaml
import cv2 import cv2
import os import os
from pathlib import Path
import time import time
from datetime import datetime from datetime import datetime
import glob
import json import json
from loguru import logger
import logging
import logstash
host = '192.168.10.96'
xbank_logger = logging.getLogger('python-logstash-logger')
xbank_logger.setLevel(logging.INFO)
xbank_logger.addHandler(logstash.LogstashHandler(host, 5959, version=1))
def data_load(args): def data_load(args):
# print('正在运行的进程',msg)
# print(args)
source = args[0] source = args[0]
model_ymal = args[1] model_ymal = args[1]
@ -38,189 +44,256 @@ def data_load(args):
if rtsp_source: if rtsp_source:
cap = cv2.VideoCapture(source) rtsp_detect_process(source=source, model_data=model_data,
model_inference=model_inference)
# 视频流信息 if dir_source:
fps = int(cap.get(cv2.CAP_PROP_FPS)) dir_source_process(source, model_inference, model_data)
fps_num = fps*model_data['detect_time']
fps_num_small = fps*model_data['detect_time_small']
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
try:
i = 0
j = 0
det_t_num = 0 if file_source:
nodet_t_num = 0
det_img = [] file_source_process(source, model_inference, model_data)
video_name_time = 0
det_fps_time = []
while True: def rtsp_detect_process(source, model_data, model_inference):
ret, frame = cap.read()
if not ret: cap = cv2.VideoCapture(source)
continue # 如果未成功读取到视频帧,则继续读取下一帧 logger.info(f"视频流{source}读取中...")
i = i + 1 # 视频流信息
j = j + 1 fps = int(cap.get(cv2.CAP_PROP_FPS))
fps_num = fps*model_data['detect_time']
fps_num_small = fps*model_data['detect_time_small']
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
# 读取到当前视频帧时间 i = 0
data_now = datetime.now() j = 0
get_time = str(data_now.strftime("%H")) + \ n = 0
str(data_now.strftime("%M")) + str(data_now.strftime("%S")) + \
str(data_now.strftime("%f"))
# 视频保存 det_t_num = 0
if video_name_time == 0: nodet_t_num = 0
video_name_time = get_time det_img = []
savePath = os.path.join(model_data['save_videos'], (str(data_now.strftime(
"%Y")) + str(data_now.strftime("%m")) + str(data_now.strftime("%d"))))
if not os.path.exists(savePath): video_name_time = 0
os.makedirs(savePath) det_fps_time = []
video_path = os.path.join( while True:
savePath, video_name_time + '.avi')
print('video_path:', video_path)
out_video = cv2.VideoWriter( try:
video_path, cv2.VideoWriter_fourcc(*'DIVX'), fps, size) ret, frame = cap.read()
print(source, data_now, i,j) i += 1
t1 = time.time() j += 1
imgframe_dict = {"path": source, # 读取到当前视频帧时间
'frame': frame, data_now = datetime.now()
'get_fps': j} get_time = str(data_now.strftime("%H")) + \
str(data_now.strftime("%M")) + str(data_now.strftime("%S")) + \
str(data_now.strftime("%f"))
images_det_result = img_process(imgframe_dict, imgframe_dict = {"path": source, 'frame': frame,
model_inference, 'get_fps': j, 'get_time': get_time}
model_data)
images_update = save_process(imgframe_dict, # 视频暂时保存路径
images_det_result, if video_name_time == 0:
model_data)
print('images_det_result:',len(images_det_result)) video_name_time = get_time
video_path = video_name(
video_name_base=video_name_time, save_path=model_data['save_videos'], save_file='temp')
if images_det_result: out_video = cv2.VideoWriter(
video_path, cv2.VideoWriter_fourcc(*"mp4v"), fps, size)
det_t_num = det_t_num + 1 logger.info(f"视频{video_path}已经暂时保存...")
# print(len(det_img)) # 模型推理
if len(det_img) == 0: images_det_result = img_process(
img_dict = images_update.copy() imgframe_dict, model_inference, model_data)
del img_dict['frame']
det_img.append(img_dict)
if not images_det_result and len(det_img) > 0: images_update = save_process(
imgframe_dict, images_det_result, model_data)
nodet_t_num = nodet_t_num + 1 # 结果判断t
if images_det_result:
if (det_t_num + nodet_t_num) >= fps_num_small: det_t_num += 1
para = determine_time(det_num=det_t_num, if len(det_img) == 0:
nodet_num=nodet_t_num, img_dict = images_update.copy()
ratio_set=model_data['detect_ratio']) det_img.append(img_dict)
if para: if not images_det_result and len(det_img) > 0:
first_fps_time = det_img[0] nodet_t_num += 1
print({"dert_fps": (j-int(first_fps_time['get_fps'])+1)})
first_fps_time.update({"dert_fps": (j-int(first_fps_time['get_fps'])+1)}) if (det_t_num + nodet_t_num) >= fps_num_small:
det_fps_time.append(first_fps_time)
para = determine_time(
det_num=det_t_num, nodet_num=nodet_t_num, ratio_set=model_data['detect_ratio'])
if para:
det_img.clear() first_fps_time = det_img[0]
det_t_num = 0 first_fps_time.update(
nodet_t_num = 0 {"dert_fps": (j-int(first_fps_time['get_fps'])+1)})
# print('det_img:', len(det_img), det_t_num, nodet_t_num) det_fps_time.append(first_fps_time)
out_video.write(images_update['frame']) det_img.clear()
det_t_num = 0
nodet_t_num = 0
if j >= fps_num: # 视频保存
out_video.write(images_update['frame'])
# 结果判断 T
if j >= fps_num:
try:
out_video.release() out_video.release()
if det_img:
first_fps_time = det_img[0] except Exception:
print({"dert_fps": (j-int(first_fps_time['get_fps'])+1)}) logger.exception(f"视频release失败")
first_fps_time.update({"dert_fps": (j-int(first_fps_time['get_fps'])+1)}) else:
det_fps_time.append(first_fps_time) logger.info("视频release成功")
print('det_fps_time:',det_fps_time) # T时间截至判断t时间结果。
if det_img:
if det_fps_time: para = determine_time(
re_list = json_get(time_list=det_fps_time,video_path=video_path) det_num=det_t_num, nodet_num=nodet_t_num, ratio_set=model_data['detect_ratio'])
json_save(re_list)
else: first_fps_time = det_img[0]
print(video_path) time_1 = (j-int(first_fps_time['get_fps'])+1)
os.remove(video_path)
print('clear videos')
det_fps_time.clear() if para and time_1 >= (fps_num_small/2):
video_name_time = 0
j = 0 first_fps_time.update(
{"dert_fps": (j-int(first_fps_time['get_fps'])+1)})
det_fps_time.append(first_fps_time)
print('det_fps_time:', len(det_fps_time), i, j) if det_fps_time:
# break det_fps_time = determine_duration(result_list=det_fps_time)
t2 = time.time()
tx = t2 - t1
print('检测一张图片的时间为:', tx)
# 转换后视频保存路径
save_video_name = os.path.basename(video_path)
only_video_name = save_video_name.split('.')[0]
save_video_path = os.path.join(model_data['save_videos'], (str(data_now.strftime(
"%Y")) + str(data_now.strftime("%m")) + str(data_now.strftime("%d"))))
save_video_path = os.path.join(
save_video_path, only_video_name)
# 路径
save_video = os.path.join(save_video_path, save_video_name)
json_path = os.path.join(
save_video_path, only_video_name + '.json')
images_path = os.path.join(save_video_path, 'images')
# 转换视频、保存视频
change_video = mp4_to_H264()
change_video.convert_byfile(video_path, save_video)
# 保存图片
update_det_fps = video_cut_images_save(
det_list=det_fps_time, images_path=images_path)
# print(update_det_fps)
# 保存json文件
re_list, result_lables = json_get(
time_list=update_det_fps, video_path=save_video, fps=fps)
result_path = json_save(re_list, json_path)
send_message(update_det_fps=update_det_fps, result_path=result_path,
source=source, result_lables=result_lables)
else:
# print(video_path)
os.remove(video_path)
logger.info(f"未检测到目标信息的视频{video_path}删除成功")
logger.info('开始信息重置')
det_img.clear()
det_fps_time.clear()
det_t_num = 0
nodet_t_num = 0
video_name_time = 0
j = 0
# print('det_fps_time:', det_fps_time,'det_img:',det_img)
# t2 = time.time()
# tx = t2 - t1
# logger.info(f'检测一张图片的时间为:{tx}.')
except Exception as e: except Exception as e:
# 处理异常或错误
print(str(e))
cap.release() logger.debug(f"读帧率失败{source}未读到...")
logger.debug(e)
cap.release()
cap = cv2.VideoCapture(source)
logger.info(f"摄像头{source}重新读取")
if dir_source: # break
def video_name(video_name_base, save_path, save_file):
img_ext = [".jpg", ".JPG", ".bmp"] video_name_base = video_name_base
video_ext = [".mp4", ".avi", ".MP4"]
img_list = get_dir_file(source, img_ext) savePath = os.path.join(save_path, save_file)
video_list = get_dir_file(source, video_ext)
if img_list: if not os.path.exists(savePath):
os.makedirs(savePath)
for img in img_list: video_path = os.path.join(
savePath, video_name_base + '.mp4')
t1 = time.time() return video_path
images = cv2.imread(img)
imgframe_dict = {"path": img, 'frame': images}
images_update = img_process( def dir_source_process(source, model_inference, model_data):
imgframe_dict, model_inference, model_data)
t2 = time.time() img_ext = [".jpg", ".JPG", ".bmp"]
tx = t2 - t1 video_ext = [".mp4", ".avi", ".MP4"]
print('检测一张图片的时间为:', tx)
if video_list: img_list = get_dir_file(source, img_ext)
video_list = get_dir_file(source, video_ext)
pass if img_list:
if file_source: for img in img_list:
img_para = True t1 = time.time()
images = cv2.imread(img)
if img_para: imgframe_dict = {"path": img, 'frame': images}
images = cv2.imread(source)
imgframe_dict = {"path": source, 'frame': images}
images_update = img_process( images_update = img_process(
imgframe_dict, model_inference, model_data) imgframe_dict, model_inference, model_data)
t2 = time.time()
tx = t2 - t1
print('检测一张图片的时间为:', tx)
if video_list:
pass
def file_source_process(source, model_inference, model_data):
img_para = True
if img_para:
images = cv2.imread(source)
imgframe_dict = {"path": source, 'frame': images}
images_update = img_process(
imgframe_dict, model_inference, model_data)
def img_process(images, model_inference, model_data): def img_process(images, model_inference, model_data):
@ -231,6 +304,8 @@ def img_process(images, model_inference, model_data):
confidence=model_data["model_parameter"]['confidence'], confidence=model_data["model_parameter"]['confidence'],
label_name_list=model_data["model_parameter"]['label_names']) label_name_list=model_data["model_parameter"]['label_names'])
# print(results)
# print(images['path']) # print(images['path'])
# 根据需要挑选标注框信息 # 根据需要挑选标注框信息
@ -247,17 +322,16 @@ def img_process(images, model_inference, model_data):
else: else:
determine_bbox = select_labels_list determine_bbox = select_labels_list
print(determine_bbox) # print(determine_bbox)
if model_data['model_parameter']['object_num_min'] : if model_data['model_parameter']['object_num_min']:
if len(determine_bbox) <= model_data["model_parameter"]['object_num_min']: if len(determine_bbox) >= model_data["model_parameter"]['object_num_min']:
print(len(determine_bbox))
determine_bbox.clear() determine_bbox.clear()
# logger.debug(f"正确获得检测后的信息{determine_bbox}...")
# 返回检测后结果 # 返回检测后结果
return determine_bbox return determine_bbox
@ -268,6 +342,10 @@ def save_process(images, determine_bbox, model_data):
images.update({"results": determine_bbox}) images.update({"results": determine_bbox})
if model_data['save_path_original']:
imgname_original = images_save(images=images,
save_path=model_data["save_path_original"])
img_save = drawing_frame( img_save = drawing_frame(
images_frame=images['frame'], result_list=determine_bbox) images_frame=images['frame'], result_list=determine_bbox)
@ -278,10 +356,6 @@ def save_process(images, determine_bbox, model_data):
imgname = images_save( imgname = images_save(
images=images, save_path=model_data["save_path"]) images=images, save_path=model_data["save_path"])
if model_data['save_path_original']:
imgname_original = images_save(images=images,
save_path=model_data["save_path_original"])
if model_data["save_annotations"]: if model_data["save_annotations"]:
if not os.path.exists(model_data["save_annotations"]): if not os.path.exists(model_data["save_annotations"]):
@ -315,22 +389,12 @@ def save_process(images, determine_bbox, model_data):
def images_save(images, save_path): def images_save(images, save_path):
# 保存时候时间为图片名 # 保存时候时间为图片名
# data_now = datetime.now()
# images_name = str(data_now.strftime("%Y")) + str(data_now.strftime("%m")) + str(data_now.strftime("%d")) + str(data_now.strftime("%H")) + \
# str(data_now.strftime("%M")) + str(data_now.strftime("%S")) + \
# str(data_now.strftime("%f")) + '.jpg'
# img_save_path = save_path + '/' + str(
# data_now.year) + '/' + str(data_now.month) + '_' + str(data_now.day) + '/'
img_save_path = os.path.join(save_path, str(images['path'].split('.')[-1]))
images_name = images['get_time'] + '.jpg' images_name = images['get_time'] + '.jpg'
# img_save_path = save_path + '/' + str(images['path'].split('.')[-1]) + '/'
# print(img_save_path) if not os.path.exists(save_path):
os.makedirs(save_path)
if not os.path.exists(img_save_path): full_name = os.path.join(save_path, images_name)
os.makedirs(img_save_path)
full_name = os.path.join(img_save_path, images_name)
cv2.imwrite(full_name, images['frame']) cv2.imwrite(full_name, images['frame'])
@ -360,41 +424,49 @@ def determine_time(det_num, nodet_num, ratio_set):
ratio = det_num / (det_num + nodet_num) ratio = det_num / (det_num + nodet_num)
print(det_num, nodet_num, ratio)
if ratio >= ratio_set: if ratio >= ratio_set:
return True return True
else: else:
return False return False
def video_synthesis(imglist, savePath, size, fps, videoname): def determine_duration(result_list):
i = 0
if not os.path.exists(savePath): while i < len(result_list) - 1:
os.makedirs(savePath) dict_i = result_list[i]
dict_j = result_list[i + 1]
if 'get_fps' in dict_i and 'dert_fps' in dict_i and 'get_fps' in dict_j:
num_i = int(dict_i['get_fps'])
dura_i = int(dict_i['dert_fps'])
num_j = int(dict_j['get_fps'])
print(videoname) if num_i + dura_i == num_j:
video_path = os.path.join(savePath, videoname + '.avi') dura_j = int(dict_j['dert_fps'])
out = cv2.VideoWriter( dura_update = dura_i + dura_j
video_path, cv2.VideoWriter_fourcc(*'DIVX'), fps, size)
dict_i['dert_fps'] = dura_update
result_list.pop(i + 1)
else:
i += 1
else:
i += 1
sorted_list = sorted(imglist, key=lambda x: x['get_time']) return result_list
for filename in sorted_list: # print('2:', result_list)
out.write(filename['frame'])
out.release()
def json_get(time_list,video_path): def json_get(time_list, video_path, fps):
result_dict = {'video_path':video_path} result_dict = {'info': {'video_path': video_path, 'fps': fps}}
for i,det_dict in enumerate(time_list): re_dict = {}
for i, det_dict in enumerate(time_list):
list_hands = ["Keypad","hands","keyboard", "mouse","phone"] list_hands = ["Keypad", "hands", "keyboard", "mouse", "phone"]
list_sleep = ["person","sleep"] list_sleep = ["sleep"]
list_person = ["person"]
if list(det_dict['results'][0].keys())[0] in list_hands: if list(det_dict['results'][0].keys())[0] in list_hands:
@ -404,39 +476,59 @@ def json_get(time_list,video_path):
result_lables = "sleep" result_lables = "sleep"
fps_dict = {'time': det_dict['get_fps'],'duration':det_dict['dert_fps'],'result':result_lables} if list(det_dict['results'][0].keys())[0] in list_person:
result_dict.update({('id_'+ str(i)):fps_dict})
return result_dict
# def json_analysis(re_list): result_lables = "person"
# update_list = [] fps_dict = {'time': det_dict['get_fps'],
# copy_list = [x for x in re_list not in update_list] 'duration': det_dict['dert_fps'],
'images_path': det_dict['images_path']}
# for i in range(len(copy_list)-1): re_dict.update({('id_' + str(i)): fps_dict})
# j = i + 1 result_dict.update({'result': re_dict})
# re_i = int(re_list[i]['fps']) return result_dict, result_lables
# re_i_add = int(re_list[i]['dert_fps'])
# re_j = int(re_list[j]['fps'])
# if re_i + re_i_add == re_j:
# update_list.append(re_i,re_j) def json_save(result_dict, json_path):
# print()
def json_save(result_dict): result = json.dumps(result_dict)
json_path = result_dict['video_path'].split('.')[0] + '.json' f = open(json_path, 'w')
del result_dict['video_path']
result = json.dumps(result_dict)
f = open(json_path,'w')
f.write(result + '\n') f.write(result + '\n')
f.close f.close
return json_path
def video_cut_images_save(det_list, images_path):
for det_dict in det_list:
images_path_full = images_save(images=det_dict, save_path=images_path)
del det_dict['frame']
del det_dict['get_time']
det_dict.update({'images_path': images_path_full})
return det_list
def send_message(update_det_fps, result_path, source, result_lables):
for det_dict in update_det_fps:
extra = {
'worker': 'xbank',
'time': det_dict['get_fps'],
'config_file': result_path,
'source': source,
'type': result_lables
}
xbank_logger.info('xBank_infer', extra=extra)
logger.info(f'发送信息{extra}')
# if __name__ == '__main__': # if __name__ == '__main__':

Loading…
Cancel
Save