概述

darknet官网:https://pjreddie.com/darknet/    https://github.com/AlexeyAB/darknet

Darknet是一个比较小众的深度学习框架,没有社区,主要靠作者团队维护,所以推广较弱,用的人不多。而且由于维护人员有限,功能也不如tensorflow等框架那么强大,但是该框架还是有一些独有的优点:
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是一个纯C的轻量级框架,专为Yolo设计,是yolo的最佳配合平台,可以体验yolo功能。

darknet目录

cfg文件夹内是一些模型的架构,每个cfg文件类似与caffe的prototxt文件,通过该文件定义的整个模型的架构。
data文件夹内放置了一些label文件,如coco9k的类别名等,和一些样例图(该文件夹主要为演示用,或者是直接训练coco等对应数据集时有用,如果要用自己的数据自行训练,该文件夹内的东西都不是我们需要的)
src文件夹内全是最底层的框架定义文件,所有层的定义等最基本的函数全部在该文件夹内,可以理解为该文件夹就是框架的源码
examples文件夹是更为高层的一些函数,如检测函数,识别函数等,这些函数直接调用了底层的函数,我们经常使用的就是example中的函数
include文件夹,顾名思义,存放头文件的地方
scripts文件夹中是一些脚本,如下载coco数据集,将voc格式的数据集转换为训练所需格式的脚本等
darknet.py是使用python对模型的调用方法,要实现python的调用,还需要用到darknet的动态库libdarknet.so

darknet编译

根据配置情况修改Makefile的相关参数,然后运行make即可。

GPU=: build with CUDA to accelerate by using GPU (CUDA should be in /usr/local/cuda)
CUDNN: build with cuDNN v5-v7 to accelerate training by using GPU (cuDNN should be in /usr/local/cudnn)
CUDNN_HALF=: build for Tensor Cores (on Titan V / Tesla V100 / DGX- and later) speedup Detection 3x, Training 2x
OPENCV=: build with OpenCV .x/.x/2.4.x - allows to detect on video files and video streams from network cameras or web-cams
DEBUG=: build debug version of Yolo
OPENMP=: build with OpenMP support to accelerate Yolo by using multi-core CPU

检验:./darknet detector test ./cfg/coco.data ./cfg/yolov3.cfg ./yolov3.weights data/dog.jpg

darknet命令

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

训练: darknet detector train data/obj.data yolo-obj.cfg darknet53.conv.74

无参考模型: darknet detector train data/obj.data yolo-obj.cfg

检测: darknet detector test data/obj.data yolo-obj.cfg yolo-obj_8000.weights

检测模型精确效果:darknet detector map data/obj.data yolo-obj.cfg yolo-obj_8000.weights

视频检测: darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights my.mp4

默认第一个摄像头视频: darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights

darknet配置文件解析

cfg/yolov3.cfg
[net]
# Testing
# batch=
# subdivisions=
# Training
batch=
subdivisions=
width=
height=
channels=
momentum=0.9
decay=0.0005
angle=
saturation = 1.5
exposure = 1.5
hue=.

其中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。

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

darknet训练参数解析

[to do]

Yolo_mark-标注工具

Windows & Linux GUI for marking bounded boxes of objects in images for training Yolo v3 and v2.
Yolo_mark是一个检测任务数据集制作工具,制作完成后的数据格式不是VOC或者COCO的数据格式,从它的名字也可以看出,它是专门为了YOLO系列的网络训练准备数据的,它没有使用任何一个已有的深度学习框架来实现他的代码,而是自己写了一个纯C的轻量级框架—darknet,所以它的训练数据准备也不是按照标准开源数据集那样的格式。

参考官网:https://github.com/AlexeyAB/Yolo_mark

编译

Yolo_mark依赖opencv,ubuntu16.04下需要更新opencv版本,默认版本编译出错。现测试了opencv-3.4.8可正常运行。

mkdir build
cd build
cmake ..
make
cd ..
cp build/yolo_mark ..

目录

