深度学习YOLO实战:6、通过视频案例,解析YOLO模型的能力边界与选型策略
前言
在实际开发里,经常需要给视频做目标检测,用来实现实时监控或者分析人的行为这类功能。那么具体怎么做呢?说白了,用YOLO模型处理视频,其实就是把一段视频分解成一帧一帧的静态图片,然后对每一张图片单独做目标识别,最后把这些识别结果“拼”回去,就成了带检测结果的视频。
听起来好像挺麻烦的?别担心,Python里有一些现成的库(比如ultralytics出的YOLO库),把这一整套流程都打包好了,提供了非常方便的调用接口,让咱们用很少的代码就能高效地完成这个任务。
对鱼群视频进行目标检测推理
代码实现
想要用YOLO模型分析视频,代码其实非常简洁。下面这段示例演示了如何对一个可能包含鱼群或其他水生生物的“fish.mp4”视频文件进行推理。
from ultralytics import YOLO
model = YOLO("yolo11n.pt")
model.predict(source=r"ultralytics/video/fish.mp4", save=True, show=False,
)
运行结果与分析
当代码运行起来后,它会一帧一帧地处理视频,并把检测结果保存到默认目录。你会在控制台看到类似下面的实时信息:
video 1/1 (frame 1/401) /media/becase/common/yolo/Learning/01_predict/ultralytics/video/fish.mp4: 640x384 (no detections), 59.1ms
video 1/1 (frame 2/401) /media/becase/common/yolo/Learning/01_predict/ultralytics/video/fish.mp4: 640x384 (no detections), 73.1ms
video 1/1 (frame 3/401) /media/becase/common/yolo/Learning/01_predict/ultralytics/video/fish.mp4: 640x384 1 fork, 50.4ms
xxxxxx
video 1/1 (frame 399/401) /media/becase/common/yolo/Learning/01_predict/ultralytics/video/fish.mp4: 640x384 1 bird, 1 potted plant, 49.6ms
video 1/1 (frame 400/401) /media/becase/common/yolo/Learning/01_predict/ultralytics/video/fish.mp4: 640x384 1 potted plant, 45.7ms
video 1/1 (frame 401/401) /media/becase/common/yolo/Learning/01_predict/ultralytics/video/fish.mp4: 640x384 1 car, 1 bird, 45.3ms
Speed: 1.8ms preprocess, 49.3ms inference, 0.6ms postprocess per image at shape (1, 3, 640, 384)
Results saved to /media/becase/common/yolo/Learning/01_predict/runs/detect/predict
从这些输出里,我们能清楚地看到每一帧里识别到了什么物体、数量多少,以及处理这一帧花了多长时间。最后那行速度总结尤其有用,它能帮我们评估模型的效率,看看能不能满足实时处理的要求。
所有处理完的结果,包括带检测框的新视频和详细数据,都自动存到了 runs/detect/predict
这个文件夹里。
问题发现:为什么识别不到鱼?
但问题是,效果不太理想。 打开处理后的视频(如下方动图所示)就会发现,模型几乎认不出画面里的鱼,反而把一些帧里的物体误认成了“鸟”、“盆栽”、“汽车”等毫不相关的东西。
问题的根源,正如我们之前提到的,完全出在所使用的模型上。
我们当前使用的 yolo11n.pt
是一个通用的目标检测模型,它是在COCO这类包含常见物体的数据集上训练出来的。它的“知识库”是固定的,只能识别训练时学过的那些类别。让我们来看看它的“词汇表”(类别映射):
{0: 'person', 1: 'bicycle', 2: 'car', 3: 'motorcycle', 4: 'airplane', 5: 'bus', 6: 'train', 7: 'truck', 8: 'boat', 9: 'traffic light', 10: 'fire hydrant', 11: 'stop sign', 12: 'parking meter', 13: 'bench', 14: 'bird', 15: 'cat', 16: 'dog', 17: 'horse', 18: 'sheep', 19: 'cow', 20: 'elephant', 21: 'bear', 22: 'zebra', 23: 'giraffe', 24: 'backpack', 25: 'umbrella', 26: 'handbag', 27: 'tie', 28: 'suitcase', 29: 'frisbee', 30: 'skis', 31: 'snowboard', 32: 'sports ball', 33: 'kite', 34: 'baseball bat', 35: 'baseball glove', 36: 'skateboard', 37: 'surfboard', 38: 'tennis racket', 39: 'bottle', 40: 'wine glass', 41: 'cup', 42: 'fork', 43: 'knife', 44: 'spoon', 45: 'bowl', 46: 'banana', 47: 'apple', 48: 'sandwich', 49: 'orange', 50: 'broccoli', 51: 'carrot', 52: 'hot dog', 53: 'pizza', 54: 'donut', 55: 'cake', 56: 'chair', 57: 'couch', 58: 'potted plant', 59: 'bed', 60: 'dining table', 61: 'toilet', 62: 'tv', 63: 'laptop', 64: 'mouse', 65: 'remote', 66: 'keyboard', 67: 'cell phone', 68: 'microwave', 69: 'oven', 70: 'toaster', 71: 'sink', 72: 'refrigerator', 73: 'book', 74: 'clock', 75: 'vase', 76: 'scissors', 77: 'teddy bear', 78: 'hair drier', 79: 'toothbrush'}
如果你仔细从上到下看一遍这个列表,会发现里面有“鸟”、“猫”、“狗”,甚至“斑马”和“长颈鹿”,但偏偏就是没有 “fish”(鱼) 这个类别。
这就好比让一个只学过识别陆生动物的专家去分析水下世界,他自然会感到茫然。当模型在处理视频时,它会努力在每一帧中寻找它“认识”的东西。对于游动的鱼,它要么因为完全不认识而直接忽略(输出no detections
),要么就会“脑洞大开”,把鱼的形状或纹理与它学过的、看起来最接近的物体联系起来——比如误判成“鸟”、“盆栽”或者“汽车”,从而产生了那些令人啼笑皆非的结果。
这个例子给我们提了个醒:在使用预训练模型前,一定要先了解它的能力边界。 如果你的任务比较特殊(比如检测鱼群、某种工业零件或医疗影像),通用的模型往往力不从心,这时候就需要考虑使用专门的数据集来训练一个定制化的模型。
示例代码:使用YOLO进行车辆视频推理
在之前的示例中,由于 YOLO 模型本身不支持识别“鱼”类别,导致对鱼群视频的推理效果不佳。为了更全面地展示模型能力,我们接下来将其应用到一个它更擅长的场景——车辆检测。
只需对源代码做一处简单修改,将视频源从 fish.mp4
更换为 car.mp4
即可:
from ultralytics import YOLO
model = YOLO("yolo11n.pt")
model.predict(source=r"ultralytics/video/car.mp4", save=True, show=False,
)
这个新视频中包含各种道路车辆,而像汽车(car)、卡车(truck)、公交车(bus)等类别,正是 YOLO 模型所熟知的。
推理结果分析
运行代码后,可以看到推理效果有了显著提升。模型能够准确地识别并定位视频中的车辆,如汽车、卡车、公交车,甚至包括行人等,其置信度也普遍较高。
从下方的结果动图中可以直观看到,模型在复杂的交通场景中表现稳健,不仅能区分不同车辆类型,还能在目标重叠、遮挡等情况下保持较好的检测效果。
这个成功的案例印证了一个关键点:YOLO 这类通用目标检测模型,在其训练数据覆盖的常见类别(如车辆、行人)上,能够表现出强大且可靠的性能。 这与之前鱼群检测的失败案例形成了鲜明对比,也提醒我们,在实际项目中,选择合适的模型是成功的第一步。
对比分析与结论
通过对比鱼群和车辆两次视频推理的结果,我们可以清晰地看到模型在不同场景下的表现差异,并从中总结出以下关键结论:
1. 模型能力取决于训练数据
YOLO 模型的识别能力直接受限于其训练数据集所涵盖的类别。在我们使用的 yolo11n.pt
模型中,由于训练数据包含了各种车辆类别而未包含“鱼”,导致模型能准确识别汽车、卡车,却无法识别水中的鱼群。这印证了一个基本原则:模型只能识别它“见过”的东西。
2. 选对模型是成功应用的前提
在实际项目中,选择与任务匹配的预训练模型至关重要。若任务目标(如检测鱼类)不在通用模型的识别范围内,则需通过收集特定数据、对模型进行自定义训练来扩展其能力,而不能直接套用现成模型。
3. 模型的泛化能力有其边界
尽管 YOLO 在已知类别上表现优异,但面对训练时未见过的新类别时,其泛化能力仍然有限。这说明,直接将一个通用模型迁移到特殊领域(如水产、医疗、工业质检)往往效果不佳,针对性的优化或重新训练是必要的。
4. 在速度与精度间寻求平衡
YOLO 系列以其高效的推理速度著称,非常适用于实时检测场景。然而在实践中,我们往往需要在速度和精度之间做出权衡——某些场景下可以为了更高的准确率而适当牺牲速度,反之亦然。根据具体需求选择合适的模型变体(如 n/s/m/l/x)并调优参数,是提升应用效果的关键。
综上所述,成功应用目标检测技术不仅要求我们理解模型本身的特性,更需要结合实际任务去选择、调整甚至重新训练模型,这样才能使技术真正服务于具体的业务需求。