YOLO-v2-tiny 20种物体检测模型

一、简介

YOLO-v2-tiny是基于YOLO(You Only Look Once)实时目标检测算法的轻量级版本,专门为嵌入式设备和资源受限环境优化。本模型能够检测20种常见物体类别,在保持较高检测精度的同时大幅减少了计算量和模型大小。
20种物体检测模型, 使用 YOLO v2 tiny 网络, 具体的20种类别看详情介绍
在这里插入图片描述

20 个物体类别:

aeroplane, bicycle, bird, boat, bottle, bus, car, cat, chair, cow,
diningtable, dog, horse, motorbike, person, pottedplant, sheep, sofa, train, tvmonitor

二、使用方法

下载模型后得到三个文件: .py 示例脚本, .smodel模型文件,labels.txt文件

在这里插入图片描述
只需要py 示例脚本, .smodel模型文件,将模型下载到 0x800000(因为示例代码中读取模型位置为 0x800000)
在这里插入图片描述
或者放到SD卡里
在这里插入图片描述
开机运行效果

MaixPy运行基于tiny-yolov2的20分类

三、技术参数

  • 输入分辨率:224×224或320×240(QVGA)

  • 锚点(anchors)参数:(1.08,1.19,3.42,4.41,6.63,11.38,9.42,5.11,16.62,10.52)

  • 置信度阈值:0.5

  • 非极大值抑制(NMS)阈值:0.3

  1. 锚框(Anchor Boxes)在YOLO算法中的作用:
  • 锚框是预定义的一组边界框模板,用于预测目标物体的位置和尺寸

  • 网络不是直接预测绝对坐标,而是预测相对于锚框的偏移量

  • 合适的锚框尺寸可以加速训练并提高检测精度

  1. 为什么是10个参数?
  • 每个锚框需要2个参数(宽度w和高度h)

  • 示例代码中使用了5个锚框,因此需要 5锚框 × 2参数 = 10个数值
    对应的锚点参数为:

anchor = (w1, h1, w2, h2, w3, h3, w4, h4, w5, h5)
  1. 锚框数量的选择
  • 5个锚框是YOLOv2/v3常用的配置(尤其是对于人脸检测这类相对单一的目标)

  • 锚框的尺寸是通过K-means聚类在训练数据集上统计得到的:

    • 对训练集中所有真实框(Ground Truth)的宽高进行聚类

    • 选择5个最具代表性的宽高组合作为锚框

  1. 代码中的具体锚点参数
anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025)

解析:

  • 实际表示5个锚框的宽高:
[(1.889,2.5245), (2.9465,3.94056), (3.99987,5.3658), (5.155437,6.92275), (6.718375,9.01025)]
  • 这些值是通过在人脸数据集上聚类得到的,适合检测不同比例的人脸。
  1. 为什么需要多个锚框?
  • 覆盖不同比例的人脸:

    • 近距离人脸(大锚框)

    • 远距离人脸(小锚框)

  • 适应不同长宽比:

    • 正脸(接近正方形)

    • 侧脸(可能更宽或更窄)

  1. 理解YOLO中的NMS阈值调整

非极大值抑制(Non-Maximum Suppression, NMS)是目标检测中用于消除冗余检测框的关键后处理步骤。NMS阈值的调整直接影响模型的检测结果,下面我将详细解释NMS阈值(0.3-0.5)的含义和调整策略。

  • 6.1. NMS基本原理
    NMS的工作流程:

    • 对所有检测框按置信度(confidence score)排序

    • 选择置信度最高的框作为保留框

    • 计算其他框与这个保留框的交并比(IoU)

    • 删除所有IoU大于阈值的框

    • 对剩余的框重复上述过程

  • 6.2. NMS阈值的含义
    NMS阈值(0.3-0.5)指的是IoU的阈值:

    • IoU(Intersection over Union): 两个框重叠面积与并集面积的比值

    • NMS阈值就是判断两个框是否"过于相似"的标准

  • 6.3. 不同阈值的效果

    • 6.3.1 NMS阈值=0.3(代码默认值)

      • 效果:更严格,只保留不太重叠的框

      • 优点:减少重复检测,输出更简洁

      • 缺点:可能漏掉实际存在的相邻物体

      • 适用场景:物体间距较大,重叠少的情况

    • 6.3.2 NMS阈值=0.5

      • 效果:更宽松,允许更多重叠框通过

      • 优点:能检测到靠得很近的物体

      • 缺点:可能产生多个框检测同一物体

      • 适用场景:密集物体检测,小物体检测