├── CMakeLists.txt
├── LICENSE
├── linux_mark.sh
├── main.cpp
├── README.md
├── x64
│   └── Release
│   ├── data
│   │   ├── img
│   │   │   ├── air1.jpg
│   │   │   ├── air1.txt
│   │   │   ├── air2.jpg
│   │   │   ├── air2.txt
│   │   │   ├── air3.jpg
│   │   │   ├── air3.txt
│   │   │   ├── air4.jpg
│   │   │   ├── air4.txt
│   │   │   ├── air5.jpg
│   │   │   ├── air5.txt
│   │   │   ├── air6.jpg
│   │   │   ├── air6.txt
│   │   │   ├── bird1.jpg
│   │   │   ├── bird1.txt
│   │   │   ├── bird2.jpg
│   │   │   ├── bird2.txt
│   │   │   ├── bird3.jpg
│   │   │   ├── bird3.txt
│   │   │   ├── bird4.jpg
│   │   │   └── bird4.txt
│   │   ├── obj.data
│   │   ├── obj.names
│   │   └── train.txt
│   ├── train_obj.cmd
│   ├── yolo_mark.cmd
│   └── yolo-obj.cfg
├── yolo_mark
├── yolo_mark.sln
└── yolo_mark.vcxproj

x86/Release/data: 存放需要标注的数据与标注后的结果。

x86/Release/data/img: 训练的数据集,里面包含图片和每一张图片对应的标注数据。开始标注之前,img文件夹内只存放需要标注的图像数据(要求.jpg文件),一张图片标注完成后,会给该图片生成一个名字相同的.txt文件,里面存放的就是bbox的信息。

