当前位置: 首页 > news >正文

YOLOv9 从零开始部署实战指南(CPU版本):环境配置、项目搭建与测试详解(二)

六、在PyCharm中打开项目并配置解释器

为了方便编辑代码、运行调试,我们使用PyCharm作为IDE。

6.1 用PyCharm打开项目

  • 启动PyCharm,点击“Open” → 选择D:\yolov9-main文件夹 → OK。

  • 首次打开可能会提示“没有配置Python解释器”,我们先不管,稍后手动配置。

6.2 配置虚拟环境解释器

  1. 点击菜单栏FileSettings(Windows)或PyCharmPreferences(macOS)。

  2. 左侧找到Project: yolov9-mainPython Interpreter

  3. 点击右侧齿轮图标 ⚙️ →Add...

  4. 在弹出的窗口中选择Virtualenv EnvironmentExisting environment

  5. 点击Interpreter右侧的三个点...,浏览找到我们之前创建的虚拟环境中的python.exe:路径一般为:D:\Anaconda3\envs\yolov9\python.exe(如果你Anaconda安装在D盘)或C:\Users\你的用户名\anaconda3\envs\yolov9\python.exe(默认安装位置)。

  6. 选中该python.exe后,点击OKApplyOK

https://media/image9.png(图示:选择Existing environment并定位到yolov9环境)

配置完成后,PyCharm底部状态栏会显示当前解释器为python 3.9 (yolov9),并且FileSettings中的包列表会与conda环境同步。PyCharm会自动索引项目文件和依赖库,等待右下角进度条完成即可。

6.3 测试环境是否正常

在PyCharm中打开detect.py文件,在任意位置右键 →Run 'detect'(或点击右上角绿色三角形)。如果控制台没有报“No module named torch”等错误,说明环境配置成功。当然此时还没修改权重路径,运行会因找不到权重而报错,这是正常的。

七、修改detect.py并执行目标检测

7.1 理解detect.py的主要参数

YOLOv9的detect.py负责对单张图片、图片文件夹、视频或摄像头流进行推理。核心参数包括:

  • --weights:指定权重文件路径。

  • --source:指定输入源(图片路径、文件夹路径、视频路径或数字0表示摄像头)。

  • --conf-thres:置信度阈值,默认0.25。

  • --iou-thres:NMS的IoU阈值,默认0.45。

  • --device:可选cpucuda,我们使用cpu

  • --save-txt:是否保存检测框坐标到txt文件。

  • --project:结果保存目录,默认runs/detect

在代码中,这些参数通过argparse解析。我们需要将--weights默认值改为我们放好的权重路径。

7.2 修改 detect.py 参数

定位到 parse_opt() 函数,修改以下参数默认值:

def parse_opt(): parser = argparse.ArgumentParser() parser.add_argument('--weights', nargs='+', type=str, default='yolov9-t-converted.pt', help='model path(s)') parser.add_argument('--device', default='cpu', help='cuda device, i.e. 0 or 0,1,2,3 or cpu') ...

default='yolov9-c.pt'改为default='yolov9-t-converted.pt',因为我们要使用轻量级权重。

关键参数说明:

  • --weights:指定转换后的权重文件
  • --device:强制设为 'cpu' 确保无 GPU 环境运行
  • --source:保持默认 'data/images' 处理该文件夹下所有图片

完整修改示例:

def parse_opt(): parser = argparse.ArgumentParser() parser.add_argument('--weights', nargs='+', type=str, default='yolov9-t-converted.pt', help='model path(s)') parser.add_argument('--source', type=str, default='data/images', help='file/dir/URL/glob/screen/0(webcam)') parser.add_argument('--data', type=str, default='data/coco.yaml', help='dataset.yaml path') parser.add_argument('--imgsz', '--img', '--img-size', nargs='+', type=int, default=[640], help='inference size h,w') parser.add_argument('--conf-thres', type=float, default=0.25, help='confidence threshold') parser.add_argument('--iou-thres', type=float, default=0.45, help='NMS IoU threshold') parser.add_argument('--max-det', type=int, default=1000, help='maximum detections per image') parser.add_argument('--device', default='cpu', help='cuda device, i.e. 0 or 0,1,2,3 or cpu') parser.add_argument('--view-img', action='store_true', help='show results') parser.add_argument('--save-txt', action='store_true', help='save results to *.txt') parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels') parser.add_argument('--save-crop', action='store_true', help='save cropped prediction boxes') parser.add_argument('--nosave', action='store_true', help='do not save images/videos') parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --classes 0, or --classes 0 2 3') parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS') parser.add_argument('--augment', action='store_true', help='augmented inference') parser.add_argument('--visualize', action='store_true', help='visualize features') parser.add_argument('--update', action='store_true', help='update all models') parser.add_argument('--project', default='runs/detect', help='save results to project/name') parser.add_argument('--name', default='exp', help='save results to project/name') parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment') parser.add_argument('--line-thickness', default=3, type=int, help='bounding box thickness (pixels)') parser.add_argument('--hide-labels', default=False, action='store_true', help='hide labels') parser.add_argument('--hide-conf', default=False, action='store_true', help='hide confidences') parser.add_argument('--half', action='store_true', help='use FP16 half-precision inference') parser.add_argument('--dnn', action='store_true', help='use OpenCV DNN for ONNX inference') parser.add_argument('--vid-stride', type=int, default=1, help='video frame-rate stride') opt = parser.parse_args() opt.imgsz *= 2 if len(opt.imgsz) == 1 else 1 # expand return opt

