目录

一、Darknet优势

二、Darknet的结构

三、Darknet安装

四、Darknet的训练

五、Darknet的检测

正文

一、Darknet优势

darknet是一个由纯C编写的深度学习框架,它有着其它深度学习框架无法相比的优势:

1.易于安装:在makefile里面选择自己需要的附加项(cuda,cudnn,opencv等)直接make即可,几分钟完成安装;
2.没有任何依赖项:整个框架都用C语言进行编写,可以不依赖任何库,连opencv作者都编写了可以对其进行替代的函数;
3.结构明晰,源代码查看、修改方便:其框架的基础文件都在src文件夹,而定义的一些检测、分类函数则在example文件夹,可根据需要直接对源代码进行查看和修改;
4.友好python接口:虽然darknet使用c语言进行编写,但是也提供了python的接口,通过python函数,能够使用python直接对训练好的.weight格式的模型进行调用;
5.易于移植:部署到机器本地十分简单,且可以根据机器情况,使用cpu和gpu,特别是检测识别任务的本地端部署。

二、Darknet结构

darknet整理结构图:

 |--\cfg
|------coco.data
|------darknet.cfg
|------...
|------yolov3.cfg
|--\data
|------coco.names
|------...
|--\examples
|------classifier.c
|------detector.c
|------...
|--\include
|------darknet.h
|--\python
|------darknet.py
|------...
|--\scripts
|------get_coco_dataset.sh
|------...
|--\src
|------convolutional_layer.c
|------convolutional_layer.h
|------convolutional_kernels.cu
|------...
|--darknet53.conv.74
|--LICENSE
|--Makefile
|--ReadMe.md

各文件夹功能解释:

1.cfg文件夹内是一些模型的架构,通过该文件定义整个模型的架构

2.data文件夹内放置了一些label文件,和一些样例图

3.src文件夹内全是最底层的框架定义文件,所有层的定义等最基本的函数全部在该文件夹内

4.examples文件夹是更为高层的一些函数,如检测函数,识别函数等,这些函数直接调用了底层的函数,我们经常使用的就是example中的函数;

5.include文件夹,存放头文件的地方;

6.python文件夹里是使用python对模型的调用方法,基本都在darknet.py中;

7.scripts文件夹中是一些脚本,如下载coco数据集,将voc格式的数据集转换为训练所需格式的脚本等

8.除了license文件,剩下的就是Makefile文件

三、Darknet安装

1、打开Makefile文件,将需要的选项设置为1,使用GPU和CUDNN:

2、打开终端,进入到darknet文件夹根目录,输入make,开始编译

3、编译完成后,在根目录下,会多出一些文件夹和文件:obj文件夹中存放了编译过程中的.o文件,另外,还生成了三个文件:可执行文件darknet.exe,静态链接库libdarknet.a和动态链接库libdarknet.so。本地进行模型调用可直接使用darknet.exe,而如果要移植到其它平台,就需要用到libdarknet.so这个动态链接库。不过,该动态链接库只包含了src文件夹中定义的框架基础函数,并没有包含examples中的上层函数,所以在调用过程中需要自己去定义检测函数。

四、Darknet的训练

1、数据准备

将数据的groundtruth转化为darknet需要的格式,如果你的gt为voc格式的xml,可以通过如下脚本进行转换

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
classes = ["car"]#类别改为自己需要检测的所有类别
def convert(size, box):
dw = 1./size[0]
dh = 1./size[1]
x = (box[0] + box[1])/2.0
y = (box[2] + box[3])/2.0
w = box[1] - box[0]
h = box[3] - box[2]
x = x*dw
w = w*dw
y = y*dh
h = h*dh
return (x,y,w,h)
def convert_annotation(image_id):
in_file = open(xml_path)#与图片对应的xml文件所在的地址
out_file = open(txt_save_path,'w') #与此xml对应的转换后的txt,这个txt的保存完整路径
tree=ET.parse(in_file)
root = tree.getroot()
size = root.find('size') #访问size标签的数据
w = int(size.find('width').text)#读取size标签中宽度的数据
h = int(size.find('height').text)#读取size标签中高度的数据 for obj in root.iter('object'):
cls = obj.find('name').text
if cls not in classes :#or int(difficult) == 1:
continue
cls_id = classes.index(cls)
xmlbox = obj.find('bndbox')
b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
bb = convert((w,h), b)
out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')

需要自行设置xml_path和txt_save_path

从上面的代码可以看到,对于object的位置x_min,x_max,y_min,y_max,先求得其中心点坐标center_x,center_y以及位置框的长宽width_rect,height_rect,再将这四个值分别除以长宽以将数据归一化。

2、*.data文件准备

训练的时候必须的项目有“class”,“train”,“backup”。“names”最好也设置上,方便以后调用。

