我用了三模型在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()
不知道你这个问题是否已经解决, 如果还没有解决的话:博主有解决嘛?我也遇到了相同的问题,求答。