【环境配置】
开发主机:HP OMEN 9 (暗影精灵9)
主机系统:Ubuntu 22.04 (物理机)
主机显卡:
NVIDIA GeForce RTX 4060 Laptop GPU (Device 28e0)
Intel Corporation Device a788 (Intel 核显)
目标板卡:V851s
工具链版本:Acuity-Toolkit-Binary-6.6.1
Python 环境:Conda yolo5_retro (Python 3.8)
【项目背景】
正在部署开发板识别打火机的火的项目,基于 YOLOv5 v7.0 训练完成 best.pt,目标是在 V851s NPU 上部署。目前在将模型转换为 Acuity 可用的 .nb 格式时,遇到了新旧工具链不兼容的严重问题,陷入了“依赖地狱”。
【核心冲突】
Acuity 6.6.1(2020年代工具)的底层库要求极其老旧,与现代 YOLOv5(2024年代码)及 PyTorch 生态的依赖完全互斥,导致无法构建一个同时满足“Acuity能运行”和“YOLOv5能导出”的 Python 环境。
【详细排查过程与报错】
路线一:ONNX 导入(遇到死胡同)
模型导出操作:
使用 YOLOv5 v7.0 源码,执行:
python export.py --weights best.pt --include onnx --opset 9 --imgsz 640
*结果*:成功生成 best.onnx,输入 [1, 3, 640, 640]。结构包含 onnx::Reshape_397, onnx::Sigmoid_440 等中间节点。
环境适配(痛苦过程):
为了兼容 Acuity 6.6.1,我进行了强制降级:
降级 numpy:pip install numpy==1.19.5 (Acuity 报错强制要求 < 1.20)
降级 onnx:pip install onnx==1.10.0
降级 protobuf:pip install protobuf==3.20.3 (解决 Descriptor 验证错误)
源码修补:由于 NumPy 1.19.5 在新 onnx 库下存在 API 废弃,手动修改了 .../site-packages/onnx/mapping.py,将 np.object 改为 object 才勉强让 import 不报错。
Acuity 导入操作:
pegasus import onnx --model best.onnx --mean-values 0 0 0 0.00392156862745098 --scale 0.017 0.017 0.017 --quantized-input on
关键报错:
Acuity 在解析图结构时内部崩溃:
I Start importing onnx...
...
File "acuitylib/app/importer/import_onnx.py", line 109, in run
TypeError: object of type 'NoneType' has no len()
*个人推测*:Acuity 6.6 的旧版解析器无法正确处理 YOLOv5 v7 的某些特定节点,或者因版本不匹配导致图属性读取为 None。
路线二:TFLite 导入(遭遇依赖互斥)
环境冲突 A (NumPy vs Pandas):
Acuity 要求 numpy < 1.20,但 YOLOv5 的 export.py 依赖 pandas,而新版本 pandas 拒绝在 numpy < 1.20.3 上运行。这导致导出脚本甚至启动不了。
环境冲突 B (TensorFlow 版本):
临时升级 numpy 并尝试 tensorflow 2.13.1,结果导出失败。
TensorFlow SavedModel: export failure ❌ 1.0s: 'anchors'
TensorFlow Lite: export failure ❌ 0.0s: 'NoneType' object has no attribute 'call'
AttributeError: 'NoneType' object has no attribute 'outputs'
*推测*:YOLOv5 v7.0 脚本逻辑未适配 TF 2.13(正准备尝试降级 TF 2.10 验证)。
【我的思考:三条可能的出路】
目前卡在 ONNX 解析崩溃上,我思考了三条路,不知哪条是正解:
方案一:寻找更新版本的 SDK / Acuity
思路:是否存在针对 V851s 的更新版 Tina SDK?其中是否内置了 Acuity 7.x 或更高版本?
顾虑:非常担心“生成端”和“运行端”不匹配。如果我用新版 Acuity 生成 .nb,放到现有的 V851S 系统(SDK 里的驱动)跑,会不会直接报错 Version mismatch?
方案二:降级 YOLOv5 版本(以退为进)
思路:放弃 v7.0,改用 2020-2021 年的 YOLOv5 v6.0。那个时代的 ONNX 格式和依赖库应该完美契合 Acuity 6.6。
代价:需要重新训练模型。
问题:如果不换 SDK,这是否是唯一可行的工程方案?
方案三:放弃 Acuity,换推理框架
思路:改用 NCNN 或 TFLite + CPU 运行。
顾虑:V851S 性能有限,如果失去 NPU 加速,CPU 跑 YOLO 可能帧率极低,无法满足实时检测需求。
【求助】
以上是目前遇到的所有问题。恳请全志的大佬或有经验的朋友指点:
我的 TypeError: object of type 'NoneType' has no len() 还有救吗?
V851s 是否有更新版 SDK 支持?如果没有,推荐我走哪条路?
卡在这一步很久了,万分感谢!!!!