侧边栏壁纸
博主头像
静水流深

静水流深,沧笙踏歌

  • 累计撰写 56 篇文章
  • 累计创建 0 个标签
  • 累计收到 44 条评论

目 录CONTENT

文章目录

如何用深度学习做目标识别?—— 完整工具链详解

唐韵
2026-04-05 / 0 评论 / 0 点赞 / 5 阅读 / 0 字

上一篇文章对一些概念有了大体了解,尽管并不深入,也不涉及太多原理,但是技术最重要的还是应用,可以先把 Demo 跑起来,在逐步优化的过程中继续学习底层原理,通过实践加深理解,从而达到更好的效果。

本文介绍 YOLO 进行图像目标识别的工具链,目的是让一个基于 YOLO v8 的视频图像目标识别Demo 工程跑起来,并在这个过程中了解需要用到哪些工具软件,以及如何配置这些工具。

一、工具及其作用

  • 一台搭载 3070 8G 运存 GPU 的笔记本电脑,40G 运行内存,使用 Windows 11 系统,

  • CUDA 版本:12.3

  • PyTorch 版本: 2.5.1 + cu121

  • Conda
    Conda 是一个开源的包管理系统环境管理系统,帮助不同项目管理所需的不同版本的 python 版本和包文件。虽然 Conda 最初是为了解决 Python 在科学计算领域的不便之处而开发的,但它现在的应用并不只局限于基于 Python 的开发工作。

  • CUDA
    CUDA (Compute Unified Device Architecture) 是 NVIDIA 推出的一种并行计算平台和编程模型,它是 NVIDIA 显卡能听懂的“底层语言”。CUDA作为软件和硬件的桥梁,以提供接口给软件保证上层应用能正确调用显卡。

  • PyTorch
    - PyTorch 是一个开源的深度学习框架,广泛用于计算机视觉、自然语言处理等领域。PyTorch 本身只懂数学逻辑,不懂如何直接指挥显卡(GPU)的硬件电路去进行并行计算,但是 PyTorch 内部集成了针对特定 CUDA 版本编译好的二进制文件(.so.dll),当用户执行 tensor.to('cuda') 时,PyTorch 会通过这些预编译的文件,调用底层的 CUDA 库,从而指挥 GPU进行加速计算。
    - 可以认为,PyTorch 是“司机”,CUDA 是“引擎接口”,显卡是“发动机”。司机必须持有对应引擎接口的驾照(版本匹配)才能开车。
    - 要根据 CUDA 的版本选择所安装的Pytorch 的版本,而 CUDA 的版本又跟显卡型号与显卡驱动有关。另外,如果电脑没有 NVIDIA 显卡,也可以使用纯 CPU 进行计算,但是性能会相对弱一些。

  • PyCharm
    - PyCharm 是由 JetBrains 公司开发的一款集成开发环境(IDE),集成了编写、调试、测试、运行和管理 Python 项目所需的所有工具。代码的编写和调试工作主要在 PyCharm 中进行。
    - 在已经选择使用 Conda 的情况下,PyCharm 不负责 安装复杂的底层库(如带 CUDA 的 PyTorch),它只需要调用 Conda 创建好的环境来运行代码即可,这样方便实现在 PyCharm 中快速切换环境以适用于不同的项目。

  • OpenCV ——计算机视觉的“瑞士军刀”
    - OpenCV (Open Source Computer Vision Library) 是一个跨平台的计算机视觉库。它不直接做深度学习推理,但它处理图像的速度极快(C++底层),是深度学习模型的前后处理器。
    - 举例说明在实际应用中 OpenCV 的作用
    视频流获取:从本地摄像头、USB 相机、或网络视频流 (RTSP/UDP) 读取帧
    图像预处理
    - 调整大小 (resize):将摄像头拍摄的 1920x1080 图片缩放到 YOLO 需要的 640x640。
    - 色彩空间转换 (cvtColor):将 BGR (OpenCV 默认) 转为 RGB (PyTorch/YOLO 需要)。
    - 归一化:将像素值从 0-255 缩放到 0-1。
    结果可视化
    - 在识别到的目标上画矩形框 (rectangle)、写标签 (putText)。
    传统算法辅助
    - 如果 YOLO 没检测到,可以用传统方法(如光流法、颜色阈值)做简单的运动检测或追踪。

  • YOLO
    YOLO (You Only Look Once) 是目前最流行的单阶段目标检测算法, 包括多个版本,不同版本有不同的个应用场景和特性,可根据项目需求选择相应的版本。

