如果你跟我一样手里还没有香橙派5实物又特别想把RK3588这条部署线先跑起来那这篇教程就是为你准备的。手把手系列做到第04篇我先让你别急着碰开发板回到PC端搭一个模拟器环境把YOLOv5s的完整流程先跑通。核心思路很简单在没有硬件、没有串口线、没有摄像头的情况下你依然能把环境部署、推理、训练、导出这套动作完整做一遍等板子到手剩下的只是环境搬运和硬件适配。这篇教程会以VirtualBox为模拟器安装Ubuntu 20.04然后从零部署YOLOv5s跑一次真实推理再用一个小数据集完成训练。整个过程不依赖Windows下的CUDA也不要求你额外购买任何硬件只要电脑满足8GB内存、50GB磁盘空间就可以照着做。我建议所有准备入手RK3588开发板的朋友都先花半天时间把这一步走完后面你会发现省下的时间远不止半天。1. 为什么要在PC端模拟器仿真跑YOLOv51.1 模拟器能模拟什么不能模拟什么先说清楚PC端模拟器仿真到底在做什么。这里的仿真不是EDR那种电路仿真也不是自动驾驶的虚拟路测而是用虚拟机软件在你的Windows或Linux电脑上跑出一个完整的Ubuntu系统。我选择VirtualBox加Ubuntu 20.04主要原因是免费、轻量而且和香橙派5官方烧写Ubuntu 20.04的版本一致命令习惯可以无缝迁移。但很多新手有个误区以为虚拟机里的Ubuntu和RK3588板卡上的Ubuntu是一回事。实际上两者差别很大。虚拟机的CPU是x86_64架构RK3588是ARM64架构底层指令集完全不同。YOLOv5这种纯Python项目在用户态下基本跨平台一致conda、pip、git这些工具的用法也几乎一样但是OpenCV的编译版本、OpenBLAS、NPU驱动、硬件解码器全都对不上。所以我给这个环节的定位是它不负责性能验证只负责流程验证。你在模拟器里能把train.py、detect.py、export.py都跑通就说明代码、数据、依赖这三样东西没有问题。等到了RK3588真机上剩下的工作只涉及系统级适配而那个阶段的坑主要在烧录和驱动不在YOLOv5本身。1.2 为什么不用QEMU和WSL2会有朋友问既然要模拟ARM环境为什么不用QEMU。我自己实测过QEMU的系统级ARM64模拟在纯软件模式下慢到几乎没法用装系统要熬半小时启动一个Python推理任务更是煎熬。它的价值更多体现在嵌入式内核调试和驱动验证上拿来跑YOLOv5纯属给自己找罪受。WSL2也是很多人推荐的方案速度确实快但它是Windows子系统和你未来要面对的RK3588 Ubuntu系统还是有区别。尤其是后面要用到rknn-toolkit2工具链、USB摄像头直通、NPU驱动验证WSL2反而会增加额外的坑。最稳妥的路线仍然是在VirtualBox里装一个完整的Ubuntu 20.04先把环境彻底搞明白之后确实需要ARM指令验证的时候再针对性开QEMU。还有一个经常被问到的问题为什么不直接在Windows里装PyTorch跑YOLOv5因为整个系列目标是RK3588部署链后面的ONNX导出和RKNN转换全都在Linux环境下完成。Windows虽然能推理但导出权和工具链跟Linux完全不同等于白练。2. 环境准备30分钟搭好可用的虚拟Ubuntu2.1 创建虚拟机时三个容易被忽略的参数先下载VirtualBox版本选7.x以上然后新建虚拟机系统类型选择Linux / Ubuntu 64-bit。创建时有几个参数建议直接照抄内存至少4096MBCPU至少4核磁盘至少60GB并选择动态分配。内存和CPU为什么要求这么高YOLOv5推理看起来只是读一张图但PyTorch加载模型、图像预处理、推理、后处理NMS每一个环节都在吃内存。我实际测过2GB内存加载YOLOv5s权重就已经有OOM风险4GB是底线8GB才比较舒服。CPU核心数直接影响conda安装依赖和训练过程中的多线程开销给4核最保守。磁盘选择60GB听起来有点大但等你装完Conda、PyTorch、YOLOv5依赖再放一个数据集和训练输出目录很容易就用掉30GB到40GB。动态分配的磁盘不会一开始占满物理磁盘会随着使用慢慢扩容所以放心按60GB设置。网络适配器建议选择桥接模式。这样虚拟机和宿主机在同一个局域网段后面SSH连接直接看虚拟机IP就行不用折腾NAT端口转发。如果宿主机所在网络不允许桥接再退回去用NAT加端口转发。2.2 安装Ubuntu 20.04并开启SSH用Ubuntu 20.04.6的ISO镜像启动虚拟机安装类型选择清除整个磁盘并安装Ubuntu。不要担心会搞坏宿主机虚拟机的磁盘文件是独立的这个操作只会影响虚拟硬盘。安装过程选最小安装即可不需要LibreOffice、游戏等桌面组件图形界面能用就行。安装完成后打开终端执行下面的命令sudo apt update sudo apt upgrade -y sudo apt install -y openssh-server net-tools vim git curl wget sudo systemctl enable --now ssh sudo systemctl status ssh确认sshd服务处于running状态后用ip addr查一下虚拟机IP。在Windows宿主机上用MobaXterm或者VS Code的Remote-SSH插件连接用户名和密码填创建虚拟机时设置的账号。这一步别偷懒因为在香橙派上绝大多数操作也是通过SSH进行的先习惯没有屏幕的运维场景。SSH连不上时先别急着查防火墙按顺序排查第一步确认Windows和虚拟机能否互相ping通第二步看虚拟机里sshd进程是否在运行第三步检查/etc/ssh/sshd_config是否把PasswordAuthentication设成了no第四步如果用的是NAT模式检查VirtualBox端口转发规则有没有配。这个排查顺序我在后面第6章还会再展开讲。2.3 安装Miniconda并配置国内软件源Conda不是必须的但我强烈建议装。YOLOv5的依赖关系相当多Python版本、PyTorch版本、NumPy版本环环相扣直接用系统Python容易把环境搞乱。装了Miniconda后续RKNN工具链需要的Python 3.8环境和当前的YOLOv5环境可以互相隔离互不干扰。下载安装Minicondawget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh安装过程中一路默认最后source ~/.bashrc激活conda命令。紧接着建议把conda和pip的软件源切换为国内公共镜像不然下载依赖的时间会很长。conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple这些都是公开约定俗成的镜像地址可以放心使用。配好源之后创建独立的虚拟环境conda create -n yolov5 python3.8 -y conda activate yolov5后面所有安装和运行命令都要保证前面提示符里有(yolov5)字样。如果一开终端就裸跑pip install依赖很可能会装到系统Python里这个坑我踩过不止一次。3. YOLOv5s环境部署与推理验证3.1 获取YOLOv5代码进入yolov5环境后在根目录克隆YOLOv5仓库git clone https://github.com/ultralytics/yolov5.git cd yolov5如果网络环境导致GitHub下载不稳定直接用Gitee镜像也是一样的git clone https://gitee.com/mirrors/yolov5.git cd yolov5代码拿到之后我建议切到v7.0标签不建议直接用最新main分支。原因在第5章会详细说RK3588的NPU转换工具链对YOLOv5 v7.0的算子兼容性最成熟新版代码里的结构改动可能会让rknn-toolkit2报出不认识的算子。git checkout v7.0如果你只是想先在模拟器里跑通不切版本确实问题也不大。但既然整个系列的目标是指向RK3588部署现在锁定版本后面跑RKNN转换时会省掉很多排查时间。3.2 安装PyTorch CPU版和依赖在conda环境里执行下面的命令安装CPU版本的PyTorchpip install torch1.13.1 torchvision0.14.1 --index-url https://download.pytorch.org/whl/cpu这个命令下载的是纯CPU版本体积比CUDA版小很多。虚拟机里没有可用显卡装CUDA版纯属浪费磁盘空间。选1.13.1这个版本组合是因为rknn-toolkit2工具链的官方测试环境长期基于PyTorch 1.x和Python 3.8兼容性最稳。新手不要看到PyTorch 2.x就觉得版本越新越好后面做RKNN转换时会吃亏。紧接着安装YOLOv5依赖pip install -r requirements.txt如果清华源响应仍然偏慢可以临时切换阿里源再跑一次pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/装完之后用python -c import torch; print(torch.version)验证一下能看到1.13.1输出就说明基础环境没问题。3.3 第一次用YOLOv5s跑推理环境准备完成接下来进入本篇的核心操作。在yolov5目录下执行python detect.py --weights yolov5s.pt --source data/images/bus.jpg如果你没有提前下载yolov5s.pt脚本会自动从官方release下载权重文件大约14MB。网络不好就手动下载后放到yolov5根目录。第一次跑通之后结果会出现在runs/detect/exp目录里打开里面的bus.jpg可以看到人、巴士、红绿灯都被检测框标出来了。跑完后我想特别强调一个现象在纯CPU的虚拟机里yolov5s处理单张bus.jpg通常需要十几秒到几十秒。很多人看到这个速度就开始怀疑模型或者环境有问题其实不是。模拟器里的CPU架构和香橙派RK3588完全不同虚拟机里跑出来的帧率没有任何参考价值你这一步要验证的只是能跑和结果正确。如果想顺手试一下对视频的检测也可以放一个MP4视频进虚拟机python detect.py --weights yolov5s.pt --source test.mp4模拟器里做视频解码加逐帧推理会非常卡这是预期内的能正常输出带检测框的视频文件就算流程通过。4. 自定义数据集训练与轻量化调参4.1 准备一个小而能用的数据集跑通预训练推理只是开胃菜模拟器仿真的真正价值在于让你完整走一遍数据准备到train.py到得到自己的模型这条主线。跳过这一步真机训练时大概率会卡在数据集格式上。练手数据集不需要大20张图就够。建议按下面的目录结构组织datasets/demo/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── demo.yaml图片放jpg或png都可以标签是YOLO格式的txt文件。每一行由5个数字组成类别ID、中心点x、中心点y、宽度、高度后四个值都是归一化到0到1的相对坐标。如果不想手工标注可以用labelImg或者在线标注平台随便标几十张图短时间内就能完成任务。demo.yaml的内容是这样train: datasets/demo/images/train val: datasets/demo/images/val nc: 2 names: [cat, dog]建议直接把路径写成相对路径不要用/home/你的用户名这种绝对路径。这样整个数据集目录在将来迁移到香橙派RK3588时直接整个文件夹拷过去就能用不用改配置。4.2 CPU环境下训练命令的参数取舍数据集准备好之后运行训练命令python train.py --data demo.yaml --weights yolov5s.pt --epochs 10 --batch-size 4 --imgsz 320 --device cpu这里有几个参数值得展开讲。--imgsz从默认的640降到320检测分辨率变小后单轮计算量大约变成原来的四分之一CPU训练时间会显著缩短。这也是yolov5s模型轻量化最直观的验证。--batch-size在CPU环境建议设为4设成8或16很容易把虚拟机内存吃满训练进程直接被系统杀掉。--epochs先设为10目的是验证训练链路不要指望精度后面有需要在真机再跑长轮数。训练过程中命令行会持续输出每个epoch的train loss和val mAP。结束后看runs/train/exp目录best.pt就是这一轮训练的模型产物。在PC模拟器里CPU跑10轮小型数据集也可能需要一两个小时建议趁这个时间把第5章的内容先读一遍。4.3 轻量化不只是降分辨率提到yolov5s模型轻量化新手最容易只盯着输入分辨率。实际上模型轻量化是分层的第一层是输入侧优化也就是降低imgsz第二层是结构侧优化对yolov5s做通道剪枝把冗余卷积核去掉第三层是部署侧优化导出FP16或INT8量化模型交给RK3588的NPU去执行。模拟器阶段能够实际验证的是第一层以及为第二层做准备。真正的通道剪枝需要重新训练微调更适合在真机上拿到完整数据集后操作。INT8量化则依赖RKNN工具链和具体硬件环境这块我会在系列的后续篇里专门讲。现在先别急着追精度把流程跑通比一步到位重要得多。4.4 训练结果如何可视化确认训练完成后打开runs/train/exp目录下的results.png。这张图包含了train和val两个集合的box_loss、cls_loss、obj_loss曲线以及mAP相关曲线。你不需要看懂每一根曲线的数学定义只要确认loss在逐步下降、mAP在缓慢上升就说明训练脚本执行正常。如果loss一直纹丝不动最常见的原因是学习率默认值对当前数据集不友好其次是标签文件本身有问题。排查的时候先检查txt标签里坐标是否都落在0到1之间再检查demo.yaml中的nc和names是否跟标签里的类别ID对应。标签错乱是最隐秘的坑训练能跑但不收敛十有八九是数据格式的问题。5. 模型导出与RK3588迁移前的准备5.1 导出ONNX跨平台中间格式训练完自有模型后把PyTorch权重导出成ONNX格式这是RK3588 NPU转换的前置动作。python export.py --weights runs/train/exp/weights/best.pt --include onnx --opset 12导出完成后同一目录会多出best.onnx文件。这里简单解释一下为什么要中间经过ONNXYOLOv5的PyTorch权重无法被rknn-toolkit2直接识别而ONNX是跨框架的通用交换格式。rknn-toolkit2可以通过ONNX完成到RK3588 NPU格式的转换。导出之后立刻验证一下ONNX文件是否还能正常推理python detect.py --weights runs/train/exp/weights/best.onnx --source data/images/bus.jpg如果输出正常说明导出过程没有破坏模型结构。做这一步的意义是预先排查算子和输出层问题否则到了真机上才报错排查成本会高很多。5.2 RKNN工具链的版本对齐接下来聊一个让很多人崩溃的点rknn-toolkit2对运行环境版本非常挑剔。最稳妥的组合是Python 3.8加rknn-toolkit2 1.6.0加ONNX 1.12加NumPy 1.23。这个组合我实测过很多次协调性最好。在虚拟机上提前安装rknn-toolkit2的x86版本是个好习惯用conda单独开一个环境不要在yolov5主环境里装conda create -n rknn python3.8 -y conda activate rknn pip install rknn-toolkit2-1.6.0-cp38-cp38-linux_x86_64.whl这个wheel包需要从官方release页面手动下载。只要这个转换脚本能在模拟器里跑通后面拿到RK3588真机剩下的就是在开发板上执行RKNN的接口推理。看到这里你应该理解了为什么系列教程要专门花一篇讲PC模拟器。因为RKNN工具链本身就是在PC上运行的训练和导出也可以在PC上完成模拟器就是省下开发板成本之前的最佳排练场。5.3 模拟器到RK3588的差异清单给出一张对比清单方便后续烧写Ubuntu 20.04之后逐项核对项目PC模拟器VirtualBox香橙派5RK3588CPU架构x86_64ARM64推理设备CPUCPU加NPU操作系统Ubuntu 20.04Ubuntu 20.04摄像头访问需要USB直通默认无MIPI或USB摄像头硬件视频解码基本不可用RK MPP硬件解码推理速度慢但能跑远快于模拟器这张表的核心意思是你在模拟器里得到的命令习惯、Python环境、模型文件和数据目录都可以直接搬到RK3588上唯独速度、摄像头访问和NPU算子支持这些跟硬件强相关的指标必须上板验证。不要在模拟器里因为推理慢就怀疑部署方案。6. 常见问题与排查技巧实录6.1 虚拟机安装慢、启动慢怎么办安装Ubuntu时如果卡到难以忍受先检查BIOS里是否开启了CPU虚拟化。Intel平台对应VT-xAMD平台对应SVM。没有开启硬件虚拟化的话虚拟机运行效率会暴跌。另外虚拟机磁盘文件尽量放在固态硬盘上机械硬盘跑conda安装会等到怀疑人生。如果虚拟机里apt update一直超时重点检查网络模式。桥接模式在家庭路由环境下通常最稳但在公司网络或部分云主机网络下NAT模式反而更可靠。NAT模式下需要配置好端口转发否则外面连不进来很正常。6.2 PyTorch推理时频繁OutOfMemory出现OOM场景九成原因是分配给虚拟机的物理内存不够。建议宿主机如果有16GB内存就分8GB给虚拟机如果宿主机只有8GB那虚拟机给4GB并且只跑小尺寸和小batch的任务。还有一个小技巧在模拟器里推理之前关掉Ubuntu桌面的动画特效能省出不少内存。如果内存已经分了8GB仍然OOM那就把batch-size降到1imgsz降到320再重新跑。虚拟机的swap默认只有几个GB遇到内存压力时会调用磁盘做交换既慢又不稳定。6.3 SSH连不上按这个顺序排查SSH连不上是最折磨人的问题别一上来就重装openssh-server按顺序来第一步在虚拟机终端执行ip addr确认真实IP地址。第二步执行systemctl status ssh确认sshd服务在运行中。第三步如果服务没在运行用systemctl start ssh启动。第四步在Windows宿主机ping那个IPping不通就往VirtualBox网络模式方向排查。第五步能ping通但连不上就检查/etc/ssh/sshd_config文件里的PasswordAuthentication是否被设置成了no改回yes之后重启ssh服务。这套排查顺序我已经反复验证过了大部分SSH问题都能在这个流程里定位到最终原因。6.4 下载预训练权重一直失败怎么办yolov5s.pt只有十几MB但偶尔会因为网络波动导致下载失败。遇到这种情况不用反复重试在线下载直接手动下载权重文件放到yolov5根目录即可。下载完检查一下文件大小是否在14MB左右文件过小几乎就是下错了页面。还有一点需要特别提醒不同版本的YOLOv5权重不能混用。v6.0和v7.0的权重结构存在差异如果你改了代码版本权重也要对应切换否则detect启动时会看到加载报错或者mAP异常的低。7. 后记模拟器不是终点但能帮你少走弯路我个人在实际操作中的体会是很多人在RK3588板子上浪费的第一个下午不是在敲代码而是在用apt和pip跟网络搏斗。PC端模拟器刚好能把这段痛苦提前消耗掉等真机上手你只会觉得部署是一条已经走过的路。最后再分享一个后续扩展思路这套模拟器环境不只是给YOLOv5s准备的。等跑顺之后完全可以在同一个虚拟机里继续尝试RK3588部署YOLOv8的转换流程只需要切换到对应仓库和导出方式迁移逻辑是相通的。下一篇我会回到香橙派5实物讲RK3588烧写Ubuntu 20.04和基础系统配置。模拟器里敲过的每一条命令都会在真机上原样复现。