拿到香橙派5这块板子之后,我建议你的第一个任务不是急着刷系统,而是先在PC端把YOLOv5s跑通。这个系列的第四篇,我就专门讲这一件事:在PC端用模拟器仿真环境,把YOLOv5s完整跑一遍。所谓“模拟器仿真”,指的就是在一台普通x86电脑上装一个Ubuntu 20.04虚拟机,模拟香橙派RK3588运行Ubuntu的软件环境,把yolov5源码获取、环境配置、模型下载、图片和视频推理全部走一遍。整个过程不依赖开发板,不烧写系统,哪怕板子还在快递路上,你也能先把核心链路打通。
这篇内容适合两类人:一是刚入手香橙派5、想在RK3588上做yolov5物体检测但还没头绪的初学者;二是已经有开发板,但一直被环境问题卡住、想先隔离排查问题的人。你在PC模拟器上解决掉的每一个报错,之后在板子上大概率不会再浪费一遍时间。
1. 为什么一定要先在PC端跑通YOLOv5s
1.1 RK3588部署的整体路线,以及04篇的位置
我见过太多人犯同一个错误:开发板一到手就插电、刷系统、装依赖,折腾一整天,最后在import torch这一步卡死,然后开始怀疑板子坏了、系统刷错了、电源不行。
真实原因往往是环境没配对。为了避开这种“环境问题”和“代码问题”混在一起的情况,我习惯把RK3588部署拆成一条清晰的路线:
- PC端模拟器仿真:在虚拟机上把YOLOv5s跑起来,验证算法链路。
- 板卡系统烧写:给香橙派RK3588烧写Ubuntu 20.04系统。
- 板端环境搭建:安装Python、PyTorch、依赖库。
- 模型转换:把PyTorch模型导出ONNX,再转成RKNN格式。
- 板上推理:用RKNN推理YOLOv5s,接入摄像头做实时检测。
本篇就是第一步。这一步的意义不是跑出多高的帧率,而是用一个最可控的环境,先把“YOLOv5s能不能跑、输出长什么样、参数怎么调”搞清楚。等到了板子上,你只需要把精力放在NPU转换和性能优化上,而不是被Python版本和依赖库折磨。
1.2 模拟器方案选型:为什么是VMware虚拟机而不是QEMU
标题里写的“PC端模拟器”,最直接的实现方式是虚拟机。我在选型时对比过三种方案:VMware Workstation、VirtualBox、QEMU。
QEMU确实能模拟ARM64架构,理论上可以直接模拟RK3588的aarch64环境,但它的图形界面和性能都很糟糕,跑一次YOLOv5推理可能要用分钟级来计算。而且QEMU的配置复杂度对新手很不友好,不适合作为“快速验证”的工具。Docker在Windows上也能跑Linux容器,但GUI支持、摄像头透传都比较麻烦,不适合做图形化推理验证。
所以我的选择是VMware Workstation Pro + Ubuntu 20.04 LTS。原因很简单:香橙派RK3588官方推荐的系统就是Ubuntu 20.04,x86虚拟机虽然指令集和ARM不同,但YOLOv5的Python代码、PyTorch推理流程在两种架构上是完全一致的。唯一有差异的是依赖包的二进制版本,但这不会影响“验证代码链路”这个核心目标。
提示:如果你不想用VMware,用VirtualBox也可以,操作基本一样。但建议统一用VMware,因为它的显卡渲染和USB设备透传做得更稳定,后期接摄像头测试会省心一些。
1.3 PC模拟器跑通的核心价值和局限
必须说清楚:PC模拟器无法模拟RK3588的NPU。即使你在这篇教程里跑出了完美检测效果,也不能说明板子上的NPU推理速度。它的核心价值有三个:
- 验证代码和依赖:把“环境配置”这个最不确定的变量提前消化掉。
- 验证模型输出:检测框、类别、置信度、NMS效果,在PC上看清楚。
- 固化流程:记录下每一步命令和参数,之后在RK3588上照着执行。
换句话说,我把它定位成“软件预演”。你要通过它确认的是“我的思路通不通”,而不是“我的板子跑多快”。
2. 环境准备与模拟器安装要点
2.1 创建Ubuntu 20.04虚拟机的完整步骤
我用的宿主机是Windows,VMware Workstation Pro 17,虚拟机镜像选择的是ubuntu-20.04.6-desktop-amd64.iso。这里强调一下,一定要选20.04而不是22.04,因为后续RK3588上的rknn-toolkit2以及很多NPU部署样例都基于20.04验证过,提前保持一致能少踩很多坑。
虚拟机配置建议如下:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| CPU | 4核 | 物理机8核以上的话可以给6核 |
| 内存 | 8GB | 建议分配物理内存的一半,最少4GB |
| 磁盘 | 60GB | 后续要装conda、PyTorch、数据集,空间给足 |
| 网络 | NAT模式 | 可以正常访问外网下载依赖 |
| 显卡 | 默认 | 不需要直通物理GPU,CPU推理足够 |
创建步骤很简单:VMware里选择“稍后安装操作系统”,操作系统选“Ubuntu 64位”,然后设置CPU和内存、创建60GB虚拟磁盘,最后挂载ISO启动安装。安装过程选择“最小安装”,不需要装第三方驱动和媒体解码器。
装好系统后,第一件事是安装增强工具,VMware 17里不需要单独装VMware Tools,直接执行:
sudo apt update sudo apt install -y open-vm-tools open-vm-tools-desktop装完之后重启,就能支持自适应分辨率和宿主机与虚拟机之间的文件拖拽了。这个功能很重要,因为后面你要把图片、视频、模型权重拖进虚拟机测试。
2.2 虚拟机系统初始化三板斧
系统装好之后不要急着装PyTorch,先做三件事。
第一是更新apt源。Ubuntu默认源在国外,速度不稳定,先替换成国内镜像源。这里以清华源为例,直接改/etc/apt/sources.list,把archive.ubuntu.com统一替换成mirrors.tuna.tsinghua.edu.cn。
第二是安装基础编译工具和网络工具:
sudo apt update sudo apt install -y build-essential git vim net-tools wget curlbuild-essential这个包经常被忽略,但它包含了gcc、g++、make等编译工具,后面安装一些需要编译的Python依赖时会用到。等你到了RK3588板子上,同样要先装它,这是部署环境的地基。
第三是安装Miniconda。这里必须用Miniconda而不是Anaconda,Anaconda太重,而且附带大量你用不到的包。
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh安装过程中一路yes,最后source一下配置文件让conda生效:
source ~/.bashrc然后按照提示初始化conda:
conda init bash2.3 为什么选用Python 3.8和CPU版PyTorch
创建虚拟环境时,我建议锁定Python 3.8:
conda create -n yolov5 python=3.8 -y conda activate yolov5选择3.8而不是最新的3.11、3.12,原因在于兼容性。YOLOv5官方代码在3.8上经过了最充分的验证,而且后续rknn-toolkit2对Python版本的依赖也是3.8最稳。你要记住一个原则:在嵌入式部署场景里,版本激进是大忌,稳定优先。
PyTorch方面,虚拟机里直接装CPU版:
pip install torch==1.10.0 torchvision==0.11.0为什么不装GPU版?因为VMware默认环境里没有NVIDIA显卡直通,装了CUDA版反而会增加体积和依赖冲突。而且,PC模拟器阶段的目标是验证推理逻辑,性能不是重点。到了真正的RK3588板子上,压根不用PyTorch做推理,而是用RKNN的C API或Python API,所以在这里花精力配GPU完全是在浪费时间。
3. YOLOv5s环境搭建与源码准备
3.1 获取yolov5源码与版本锁定
这一步是整个过程中最需要“耐心”的环节。先获取源码:
cd ~ git clone https://github.com/ultralytics/yolov5.git cd yolov5源码克隆完成后,立刻做版本锁定,这一步很关键:
git checkout v6.0为什么我不建议大家直接用最新主分支?因为YOLOv5官方在主分支上持续迭代,依赖库版本变化很快,可能你今天clone的代码和网上教程对不上。而v6.0这个版本是RKNPU社区适配最成熟的版本,RKNN Toolkit2自带的yolov5示例也基于这个版本,后续做模型转换时资料最多。
3.2 安装依赖的方法与顺序
进入yolov5目录后,默认依赖清单在requirements.txt里。执行安装:
pip install -r requirements.txt由于网络环境因素,pip下载可能不稳定,我习惯在pip命令里加上国内镜像源:
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple这里要提醒一句:requirements.txt会自动安装tensorboard、ipython、clearml之类的辅助库,这些不是你当前需要的。如果不想全部安装,可以自己挑核心依赖:
pip install numpy opencv-python matplotlib seaborn pandas tqdm pyyaml requests scipy但为了省事,我依然推荐直接装整个requirements.txt,一次性把坑踩完,之后在板子上就少一些“缺包”的问题。
安装完成后,验证环境是否正常:
python -c "import torch; print(torch.__version__)" python -c "import cv2; print(cv2.__version__)"只要这两行能顺利打印版本号,说明核心环境已经通了。
3.3 准备yolov5s权重文件
YOLOv5s的权重是一个.pt文件,可以在https://github.com/ultralytics/yolov5/releases/download/v6.0/yolov5s.pt直接下载。如果你不方便访问GitHub,也可以在yolov5项目内通过命令下载:
python -c "import torch; torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)"命令会自动下载权重并缓存到本地。我更推荐直接下载.pt文件放到yolov5根目录,因为后续你会频繁用到这个路径。
权重文件放好后,确认一下存在性:
ls -lh yolov5s.pt正常情况下会看到一个大约14MB的文件。这个文件就是COCO数据集上预训练好的YOLOv5s模型,能识别80类物体。之后你在RK3588上做迁移学习和模型转换,也是从它开始的。
4. 跑通第一个YOLOv5s推理任务
4.1 detect.py单张图片推理实测
环境都准备好之后,开始第一次推理。YOLOv5的推理入口是detect.py,执行最简单的单张图片检测:
python detect.py --weights yolov5s.pt --source data/images/bus.jpg --conf-thres 0.4这条命令会做三件事:加载模型、读取data/images/bus.jpg、执行推理并标注结果。运行结束后,输出图片保存在runs/detect/exp/目录下,图片名是bus.jpg。
打开输出图片,正常情况下你能看到检测框标注出person和bus。如果你的电脑配置不算太差,CPU推理单张图大约在1到3秒之间。
这里解释一下几个核心参数的含义,你后面会反复用到:
--weights:指定模型权重文件路径。--source:检测来源,可以是图片、视频文件、摄像头编号,也可以是一个目录。--conf-thres:置信度阈值,低于这个值的检测框会被丢弃。--iou-thres:NMS时的IoU阈值,控制重叠框的抑制强度。--img-size:输入图像缩放尺寸,默认640。
第一次跑通的时候,我建议你把--conf-thres改小一点看效果:
python detect.py --weights yolov5s.pt --source data/images/bus.jpg --conf-thres 0.25阈值调小后,检测框会变多,误检也变多。这能让你直观理解“置信度阈值”到底在做什么。
4.2 视频推理和摄像头测试
在PC模拟器上验证图片只是第一步,我更建议你接着跑视频推理,因为后续在RK3588上大概率是要处理视频流的。
先准备一个测试视频,拖拽到虚拟机里任意目录,比如test.mp4,然后执行:
python detect.py --weights yolov5s.pt --source test.mp4 --conf-thres 0.4推理结果会输出到runs/detect/exp2/。如果你只想看处理速度,不关心输出视频,可以再加上--nosave参数。
如果想测试摄像头,在VMware菜单里把摄像头连接到虚拟机,然后执行:
python detect.py --weights yolov5s.pt --source 0这里的0表示第一个摄像头设备。注意VMware连接摄像头需要一点时间,执行后如果提示打不开摄像头,先回虚拟机设置里确认“USB Controller”和“Camera”连接正常。
提示:摄像头这一项在虚拟机里经常遇到权限问题,如果调试超过15分钟还没解决,我建议跳过。后续在RK3588板子上接摄像头会顺畅得多,PC端没必要死磕。
4.3 性能观察与参数调优
用虚拟机的CPU跑YOLOv5s,性能数据没有太大参考价值,但我发现观察CPU占用和推理耗时,能帮你理解“瓶颈在哪里”。
我整理了一份在当前虚拟机配置(4核CPU、8GB内存)下的参考数据:
| 操作 | 耗时/效果 | 说明 |
|---|---|---|
| 加载模型 | 2-5秒 | 取决于磁盘和CPU |
| 单张图片推理(640x640) | 1-3秒 | 纯CPU,不包含前处理 |
| 视频推理(1080P) | 0.5-2 FPS | 虚拟机内较慢,属正常 |
--half参数 | 不可用 | CPU模式不支持半精度 |
如果你安装了NVIDIA显卡直通(这一步比较折腾,不推荐),可以尝试增加--half参数启用FP16推理,速度会快一些。但在普通虚拟机里,这个参数会直接报错:
--half requires GPU这个报错本身就是很好的学习素材:CPU不支持半精度推理,只有GPU或者NPU才支持。
参数调优方面,真正影响检测效果的是--conf-thres和--iou-thres。我遇到过很多人在板子上部署完之后,检测框非常密,全是小碎片,就是因为--conf-thres设得太低。建议PC端就把黄金参数试出来,我一般从conf=0.4, iou=0.5起步,再根据场景微调。
4.4 如何用PC端仿真结果预演板端效果
跑通YOLOv5s之后,我强烈建议你做一次“预演式验证”,把后续板端会遇到的坑提前暴露出来。
第一步,用一张自己准备的图片测试,不是官方自带的bus.jpg,而是你自己拍的照片。把图片拖进虚拟机,执行:
python detect.py --weights yolov5s.pt --source my_test.jpg --conf-thres 0.4这样能验证你的模型对“真实场景”的泛化能力。很多人在官方图片上跑通了就以为部署完成了,结果到板子上接入摄像头后才发现模型对自己的业务场景完全不适用。
第二步,导出ONNX。这一步虽然在PC模拟器上做,但它直接关系后续RK3588的模型转换:
python export.py --weights yolov5s.pt --include onnx --opset 12执行成功后,会在当前目录生成yolov5s.onnx。你不需要完全理解ONNX内部结构,但要知道一个概念:后续转RKNN时,绝大多数工具链要求你先有ONNX文件。在PC上先把ONNX导出来,到了板子上你就少一个变量。
5. 常见问题与排查技巧实录
5.1 高频问题速查表
我在带学员和实际部署过程中,收集到的高频问题基本集中在下面这几类:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
git clone卡住或失败 | 网络连接不稳定 | 用镜像站点克隆,或手动下载zip包解压 |
pip install慢到超时 | 默认PyPI源慢 | 加-i https://pypi.tuna.tsinghua.edu.cn/simple |
ModuleNotFoundError: No module named 'torch' | conda环境未激活 | 先执行conda activate yolov5再跑命令 |
ImportError: libGL.so.1: cannot open shared object file | 缺少OpenCV图形库 | 执行sudo apt install -y libgl1 libglib2.0-0 |
| 推理结果全是空框 | 置信度阈值太高 | 调低--conf-thres,比如0.25 |
| 检测框密集且重叠严重 | IoU阈值不合理 | 调高--iou-thres或检查类别错配 |
--half报错 | CPU不支持FP16 | 去掉参数,或等待板端使用NPU时再开 |
| 摄像头打不开 | 虚拟机未连接摄像头 | VMware菜单里连接摄像头,或用USB模式 |
其中,libGL.so.1这个错误出现的频率最高。OpenCV依赖图形库,但Ubuntu最小安装默认不装。这个错误不仅PC会遇到,在RK3588板子上同样会遇到,现在在模拟器里把它解决掉,之后就直接跳过。
5.2 避坑心得:避免在PC模拟器上浪费时间
第一坑:不要试图把最新版yolov5跑通。主分支的代码永远在变,你下载时的版本和网上教程的版本大概率不同,最后会出现莫名其妙的参数报错。锁定v6.0,有效避免这类问题。
第二坑:不要在虚拟机里配GPU直通。很多新手觉得模拟器上也要“完整复现生产环境”,非要在虚拟机里装CUDA。实际上VMware的GPU直通配置复杂,还依赖宿主机显卡型号,即使成功,对后面的RK3588部署也没有帮助。
第三坑:不要用conda base环境跑。我见过有人直接在任何环境都不激活的情况下执行python detect.py,然后报一堆缺包错误。规范动作是每进一次终端都先执行:
conda activate yolov5把这一步变成肌肉记忆,后面在板子上同样适用。
第四坑:不要把模型和图片放得乱七八糟。我建议在yolov5项目根目录下固定放权重文件,在data/images/下放测试图片,在runs/detect/下查看输出。这个习惯在PC端养成后,到板子上你会少花很多找文件的时间。
5.3 从PC仿真向香橙派RK3588迁移的注意事项
这一步是整个系列里承上启下的关键节点。当你在PC模拟器上把YOLOv5s跑通后,不要急着把整个conda环境打包搬到板子上,你需要转移的只有三样东西:
yolov5s.onnx模型文件(由export.py生成)- 你自己的业务图片或视频测试集
- 你已经验证过的最佳推理参数(conf、iou等)
到了RK3588板子上,yolov5源码不需要重新完整克隆,因为你最终跑的不是PyTorch推理,而是RKNN推理。你需要的是另一个工具链:rknn-toolkit2,以及配套的rknn_model_zoo里提供的yolov5示例代码。这些内容会在系列后续章节详细展开。
所以,在PC模拟器阶段,不要过度投入在“优化PyTorch推理速度”上。你的目标已经达成:模型能跑、输出正确、参数已固化。
6. 从PC仿真继续往前走的方向
6.1 下一步可以做的三个扩展
如果你在PC模拟器上跑得比较顺利,可以在等开发板到货的空窗期做几件更有价值的事。
第一,把数据集准备好。无论你是要做自定义物体检测还是用COCO预训练模型,都需要一份图片集。建议把测试图片整理到固定目录,并记录每张图的检测结果,为后续在RK3588上做精度对比打下基础。
第二,尝试导出不同格式的模型。除了ONNX,你还可以试一下:
python export.py --weights yolov5s.pt --include torchscript onnx这个命令会生成TorchScript和ONNX两种格式。了解它们之间的差异,对后续RKNN转换有帮助。
第三,试跑yolov5s和yolov5n两个模型,对比参数量和推理效果的差异。YOLOv5n更轻量,在RK3588上帧率会更高,但精度略低。提前确定你要用哪个模型,后续可以少做一次模型转换。
6.2 我在实操中的几点体会
这篇文章最后,我分享几点个人经验。
我在给RK3588项目做选型时,曾经跳过PC模拟器这一步,直接在板子上从零开始配环境,结果一个简单的“图片推理”花了整整一个下午。后来我调整顺序,任何板端部署项目都先在PC虚拟机上跑通一遍,总体效率反而提高了至少一半。
还有一个很实在的经验:在PC端模拟器上跑出来的检测参数,可以直接沿用。conf=0.4, iou=0.5这个组合在大多数室内外场景下都能用。到了RK3588上你不会想一遍遍试参数的,太浪费时间。
最后,我在这一步给自己定了一个“完成标准”,供你参考:**当你能用一条命令,不加任何报错地完成图片推理、视频推理、导出ONNX三件事的时候,P