欢迎访问我的网站,希望内容对您有用,感兴趣的可以加入我们的社群。

Darknet基本使用

YOLO 迷途小书童 5年前 (2019-12-16) 11033次浏览 0个评论

软硬件环境

  • Intel(R) Xeon(R) CPU E5-1607 v4 @ 3.10GHz
  • GTX 1070 Ti 32G
  • ubuntu 18.04 64bit
  • anaconda with python 3.6
  • darknet git version
  • cuda 8.0
  • opencv 3.1.0

视频看这里

Darknet简介

Darknet 是一个用 CCUDA 编写的开源的神经网络框架。安装起来非常快速、简单,并同时支持 CPUGPU。源码托管在 github 上,地址是: https://github.com/pjreddie/darknet

YOLO

You Only Look Once (YOLO) 是目前最先进的、实时的物体检测系统,已经发展到了第三个版本,在速度和准确度上都有非常大的提升

安装Darknet

步骤非常简单, 以下是 CPU 版本

git clone https://github.com/pjreddie/darknet.git
cd darknet
make

如果需要 GPU 加速的话,需要修改 Makefile, 将 GPU=0 改成 GPU=1,然后重新 make, 由于我的系统是最新的18.04版本,GCC 版本已经升级到了7,编译中出现了如下错误

gcc_error

解决方法如下

cuda 8.0中做一个 gcc-5 的一个软连接,非常方便。不建议去修改操作系统的默认gcc 版本,风险太大

sudo ln -s /usr/bin/gcc-5 /usr/local/cuda/bin/gcc

关于 CUDA 的安装可以参考之前的一篇文章 ubuntu安装CUDA

同样的,如果需要 opencv 的支持,修改 Makefile,将 OPENCV=0 改成 OPENCV=1,接着也是 make

如果需要 debug, 修改 DEBUG=1, 很不幸我这里报了个错

error_cv2_01

解决方法是修改 Makefile 文件,大概是35行左右(每个版本可能不太一样),将

ifeq ($(DEBUG), 1) 
OPTS=-O0 -g
endif

修改成

ifeq ($(DEBUG), 1) 
OPTS=-O4 -g
endif

这个是 GCC 编译器进行编译期优化的参数

error_cv2_02

我这编译的时候, Makefile 是这样的

GPU=1
OPENCV=1
DEBUG=1

Darknet命令行工具的使用

使用之前,需要下载 yolov3weights 文件,也就是模型文件, 这里给了2个链接, yolov3-tiny.weightsyolov3.weights 的缩小版, 根据需要自行选择

wget https://pjreddie.com/media/files/yolov3.weights
wget https://pjreddie.com/media/files/yolov3-tiny.weights

检测图片中的物体

单张图片检测,执行

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

image_01

image_02

如果需要进行多张图片的连续检测,可以省略上述命令中的图片路径

使用摄像头检测物体

使用本地摄像头进行检测,执行

./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights

camera_01

检测视频文件中的物体

使用本地视频文件进行检测,执行

./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights ~/Videos/pbs5e6.mkv

使用 GPU 加速的话,效果还是不错的, 简单测试了下,mp4mkv 封装格式都是支持的

video_file_05

video_file_06

video_file_07

video_file_08

video_file_09

设置检测阈值

增加参数 -thresh, 默认值是0.25, 数值越高检测越严格

weights训练

这里以PASCAL VOC数据集为例,重新训练 weights 文件

准备数据集

官方提供了下载链接,分别执行下面命令

wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
wget https://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar
wget https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar
tar xf VOCtrainval_11-May-2012.tar
tar xf VOCtrainval_06-Nov-2007.tar
tar xf VOCtest_06-Nov-2007.tar

生成label文件

首先我们需要生成 darknet 使用的 label 文件, 这是一个 txt 文件, 内容如下, 是跟图片宽度和高度相关的一组数据。

<object-class> <x> <y> <width> <height>

官方已经有了一个转换的脚步, 我们拉取下来直接用

wget https://pjreddie.com/media/files/voc_label.py
python voc_label.py

执行完后, 在目录 VOCdevkit/VOC2007/labelsVOCdevkit/VOC2012/labels 下产生很多的 label 文件, 数据集中有多少图片就对应有多少 label 文件, 而在 darknet 根目录同时也生成了几个 txt 文件, 如下

label

一般来讲, 在进行数据集的训练时都会准备3份数据, 一份用作训练 train, 一份用作验证 val, 最后一份用来测试 test, 这些文件仅仅指明了相应图片的路径. 这里把2007年的 test 保留, 其余的都拿来训练, 理论上讲, 训练数据越大, 效果越好, 这里的 VOC 数据集大概有15000+张图片

cat 2007_train.txt 2007_val.txt 2012_*.txt > train.txt

编辑VOC数据集的配置文件

配置文件路径是 cfg/voc.data, 主要是修改几个 txt 文件的路径, 如果需要增减 class 种类, 这里的 classes 也是需要修改的

classes= 20
train  = /home/longjing/Work/yolo3/darknet/train.txt
valid  = /home/longjing/Work/yolo3/darknet/2007_test.txt
names = data/voc.names
backup = backup

下载官方训练好的卷积层weights

在训练 VOC 的时候需要用到它,执行

wget https://pjreddie.com/media/files/darknet53.conv.74

开始训练

修改 cfg/yolov3-voc.cfg, 训练和测试采用不用的参数,不同显卡的算力不同,这里也要做相应的值修改

[net]
# Testing
# batch=1
# subdivisions=1
# Training
batch=64
subdivisions=16

然后执行训练命令

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74

train_nv_smi

训练结束后,weights 文件成功生成, 在 backup 目录下

train_voc_weights_01

参考资料

  1. https://pjreddie.com/darknet/install/
  2. https://stackoverflow.com/questions/6622454/cuda-incompatible-with-my-gcc-version
  3. https://www.youtube.com/watch?v=KD8fT49KXv8
  4. https://groups.google.com/forum/#!topic/darknet/fQ2GQuibBA4
  5. https://github.com/pjreddie/darknet/issues/492
  6. https://pjreddie.com/darknet/yolo/
  7. https://pjreddie.com/media/files/papers/YOLOv3.pdf
喜欢 (0)

您必须 登录 才能发表评论!