Comake D1 开发板 开源算法 YOLOv8 目标检测 实战

YOLOv8

1 概述

1.1 背景介绍

yolov8是一种先进的实时目标检测算法, 它在保持快速检测速度的同时, 进一步提高了检测的准确性和鲁棒性。yolov8官方有提供多种不同大小的检测模型:n、s、m、l、x, 这些开源模型的精度如下:

详情可参考yolov8官方说明:

https://github.com/ultralytics/ultralytics/tree/v8.2.103

yolov8开源模型下载地址如下:

1.2 使用说明

Linux SDK-alkaid中默认带了已经预先转换好的离线模型及板端示例, 相关文件路径如下:

  • 板端示例程序路径

    Linux_SDK/sdk/verify/opendla/source/detection/yolov8
    
  • 板端离线模型路径

    Linux_SDK/project/board/${chip}/dla_file/ipu_open_models/detection/yolov8n_640x640.img
    
  • 板端测试图像路径

    Linux_SDK/sdk/verify/opendla/source/resource/bus.jpg
    

如果用户不需要转换模型可直接跳转至第3章节。

2 模型转换

2.1 onnx模型转换

  • python环境搭建

    $conda create -n yolov8 python==3.10
    $conda activate yolov8
    $git clone https://github.com/ultralytics/ultralytics
    $cd ultralytics
    $pip install -e . -i https://pypi.tuna.tsinghua.edu.cn/simple
    

    注意:这里提供的python环境搭建, 仅作为参考示例, 具体搭建过程请参考官方源码运行教程:

    https://docs.ultralytics.com/quickstart/
    
  • 模型测试

    • 编写模型测试脚本predict.py

      from ultralytics import YOLO
      
      # Load a pretrained YOLO8n model
      model = YOLO("yolov8n.pt")
      
      # Run inference on 'bus.jpg' with arguments
      model.predict("./ultralytics/assets/bus.jpg", save=True, imgsz=640, conf=0.5)
      
    • 运行模型测试脚本, 确保yolov8环境配置正确。

      $python predict.py
      

    具体可参考yolov8官方测试文档

    https://docs.ultralytics.com/zh/usage/python/#predict
    
  • 模型导出

    • 编写模型转换脚本export.py:

      import os
      import sys
      from ultralytics import YOLO
      
      model = YOLO("yolov8n.pt")
      model.export(format="onnx", imgsz=[640,640], simplify=True, opset=13)
      
    • 运行模型转换脚本, 会在当目录下生成yolov8n.onnx模型

      $python export.py
      

2.2 离线模型转换

2.2.1 预&后处理说明
  • 预处理

    转换成功的yolov8n.onnx模型输入信息如下图所示, 要求输入图像的尺寸为 (1, 3, 640, 640), 此外需要将像素值归一化到 [0, 1] 范围内。

  • 后处理

    转换成功的yolov8n.onnx模型输出信息如下图所示, 通常yolov8转换出来的模型输出维度为(1, 84, 8400), 其中 8400 是候选框的数量, 84包括4个边界框坐标和80个类别概率。获取到模型输出的候选框后, 需要对所有候选框的类别进行判断以及NMS非极大值抑制操作后才能输出正确的坐标框。

2.2.2 offline模型转换流程

注意:1)OpenDLAModel对应的是压缩包image-dev_model_convert.tar解压之后的smodel文件。2)转换命令需要在docker环境下运行, 请先根据Docker开发环境教程, 加载SGS Docker环境。

  • 拷贝onnx模型到转换代码目录

    $cp ultralytics/yolov8n.onnx OpenDLAModel/detection/yolov8/onnx
    
  • 转换命令

    $cd IPU_SDK_Release/docker
    $bash run_docker.sh
    #进入到docker环境下的OpenDLAModel目录
    $cd /work/SGS_XXX/OpenDLAModel
    $bash convert.sh -a detection/yolov8 -c config/detection_yolov8.cfg -p SGS_IPU_Toolchain(绝对路径) -s false
    
  • 最终生成的模型地址

    output/${chip}_${时间}/yolov8n_640x640.img
    output/${chip}_${时间}/yolov8n_640x640_fixed.sim
    output/${chip}_${时间}/yolov8n_640x640_float.sim
    
