darknet是使用C和CUDA编写的开源的神经网络框架,它快速且使用简单,之前在海康做caffe方面的工作,本想研究caffe的源代码,但是被导师推荐阅读darknet源代码加深对深度学习的理解而且还能巩固C语言,由此记录一下我的darknet源码阅读之路。

一、darknet安装

本记录主要是阅读源码,所以opencv gpu我就先不弄了,darknet安装非常简单,直接源码安装,在github上下载源代码:

https://github.com/pjreddie/darknet

下载过后解压得到darknet-master文件夹,里面主要包含几个重要的文件夹和makefile和几个license,cfg文件夹存放的是各种常见网络结构的配置文件如yolo、rcnn等,如果想要定义自己的网络结构需要编写自己的cfg文件,这个感觉类似caffe的prototxt。data文件夹下是各种数据集如接下来演示会用到的dog图片。examples文件夹中存放的各种检测算法的例子,如detector.c就是检测的代码,根据你输入run_detector函数的参数是train还是test转到其内部的train_detector或者test_detector,此文件夹中最重要的文件是darknet.c,具体细节之后会讲到。include文件夹中只有一个文件darknet.h是darknet的头文件里面定义了很多要用到的结构,对于熟悉C语言结构体很有帮助。scripts文件夹中是几个shell脚本看几个文件的名字应该是用来获取数据集的。src文件夹中是CNN库的很多细节实现,这个文件夹中的代码应该会花好长时间来研究,里面有BN层的实现、卷积层的实现、正则化等等阅读这部分代码我觉得对于深度学习各个基础知识的理解还是非常有帮助的。

下载好了源代码是第一步,之后还要进行编译,这部分很好做,只要cd进入darknet-master之后执行make,这样就编译好了,这是你会发现文件夹里多出了obj、backup、results三个文件夹和libdarknet.a静态库、libdarknet.so动态库。动态链接的基本思想简单来说就是不对那些组成程序的目标文件进行链接,而是当程序运行时才进行链接,从而解决了静态链接空间浪费的问题。obj文件夹下就是和所有目标文件。这样darknet就非常简单的安装好了。

二、简单的使用

darknet的使用也是很简单,我们先在darknet官网上下载好已经训练出的yolov3的权重,之后在终端运行

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

这个命令结合代码非常好理解,首先可以看darknet.c的主函数中

int main(int argc, char **argv)
{//test_resize("data/bad.jpg");//test_box();//test_convolutional_layer();if(argc < 2){fprintf(stderr, "usage: %s <function>\n", argv[0]);return 0;}gpu_index = find_int_arg(argc, argv, "-i", 0);if(find_arg(argc, argv, "-nogpu")) {gpu_index = -1;}#ifndef GPUgpu_index = -1;
#elseif(gpu_index >= 0){cuda_set_device(gpu_index);}
#endifif (0 == strcmp(argv[1], "average")){average(argc, argv);} else if (0 == strcmp(argv[1], "yolo")){run_yolo(argc, argv);} else if (0 == strcmp(argv[1], "super")){run_super(argc, argv);} else if (0 == strcmp(argv[1], "lsd")){run_lsd(argc, argv);} else if (0 == strcmp(argv[1], "detector")){run_detector(argc, argv);} else if (0 == strcmp(argv[1], "detect")){float thresh = find_float_arg(argc, argv, "-thresh", .5);char *filename = (argc > 4) ? argv[4]: 0;char *outfile = find_char_arg(argc, argv, "-out", 0);int fullscreen = find_arg(argc, argv, "-fullscreen");test_detector("cfg/coco.data", argv[2], argv[3], filename, thresh, .5, outfile, fullscreen);

可以看出该程序是根据给定的argv来决定程序的走向,如本例argv[1]为detect,也就是说程序会转到detector.c中的test_dector函数中,也就是测试检测,那么args[2]、args[3]、args[4]都分明指代什么呢,我们来看test_detector函数的形参

void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh, char *outfile, int fullscreen)
对比来看args[2]是所用检测网络的配置文件,定义了网络的结构,args[3]指的是测试要用到的网络权重的配置文件,args[4]也就是filename这个指的是要测试的图片,从main中的if分支可以看出filename可以不用制定,但即使你不指定程序会提醒你“Enter Image Path:”,还有一点“cfg/coco.data”是做什么的?通过分析test_detector函数我认为这是为了得到coco数据集中label的列表,从而显示filename检测出来的物体的名称,而这个名称是根据label列表索引到的,当然这只是我目前没有对源码深入理解的猜想,如有不正确指出欢迎指正。