关于PyTorch 和TensorFlow

PyTorch 和 TensorFlow 是目前最主流的两个深度学习框架,它们都能实现神经网络的构建、训练和部署,但在设计理念、使用习惯、生态系统和适用场景上有显著区别。在开发测试阶段首选 PyTorch,在工业部署方面一般选择 TensorFlow。


AI 总结上述工具的工作流:

在目标检测项目的开发工作流中,Conda 首先构建并隔离出独立的运行环境,确保所有依赖包(如 Python、PyTorch、OpenCV)版本兼容且互不冲突;PyCharm 作为集成开发平台,调用该 Conda 环境来编写、调试并运行代码。当输入图像或视频时,OpenCV 率先介入,负责读取数据流并进行解码、缩放、色彩转换等预处理,将其转化为模型可接受的张量格式;随后,PyTorch 加载预训练的 YOLO 模型,利用 CUDA 作为底层桥梁,将繁重的矩阵计算指令翻译并调度到 NVIDIA GPU 上进行并行加速推理,快速输出目标的类别与坐标;最后,结果返回给 OpenCV 进行后处理(如绘制检测框、标注置信度)并可视化展示。

整个过程中,Conda 保障环境稳定,PyCharm 提供代码编写支撑,OpenCV 负责媒体数据的“进”与“出”,而 PyTorch 结合 CUDA 与 YOLO 则完成了核心的“智能识别”计算。


二、注意事项

1. CUDA 安装注意事项

2. PyTorch 安装注意事项

  • 16 XX 的显卡, 安装 cu 102 的版本, 否则可能训练出现问题
  • 30 XX、40 XX 显卡, 要安装 cu 111 以上的版本, 否则无法运行
  • 在一个单独的环境中, 能使用 pip 就尽量使用 pip, 实在有问题的情况, 例如没有合适的编译好的系
    统版本的安装包, 再使用 conda 进行安装, 不要来回混淆

三、配置YOLO开发环境

1.安装 mini Conda 并创建环境

首先下载安装 mini Conda Miniconda - Anaconda

① Conda 的基本命令

  1. 列出已创建的所有环境

    conda env list
    
  2. 创建一个新的 python 环境

    conda create --name <环境名称>
    
  3. 激活 (进入) 一个已创建的环境

    conda activate <环境名称>
    

    这将激活指定的环境。激活后,命令行提示符前会显示环境名称。

  4. 退出当前环境

	conda deactivate
  1. 导出环境配置

    conda env export > environment.yml
    

    将当前环境的配置导出到 environment. yml 文件中,包括所有已安装的包及其版本。

  2. 导入环境配置:

    conda env create -f environment.yml
    

    这将根据 environment.yml 文件中的配置创建一个新的环境。

  3. 查找可用包:

    conda search <包名称>   
    

    这将搜索并显示与指定名称匹配的可用包。

  4. 显示已安装的包:

    conda list
    

    这将显示当前环境下已安装的所有包及其版本信息。

  5. 清理不再使用的包和缓存:

    • 清理不再使用的包:

      conda clean --packages
      

      这将清理不再被使用的包。

    • 清理缓存:

      conda clean --all
      

      这将清理不再被使用的缓存和索引文件,以释放磁盘空间。

  6. 移除环境:

    conda env remove --name <环境名称>
    
    conda remove -n  <需要删除的环境名> --all
    

    这将移除指定的环境。

  7. 环境重命名
    conda rename -n text 1 text 2

② 创建 Conda Python 开发测试环境

  1. 创建基于 python 3.10.19 的环境