x86/Release/data/img/*.txt: 每一行都是一个目标的信息,这意味着有几行数据,图像中就标注了几个目标,它根据“id x y w h”的形式存放,其中“ x y w h”都是经过归一化之后的。比如bird4.txt文件中的结果(bird的id是1,有一个目标因此只有一行):
1 0.526953 0.502083 0.303906 0.226389

x86/Release/data/train.txt: 数据集的相对路径集合,由img文件夹内存放的数据自动获取。

x64/Release/data/img/air1.jpg
x64/Release/data/img/air2.jpg
x64/Release/data/img/air3.jpg
x64/Release/data/img/air4.jpg
x64/Release/data/img/air5.jpg
x64/Release/data/img/air6.jpg
x64/Release/data/img/bird1.jpg
x64/Release/data/img/bird2.jpg
x64/Release/data/img/bird3.jpg
x64/Release/data/img/bird4.jpg

x86/Release/data/obj.names: 数据集所有分类类名,每个类别的名称都在单独的一行,行数与名称一一对应。示例中有两个类别:air,bird。

air
bird

x86/Release/data/obj.data: 数据集的配置信息:类别数量,训练和测试数据的txt文件列表,各个类别的名字。

classes=
train = data/train.txt
valid = data/train.txt
names = data/obj.names
backup = backup/

标注命令

./yolo_mark x64/Release/data/img x64/Release/data/train.txt x64/Release/data/obj.names

训练命令

拷贝yolo-obj.cfg, data/train.txt, data/obj.names, data/obj.data, darknet19_448.conv.23 and data/img到可执行文件darknet目录

darknet detector train data/obj.data yolo-obj.cfg darknet19_448.conv.

参考:
1. YOLOv3树叶识别实践 https://wenku.baidu.com/view/e4e9a41ef4335a8102d276a20029bd64793e626f.html
2. 理解YOLOv2训练过程中输出参数含义 https://blog.csdn.net/dcrmg/article/details/78565440
https://timebutt.github.io/static/understanding-yolov2-training-output/
3. YOLOv3训练自己的模型 https://blog.csdn.net/StrongerL/article/details/81023603
4. darknet的编译和YOLO在不同编译条件的运行速度对比 https://www.jianshu.com/p/c2a90b89fc21
5.Darknet概述 https://blog.csdn.net/u010122972/article/details/83541978
6. https://github.com/AlexeyAB/Yolo_mark

7. YOLO系列网络训练数据准备工具—Yolo_mark https://blog.csdn.net/chaipp0607/article/details/80009195

darknet简述的更多相关文章

  1. 简述 OAuth 2.0 的运作流程

    本文将以用户使用 github 登录网站留言为例,简述 OAuth 2.0 的运作流程. 假如我有一个网站,你是我网站上的访客,看了文章想留言表示「朕已阅」,留言时发现有这个网站的帐号才能够留言,此时 ...

  2. JavaScript单线程和浏览器事件循环简述

    JavaScript单线程 在上篇博客<Promise的前世今生和妙用技巧>的开篇中,我们曾简述了JavaScript的单线程机制和浏览器的事件模型.应很多网友的回复,在这篇文章中将继续展 ...

  3. Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】

    原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/ Design ...

  4. Android网络定位服务定制简述

    Android 添加高德或百度网络定位服务 Android的网络定位服务以第三方的APK方式提供服务,由于在国内Android原生自带的com.google.android.gms服务几乎处于不可用状 ...

  5. 《Entity Framework 6 Recipes》翻译系列 (1) -----第一章 开始使用实体框架之历史和框架简述

    微软的Entity Framework 受到越来越多人的关注和使用,Entity Framework7.0版本也即将发行.虽然已经开源,可遗憾的是,国内没有关于它的书籍,更不用说好书了,可能是因为EF ...

  6. 简述ASP.NET MVC原理

    1.为什么ASP.NET需要MVC? 因为随着网站的的数量级越来越大,原始的网站方式,这里指的是WebForm,在运行速度和维护性方面,以及代码量上面,越来越难以满足日益庞大的网站维护成本.代码的重构 ...

  7. Design Patterns Simplified - Part 2 (Singleton)【设计模式简述--第二部分(单例模式)】

    原文链接: http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part-2-singleton/ De ...

  8. 【翻译】设计模式学习系列1---【Design Patterns Simplified: Part 1【设计模式简述:第一部分】】

    原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part1/ Design Pattern ...

  9. Android开发3:Intent、Bundle的使用和ListView的应用 、RelativeLayout(相对布局)简述(简单通讯录的实现)

    前言 啦啦啦~博主又来骚扰大家啦~大家是不是感觉上次的Android开发博文有点长呢~主要是因为博主也是小白,在做实验的过程中查询了很多很多概念,努力去理解每一个知识点,才完成了最终的实验.还有就是随 ...

随机推荐

  1. MySQL忘记密码(终极解决方法,亲测有效,windows版本)

    1.进入mysql的bin目录 2.net stop mysql 3.mysqld --skip-grant-tables 输入 mysqld --skip-grant-tables 回车. (--s ...

  2. 实现一个简易的Unity网络同步引擎——netgo

    实现一个简易的Unity网络同步引擎Netgo 目前GOLANG有大行其道的趋势,尤其是在网络编程方面.因为和c/c++比较起来,虽然GC占用了一部分机器性能,但是出错概率小了,开发效率大大提升,而且 ...

  3. 第三方控件引起的"类型Universe无法解析程序集"的血案

    前一阵子在项目中添加了IrisSkin2皮肤控件,今天用VS打开悲剧了. 提示"类型Universe无法解析程序集:System.Design,Version=2.0.0.0,Culture ...

  4. 【代码总结】PHP之会话跟踪技术

    有些时候感觉自己学习的效率好低,一套教程一本书,反复听,反复看,反复敲代码.自学这条路真的是很艰难,在任何事情都没有成功之前都很枯燥乏味.自学的过程中总会遇到很多问题,有时候连错误的原因都找不出来,那 ...

  5. fastJson javaBean和JSON对象相互转换

    fastjson的作用就是把java 对象转化为字符串,把字符串转化为java对象,然后方便进行后续的逻辑处理. java对象和json互相转换都是通过JSON对象操作的: JavaBean bean ...

  6. ubuntu资料

    1.VNC实现Windows远程访问Ubuntu 16.04(无需安装第三方桌面,直接使用自带远程工具) https://www.cnblogs.com/xuliangxing/p/7642650.h ...

  7. WLC-WLC升级(以2504为例)

    1.WLC升级需要按照升级路径来操作,低版本到高版本的跨度太大,往往需要升级到中间版本,有时候还涉及到FUS. 2.我们升级,一般使用的笔记本上运行的TFTP/FTP  server. 需要注意:笔记 ...

  8. MAC系统 - 基础知识

    一.基础操作 设置:触控板设置 - >学习具体手势 手势:MacBook Pro手势大全必学手势触控板手势有哪些 左键,右键,滑屏,切换到应用... 一指操作: 一指敲击:鼠标左键: 一指按下: ...

  9. 杭电2033 人见人爱A+B

    人见人爱A+B Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  10. 通过python调用jenkins 常用api操作

    # -*- coding: utf-8 -*- import jenkins class TestJenkins(object): def __new__(cls, *args, **kwargs): ...