darknet整体框架相关推荐

  1. AlexeyAB DarkNet YOLOv3框架解析与应用实践(六)

    AlexeyAB DarkNet YOLOv3框架解析与应用实践(六) Tiny Darknet 听过很多人谈论SqueezeNet. SqueezeNet很酷,但它只是优化参数计数.当大多数高质量的 ...

  2. AlexeyAB DarkNet YOLOv3框架解析与应用实践(五)

    AlexeyAB DarkNet YOLOv3框架解析与应用实践(五) RNNs in Darknet 递归神经网络是表示随时间变化的数据的强大模型.为了更好地介绍RNNs,我强烈推荐Andrej K ...

  3. AlexeyAB DarkNet YOLOv3框架解析与应用实践(四)

    AlexeyAB DarkNet YOLOv3框架解析与应用实践(四) Nightmare 从前,在一所大学的大楼里,西蒙尼亚.维达第和齐瑟曼有一个很好的主意,几乎和你现在坐的大楼完全不同.他们想,嘿 ...

  4. AlexeyAB DarkNet YOLOv3框架解析与应用实践(三)

    AlexeyAB DarkNet YOLOv3框架解析与应用实践(三) ImageNet分类 您可以使用Darknet为1000级ImageNet挑战赛分类图像.如果你还没有安装Darknet,你应该 ...

  5. AlexeyAB DarkNet YOLOv3框架解析与应用实践(二)

    AlexeyAB DarkNet YOLOv3框架解析与应用实践(二) 版本3有什么新功能? YOLOv3使用了一些技巧来改进训练和提高性能,包括:多尺度预测.更好的主干分类器等等.全部细节都在我们的 ...

  6. AlexeyAB DarkNet YOLOv3框架解析与应用实践(一)

    AlexeyAB DarkNet YOLOv3框架解析与应用实践(一) Darknet: C语言中的开源神经网络 Darknet是一个用C和CUDA编写的开源神经网络框架.它速度快,易于安装,支持CP ...

  7. 【推荐系统】推荐系统整体框架概览

    感谢博文作者 Kevin_Duan 原文链接:https://blog.csdn.net/chunyun0716/article/details/83152037 推荐系统整体架构 先说点题外话,最近 ...

  8. 通俗易懂SpringMVC整体框架理解

    最近又重新温习了一下前台SpringMVC框架,能够从整体上对SpringMVC有一个全局的认识.在这里也总结一下,为那些即将学习SpringMVC的亲们,做一个很好的开端吧! 1. SpringMV ...

  9. V4L2 driver(一). 整体框架

    1.1 从字符设备说起 熟悉v4l2用户空间编程的都知道, v4l2编程主要是调用一系列的ioctl函数去对v4l2设备进行打开, 关闭, 查询, 设置等操作. v4l2设备是一个字符设备, 而且其驱 ...

最新文章

  1. 三星笔记本桌面计算机图标消失,重启电脑我的电脑图标不见了怎么处理
  2. Python--day41--事件和信号量之模拟连接数据库并在连接三次后抛出连接超时异常...
  3. 每日一皮:男性同胞,是时候反击了!
  4. Java 14 :NullPointerException的处理新方式
  5. Socket recv()之前进行select代码
  6. 经常用到的一些小病的预防的治疗
  7. SQL server 查询语句
  8. Xceed WinForm数据表格控件Xceed Grid For .NET详细介绍
  9. linux查看挂载内存卡,Ubuntu Linux 挂载移动硬盘、U盘、SD卡(对于新手)
  10. 关于今天zcash4win钱包出错的解决方案Error in updating status 怎么解决
  11. 微机原理交通灯控制系统设计
  12. Nature | 易基因DNA甲基化测序助力人多能干细胞向胚胎全能8细胞的人工诱导
  13. 文明与征服新套路,北条点火队
  14. Leetcode 刷题 - 排序(day2)_桶排序_Top K Frequent Elements
  15. WHUT C语言计费(网吧)管理系统
  16. 计算机检查磁盘,教你win7系统电脑检测到磁盘错误的解决教程
  17. 自动定量发表删除空间说说脚本代码
  18. 艾伟也谈项目管理,五年Skype架构师之路的感言
  19. 竞争优势究竟是什么?
  20. 如何从零打造一把专属的 “客制化机械键盘” —— 个人指南来啦

热门文章

  1. 如何将table设成透明状
  2. viso中无法使用左右键移动形状的解决方法
  3. 一分钟了解MQTT协议 ESP32 MQTT API指南
  4. C++第4章第2题:移位密码-解密
  5. 对比PASCAL和C语言的差异
  6. MySql数据库的下载安装及使用(2020最新版)
  7. ZooKeeper 可视化工具
  8. 给PDF添加书签目录
  9. 声纹识别技术助力远程身份认证
  10. 判断一个数是否为素数的方法