0810新增保存检测结果,新增画图标注部分

V0.1.0
王莹 2 years ago
parent aa28edf88f
commit af2a1868d4

@ -1,5 +1,6 @@
import cv2
import os
from deepdiff import DeepDiff
@ -37,8 +38,8 @@ def get_video_list(path):
# cap.release()
# 截取裁剪需要的视频帧
def save_seg_video(video_name,frameToStart,frametoStop,videoWriter,bbox):
# 截取裁剪需要的视频帧
def save_seg_video(video_name,frameToStart,frametoStop,videoWriter,bbox,size):
cap = cv2.VideoCapture(video_name)
count = 0
@ -50,10 +51,14 @@ def save_seg_video(video_name,frameToStart,frametoStop,videoWriter,bbox):
# print('correct= ', count)
#裁剪视频画面
frame_target = frame[int(bbox[1]):int(bbox[3]), int(bbox[0]):int(bbox[2])] # (split_height, split_width)
frame_target = cv2.resize(frame_target,(200,200))
videoWriter.write(frame_target)
frame_target = frame[bbox[1]:bbox[3], bbox[0]:bbox[2]] # (split_height, split_width)
try:
frame_target = cv2.resize(frame_target,size)
videoWriter.write(frame_target)
except Exception as e:
print('----------------------------------',size,'----------------------------------')
print(e)
if not success or count >= frametoStop:
break
@ -61,8 +66,6 @@ def save_seg_video(video_name,frameToStart,frametoStop,videoWriter,bbox):
videoWriter.release()
cap.release()
# 获得字典中所有values值这个值是列表
def get_dict_values(lst):
@ -224,6 +227,35 @@ def para_correction(images_size,bbox,dertpara):
bbox_list = [bbox_list_x[0],bbox_list_y[0],bbox_list_x[1],bbox_list_y[1]]
return bbox_list
def para_correction_back(x1, y1, x2, y2):
'''
修正检测后标注框还原
'''
# if dertpara:
# pass
# else:
# x1, y1, x2, y2 = bbox[0], bbox[1],bbox[2],bbox[3] # 原始坐标
width = x2 - x1
height = y2 - y1
scaled_width = int(width * 1.2)
scaled_height = int(height * 1.2)
restored_width = int(scaled_width / 1.2)
restored_height = int(scaled_height / 1.2)
restored_x1 = x1 + (width - restored_width) // 2
restored_y1 = y1 + (height - restored_height) // 2
restored_x2 = restored_x1 + restored_width
restored_y2 = restored_y1 + restored_height
bbox_list = [restored_x1,restored_y1,restored_x2,restored_y2]
return bbox_list
def para_list_correction(images_size,bbox_list,dertpara):
@ -350,4 +382,12 @@ def select_bbox(bbox_list):
# print('bbox_list:',bbox_list_return)
return bbox_list_return
# 对比两字典中的值是否完全一致
def compare_dicts(dict1, list_of_dicts):
for d in list_of_dicts:
diff = DeepDiff(dict1, d)
if not diff:
return False
return True

@ -0,0 +1,79 @@
import cv2
import json
import os
def draw_video(video_path,labels_file,video_save):
cap = cv2.VideoCapture(video_path)
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
size = (width,height)
video_basename = os.path.basename(video_path)
labels_pptsm_list = ["Nodding",'Not_Playing_Mobile','Not_sleet','Playing_Mobile','slppe']
with open(labels_file, "r") as json_file:
data_dict = json.load(json_file)
labels_list = data_dict['big_dict']
video_save_file = video_save
os.makedirs(video_save_file, exist_ok=True)
video_save_path = os.path.join(video_save_file, video_basename)
videoWriter =cv2.VideoWriter(video_save_path,cv2.VideoWriter_fourcc('X','V','I','D'),fps,size)
count_fps = 0
while cap.isOpened():
success, frame = cap.read()
print('count_fps:',count_fps)
if not success:
print(video_path,"Ignoring empty camera frame.")
# print('video_fps:',video_fps,'count_fps:',count_fps)
break
re_anno_list = get_bbox_list(count_fps=count_fps,bbox_dict_list=labels_list)
for re_dic in re_anno_list:
re_txt = re_dic[0]
re_bbox = re_dic[1]
cv2.rectangle(frame, (int(re_bbox[0]), int(re_bbox[1])),(int(re_bbox[2]), int(re_bbox[3])), (0, 255, 255), 2)
cv2.putText(frame, re_txt, (int(re_bbox[0]) - 10, int(re_bbox[1]) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)
if re_txt != 'person':
re_txt_1 = labels_pptsm_list[int(re_txt)]
cv2.putText(frame, re_txt_1, (int(50), (int(50) + int(re_txt)*30)), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 255), 3)
videoWriter.write(frame)
count_fps += 1
videoWriter.release()
cap.release()
def get_bbox_list(count_fps,bbox_dict_list):
re_list = []
for i,bbox_dict in enumerate(bbox_dict_list):
startfps = int(bbox_dict['startfps'])
stopfps = int(bbox_dict['stopfps'])
if count_fps in range(startfps,stopfps):
labels = bbox_dict['labels']
bbox_list = bbox_dict['bbox']
re_list.append([labels,bbox_list])
return re_list
if __name__ == '__main__':
draw_video(video_path='E:/Bank_files/Bank_02/dataset/video_kf/02.mp4',
labels_file='E:/Bank_files/Bank_02/process_file/test_video/02.json',
video_save='E:/Bank_files/Bank_02/process_file/test_video')