2.2.3 关键脚本参数解析
-   input_config.ini

        [INPUT_CONFIG]
        inputs = images;                #onnx 输入节点名称, 如果有多个需以“,”隔开;
        training_input_formats = RGB;   #模型训练时的输入格式, 通常都是RGB;
        input_formats = YUV_NV12;       #板端输入格式, 可以根据情况选择BGRA或者YUV_NV12;
        quantizations = TRUE;           #打开输入量化, 不需要修改;
        mean_red = 0;                   #均值, 跟模型预处理相关, 根据实际情况配置;
        mean_green = 0;                 #均值, 跟模型预处理相关, 根据实际情况配置;
        mean_blue = 0;                  #均值, 跟模型预处理相关, 根据实际情况配置;
        std_value = 255;                #方差, 跟模型预处理相关, 根据实际情况配置;

        [OUTPUT_CONFIG]
        outputs = output0;              #onnx 输出节点名称, 如果有多个需以“,”隔开;
        dequantizations = TRUE;         #是否开启反量化, 根据实际需求填写, 建议为TRUE。设为False, 输出为int16; 设为True, 输出为float32

-   detection.cfg

        [YOLOV8]
        CHIP_LIST=pcupid                    #平台名称, 必须和板端平台一致, 否则模型无法运行
        Model_LIST=yolov8n                  #输入onnx模型名称
        INPUT_SIZE_LIST=640x640             #模型输入分辨率
        INPUT_INI_LIST=input_config.ini     #配置文件
        CLASS_NUM_LIST=0                    #填0即可
        SAVE_NAME_LIST=yolov8n_640x640.img  #输出模型名称
        QUANT_DATA_PATH=quant_data          #量化图片路径

2.3 模型仿真

  • 获取float/fixed/offline模型输出

    $bash convert.sh -a detection/yolov8 -c config/detection_yolov8.cfg -p SGS_IPU_Toolchain(绝对路径) -s true
    

    执行上述命令后, 会默认将float模型的输出tensor保存到detection/yolov8/log/output路径下的txt文件中。此外, 在detection/yolov8/convert.sh脚本中也提供了fixedoffline的仿真示例, 用户在运行时可以通过打开注释代码块, 分别获取fixedoffline模型输出。

  • 模型精度对比

    在保证输入和上述模型相同的情况下, 进入2.1章节搭建好的环境, 在ultralytics/ultralytics/nn/modules/head.py文件的第143行处添加打印:

    print(torch.cat((dbox, cls.sigmoid()), 1))
    

    获取pytorch模型对应节点的输出tensor, 进而和float、fixed、offline模型进行对比。此外需要特别注意的是, 原始模型的输出格式是NCHW, 而float/fixed/offline模型输出的格式是NHWC

3 板端部署

3.1 程序编译

示例程序编译之前需要先根据板子(nand/nor/emmc, ddr型号等)选择deconfig进行sdk整包编译, 具体可以参考alkaid sdk sigdoc《开发环境搭建》文档。

  • 编译板端yolov8示例。

    $cd sdk/verify/opendla
    $make clean && make source/detection/yolov8 -j8
    
  • 最终生成的可执行文件地址

    sdk/verify/opendla/out/${AARCH}/app/prog_detection_yolov8
    

3.2 运行文件

运行程序时, 需要先将以下几个文件拷贝到板端

  • prog_detection_yolov8
  • bus.jpg
  • yolov8n_640x640.img

3.3 运行说明

  • Usage: ./prog_detection_yolov8 -i image -m model [-t threshold](执行文件使用命令)

  • Required Input:

    • image: 图像文件夹/单张图像路径
    • model: 需要测试的offline模型路径
  • Optional Input:

    • threshold: 检测阈值(0.0~1.0, 默认为0.5)
  • Typical output:

    >./prog_detection_yolov8 -m ./yolov8n.img -i ./images/yolov8_bus.jpg
    
        demo_args: inImages=./; modelPath=./yolov8n.img; threshold=0.5
        found 1 images!
        [0] processing ./images/yolov8_bus.jpg...
        model invoke time: 14.361000 ms
        post process time: 0.436000 ms
        outImagePath: ./output/2108/bus.png
    

4 算法优化

