yolov3在目标检测领域可以算得上是state-of-art级别的了,在实时性和准确性上都有很好的保证.yolo也不是一开始就达到了这么好的效果,本身也是经历了不断地演进的.

yolov1

测试图片

yolov1有个基本的思想,就是将图片划分为S*S个小格grid,每个grid负责一个目标.上图里的黄色框就是grid.蓝色框就是预测的object.蓝色点是object的中心,位于黄色框内.

每个grid只预测一个目标,这个就造成了yolo的一个缺陷,当多个目标的中心都落在同一个grid cell里的时候,却只能预测出来一个.比如上图左下角有9个圣诞老人,但是只预测出来5个.

反映到模型上,也就是说输入一个448*448*3图片,经过不断卷积,输出一个7*7*30的tensor. 这里的7*7就对应于上面说到的S*S.

那么这里的30怎么来的呢? 每一个grid cell预测2个框出来,每个框对应5个值,(x,y,w,h)和一个box confidence score.box confidence score反映了预测出来的box含有目标的可能性以及这个预测的box的准确性. yolov1预测出20个类别的概率. 所以30 = 2*5 + 20
我们用B指代每个cell预测出B个box,C指代每个cell预测出C个类别的概率.那么yolo的输出的tensor的shape则为(S,S,Bx5+C)

这就是yolo的核心思想了,构建一个CNN网络,得到一个(7,7,30)的tensor.

这样的话就得到了7*7*2个box,我们只保留box confidence score>某个值的box作为我们最终的预测box.

loss

损失函数分为3个部分

  • box位置错误
  • confidence错误(box确实包含目标的可能性错误)
  • 类别概率错误
    其实也就是衡量我们的这些预测值(x,y,w,h,confidence,classp1,classp2....)和真实值的差异

首先,我们预测出了B个box,我们只会用其中一个去计算loss.我们选取与ground-truth box的IOU最大的作为我们计算loss的box.ground-truth box怎么来,因为我们事先已经把数据标注好了,我们当然可以找到ground-truth box的中心位于某个grid cell内,如果有多个ground-truth box的中心都位于当前grid cell内,怎么办?计算每一个predict box和每一个ground-truth box的IOU,选取iou最大的作为相应的predict box,ground-truth box.这个方式带来的一个问题就是前面圣诞老人那个图说到的,当多个目标很密集,他们的中心都落在了同一个grid cell内的时候,yolov1只能检测出其中之一.

loss函数如下图所示:

loss函数的设计基于以下几种考虑

  1. 每一种loss都给相同的权重是不合适的,对于box位置错误给更多的权重,

    目标检测YOLO进化史之yolov1的更多相关文章

    1. 小白也能弄得懂的目标检测YOLO系列之YOLOv1网络训练

      上期给大家介绍了YOLO模型的检测系统和具体实现,YOLO是如何进行目标定位和目标分类的,这期主要给大家介绍YOLO是如何进行网络训练的,话不多说,马上开始! 前言: 输入图片首先被分成S*S个网格c ...

    2. 小白也能弄懂的目标检测YOLO系列之YOLOV1 - 第二期

      上期给大家展示了用VisDrone数据集训练pytorch版YOLOV3模型的效果,介绍了什么是目标检测.目标检测目前比较流行的检测算法和效果比较以及YOLO的进化史,这期我们来讲解YOLO最原始V1 ...

    3. [目标检测]YOLO原理

      1 YOLO 创新点: 端到端训练及推断 + 改革区域建议框式目标检测框架 + 实时目标检测 1.1 创新点 (1) 改革了区域建议框式检测框架: RCNN系列均需要生成建议框,在建议框上进行分类与回 ...

    4. 目标检测(五)YOLOv1—You Only Look Once:Unified,Real-Time Object Detection

      之前的目标检测算法大都采用proposals+classifier的做法(proposal提供位置信息,分类器提供类别信息),虽然精度很高,但是速度比较慢,也可能无法进行end-to-end训练.而该 ...

    5. 第四节,目标检测---YOLO系列

      1.R-CNN回顾 适应全卷积化CNN结构,提出全卷积化设计 共享ResNet的所有卷积层 引入变换敏感性(Translation variance) 位置敏感分值图(Position-sensiti ...

    6. 目标检测-yolo

      论文下载:http://arxiv.org/abs/1506.02640 代码下载:https://github.com/pjreddie/darknet 1.创新点 端到端训练及推断 + 改革区域建 ...

    7. 目标检测YOLO算法-学习笔记

      算法发展及对比: 17年底,mask-R CNN YOLO YOLO最大的优势就是快 原论文中流程,可以检测出20类物体. 红色网格-张量,在这样一个1×30的张量中保存的数据 横纵坐标中心点缩放到0 ...

    8. 【目标检测】YOLO:

      PPT 可以说是讲得相当之清楚了... deepsystems.io 中文翻译: https://zhuanlan.zhihu.com/p/24916786 图解YOLO YOLO核心思想:从R-CN ...

    9. 第三十五节,目标检测之YOLO算法详解

      Redmon, J., Divvala, S., Girshick, R., Farhadi, A.: You only look once: Unified, real-time object de ...

    随机推荐

    1. 聊聊面试中的 Java 线程池

      ​背景 关于 Java 的线程池我想大家肯定不会陌生,在工作中或者自己平时的学习中多多少少都会用到,那你真的有了解过底层的实现原理吗?还是说只停留在用的阶段呢?而且关于 Java 线程池也是在面试中的 ...

    2. [git] 基础命令笔记

      --内容整理自廖雪峰的GIT教程-- git status 查看当前工作区状态,显示未跟踪的文件以及未上传的修改记录 git init 使当前文件夹变成Git可以管理的仓库 git add xxx 将 ...

    3. MyBatis-Plus 使用说明介绍

      先看一下和MyBatis 不同点说明: @GetMapping("/select_sql") public Object getUserBySql() { User user=ne ...

    4. Java之JDBC 通过加载properties配置文件连接数据库

      通常情况下,我们通过JDBC连接数据库的时候,不会将数据库相关配置写死,因为到时候数据库一有改动,就要重新打包部署到服务器或者替换相关的.class文件,这样非常不灵活.因此,咱们一般会通过读取配置文 ...

    5. 7kyu (难度系数kyu阶段数值越大难度越低) 数组分组及求和

      几个人排成一排,分成两队.第一个人进入一队,第二个人进入第二队,第三个人进入第一队,以此类推. 给定一个正整数的数组(人的权重),返回两个整数的新数组/元组,其中第一个是第1组的总重量,第二个是第2组 ...

    6. 简易数据分析 08 | Web Scraper 翻页——点击「更多按钮」翻页

      这是简易数据分析系列的第 8 篇文章. 我们在Web Scraper 翻页--控制链接批量抓取数据一文中,介绍了控制网页链接批量抓取数据的办法. 但是你在预览一些网站时,会发现随着网页的下拉,你需要点 ...

    7. 如何在MySQL中输入中文

      解决MySQL中的Incorrect string value MySQL中输入中文:在MySQL建标的时候,直接往表中的varchar(255)中输入中文的话是会报错的,大概是因为数据库的默认编码是 ...

    8. Activiti6系列(1)- 核心数据库表及字段注释说明

      前言 本文是根据<疯狂工作流讲义-Activiti6.0>一书中提取过来的,有兴趣的可以去当当网买这本书,讲的很不错,最后还有实战案例. 虽然是提取过来的,但完全靠手打梳理,觉得有用的小伙 ...

    9. Spring 常犯的十大错误,答应我 打死都不要犯好吗?

      1. 错误一:太过关注底层 我们正在解决这个常见错误,是因为 “非我所创” 综合症在软件开发领域很是常见.症状包括经常重写一些常见的代码,很多开发人员都有这种症状. 虽然理解特定库的内部结构及其实现, ...

    10. 进程间通信与ipcs使用7例

      进程间通信(IPC, inter-process communication)实现进程间消息的传递,对于用户地址空间相互独立的两个进程而言,实现通信可以通过以下方式: 由内核层面分配内存,两进程共享该 ...