四 、模型架构

YOLO-v2-tiny相比完整版YOLOv2做了以下简化:

  • 更少的卷积层:减少了网络深度,降低了计算复杂度

  • 更小的特征图:减少了特征图尺寸,提升推理速度

  • 优化的锚点设计:使用5个预定义的锚点框(anchor boxes)来预测物体位置

  • 提高检测精度:降低置信度阈值(如0.3),但会增加误检

  • 减少误检:提高置信度阈值(如0.7),但可能漏检

  • 处理重叠框:调整NMS阈值(0.3-0.5之间)

五、完整代码

import sensor, image, lcd, time
import KPU as kpu
import gc, sysCOLOR_RED =  (255,0,0)
COLOR_GREEN = (0,255,0)
COLOR_BLUE = (0,0,255)
COLOR_WHITE = (255,255,255)def lcd_show_except(e):import uioerr_str = uio.StringIO()sys.print_exception(e, err_str)err_str = err_str.getvalue()img = image.Image(size=(224,224))img.draw_string(0, 10, err_str, scale=1, color=COLOR_RED)lcd.display(img)def main(anchors, labels = None, model_addr="/sd/m.smodel", sensor_window=(224, 224), lcd_rotation=0, sensor_hmirror=False, sensor_vflip=False):sensor.reset()sensor.set_pixformat(sensor.RGB565)sensor.set_framesize(sensor.QVGA)sensor.set_hmirror(sensor_hmirror)# `enable`: 1 表示开启水平镜像 0 表示关闭水平镜像sensor.set_vflip(sensor_vflip)sensor.run(1)lcd.init(type=1)lcd.rotation(lcd_rotation)lcd.clear(lcd.WHITE)if not labels:with open('labels.txt','r') as f:exec(f.read())if not labels:print("no labels.txt")img = image.Image(size=(320, 240))img.draw_string(90, 110, "no labels.txt", color=COLOR_RED, scale=2)lcd.display(img)return 1try:img = image.Image("startup.jpg")lcd.display(img)except Exception:img = image.Image(size=(320, 240))img.draw_string(90, 110, "loading model...", color=COLOR_WHITE, scale=2)lcd.display(img)task = kpu.load(model_addr)kpu.init_yolo2(task, 0.5, 0.3, 5, anchors) ##1、task: 指定任务类型,例如是检测还是分类。在YOLO中,通常设置为"detection"。#2、threshold: 置信度阈值,用于过滤掉低置信度的检测结果。阈值范围是[0,1],值越高,则模型只会输出置信度更高的预测结果。#3、nms_value: 非最大抑制(Non-Maximum Suppression, NMS)的阈值,用于减少重叠框的数量。NMS阈值同样在[0,1]范围内,值越高,则保留的框越少,重叠越小。#4、classes: 类别数量,表示模型需要识别的对象类别数。#5、anchors: 锚点(Anchors)是YOLO中用来预测边界框的先验框尺寸。这些尺寸是在训练数据集上通过k-means聚类得到的。try:while 1:img = sensor.snapshot()t = time.ticks_ms()objects = kpu.run_yolo2(task, img)t = time.ticks_ms() - tif 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=COLOR_GREEN)img.draw_string(0, 200, "t:%d ms" %(t), scale=2, color=COLOR_BLUE)lcd.display(img)except Exception as e:raise efinally:kpu.deinit(task)if __name__ == "__main__":try:labels = ['aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor']anchors = (1.08, 1.19, 3.42, 4.41, 6.63, 11.38, 9.42, 5.11, 16.62, 10.52)main(anchors = anchors, labels=labels, model_addr="/sd/m.smodel", lcd_rotation=1, sensor_window=(224, 224))except Exception as e:sys.print_exception(e)lcd_show_except(e)finally:gc.collect()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/92913.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/92913.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

