YOLO算法学习总结

    之前在吴恩达的课程上接触到了YOLO的原理及简单实现,上一周对YOLO算法进行了学习,现将个人的学习心得及学习结果记录如下。

1.YOLO简介:

    人类视觉系统快速且精准,只需瞄一眼(You Only Look Once)即可识别图像中物品及其位置。作者用了You Only Look Once的首字母YOLO来表示其算法,相当有趣。YOLO为一种新的目标检测方法,该方法的特点是实现快速检测的同时还达到较高的准确率。作者将目标检测任务看作目标区域预测和类别预测的回归问题。该方法采用单个神经网络直接预测物品边界和类别概率,实现端到端(end to end)的物品检测。同时,该方法检测速非常快,基础版可以达到45帧/s的实时检测;FastYOLO可以达到155帧/s。与当前最好系统相比,YOLO目标区域定位误差更大,但是背景预测的准确性优于当前最好的方法。

YOLO的网络结构:模型采用卷积神经网络结构。开始的卷积层提取图像特征,全连接层预测输出概率。模型结构类似于GoogleNet,如图3所示。作者还训练了YOLO的快速版本(fast YOLO)。Fast YOLO模型卷积层和filter更少。最终输出为7×7×30的tensor。

YOLO算法学习总结_第1张图片

2.参考源码及运行环境:

这里用到的YOLO算法的实现代码源于https://github.com/hizhangp/yolo_tensorflow

运行环境:Windows+显卡MX150+python3.6.5+tensorflow1.8

3.项目详解:

最近被安利了一个好用的IDE——Pycharm,先用他看看我们的项目文件结构:

YOLO算法学习总结_第2张图片

  在作者贴出的链接处下载权重文件,两次解压后得到YOLO_small.ckpt的权重文件,放到weights文件夹中,完成准备工作。由于本人笔记本的渣渣配置,用CPU或者MX150进行训练的过程会非常地长,故直接跳过train的过程,直接运行test.py。准备工作和运行过程出现了若干错误,在baidu的帮助下一一解决了。

下面看看运行结果:

首先是作者给出的两张照片:

YOLO算法学习总结_第3张图片

and

YOLO算法学习总结_第4张图片

可以看到,算法能够较准确地检测出真实图片的人物或者动物;突发奇想测试一下动漫人物:

YOLO算法学习总结_第5张图片

可以看到,虽然也能识别,但是效果不如刚才。对作者的代码稍加改动,看看算法对摄像头实时检测的效果:

YOLO算法学习总结_第6张图片

由于显卡性能问题,无法做到实时检测,每秒只有2.5帧。

YOLO算法学习总结_第7张图片

4.代码分析:

  1. config.py 这部分程序主要是用来定义网络中的一些整体结构参数
  2. yolo_net.py 这部分的主要作用是利用 cfg 文件对网络参数进行初始化,计算 Loss,计算两个 bounding box 之间的 IoU,实现了 yolo 网络模型的构成,可以清楚的看到网络的组成,而且为了使程序更加简洁,构建网络使用的是 TensorFlow 中的 slim 模块。
  3. train.py 这部分代码主要实现的是对已经构建好的网络和损失函数利用数据进行训练,在训练过程中,对变量采用了指数平均数(exponential moving average (EMA))来提高整体的训练性能。同时,为了获得比较好的学习性能,对学习速率同向进行了指数衰减,使用了 exponential_decay 函数来实现这个功能。
  4. test.py 这部分的主要内容就是利用训练好的权重进行预测,得到预测输出后利用 OpenCV 的相关函数进行画框等操作。同时,还可以利用 OpenCV 进行视频处理,使程序能够实时地对视频流进行检测。

5.At Last

yolo_v1 虽然已经能够对物体进行实时检测,但是整体上来说,检测的效果并不是特别好,检测的类别也比较少,针对这些问题,作者之后还提出了 yolo_v2,以此来对这些问题进行改进。这周的总结就到这里,下周计划是FCN网络。

你可能感兴趣的:(YOLO算法学习总结)