@ -15,6 +15,7 @@ from holisticDet import MediapipeProcess
import mediapipe_detection_image
from PP_TSMv2_infer import PP_TSMv2_predict
import shutil
import json
@ -43,6 +44,7 @@ class DealVideo():
self.cutbboxQueue = queue.Queue(maxsize=0)
self.videodetQueue = queue.Queue(maxsize=0)
self.videoQueue3 = queue.Queue(maxsize=0)
self.videoreturnQueue = queue.Queue(maxsize=0)
#线程
self.get_video_listThread = threading.Thread(target=self.get_video_list)
@ -51,6 +53,7 @@ class DealVideo():
self.head_hands_detThread = threading.Thread(target=self.head_hands_det)
self.video_select_dectThread = threading.Thread(target=self.video_select_dect)
self.select_video_pathThread = threading.Thread(target=self.select_video_path)
self.analysis_return_meassageThread = threading.Thread(target=self.analysis_return_meassage)
@ -87,16 +90,15 @@ class DealVideo():
else:
t1 = time.time()
video_path = self.videoQueue.get()
# video_basename = os.path.basename(video_path).split('.')[0]
print('video_path:',video_path)
# print('video_path:',video_path)
cap = cv2.VideoCapture(video_path)
video_fps = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
# frame_list = []
count_fps = 0
frame_result_contact = []
@ -106,7 +108,7 @@ class DealVideo():
success, frame = cap.read()
if not success:
print(video_path,"Ignoring empty camera frame.")
print('video_fps:',video_fps,'count_fps:',count_fps)
# print('video_fps:',video_fps,'count_fps:',count_fps)
break
@ -143,7 +145,7 @@ class DealVideo():
label_name='person',
video_path=video_path,
frame_result_contact=frame_result_contact,
parameter_fps=200,
parameter_fps=50,
count_fps_del=count_fps_del,
video_end=video_end
)
@ -152,11 +154,9 @@ class DealVideo():
count_fps += 1
def head_hands_det(self):
print('head_hands_detaohgaogh')
# print('head_hands_detaohgaogh')
while True:
@ -169,7 +169,7 @@ class DealVideo():
video_path = self.videoQueue3.get()
print('video_path_head_hands_det:',video_path)
# print('video_path_head_hands_det:',video_path)
cap = cv2.VideoCapture(video_path)
video_fps = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
@ -186,7 +186,7 @@ class DealVideo():
success, frame = cap.read()
if not success:
print(video_path,"Ignoring empty camera frame.")
print('count_fps:',count_fps,'video_fps:',video_fps)
# print('count_fps:',count_fps,'video_fps:',video_fps)
break
# print('count_fps_read_video=',count_fps)
@ -206,7 +206,7 @@ class DealVideo():
if count_fps == (video_fps - 1):
print('count_fps:',count_fps,'video_fps:',video_fps)
# print('count_fps:',count_fps,'video_fps:',video_fps)
video_end = True
else:
@ -228,7 +228,7 @@ class DealVideo():
label_name='head',
video_path=video_path,
frame_result_contact=head_result_contact,
parameter_fps=50,
parameter_fps=25,
count_fps_del=count_fps_del_head,
video_end=video_end
)
@ -250,7 +250,7 @@ class DealVideo():
label_name='hands',
video_path=video_path,
frame_result_contact=hands_result_contact,
parameter_fps=50,
parameter_fps=25,
count_fps_del=count_fps_del_hand,
video_end=video_end
)
@ -284,6 +284,8 @@ class DealVideo():
os.rename(video_path, video_save)
self.videoreturnQueue.put(video_save)
print("result_list_video_select_dect:",result_list)
except Exception as e:
@ -331,7 +333,6 @@ class DealVideo():
# continue_para = False
if not frame_result_contact:
bbox_list_all = tools_function.change_list_dict(fps1=fps1,re_list=re_list)
@ -351,24 +352,25 @@ class DealVideo():
# 截图保存视频
# continue_para = True
cut_dict = {'video_path':video_path,'label_name':label_name,"stop_fps":fps1,'bbox_list':example_lst}
# cut_dict = {'video_path':video_path,'label_name':label_name,"stop_fps":fps1,'bbox_list':example_lst}
start_fps = example_lst[0]['fps']
# start_fps = example_lst[0]['fps']
if count_fps_del <= 3:
if count_fps_del <= 2:
frame_result_contact = frame_result_contact
count_fps_del = count_fps_del + 1
else:
# else:
if (fps1 - start_fps) < 10:
# if (fps1 - start_fps) < 5:
frame_result_contact = frame_result_contact
else:
frame_result_contact = [item for item in frame_result_contact if item not in example_lst]
self.cutbboxQueue.put(cut_dict)
# frame_result_contact = frame_result_contact
else:
cut_dict = {'video_path':video_path,'label_name':label_name,"stop_fps":fps1,'bbox_list':example_lst}
frame_result_contact = [item for item in frame_result_contact if item not in example_lst]
self.cutbboxQueue.put(cut_dict)
# 有新添加目标情况
if re_dict_lst:
@ -407,38 +409,72 @@ class DealVideo():
return count_fps_del,frame_result_contact
# def get_continue_keys(self,count_fps_del,continue_para,start_fps,now_fps,frame_result_contact,update_frame_result_contact):
def analysis_return_meassage(self):
# big_add_list = []
# big_list = []
# # 判断是否有偶然没检测到的情况
# if continue_para:
while True:
if self.videoreturnQueue.empty():
# dert_fps = now_fps - start_fps
time.sleep(5)
else:
video_message_path = self.videoreturnQueue.get()
# print('dert_fps:',dert_fps)
directory = os.path.dirname(video_message_path)
labels_pptsm = directory.split('/')[-1]
# if dert_fps <= 20:
video_basename = os.path.basename(video_message_path).split('.')[0]
# count_fps_del = count_fps_del + 1
small_anno_infor = video_basename.split('__')[-1]
big_anno_infor = video_basename.split('__')[-2]
video_base_name = video_basename.split('__')[0]
# if count_fps_del <= 3:
#保存的json文件格式
file_path = self.video_save_file + '/' + video_base_name + '.json'
# frame_result_contact = frame_result_contact
# else:
# 对小图上的坐标和帧率进行分析
small_startfps,small_stopfps,small_fps = small_anno_infor.split('_')[0].split('-')
small_bbox_0,small_bbox_1,small_bbox_2,small_bbox_3 = small_anno_infor.split('_')[1].split('-')
# frame_result_contact = update_frame_result_contact
# count_fps_del = 0
big_startfps,big_stopfps,big_fps = big_anno_infor.split('_')[0].split('-')
big_bbox_0,big_bbox_1,big_bbox_2,big_bbox_3 = big_anno_infor.split('_')[1].split('-')
# else:
# count_fps_del = 0
# else:
big_add_startfps = int(big_startfps) + int(small_startfps)
big_add_stopfps = int(big_startfps) + int(small_stopfps)
big_add_bbox_0 = int(big_bbox_0) + int(small_bbox_0)
big_add_bbox_1 = int(big_bbox_1) + int(small_bbox_1)
big_add_bbox_2 = int(big_bbox_0) + int(small_bbox_2)
big_add_bbox_3 = int(big_bbox_1) + int(small_bbox_3)
# frame_result_contact = update_frame_result_contact
big_add_dict = {'labels':labels_pptsm,'startfps':big_add_startfps,'stopfps':big_add_stopfps,'bbox':[big_add_bbox_0,big_add_bbox_1,big_add_bbox_2,big_add_bbox_3]}
big_person_dict = {'labels':'person','startfps':big_startfps,'stopfps':big_stopfps,'bbox':[big_bbox_0,big_bbox_1,big_bbox_2,big_bbox_3]}
# return count_fps_del,frame_result_contact
if os.path.isfile(file_path):
# 如果文件已存在,读取其中的字典数据
with open(file_path, "r") as json_file:
data = json.load(json_file)
data['big_dict'].append(big_add_dict)
if tools_function.compare_dicts(data['big_dict'], big_person_dict):
data['big_dict'].append(big_person_dict)
with open(file_path, "w") as json_file:
json.dump(data, json_file)
# # 访问和处理字典数据
# print(data)
else:
# 如果文件不存在,创建一个新的字典并保存到文件中
bbox_dict = {'big_dict':[big_add_dict,big_person_dict]}
with open(file_path, "w") as json_file:
json.dump(bbox_dict, json_file)
def write_video(self):
# print('write_videoafagragr')
@ -460,7 +496,7 @@ class DealVideo():
fps = cap.get(cv2.CAP_PROP_FPS)
video_fps = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print(video_path,'fps:',fps,'video_fps:',video_fps)
# print(video_path,'fps:',fps,'video_fps:',video_fps)
# 获得起始
stop_fps = video_frame_dict['stop_fps']
# 裁剪信息
@ -472,16 +508,18 @@ class DealVideo():
if start_fps >= stop_fps:
print('start_fps:',start_fps,'stop_fps:',stop_fps)
# print('start_fps:',start_fps,'stop_fps:',stop_fps)
break
else:
bbox_list = bbox_dict['result']
# w = int(bbox_list[2]) - int(bbox_list[0])
# h = int(bbox_list[3]) - int(bbox_list[1])
size = (200,200)
bbox_int_list = [int(bbox_list[0]),int(bbox_list[1]),int(bbox_list[2]),int(bbox_list[3])]
w = bbox_int_list[2] - bbox_int_list[0]
h = bbox_int_list[3] - bbox_int_list[1]
size = (w,h)
# 根据标签保存不同视频分类
video_name_save = video_basename + '_' + str(start_fps) + '_' + str(stop_fps) + '_' + str(i) + '.avi'
# bbox_name = '{}-{}-{}_{}'.format(int(bbox_list[0]), int(bbox_list[1]), int(bbox_list[2]), int(bbox_list[3]))
video_name_save = '{}__{}-{}-{}_{}-{}-{}-{}.avi'.format(video_basename, start_fps, stop_fps, video_fps,int(bbox_list[0]), int(bbox_list[1]), int(bbox_list[2]), int(bbox_list[3]))
video_save_file = self.video_save_file + '/' + file_name
os.makedirs(video_save_file, exist_ok=True)
video_save_path = os.path.join(video_save_file, video_name_save)
@ -491,7 +529,8 @@ class DealVideo():
frameToStart=start_fps,
frametoStop=stop_fps,
videoWriter=videoWriter,
bbox=bbox_list)
bbox=bbox_int_list,
size=size)
videoWriter.release()
self.videoQueue2.put(video_save_path)
@ -502,8 +541,6 @@ class DealVideo():
break
def select_video_path(self):
while True:
@ -515,7 +552,7 @@ class DealVideo():
directory = os.path.dirname(video_path)
labels = directory.split('/')[-1]
print('video_pathagfg:',video_path)
# print('video_pathagfg:',video_path)
# print(labels)
@ -535,20 +572,20 @@ class DealVideo():
self.get_video_listThread.start()
self.get_video_frameThread.start()
self.write_videoThread.start()
# self.write_videoThread.join()
self.head_hands_detThread.start()
self.video_select_dectThread.start()
self.select_video_pathThread.start()
self.analysis_return_meassageThread.start()
if __name__ == '__main__':
t1 = time.time()
video = "E:/Bank_files/Bank_02/dataset/video_test/1min/0711-7_4.avi"
video = "test_video/test/0711ahgh.avi"
video_save = 'test_video'
# 初始化目标检测
person_model = YOLO("model_file/yolov8n.pt")
person_model = YOLO("model_file/yolov8x.pt")
# 初始化pptsmv2
config = 'model_file/inference/pptsm_lcnet_k400_16frames_uniform.yaml' # 配置文件地址

Loading…
Cancel
Save