✨ 复制成功!

以文会友,打造好学人设!

📋 已复制到剪贴板:

感知的魔法:1分钟跑通目标检测

创建时间:2026-07-31 更新时间:2026-07-31 阅读次数:1004 次

前两节,我们让机器人拥有了“看”的能力——它能捕捉彩色图像,能感知深度距离。但这一切还停留在原始信号的层面。一堆像素和一堆深度值,并不能直接告诉机器人“水杯在哪”。

机器人需要的不是像素,是答案

它需要知道画面里有没有水杯,水杯在什么位置,占据了多大的区域。这项技术叫做目标检测——在图像中同时识别出物体的类别和它的边界框。它是机器人视觉最基础也最核心的能力之一。

按照传统教材的节奏,这一节应该从卷积神经网络的原理开始讲起,手写一个模型架构,标注几千张数据,然后训练几十个小时。但这条路会让大多数初学者在看见成果之前就耗尽了热情。

我们的策略不同。先跑通,再理解。 这一节,你要用现成的预训练模型,一分钟之内在自己的电脑上跑出一个完整的目标检测程序。让摄像头画面里的水杯、键盘、人,被彩色方框自动圈出来。先看到魔法,后面再拆解魔法背后的机关。

YOLO:把检测当成回归问题

我们要用的模型叫YOLO,全称You Only Look Once——你只看一眼。

这个名字起得非常传神。传统的目标检测方法会把图像切分成很多小块,逐块分析“这里有东西吗”,过程很慢。而YOLO的思路简单而优雅:把整张图一次性送进一个神经网络,网络直接输出所有物体的类别和位置。 就像人眼扫一眼桌面,瞬间就知道水杯在哪、键盘在哪,不需要从左到右逐行扫描。

从数学上看,YOLO把目标检测转化为一个回归问题。输入是一张形状为 $H \times W \times 3$ 的RGB图像,输出是一系列预测框,每个框包含五个核心信息:

$$ \text{Prediction} = (x, y, w, h, \text{confidence}, \text{class_scores}) $$

其中 $(x, y)$ 是边界框的中心坐标,$w$ 和 $h$ 是框的宽度和高度,$\text{confidence}$ 是这个框里确实有物体的置信度,$\text{class_scores}$ 是一个向量,表示这个物体属于各个类别的概率分布。

YOLO把输入图像划分成 $S \times S$ 的网格。每个网格负责预测落在自己区域内的物体。整个网络一次性输出 $S \times S$ 组预测,然后通过一个叫非极大值抑制的后处理步骤,去掉那些重复框选同一个物体的冗余框,只保留最准确的那个。

这些细节你现在不需要完全理解。你只需要知道:有一个叫YOLO的模型,它已经被高手们在海量数据上训练好了,可以直接拿来用。

环境准备:安装Ultralytics

在开始之前,确保你已经装好了Python环境。我们使用Ultralytics这个开源库,它把YOLO的调用封装得极其简洁。打开终端,输入一行命令:

pip install ultralytics opencv-python

Ultralytics会自动帮你下载模型权重文件。YOLO有多个版本,从轻量级的YOLOv8n到重量级的YOLOv8x,参数量从几百万到上亿不等。第一次使用时,推荐使用YOLOv8n,体积最小,CPU也能跑得动。

跑起来:一行代码完成目标检测

先做一个最简单的测试——对一张静态图片做检测。在你的Python脚本或者Jupyter Notebook里输入:

from ultralytics import YOLO

# 加载预训练模型(首次运行会自动下载约6MB的权重文件)
model = YOLO('yolov8n.pt')

# 对一张图片进行推理
results = model('https://ultralytics.com/images/bus.jpg')

# 显示检测结果
results[0].show()

就这么三行。程序会自动下载模型权重,对图片进行推理,然后弹出一个窗口,上面显示着检测结果——行人被蓝色框圈出,旁边标注着"person",公交车、小轿车也各有各的框,每一条框上都带着置信度分数。

YOLO的预训练模型默认能识别80类常见物体,包括人、汽车、自行车、水杯、键盘、笔记本电脑、书本、椅子等等——这些基本覆盖了机器人日常会遇到的绝大多数东西。

实战:用你的电脑摄像头做实时检测

