yoloV3是实时目标检测算法yolo的第三个版本,其本身基于darknet构建的神经网络算法.
1.实例演示
#获取源码
git clone https://github.com/pjreddie/darknet
cd darknet
make
#获取预训练的参数权重
wget https://pjreddie.com/media/files/yolov3.weights
#执行
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
在darknet文件夹下的predictions.jpg即是检测后的结果,如图:
2. 利用GPU
Darknet在进行图像目标检测时,可以使用GPU进行运算加速,比单独使用CPU要快500倍以上.
前提:具有NVIDIA 显卡、显卡驱动已安装、CUDA已安装、CUDNN已安装
假设上述前提已准备好,则修改darknet根目录下的Makefile文件:
GPU=1
CUDNN=1 #若安装了cudnn设置为1,也可以不设置.安装了cuda其实就可以使用GPU了
#注意makefile中如下的配置 请确认是否与你安装的目录一致
ifeq ($(GPU), 1)
COMMON+= -DGPU -I/usr/local/cuda/include/
CFLAGS+= -DGPU
ifeq ($(OS),Darwin) #MAC
LDFLAGS+= -L/usr/local/cuda/lib -lcuda -lcudart -lcublas -lcurand
else
LDFLAGS+= -L/usr/local/cuda/lib64 -lcuda -lcudart -lcublas -lcurand
endif
endif
ifeq ($(CUDNN), 1)
COMMON+= -DCUDNN
ifeq ($(OS),Darwin) #MAC
CFLAGS+= -DCUDNN -I/usr/local/cuda/include
LDFLAGS+= -L/usr/local/cuda/lib -lcudnn
else
CFLAGS+= -DCUDNN -I/usr/local/cudnn/include
LDFLAGS+= -L/usr/local/cudnn/lib64 -lcudnn
endif
endif
再次使用make重新编译
使用GPU版测试dog.jpg 耗时0.20秒
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg #默认使用第1块GPU
./darknet detect cfg/yolov3.cfg yolov3.weights -i 1 data/dog.jpg # -i 1:使用第2块GPU
./darknet -nogpu detect cfg/yolov3.cfg yolov3.weights data/dog.jpg #-nogpu:不使用GPU
3.结合OpenCV(opencv 版本<=3.4.0)
默认下Darknet使用stb_image.h加载图像,如果支持多种图片格式可以结合OpenCV进行处理,同时OpenCV将检测结果实时直观的展示出来.
安装好OpenCV后,修改Makefile文件
OPENCV=1
执行make命令再次重新编译
测试是否可用:
./darknet imtest data/eagle.jpg
#再次执行如下命令,检测结果的图片将会弹到桌面
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
4.基于视频的实时目标检测
除了检测图片外,Darknet还可以针对视频进行检测,前提:安装好CUDA和OpenCV
#通过摄像头进行视频测试 系统具备摄像头且可用
./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights
#通过视频文件进行测试
./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights
使用MP4视频测试
./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights /home/adminpc/jiaopan/test.mp4yolov3视频测试-jiaopanhttps://www.zhihu.com/video/1083385719980003328
5.训练自定义数据集 检测自定义目标训练数据集的标记
训练数据集的构造可以使用yolo_mark,地址:AlexeyAB/Yolo_mark
参考:AlexeyAB/darknet 通过上述步骤编译该版本的darknet
yolo_mark的编译安装请参考官方文档,不再赘述.编译成功的yolo_mark
在data目录下构建如下四个文件img:放置需要标记的图片集合
obj.data内容如下:
classes= 2 #检测的类别个数 如检测自行车、小汽车、公交车,则classes = 3
train = data/train.txt
valid = data/train.txt
names = data/obj.names
backup = backup/obj.names
检测的类别名称,如检测自行车和自行车群,个数等于classes的值,且用英文命名
使用中文会乱码,需要更改darketnet源码
bike
bike_group
train.txt:初始为空
双击yolo_mark.cmd启动标记程序,启动后如图:image num 0:第几张图片
object id 0:当前标记的类别,0对应bike 1对应bike_group 通过键盘的数字键可直接进行切换或者使用鼠标点击切换
通过鼠标绘制矩形框进行标记,标记bike时object id 指向0,标记bike_group时object id 指向1
切换上一张图片和下一张图片可通过键盘方向键进行切换,同时空格键位切换到下一张图片
若标记错误,可将鼠标指针移到方框内,并按键盘R键即可删除错误的标记框.
按键盘H键可以查看更多的操作说明.
标记完图片以后,在img目录下会生成图片对应的txt,txt内容为类别值以及标记方框在图片中的坐标(x,y,width,height),且值为归一化后的值.
同时,图片的所有相对路径将会自动加载到train.txt文件中
注意,train.txt文件需要通过notepad++转为unix格式
至此,训练数据集便构造完成.
模型训练将img文件夹、obj.data、obj.names、train.txt复制到darknet的data目录下
2.创建model目录,复制darknet/cfg目录下的yolov3.cfg到darknet/model目录,并重新命名为yolo-obj.cfg
cfg文件定义yolo神经网络的结构、学习速率、迭代次数等参数
3.打开yolo-obj.cfg文件注释3-4行,取消6-7行的注释更改迭代次数,2000次即可,依据GPU性能,本文使用的是Titan V .若显卡性能较差,迭代次数过多,训练时间将会很长,若迭代次数太少,模型的准确率会很低.本文检测自行车和自行车群两个类别,修改classes = 2 ,共三处更改 [filters=255] 为 filters=(classes + 5)x3
原文件classes = 80,因此filters = (80+5) x 3 = 255
本文classes = 2,因此filters = (2+5) x 3 = 21
注意:只修改 [filters=255]的地方,其他的filters不要修改,共三处
所以针对两个类别的检测 修改的值为:
filters=21
classes=2
5.执行命令训练
./darknet detector train data/obj.data model/yolo-obj.cfg model/darknet53.conv.74
训练过程,如图:
每训练100或1000次,在darknet/backup目录下会自动生成模型参数文件.图表为训练时的误差值趋势图.训练时的误差足够小即可手动停止训练或等待训练完成.
训练完成以后,在darknet/backup目录会生成yolo-obj_last.weights文件.这就是我们训练完成的模型参数文件,yolo-obj_1000.weights表示迭代1000次时的模型参数
6.测试
#使用训练完成后的模型参数测试
./darknet detector test data/obj.data model/yolo-obj.cfg backup/yolo-obj_last.weights
输入图片地址后,结果如图