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() 函数,修改以下参数默认值:

python 复制代码
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' 处理该文件夹下所有图片

完整修改示例:

python 复制代码
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 复制代码
python detect.py

你将看到如下运行信息:

python 复制代码
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 检测单张自定义图片

方法一:命令行传参(推荐)

终端输入:

bash 复制代码
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安装预编译版本

bash 复制代码
conda install -c conda-forge pycocotools

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

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

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


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

批量检测图片

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

bash 复制代码
python detect.py --source D:\test_images --weights yolov9-t-converted.pt --device cpu

视频检测

处理视频文件:

bash 复制代码
python detect.py --source D:\demo_video.mp4 --weights yolov9-t-converted.pt --device cpu

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

摄像头实时检测

连接 USB 摄像头后执行:

bash 复制代码
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! 🚀

相关推荐
hhzz1 小时前
(深度学习/计算机视觉)手把手教你从零部署YOLOv8目标检测算法-----环境安装(1/4)
深度学习·yolo·计算机视觉
E等于MC平方1 小时前
AI 辅助物理课堂实验
人工智能·ai·大模型·模拟·物理·实验
名不经传的养虾人1 小时前
从0到1:企业级AI项目迭代日记 Vol.17|让 AI 做代码重构,要盯着它的策略,不只是看结果
人工智能·agent·ai编程·ai创业·企业ai
缝艺智研社1 小时前
誉财 YC - 10 + 双头全自动烫标机:服装商标烫印的高效智能之选
人工智能·自动化·新人首发·缝纫机·智能缝纫机
johnny2331 小时前
AI Agent社区:Moltbook、虾聊、InStreet、OpenAgents、WorldX
人工智能
knight_9___1 小时前
LLM工具调用面试篇6
人工智能·python·面试·职场和发展·llm·agent
YBAdvanceFu2 小时前
开源版Suno来了!用扩散模型生成带歌词的完整歌曲,DiffRhythm2实战详解
人工智能·深度学习·机器学习·多智能体·智能体·suno·diffrhythm2
龙孚信息2 小时前
Xometry百万流量案例分析:企业内容分发基础设施构建策略
人工智能