静态图片还不够酷。接下来,我们要让摄像头画面实时跑目标检测,让每一帧都自动标注出其中的物体。这才是机器人视角应有的样子。

新建一个Python文件,输入以下代码:

import cv2
from ultralytics import YOLO

# 加载预训练模型
model = YOLO('yolov8n.pt')

# 打开摄像头
cap = cv2.VideoCapture(0)

# 检查摄像头是否成功打开
if not cap.isOpened():
    print("无法打开摄像头!请检查设备连接。")
    exit()

print("按 'q' 键退出程序")

while True:
    # 逐帧读取摄像头画面
    ret, frame = cap.read()
    if not ret:
        print("读取画面失败")
        break

    # 对这一帧进行目标检测
    results = model(frame)

    # 在画面上绘制检测结果
    # results[0].plot() 会自动在原图上画边界框和标签
    annotated_frame = results[0].plot()

    # 显示带有检测结果的画面
    cv2.imshow('YOLO 实时目标检测 - 机器人视角', annotated_frame)

    # 按 'q' 键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()

运行这段代码。你会看到一个窗口弹出来,里面是你摄像头实时拍摄的画面。把你的水杯举到镜头前,一个方框会立刻把它圈出来,旁边标注着"cup"。把手机放过去,显示"cell phone"。你自己出现在画面里,头上顶着"person"的标签。

这就是机器人看到的你。

看看模型到底返回了什么

画框只是直观的可视化。如果你想拿到结构化的数据——比如用代码自动判断水杯在什么位置——可以这样取:

results = model(frame)

# 遍历检测到的每一个物体
for box in results[0].boxes:
    # 边界框的像素坐标
    x1, y1, x2, y2 = box.xyxy[0]  # 左上角和右下角坐标
    # 置信度
    confidence = box.conf[0]
    # 类别ID
    class_id = int(box.cls[0])
    # 类别名称
    class_name = model.names[class_id]

    print(f"检测到 {class_name},置信度 {confidence:.2f},位置 ({int(x1)}, {int(y1)}) 到 ({int(x2)}, {int(y2)})")

你会看到终端里不断刷出类似这样的信息:

检测到 person,置信度 0.92,位置 (320, 45) 到 (580, 680)
检测到 cup,置信度 0.87,位置 (150, 290) 到 (230, 380)
检测到 keyboard,置信度 0.95,位置 (100, 520) 到 (600, 600)

这些数字,就是具身智能系统的“视觉感知输出”。后续的决策模块——比如机械臂的抓取规划器——正是依赖这些坐标和类别信息,来决定“机械臂应该往哪个方向伸过去”。

你刚刚完成了什么?

停下手指,回顾一下这一节你做的事情。

你没有写任何神经网络的定义,没有处理任何一张标注数据,没有等几十个小时的训练。你只是加载了一个预训练好的YOLO模型,调用了它的推理接口,然后你电脑上的摄像头就具备了实时识别80类物体的能力。

这不是走捷径,这是工程师的标准工作方式。在实际开发中,站在巨人肩膀上、复用开源社区的训练成果,是效率最高也最普遍的实践。你先把整个流程跑通,获得直观感受,后面如果需要针对特定任务(比如只识别不同种类的零件)做微调,你心里已经有了完整的认知地图。

从零训练一个模型是选修课,而调用预训练模型解决问题是必修课。 这一节,你已经修完了必修课的第一学分。

下一站

现在,机器人不仅能看到光、感知深度,还能指着画面里每一个物体说出它们的名字和位置。感知的三块拼图——颜色、深度、语义——已经集齐了两块。

下一章,我们要转向另一个根本性的问题:机器人用什么来执行这些感知结果? 它怎么伸出手臂,怎么转动关节,怎么把一个“抓取”的意图变成物理世界的真实动作?我们要走进机器人的身体——电机、关节、自由度,以及你在仿真环境里亲手操控的第一个虚拟机器人。

本教程共13节,当前为第7节!
本教程最新修订时间为:2026-08-06 21:35:58

📌 面试天下网:一款服务于上班族的口袋书,让大家在地铁里/公交上可以学习大模型技术!
📌 网站公告:人人都需要的干眼克星上线啦>>>>>>
📌 网站公告:2026年7月招聘兼职>>>>>>