重现步骤
问题1. usb摄像头捕获的图片,通过硬件解码后,送入yolo,系统卡死。
经过验证,就是
img = UVC.snapshot()
img = csc.convert(img)
res = yolo.run(img)这一步会导致系统卡死,应该是图片格式不符合
yolo用的自训练yolov11模型,使用默认的板载摄像头没有问题。
软硬件版本信息
立创庐山派CANMV K230,系统基于嘉楠官方的进阶自定义固件编译,在在原本基础上选择了支持UVC。CanMV_K230_LCKFB_micropython_local_nncase_v2.9.0.img
错误日志
打印过内存占用和cpu,均无问题。
堆内存总大小: 67108864 字节
堆内存可用大小: 20988416 字节
堆内存已用大小: 49090432 字节
分页内存总大小: 461602816 字节
分页内存可用大小: 21319680 字节
分页内存已用大小: 440283136 字节
MMZ 内存总大小: 535822336 字节
MMZ 内存可用大小: 27901952 字节
MMZ 内存已用大小: 507920384 字节
cpu:7
尝试解决过程
尝试过换csv的格式,仍旧不行
补充材料
import time
from media.display import *
from media.media import *
from media.uvc import *
from nonai2d import CSC # 硬件色彩空间转换器
from libs.PipeLine import ScopedTiming
from libs.YOLO import *
import os,sys,gc
import ulab.numpy as np
import image
import uos
初始化硬件色彩空间转换器
csc = CSC(0, CSC.PIXEL_FORMAT_RGB_565)
rgb888p_size = [640, 480]
display_size = [800, 480]
YOLOv11参数
kmodel_path = "/sdcard/examples/kmodel/best.kmodel"
labels = ["UAV"]
confidence_threshold = 0.8
nms_threshold = 0.45
model_input_size = [320, 320]
yolo=YOLO11(task_type="detect",mode="video",kmodel_path=kmodel_path,labels=labels,rgb888p_size=rgb888p_size,model_input_size=model_input_size,conf_thresh=confidence_threshold,nms_thresh=nms_threshold,max_boxes_num=50,debug_mode=0)
yolo.config_preprocess()
初始化媒体管理器
MediaManager.init()
检测摄像头
while True:
plugin, dev = UVC.probe()
if plugin:
print(f"检测到USB摄像头: {dev}")
break
time.sleep_ms(100)
设置视频模式
mode = UVC.video_mode(640, 480, UVC.FORMAT_MJPEG, 25)
succ, mode = UVC.select_video_mode(mode)
print(f"模式设置: {'成功' if succ else '失败'}, 实际模式: {mode}")
启动视频流(启用硬件解码)
UVC.start(delay_ms=10,cvt=True)
clock = time.clock() # 用于计算FPS
try:
frame_count = 0 # 初始化帧计数器
while True:
clock.tick()
img = UVC.snapshot()
cpu = uos.cpu_usage()
heap_info = gc.sys_heap()
print(f"堆内存总大小: {heap_info[0]} 字节")
print(f"堆内存可用大小: {heap_info[1]} 字节")
print(f"堆内存已用大小: {heap_info[2]} 字节")
page_info = gc.sys_page()
print(f"分页内存总大小: {page_info[0]} 字节")
print(f"分页内存可用大小: {page_info[1]} 字节")
print(f"分页内存已用大小: {page_info[2]} 字节")
mmz_info = gc.sys_mmz()
print(f"MMZ 内存总大小: {mmz_info[0]} 字节")
print(f"MMZ 内存可用大小: {mmz_info[1]} 字节")
print(f"MMZ 内存已用大小: {mmz_info[2]} 字节")
if img is not None:
frame_count += 1 # 每帧计数器加1
if frame_count % 10 == 0: # 每五帧执行一次检测
print(cpu)
img = csc.convert(img) # 硬件转换色彩空间
time.sleep_ms(100)
res = yolo.run(img)
print(f"当前FPS: {clock.fps()}")
print(res)
else:
frame_count = 0 # 如果图像为空,重置帧计数器
except Exception as e: # 捕获异常
print(f"发生异常: {e}")
finally:
# 清理资源
print("执行清理操作")
csc.destroy()
UVC.stop()
time.sleep_ms(100)
MediaManager.deinit()