YOLOv11 CPU无异常退出求助:实时目标检测进程莫名终止
YOLOv11循环预测时CPU占用过高导致进程意外终止问题排查与解决
问题场景
使用YOLOv11做目标检测测试,写了一段循环预测本地图片的代码,运行几轮后进程毫无提示就突然终止。观察到CPU使用率一路涨到85%,内存稳定在300MB左右,推测是CPU持续高负载触发了系统的进程保护机制,导致进程被强制终止。
测试代码如下:
from ultralytics import YOLO import time import gc import threading import psutil import os process = psutil.Process(os.getpid()) model=YOLO("yolo11n.pt") while True: model.predict("11.jpg") print(psutil.cpu_percent()) num_threads = threading.active_count() print(f"{num_threads}") print(f"{psutil.virtual_memory().percent}%") gc.collect()
问题原因分析
- 无限循环无休眠,CPU持续满负载:
while True没有任何停顿,让CPU核心一直被预测任务占用,长时间高负载会触发系统的资源限制(比如CPU过载保护、OOM Killer),直接终止进程。 - 推理线程未及时回收:虽然手动调用了
gc.collect(),但YOLO的predict内部可能创建了临时线程或资源,快速循环下无法及时释放,线程数累积后会进一步加重CPU负担。 - 未做推理参数优化:默认CPU推理时没有限制线程数,会占用所有CPU核心,持续高负载容易引发系统层面的进程终止。
解决方案
1. 给循环添加休眠机制
每次循环后加短暂休眠,降低CPU持续负载,给资源回收留时间:
from ultralytics import YOLO import time import gc import threading import psutil import os process = psutil.Process(os.getpid()) model=YOLO("yolo11n.pt") while True: model.predict("11.jpg") print(psutil.cpu_percent()) num_threads = threading.active_count() print(f"{num_threads}") print(f"{psutil.virtual_memory().percent}%") gc.collect() time.sleep(0.1) # 加100ms休眠,可根据实际需求调整时长
2. 限制推理线程数量
在predict里指定threads参数,避免CPU资源被耗尽:
model.predict("11.jpg", threads=2) # 建议设为CPU核心数的一半,比如4核CPU设为2
3. 优先使用GPU推理(如果有可用GPU)
如果系统有NVIDIA GPU,切换到GPU推理能大幅降低CPU负载:
model=YOLO("yolo11n.pt").to("cuda") # 切换为GPU推理
4. 显式释放预测结果资源
手动删除predict的返回对象,加速资源回收:
results = model.predict("11.jpg", threads=2) del results # 显式删除结果对象,避免资源残留
5. 替换无限循环为可控循环
如果只是测试需求,设置固定循环次数,避免无限运行导致资源耗尽:
for _ in range(100): # 运行100轮测试后自动停止 model.predict("11.jpg", threads=2) # 监控代码... gc.collect() time.sleep(0.1)
内容的提问来源于stack exchange,提问作者Gimen
相关产品推荐
相关产品推荐

