yolo代码实现java yolo代码实现

yolo算法是什么?【yolo代码实现java yolo代码实现】Yolo是一种目标检测算法 。
目标检测的任务是从图片中找出物体并给出其类别和位置,对于单张图片,输出为图片中包含的N个物体的每个物体的中心位置(x,y)、宽(w)、高(h)以及其类别 。
Yolo的预测基于整个图片 , 一次性输出所有检测到的目标信号 , 包括其类别和位置 。Yolo首先将图片分割为sxs个相同大小的grid 。
介绍
Yolo只要求grid中识别的物体的中心必须在这个grid内(具体来说,若某个目标的中心点位于一个grid内,该grid输出该目标类别的概率为1,所有其他grid对该目标预测概率设置为0) 。
实现方法:让sxs个框每个都预测出B个boungding box , bounding box有5个量 , 分别为物体的x,y,h,w和预测的置信度;每个grid预测B个bounding box和物体类别 , 类别使用one-hot表示 。
YOLO 检测多张图片并保存标签信息YOLO 是一个基于深度学习的end-to-end、real-time目标检测方法,至今已经有YOLOv1、YOLOv2、YOLO9000、YOLOv3 4个版本 。YOLO网络由作者用C和CUDA语言写的一个卷积神经网络框架 darknet 实现,目前github也有tensorflow,pytorch等开源框架的复现 , 本文主要基于darknet源码修改实现对一个目录下的图片进行检测并保存检测结果图片和标签信息 。
源码修改版本已上传至github:
YOLO测试图片有两种方式
其中不指定输出路径的命令在darknet/目录下生成predictions.jpg;指定输出路径的时候只需要输入前缀,结果规定了.jpg后缀 。
事实上,单张图片的测试也可以用如下通用方式:
如果上述通用命令不指定输出路径,就能实现多张图片测试,作者写的多张图片测试是在加载一次模型后,再一次一次的输入图片路径测试 , 这样的方式似乎不太实用 , 一般情况下我们想在一个文件夹下对所有图片进行检测,保存其标签信息,这就需要通过修改源码来实现 。需要修改到的文件主要有:include/darknet.h src/image.c examples/detector.c examples/darknet.c
整个检测的入口为:examples/darknet.c 其main函数用于判断参数 , 从而选择对应函数 。对于detect参数,将直接跳转到detector.c中的test_detector函数 。test_detector函数定义如下:
在darknet.c中ln437处,这里char *filename = (argc4) ? argv[4]: 0;说明当参数大于4个时,默认第5个参数为测试图片路径filename,显然这样我们就无法检测文件夹下的图片了,因此为filename加一个输入标识 -input,这样我们后面就可以添加输入路径idir和输出路径odir参数了(这里输出路径定义为存放images和labels路径) 。
detector.c主要修改test_detector函数,其中draw_detections_person函数由draw_detections函数修改而来,draw_detections函数定义在src/image.c中,用于对每张图片进行画框处理 。在这里我只需要行人信息 , 因此对于draw_detections_person函数 , 需要用到图片路径信息,输出文件夹路径 。对于单张图片,图片路径信息就是前面的filename,对于多张图片,图片路径信息为输入文件夹加上在该文件夹内遍历的得到的图片名,所以修改后的test_detector函数需要添加idir,odir两个参数 。
image.c主要修改draw_detections_person函数,用于对图片进行画框处理,并保存标签信息 。
添加draw_detections_person函数定义:
对于单张图片,可以用如下命令:
对于文件夹内多张图片,可以用如下命令:
当然 , 在results目录下要提前建好images和labels文件夹 。
高大上的YOLOV3对象检测算法,使用python也可轻松实现 继续我们的目标检测算法的分享,前期我们介绍了SSD目标检测算法的python实现以及Faster-RCNN目标检测算法的python实现以及yolo目标检测算法的darknet的window环境安装,本期我们简单介绍一下如何使用python来进行YOLOV3的对象检测算法
YOLOV3的基础知识大家可以参考往期文章,本期重点介绍如何使用python来实现
1、初始化模型
14-16 行:
模型的初始化依然使用cv下的DNN模型来加载模型,需要注意的是CV的版本需要大于3.4.2
5-8行:
初始化模型在coco上的label以便后期图片识别使用
10-12行:
初始化图片显示方框的颜色
2、加载图片,进行图片识别
输入识别的图片进行图片识别,这部分代码跟往期的SSD 以及RCNN目标检测算法类似
19-20行:输入图片,获取图片的长度与宽度
25-29行:计算图片的blob值,输入神经网络 , 进行前向反馈预测图片
只不过net.forward里面是ln, 神经网络的所有out层
3、遍历所有的out层,获取检测图片的label与置信度
遍历out层,获取检测到的label值以及置信度,检测到这里YOLOV3以及把所有的检测计算完成,但是由于yolov3对重叠图片或者靠的比较近的图片检测存在一定的问题,使用YOLOV3使用非最大值抑制来抑制弱的重叠边界
竟然把墨镜识别了手机,体现了YOLOV3在重叠图片识别的缺点
4、应用非最大值抑制来抑制弱的重叠边界,显示图片
56: 使用 非最大值抑制来抑制弱的重叠边界
58-59行:遍历所有图片
61-62行:提取检测图片的BOX
64-68行:显示图片信息
70-71行:显示图片
利用python来实现YOLOV3,与SSD 以及RCNN代码有很多类似的地方 , 大家可以参考往期的文章进行对比学习,把代码执行一遍
进行视频识别的思路:从视频中提取图片,进行图片识别,识别完成后 , 再把识别的结果实时体现在视频中,这部分代码结合前期的视频识别,大家可以参考多进程视频实时识别篇,因为没有多进程,检测速度很慢,视频看着比较卡
1、初始化模型以及视频流
2、从视频中提取图片,进行图片的blob值计算,进行神经网络的预测
3、提取检测到图片的置信度以及ID值
4、 应用非最大值抑制来抑制弱的重叠边界,显示图片
5、关闭资源,显示图片处理信息
每个目标检测算法都有自己的优缺点 , 个人感觉,在精度要求不是太高的情况下SSD检测算法可以实现较快的速度实现,毕竟精度差不多的情况下,我们希望速度越快越好
浅谈Yolo学号:20021210654
姓名:潘文欣
原文链接:
【嵌牛导读】
当我们谈起计算机视觉时,首先想到的就是图像分类,没错 , 图像分类是计算机视觉最基本的任务之一,但是在图像分类的基础上,还有更复杂和有意思的任务,如目标检测,物体定位 , 图像分割等 。其中目标检测是一件比较实际的且具有挑战性的计算机视觉任务,其可以看成图像分类与定位的结合,给定一张图片 , 目标检测系统要能够识别出图片的目标并给出其位置,由于图片中目标数是不定的 , 且要给出目标的精确位置,目标检测相比分类任务更复杂 。
近几年来,目标检测算法取得了很大的突破 。比较流行的算法可以分为两类 , 一类是基于Region Proposal的R-CNN系算法(R-CNN,Fast R-CNN, Faster R-CNN),它们是two-stage的,需要先使用启发式方法(selective search)或者CNN网络(RPN)产生Region Proposal,然后再在Region Proposal上做分类与回归 。而另一类是Yolo , SSD这类one-stage算法,其仅仅使用一个CNN网络直接预测不同目标的类别与位置 。第一类方法是准确度高一些 , 但是速度慢,但是第二类算法是速度快 , 但是准确性要低一些 。
【嵌牛鼻子】 计算机视觉 目标检测 YOLO算法
【嵌牛正文】
目标检测算法有很多,本文介绍的是Yolo算法,其全称是You Only Look Once: Unified, Real-Time Object Detection , 其中,You Only Look Once说的是只需要一次CNN运算,Unified指的是这是一个统一的框架,提供end-to-end的预测,而Real-Time体现是Yolo算法速度快 。
如下图是YOLO的检测系统,整体来看 , 首先将输入图片resize到448x448,然后送入CNN网络,最后处理网络预测结果得到检测的目标 。相比R-CNN算法,其是一个统一的框架,其速度更快,而且Yolo的训练过程也是end-to-end的 。
具体来说,Yolo的CNN网络将输入的图片分割成SS网格,,然后每个单元格负责去检测那些中心点落在该格子内的目标,如下图,可以看到狗这个目标的中心落在左下角一个单元格内 , 那么该单元格负责预测这个狗 。每个单元格会预测B个边界框(bounding box)以及边界框的置信度(confidence score) 。所谓置信度其实包含两个方面 , 一是这个边界框含有目标的可能性大小,二是这个边界框的准确度 。前者记为Pr(object),当该边界框是背景时(即不包含目标) , 此时Pr(object)=0 。而当该边界框包含目标时,Pr(object)=1 。边界框的准确度可以用预测框与实际框(ground truth)的IOU(intersection over union , 交并比)来表征,记为。因此置信度可以定义为Pr(object)?。很多人可能将Yolo的置信度看成边界框是否含有目标的概率,但是其实它是两个因子的乘积,预测框的准确度也反映在里面 。边界框的大小与位置可以用4个值来表征:(x,y,w,h),其中(x,y)是边界框的中心坐标,而w和h是边界框的宽与高 。还有一点要注意,中心坐标的预测值(x,y)是相对于每个单元格左上角坐标点的偏移值,并且单位是相对于单元格大小的 , 单元格的坐标定义如图6所示 。而边界框的w和h预测值是相对于整个图片的宽与高的比例,这样理论上4个元素的大小应该在[0,1]范围 。这样,每个边界框的预测值实际上包含5个元素:(x,y,w,h,c),其中前4个表征边界框的大小与位置,而最后一个值是置信度 。
还有分类问题,对于每一个单元格其还要给出预测出C个类别概率值,其表征的是由该单元格负责预测的边界框其目标属于各个类别的概率 。但是这些概率值其实是在各个边界框置信度下的条件概率,即。值得注意的是 , 不管一个单元格预测多少个边界框,其只预测一组类别概率值,这是Yolo算法的一个缺点,在后来的改进版本中,Yolo9000是把类别概率预测值与边界框是绑定在一起的 。同时,我们可以计算出各个边界框类别置信度(class-specific confidence scores):。边界框类别置信度表征的是该边界框中目标属于各个类别的可能性大小以及边界框匹配目标的好坏 。后面会说,一般会根据类别置信度来过滤网络的预测框 。
总结一下,每个单元格需要预测(B?5 C)个值 。如果将输入图片划分为S×S网格,那么最终预测值为S×S×(B?5 C)大小的张量 。整个模型的预测值结构如下图所示 。对于PASCAL VOC数据 , 其共有20个类别,如果使用S=7,B=2 , 那么最终的预测结果就是7×7×30大小的张量 。在下面的网络结构中我们会详细讲述每个单元格的预测值的分布位置 。
Yolo采用卷积网络来提取特征,然后使用全连接层来得到预测值 。网络结构参考GooLeNet模型 , 包含24个卷积层和2个全连接层,如下图所示 。对于卷积层,主要使用1x1卷积来做channle reduction,然后紧跟3x3卷积 。对于卷积层和全连接层,采用Leaky ReLU激活函数 。但是最后一层却采用线性激活函数 。
可以看到网络的最后输出为7×7×30大小的张量 。这和前面的讨论是一致的 。对于每一个单元格,前20个元素是类别概率值 , 然后2个元素是边界框置信度,两者相乘可以得到类别置信度,最后8个元素是边界框的(x,y,w,h) 。
在训练之前,先在ImageNet上进行了预训练,其预训练的分类模型采用图8中前20个卷积层 , 然后添加一个average-pool层和全连接层 。预训练之后,在预训练得到的20层卷积层之上加上随机初始化的4个卷积层和2个全连接层 。由于检测任务一般需要更高清的图片 , 所以将网络的输入从224x224增加到了448x448 。整个网络的流程如下图所示:
下面是训练损失函数的分析,Yolo算法将目标检测看成回归问题,所以采用的是均方差损失函数 。但是对不同的部分采用了不同的权重值 。首先区分定位误差和分类误差 。对于定位误差,即边界框坐标预测误差,采用较大的权重。然后其区分不包含目标的边界框与含有目标的边界框的置信度 , 对于前者,采用较小的权重值。其它权重值均设为1 。然后采用均方误差 , 其同等对待大小不同的边界框,但是实际上较小的边界框的坐标误差应该要比较大的边界框要更敏感 。为了保证这一点,将网络的边界框的宽与高预测改为对其平方根的预测 , 即预测值变为。
另外一点时,由于每个单元格预测多个边界框 。但是其对应类别只有一个 。那么在训练时,如果该单元格内确实存在目标 , 那么只选择与ground truth的IOU最大的那个边界框来负责预测该目标,而其它边界框认为不存在目标 。这样设置的一个结果将会使一个单元格对应的边界框更加专业化,其可以分别适用不同大小 , 不同高宽比的目标,从而提升模型性能 。大家可能会想如果一个单元格内存在多个目标怎么办,其实这时候Yolo算法就只能选择其中一个来训练,这也是Yolo算法的缺点之一 。要注意的一点时 , 对于不存在对应目标的边界框,其误差项就是只有置信度,左标项误差是没法计算的 。而只有当一个单元格内确实存在目标时,才计算分类误差项,否则该项也是无法计算的 。
综上讨论 , 最终的损失函数计算如下:
其中第一项是边界框中心坐标的误差项,指的是第ii个单元格存在目标,且该单元格中的第j个边界框负责预测该目标 。第二项是边界框的高与宽的误差项 。第三项是包含目标的边界框的置信度误差项 。第四项是不包含目标的边界框的置信度误差项 。而最后一项是包含目标的单元格的分类误差项,指的是第i个单元格存在目标 。
NMS算法(非极大值抑制算法):选择得分(Confidence Score)最高的作为输出,与该输出重叠的去掉,不断重复这一过程直到所有备选处理完 。
YOLO的NMS算法中,Confidence Score的值如下:,。代表着某个对象存在于第j个边界框的可能性 。每个网格有:20个对象的概率*2个边界框的置信度,共40个得分 。49个网格共1960个得分 。对每种对象分别进行NMS,那么每种对象有1960/20=98个得分 。
YOLO算法的NMS步骤如下:
1)设置一个Score的阈值 , 低于该阈值的候选对象排除掉(将该Score设为0)
2)遍历每一个对象类别
?2.1)遍历该对象的98个得分
??2.1.1)找到Score最大的那个对象及其边界框 , 添加到输出列表
??2.1.2)对每个Score不为0的候选对象,计算其与上面2.1.1输出对象的边界框的IOU
??2.1.3)根据预先设置的IOU阈值,所有高于该阈值(重叠度较高)的候选对象排除掉(将Score设为0)
??2.1.4)如果所有边界框要么在输出列表中,要么Score=0,则该对象类别的NMS完成,返回步骤2处理下一种对象
3)输出列表即为预测的对象
这篇长文详细介绍了Yolo算法的原理及实现,当然Yolo-v1还是有很多问题的,所以后续可以读读Yolo9000算法 , 看看其如何改进的 。
关于yolo代码实现java和yolo代码实现的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息 , 记得收藏关注本站 。

    推荐阅读