关键修改点

  • default='yolov9-t-converted.pt'

  • default='cpu'(原可能为0'cuda',必须改为'cpu'以保证在无GPU环境运行)

除此之外,--source参数指定输入源。你可以放一张测试图片在项目目录下,比如data/images/bus.jpg(该文件夹默认存在一些样例图片),或者自己任意一张图片。我们先保持default='data/images',这会让detect.py处理该文件夹下的所有图片。

7.3 运行detect.py

在PyCharm中右键detect.pyRun 'detect',或者在终端(已激活yolov9环境)中执行:

python detect.py

你将看到如下运行信息:

text YOLOv9 🚀 v0.1 (PyTorch) ... Fusing layers... Model summary: 387 layers, 6048740 parameters, 0 gradients, 20.1 GFLOPs image 1/2 D:\yolov9-main\data\images\bus.jpg: 640x512 4 persons, 1 bus, 1 stop sign, Done. (2.3s) image 2/2 D:\yolov9-main\data\images\zidane.jpg: 384x640 2 persons, 2 ties, Done. (1.9s) Results saved to runs\detect\exp

检测完成后,打开项目根目录下的runs/detect/exp文件夹,就能看到带检测框的输出图片,文件名与原图相同(如bus.jpg)。


7.4 检测单张自定义图片

方法一:命令行传参(推荐)
终端输入:

python detect.py --weights yolov9-t-converted.pt --source "D:/my_photo.jpg" --device cpu

方法二:修改源码
编辑detect.py,将--source的默认值改为目标图片路径,直接运行脚本。


7.5 参数调优建议

  • --conf-thres:漏检时降低(如 0.2),误检时提高(如 0.5)。
  • --iou-thres:密集目标可设为 0.3~0.4 减少重叠框。
  • --save-txt:保存检测结果为文本文件(类别 ID、归一化坐标)。

八、常见问题解决

8.1 运行时提示“No module named 'torch'”

  • 原因:PyCharm或终端没有使用正确的虚拟环境。

    解决方法

  • 在PyCharm中检查FileSettingsPython Interpreter,确保选中yolov9环境。

  • 在终端中先执行conda activate yolov9,再运行python detect.py

8.2 找不到权重文件“yolov9-t-converted.pt”

  • 原因:权重文件没有放在项目根目录,或者文件名大小写不一致。

    解决方法

  • 确认文件存在于D:\yolov9-main\yolov9-t-converted.pt

  • 如果文件名是yolov9-t.pt,请修改detect.py中的default值为'yolov9-t.pt'

8.3 检测速度非常慢(每张图片几秒甚至十几秒)

  • 原因:CPU推理本身不如GPU快,加上YOLOv9模型规模较大。

    优化建议

  • 使用更轻量的权重如yolov9-t.pt(t表示tiny)。

  • 降低输入图片尺寸:修改--imgsz[320](但会降低精度)。

  • 使用--half参数开启半精度推理(需PyTorch支持,CPU上可能会快一点点,但效果有限)。

  • 升级你的CPU(多核高频)或考虑使用OpenVINO等加速框架。

8.4 安装requirements.txt时出现“Failed building wheel for pycocotools”

原因:Windows下缺少C++编译环境。

解决方法:使用conda安装预编译版本

conda install -c conda-forge pycocotools

8.5 运行时提示“ValueError: not enough values to unpack (expected 3, got 0)”

原因:图片路径无效或图片格式不支持。

解决方法:检查--source路径是否存在,确保文件是.jpg/.png等常见格式。


九、进阶:使用自己的图片或视频进行批量检测