conda create --name yolo-beta python=3.10
  1. 进入已创建的 Conda 环境
	conda activate yolo-beta
  1. 安装必要的包,如 pip 等,接下来的操作都在此虚拟环境中进行
    - 要注意,虚拟环境的文件目录与宿主机实际目录相同,实际上只有包和工具是存在于虚拟环境的,实际运行中所需要的项目文件都是存在于宿主机目录的
    - 可配置国内源以加快下载速度

2. 安装 PyTorch

PyTorch 官网:PyTorch
参考教程:YOLO 环境配置——安装 PyTorch

我的CUDA 版本是 12.3,安装的 PyTorch 版本是 2.5.1 + cu121。

在官网根据版本选择合适的安装命令
首先进入创建的环境,执行:

pip install torch==2.5.1 torchvision==0.20.1 torchaudio==2.5.1 --index-url https://download.pytorch.org/whl/cu121

推荐使用 pip 安装,而不是使用 conda 安装

验证是否已经正确安装 PyTorch

pip show torch

若打印的信息有“Version: 2.5.1+cu 121”字样即证明安装的是GPU版本的PyTorch

下面依次逐条输入

python
import torchvision
import torch

均无报错则说明 PyTorch 安装正常

继续输入

torch.cuda.is_available()

若返回 True 则表示是安装的 GPU 版本的 PyTorch

继续验证,输入

torch.randn(1).cuda()

该语句用于创建一个随机数并将其加载到 GPU 中,若返回“tensor([-1.6958],device='cuda: 0') 字样,则证明 PyTorch 可以正常调用 GPU。

3. 安装 PyCharm 并配置调用 Conda 环境

参考教程: YOLO 环境配置——安装 Pycharm

PyCharm 2.6 配置miniConda 环境报错
解决方法:版本问题,升级到 PyCharm 3.1 即可解决
参考:
lateinit property envs has not been initialized – IDEs Support (IntelliJ Platform) | JetBrains

2025.2.5: failure to use an existing Conda env : PY-85954 |

4. 安装 ultralytics(YOLO v8 源代码)

① 下载 ultralytics

ultralytics 是 YOLOv8 的官方 Python 包(SDK),由 Ultralytics 公司开发和维护。它不仅包含 YOLOv 8 模型,还提供了一整套工具链,用于训练、推理、验证、导出模型等.

GitHUB 地址: ultralytics/ultralytics: Ultralytics YOLO 🚀

可以直接下载 ZIP 文件解压,或者用命令在 Conda 环境中拉取

在 PyCharm 中打开项目后,其项目结构如图
YOLO工具链详解-Ultralytics源码文件结构.jpg

② 下载官方预训练的示例模型

下载地址: https://github.com/ultralytics/assets/releases/download/v8.4.0/yolov8n.pt

将模型文件放入 ultralytics 源码的根目录

③ 运行 YOLO v 8 的示例程序

现在先在 Conda 环境中使用命令行运行示例程序进行测试

进入 ultralytics 源码目录

pushd C:\Users\XTX\Desktop\ultralytics-main

pushd <一个文件夹路径>
这个命令的作用类似于 cd, 运行后可以进入文件夹
相比 cd, pushd 的好处是可以直接进入其他盘
注意是 pushd 而不是 pushed
当在此目录下操作完,想回到原来的目录时,只需输入: popd

激活 conda 环境

conda activate yolo-beta

将 ultralytics 作为一个包安装到环境中

pip install -e .

运行示例程序

yolo detect predict

该命令将会使用 yolov 8n. pt 模型检测 ultralytics/assets/中的两张图片,结果将会保存在 runs/detect/preditc 文件中

接下来使用 PyCharm IDE 运行 YOLO

5. 在 IDE 中运行目标检测 Demo

使用官方的实例模型 yolov8n.pt 进行一个无人机视角的地面目标检测,工程结构如图

YOLO工具链详解-yolo demo工程结构.jpg

运行结果

YOLO工具链详解-封面.jpg

工程代码如下

import cv2  
import torch  
from ultralytics import YOLO  
import time  
import os  
  
