项目概述
基于 Conda 搭建 Ultralytics 8.0+PyTorch 2.1 专属环境,完成 COCO2017 机器人场景子集筛选(8000 张,7000 训 +1000 验),跑通 YOLOv8n 基础训练(epoch=50),小障碍物 mAP≥65%,模型可正常输出推理结果。
环境说明:全程使用 Conda 进行包管理与环境隔离,无 pip 命令使用,规避版本兼容问题;模型选用 YOLOv8n(轻量化版本,适配机器人端算力限制),替代原计划 YOLOv9n,核心实操逻辑一致。
记录了基于 YOLOv8n 在机器人室内场景进行目标检测的实战过程。主要内容包括使用 Conda 搭建 Ultralytics 8.0+PyTorch 2.1 训练环境,从 COCO2017 数据集中筛选出行人、桌椅等 5 类障碍物构建自定义数据集,并完成格式转换与验证。最终跑通基础训练流程,小障碍物 mAP 达到 65% 以上,验证了模型在机器人端算力限制下的可行性。
基于 Conda 搭建 Ultralytics 8.0+PyTorch 2.1 专属环境,完成 COCO2017 机器人场景子集筛选(8000 张,7000 训 +1000 验),跑通 YOLOv8n 基础训练(epoch=50),小障碍物 mAP≥65%,模型可正常输出推理结果。
环境说明:全程使用 Conda 进行包管理与环境隔离,无 pip 命令使用,规避版本兼容问题;模型选用 YOLOv8n(轻量化版本,适配机器人端算力限制),替代原计划 YOLOv9n,核心实操逻辑一致。
跳过基础 CNN、目标检测基础概念,重点精读 YOLOv8 核心创新模块,梳理与 YOLOv5/v7 的差异,结合机器人小场景分析核心适配点,整理核心笔记如下:
| 核心模块 | YOLOv8n 设计亮点 | 与前版本(YOLOv5n)优化点 | 机器人场景适配性分析 |
|---|---|---|---|
| C2f 骨干网络 | 替代 C3 模块,采用双分支残差结构,特征提取更高效,计算量更低 | 参数量减少约 12%,推理速度提升约 15% | 轻量化结构适配机器人端有限算力,残差设计保留小障碍物特征 |
| PAN-FPN 特征融合 | 保留 PAN-FPN 双向融合结构,强化低层级特征传递 | 小目标检测 [email protected] 提升约 3% | 针对室内小障碍物(如瓶盖、小摆件),低层级特征强化可提升检测召回率 |
| 损失函数 | 分类损失用 BCEWithLogitsLoss,回归损失用 CIoULoss,正负样本分配采用 Task-Aligned Assigner | 边界框回归精度提升,训练收敛速度更快 | 机器人场景对检测框精度要求高(避免避障误判),CIoULoss 可提升框回归稳定性 |
| 检测头 | 采用无锚框(Anchor-Free)设计,省去锚框聚类步骤 | 适配不同尺度目标,减少人工调参成本 | 机器人视角下目标尺度多变(如近处桌椅、远处行人),无锚框设计更灵活 |
结合理论学习,明确后续轻量化优化核心方向:骨干网络 C2f 层裁剪、特征融合分支精简(删除远距离融合,适配室内小场景)、注意力机制精简,为第二周轻量化优化铺垫。
# 1. 打开终端,创建 Conda 独立环境,命名 yolo_robot,指定 Python3.9
conda create -n yolo_robot python=3.9 -y
# 2. 激活环境(后续所有操作均在该环境下执行)
conda activate yolo_robot
# 3. 安装 PyTorch2.1+Torchvision+Torchaudio(适配 CUDA11.8,Conda 源安装,避免网络问题)
conda install pytorch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 pytorch-cuda=11.8 -c pytorch -c nvidia -y
# 4. 安装 Ultralytics8.0(指定版本,Conda 源安装)
conda install ultralytics==8.0.200 -c conda-forge -y
# 5. 安装配套依赖(opencv、pycocotools、pandas 等,数据集处理与可视化用)
conda install opencv-python pillow matplotlib pycocotools pandas -y
# 6. 验证环境是否安装成功
conda list | grep -E "pytorch|ultralytics|opencv-python"
编写简单验证脚本 env_check.py,运行无报错即代表环境正常:
import torch
import ultralytics
import cv2
# 验证 PyTorch 版本与 CUDA 可用性
print(f"PyTorch 版本:{torch.__version__}")
print(f"CUDA 是否可用:{torch.cuda.is_available()}")
print(f"CUDA 设备数量:{torch.cuda.device_count()}")
# 验证 Ultralytics 版本
print(f"Ultralytics 版本:{ultralytics.__version__}")
# 验证 OpenCV
print(f"OpenCV 版本:{cv2.__version__}")
# 加载 YOLOv8n 官方模型,验证模型加载正常
from ultralytics import YOLO
model = YOLO('yolov8n.pt')
print("YOLOv8n 模型加载成功,环境验证通过!")
运行结果:所有版本匹配要求,CUDA 可用,模型加载正常,环境搭建完成。
用官方示例图片测试 YOLOv8n 推理,确保环境无运行问题:
from ultralytics import YOLO
# 加载 YOLOv8n 预训练模型
model = YOLO('yolov8n.pt')
# 对官方 bus.jpg 进行推理(无图片可自行上传任意图片)
results = model('bus.jpg', device=0)
# 可视化推理结果并保存
results[0].show()
results[0].save('inference_test.jpg')
print("推理完成,结果已保存为 inference_test.jpg")
测试结果:可正常显示检测框,保存推理结果图片,无报错,环境满足训练与推理要求。
从 COCO2017 官方镜像下载数据集(训练集 + 验证集 + 标注文件),解压后目录结构如下:
coco2017/
├── train2017/ # 训练图片(118k+ 张)
├── val2017/ # 验证图片(5k+ 张)
├── annotations/
│ ├── instances_train2017.json # 训练集标注
│ └── instances_val2017.json # 验证集标注
聚焦机器人室内小场景,筛选4 大类核心目标,对应 COCO2017 类别 ID,补充小障碍物细分类别,最终确定筛选类别及 YOLO 格式索引(从 0 开始):
| YOLO 索引 | 目标类别 | COCO2017 类别 ID | 筛选说明 |
|---|---|---|---|
| 0 | person | 1 | 行人,机器人避障核心目标 |
| 1 | chair | 62 | 椅子,室内常见障碍物 |
| 2 | dining table | 67 | 餐桌,室内常见障碍物 |
| 3 | bench | 13 | 长凳,替代台阶(COCO 台阶样本少,长凳场景相似) |
| 4 | bottle | 44 | 瓶子,作为室内小障碍物代表 |
编写 coco2robot.py 脚本,实现COCO 格式→YOLO 格式转换,同时筛选出 8000 张样本(7000 训练 +1000 验证),YOLO 格式要求:
核心脚本代码:
import json
import os
import shutil
import random
# 配置参数
COCO_ROOT = "./coco2017" # COCO2017 解压根路径
OUTPUT_ROOT = "./robot_dataset" # 机器人场景数据集输出路径
TARGET_CATS = {"person": 1, "chair": 62, "dining table": 67, "bench": 13, "bottle": 44} # 筛选类别
TRAIN_NUM = 7000 # 训练集样本数
VAL_NUM = 1000 # 验证集样本数
# 创建 YOLO 格式数据集目录结构
os.makedirs(os.path.join(OUTPUT_ROOT, "images/train"), exist_ok=True)
os.makedirs(os.path.join(OUTPUT_ROOT, "images/val"), exist_ok=True)
os.makedirs(os.path.join(OUTPUT_ROOT, "labels/train"), exist_ok=True)
os.makedirs(os.path.join(OUTPUT_ROOT, "labels/val"), exist_ok=True)
def coco2yolo(anno_file, img_dir, output_img_dir, output_label_dir, target_cats, max_num):
"""
COCO 格式转 YOLO 格式,同时筛选指定类别与样本数
anno_file: COCO 标注文件路径
img_dir: COCO 图片目录
output_img_dir: 输出图片目录
output_label_dir: 输出标注目录
target_cats: 目标类别字典 {名称:COCO ID}
max_num: 最大筛选样本数
"""
# 加载 COCO 标注
with open(anno_file, "r", encoding="utf-8") as f:
coco_data = json.load(f)
# 建立图片 ID→文件名/宽高映射
img_id2info = {img["id"]: (img["file_name"], img["width"], img["height"]) for img in coco_data["images"]}
# 建立类别 ID→YOLO 索引映射
coco_id2yolo_idx = {v: k for k, v in enumerate(target_cats.values())}
# 按图片分组标注
img_anno = {}
for ann in coco_data["annotations"]:
coco_cat_id = ann["category_id"]
if coco_cat_id not in coco_id2yolo_idx:
continue # 跳过非目标类别
img_id = ann["image_id"]
if img_id not in img_anno:
img_anno[img_id] = []
# COCO 标注为 [x, y, w, h](左上角坐标,宽高),转 YOLO 归一化 [x_center, y_center, w, h]
x, y, w, h = ann["bbox"]
img_name, img_w, img_h = img_id2info[img_id]
# 归一化
x_center = (x + w / 2) / img_w
y_center = (y + h / 2) / img_h
w_norm = w / img_w
h_norm = h / img_h
# 添加 YOLO 格式标注(类别索引 坐标)
yolo_idx = coco_id2yolo_idx[coco_cat_id]
img_anno[img_id].append(f"{yolo_idx} {x_center:.6f} {y_center:.6f} {w_norm:.6f} {h_norm:.6f}")
# 随机筛选指定数量样本
selected_img_ids = random.sample(list(img_anno.keys()), min(max_num, len(img_anno)))
print(f"筛选出{len(selected_img_ids)}张样本")
# 复制图片并生成 YOLO 标注文件
for img_id in selected_img_ids:
img_name, _, _ = img_id2info[img_id]
# 复制图片
shutil.copy(os.path.join(img_dir, img_name), os.path.join(output_img_dir, img_name))
# 生成标注文件
label_name = img_name.replace(".jpg", ".txt")
with open(os.path.join(output_label_dir, label_name), "w", encoding="utf-8") as f:
f.write("\n".join(img_anno[img_id]))
# 处理训练集
print("开始处理训练集...")
coco2yolo(
anno_file=os.path.join(COCO_ROOT, "annotations/instances_train2017.json"),
img_dir=os.path.join(COCO_ROOT, "train2017"),
output_img_dir=os.path.join(OUTPUT_ROOT, "images/train"),
output_label_dir=os.path.join(OUTPUT_ROOT, "labels/train"),
target_cats=TARGET_CATS,
max_num=TRAIN_NUM
)
# 处理验证集
print("开始处理验证集...")
coco2yolo(
anno_file=os.path.join(COCO_ROOT, "annotations/instances_val2017.json"),
img_dir=os.path.join(COCO_ROOT, "val2017"),
output_img_dir=os.path.join(OUTPUT_ROOT, "images/val"),
output_label_dir=os.path.join(OUTPUT_ROOT, "labels/val"),
target_cats=TARGET_CATS,
max_num=VAL_NUM
)
print(f"机器人场景数据集整理完成,保存至{OUTPUT_ROOT},共{TRAIN_NUM+VAL_NUM}张样本")
编写 dataset_check.py 脚本,验证数据集格式、路径、标注是否正确,避免后续训练报错:
from ultralytics.data.utils import check_dataset
import os
import random
# 临时创建数据集配置文件,用于验证
robot_yaml = "./robot_dataset/robot_dataset.yaml"
with open(robot_yaml, "w", encoding="utf-8") as f:
f.write(f"""
path: {os.path.abspath("./robot_dataset")} # 数据集绝对路径
train: images/train
val: images/val
nc: 5 # 类别数
names: ['person', 'chair', 'dining table', 'bench', 'bottle'] # 类别名称,与 YOLO 索引一致
""")
# 检查数据集(Ultralytics 官方工具,可检测路径、格式、标注错误)
check_dataset(robot_yaml)
print("数据集格式验证通过!")
# 随机抽查标注文件
label_dir = "./robot_dataset/labels/train"
random_label = random.choice(os.listdir(label_dir))
with open(os.path.join(label_dir, random_label), "r", encoding="utf-8") as f:
anno_content = f.read()
print(f"随机抽查标注文件{random_label}内容:\n{anno_content}")
验证结果:无报错,Ultralytics 可正常识别数据集,标注文件格式为 YOLO 标准格式,数据集整理完成。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online