尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

5.4 庐山派K230开发板YOLO模块API手册:YOLOv5/v8/v11模型部署与实战指南

5.4 庐山派K230开发板YOLO模块API手册:YOLOv5/v8/v11模型部署与实战指南 庐山派K230开发板YOLO模块API手册YOLOv5/v8/v11模型部署与实战指南最近在庐山派K230开发板上做AI视觉项目发现官方提供的YOLO模块封装得相当好用可以轻松部署YOLOv5、YOLOv8和YOLO11模型。很多朋友问我怎么在K230上跑YOLO模型今天我就结合自己的使用经验手把手教大家如何使用这个YOLO模块API。这个模块支持分类、检测、分割三种任务无论是图片推理还是实时视频流处理都能搞定。咱们先来看看整体架构然后我会用实际代码演示每个功能怎么用。1. 准备工作与环境搭建在开始写代码之前有几个准备工作需要先做好。1.1 了解YOLO模块的基本概念庐山派K230的YOLO模块封装了三种YOLO模型YOLOv5、YOLOv8和YOLO11。虽然版本不同但API设计基本一致使用起来很统一。这里有个重要的概念需要理解kmodel。这是Kendryte K230芯片专用的模型格式你需要先把训练好的YOLO模型转换成.kmodel格式然后放到开发板上才能使用。转换工具和流程可以参考官方文档。1.2 文件结构准备在开发板上建议按这样的目录结构组织文件/data/ ├── yolo_kmodels/ # 存放转换好的kmodel文件 │ ├── det_yolov5n_320.kmodel │ ├── cls_yolov8n_224.kmodel │ └── seg_yolo11n_320.kmodel └── test_images/ # 存放测试图片 └── test.jpgkmodel文件需要从PC端通过scp或其他方式传输到开发板的对应目录。图片文件也是一样。2. YOLO模块API详解庐山派的YOLO模块提供了三个类YOLOv5、YOLOv8和YOLO11。它们的API几乎一模一样只是类名不同。下面我以YOLOv5为例详细讲解其他两个类的用法完全一样。2.1 YOLOv5类构造函数创建YOLO实例是第一步也是最关键的一步。构造函数参数比较多咱们一个一个来看。from libs.YOLO import YOLOv5 yolo YOLOv5( task_typedetect, # 任务类型classify/detect/segment modeimage, # 推理模式image或video kmodel_path/data/yolo_kmodels/det_yolov5n_320.kmodel, labels[apple, banana, orange], rgb888p_size[1280, 720], # 输入图像分辨率 model_input_size[320, 320], # 模型训练时的输入分辨率 conf_thresh0.5, # 置信度阈值 nms_thresh0.25, # NMS阈值检测和分割任务需要 max_boxes_num50, # 最大检测框数量 debug_mode0 # 调试模式0关闭1开启 )注意task_type、mode、kmodel_path这三个参数必须根据你的实际情况修改其他参数可以使用默认值或根据需求调整。2.1.1 关键参数详解我整理了一个参数说明表方便大家理解每个参数的作用参数名类型说明注意事项task_typestr任务类型classify分类、detect检测、segment分割必须与kmodel模型类型匹配modestr推理模式image图片推理、video视频流推理视频模式需要配合PipeLine使用kmodel_pathstrkmodel文件在开发板上的完整路径路径要写对否则会报错labelslist[str]类别标签列表如[person, car, dog]顺序要与训练时一致rgb888p_sizelist[int]输入图像分辨率如[1920,1080]、[1280,720]实际输入图片或视频帧的大小model_input_sizelist[int]模型训练时的输入分辨率如[320,320]、[640,640]必须与kmodel的输入尺寸一致conf_threshfloat置信度阈值范围0~1值越大检测越严格漏检可能增加nms_threshfloat非极大值抑制阈值范围0~1仅检测和分割任务需要分类任务不需要mask_threshfloat分割任务的二值化阈值范围0~1仅分割任务需要max_boxes_numint一帧图像中最多返回的检测框数量根据实际场景调整太多会影响性能debug_modeint调试模式0关闭计时1开启计时开启后会输出各阶段耗时这里有个坑我踩过model_input_size必须和模型训练时的输入尺寸完全一致否则推理结果会出错。比如你的模型是用320×320训练的这里就必须填[320, 320]。2.2 核心方法使用创建好YOLO实例后接下来就是使用它的几个核心方法。2.2.1 config_preprocess() - 预处理配置这个方法很简单就是配置预处理参数。调用它之后YOLO实例就知道怎么处理输入图像了。yolo.config_preprocess()这个方法没有参数直接调用就行。一般在创建实例后立即调用。2.2.2 run() - 执行推理这是最核心的方法负责执行模型推理。输入一张图片返回推理结果。res yolo.run(img)参数img需要是ulab.numpy.ndarray格式的图像数据并且是CHW格式通道×高度×宽度。这个格式和常见的HWC格式高度×宽度×通道不一样需要特别注意。返回的res根据任务类型不同而不同分类任务返回(类别索引, 置信度分数)检测任务返回检测框列表每个框包含[位置, 分数, 类别索引]分割任务返回(mask结果, 检测框列表)2.2.3 draw_result() - 绘制结果这个方法把推理结果可视化到图像上比如画检测框、显示类别标签和置信度。yolo.draw_result(res, img_ori)参数img_ori是image.Image实例可以从read_img()函数获取或者从PipeLine的pl.osd_img获取。3. 实战示例图片推理理论讲完了咱们来看实际代码。我会用三个完整的例子展示不同任务类型的用法。3.1 检测任务YOLOv5假设我们要用YOLOv5模型检测图片中的水果下面是完整的代码from libs.YOLO import YOLOv5 import os, sys, gc import ulab.numpy as np import image # 从本地读取图片并转换为CHW格式 def read_img(img_path): img_data image.Image(img_path) img_data_rgb888 img_data.to_rgb888() img_hwc img_data_rgb888.to_numpy_ref() shape img_hwc.shape # HWC转CHW这是关键步骤 img_tmp img_hwc.reshape((shape[0] * shape[1], shape[2])) img_tmp_trans img_tmp.transpose() img_res img_tmp_trans.copy() img_return img_res.reshape((shape[2], shape[0], shape[1])) return img_return, img_data_rgb888 if __name__ __main__: # 1. 设置文件路径根据实际情况修改 img_path /data/test_images/test.jpg kmodel_path /data/yolo_kmodels/det_yolov5n_320.kmodel # 2. 配置参数 labels [apple, banana, orange] confidence_threshold 0.5 nms_threshold 0.45 model_input_size [320, 320] # 3. 读取图片 img, img_ori read_img(img_path) rgb888p_size [img.shape[2], img.shape[1]] # 获取图片实际尺寸 # 4. 创建YOLOv5实例 yolo YOLOv5( task_typedetect, modeimage, kmodel_pathkmodel_path, labelslabels, rgb888p_sizergb888p_size, model_input_sizemodel_input_size, conf_threshconfidence_threshold, nms_threshnms_threshold, max_boxes_num50, debug_mode0 ) # 5. 配置预处理 yolo.config_preprocess() try: # 6. 执行推理 res yolo.run(img) # 7. 绘制结果 yolo.draw_result(res, img_ori) # 8. 垃圾回收嵌入式设备内存紧张这个很重要 gc.collect() except Exception as e: # 异常处理 sys.print_exception(e) finally: # 9. 释放资源 yolo.deinit()提示read_img()函数中的HWC转CHW操作是必须的因为YOLO模块要求输入是CHW格式。如果你直接从摄像头获取数据也需要做同样的转换。3.2 分类任务YOLOv8分类任务相对简单一些不需要NMS参数。下面是YOLOv8分类的示例from libs.YOLO import YOLOv8 import os, sys, gc import ulab.numpy as np import image # read_img函数同上这里省略... if __name__ __main__: img_path /data/test_images/test_apple.jpg kmodel_path /data/yolo_kmodels/cls_yolov8n_224.kmodel labels [apple, banana, orange] confidence_threshold 0.5 model_input_size [224, 224] img, img_ori read_img(img_path) rgb888p_size [img.shape[2], img.shape[1]] # 注意分类任务不需要nms_thresh参数 yolo YOLOv8( task_typeclassify, modeimage, kmodel_pathkmodel_path, labelslabels, rgb888p_sizergb888p_size, model_input_sizemodel_input_size, conf_threshconfidence_threshold, debug_mode0 ) yolo.config_preprocess() try: res yolo.run(img) yolo.draw_result(res, img_ori) gc.collect() except Exception as e: sys.print_exception(e) finally: yolo.deinit()分类任务返回的结果是一个元组比如(0, 0.95)表示类别索引0对应apple置信度0.95。3.3 分割任务YOLO11分割任务最复杂需要mask_thresh参数。下面是YOLO11分割的示例from libs.YOLO import YOLO11 import os, sys, gc import ulab.numpy as np import image # read_img函数同上这里省略... if __name__ __main__: img_path /data/test_images/test.jpg kmodel_path /data/yolo_kmodels/seg_yolo11n_320.kmodel labels [apple, banana, orange] confidence_threshold 0.5 nms_threshold 0.45 mask_threshold 0.5 # 分割任务特有的阈值参数 model_input_size [320, 320] img, img_ori read_img(img_path) rgb888p_size [img.shape[2], img.shape[1]] # 分割任务需要mask_thresh参数 yolo YOLO11( task_typesegment, modeimage, kmodel_pathkmodel_path, labelslabels, rgb888p_sizergb888p_size, model_input_sizemodel_input_size, conf_threshconfidence_threshold, nms_threshnms_threshold, mask_threshmask_threshold, # 分割阈值 max_boxes_num50, debug_mode0 ) yolo.config_preprocess() try: res yolo.run(img) yolo.draw_result(res, img_ori) gc.collect() except Exception as e: sys.print_exception(e) finally: yolo.deinit()分割任务返回的结果包含两部分mask分割结果和检测框信息。draw_result()方法会把分割区域用半透明颜色覆盖显示。4. 实战示例视频流推理视频流推理和图片推理的主要区别在于需要使用PipeLine来获取视频帧。下面我以YOLOv5检测任务为例展示视频推理的完整流程。4.1 视频推理完整代码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__: # 1. 显示设置 display_mode hdmi # 可选hdmi或lcd rgb888p_size [1280, 720] # 摄像头采集分辨率 if display_mode hdmi: display_size [1920, 1080] # HDMI输出分辨率 else: display_size [800, 480] # LCD输出分辨率 # 2. 模型和参数配置 kmodel_path /data/yolo_kmodels/det_yolov5n_320.kmodel labels [apple, banana, orange] confidence_threshold 0.8 # 视频流可以设高一点减少误检 nms_threshold 0.45 model_input_size [320, 320] # 3. 初始化PipeLine视频流管道 pl PipeLine( rgb888p_sizergb888p_size, display_sizedisplay_size, display_modedisplay_mode ) pl.create() # 创建管道 # 4. 创建YOLO实例注意modevideo yolo YOLOv5( task_typedetect, modevideo, # 视频模式 kmodel_pathkmodel_path, labelslabels, rgb888p_sizergb888p_size, model_input_sizemodel_input_size, display_sizedisplay_size, # 视频模式需要这个参数 conf_threshconfidence_threshold, nms_threshnms_threshold, max_boxes_num50, debug_mode0 ) yolo.config_preprocess() try: while True: os.exitpoint() # 允许程序退出 with ScopedTiming(total, 1): # 计时debug_mode1时生效 # 5. 获取一帧图像 img pl.get_frame() # 6. 执行推理 res yolo.run(img) # 7. 绘制结果到OSD层 yolo.draw_result(res, pl.osd_img) # 8. 显示图像 pl.show_image() # 9. 垃圾回收 gc.collect() except Exception as e: sys.print_exception(e) finally: # 10. 释放资源 yolo.deinit() pl.destroy()4.2 视频推理的关键点视频推理有几个地方和图片推理不同mode参数必须设置为video这样YOLO模块会针对视频流做优化display_size参数视频模式需要指定显示分辨率支持HDMI(1920×1080)和LCD(800×480)PipeLine的使用视频流需要通过PipeLine获取pl.get_frame()返回的就是CHW格式不需要手动转换绘制到OSD层使用pl.osd_img作为绘制目标而不是自己创建的Image对象循环处理视频推理是持续不断的需要用while循环不断获取帧、推理、显示注意视频推理对性能要求更高如果发现帧率太低可以尝试降低输入分辨率rgb888p_size使用更小的模型如nano版本提高置信度阈值conf_thresh减少后处理计算量5. 常见问题与调试技巧在实际使用中大家可能会遇到一些问题。这里我总结几个常见的坑和解决方法。5.1 内存管理问题嵌入式设备内存有限特别是K230开发板。如果程序运行一段时间后崩溃很可能是内存泄漏。解决方法确保每次推理后调用gc.collect()进行垃圾回收使用try...finally确保yolo.deinit()和pl.destroy()被调用如果处理大尺寸图片考虑先缩放到合适尺寸再推理5.2 模型不匹配问题如果推理结果完全不对可能是模型和参数不匹配。检查清单task_type是否与模型类型一致分类/检测/分割model_input_size是否与模型训练尺寸一致labels列表是否与训练时的类别顺序一致kmodel文件路径是否正确文件是否存在5.3 性能优化建议分辨率选择rgb888p_size不要设置得比实际需要大大分辨率会显著降低帧率阈值调整根据实际场景调整conf_thresh和nms_thresh室内稳定场景可以设高阈值如0.7减少误检室外复杂场景可以设低阈值如0.3避免漏检最大检测框数max_boxes_num根据实际需要设置一般场景50个足够使用小模型边缘设备优先选择YOLOv5n、YOLOv8n等轻量级模型5.4 调试模式如果开启debug_mode1YOLO模块会输出各个阶段的耗时方便性能分析预处理耗时: 15ms 推理耗时: 120ms 后处理耗时: 8ms 总耗时: 143ms通过这个可以知道瓶颈在哪里然后针对性地优化。6. 实际项目经验分享最后分享几个我在实际项目中的使用经验经验一多模型切换如果项目需要支持多种检测任务可以动态创建不同的YOLO实例。比如白天用检测模型晚上用分类模型。记得用完要及时deinit()释放资源。经验二参数动态调整可以根据环境光线、目标大小等条件动态调整置信度阈值。比如光线暗的时候降低阈值避免漏检。经验三错误处理一定要做好异常处理特别是视频流推理。网络摄像头可能断开SD卡可能拔出这些都要考虑进去。经验四资源复用如果需要频繁创建销毁YOLO实例可以考虑做成单例模式或者池化管理。创建YOLO实例比较耗时尽量避免在循环中频繁创建。按照上面的步骤和示例代码你应该能在庐山派K230开发板上顺利运行YOLO模型了。实际开发中如果遇到问题可以多看看官方文档或者在社区里交流。嵌入式AI开发就是这样一边踩坑一边成长动手试试吧
返回列表