☰
YOLOv8目标检测实战:在Colab云端GPU上完成训练与推理
2026/10/20 4:39:04 网站建设 项目流程

这几天我在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 /content

2.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: dog

path是数据集根目录绝对路径,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=20

4.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=True

source可以填单张图片路径,也可以填整个文件夹路径。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 onnxruntime
import 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/pred
from 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 memorybatch太大、imgsz太大调小batch或imgsz,先用yolov8n验证
训练中断,连接断开免费实例闲置超时或配额限制输出目录放到云盘,用last.pt续训
找不到数据集文件data.yaml用了相对路径全部改成绝对路径,并用!ls确认目录
没有ultralytics模块新会话环境被重置每次重新执行安装命令
训练集标签报错标签格式不是归一化格式把坐标转成class x_center y_center width height
预测结果目录找不到未指定project或namepredict命令显式指定输出目录
挂载网盘后文件读不到授权未完成或路径不对用!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开始,熟悉这套流程之后再逐步加大规模。我个人习惯是把所有常用命令保存在一个独立的笔记里,每当新建会话就直接复用,而不是每次临时去翻历史记录。这样既能减少重复劳动,也能让整套操作保持稳定。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询