嘉楠科技
直播中

乐侨珂

9年用户 1064经验值
擅长:控制/MCU
私信 关注
[问答]

在K230上部署yolov5时 出现the array is too big的原因?

重现步骤
1将yolov5的kmodel放入k230的data数据
2使用yolo大作战里的视频流推理代码
3运行
期待结果和实际结果
期待的结果 将目标检测的框圈起来
实际看到的结果 the array is too big 报错"File "/sdcard/libs/AIBase.py", line 73, in run
File "/sdcard/libs/AIBase.py", line 59, in inference"
软硬件版本信息
nncase2.9.0 庐山派k230
错误日志
Traceback (most recent call last):
File "", line 32, in
File "/sdcard/libs/AIBase.py", line 73, in run
File "/sdcard/libs/AIBase.py", line 59, in inference
ValueError: array is too big
尝试解决过程
减小模型体积,用的yolov5n 仍然报一样的错误
补充材料
from libs.PipeLine import PipeLine, Scopedtiming
from libs.YOLO import YOLOv5
import os,sys,gc
import ulab.numpy as np
import image
if name=="main":
# 显示模式,默认"hdmi",可以选择"hdmi"和"lcd"
display_mode="hdmi"
rgb888p_size=[1280,720]
if display_mode=="hdmi":
display_size=[1920,1080]
else:
display_size=[800,480]
# 路径可以自行修改适配您自己的模型
kmodel_path="/data/best.kmodel"
labels = ["pingpong"]
confidence_threshold = 0.8
nms_threshold=0.45
model_input_size=[320,320]
# 初始化PipeLine
pl=PipeLine(rgb888p_size=rgb888p_size,display_size=display_size,display_mode=display_mode)
pl.create()
# 初始化YOLOv5实例
yolo=YOLOv5(task_type="detect",mode="video",kmodel_path=kmodel_path,labels=labels,rgb888p_size=rgb888p_size,model_input_size=model_input_size,display_size=display_size,conf_thresh=confidence_threshold,nms_thresh=nms_threshold,max_boxes_num=5,debug_mode=0)
yolo.config_preprocess()
try:
while True:
os.exitpoint()
with ScopedTiming("total",1):
# 逐帧推理
img=pl.get_frame()
res=yolo.run(img)
yolo.draw_result(res,pl.osd_img)
pl.show_image()
gc.collect()
except Exception as e:
sys.print_exception(e)
finally:
yolo.deinit()
pl.destroy()

回帖(1)

张虎豹

2025-6-4 18:14:45

在K230上部署YOLOv5时出现the array is too big错误,通常与模型输入输出张量形状不匹配内存溢出模型转换配置错误有关。以下是具体原因分析和解决方案:




原因分析




  1. 模型转换配置错误



    • YOLOv5模型在转换为kmodel时,输入的图像尺寸(如640x640)可能与代码中实际传递的尺寸不一致。

    • 使用nncase转换时未正确指定输入/输出形状或数据类型。




  2. 输入数据未预处理



    • 视频流的帧未经过缩放(Resize)或归一化(Normalization),导致输入数组尺寸超出模型预期。




  3. 内存不足



    • K230的硬件内存有限,模型或中间计算结果超出可用内存,导致数组分配失败。




  4. 后处理代码错误



    • 模型输出的张量形状与代码中后处理逻辑(如reshapetranspose)不匹配,触发越界操作。






解决方案


1. 检查模型转换配置



  • 确认输入尺寸:在将YOLOv5转换为kmodel时,确保输入尺寸与代码中处理图像的尺寸一致。例如:
    # 转换命令需指定正确的input_shape
    ncc compile yolov5.onnx yolov5.kmodel --target k230 --input-shape 1 3 640 640

  • 量化参数:如果使用量化模型,检查预处理中的归一化参数(如meanstd)是否与训练时一致。


2. 验证输入数据预处理


在视频流推理前,确保对每一帧进行Resize归一化


# 示例:调整帧尺寸为模型输入尺寸
frame = cv2.resize(frame, (640, 640))
# 归一化(根据模型要求)
frame = (frame / 255.0).astype(np.float32)

3. 优化内存使用



  • 降低输入分辨率:如果K230内存不足,尝试减小输入尺寸(如320x320)。

  • 释放无用变量:及时释放中间结果(如delgc.collect())。


4. 检查后处理代码


AIBase.pyinference方法中,确保模型输出的形状与后处理逻辑匹配:


# 示例:获取输出并解析
outputs = self.interpreter.get_outputs()
for output in outputs:
    # 确认输出形状与预期一致
    print("Output shape:", output.shape)
    # 调整形状(如YOLO的85维输出)
    data = output.data.reshape((5, 8400))  # 根据实际输出调整

5. 调试工具



  • 打印张量形状:在关键步骤打印输入/输出张量的形状,确认一致性:
    print("Input shape:", frame.shape)
    outputs = self.interpreter.inference(frame)
    print("Output shape:", outputs[0].shape)

  • 简化测试:使用静态图片代替视频流,缩小问题范围。




验证步骤



  1. 重新转换模型并指定正确的输入尺寸。

  2. 在代码中添加输入预处理(Resize + 归一化)。

  3. 运行静态图片推理,观察是否报错。

  4. 逐步启用视频流,监控内存使用情况。


如果问题仍未解决,建议提供更详细的错误日志(如AIBase.py第59行的具体操作),以便进一步定位问题。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分