云计算百科
云计算领域专业知识百科平台

手把手教你部署YOLO系列目标检测模型(含代码,使用Github官方代码版本)

手把手教你部署YOLO系列目标检测模型(含代码,使用Github官方代码版本)

  • 1 前言
  • 2 项目获取和部署
    • 2.1 项目获取
    • 2.2 部署项目
  • 3 使用官方权重进行检测
    • 3.1 单图片检测
  • 3.2 视频检测
  • 4 制作自己的数据集训练模型

1 前言

YOLO(You Only Look Once)系列是目前目标检测领域最具影响力的算法之一。它由 Joseph Redmon 等人于 2016 年首次提出,核心思想是将目标检测任务转化为单次回归问题,直接在整张图像上预测目标的类别与边界框,从而实现了检测速度与精度的出色平衡。经过多年迭代,YOLO 已从最初的 YOLOv1 演进到 YOLOv5、YOLOv8 乃至 YOLOv9、YOLOv10 等众多版本,在工业界和学术界都得到了广泛应用,覆盖自动驾驶、安防监控、工业质检、医学影像等众多场景。

Ultralytics 是 YOLO 系列最活跃的官方维护团队之一,其开源的 Ultralytics YOLO 项目(GitHub 仓库 ultralytics/ultralytics)提供了统一的模型训练、验证与推理接口,支持 YOLOv5、YOLOv8 及后续版本,并内置了丰富的预训练权重、数据集工具与可视化能力。该项目以简洁的 Python API 和命令行工具著称,让开发者无需深入底层实现即可快速完成目标检测任务的部署与落地。 大部分教程都是直接安装ultralytics的库运行yolo,这样缺少一些可定制性,例如想要修改、改进模型比较困难,本文是直接现在官方项目源码运行,具有更大的灵活性。 本教程将手把手带你基于 Ultralytics 官方 GitHub 项目,完成 YOLO 系列目标检测模型的获取、部署与推理,全程提供可运行的代码示例,帮助你从零开始跑通整个流程。

2 项目获取和部署

2.1 项目获取

Ultralytics在Github上有官方项目,大家可以自行搜索下载。由于官方代码下载之后还需要下载对应权重文件,加上有时候Git连不上,所以我帮大家下载好了项目源码和权重文件(YOLOv8、YOLO11、YOLO12),供大家免费下载,下载位置在:

2.2 部署项目

上述链接下载下来之后是一个压缩包,解压出来之后内容如下: 项目解压之后的内容 第一个文件夹就是Ultralytics的官方项目,一会儿我们要用Pycharm打开这个项目。第二个文件夹是官方提供的权重,我下载了一些,提供给各位使用。如果需要更多权重,可以查看官方项目中的“readme.md”文档。 接下来,我们使用Pycharm(用VSCode也行,不影响)以项目形式打开“ultralytics-main”这个文件夹。打开之后,可以考虑建立一个新的环境专门用于运行这个YOLO项目。如果不知道怎么样安装环境,可以参考我之前的博文:手把手教你安装Pytorch环境。 假设你现在新建了一个名为“yolo”的anaconda环境,那么请你激活他,让后使用“pip install ”命令将Pytorch环境安装好,然后将下列库全部安装好。

matplotlib>=3.3.0
numpy==1.24.4 # pinned by Snyk to avoid a vulnerability
opencv-python>=4.6.0
pillow>=7.1.2
pyyaml>=5.3.1
requests>=2.23.0
scipy>=1.4.1
tqdm>=4.64.0

为了方便,你可以将上面的内容复制到一个txt文档中(例如叫做reqs.txt),然后使用命令“pip install -r reqs.txt的路径/reqs.txt”一次性将所需的库全部装好。在运行过程中,如果还提示缺少什么库,那就装什么库即可。 最后,不要忘了在Pycharm中将项目的解释器设置为刚才部署好环境的那个解释器,在本例中,就是“yolo”环境中的解释器。

3 使用官方权重进行检测

好,经过上述步骤,项目就部署好了,接下来我们尝试使用官方的模型进行预测。

3.1 单图片检测

首先将“weights”文件夹直接拷贝到项目根目录,然后建立一个名为“detect.py”的脚本,然后编写测试脚本。

from ultralytics import YOLO

if __name__ == '__main__':
# 从官方文件中加载模型
model = YOLO(model=r'weights/yolov8n.pt') #模型路径
model.predict(source=r'ultralytics/assets', #图片路径
imgsz=416,
conf=0.5,
save=True,
show=True,
mode='exp',
show_labels=True
)