“class”表示你要检测的类别个数,如检测类别为4则class=4
     “backup”表示训练过程中的缓存和保存的模型。训练过程中,会在该路径下生成一个后缀为.backup的文件,该文件每100个step将模型更新一遍,以防止训练忽然终端而没有保存模型。并且,训练保存的模型也会存在该路径下。默认情况下,每10000step还是多少会保存一个模型,命名为yolov3_迭代次数.weights,最终训练完成还会保存一个yolov3_final.weights。这些模型都会保存在backup路径下
     “names”为保存检测object名称的路径,names=plate.names
     “train”为你训练集的list路径,如train=data/trainlist.txt,trainlist.txt中保存了所有训练集图像的路径:

/home/jim/yolov3/data/car/image/1101.jpg

/home/jim/yolov3/data/car/image/1104.jpg

/home/jim/yolov3/data/car/image/1134.jpg

可通过如下命令生成文件:

find image_path -name \*.jpg > trainlist.txt     ::image_path为你数据集的路径

3、*.cfg文件准备

如果要调用yolo v3,可以直接使用cfg文件夹下的yolov3.cfg,但是需要做如下几个修改:
首先,将最上方的

# Testing
batch=1
subdivisions=1
# Training
# batch=64
# subdivisions=16
修改为 # Testing
#batch=1
#subdivisions=1
# Training
batch=64
subdivisions=16

其中batch表示batchsize,而subdivisions是为了解决想要大batchsize而显存又不够的情况,每次代码只读取batchsize/subdivisions 个图像,如图中设置为64/16=4,但是会将16次的结果也就是64张图的结果,作为一个batch来统一处理;

然后,根据自己检测的类别,将每个[yolo](共有三个[yolo]) 下方的classes修改为自己需要检测的类别,如果只检测一类则classes=1
然后将每个[yolo] 上方的第一个filters的值进行修改,计算方式为(5+classes)*3,如果classes为1,则为18,修改前后的对比:

[convolutional]
size=1
stride=1
pad=1
filters=255
activation=linear [yolo]
mask = 0,1,2
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=80
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1 [convolutional]
size=1
stride=1
pad=1
filters=18
activation=linear [yolo]
mask = 0,1,2
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=1
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1

其中:random表示论文中提及的resize network来增强网络的适应性,如果显存足够,最好设置为1,如果显存不够,也可以将其设置为0,即不进行network resizing

4、weights文件准备

如果你使用的是作者提供的cfg模型结构,如yolov3,那么可以到官网去下载预训练模型来初始化模型参数,这样可以加快收敛。

当然,你也可以不使用预训练模型进行训练

5、开始训练

如果使用预训练模型则使用如下命令

./darknet detector train data/detect.data data/yolov3.cfg data/yolov3.weight

否则,使用如下命令:

./darknet detector train data/detect.data data/yolov3.cfg

注:分类模型使用如下命令:

./darknet classifier train cfg/cifar.data cfg/cifar_small.cfg (xxx.weights)

五、Darknet的检测

检测使用如下命令:

./darknet detector test data/detect.data data/yolov3.cfg data/yolov3.weight

其中./darknet为前面编译生成的darknet.exe文件,darknet.exe首先调用example文件夹下的darknet.c,该文件中的main函数需要预定义参数,detector即为预定义参数,如下代码:

else if (0 == strcmp(argv[1], "detector")){ run_detector(argc, argv);}

  由‘detector’转而调用run_detector,run_detector存在于example文件夹下的detector.c中,再根据预定义参数,确定是调用检测函数,训练函数还是验证函数:

if(0==strcmp(argv[2], "test")) test_detector(datacfg, cfg, weights, filename, thresh, hier_thresh, outfile, fullscreen);
else if(0==strcmp(argv[2], "train")) train_detector(datacfg, cfg, weights, gpus, ngpus, clear);
else if(0==strcmp(argv[2], "valid")) validate_detector(datacfg, cfg, weights, outfile);
else if(0==strcmp(argv[2], "valid2")) validate_detector_flip(datacfg, cfg, weights, outfile);
else if(0==strcmp(argv[2], "recall")) validate_detector_recall(cfg, weights);
else if(0==strcmp(argv[2], "demo"))

其中test表示检测,train表示训练,valid表示验证,recall表示测试其召回率,demo为调用摄像头的实时检测,命令最后的三个参数表示运行需要的文件,.data文件记录了模型检测的类别,类名文件等,如下:

classes= 1
train = /home/jim/yolov3/data/car/train.list
names = data/plate/car.names
backup = /home/jim/yolov3/data/car/models

class表示检测类别,train为训练中需要用到的训练数据的列表,valid为验证集列表,names为检测类别的名称,backup为训练中用到的存放训练模型的路径

.cfg文件定义了模型结构,而.weight文件为调用的模型权重文件。