heterophilic graph和hetergeneous graph区别(附带homophilic graph 和homoegeneous graph)

Heterophilic Graph(异配图)连接的节点在属性上不相似,但是所有节点和边的类别都是同一种类型,数据集如squirrel / chameleon,它们是 heterogeneous graph(异质图)而不是Heterophilic Graph(异配…

Thinkphp(GUI)漏洞利用工具,支持各版本TP漏洞检测,命令执行,Getshell

工具介绍 Thinkphp(GUI)漏洞利用工具,支持各版本TP漏洞检测,命令执行,Getshell。JAVAFX可视化编写,博主第一次用javafx来写界面,第一次学习尝试,仅仅只用于学习尝试如果缺少什么payload,欢迎提交…

GitHub分支保护介绍(Branch Protection)(git分支保护)(通过设置规则和权限来限制对特定分支的操作的功能)

文章目录**1. 核心功能****a. 防止误操作****b. 强制代码审查****c. 状态检查(Status Checks)****d. 权限控制****2. 如何设置分支保护?**1. **进入仓库设置**2. **添加分支保护规则**3. **配置保护规则**4. **保存设置****3. 常见应用场景**…

怎么理解On-Premises

On-Premises 指的是—— 软件、系统、数据中心等部署并运行在企业自己管理的本地硬件或机房里,而不是放在云端或第三方托管环境中。 你可以把它理解成:“服务器在你自己家里(公司机房),而不是寄放在别人家(…

UserController类讲解

用户管理控制器,实现了用户CRUD操作的RESTful API: 1. 类结构与核心注解 1.1 控制器声明 RestController RequestMapping("/api/users") public class UserControllerRestController 深度解析: 组合注解:Controller Re…

【剑指offer】搜索算法

目录 📁 JZ53 数字在升序数组中出现的次数​编辑 📁 JZ4 二维数组中的查找​编辑 📁 JZ11 旋转数组的最小数字 📁 JZ38 字符串的排列​编辑 📁 JZ53 数字在升序数组中出现的次数 这就是一道简单的模板题&#xff0…

ETLCloud批流一体化体现在哪

ETLCloud批流一体化体现在哪 企业对数据处理的实时性、高效性和准确性的要求越来越高。批流一体化作为一种先进的数据处理理念,逐渐被企业所采用。 目前许多国产化ETL工具也装配了十分强大的批流一体化能力,ETLCoud就是一个很好的代表,它能够…

Mybatis学习之缓存(九)

这里写目录标题一、MyBatis的一级缓存1.1、工作原理1.2、一级缓存失效的四种情况1.3、不同的SqlSession对应不同的一级缓存1.4、同一个SqlSession但是查询条件不同1.5、同一个SqlSession两次查询期间执行了任何一次增删改操作1.6、同一个SqlSession两次查询期间手动清空了&…

windows10装Ubuntu22.04系统(双系统)

参考链接:Windows和Linux双系统的保姆级安装教程,新手小白跟着也能装_windows安装linux双系统-CSDN博客 1 前期准备 1.下载Ubuntu22.04.5 的iso镜像文件:Download Ubuntu Desktop | Ubuntu 2.准备一个U盘(空,已有文…

Pandas数据处理与分析实战:Pandas数据清洗与处理入门

数据清洗:Pandas数据处理入门 学习目标 本课程将引导学员了解数据清洗的基本概念,掌握使用Pandas库处理数据集中的缺失值、重复数据和异常值的方法,确保数据的质量,为后续的数据分析和机器学习任务打下坚实的基础。 相关知识点 Pa…

Python爬虫实战:研究ScrapyRT框架,构建图书商城数据采集系统

1. 引言 1.1 研究背景 在当今数字化时代,互联网已成为全球最大的信息库,蕴含着海量的有价值数据,涵盖商业、教育、科研、医疗等各个领域。根据 IDC(国际数据公司)预测,到 2025 年全球数据圈将增长至 175ZB,其中网络数据占比超过 60%。这些数据不仅是企业制定商业策略、…

springboot接口请求参数校验

参数校验 参数校验可以防止无效或错误的数据进入系统。通过校验前端输入的参数,可以确保数据的完整性,避免因为缺少必要的信息而导致程序错误或异常。例如,对于密码字段,可以通过校验规则要求用户输入至少8个字符、包含字母和数字…

Docker部署 Neo4j 及集成 APOC 插件:安装与配置完整指南(docker-compose)

Docker部署 Neo4j 及集成 APOC 插件:分步骤指南 摘要 :本文将分两部分详细介绍相关内容。第一部分讲解如何使用 Docker Compose 部署 Neo4j 图数据库,提供完整配置文件及常见问题解决方案;第二部分在前者基础上,介绍 A…

TLSv1.2协议与TCP/UDP协议传输数据内容差异

一、Wireshark中常见的TLSv1.2在用Wireshark抓包时,除了看到课堂上教过的经典的TCP/UDP协议,还有一个协议经常出现——TLSv1.2。并且这个协议的Info解释是Application data,其实看到这个解释,我大概猜出来了TLSv1.2是用来给用户数…

51c自动驾驶~合集14

自己的原文哦~ https://blog.51cto.com/whaosoft/11707335 #Text2LiDAR 文本引导的无条件点云生成新SOTA 论文题目:《Text2LiDAR: Text-guided LiDAR Point Cloud Generation via Equirectangular Transformer》 论文地址:https://arxiv.o…

k8s基本概念

k8s 的基本概念 Kubernetes是一个可以移植、可扩展的开源平台,使用 声明式的配置 并依据配置信息自动地执行容器化应用程序的管理。在所有的容器编排工具中(类似的还有 docker swarm / mesos等),Kubernetes的生态系统更大、增长更…

Easysearch 数据迁移之数据比对

上一篇我们通过 INFINI Gateway 进行了索引数据迁移,对索引迁移结果进行了初步且直观的校验--对比索引的文档数是否一致。今天介绍个实实在在的数据比对方法,通过网关对比索引文档的内容在两个集群是否一致。话不多说,就拿上次迁移的两个索引…

Codeforces Round 1042 (Div. 3)

ABCD 略E注意到每个操作最多执行一次,ifa[i]!b[i],要么a[i]^a[i1]要么a[i]^b[i1]G设消除1~i的数的操作次数为f[i],可以推出f[i]2*f[i-1]1,那么消除1~i的数的分数乘的数为g[i],g[i]g[i-1]*g[i-1]*i s虽然很大&#xff0…

AJAX:让你的网页“静悄悄”变聪明,体验丝滑升级

大家好,今天想聊聊一个让网页“活”起来的小秘密——AJAX。你可能遇到过这种情况:点个按钮,页面就刷新,等得心急火燎。但用了AJAX的网站,比如购物车更新或搜索建议,数据嗖嗖就来了,整个页面却纹…

【iOS】Block基础知识和底层探索

文章目录前言Block的声明和创建问题引入Block的底层结构Block的执行流程Block的创建与存储Block的传递与调用Block的捕获机制捕获局部变量捕获全局变量小结Block的类型__block修饰符__block变量的包装结构体block的实例结构体block的执行逻辑Block循环引用造成的原因解决方法小…