k210多模型运行卡的程序运行不了,内存不够。

我用了三模型在k210上跑然后每个模型1.84M左右,因为标签不够只能用三个模型,现在程序改改反复加载,点开始跑不动。

# 导入所需的库
import sensor, image, lcd, time, gc, sys
import KPU as kpu

# 设置输入图像的大小(默认为224x224)
input_size = (224, 224)

# 声明第一个模型的标签和锚点矩阵
labels0 = ['b', 'e', 'g', 'j', 'i', 'a', 'c', 'd', 'f', 'h']
anchors0 = [3.37, 3.78, 3.5, 4.81, 2.62, 3.0, 3.69, 2.22, 4.5, 3.44]

# 声明第二个模型的标签和锚点矩阵
labels1 = ['m', 'n', 'o', 'r', 's', 't', 'k', 'l', 'p', 'q']
anchors1 = [3.47, 4.75, 3.12, 3.81, 2.62, 3.34, 4.41, 3.66, 2.69, 4.72]

# 声明第三个模型的标签和锚点矩阵
labels2 = ['w', 'x', 'y', 'z', 'NO', 'OK', 'u', 'v']
anchors2 = [2.78, 4.31, 3.44, 4.47, 3.69, 3.06, 2.97, 5.41, 2.28, 4.44]

# 在发生异常时,显示异常消息并向LCD屏幕上绘制错误信息
def lcd_show_except(e):
    import uio
    err_str = uio.StringIO()
    sys.print_exception(e, err_str)
    err_str = err_str.getvalue()
    img = image.Image(size=input_size)
    img.draw_string(0, 10, err_str, scale=1, color=(0xff,0x00,0x00))
    lcd.display(img)

# 三个YOLOv2模型和标签的主函数
def main(model_list, labels_list, anchors_list, sensor_window=input_size, lcd_rotation=0, sensor_hmirror=1, sensor_vflip=False):
    # 如果模型列表、标签列表或锚点列表为空,则返回错误信息
    if not model_list or not labels_list or not anchors_list:
        print("missing models, labels or anchors list")
        img = image.Image(size=(320, 240))
        img.draw_string(90, 110, "missing models", color=(255, 0, 0), scale=2)
        lcd.display(img)
        return 1

    # 初始化摄像头
    sensor.reset()
    sensor.set_pixformat(sensor.RGB565)
    sensor.set_framesize(sensor.QVGA)
    sensor.set_windowing(sensor_window)
    sensor.set_hmirror(sensor_hmirror)
    sensor.set_vflip(sensor_vflip)
    sensor.run(1)

    # 初始化LCD显示屏
    lcd.init(type=1)
    lcd.rotation(lcd_rotation)
    lcd.clear(lcd.WHITE)

    # 显示"loading model..."信息
    try:
        img = image.Image("startup.jpg")
        lcd.display(img)
    except Exception:
        img = image.Image(size=(320, 240))
        img.draw_string(90, 110, "loading model...", color=(0, 255, 0), scale=2)
        lcd.display(img)

    while True:
        try:
            # 加载每个YOLOv2模型
            tasks = []
            for i in range(len(model_list)):
                task = kpu.load(model_list[i])
                kpu.init_yolo2(task, 0.5, 0.3, 5, anchors_list[i]) # 设置预测阈值、非极大值抑制和锚点矩阵
                tasks.append(task)

                # 进入主循环,直到程序停止
            #while True:
                img = sensor.snapshot()
                t = time.ticks_ms()
                objects_list = []

                # 在所有模型下检测图像,并将结果存储到一个列表中
                for task in tasks:
                    objects = kpu.run_yolo2(task, img)
                    objects_list.append(objects)

                t = time.ticks_ms() - t

                # 在原始图像的一个副本上标注检测结果(文本和矩形框)
                img_copy = img.copy()
                for i in range(len(objects_list)):
                    objects = objects_list[i]
                    labels = labels_list[i]
                    if objects:
                        for obj in objects:
                            pos = obj.rect()
                            img.draw_rectangle(pos)
                            img.draw_string(pos[0], pos[1], "%s : %.2f" %(labels[obj.classid()], obj.value()), scale=2, color=(255, 0, 0))
                            print(labels[obj.classid()])

                # 需要两秒内连续检测到相同的结果才会显示在LCD屏幕上
                detected_name = ''
                detected_count = 0
                for objects in objects_list:
                    if objects:
                        for obj in objects:
                            name = labels[obj.classid()]
                            if detected_name == name:
                                detected_count += 1
                            else:
                                detected_count = 1
                                detected_name = name

                            if detected_count == 2:
                                # 等待2秒显示识别结果
                                time.sleep(2)

                                # 显示识别结果
                                img.draw_string(0, 200, "Detected: %s" %(detected_name), scale=2, color=(255, 0, 0))
                                lcd.display(img)

                # 在LCD屏幕上显示时长、帧速率和其他统计信息
                img.draw_string(0, 200, "t:%dms" %(t), scale=2, color=(255, 0, 0))
                lcd.display(img_copy)
                kpu.deinit(task)
                
                

        except Exception as e:
            raise e
        finally:
            # 最后一定要释放每个模型使用的资源
            for task in tasks:
                gc.collect()

# 主程序
if __name__ == "__main__":
    try:
        # 声明每个模型的文件路径、标签和锚点矩阵,然后调用主函数
        #model_list = [0x300000, 0x400000, 0x500000]
        model_list = ["/sd/model-27580.kmodel", "/sd/model-27842.kmodel", "/sd/model-31145.kmodel"]
        labels_list = [labels0, labels1, labels2]
        anchors_list = [anchors0, anchors1, anchors2]
        main(model_list, labels_list, anchors_list)
    except Exception as e:
        lcd_show_except(e)
    finally:
        gc.collect()


不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

博主有解决嘛?我也遇到了相同的问题,求答。