Yolo9000算法分析

2024-01-11 01:58
文章标签 算法 分析 yolo9000

本文主要是介绍Yolo9000算法分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Yolo9000算法概述

  现实世界通用的目标检测与识别性能要够快够准、能够多类别的检测识别。目前主流的目标检测算法(RCNN系列)受限于少部分的目标检测识别,而且当下的目标检测数据集类别数较少,相比于图像分类数据集(ImageNet)相差较大。Yolov2(Yolo9000)针对Yolo目标检测算法进一步改进,作者提出联合训练策略:将检测和分类数据集联合来训练目标检测模型。具体方法:利用目标检测数据集来学习目标的定位,利用分类数据集来提升检测器鲁棒性和增加检测目标的类别数。

Yolo9000改进要点

图1 Yolo到Yolo9000优化

—————————————— 更好 ——————————————
  当下计算机视觉领域中,更好的性能通常取决于 训练更深的网络(more deeper)或者将 多个模型组合在一起(combined model)。但是,Yolov2并没有增加网络深度,相反简化了网络使其更容易学习 (这或许是作者想要保证Yolo算法的实时性和检测精度的折衷)。早期作者提出的Yolo第一版本相比于区域提取(Region Proposal)方法的算法框架(R-CNN/Fast-RCNN)主要缺点是边界框(bounding boxes)定位精度不准和召回率低。因此,Yolov2版本在保持分类准确率的情况下要提高bounding boxes的定位精度和召回率。采取如下的改进措施:
Batch Normalization(批归一化)

  自从2015年GoogleNet提出Batch Normalization技巧之后,使用Batch Normalization几乎变成卷积神经网络的标准削弱”梯度弥散”问题,加快模型收敛速度的同时也去除其它形式的正则化需求更有助于模型正则化。Yolov2从模型中去掉了dropout步骤也没有产生过拟合。运用Batch Normalization策略性能提升2%mAP。

High Resolution Classifier(高分辨分类)

  当下所有的主流目标检测方法都使用ImageNet上进行预训练分类器。Yolo是以224*224分辨率训练分类器网络,随后将分辨率提高到448进行检测。这种方式意味着网络必须能够同时在学习目标检测和调整新的输入分辨率之间切换。Yolov2对分类网络通过10个迭代周期微调以此来给网络更多的时间进行调整滤波器,以此来更好的处理高分辨的输入。实验表明运用High Resolution Classifier性能提升4%mAP。

Convolutional with Anchor Boxes(使用默认框卷积)

  Yolov2:首先从Yolo模型中移除全连接层,使用Anchor boxes来预测边界框。去掉了一个池化层,目的使得卷积网络输出更高的分辨率特征。网格输入大小从448*448缩减为416*416,目的在于后面特征映射中奇数个位置(中心点确定)。Yolov2目标预测仍然预测实际值与提出的边界框的IoU,同时预测当下存在目标时该类别的条件概率。运用默认框方式,预测精度有一定的下降。(模型获得69.5%mAP(without anchor boxes) -> 69.2%mAP(with anchor boxes))但是,召回率Recall从81%上升至88%,这意味着Yolo模型有更大的提升空间。

Dimension Clusters(维度聚类)

  当然,Yolo模型结合Anchor boxes进行检测时,会存在两个问题。一是Anchor boxes的尺寸是手工挑选的。二是模型不稳定。Yolov2不采取手工选择先验,而是在训练集边界框上采取k-means聚类的方式自动求取好的先验。以此来使整个网络更容易学习以便更好的进行预测。Yolov2目的是求取好的IoU分数的先验,这独立于边界框的大小。因此,对于距离度量采用的方式:

d(box, centroid) = 1 - IoU(box, centroid)

  之所以采用这样的方式,因为如果采用欧几里得距离标准那么较大的边界框将会比较小的边界框产生更多的误差。作者通过实验选取k-means中阈值k=5作为模型复杂度和召回率之间的折衷。
图2 K-means聚类阈值选取
图3 边界框bounding boxes平均IoU对比

  图2、3对比表明,使用9个先验中心聚类的结果比手工选择的先验结果更好,表明采用k-means来生成边界框会以更好的表示开始训练模型,使得任务更容易学习。
  
Direct Location Prediction(直接定位预测)

  Yolo模型使用Anchor boxes在早期的迭代过程中,不稳定来自于边界框(x, y)位置。在Region Proposal Network中,网络预测值 tx t x ty t y ,(x, y)中心坐标计算如下:

x=(txwa)xa x = ( t x ∗ w a ) − x a
y=(tyha)ya y = ( t y ∗ h a ) − y a

  这种方式不管在图像哪个位置预测边界框,Anchor boxes都可以在任意点结束。导致随机初始化模型需要很长的时间才能够预测合理的偏移量。Yolov2并没有预测偏移量,而是遵从Yolo思想预测相对于网格单元位置的位置坐标。网络预测输出特征映射中每个单元的5个边界框,每个边界框坐标为: tx t x ty t y tw t w th t h to t o 。如果单元从图像左上角偏移了( cx c x , cy c y )并且边界框先验宽度和高度为 pw p w ph p h ,那么预测对应:
bx=δ(tx)+cx b x = δ ( t x ) + c x
by=δ(ty)+cy b y = δ ( t y ) + c y
bw=pwe(tw) b w = p w e ( t w )
bh=phe(th) b h = p h e ( t h )
Pr(object)IOU(b,object)=σ(to) P r ( o b j e c t ) ∗ I O U ( b , o b j e c t ) = σ ( t o )

图4 具有维度先验和位置预测的边界框

  Yolov2预测边界框的宽度和高度作为聚类中心的偏移量,使用sigmod激活函数预测边界框相对于滤波器应用位置的中心坐标。由于模型限制位置预测参数化更容易学习,网络更加稳定。采用维度聚类和直接预测边界框的中心位置方式比使用Anchor boxes方式提高5%mAP。

Fine-Grained Features(细粒度特性)

  Yolov2在13*13特征映射上预测检测的结果。虽然这对于大型目标检测来说已经足够,但它可以用来定位较小目标中更细粒度中受益。Faster-RCNN和SSD都在网络的各种特征映射上运行所提出的网络,以获得一系列的分辨率。Yolov2仅仅添加一个直通层,从26*26分辨率的更早层提取特征。
  直通层(passthrough layer)通过将相邻特征堆叠到不同的通道而不是空间位置来链接高分辨率特征和低分辨率特征,类似于ResNet中的恒等映射。这将26*26*512特征映射变成13*13*2048特征映射,其可以与原始特征链接。Yolov2检测器运行在这个扩展的特征映射顶部,便于它可以访问细粒度的特征,这样使性能提升1%mAP。

Multi-Scale Training(多尺度方式训练)

  原始Yolo采取输入图像分辨率448*448,通过添加Anchor boxes我们将其改为416*416。为了使Yolov2模型在不同图像大小上进行检测,结构只是用卷积层和池化层,能够实时的调整输入大小。相比较于修改输入图像大小方式,Yolov2通过每隔几次迭代周期就改变网络来进行模型的训练。这种方式迫使网络学习如何在各种输入维度上做好预测,即相同的网络可以预测不同分辨率下的检测结果。在更小的尺寸网络运行速度更快,Yolov2在速度和精度上进行简单的折衷。Yolov2在低分辨率有相当的准确率。(在228*228大小,运行速度超过90FPS,mAP与Fast-RCNN差不多)能够应用于高帧率视频。当然,Yolov2在VOC2007性能达到78.6%同时速度仍然保持实时。

图5 Pascal Voc2007检测框架对比
图6 VOC2007数据集上目标检测算法速度与准确度对比

—————————————— 更快 ——————————————
  为了使目标检测在速度与精度上面得到最佳的匹配折衷,作者从头设计Yolov2模型。大多数目标检测框架依赖于VGG-16作为基本的特征提取,这主要因为VGG-16特征提取准确,但是复杂(耗时较大)。Yolo框架使用GoogleNet架构的自定义网络,速度比VGG-16更快,准确度略低于VGG-16。

Darknet-19
  文章作者设计一个新的分类模型Darknet-19,类似于VGG模型,Darknet-19大多使用3*3滤波器,并且在每次池化步骤后double倍通道数。受启发于Network in Network论文思想,Darknet-19使用全局平均池化做预测以及1*1滤波器来压缩3*3卷积之间的特征表示。Darknet-19同样使用Batch Normalization在稳定训练,加速模型收敛速度,同时正则化模型。

图7 Darknet-19模型架构

Training for detection(检测训练)
  
  对Darknet-19网络进行修改进行检测目标:删除最后一个卷积层,增加3个1024滤波器的3*3卷积层,最后1*1卷积层输出。对于VOC,预测5个边界框,每个边界框有5个坐标和20个类别,所以有125个滤波器。为了使模型可以使用细粒度特征,作者还添加了从最后的3*3*512层到倒数第二层的直通层 (passthrough思想类似于ResNet,将高低分辨率特征图结合改进性能)