Darknet的整体框架,安装,训练与测试的更多相关文章

  1. yolov3和darknet opencv版编译安装及基本测试

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 一.准备工作: 安装pkg-config:sudo apt-get install pkg-confi ...

  2. Caffe系列4——基于Caffe的MNIST数据集训练与测试(手把手教你使用Lenet识别手写字体)

    基于Caffe的MNIST数据集训练与测试 原创:转载请注明https://www.cnblogs.com/xiaoboge/p/10688926.html  摘要 在前面的博文中,我详细介绍了Caf ...

  3. Windows下mnist数据集caffemodel分类模型训练及测试

    1. MNIST数据集介绍 MNIST是一个手写数字数据库,样本收集的是美国中学生手写样本,比较符合实际情况,大体上样本是这样的: MNIST数据库有以下特性: 包含了60000个训练样本集和1000 ...

  4. Win10中用yolov3训练自己的数据集全过程(VS、CUDA、CUDNN、OpenCV配置,训练和测试)

    在Windows系统的Linux系统中用yolo训练自己的数据集的配置差异很大,今天总结在win10中配置yolo并进行训练和测试的全过程. 提纲: 1.下载适用于Windows的darknet 2. ...

  5. 初识cocos2d-x-从环境配置到整体框架

    前言 ACM生涯在带着些许遗憾中结束了.春招的时候找了一份游戏开发的工作,现在学习cocos2dx中. 从ACM竞赛到实际项目开发的学习,第一感觉就是不适应,虽然感觉实际项目的确要比ACM简单的多.最 ...

  6. [c#]asp.net开发微信公众平台(7)前6篇的整体框架demo源码

    这里给出的demo是具备整体框架的微信公众平台源码, 所谓demo就是拿过去就可以直接演示使用的东西,  当然不会具备非常详细的具体到业务层面.数据层面的东西, 每个人都可以在此基础上自由发挥,  只 ...

  7. iOS学习——iOS 整体框架及类继承框架图

    整理自:IOS 整体框架类图值得收藏 一 整体框架 在iOS开发过程中,对iOS的整理框架的了解和学习是必不可少的一个环节,今天我们就好好来了解一下iOS的整体框架.首先贴一个关于iOS的框架介绍:i ...

  8. 物体检测算法 SSD 的训练和测试

    物体检测算法 SSD 的训练和测试 GitHub:https://github.com/stoneyang/caffe_ssd Paper: https://arxiv.org/abs/1512.02 ...

  9. ActiveMQ (一):安装启动及测试

    1. 预备知识 1.1 JMS JMS(Java Messaging Service)是Java平台上有关面向消息中间件(MOM)的技术规范.<百科> 1.2 JMX JMX(Java M ...

随机推荐

  1. iscsi序列二、iscsi多路径配置方式

    一.ISCSI多路径应用 如果存储服务器到交换机只有一条线路的时候,那么一条线路出线故障,整个就没法使用了,所以多线路可以解决这个问题,避免单点故障 如上图,如果SAN服务器与客户端交换机只有一条线路 ...

  2. 【JVM学习笔记】扩展类加载器

    扩展类加载器独有的特点,代码如下 public class Sample { } public class Test { static { System.out.println("Test ...

  3. Python 常用模块(2) 序列化(pickle,shelve,json,configpaser)

    主要内容: 一. 序列化概述 二. pickle模块 三. shelve模块 四. json模块(重点!) 五. configpaser模块 一. 序列化概述1. 序列化: 将字典,列表等内容转换成一 ...

  4. Linux下中文乱码

    Linux下中文乱码 修改mysql配置文件,centeros下 配置文件在 /etc/my.cnf vi /etc/my.cnf 在[mysqld]段下添加 character-set-server ...

  5. 双系统删除Linux系统

    1.首先解决Linux的grub引导问题.电脑先安装了Windows10,然后又安装了Linux,grub直接覆盖了Windows的引导, 所以每次开机都是进入了Linux的grub引导,现在我们需要 ...

  6. 【miscellaneous】海康相机RTSP连接代码分析

    海康相机RTSP连接代码分析 最近在做海康相机rtsp连接获取音视频的工作,现在介绍一下分析过程和源码. [源码在我上传的共享资料中: http://download.csdn.net/detail/ ...

  7. vue-cli3 取消eslint 校验代码 真正的解决办法

    在网上找了各种办法都没解决,看了下文档就解决了 关闭vue-cli3.0 报错:eslint-disable-next-line to ignore the next line.   注意我这里是VU ...

  8. MySQL_数据查询

    目录 1.查看数据的两种方法 2.查看数据并进行筛选(where) 3.不查看重复记录(distinct),空值,非空值 5.查看指定行(limit) 6.模式匹配(like) regexp 6.范围 ...

  9. linux系统目录权限实践及结论

    总结测试结论:Linux目录的读.写.执行权限说明:

  10. ROS topic,service和action的使用场景

    参考:ROS中关于topic和service的运用场合 Topics 特点: 1.单向,分工明确,处理连续数据流,topic是一种多对多的形式,一个Node可以订阅多个Topic,可以publish到 ...