一、前言
YOLO是一名叫做Joseph Chet Redmon的大神与他的几个小伙伴做的一个开源实时物体检测系统。Joseph的几个小伙伴来自于华盛顿大学以及伯克利大学等知名院校。
YOLO是基于他们开发的Darknet(基于c语言的神经网络开源框架)上的一个应用系统,不同于前置检测系统将一副图像的不同位置以及维度分别进行分类预测,YOLO将整幅图像输入进单一的神经网络进行分类预测。这使得YOLO相对于其它的物体检测网络更加的快速。
其在 VOC 2007(Visual Object Class Challenge 2007)上的 mAP(Mean Average Precision)为78.6%,在 COCO test-dev 上为 48.1%
二、YOLO的前置组件介绍
YOLO是基于Darknet的应用,而Darknet还有几个可选的依赖组件:
OpenCV:如果需要更多的图像类型支持,需引进该组件。我在之前研究人脸识别开源框架OPENFACE时,已经在电脑上安装过OpenCV了。感兴趣的同学可以移步Mac上开源人脸识别软件OPENFACE安装全流程教程查看
CUDA:如果要使用GPU进行计算,需引进该组件。可惜我买不起GPU,所以pass
三、YOLO安装步骤以及错误解决方案
1)Darknet下载与安装
git clone https://github.com/pjreddie/darknet.git
cd darknet
make
2)Darknet 错误与解决
错误1: undeclared identifier 'CLOCK_REAKTIME'
./src/utils.c:16:19:fatal error:use of undeclared identifier 'CLOCK_REALTIME'
clock_gettime(CLOCK_REALTIME, &now);
根据报错日志信息可以指导,在 src/utils.c 中的 CLOCK_REALTIME 这个标识符并没有被定义。通过在网络上搜索得知,clock_gettime这个函数在MAC电脑的操作系统中并没有被实现,所以我们要使用 MAC 系统上的类似函数来替代。通过对 src/utils.c 进行改写,可以解决该问题,具体代码如下:
3)Darknet 安装成功验证
在命令行输入:
./darknet
当得到反馈如下时,说明安装成功了:
usage: ./darknet
Darknet安装成功后,其实就代表着yolo安装好了!下边我们来继续配置一下环境,然后开始使用yolo吧
四、yolo的配置与使用
yolo是基于darknet的一个具体的实例,说是介绍yolo的使用,实际上是介绍darknet的配置与使用
1)darknet的使用与参数介绍
通过前边的介绍,我们知道darknet是一款神经网络开源框架,那么使用darknet,我们需要确定下边几个参数:
[1]神经网络模型:darknet使用一个 xx.cfg 的文件来定义神经网络模型,包括神经网络的迭代次数、层级网络架构等内容
[2]神经网络权重:darknet可以直接使用训练好的权重来进行测试/预测,我们也可以通过对训练样本进行训练获得网络权重。比如可通过下边的命令获得yolo模型已训练好的权重
wget https://pjreddie.com/media/files/yolo.weights
[3]训练样本(optional:训练时需要):当我们需要训练时,需要生成训练样本的标签文件 label.txt。darknet使用了一个 xx.data 类型的文件来存储训练样本参数
通过下边的命令行来实现对训练样本的训练:
./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23
[4]测试样本(optional:测试时需要):
测试样本是图像,我们可以选择单张图片处理形式、多张图片处理形式,以及摄像头方式来对图像进行检测。需注意的是如果要使用网络摄像头接入流来对物体进行图像检测,需要接入 OpenCV,而为了提高速度最好也接入 CUDA 来使用 GPU 进行运算。
通过下边的三种命令行均可对图像进行物体检测,其分别代表了一种处理模式:
//单图片模式
./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg
//多图片模式,即不要输入测试样本,然后后边再一张张输入,这个模式可以避免反复load模型
./darknet detect cfg/yolo.cfg yolo.weights
//摄像头模式(没钱买不起GPU,所以未验证)
./darknet detector demo cfg/coco.data cfg/yolo.cfg yolo.weights
2)yolo的使用样例
[1]预训练权重下载(250MB)
wget https://pjreddie.com/media/files/yolo.weights
[2]根据下载的权重来进行物体检测
./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg
输出结果如下所示:
通过上边的介绍,我相信大伙应该对yolo或者说darknet应该有了初步的理解了,通过阅读源码以及对该框架的继续学习,我相信我们应该可以将这套开源框架应用到实际场景中进行应用!
Hope everyone will have fun playing around!