—————————————— 更强 ——————————————
  文章作者提出了一个联合训练分类和检测数据的机制,通过使用标记为检测的图像来学习边界框的坐标预测和目标之类的特定信息以及如何对常见的目标进行分类。训练模型期间,将检测和分类数据集混合。当网络看到标记为检测图像时,我们能够基于完整的Yolov2损失函数进行反向传播。当它看到一个分类图像时,只能够从该架构的分类特定部分反向传播损失。但是,这种方法的困难在于: 检测数据集只有通用的目标和标签,分类数据集具有更广更深的标签范围。如何在这两个数据集上使用一种连贯的方式来合并这些标签?

Hierarchical Classification

  文章作者借鉴ImageNet中的WordNet组合数据集思想来构建分层树以此提出WordTree来简化组合假定不互斥的数据集与数据来源包含之间关系。WordTree一个视觉概念的分层模型,为了使用WordTree进行分类,我们预测每个节点的条件概率,以此得到同义词集合中每个同义词的下义词概率。例如:当样本标签在叶子节点时候,父节点也激活成为正样本。如果样本标签为非叶子节点时候,值将会对非叶子节点和父节点进行反向传播。

图8 WordTree数据存储结构图

Joint Classification and Detection(联合分类与检测)

  Yolo9000在ImageNet上能够很好的学习新的动物种类,但是在服装和设备这样的类别学习中较为困难。新的动物更容易学习,主要由于目标预测可以从COCO数据中动物泛化。同时,COCO没有关于服装和设备的边界框标签数据导致模型在学习此类时候泛化能力较弱。联合训练数据集实现Yolo9000网络能够检测识别出一些样本中没有的目标特性。

Yolo9000算法总结及其优缺点

  Yolo9000目标检测算法改进如下:
  
  使用Anchor boxes取代原始网格化的方法,使用K-Means聚类来选择Anchor boxes的大小,而不是手动选择采集。

  将低维特征和高维特征数据融合(直通层),低维特征是高维特征的下采样后重塑相同大小的尺寸。
  
  多尺度训练;类似于随机裁剪等数据增强,可以使网络在不同的尺度下保持稳健,与随机裁剪相比,多尺度方式更容易扩大较小尺寸的物体。
  
  新颖性:
  
  将检测和分类任务进行协同训练,使用分层树表示类别进行类别标记。结果令人印象深刻,该网络可以在检测任务中检测超过9000个类别。

  引入自动Anchor boxes尺寸大小,特征融合,多尺度训练等新技术,提高检测性能。

  对比当前Faster-RCNN/SSD等,在VOC2012结果更好,速度更快,泛化性能更强。
  
  不足:
  
  COCO数据集上评估结果并不是很理想。如果使用来自不同图层的更多特征图,检测性能将会进一步改进。仅仅使用最后一层可能会影响检测较小物体。文中提到通过”下采样”低维特征,这种在某种情况下削弱高分辨率优势。解决方法可以通过上采样高维特征与低维特征相结合会更加有效。

Yolo9000代码实验结果

图片目标检测:

视频检测结果:
 
 链接地址:
 http://player.youku.com/player.php/sid/XMzQ2MDk5Nzg4OA==/v.swf

代码下载
环境配置:Windows 10 x64 + Visual Stdio2015 + OpenCV-3.3.1

Darknet版本(C版本VS2015):
  https://github.com/AlexeyAB/darknet (推荐)
下载后只需配置opencv和工程目录下.vcxproj的CUDA路径修改即可运行

TensorFolw-Java版本:
  https://github.com/szaza/tensorflow-java-yolo
参考配置步骤,或者参考我的配置文档(下载如下)

Java-TensorFlow-Yolo配置文档与模型链接(翻不了墙小伙伴这里下载):

百度网盘链接:https://pan.baidu.com/s/1LnIFGdzLD3mPZ9TJIukFNg 密码:cnr9

参考内容:
https://pjreddie.com/darknet/  
https://pjreddie.com/publications/yolo9000/
http://blog.csdn.net/shuzfan/article/details/54018736
http://x-algo.cn/index.php/2017/03/03/1820/
http://noahsnail.com/2017/12/26/2017-12-26-YOLO9000,%20Better,%20Faster,%20Stronger%E8%AE%BA%E6%96%87%E7%BF%BB%E8%AF%91%E2%80%94%E2%80%94%E4%B8%AD%E6%96%87%E7%89%88/
https://github.com/szaza/tensorflow-java-yolo
https://github.com/AlexeyAB/darknet

这篇关于Yolo9000算法分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/592778

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

dp算法练习题【8】

不同二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3输出:5 示例 2: 输入:n = 1输出:1 class Solution {public int numTrees(int n) {int[] dp = new int

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者