在一个帧中有多个人比较难处理。。。
数据集制作,简化一下放过自己:找只有一个人的视频!
模型训练:只有一组骨架(也就是17个关键点的坐标)的时间序列(序列长度的话 暂定100帧一个label 后面再调整吧) +label (判断是否跌倒)
预测:这个不能简化了 预测肯定要考虑多个人的情况 同时开多个lstm模型进行预测,当画面中有人时,每个人占用这个lstm模型 ,人物消失或不再需要跟踪时,将该 LSTM 模型释放并标记为可用 ,我提前准备100个lstm模型。。。 但是我感觉100个会跑不动,CPU GPU会shao啊。。。。。。。。。
先贴一个数据集制作的代码(有点小bug还没改。。。先存一下。。)
import cv2
from ultralytics import YOLO
import os
# 加载模型
model = YOLO(model=r"D:\desktop\fall detection\ultralytics-main\mymodel\yolov8n-pose.pt")
# 视频文件路径
video_path = r"D:\desktop\fall detection\SVID_20230912_194419_1.mp4"
# 打开视频文件
cap = cv2.VideoCapture(video_path)
# 获取视频帧的宽度和高度
frame_width = int(cap.get(3))
frame_height = int(cap.get(4))
# 创建显示窗口
cv2.namedWindow("YOLOV8", cv2.WINDOW_NORMAL)
# 创建保存数据集的文件夹
output_folder = "lstm_dataset"
os.makedirs(output_folder, exist_ok=True)
cnt_zhen = 1 # 帧计数
frame_buffer = [] # 存储每100帧的关键点信息
while cap.isOpened():
# 获取帧
res, frame = cap.read()
# 如果读取成功
if res:
# 正向推理
results = model(frame)
for result in results:
keypoints = result.keypoints
frame_keypoints = [] # 存储当前帧的关键点信息
for i, keypoint in enumerate(keypoints):
num_keypoints = keypoint.xyn.numel() / 2 # x y 坐标分开了
coordinates = keypoint.xyn[0].tolist() # 将关键点坐标转换为列表
print(f"当前帧第 {i + 1} 组关键点,共有 {num_keypoints} 个关键点坐标:", coordinates)
frame_keypoints.append(coordinates)
frame_buffer.append(frame_keypoints)
# 在每100帧后等待用户输入标签
if cnt_zhen % 100 == 0:
label = input("请输入标签 (0 或 1): ")
# 创建数据文件
file_name = os.path.join(output_folder, f"data_{cnt_zhen // 100}.txt")
with open(file_name, "w") as output_file:
# 写入用户输入的标签
output_file.write(label + "\n")
# 写入100帧的关键点信息
for keypoints_data in frame_buffer:
for keypoint in keypoints_data:
output_file.write(f"{keypoint[0]}, {keypoint[1]}\n")
# 清空关键点缓冲区
frame_buffer = []
# 绘制结果
annotated_frame = results[0].plot()
# 调整帧的大小以适应窗口
annotated_frame = cv2.resize(annotated_frame, (frame_width, frame_height))
# 显示图像
cv2.imshow("YOLOV8", annotated_frame)
# 按ESC退出
if cv2.waitKey(1) == 27:
break
cnt_zhen += 1
else:
break
# 释放视频文件
cap.release()
cv2.destroyAllWindows()