YOLOv8-3D(3D 目标检测 + 6D 抓取姿态) 一套可训练、可导出 ONNX、可对接双目 / 深度相机、可落地抓取的完整流程
一、YOLOv8-3D 到底是什么
- 官方 YOLOv8 没有原生 3D 头 ,但有两条工业主流路:
- YOLOv8 + 深度图 / 点云后处理(最稳、最快、工业首选)
- YOLOv8-3D 定制版(2D + 点云融合,端到端 3D 框)
你要的:双目 (RGB + 深度 + 点云) → 物体 3D 位置 → 抓取姿态 ,用方案 1最快落地。
二、整体流程(双目相机 + YOLOv8-3D)
- 双目 / 深度相机 → 输出:RGB、深度图、点云
- YOLOv8(2D 检测) → 输出:物体 2D 框、类别、置信度
- 深度 / 点云关联 → 输出:物体 3D 中心 (X,Y,Z)
- 3D 包围盒 / 姿态估计 → 输出:尺寸 (w,h,d)、旋转角 (RPY)
- 抓取姿态生成 → 输出:机械臂可直接用的 (X,Y,Z,R,P,Y, 夹爪宽度)
三、环境安装(直接复制)
bash
运行
pip install ultralytics opencv-python numpy open3d pyrealsense2
四、数据集准备(双目 / 深度相机采集)
1. 目录结构(标准 YOLO)
plaintext
your_3d_data/
├── images/
│ ├── train/
│ └── val/
├── labels/
│ ├── train/
│ └── val/
└── data.yaml
2. 标签格式(.txt,每行一个物体)
plaintext
class_id x_center y_center width height
- 全部归一化 0~1(除以图像宽高)
3. 深度 / 点云配对
每张 RGB 对应:
xxx_depth.png(16 位深度,单位 mm)xxx.pcd(点云,可选)
4. data.yaml 示例
yaml
path: ./your_3d_data
train: images/train
val: images/val
nc: 1
names: ['target_object']
五、训练 YOLOv8(2D 检测,为 3D 打基础)
1. 训练代码(train.py)
python
运行
from ultralytics import YOLO
# 加载预训练
model = YOLO("yolov8s.pt")
# 训练
model.train(
data="your_3d_data/data.yaml",
epochs=50,
imgsz=640,
batch=8,
device=0, # GPU
augment=True, # 增强
mixup=0.1
)
# 导出ONNX(ModelZoo可用)
model.export(format="onnx", simplify=True, imgsz=640)
2. 训练命令行(也行)
bash
运行
yolo train data=data.yaml model=yolov8s.pt epochs=50 imgsz=640
六、推理:2D 检测 + 3D 坐标解算(核心)
1. 加载模型与相机内参
python
运行
import cv2
import numpy as np
from ultralytics import YOLO
# 相机内参(双目/深度相机标定获得)
fx, fy = 615.0, 615.0
cx, cy = 320.0, 240.0
# 加载YOLOv8模型
model = YOLO("best.onnx")
2. 读取双目数据(RGB + 深度)
python
运行
# 相机实时读取或文件
rgb = cv2.imread("test_rgb.jpg")
depth = cv2.imread("test_depth.png", cv2.IMREAD_UNCHANGED) # 16位mm
3. YOLOv8 推理(2D 框)
python
运行
results = model(rgb, conf=0.5)
for result in results:
boxes = result.boxes
for box in boxes:
# 2D框像素坐标
x1, y1, x2, y2 = map(int, box.xyxy[0])
u, v = (x1+x2)//2, (y1+y2)//2 # 物体中心像素
4. 3D 坐标解算(相机坐标系,单位米)
python
运行
# 取深度(中心像素,单位米)
Z = depth[v, u] / 1000.0
# 3D坐标
X = (u - cx) * Z / fx
Y = (v - cy) * Z / fy
print(f"3D位置: X={X:.3f}, Y={Y:.3f}, Z={Z:.3f}")
七、生成抓取姿态(机械臂直接用)
python
运行
def get_grasp_pose(X, Y, Z, obj_w):
"""
obj_w: 物体宽度(米)
返回:X,Y,Z,R,P,Y,夹爪宽度
"""
# 抓取点:物体中心上方5mm
grasp_X = X
grasp_Y = Y
grasp_Z = Z + 0.005
# 姿态:垂直向下(可根据物体调整)
R = 0.0
P = np.pi
Yaw = 0.0
# 夹爪宽度:物体宽+5mm
gripper = obj_w + 0.005
return [grasp_X, grasp_Y, grasp_Z, R, P, Yaw, gripper]
# 调用
pose = get_grasp_pose(X, Y, Z, obj_w=0.08)
print("抓取姿态:", pose)
八、模型导出到 ModelZoo
训练好后直接导出 ONNX:
python
运行
model.export(format="onnx", simplify=True, imgsz=640)
- 得到
best.onnx→ 可直接导入地平线、海思、TensorRT、OpenVINO 部署 - 支持Jetson、工控机、嵌入式实时推理(30~60FPS)
九、双目相机标定(必做,否则 3D 不准)
用 OpenCV 双目标定工具 或 RealSense 自带标定,得到:
- 内参:
fx, fy, cx, cy - 畸变:
k1,k2,p1,p2 - 外参:左右相机旋转平移矩阵
十、你直接能落地的最简方案
- 硬件:RealSense D435i / 奥比中光 Astra(双目 + 深度 + 点云)
- 模型:YOLOv8s(2D 检测)→ 导出 ONNX
- 推理:RGB 检测 → 深度算 3D → 生成抓取姿态
- 输出:直接发给机械臂(如 UR、Fanuc、遨博)