鑫霖科技
从零搭建目标检测系统 · 疫苗智能识别与分拣产线落地指南
基于 AVITS 5.0Plus 全自动疫苗智能传输系统 · 60 种疫苗盒子无序识别 + 机械手抓取
YOLO11 是 Ultralytics 于 2024 年 9 月发布的最新一代 YOLO 模型,在检测精度、推理速度和模型效率三方面取得了全新平衡。相比 YOLOv8,YOLO11 参数量更少、精度更高。
识别目标位置和类别,输出边界框 + 类别 + 置信度
像素级目标分割,输出每个实例的精确轮廓掩码
整图分类,判断图像属于哪个类别
人体关键点检测,输出 17 个骨骼点坐标
带角度的旋转边界框,适合遥感、文档等场景
视频中的多目标跟踪,支持 BoT-SORT 和 ByteTrack
以 batch=16、imgsz=640 为基准,batch 减半显存需求约减 40%。
| 模型 | 最低显存 | 推荐显存 | 推荐显卡 | 适合场景 |
|---|---|---|---|---|
| yolo11n | 4 GB | 6 GB | RTX 3060 | 快速验证、边缘设备 |
| yolo11s | 6 GB | 8 GB | RTX 3070 | 轻量部署 |
| yolo11m | 8 GB | 12 GB | RTX 3080 / 4070 | 通用(最佳性价比) |
| yolo11l | 10 GB | 16 GB | RTX 4080 / A4000 | 高精度 |
| yolo11x | 16 GB | 24 GB | RTX 4090 / A5000 | 最高精度、服务器 |
| 组件 | 最低要求 | 推荐配置 | 说明 |
|---|---|---|---|
| CPU | 4 核 | 8 核+ | 影响数据预处理速度 |
| 内存 | 16 GB | 32 GB+ | cache=True 需更多 RAM |
| 硬盘 | HDD | NVMe SSD | 数据加载瓶颈关键 |
| 电源 | 550W | 750W+ | 高端 GPU 功耗大 |
提供 T4 GPU(16GB 显存),适合小规模实验。限制:运行时间 12h,断线后数据丢失。
提供 P100 GPU(16GB),每周 30 小时配额。适合训练中等数据集。
import torch
print(f"PyTorch: {torch.__version__}")
print(f"CUDA: {torch.cuda.is_available()}")
if torch.cuda.is_available():
print(f"GPU: {torch.cuda.get_device_name(0)}")
print(f"显存: {torch.cuda.get_device_properties(0).total_mem / 1024**3:.1f} GB")
python -m venv D:\yolo11\venv
D:\yolo11\venv\Scripts\activatepip install ultralyticsyolo checksconda create -n yolo11 python=3.11 -y
conda activate yolo11
conda install pytorch torchvision pytorch-cuda=12.1 -c pytorch -c nvidia
pip install ultralytics
所有权重托管在 GitHub Releases,点击复制链接后用浏览器或 wget/curl 下载:
| 任务 | 模型名 | 下载链接(点击复制按钮) |
|---|---|---|
| 分割 | yolo11m-seg.pt | https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11m-seg.pt |
| 姿态 | yolo11m-pose.pt | https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11m-pose.pt |
| 分类 | yolo11m-cls.pt | https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11m-cls.pt |
| 旋转框 | yolo11m-obb.pt | https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11m-obb.pt |
GitHub 下载慢时可从 HuggingFace 获取模型文件。
from ultralytics import YOLO
# 加载预训练模型
model = YOLO(r"D:\yolo11\yolo11n.pt")
# 推理
results = model("https://ultralytics.com/images/bus.jpg")
# 显示 & 保存
results[0].show()
results[0].save(filename="result.jpg")
# 推理
yolo predict model=D:\yolo11\yolo11n.pt source="image.jpg"
# 训练
yolo train model=D:\yolo11\yolo11n.pt data=coco8.yaml epochs=100
# 验证
yolo val model=D:\yolo11\yolo11n.pt data=coco8.yaml
# 导出
yolo export model=D:\yolo11\yolo11n.pt format=onnx
| 要求 | 说明 |
|---|---|
| 格式 | JPG、PNG、BMP、TIFF、WEBP |
| 色彩模式 | RGB(不支持 CMYK) |
| 尺寸 | 不限,训练时自动缩放到 imgsz(默认 640x640) |
| 文件名 | 英文/数字,避免中文和特殊字符 |
| 维度 | 最低要求 | 推荐 |
|---|---|---|
| 每类数量 | 100-300 张 | 1000+ 张 |
| 清晰度 | 目标可辨认 | 目标区域 > 32x32 像素 |
| 多样性 | 3+ 种角度/光照 | 覆盖实际全部场景 |
| 负样本 | 5% | 10%(无目标背景图) |
| 类别均衡 | 差异 < 10 倍 | 各类数量接近 |
| 缺陷 | 后果 | 解决方案 |
|---|---|---|
| 图片模糊 | 模型学不到特征 | 删除过于模糊的图 |
| 背景单一 | 换场景就失效 | 多场景采集 |
| 目标太小 (<16px) | 漏检率高 | 增大 imgsz 或裁剪放大 |
| 数据量不够 | 严重过拟合 | 数据增强 + 预训练权重 |
| 类别不均衡 | 少数类检测差 | 过采样 + Focal Loss |
数据质量 > 数据数量。100 张高质量标注胜过 1000 张粗糙标注。
部署时用什么设备采集图像,训练就用什么设备拍摄。环境越贴近实际部署场景,模型效果越好。
| 设备 | 是否可用 | 适合场景 |
|---|---|---|
| 手机 | ✅ 完全够用 | 通用、快速采集 |
| 网络摄像头 | ✅ | 实时监控部署 |
| 工业相机 | ✅ | 工厂/产线质检 |
| 监控摄像头 | ✅ | 安防,直接截取视频帧 |
| 无人机 | ✅ | 遥感/俯拍巡检 |
| 场景 | 建议分辨率 | 原因 |
|---|---|---|
| 通用 | 1080p (1920x1080) | 缩放到 640x640 完全够用 |
| 小目标检测 | 2K-4K | 缩放后小目标仍有足够像素 |
| 实时视频 | 720p-1080p | 与推理输入匹配 |
尽量在训练数据中覆盖以下条件的组合:
| 维度 | 应覆盖的变化 |
|---|---|
| 光照 | 强光 / 顺光 / 逆光 / 阴天 / 夜间 / 室内灯光 / 混合光源 |
| 背景 | 简单(纯色) + 复杂(杂乱) + 多个不同地点 |
| 天气/季节 | 晴天 / 阴天 / 雨天 / 雾天(户外场景) |
| 拍摄角度 | 正面 / 侧面 / 俯视 / 仰视 |
| 拍摄距离 | 近景(目标占 50%+) 到 远景(目标 <5%) |
| 遮挡程度 | 包含部分遮挡 (30-70%) 的样本 |
| 部署场景 | 拍摄建议 |
|---|---|
| 工厂缺陷检测 | 用产线同款相机、同距离、同打光 |
| 交通监控 | 从监控摄像头直接截帧,各时段覆盖 |
| 仓库盘点 | 与实际货架距离一致,包含密集堆叠 |
| 无人机巡检 | 同飞行高度、同相机参数 |
| 手机 App | 用目标用户手机型号,手持自然抖动 |
| ❌ 错误做法 | ✅ 正确做法 |
|---|---|
| 全部用单反高清近拍 | 用实际部署设备拍摄 |
| 只拍完美光照条件 | 覆盖各种光照 |
| 所有图片同一角度 | 多角度多距离 |
| 背景全部干净 | 包含真实杂乱背景 |
| 只拍完整目标 | 加入部分遮挡样本 |
| 用网图替代真实场景图 | 现场采集为主,网图仅补充 |
每张图片对应一个同名 .txt 文件,每个目标一行:
# 格式: class_id center_x center_y width height
# 所有坐标归一化到 [0, 1]
0 0.4531 0.6250 0.1875 0.3125
1 0.7344 0.3750 0.0938 0.1250
| 工具 | 类型 | 特点 | 导出格式 | 适合 |
|---|---|---|---|---|
| LabelImg | 本地 GUI | 简单免费 | YOLO TXT / VOC XML | 个人小批量 |
| Roboflow | 在线平台 | 自带增强和版本管理 | 所有主流格式 | 快速上手 |
| Label Studio | Web (开源) | 支持多种任务 | YOLO / COCO / VOC | 中大型团队 |
| CVAT | Web (开源) | 支持视频逐帧标注 | YOLO / COCO / VOC | 视频数据 |
class_id 从 0 开始连续编号内置 100+ AI 模型(SAM、YOLO11、Grounding DINO),GUI 界面一键自动标注,人工微调后直接导出 YOLO 格式。安装约 500MB。
pip install x-anylabeling
x-anylabeling # 启动 GUI
输入文字描述(如 "cat, dog"),自动定位目标 + 生成分割掩码,零样本、无需预训练。适合新类别快速冷启动。
# 文字描述 → 自动检测框 → 分割掩码 → YOLO 标签
# "person, car, bicycle" → 全自动生成标注
大模型标注 → 自动训练小模型,适合大批量无人值守标注。
from autodistill_grounded_sam import GroundedSAM
from autodistill.detection import CaptionOntology
base_model = GroundedSAM(
ontology=CaptionOntology({
"person": "person",
"car": "car",
})
)
base_model.label("./images", extension=".jpg")
| 工具 | 易用性 | 精度 | 速度 | GPU 需求 | 适合规模 |
|---|---|---|---|---|---|
| X-AnyLabeling | ⭐⭐⭐⭐⭐ GUI | 高 | 快 | 可选 | 个人/小团队 |
| Grounding DINO+SAM | ⭐⭐⭐ 代码 | 最高 | 中 | 需要 | 新类别冷启动 |
| Autodistill | ⭐⭐⭐ 代码 | 高 | 批量快 | 需要 | 大批量自动化 |
| CVAT (内置 AI) | ⭐⭐⭐⭐ Web | 高 | 中 | 可选 | 团队协作 |
my_dataset/
├── images/
│ ├── train/ # 训练图片
│ │ ├── img001.jpg
│ │ └── img002.jpg
│ └── val/ # 验证图片
│ ├── img101.jpg
│ └── img102.jpg
├── labels/
│ ├── train/ # 训练标签 (.txt)
│ │ ├── img001.txt
│ │ └── img002.txt
│ └── val/
│ ├── img101.txt
│ └── img102.txt
└── data.yaml # 数据集配置
# my_dataset/data.yaml
path: D:/datasets/my_dataset # 数据集根目录(用正斜杠)
train: images/train
val: images/val
test: images/test # 可选
# 类别定义
names:
0: person
1: car
2: bicycle
3: dog
data.yaml 中路径使用 / 而非 \。反斜杠会被 YAML 解析器当作转义字符。
from ultralytics import YOLO
model = YOLO("yolo11m.pt")
results = model("street.jpg")
for r in results:
for box in r.boxes:
cls = int(box.cls[0])
conf = float(box.conf[0])
xyxy = box.xyxy[0].tolist()
print(f"{model.names[cls]}: {conf:.2f} at {xyxy}")
model = YOLO("yolo11m-seg.pt")
results = model("street.jpg")
for r in results:
if r.masks is not None:
for mask in r.masks.data:
binary = mask.cpu().numpy() # shape=(H,W), 0/1
model = YOLO("yolo11m-cls.pt")
results = model("cat.jpg")
probs = results[0].probs
print(probs.top5) # Top-5 类别索引
print(probs.top5conf) # Top-5 置信度
model = YOLO("yolo11m-pose.pt")
results = model("person.jpg")
for r in results:
if r.keypoints is not None:
xy = r.keypoints.xy # (N, 17, 2)
conf = r.keypoints.conf # (N, 17)
model = YOLO("yolo11m-obb.pt")
results = model("aerial.jpg")
for r in results:
if r.obb is not None:
xywhr = r.obb.xywhr # cx, cy, w, h, 弧度角
from ultralytics import YOLO
model = YOLO(r"D:\yolo11\yolo11m.pt")
results = model.train(
data="my_dataset.yaml",
epochs=100,
imgsz=640,
batch=16,
device=0,
workers=8,
project="runs/train",
name="my_experiment",
)
| 参数 | 默认值 | 说明 |
|---|---|---|
| epochs | 100 | 训练总轮数 |
| batch | 16 | 批大小,-1 自动选择 |
| imgsz | 640 | 输入尺寸(32 的倍数) |
| lr0 | 0.01 | 初始学习率 |
| optimizer | auto | SGD / Adam / AdamW / RMSProp |
| patience | 100 | 早停(无提升即停止) |
| freeze | None | 冻结前 N 层 |
| resume | False | 从中断处继续 |
| amp | True | 混合精度训练 |
| cache | False | 缓存图像加速 |
| close_mosaic | 10 | 最后 N 轮关闭 Mosaic |
| 参数 | 默认 | 说明 |
|---|---|---|
| hsv_h / hsv_s / hsv_v | 0.015 / 0.7 / 0.4 | 色相/饱和度/明度增强 |
| degrees | 0.0 | 旋转角度 |
| translate / scale | 0.1 / 0.5 | 平移/缩放 |
| fliplr / flipud | 0.5 / 0.0 | 左右/上下翻转概率 |
| mosaic / mixup | 1.0 / 0.0 | Mosaic / MixUp 概率 |
| erasing | 0.4 | 随机擦除概率 |
# 恢复训练
model = YOLO("runs/train/exp/weights/last.pt")
model.train(resume=True)
# 多 GPU
model.train(data="coco.yaml", epochs=100, device=[0, 1, 2, 3])
model = YOLO("runs/train/exp/weights/best.pt")
metrics = model.val(data="my_dataset.yaml", plots=True)
print(f"mAP50: {metrics.box.map50:.4f}")
print(f"mAP50-95: {metrics.box.map:.4f}")
print(f"Precision: {metrics.box.mp:.4f}")
print(f"Recall: {metrics.box.mr:.4f}")
| 类型 | 示例 |
|---|---|
| 图片 | "image.jpg" / "images/*.jpg" |
| 视频 | "video.mp4" |
| 摄像头 | 0 |
| RTSP 流 | "rtsp://..." |
| 屏幕截图 | "screen" |
| NumPy / PIL / Tensor | Python 对象 |
results = model.predict(
source="image.jpg",
conf=0.25, # 置信度阈值
iou=0.7, # NMS IoU 阈值
imgsz=640,
half=True, # FP16 推理
max_det=300,
classes=[0, 2], # 只检测特定类别
save=True,
stream=True, # 流式处理(节省内存)
)
for r in results:
print(r.orig_shape) # 原图尺寸
print(r.speed) # 各阶段耗时
boxes = r.boxes
print(boxes.xyxy) # [x1, y1, x2, y2]
print(boxes.conf) # 置信度
print(boxes.cls) # 类别
annotated = r.plot() # 返回标注后的 BGR 图像
| 格式 | 参数 | 加速倍率 | 适用平台 |
|---|---|---|---|
| ONNX | format="onnx" | ~3x CPU | 通用、跨平台 |
| TensorRT | format="engine" | ~5x GPU | NVIDIA GPU |
| OpenVINO | format="openvino" | ~3x CPU | Intel CPU/iGPU |
| CoreML | format="coreml" | - | Apple 设备 |
| TFLite | format="tflite" | - | Android/嵌入式 |
| NCNN | format="ncnn" | - | 移动端 (ARM) |
model = YOLO(r"D:\yolo11\yolo11m.pt")
# ONNX
model.export(format="onnx", dynamic=True, simplify=True)
# TensorRT FP16
model.export(format="engine", half=True)
# 导出后直接使用
onnx_model = YOLO("yolo11m.onnx")
results = onnx_model("image.jpg") # 与 .pt 用法完全一致
model = YOLO(r"D:\yolo11\yolo11m.pt")
results = model.track(
source="video.mp4",
tracker="botsort.yaml", # 或 "bytetrack.yaml"
persist=True,
show=True,
)
for r in results:
if r.boxes.id is not None:
ids = r.boxes.id.int().tolist()
print(f"跟踪 ID: {ids}")
| 跟踪器 | 特点 | 适用场景 |
|---|---|---|
| BoT-SORT | 高精度、低 ID 切换、支持 ReID | 需要稳定 ID |
| ByteTrack | 速度快、低误检利用 | 实时性要求高 |
# 基本语法
yolo <TASK> <MODE> [ARGS...]
# TASK: detect, segment, classify, pose, obb
# MODE: train, val, predict, export, track, benchmark
# ===== 常用命令速查 =====
# 推理
yolo predict model=yolo11n.pt source="image.jpg" conf=0.25
yolo predict model=yolo11m.pt source="video.mp4" save=True
yolo predict model=yolo11n.pt source=0 # 摄像头
# 训练
yolo train model=yolo11n.pt data=coco8.yaml epochs=100 imgsz=640
yolo train model=yolo11m.pt data=custom.yaml batch=8 device=0,1
# 验证
yolo val model=runs/train/exp/weights/best.pt data=custom.yaml
# 导出
yolo export model=yolo11m.pt format=onnx dynamic=True
yolo export model=yolo11m.pt format=engine half=True
# 跟踪
yolo track model=yolo11m.pt source="video.mp4" tracker=bytetrack.yaml
# 基准测试
yolo benchmark model=yolo11n.pt imgsz=640
# 系统检查
yolo checks
yolo settings
model = YOLO("yolo11n.pt")
result = model.tune(
data="coco8.yaml",
epochs=30,
iterations=300,
optimizer="AdamW",
)
| 场景 | 建议调整 |
|---|---|
| 小目标检测差 | 增大 imgsz (640→1280);增加 scale 增强 |
| 训练过拟合 | 增加增强 (mosaic, mixup);减小模型规格 |
| 训练欠拟合 | 增大模型 (n→s→m);增加 epochs |
| 推理速度慢 | 减小 imgsz;使用更小模型;导出 TensorRT |
| 类别不平衡 | 过采样少数类;调整 class weights |
| 标注噪声大 | 增大 label_smoothing (0.0→0.1) |
原因:GPU 显存不足以容纳当前 batch。
解决:减小 batch (16→8→4→2);减小 imgsz;使用更小模型;设置 batch=-1 自动调节。
原因:学习率过大、数据集标注错误、data.yaml 路径不对。
解决:检查标注正确性;降低 lr0;确认路径用正斜杠;用 coco8 内置数据集测试排除代码问题。
原因:数据不足、标注质量差、模型太小。
解决:增加数据量;检查标注框是否紧贴目标;增加 epochs;使用更大模型。
原因:conf 阈值过高、模型未训练/未收敛。
解决:设置 conf=0.1 测试;确认模型训练完整(检查 best.pt 是否存在)。
原因:images/ 和 labels/ 目录结构不对称,或文件名不一致。
解决:确保两目录结构镜像对称,图片和标签仅扩展名不同。
原因:CUDA / cuDNN / TensorRT 版本不兼容。
解决:确认三者版本兼容;先导出 ONNX 验证成功后再转 TensorRT。
原因:Windows 的 multiprocessing 限制。
解决:设置 workers=0;或确保代码在 if __name__ == '__main__' 中运行。
原因:图片损坏、路径含中文/特殊字符。
解决:检查图片完整性;路径全部使用英文;避免空格和特殊字符。
| 数据集 | 类别 | 图片量 | 用途 |
|---|---|---|---|
| COCO 2017 | 80 | 118K + 5K | 通用检测基准 |
| VOC 2012 | 20 | 11K | 经典入门 |
| Objects365 | 365 | 2M | 大规模预训练 |
| Open Images V7 | 600 | 1.9M | 最大开源检测集 |
| DOTA v2 | 18 | 11K | 遥感旋转目标 |