这几天我在Colab上完整跑了一遍YOLOv8项目,从数据集准备到模型训练、推理导出,整个过程比想象中顺,坑也比预期多。YOLOv8是目前很常用的目标检测框架,Colab则是免费云端的笔记本环境,两者搭配起来最大的好处是可以不靠本地显卡训练模型。适合刚入门目标检测、只有普通电脑、又不想折腾本地CUDA环境的人,也适合需要快速验证训练思路的老手。
这篇文章不打算讲太深的理论,就是把我实际操作时梳理清楚的步骤、踩过的坑、以及最后沉淀下来的可用方案完整记下来。你用普通笔记本跑一个很小的模型都可能显存报警,但换到Colab上,哪怕免费额度也能跑通几十轮训练。关键是要把环境、数据、输出目录这三件事安排明白。
1. 为什么把YOLOv8放在Colab里跑
1.1 云端跑YOLOv8解决了什么
把YOLOv8放到Colab,最先解决的就是硬件门槛。本地电脑如果只有一张入门级显卡,显存可能只有4到6GB,训练一个中等规模的数据集,模型稍微大一点就很容易把显存吃满。而且本地配CUDA、cuDNN、PyTorch环境,版本稍微对不上就报一堆莫名其妙的错,光是装环境就能劝退一批人。
Colab这种云端笔记本环境,本质上已经把一个带GPU的Linux虚拟机准备好了。你打开浏览器就能用,不需要关心驱动版本、不需要手动安装CUDA,PyTorch这类基础依赖也预装好了。YOLOv8目前的核心代码可以通过一个Python包直接调用,安装命令就一行,这在本地往往要折腾很久。
还有一个很实际的好处是可复现。我把训练命令和数据处理步骤都写在Colab的单元格里,整个训练过程就是从上往下执行一遍。换一台电脑、换个时间,打开同一个笔记也能按相同顺序跑,不用依赖某台机器上曾经手动配置过的环境。
1.2 免费实例是怎么限制你
不要以为免费资源没有代价。Colab免费实例有几个明显的限制,实际操作前必须心里有数。
首先是会话不是永久的。虚拟机可能因为闲置超时被回收,训练时间太长也可能在某个时刻直接断掉。我遇到最尴尬的一次是训练跑到第60个epoch时连接断开,本地没保存任何可恢复的权重,最后只能从头再来。后来我养成了一个习惯:所有输出目录尽量放在云盘里,或者每隔一段时间手动备份一次,不要再依赖“这个笔记本不会被关掉”这种假设。
其次是GPU配额并不固定。免费用户可能今天可以选到加速运行时,明天同一账号就没有配额,只能退回CPU环境。CPU上跑YOLOv8不是不能跑,但速度会慢到让人失去耐心。所以每次新建会话后,我第一件事就是运行!nvidia-smi,确认当前实例确实分配到了GPU,而不是在CPU上傻等。
再者是磁盘空间有限。免费虚拟机的磁盘不是无限大,数据集加上模型权重、训练日志,很容易把空间占满。数据尽量精简,模型权重不需要的及时清理,/content目录下面不要堆太多临时文件。
1.3 什么情况不建议用Colab
Colab适合快速迭代,但不适合所有训练场景。如果你的数据集有好几十GB,或者训练任务要跑几天几夜,免费实例大概率扛不住。这种场景更适合用本地工作站、专用服务器或者付费训练平台。
也不要把它当成可靠的生产部署环境。Colab的虚拟机会频繁回收,好不容易训练出来的权重文件如果只存在/content下面,断线后全部消失。做实验、验证思路、跑Demo,Colab很合适;真要长期跑任务,必须想清楚备份和恢复方案。
2. 环境准备:从新建笔记本到跑通第一行代码
2.1 新建笔记本并切换GPU运行时
打开Colab后第一步是新建笔记本,然后切换运行时类型。具体操作是菜单里的“代码执行程序”或“运行时”选项,选择“更改运行时类型”,把硬件加速器设置成GPU。如果数据量不大但内存吃紧,也可以顺便选择高内存模式,不过免费用户不一定每次都能选到。
切换完成之后,建议先用一行命令确认环境:
!nvidia-smi如果能看到显卡信息,说明当前实例已经分配到了GPU。如果输出里找不到显卡,或者提示命令不存在,说明当前可能运行在CPU环境,需要重新建笔记本再试一次。我通常还会顺便看一眼显存大小和剩余空间,后面调节batch参数时心里有数。
!df -h /content2.2 安装依赖并验证版本
Colab自带了PyTorch,但不会自带YOLOv8的依赖包,所以每次新建会话后都要重新安装一次。指令非常简单:
!pip install -q ultralytics-q参数用来隐藏安装过程的大量日志,不然输出会刷屏。装完马上验证一下版本:
!python -c "import ultralytics; print(ultralytics.__version__)"能正常打印出版本号,说明环境没问题。如果这一步报错,大概率是网络下载包失败或版本冲突,先重新执行安装命令,遇到具体的报错信息再处理。
有一个细节要注意:Colab的预装环境版本可能会变,有时ultralytics要求更高的PyTorch版本,而Colab自带的版本还不够。这种情况我一般先升级包,让依赖管理器自动调整:
!pip install --upgrade ultralytics尽量不要一股脑手动重装PyTorch,容易把Colab原本已经配置好的环境弄乱。
2.3 把项目目录固定下来
Colab会话的当前工作目录默认是/content。我习惯单独建一个项目目录,避免所有文件堆在一起,也方便后面用绝对路径引用:
%cd /content !mkdir -p /content/workspace %cd /content/workspace每次新建会话后,当前目录会重置,所以这些目录创建命令都需要重新执行。更稳妥的做法是在笔记本开头统一设置,后续所有训练、预测命令都用绝对路径,不要在命令里写相对路径,因为Colab的执行顺序和本地终端不太一样,相对路径很容易出错。
3. 数据准备:让模型有东西可学
3.1 YOLOv8的数据集目录结构
YOLOv8的训练数据不是一张图片配一个标注文件放一起那么简单,它有一套固定的目录规范。最基础的结构是这样的:
datasets/ ├── images/ │ ├── train/ │ │ ├── cat_01.jpg │ │ └── dog_02.jpg │ └── val/ │ ├── cat_03.jpg │ └── dog_04.jpg ├── labels/ │ ├── train/ │ │ ├── cat_01.txt │ │ └── dog_02.txt │ └── val/ │ ├── cat_03.txt │ └── dog_04.txt └── data.yaml每张图片对应的标签文件是同名TXT文件,里面每一行代表一个目标框,格式是五个数字:
class_id x_center y_center width height其中x_center、y_center、width、height全部是归一化到0到1之间的值。也就是说,中心点坐标和宽高都要除以图片的原始宽高。比如一张宽1000像素、高800像素的图片,某个目标框左上角在x=200、y=100,宽400、高300,那么中心点就是x=(200+400/2)=400,y=(100+300/2)=250,归一化后是400/1000=0.4、250/800=0.3125,宽高则是0.4和0.375。
这个格式不复杂,但特别容易错。很多标注工具导出的格式是x_min y_min x_max y_max,直接丢给YOLO训练会报标签格式错误或训练结果异常,需要先转换成归一化格式。
3.2 把数据集传进Colab
本地数据集要进入Colab,最省事的方式是先传到云盘,然后在代码里挂载云盘目录:
from google.colab import drive drive.mount('/content/drive')执行后会生成一个授权链接,点击授权、输入验证码,云盘就挂载到/content/drive下面了。
挂载之后有两种选择:直接软链接,或者复制到本地。
如果数据集不大,我建议先复制到本地:
!cp -r "/content/drive/MyDrive/path/to/datasets" /content/workspace/datasets训练过程中需要反复读取图片,拷到Colab本地虚拟磁盘速度更快,也能减少云盘接口的负担。如果担心断线丢失,就把云盘当作备份盘,训练完成后把结果再复制回去。
如果数据集很大,可以先建软链接跑通流程:
!ln -s "/content/drive/MyDrive/path/to/datasets" /content/workspace/datasets软链接不占本地空间,但读取速度会受网盘传输速度影响。跑小数据或验证流程可以用软链接,正式训练尽量用完整复制。
3.3 写一份可靠的data.yaml
YOLOv8通过一个YAML文件告诉训练程序数据在哪里、类别有哪些。我常用的是绝对路径写法:
path: /content/workspace/datasets train: images/train val: images/val nc: 2 names: 0: cat 1: dogpath是数据集根目录绝对路径,train和val是相对于根目录的子目录。nc是类别数量,names是类别名字列表,顺序必须和TXT标签里的class_id对应,这个顺序一旦写错,训练出来的模型类别全乱。
有一点很关键:尽量用绝对路径,不要用相对路径。Colab会话切换目录后,相对路径很容易失效,而训练报错时最难排查的就是这种“看起来没错但就是找不到文件”的情况。
4. 训练:参数、流程和监控
4.1 一条命令把训练跑起来
环境好了、数据也准备好了,训练本身其实是一条命令的事:
!yolo train \ data=/content/workspace/datasets/data.yaml \ model=yolov8n.pt \ epochs=80 \ imgsz=640 \ batch=16 \ device=0 \ project=/content/drive/MyDrive/yolo_runs \ name=first_run逐项拆开看:
data指向刚才写好的YAML文件。model=yolov8n.pt表示从预训练权重起步。第一次下载权重会联网下载,只要网络正常就不用管。epochs=80训练80轮。数据量小可以先跑20轮看趋势。imgsz=640输入图片分辨率。不是越大越好,显存有限时反而容易爆。batch=16单批次图片数。这个参数很重要,Colab自动选择的batch可能会偏大,手动指定更可控。device=0指定第一块GPU。如果机器上没有GPU,可以改成device=cpu,但速度会慢很多。project和name共同决定输出目录,这样多次实验可以分开存放,不会互相覆盖。
YOLOv8还有一个常用参数是patience,比如patience=20表示验证指标连续20轮没提升就提前停止,能省不少时间。第一次跑建议加上:
!yolo train ... patience=204.2 第一次训练选哪个模型
YOLOv8有不同尺寸,常见的有yolov8n、yolov8s、yolov8m、yolov8l、yolov8x。从n到x,模型参数量和计算量依次增加,精度通常会提高,但训练时间和显存占用也会明显上升。
我第一次跑Demo时直接用yolov8n,原因很简单:先用最快速度把全流程跑通,确定代码、数据、路径都没问题,再回来换成大模型。如果一开始就用大模型,报错时很难分清是环境问题还是参数问题。
免费GPU环境下,我建议也用yolov8n或yolov8s起步。小模型训练速度快,多跑几次调参成本低。数据量不大的话,yolov8n的精度完全够用。
4.3 训练过程中看什么
训练时终端会持续输出一张实时更新的指标表,核心看几个字段:
box_P:边界框精确率box_R:边界框召回率mAP50:IOU阈值0.5时的平均精度mAP50-95:更严格的综合平均精度
不需要每一步都死盯,我一般是看趋势:前几个epoch有没有明显上升,loss是否持续下降,mAP是否还在变。如果跑了20轮还是几乎不涨,问题基本出在数据或参数上。
训练结束后,输出目录里会自动生成results.png和results.csv。results.csv是每个epoch的详细数据,可以用表格软件打开分析;results.png则直接把训练曲线画出来了,扫一眼就能看出收敛情况。
4.4 训练中断了怎么续传
Colab会话一旦断开,正在运行的进程会被回收,这是免费实例最大的不可控因素。好的是YOLOv8每轮都会保存last.pt,验证指标最好的那轮另存为best.pt,只要这两个文件还在,就能断点续训。
续训命令很简单:
!yolo train resume model=/content/drive/MyDrive/yolo_runs/first_run/weights/last.pt如果输出目录在云盘,即使虚拟机关了,权重也还在。这也是我一直坚持把project指到云盘的原因。
需要注意,last.pt只保存到断线前那一轮,续训之后可能还需要继续观察验证集指标,不一定非要等到best.pt更新。
5. 推理和部署:用自己的权重跑检测
5.1 用训练好的权重做图片推理
训练完成后,真正要用的是best.pt。推理命令和训练一样直接在笔记本里执行:
!yolo predict \ model=/content/drive/MyDrive/yolo_runs/first_run/weights/best.pt \ source=/content/workspace/test_images \ project=/content/workspace/runs \ name=pred \ save=Truesource可以填单张图片路径,也可以填整个文件夹路径。save=True会把标注后的图片保存下来。如果不指定project和name,预测结果可能会跑到默认的/content/runs/detect/predict目录,占用位置有点隐蔽,建议每次都显式指定。
推理完成后,可以直接在笔记本里可视化结果:
from IPython.display import Image, display display(Image(filename="/content/workspace/runs/pred/cat_01.jpg"))5.2 视频检测和批量处理
source参数同样支持视频文件路径。YOLOv8会一帧一帧做检测,然后把结果合成一个新的视频文件。视频越长、分辨率越大,处理时间就越久,建议先截一段短视频测试流程,不要一上来就丢一个完整长视频进去。
批量处理图片时,source指向文件夹即可。两个参数经常要配合调整:
conf=0.25:置信度阈值,低于阈值的检测结果会被过滤。iou=0.45:NMS的IOU阈值,控制重叠框的合并。max_det=300:单张图最多保留的目标数量。
这些参数可以在predict命令里直接加,不用改训练权重。同一个模型在不同场景下,可能需要把conf调高或调低。比如密集小目标检测,阈值太高会漏检,太低则会很多误检。
5.3 导出成部署格式
训练好的权重不一定要一直放在PyTorch环境里跑,YOLOv8支持导出成多种格式:
!yolo export \ model=/content/drive/MyDrive/yolo_runs/first_run/weights/best.pt \ format=onnx \ imgsz=640导出之后会生成一个ONNX文件。其他常用格式还有torchscript、tflite、openvino等,根据你的部署平台选择即可。
导出成ONNX之后,可以用onnxruntime做个快速验证:
!pip install -q onnxruntimeimport onnxruntime as ort session = ort.InferenceSession("/content/workspace/runs/export/best.onnx") print(session.get_inputs()[0].name)能正常读取输入输出节点,说明导出基本没问题。这一步主要为了确认导出文件没有损坏,真正部署时还要按目标环境做适配。
5.4 把结果下载回本地
Colab里生成的文件如果只是临时看看,可以直接用代码下载。
单文件下载:
from google.colab import files files.download("/content/workspace/runs/pred/cat_01.jpg")下载整个文件夹时,先打包再下载:
!zip -qr /content/workspace/predictions.zip /content/workspace/runs/predfrom google.colab import files files.download("/content/workspace/predictions.zip")也可以直接把文件复制到云盘指定目录,这是我最常用的方式,因为可以批量操作、路径清晰:
!cp -r /content/workspace/runs/pred "/content/drive/MyDrive/yolo_results/"6. 常见问题与排查
6.1 高频问题速查表
下面这些是我实际操作中遇到的典型问题,整理成速查表方便对照:
| 问题 | 典型原因 | 解决办法 |
|---|---|---|
| CUDA out of memory | batch太大、imgsz太大 | 调小batch或imgsz,先用yolov8n验证 |
| 训练中断,连接断开 | 免费实例闲置超时或配额限制 | 输出目录放到云盘,用last.pt续训 |
| 找不到数据集文件 | data.yaml用了相对路径 | 全部改成绝对路径,并用!ls确认目录 |
| 没有ultralytics模块 | 新会话环境被重置 | 每次重新执行安装命令 |
| 训练集标签报错 | 标签格式不是归一化格式 | 把坐标转成class x_center y_center width height |
| 预测结果目录找不到 | 未指定project或name | predict命令显式指定输出目录 |
| 挂载网盘后文件读不到 | 授权未完成或路径不对 | 用!ls /content/drive/MyDrive确认实际路径 |
| 训练速度极慢 | 当前实例可能跑在CPU | 运行nvidia-smi确认GPU是否可用 |
6.2 独家避坑经验
第一,先跑通再跑好。我建议第一次训练不要用完整数据集,先挑几个类别、每类几十张图,用yolov8n跑10到20个epoch。这个过程花不了多少时间,但能把环境、路径、命令、输出目录全部验证一遍。后面换大模型、扩数据时,同样一套流程跑起来会顺利很多。
第二,别把整个数据集长期放在网盘里供训练读取。大量小文件通过网盘挂载方式一个个读取,速度会被拖慢不少。正确做法是开始训练前把数据集复制到本地虚拟磁盘,或者打包上传后解压到/content下,训练完再只把关键权重和日志写回云盘。
第三,不要用保活脚本强行占着资源。Colab免费实例对长时间占用有限制,频繁尝试绕过限制的结果往往是账号配额更快被冻结。我现在的做法是:训练输出目录放在云盘,每次训练控制合理轮数,就算断线了也能快速续上,反而比一直挂机更高效。
第四,目录和文件名不要用空格、中文、特殊符号。Colab命令行对路径的转义规则和本地终端一样,空格很容易导致参数被截断。我吃过一次亏,数据集文件夹名带中文,训练时一直报路径不存在,换成英文名后立刻正常。
第五,每次开始跑之前,先检查当前实例的资源。一个简单的检查流程是:
!nvidia-smi !df -h /content !python -c "import ultralytics; print(ultralytics.__version__)"三步确认GPU、磁盘、依赖都正常,再开始下载数据和训练,能避免白跑一堆无用功。
6.3 断线之后的心态调整
我在Colab上经历过多次训练断线,印象最深的一次是训练到一半,连接突然断了,重新打开后发现/content目录已经完全重置。那个项目没有挂载云盘,模型和数据全军覆没。
后来我把恢复策略固定成了这样:项目目录下始终保留一份训练命令、一份数据准备说明、一份data.yaml;训练输出目录指向云盘;数据如果不大,每次都在开始阶段重新复制。这样一来,断线恢复的步骤就变成了“重开会话、安装依赖、复制数据、启动续训”四步,不再需要回忆当时到底改过什么配置。
如果你也打算在Colab上跑自己的YOLOv8项目,可以先从一个小数据集、小模型、二十个epoch开始,熟悉这套流程之后再逐步加大规模。我个人习惯是把所有常用命令保存在一个独立的笔记里,每当新建会话就直接复用,而不是每次临时去翻历史记录。这样既能减少重复劳动,也能让整套操作保持稳定。