)
目标识别与环境理解两周试错学习清单目标不碰昂贵硬件用电脑开源代码快速体验控制学科视角的环境感知判断自己是否适合这个方向。 前提环境Python3.10PyTorchCUDA没有显卡也可以用Colab云端运行。 总周期14天每天2‑3小时即可优先跑通代码不要死磕理论。前置准备第0天1小时环境搭建部分完成情况硬件NVIDIA RTX4060 Laptop 8G笔记本显卡使用Anaconda/miniconda搭建YOLOv8开发环境执行命令创建perception虚拟环境Python3.10安装ultralytics、opencv-python、torch、torchvision、matplotlib、pcl-python搭配GPU版本PyTorch配套GPU可用性验证代码踩坑点pip一次性安装多个包容易报错建议分步安装模型权重下载会出现超时有对应的解决办法VS Code运行代码需要切换解释器到perception虚拟环境否则GPU验证代码报错第1‑3天基础任务2D目标检测多目标跟踪任务目标跑通目标检测理解“识别物体跟踪物体”这是目标识别最基础模块。Day1跑通YOLOv8检测from ultralytics import YOLO model YOLO(yolov8n.pt) results model.predict(test.mp4, saveTrue)输出视频里框出行人、车辆、障碍物。思考问题遮挡、暗光下识别失效是什么现象为什么会失效Day2多目标跟踪ByteTrackmodel.track(sourcetest.mp4, persistTrue)得到每个目标ID、轨迹观察目标被遮挡后ID跳变的问题。作业自己找一段户外监控视频跑一遍记录哪些情况识别失败。Day3语义分割model YOLO(yolov8n-seg.pt) model.predict(sourcetest.mp4, saveTrue)区分道路、人、车、建筑理解语义分割不仅知道是什么还知道像素属于哪一类这是环境理解的基础。阅读材料书《OpenCV实战》只看图像处理章节论文快速浏览YOLOv8原文摘要不用啃全部公式。YOLOv8代码完成情况model.track()目标追踪跨帧维持物体ID适合视频连续跟踪任务persistTrue保持追踪状态device0调用0号GPUsaveTrue保存结果视频model.predict()目标预测/检测逐帧独立识别物体帧之间没有ID关联用于图片/视频检测model YOLO(yolov8n-seg.pt)model.predict(sourcetest.mp4, saveTrue)加载YOLOv8n轻量实例分割模型对test.mp4视频做分割推理自动保存带掩码的结果视频其他运行代码必须在perceptionconda虚拟环境内测试代码不能随便在普通编程软件直接跑要选中对应虚拟环境解释器模型文件如yolov8n-seg.pt可自动下载网络差时需要手动下载。✅ 验收标准你可以自己输入任意视频输出带检测/分割结果的视频能说出3个算法缺陷。第4‑6天三维感知入门环境理解核心重点控制方向的环境理解不只是2D图片需要空间位置、距离、三维结构。Day4相机几何基础搞懂概念针孔相机、内参、外参、旋转矩阵、四元数用OpenCV做简单的相机标定示例代码看懂标定输出的矩阵含义。不用自己动手标定真实相机看懂代码逻辑即可。Day5单目深度估计 使用Depth‑Anything开源项目输入一张图片输出深度图。理解从2D图像估算物体距离明白单目深度有尺度漂移这是机器人感知的痛点。Day6点云基础PCL学习点云是什么简单运行PCL示例点云可视化、滤波。浏览KITTI数据集看激光雷达点云样本理解激光雷达输出三维空间坐标。阅读《视觉SLAM十四讲》第1‑3章只看几何部分不要啃完整本书。 不要硬啃全部数学先建立感性认识。✅验收标准能看懂一张深度图、一张点云图知道“2D图像”和“三维环境”的差别。完整版代码YOLO Track跟踪 Depth-Anything深度估计原图深度热力图左右拼接、保存视频功能清单YOLOtrack模式物体保持唯一ID跨帧持续跟踪每帧计算目标框内平均相对深度画面左半原图带检测框ID类别深度右半深度热力图左右拼接成一张大图实时预览并且保存完整视频按q随时退出import os os.environ[HF_ENDPOINT] https://hf-mirror.com from PIL import Image import cv2 import numpy as np from ultralytics import YOLO from transformers import pipeline # ---------------------- 加载模型 ---------------------- yolo_model YOLO(yolov8n.pt) depth_estimator pipeline(depth-estimation, modelLiheYoung/depth-anything-small-hf) # ---------------------- 视频读取与保存配置 ---------------------- cap cv2.VideoCapture(test.mp4) fps cap.get(cv2.CAP_PROP_FPS) width int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 输出画面宽度 原图宽度 ×2 原图 | 深度热力图 out_width width * 2 out_height height fourcc cv2.VideoWriter_fourcc(*mp4v) out cv2.VideoWriter(result_track_depth_side.mp4, fourcc, fps, (out_width, out_height)) while cap.isOpened(): ret, frame cap.read() if not ret: break frame_rgb cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) frame_pil Image.fromarray(frame_rgb) # 1. Depth-Anything 深度预测 depth_result depth_estimator(frame_pil) depth_map np.array(depth_result[depth]) # 深度图转为彩色热力图尺寸对齐原图 depth_color cv2.applyColorMap(cv2.normalize(depth_map, None, 0,255,cv2.NORM_MINMAX, dtypecv2.CV_8U), cv2.COLORMAP_INFERNO) # 2. YOLO track跟踪persistTrue维持物体ID results yolo_model.track(frame_pil, persistTrue)[0] # 遍历所有跟踪目标 if results.boxes.id is not None: boxes results.boxes.xyxy.cpu().numpy() ids results.boxes.id.cpu().numpy().astype(int) cls_ids results.boxes.cls.cpu().numpy().astype(int) confs results.boxes.conf.cpu().numpy() for box, track_id, cls_id, conf in zip(boxes, ids, cls_ids, confs): x1, y1, x2, y2 map(int, box) cls_name results.names[cls_id] # 提取框内深度区域求平均相对深度 depth_roi depth_map[y1:y2, x1:x2] avg_d np.mean(depth_roi) # 在原图上绘制框、ID、类别、相对深度 cv2.rectangle(frame, (x1, y1), (x2, y2), (0,255,0), 2) text fID:{track_id} {cls_name} D:{avg_d:.1f} cv2.putText(frame, text, (x1, y1-6), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 2) # 左右拼接原图 深度热力图 combined_img np.hstack([frame, depth_color]) # 写入视频 out.write(combined_img) cv2.imshow(YOLO-Track Depth | Left:Image Right:DepthHeatmap, combined_img) if cv2.waitKey(1) 0xFF ord(q): break # 资源释放不要漏掉否则视频损坏 cap.release() out.release() cv2.destroyAllWindows() print(✅ 处理完成已保存 result_track_depth_side.mp4)运行要点直接替换demo_04.py全部代码保存运行窗口左边是原图带有跟踪ID、类别、相对深度右边是Depth-Anything深度热力图红色近、蓝紫色远同一个物体跨帧移动时ID保持不变深度数值实时更新处理速度会更慢因为每帧深度推理 YOLO跟踪 画面拼接学习重点尺度漂移热力图颜色只代表相对远近不是真实米数。尺度漂移现象模型只能学到像素之间远近比例没有绝对尺度。举例同一个人在两段不同场景视频里同样3米距离预测出来的avg_d数值会不一样。后续可选拓展方向你的两周学习清单过滤低置信度目标减少误跟踪计算物体在画面移动的速度基于ID深度变化对比单目深度 vs 激光雷达点云的尺度差异pcl-python运行之后观察物体移动时ID会不会跳变、深度数值变化。有报错直接贴终端。 要不要再加一个小功能在终端打印每帧所有ID对应的深度方便你记录观察尺度漂移第7‑8天多传感器融合 状态估计控制学科特色纯计算机视觉很少做这块这是控制专业做环境感知最大的差异化。Day7卡尔曼滤波基础看懂EKF/卡尔曼滤波的作用对传感器噪声做滤波预测目标运动状态位置、速度运行简单Python实现的卡尔曼滤波示例模拟跟踪一个运动物体。结合前面YOLO跟踪检测结果有噪声卡尔曼滤波用来平滑目标轨迹。Day8简单理解多传感器融合思考问题相机看得到类别但没有距离激光雷达有距离但不知道物体是什么如何把两者结合阅读开源项目Lidar‑Camera‑Fusion看示例代码逻辑不必完整复现。✅验收标准能讲清楚为什么机器人不能只用相机必须融合多传感器。第9‑11天仿真环境感知‑规划闭环控制学科的灵魂核心感知出来的结果要给机器人做导航避障这才是控制的环境理解不是单纯做图像算法。 如果你电脑装不了ROS2直接用Colab跑算法仿真可以延后重点理解逻辑。Day9ROS2基础概念 搞懂话题、消息、节点理解相机节点输出图像感知节点处理图像输出障碍物信息给导航节点。Day10Gazebo仿真 搭建虚拟室内/室外环境虚拟机器人搭载相机目标仿真机器人摄像头识别障碍物输出障碍物位置。Day11简单避障逻辑感知识别到障碍物距离小于阈值机器人停止/转向。这就是完整小闭环感知→决策→控制。资料B站 ROS2 Humble入门教程优先看机器人感知相关。✅验收标准理解“算法跑在电脑上只是第一步最终要给机器人执行动作”。第12‑13天高阶开源项目浏览了解硕士课题长什么样不用完整复现看懂任务、数据集、评价指标感受真实科研课题。项目1语义SLAMORB‑SLAM3 语义分割任务一边建地图一边标记地图上物体类别实现语义导航。项目2开放词汇目标检测 SAMYOLO任务识别训练集没有见过的物体应对开放真实环境。项目3KITTI三维目标检测用点云做三维检测看评价指标mAP。阅读几篇硕士毕业论文摘要哈工大、北理工自动化学院看他们的课题是怎么做的。第14天复盘评估判断自己适不适合该方向问自己5个问题诚实回答我是否愿意花大量时间调代码、调参数、处理脏数据集面对三维几何、矩阵变换我能沉下心啃数学吗我喜欢“算法硬件仿真闭环”还是更喜欢纯理论推导我能接受很多实验结果不理想反复改代码不一定能出漂亮结果对比如果让我做嵌入式、PLC、控制算法哪个我更愿意长期做如果大部分答案是“是”这个方向适合你如果很痛苦那可以考虑控制下面其他方向比如嵌入式、运动控制、故障诊断。推荐书单优先选不要全读《视觉SLAM十四讲》控制方向必看重点前6章几何后面可以先放一放。《机器视觉》冈萨雷斯图像处理基础。《概率机器人》机器人状态估计、滤波、SLAM的经典。开源项目收藏后续深入YOLOv8Ultralytics目标检测分割Depth‑Anything单目深度估计ORB‑SLAM3视觉SLAMPointNet点云深度学习ROS2‑Humble机器人仿真平台数据集COCO2D检测分割KITTI自动驾驶三维感知NuScenes多传感器数据集TUM‑RGB‑D视觉SLAM数据集针对你的提醒不要一开始就冲深度学习论文先跑通代码建立感性认知再回头补理论这个方向工程工作量巨大不是靠做题你本科机械控制背景你的优势是懂机器人运动、控制闭环短板是深度学习、C、ROS考研选导师的时候重点看导师课题是否面向机器人/无人系统感知而不是纯计算机视觉。如果你需要我可以帮你整理一份该方向考研择校导师筛选简易模板教你怎么看导师主页判断导师是不是做目标识别环境理解避开挂羊头卖狗肉的导师。