# 1. 检查 CUDA 是否可用  
if not torch.cuda.is_available():  
    print("❌ CUDA 不可用,请检查驱动、PyTorch 安装或环境。")  
    exit(1)  
else:  
    print("✅ CUDA 可用!设备:", torch.cuda.get_device_name(0))  
  
# 2. 加载 YOLOv8 模型(轻量版)  
model = YOLO('yolov8n.pt')  
model.to('cuda')  
print("🚀 YOLOv8 模型已加载到 GPU")  
  
# 3. 打开视频文件(使用你指定的 drone_detection.mp4)  
video_path = "drone_detection.mp4"  
if not os.path.exists(video_path):  
    print(f"❌ 视频文件不存在: {video_path}")  
    exit(1)  
  
cap = cv2.VideoCapture(video_path)  
if not cap.isOpened():  
    print(f"❌ 无法打开视频文件: {video_path}")  
    exit(1)  
  
# 获取视频基本信息  
fps = cap.get(cv2.CAP_PROP_FPS)  
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))  
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))  
print(f"📹 视频信息: {width}x{height} @ {fps:.1f} fps")  
  
# 4. ✅ **关键:只在循环外创建一次窗口**  
window_name = "YOLOv8 循环检测 (关闭窗口退出)"  
cv2.namedWindow(window_name, cv2.WINDOW_NORMAL)  
cv2.resizeWindow(window_name, 800, 600)  
  
# 5. 初始化性能统计  
frame_count = 0  
last_time = time.time()  
current_fps = 0  
  
print("🔄 视频将循环播放,关闭窗口右上角 × 退出程序...")  
print("💡 请直接点击窗口的 × 按钮,不要按键盘。")  
  
# 6. 主循环:安全、稳定、无重复窗口  
while True:  
    # 检查窗口是否被用户手动关闭  
    if cv2.getWindowProperty(window_name, cv2.WND_PROP_VISIBLE) < 1:  
        print("\n👋 用户关闭窗口,程序安全退出。")  
        break  
  
    ret, frame = cap.read()  
    if not ret:  
        # 视频结束 → 重置到开头,**不重建窗口!**  
        cap.set(cv2.CAP_PROP_POS_FRAMES, 0)  
        continue  # 重新读取第一帧  
  
    frame_count += 1  
  
    # --- GPU 推理 ---    results = model(frame, verbose=False)  
  
    # --- 绘制检测框 ---    for r in results:  
        boxes = r.boxes  
        for box in boxes:  
            x1, y1, x2, y2 = map(int, box.xyxy[0].tolist())  
            conf = box.conf.item()  
            cls = int(box.cls.item())  
            label = f"{model.names[cls]} {conf:.2f}"  
            color = (0, 255, 0)  
            cv2.rectangle(frame, (x1, y1), (x2, y2), color, 2)  
            cv2.putText(frame, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)  
  
    # --- 计算并显示实时 FPS ---    current_time = time.time()  
    elapsed = current_time - last_time  
    if elapsed >= 0.5:  # 每 0.5 秒更新一次,避免抖动  
        current_fps = frame_count / elapsed  
        frame_count = 0  
        last_time = current_time  
  
    fps_text = f"FPS: {current_fps:.1f}"  
    cv2.putText(frame, fps_text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 255, 255), 2, cv2.LINE_AA)  
  
    # --- 显示帧(仅显示到已存在的窗口)---  
    cv2.imshow(window_name, frame)  
  
    # --- 关键:使用 waitKey(1) 防止卡死,同时允许窗口关闭事件传播 ---    if cv2.waitKey(1) & 0xFF == 27:  # ESC 作为备用退出(可选)  
        print("\n👋 按 ESC 退出程序。")  
        break  
  
# 7. 释放资源  
cap.release()  
cv2.destroyAllWindows()

至此已经把一个 YOLO 目标识别工程运行起来了,后面将学习如何标注自己的数据集,并根据数据集训练模型。


参考教程:
YOLO 环境配置
YOLOv5 环境安装

0

评论区