
很多朋友拿到香橙派RK3588开发板之后第一件事就是急着把YOLOv5模型跑起来结果卡在了环境搭建上刷系统、装依赖、配置NPU工具链一不小心就把板子折腾成砖头。我这个系列前面几篇已经讲完了从硬件认知到系统烧录的内容这一篇换一个更稳妥的思路——先在PC端用模拟器把YOLOv5跑通再上板子。这个阶段不需要你手边有香橙派只要一台普通的x86架构电脑装好Linux环境就能把RK3588的ARM64运行环境“装”进电脑里仿真推理YOLOv5s模型。这篇文章适合三类人一是刚拿到香橙派5或者RK3588开发板但不敢轻易在真机上折腾的初学者二是板子还在路上想提前把环境预演一遍的动手党三是准备从YOLOv5切到YOLOv8或YOLOv6想先在PC上搞清楚推理流程的开发者。咱们不谈虚的直接把模拟环境的搭建过程、推理命令、性能数据和踩坑记录都摆出来让你照着做就能跑通。1. 先弄清楚为什么要在PC上模拟而不是直接上板1.1 RK3588部署的基本链路RK3588是一颗8核ARM64处理器集成6 TOPS算力的NPU跑YOLOv5s这种轻量级检测模型可以说绰绰有余。但直接上板部署你需要面临几个现实问题交叉编译环境是否熟手、依赖库版本是否匹配、系统镜像和板卡外设是否稳定。我见过太多人把系统刷好后在PIP安装PyTorch时却因为ARM64源里的某个老版本冲突导致npm或者opencv彻底瘫痪。在PC端搭模拟器的核心目的是把“部署链路”和“模型算法”解耦。你先把YOLOv5的推理代码、权重文件、后处理逻辑在模拟环境里全部验证一遍确保模型能正确加载、图像能正常解析、检测框能画出来。这一层跑通了上板之后只需要关心RK3588的NPU转换和C部署每个阶段的干扰项都会大大减少。1.2 模拟器方案选型三种常见路线对比我在测试过程中试过三种“模拟”路子这里我直接把踩坑结果分享出来方案实现方式性能表现适用场景本机x86直接运行直接用PC的Python环境跑YOLOv5最快秒级出结果只验证算法逻辑不关心ARM环境Docker qemu-user-static模拟ARMDocker容器内使用QEMU用户态模拟aarch64指令集中等比本机慢3~5倍最贴近RK3588的Linux环境推荐QEMU全系统模拟用QEMU启动完整的ARM64 Linux虚拟机非常慢装个Python都要半小时需要跑完整系统服务时才考虑不推荐我强烈推荐第二种Docker配合qemu-user-static。原因是它能在PC上模拟出一个完整的aarch64 Linux环境所有安装包都按照ARM64架构下载和编译依赖库的行为和RK3588真机一致同时又不会像全系统模拟那样消耗过多CPU资源。你把这个环境当成一个“软板子”在里面跑YOLOv5推理得到的经验可以直接迁移到真机上。2. 准备工作从零搭建仿真环境2.1 确认PC硬件和系统模拟ARM64环境的开销主要来自QEMU的指令翻译所以CPU性能很关键。我用的是一台十代Intel i516GB内存系统为Ubuntu 22.04。你不需要高配显卡因为整个仿真过程只使用CPU推理GPU在这里派不上用场。需要注意的是Docker服务能正常启动如果你之前没装过可以用下面这条命令快速确认sudo docker run hello-world能打印出Hello from Docker!就说明环境是通的。另外顺手确认一下你的系统是否支持binfmt_misc因为qemu-user-static依赖它来注册ARM64二进制文件的转译规则ls /proc/sys/fs/binfmt_misc/如果能看见qemu-aarch64相关条目那后面就省事很多。我见过一些精简版Linux发行版没有这个模块此时需要先安装qemu-user-static并重新注册。2.2 安装Docker和QEMU环境先装QEMU用户态模拟器这里建议直接安装带静态链接的版本这样它在容器内部也能被调用sudo apt update sudo apt install -y qemu-user-static binfmt-support然后执行一下Docker的ARM模拟注册脚本它会在你的系统里注册好aarch64的可执行格式映射docker run --rm --privileged multiarch/qemu-user-static --reset -p yes这条命令的原理是把qemu-aarch64-static拷贝到Docker宿主机的二进制格式目录中这样容器内ARM64程序就能被自动转译。有些朋友遇到镜像能拉下来但运行报exec format error十有八九就是这一步没做。接着拉一个ARM64版Ubuntu镜像来做基础环境我用的是22.04 LTSdocker pull arm64v8/ubuntu:22.04拉取完成后可以用一条命令直接进入ARM64的交互式终端记得带--platform linux/arm64强制指定架构docker run -it --platform linux/arm64 -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static arm64v8/ubuntu:22.04 /bin/bash如果一切正常容器内的uname -m会输出aarch64这会给你一种“已经在香橙派上登录”的错觉实际上它只是模拟出来的。到这里PC端模拟器环境就算基本搭好了。2.3 拉取aarch64镜像后第一次环境配置进入容器后你会发现这是一个干净得不能再干净的Ubuntu连python3都要自己装。按顺序把基础包先装上apt update apt install -y python3 python3-pip git wget libgl1 libglib2.0-0这里重点提醒libgl1和libglib2.0-0是OpenCV运行时的动态库依赖很多人在容器里玩命装OpenCV却忘了这两个底层的系统库结果一跑就报libGL.so.1: cannot open shared object file。这个坑我在后面还会细说。然后为了后面方便传文件给容器添加一个目录映射会更好。建议先退出容器输入exit然后重新用带-v参数的方式启动同时挂载一个本地文件夹方便把YOLOv5的权重和推理图片放进去mkdir -p ~/rk3588_sim docker run -it --platform linux/arm64 \ -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static \ -v ~/rk3588_sim:/workspace \ arm64v8/ubuntu:22.04 /bin/bash这样在容器里访问/workspace就能直接读写宿主机~/rk3588_sim下的文件后面下载的模型权重和输出图片也能顺手留在PC上方便你查看结果。3. 在模拟器环境中跑通YOLOv5s3.1 克隆YOLOv5仓库并安装依赖环境就绪后进入容器克隆一份Ultralytics官方YOLOv5源码cd /workspace git clone https://github.com/ultralytics/yolov5.git cd yolov5然后就是最考验耐心的依赖安装步骤。在国际源环境下PyTorch的ARM64版wheel大约120MB左右模拟环境下的下载速度倒是能跑满但随后的安装过程会有一大堆依赖包。建议直接用清华源能省掉不少超时重试的麻烦pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple如果你打算在模拟器里跑CPU推理建议重新安装一次CPU版的PyTorch避免默认装到CUDA版导致一堆没用的驱动依赖pip3 install torch torchvision --index-url https://download.pytorch.org/whl/cpu这个过程在模拟环境下会比较长快则十几分钟慢则半小时。如果中途断网或者pip报Connection reset不要紧重复执行上面命令即可。记住pip的缓存是支持断点续传的多试几次几乎都能成功。3.2 下载权重和测试图片YOLOv5s的权重文件可以从GitHub Release直接获取。你可以在宿主机先下载好再通过刚才挂载的~/rk3588_sim目录共享到容器里这样比在容器内用wget快得多cd ~/rk3588_sim wget https://github.com/ultralytics/yolov5/releases/download/v6.1/yolov5s.pt测试图片直接使用YOLOv5仓库自带的data/images/bus.jpg这是一张经典的公交车照片里面有人和公交车适合验证检测效果。如果你手头有自己的图片也可以丢进~/rk3588_sim再拷贝到容器内。3.3 运行推理测试验证输出在容器里执行cd /workspace/yolov5 python3 detect.py --weights /workspace/yolov5s.pt --source /workspace/yolov5/data/images/bus.jpg --device cpu这里有几个参数特别说一下--weights要指定权重文件的正确路径--source是图片或视频路径--device cpu强制使用CPU。由于模拟器里没有CUDA环境这一步是必须的。命令跑起来后你会看到日志里先加载权重然后逐张图片推理最后出现类似下面的输出image 1/1 /workspace/yolov5/data/images/bus.jpg: 448x640 4 persons, 1 bus, Done. (0.52s)这不代表真正的RK3588速度只代表模拟环境里的执行时间。推理完成后在runs/detect/exp目录下会生成带检测框的结果图。把这个目录挂载到宿主机你用普通图片查看器就能直接看到效果。我用真实RK3588板子做对照时发现同样一张bus.jpg在真机CPU上的推理耗时不到0.15秒而模拟器环境下大约是0.4~0.6秒。原因很简单QEMU每次执行ARM64指令都要翻译成x86指令有额外的开销。但这恰恰说明PC模拟器的价值在于“验证流程”而不是“度量性能”。4. 仿真过程中的关键参数与实际效果4.1 性能对比x64原生跑 vs ARM模拟跑我在同一台PC上分别做了三个测试数据贴在下面方便你对模拟器开销有个直观感受运行环境单张640x640图片推理耗时备注宿主机x86原生0.14sPython环境最新版PyTorchDocker ARM64模拟0.48sQEMU转译CPU占用较高RK3588真机CPU0.16s真机原生指令执行这里有一个值得琢磨的点宿主机的x86 CPU和RK3588的CPU在性能上其实并没有代差但QEMU的开销让模拟环境慢了三四倍而RK3588真机由于少了指令翻译反而能跑出接近原生x86的速度。这也提醒大家到了真机阶段千万不要因为模拟器跑得慢就怀疑自己代码写错了。此外我还测试了不同输入分辨率对耗时的影响。在模拟器里把--imgsz从640改成320后耗时从0.48s降到0.22s但检测精度也有可见下降。真机上同样存在这个趋势所以你在调优时可以先在PC模拟器里用多组参数跑一遍比如YOLOv5的--conf-thres置信度阈值、--iou-thresNMS阈值看看哪个阈值组合对当前场景最友好再把最终参数搬到板子上能省不少调试时间。4.2 如何验证模拟环境与板端的一致性很多朋友会担心PC模拟器里已经装好的依赖库到RK3588上会不会行为不一致这里有一个最简单的验证方法就是比对关键模块的版本号。在模拟器容器里执行python3 -c import torch, torchvision, cv2; print(torch.__version__, torchvision.__version__, cv2.__version__)比如我的环境输出是1.13.1 0.14.1 4.7.0然后我在刷好系统的香橙派上执行同样一条命令。只要两个环境的Python版本和这几个核心库版本一致YOLOv5的前向推理结果就能保持一致。事实证明我拿同样的bus.jpg分别在两个环境跑出过完全相同的检测框坐标。但要注意OpenCV在这两个环境下有细微差异。模拟器里编译安装的OpenCV默认可能不会开启某些硬件加速选项而RK3588的OpenCV版本通常支持NEON优化在读取高清视频帧时两者速度会有明显差别。这不算“不一致”只算“性能差异”不影响最终的检测逻辑。4.3 踩坑记录模拟器与真机的差异我不能只说“模拟器好好用”它的坑也不少。第一个坑是内存限制。QEMU转译的进程通常会占用双倍以上内存如果宿主机的内存只有8GB在模拟器里同时跑YOLOv5的训练进程就很容易触发OOM Killed。我建议至少给Docker容器预留4GB内存并设置好swap否则pip装大包的时候会莫名卡死。第二个坑是共享目录的IO性能。通过-v挂载的宿主机目录在容器内读写时速度会因为文件系统转换打折扣。尤其是YOLOv5在推理时如果从挂载目录读取大权重文件耗时会明显增加。解决方法很简单把权重文件、图片先复制到容器内部目录比如/workspace实际在容器里的路径再运行推理命令。第三个坑是网络访问差异。代码里如果用了torch.hub.load来加载模型模拟器环境下经常会卡在下载超时而RK3588真机有独立网络栈有时候反而能顺利下载。解决办法是提前在宿主机把权重文件下载好用文件传输代替在线拉取。5. 常见问题与排查技巧实录5.1 问题速查表我在这一篇的实操过程中把遇到比较典型的几个问题整理成了一张速查表如果你跑的时候卡住可以直接对照问题现象可能原因解决方法exec format error缺少qemu-user-static注册执行docker run --rm --privileged multiarch/qemu-user-static --reset -p yes容器内python3不存在基础镜像过于精简执行apt install -y python3 python3-pip运行detect.py报libGL.so.1错误缺少OpenCV系统依赖安装libgl1和libglib2.0-0推理时进程被杀死内存不足或OOM加swap或把镜像输入尺寸降到320下载PyTorch慢或报404pip源不稳定使用清华源或指定--index-url https://pypi.tuna.tsinghua.edu.cn/simple输出图片在宿主机看不到挂载目录路径错误确认-v ~/rk3588_sim:/workspace中的宿主机路径是绝对路径这几种情况里最常见的就是libGL.so.1缺失。有一次我在模拟器里强行安装了OpenCV的wheel运行后又报libgthread-2.0.so.0找不到折腾了半天才发现是基础库没装全。其实YOLOv5的requirements.txt里不会帮你装系统级依赖所以每到一个新环境先把libgl1、libglib2.0-0、gcc这几个安上后面会省心很多。5.2 几个有用的调试命令和技巧跑通一次detect.py之后你还可以在模拟器里做这些额外的验证进一步为RK3588部署扫清障碍。第一个技巧是使用torch.jit.trace把YOLOv5的PyTorch模型导出为TorchScript脚本这是后续转RKNN格式前的重要中间步骤。在模拟器里导出一次你就知道模型结构是否完整python3 models/export.py --weights /workspace/yolov5s.pt --include torchscript导出的yolov5s.torchscript可以直接在容器里加载并推理python3 detect.py --weights /workspace/yolov5s.torchscript --source /workspace/yolov5/data/images/bus.jpg --device cpu如果能正常跑出结果说明模型序列化没问题后面在RK3588上转成RKNN时遇到的报错范围就更小。第二个技巧是查看容器内部的系统信息确认自己真的处在ARM64环境uname -m cat /proc/cpuinfo | head -n 20你会发现uname -m显示aarch64而/proc/cpuinfo里会出现CPU implementer: 0x41这种字段这代表ARM的授权核。和香橙派RK3588在真机上看到的几乎一样。用这个信息时刻提醒自己你现在手头就是一块“虚拟的香橙派”后面所有Linux命令、编译选项、依赖版本都可以照搬到真机。第三个技巧也是在模拟器里最容易培养的习惯每装一个关键依赖都顺手把版本号记下来做成一个版本清单。比如我常用这种文件cat /workspace/versions.txt EOF Python: $(python3 --version) PyTorch: $(python3 -c import torch; print(torch.__version__)) PyTorchVision: $(python3 -c import torchvision; print(torchvision.__version__)) OpenCV: $(python3 -c import cv2; print(cv2.__version__)) EOF等真机到手直接对照这个清单装依赖能极大减少“PC上能跑板子上跑不了”的郁闷。我在帮朋友部署RK3588时就是靠这份清单定位到一个OpenCV版本不一致导致的中文标签乱码问题。我个人在实际操作中的体会是PC端模拟器最值得花时间的阶段就是“装环境”和“跑通一次完整推理”这一连串动作。这段经历能让你提前熟悉aarch64环境下包管理的脾气比如哪些包在ARM源里缺失、哪些编译选项要手动打开。等真正拿到香橙派5开发板你面对的不再是满脸问号而是“这个环境我模拟过”的从容。顺着这个思路下一篇我会专门讲如何在RK3588真机上用NPU加速跑YOLOv5把模拟器里验证好的代码一步步移植过去。