惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Announcements
Recent Announcements
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog
T
The Blog of Author Tim Ferriss
J
Java Code Geeks
腾讯CDC
D
Docker
G
Google Developers Blog
D
DataBreaches.Net
雷峰网
雷峰网
Blog — PlanetScale
Blog — PlanetScale
S
SegmentFault 最新的问题
The Cloudflare Blog
有赞技术团队
有赞技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Stack Overflow Blog
Stack Overflow Blog
大猫的无限游戏
大猫的无限游戏
量子位
美团技术团队
aimingoo的专栏
aimingoo的专栏
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Engineering at Meta
Engineering at Meta
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

静水流深

NAS连续运行58天- 静水流深 从森林走向森林- 静水流深 1Panel添加群晖Webdav作为备份账号- 静水流深 Halo—Joe3主题添加页脚信息- 静水流深 【转载】调试的本质:从混乱到有序,产品状态逐步确定- 静水流深 STM32定时器—定时周期测试例程- 静水流深 INAV航点飞行- 静水流深 STM32 Cube MX迁移工程- 静水流深 INAV固定翼之AUTO Tune 和 AUTO Level Trim- 静水流深 STM32 HAL库 printf 重定向至指定串口输出- 静水流深 关于3D打印航模一些想法- 静水流深 愿有岁月可回首- 静水流深 对深度学习与图像目标识别相关概念的理解- 静水流深 U-Center配置GPS- 静水流深 1Panel申请和续签证书&配置反向代理- 静水流深 早点睡,早点起,做好手头的事- 静水流深 Mission Planner地面站模拟飞行和MAVLINK消息UDP转发- 静水流深 Ardupilot设置MSP协议OSD- 静水流深 ArduPilot VTOL QuickTune 快速自动调参记录- 静水流深
如何用深度学习做目标识别?—— 完整工具链详解- 静水流深
唐韵 · 2001-04-04 · via 静水流深

上一篇文章对一些概念有了大体了解,尽管并不深入,也不涉及太多原理,但是技术最重要的还是应用,可以先把 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 环境安装