这里,你先只需要了解两个参数,如上面代码的注释所示。一个是你要加载的模型路径,上述代码加载了“weights”文件夹中的“yolov8n.pt”,也就是官方YOLOv8n模型用于检测,需要检测的图片放在文件夹“ultralytics/assets”中,这里面有官方提供的两张图片,你可以把他换成你自己想检测的图片文件夹。 直接运行上述脚本,检测好的图像会一闪而过,结果存储在根目录的“runs/detect”文件夹中,每次检测结果会在这个文件夹建立一个由“mode”参数指定的文件夹,例如本例,结果就存放在“runs/detect/exp”文件夹中。同一个“mode”参数运行多次,会自动以“1、2、3…”顺序编号。

3.2 视频检测

视频检测实际上核心原理和图像检测一模一样,只不过逻辑复杂一点点。 首先,我们从视频流(可以是视频文件或者摄像头)读取一帧图像,然后送给YOLO检测,最后显示出来。 代码如下:

"""
YOLO 视频目标检测 —— 实时显示版(OpenCV)
用法: python detect_video_show.py –source input.mp4 –model yolov8n.pt
按键: q 退出, s 保存当前帧截图
"""

import argparse
import time
from pathlib import Path

import cv2
from ultralytics import YOLO

def main():
parser = argparse.ArgumentParser(description="YOLO 视频目标检测(实时显示)")
parser.add_argument("–source",default="0", help="输入视频路径,或 0 表示摄像头")
parser.add_argument("–model", default="weights/yolov8n.pt", help="模型权重路径")
parser.add_argument("–conf", type=float, default=0.25, help="置信度阈值")
parser.add_argument("–iou", type=float, default=0.7, help="NMS IoU 阈值")
parser.add_argument("–device", default="cpu", help="推理设备: cpu / 0")
parser.add_argument("–save", action="store_true", help="是否保存输出视频")
parser.add_argument("–output", default="runs/detect/video_show", help="输出目录")
parser.add_argument("–imgsz", type=int, default=640, help="推理分辨率")
args = parser.parse_args()

# 打开视频源(支持摄像头 "0")
src = int(args.source) if args.source.isdigit() else args.source
if isinstance(src, str) and not Path(src).exists():
raise FileNotFoundError(f"视频文件不存在: {src}")

cap = cv2.VideoCapture(src)
if not cap.isOpened():
raise RuntimeError(f"无法打开视频源: {args.source}")

# 视频信息
fps = cap.get(cv2.CAP_PROP_FPS) or 25
w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
print(f"视频信息: {w}x{h} @ {fps:.2f} FPS")

# 输出视频写入器
writer = None
out_dir = Path(args.output)
if args.save:
out_dir.mkdir(parents=True, exist_ok=True)
out_path = out_dir / f"{Path(args.source).stem}_out.mp4"
fourcc = cv2.VideoWriter_fourcc(*"mp4v")
writer = cv2.VideoWriter(str(out_path), fourcc, fps, (w, h))
print(f"输出视频将保存至: {out_path}")

# 加载模型
model = YOLO(args.model)

prev_t = time.time()
while True:
ret, frame = cap.read()
if not ret:
print("视频结束或读取失败")
break

# 推理(传入单帧,verbose=False 关闭逐帧日志)
results = model.predict(
source=frame,
conf=args.conf,
iou=args.iou,
device=args.device,
imgsz=args.imgsz,
verbose=False,
)

# 画框(result.plot() 返回 BGR 图,可直接交给 OpenCV)
annotated = results[0].plot()

# 计算并显示 FPS
now = time.time()
fps_now = 1.0 / max(now – prev_t, 1e-6)
prev_t = now
cv2.putText(
annotated,
f"FPS: {fps_now:.1f}",
(10, 30),
cv2.FONT_HERSHEY_SIMPLEX,
1.0,
(0, 255, 0),
2,
)

# 显示
cv2.imshow("YOLO Video Detection (press q to quit)", annotated)

# 保存
if writer is not None:
writer.write(annotated)

# 按键处理
key = cv2.waitKey(1) & 0xFF
if key == ord("q"):
print("用户退出")
break
elif key == ord("s"):
shot = out_dir / f"shot_{int(time.time())}.jpg"
out_dir.mkdir(parents=True, exist_ok=True)
cv2.imwrite(str(shot), annotated)
print(f"已保存截图: {shot}")

cap.release()
if writer is not None:
writer.release()
cv2.destroyAllWindows()
print("完成")

if __name__ == "__main__":
main()

附:检测结果。 检测结果 nano版本检测性能还是有限,FPS是在老古董5代低压i7上跑出来的。

4 制作自己的数据集训练模型

下一篇博文更新,喜欢可以点个关注。

赞(0)
未经允许不得转载:网硕互联帮助中心 » 手把手教你部署YOLO系列目标检测模型(含代码,使用Github官方代码版本)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!