RKNN模型转换问题:what(): vector::_M_range_check: __n (which is 2) >= this->size() (which is 3)
场景:ONNX 转 RKNN 部署时报错
一、问题现象
在使用 RKNN-Toolkit2 将 ONNX 模型转换为 RKNN 模型时,出现如下错误:
D RKNN: [14:05:56.085] >>>>>> start: rknn::RKNNAllocateConvCachePass D RKNN: [14:05:56.085] <<<<<<<< end: rknn::RKNNAllocateConvCachePass D RKNN: [14:05:56.085] >>>>>> start: OpEmit terminate called after throwing an instance of 'std::out_of_range' what(): vector::_M_range_check: __n (which is 2) >= this->size() (which is 3) Aborted经分析,该 ONNX 模型中包含Conv3D算子,其输入/输出张量维度为 5 维(NCDHW),属于 4 维以上的操作。
二、官方说明
根据 Rockchip 官方对 RKNN-Toolkit2 的说明(参考:https://github.com/airockchip/rknn-toolkit2):
RKNN 目前暂不支持 4 维以上的 OP。当模型存在 4 维以上算子(如 5 维或 6 维)时,会触发类似
vector::_M_range_check的越界异常。解决方法:可以手工将这些节点去掉。
三、结论
该错误是由于 RKNN 不支持 4 维以上算子(如 Conv3D)所致。官方提供的唯一解决方法是:手工移除模型中涉及 4 维以上维度的算子节点。