使用YOLOv8与DeepSORT做目标追踪,Jupyter内核为何在第二次迭代崩溃?
YOLOv8 + DeepSORT 第二帧内核崩溃的排查与解决
一、代码拼写错误(最直接的触发原因)
你的代码里存在变量名拼写错误:
前面定义的检测结果变量是detections = model(frame)[0],但循环遍历的时候写成了for data in detection.boxes.data.tolist()——这里把复数形式的detections写成了单数detection。
第一帧可能因临时变量侥幸运行,但第二帧执行时这个未定义的变量会直接触发致命错误,导致内核崩溃。
修复:将循环里的detection改为detections。
二、Jupyter 中 OpenCV 显示的线程冲突
Jupyter内核与OpenCV的cv2.imshow窗口存在线程兼容性问题,逐帧循环调用时极易引发内核崩溃。
修复:
- 替换
cv2.imshow为Jupyter兼容的显示方式,比如用Matplotlib:import matplotlib.pyplot as plt # 替换原cv2.imshow相关代码 rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) plt.imshow(rgb_frame) plt.axis('off') plt.show(block=False) plt.pause(0.01) - 或者直接注释掉
cv2.imshow和cv2.waitKey代码,先验证追踪逻辑是否正常,再处理显示问题。
三、DeepSORT 输入格式/帧格式不兼容
DeepSORT的update_tracks方法对输入有严格要求:
- 检测框格式:你当前输出的
[xmin, ymin, width, height]是正确的,但要确保所有坐标都是整数,且不会超出帧的尺寸范围。 - 帧格式:DeepSORT内部默认处理RGB格式图像,而OpenCV读取的帧是BGR格式,这可能导致特征提取模块出错。
修复:将BGR帧转为RGB后传入追踪器:
rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) tracks = tracker.update_tracks(results, frame=rgb_frame)
四、内存占用过高导致崩溃
如果视频分辨率较高,YOLOv8检测+DeepSORT追踪的计算会快速占用内存,Jupyter环境下容易触发内核崩溃。
优化:
- 读取帧后先缩放降低分辨率:
frame = cv2.resize(frame, (640, 480)) # 根据需求调整尺寸 - 循环内手动清理无用变量,释放内存:
del detections, results
内容的提问来源于stack exchange,提问作者Javad.Rad
相关产品推荐
相关产品推荐