4.1 后处理优化

  • 存在问题

    官方的yolov8转换出来的offline模型cpu占用率较高。其根本原因在于:yolov8默认输出8400个候选检测框(Bounding Box), 在COCO数据集80类别检测场景下, 每个候选框需执行80次类别置信度计算, 即总计算量达到672,000次/帧(8400×80), 会导致cpu的loading一直处在一个较高的状态。

  • 解决方案

    通过SGS_IPU_Toolchain构建后处理模型(如下图所示), 然后跟官方的yolov8模型进行拼接。这样就可以将遍历所有候选框的计算放到ipu上进行, 同时不改变yolov8官方模型的结构。因此用户在转换模型以及运行板端示例时:

    • onnx模型不用变, 参考2.1
    • 离线模型转换命令

      $bash convert.sh -a detection/yolov8 -c config/detection_yolov8.cfg -p SGS_IPU_Toolchain(绝对路径) -s false -d ipu
      

      相关优化可参考OpenDLAModel/detection/yolov8/yolov8_post.py

    • 板端部署, 参考3

  • 注意 通过SGS_IPU_Toolchain构建IPU算子的方式需要用户对IPU Toolchain较为熟悉, 具体可参考IPU Toolchain使用文档

更多信息请进一步的点击这里

5.  立即开始

加入Comake开发者社区

 主页地址CoMake开发者社区

SDK下载CoMake开发者社区

文档中心CoMake开发者社区

马上购买 : 首页-Comake开发者社区商店

### Arduino Uno R3 开发板引脚图及其连接说明 Arduino Uno R3 是一款基于 ATmega328P 微控制器的开源硬件平台,广泛应用于电子制作和学习领域。其引脚布局设计合理,便于初学者理解和使用。 #### 1. 引脚分类概述 Arduino Uno R3 的引脚可以分为以下几个主要类别[^3]: - **电源引脚**: 提供电压输入(Vin)、接地(GND)以及稳压后的5V 和 3.3V 输出。 - **数字 I/O 引脚**: 总共有 14 个数字输入/输出端口,其中部分支持 PWM 功能(标记为 ~ 符号),用于模拟信号输出。 - **模拟输入引脚**: 包含 A0 至 A5 共计 6 路 ADC 输入通道,能够读取外部传感器或其他设备产生的连续变化电信号。 - **通信接口专用针脚**: - RX (接收数据) 和 TX (发送数据): 用于串行通讯,默认对应于 D0 和 D1 数字管脚; - SPI 接口: SCK, MISO, MOSI 及 SS 针位分别位于 D13、D12、D11 和 D10 上; - I²C/TWI 协议相关触点——SDA 数据线连至 A4/D20;SCL 同步时钟则关联着 A5/D21。 #### 2. 实际应用中的连线指导原则 当准备把元件接到这块主板上去之前,请先确认好所使用的具体功能模块所需的资源,并按照如下建议操作[^2]: - 对应每种外设挑选合适的可用GPIO编号来实现逻辑控制或者采集物理量反馈等功能需求。 - 如果涉及到多路开关切换场景下,则优先考虑利用具备中断能力的那些特定编号作为候选对象之一。 - 当需要驱动较大电流负载比如继电器之类的时候,应该额外增加晶体三极管之类的功率放大电路结构以保护主控芯片不受损害风险影响正常工作状态。 以下是简单的LED闪烁程序示例代码片段展示如何配置基本环境并编写相应软件算法完成指定任务目标: ```cpp // 定义 LED 所接插孔位置常数值变量名为 ledPin 并赋初始值为 13 表示默认自带测试灯所在之处 const int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); // 设置该引脚模式为输出型态以便后续操控改变高低电平状况触发效果显现出来 } void loop() { digitalWrite(ledPin, HIGH); // 将上述定义好的端子置高使得内置发光二极体点亮一段时间长度由下面延时函数参数决定 delay(1000); digitalWrite(ledPin, LOW); // 再次改回低准位关闭刚才亮起的小灯光源持续同样秒数周期重复执行形成规律明暗交替现象演示过程直观易懂利于理解掌握基础概念要点精髓所在之处值得深入探究挖掘更多可能性空间拓展实际应用场景范围广度深度兼具挑战性十足令人跃跃欲试迫不及待想要动手实践一番究竟成果几何拭目以待吧朋友们加油哦😊✨🎉👏💪🔥🌟🌈🌍🚀🌌💫💥⚡️👋👋👋 delay(1000); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值