批量检测图片
将图片放入文件夹(如D:\test_images),执行:

python detect.py --source D:\test_images --weights yolov9-t-converted.pt --device cpu

视频检测
处理视频文件:

python detect.py --source D:\demo_video.mp4 --weights yolov9-t-converted.pt --device cpu

输出视频保存在runs/detect/exp,文件名与原视频一致。

摄像头实时检测
连接 USB 摄像头后执行:

python detect.py --source 0 --weights yolov9-t-converted.pt --device cpu --view-img

q键退出实时窗口。


十、总结与展望

到这里,你已经成功完成了YOLOv9在CPU环境下的完整部署,并实现了对图片、视频甚至摄像头的目标检测。尽管CPU推理速度无法与GPU相提并论,但对于学习算法原理、轻量级应用和原型验证已经绰绰有余。

本教程的核心收获

  1. 掌握使用conda创建隔离Python环境的方法。

  2. 学会安装CPU版PyTorch以及YOLOv9的依赖库。

  3. 熟悉PyCharm配置虚拟解释器的流程。

  4. 能够修改detect.py参数并运行目标检测任务。

  5. 了解常见问题的调试技巧。

下一步你可以尝试

  • 使用自己的数据集对YOLOv9进行微调(训练需要GPU,可借助Google Colab免费算力)。

  • 将YOLOv9导出为ONNX格式,使用OpenCV DNN或ONNX Runtime在CPU上获得更快的推理速度。

  • 部署到树莓派、Jetson Nano等边缘设备,实现离线智能相机。

YOLOv9的发布再次推动了实时目标检测的边界,希望本教程能帮助你在自己的项目中快速应用这项技术。如果在实践中遇到任何问题,欢迎查阅YOLOv9官方GitHub仓库的Issues,或参与社区讨论。

Happy Coding! 🚀

http://www.jsqmd.com/news/754237/

相关文章:

  • 【顶刊复现】配电网两阶段鲁棒故障恢复研究(Matlab代码实现)
  • MetaBlue水下3D定位系统:低成本声学超表面技术解析
  • Node.js 异步接口如何防止重放攻击与 timing attack 安全加固方案
  • 2025最权威的六大降AI率神器推荐
  • AI编程新范式:Cursor编辑器与Awesome资源库的深度应用指南
  • AI编码助手在长期软件演化中的表现评估
  • Go 语言 golang-jwt 如何配置最小密钥长度确保安全性?
  • 从Postman汉化到循环队列:那些看似简单却容易踩坑的‘溢出’问题实战解析
  • 基于Python的Anki语言学习卡片自动化生成工具设计与实现
  • 基于Zyte API的电商数据智能抓取与对比分析实战
  • BWLA:当你把LLM的权重“拧“成双峰分布——一场关于信息几何的后训练量化革命
  • Modelsim 2022.1 + Windows 11 环境下的Verilog仿真全流程:从新建工程到波形分析,一篇搞定
  • AI智能体记忆系统构建指南:从向量检索到工程实践
  • DoIP协议栈安全加固迫在眉睫!ISO/SAE 21434合规开发清单(含TLS 1.3集成+DoIP Auth扩展)
  • 基于多源校园数据的学生画像构建:特征聚合、KMeans 分群与可视化解读
  • YOLOv9 从零开始部署实战指南(CPU版本):环境配置、项目搭建与测试详解(一)
  • C++ DoIP开发避坑清单:97%开发者踩过的5大陷阱(TCP粘包、会话超时、ECU地址映射错误等)
  • 《如果仅有此生》:把人生选择写成可搜索的情绪入口
  • 前端工程化思维赋能提示词管理:构建可维护的AI应用开发框架
  • 3分钟解决Masa Mods英文困扰:完整中文界面提升游戏体验70%
  • 04华夏之光永存・保姆级开源:黄大年茶思屋榜文保姆级解法「28期4题」 光纤激光器散热结构优化专项完整解法
  • GESP5级C++考试语法知识(贪心算法(一)课堂例题精讲)
  • SciEducator:基于PDSA循环的科学教育内容生成系统
  • 别再只用Aircrack-ng了!用Kali Linux实战蓝牙安全测试(从环境搭建到Crackle工具实战)
  • 用BFS方法求解平分汽油问题
  • 量子辅助PINN求解抛物型偏微分方程的技术解析
  • FastAPI 依赖注入
  • AI模型服务化实战:适配器模式解决模型与应用集成难题
  • Agentspec:用规范契约驱动AI智能体工程化开发
  • 基于扩散模型数据增强的YOLOv10少样本检测:从零开始的完整实战