import cv2
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
from modelscope.outputs import OutputKeys
model_id = 'damo/cv_cspnet_video-object-detection_streamyolo'
test_video = 'https://modelscope.oss-cn-beijing.aliyuncs.com/test/videos/test_realtime_vod.mp4'
realtime_video_object_detection = pipeline(
Tasks.video_object_detection, model=model_id)
result = realtime_video_object_detection(test_video)
if result:
bboxes_list = result[OutputKeys.BOXES]
cv2.VideoWriter('result.mp4', result['output_img'])
else:
raise ValueError('process error')
要输出实时检测的结果到MP4文件或者输出流,您可以在代码中使用OpenCV库来实现。
假设您已经成功加载了模型并获得了视频流,您可以按照以下步骤来实现实时检测的输出:
创建一个OpenCV的视频编写器(VideoWriter)对象,用于将检测结果写入到MP4文件或输出流中。例如:
python
Copy
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output.mp4', fourcc, 30, (640, 480))
在上面的代码中,我们使用了`mp4v`编码器,并将输出视频帧率设置为30帧/秒。`output.mp4`是输出视频的文件名, `(640, 480)`是输出视频的分辨率(根据您的视频流分辨率进行调整)。
在处理每一帧视频时,将检测结果绘制在视频帧上,并将带有检测结果的视频帧写入输出文件或输出流中。例如:
python
Copy
# 处理每一帧视频
while True:
ret, frame = cap.read()
if not ret:
break
# 进行目标检测
outputs = pipe({'image': frame})
# 解析检测结果
boxes = outputs[OutputKeys.detections]['boxes']
scores = outputs[OutputKeys.detections]['scores']
classes = outputs[OutputKeys.detections]['class_ids']
# 绘制检测结果
for box, score, cls in zip(boxes, scores, classes):
x1, y1, x2, y2 = box
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(frame, f'{score:.2f}', (x1, y1-5),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
cv2.putText(frame, str(cls), (x1, y1+15),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
# 将带有检测结果的视频帧写入输出文件或输出流
out.write(frame)
# 释放视频编写器和视频流
out.release()
cap.release()
在上面的代码中,我们首先使用pipeline
函数对视频帧进行目标检测,并从输出结果中解析出检测到的目标框、得分和类别等信息。然后,我们将检测结果绘制在视频帧上,并使用VideoWriter
对象将带有检测结果的视频帧写入输出文件或输出流中。最后,我们释放视频编写器和视频流。
实时检测类任务通常涉及到处理视频数据或实时流数据,并对其进行分析和检测。如果您想要输出 mp4 文件或者将结果作为流传输,可以考虑以下方法:
1. 输出为 MP4 文件:
2. 输出为流传输: