全文共3866字,预计学习时长20分钟或更长
本文将详细分析如何使用YOLO(You Only Look Once)进行对象检测。要想完全理解这一技术,首先应该知道对象分类、检测和分割之间的区别。
对象分类是什么?
它是系统试图预测图像内容属性的过程,就相当于一个预测图像标签的分类器。
简单来说,如果有一个预测猫和狗的分类系统,该系统(或者说是分类器)将预测输入其中的任何测试图像并进行分类。此时,图像分类的标签为狗和猫两种。
注意:任何分类器只能预测它所训练的类别标签。所以,在上述情况中,即使输入的图像是大象,分类器也只会输出狗或猫。要识别大象,整个系统必须从头开始对大象数据集进行训练(或从预训练的模型中加载)。
对象分类的方法
上图显示了一种使用像素表示抽象特征的通用方法。底层是原始像素,往上是像素组合在一起形成低级特征,低级特征又组合在一起形成高级特征。
我们可以应用任何现有的机器学习、深度学习技术来解决分类问题。包括:
· 图像特征的二分类
· 基于图像特征的支持向量机
· 基于图像特征的人工神经网络
· 基于图像特征的卷积神经网络
其中,CNN(卷积神经网络)是最佳的图像分类架构之一。所有最新模型都在某种程度上结合了CNN,这也证明了它的强大功能。
对象检测
对象检测是与计算机视觉和图像处理相关的计算机技术,它能检测数字图像和视频中的某一类语义对象(如人、建筑物或汽车)。研究较多的对象检测领域包括人脸检测和行人检测。对象检测可应用于计算机视觉的许多领域,包括图像检索和视频监控。
在更传统的意义上,它指检测场景中每个对象,同时对它们的标签进行分类,并找到该对象的边界框(或多边形)。
最后一部分包括以下最新技术:
· YOLO
· RetinaNet
· RCNN
· Fast-RCNN
· Faster-RCNN
· Mask RCNN
YOLO
You Only Look Once是最先进的实时对象检测系统。它最初开发于2015年左右,当时比其他技术都略胜一筹。
YOLO有基于CNN和锚框的简洁架构,并且是一种针对普遍使用问题的实时对象检测技术。随着时代进步,YOLO也不断迭代,变得更快更好,历来版本包括:
· YOLO V1
· YOLO V2
· YOLO V3
YOLO V2的精确性和速度都比V1更好。
YOLO V3的速度虽未升级,但比V2更精确。
参考文献
1. https://arxiv.org/abs/1506.02640
2. YOLO V3:https://pjreddie.com/media/files/papers/YOLOv3.pdf
YOLO是如何运作的?
YOLO将图像分成13×13个单元格:每个单元格负责预测5个边界框。边界框描述包围对象的矩形。YOLO还输出一个置信度,告诉我们预测的边界框实际包含某个对象的程度。
先前的检测系统使用分类器或定位器进行检测,将模型应用于图像的多个位置和尺度,图像的高得分区域作为检测目标。
YOLO则采取了完全不同的方法。它将单个神经网络应用于整个图像,该网络将图像分成区域,预测每个区域的边界框和概率,并依据概率大小对所有边框分配权重。
YOLO V3精确度更高。下图描绘了YOLO V3的整体架构:
如何获取YOLO
YOLO二进制文件(和来源)可从以下来源中下载:
· https://pjreddie.com/darknet/yolo/
· GitHub:https://github.com/pjreddie/darknet
YOLO基于darknet,内置于C中。Darknet 是用C语言和CUDA编写的开源神经网络框架。
如何使用YOLO
I. 获取存储库
git clone https://github.com/pjreddie/darknet
II. 编译来源
可用make直接编译来源。只需转到所获取的darknet目录,并运行以下命令:
https://github.com/pjreddie/darknet
注意: Make使用Makefile,它由编译C源文件的指令组成。
完成make过程后,将得到一个名为darknet的文件,这是一个二进制的可执行文件,可用它来运行YOLO。
III. 获取darknet执行权限
执行命令 ./darknet时,如果你获取权限错误,这意味着用户没有运行二进制文件的可执行权限。只需输入以下命令:
chmod u+x darknet
然后,darknet便可执行。
YOLO结构
I. 配置文件
YOLO完全是即插即用,即可以配置YOLO检测任何类型的对象。事实上,也可以自行修改CNN架构并使用。YOLO通过使用cfg/下的配置文件来实现这一点。
配置文件以.cfg结尾。
配置文件主要包括:
· CNN架构(层次和激活)
· 锚框
· 类别数量
· 学习速率
· 优化技术
· 输入大小
· 概率分数阈值
· 批量大小
基于不同版本,可以有多种配置,例如V1至V3,或者完整的训练到微小的层次。可从下面两个网站中下载不同配置:
· YOLOV3 (full): https://github.com/pjreddie/darknet/blob/master/cfg/yolov3.cfg
· Tiny YOLO V3: https://github.com/pjreddie/darknet/blob/master/cfg/yolov3-tiny.cfg
II. 权重
每个配置都有相应的预训练权重。这里只引用了YOLO V3。
· 完整权重
YOLO V3完整权重下载:
https://pjreddie.com/media/files/yolov3.weights。
共包含9000多个类别。
· 小权重
80个YOLO V3已训练类别的权重 :
https://pjreddie.com/media/files/yolov3-tiny.weights。
测试YOLO
如上所述,所有操作都用darknet的可执行文件运行。假设有一个名为test.jpeg的图像,可以尝试预测对象如下:
./darknet detect yolov3-tiny.cfg yolov3-tiny.weights test.jpeg
通常,.cfg 在 cfg/ 目录下。假设 weights/目录下有 yolov3-tiny,则命令为:
./darknet detect cfg/yolov3-tiny.cfg weights/yolov3-tiny.weights test.jpeg
一旦执行,darknet文件的同一个目录下将会有一个命名为predictions.jpeg的图像。可以查看预测类型以及相应的边界框。
训练
训练稍微复杂一些,因为必须保证事物和配置正确。下面的命令即可做到:
./darknet detector train custom/cfg/obj.data custom/cfg/tiny-yolo.cfg custom/tiny-yolo_100.weights
训练命令分解
这里.cfg和.weights指前面提到的配置和权重文件。首先要使用obj.data文件,内容如下:
classes= 1 train = custom/cfg/train.txt valid = custom/cfg/test.txt names = obj.names backup = backup/
obj.names
该文件包含一系列类别名。例如:
cat dog background bike
train.txt
该文件包含一系列将输入网络中的训练图像。文件名很类似:
custom/train-images/11.jpg custom/train-images/12.jpg custom/train-images/13.jpg ... ...
这里 train-images/包含所有训练图像。除了图像,该目录还包含与图像对应的边界框文本文件。
于是就得到了 custom/train-images/11.txt,内容为:
0 0.32502480158730157 0.3950066137566138 0.12896825396825398 0.09523809523809523
第一个数字代表obj.names中对应的id或类别,其余的数字代表边界框。如果有多个类别的多个框,那么应该是:
0 0.32502480158730157 0.3950066137566138 0.12896825396825398 0.09523809523809523 0 0.52502480158730157 0.3950066137566138 0.12896825396825398 0.09523809523809523 1 0.32502480158730157 0.3950066137566138 0.12896825396825398 0.09523809523809523
test.txt
该文件包含一些了测试图像。
注意:在.cfg中,必须将类别的数量更改为obj.names中找到的类别总数。
以上便是使用YOLO的方法。上述演示操作基于Linux系统,Windows系统的步骤也与之类似。
留言 点赞 关注
我们一起分享AI学习与发展的干货
欢迎关注全平台AI垂类自媒体 “读芯术”
本文暂时没有评论,来添加一个吧(●'◡'●)