darknet源码剖析
mazinkaiser1991
这个作者很懒,什么都没留下…
展开
-
darknet源码剖析(五)
继续分析load_data_detection int i; data d = {0}; d.shallow = 0; d.X.rows = n; d.X.vals = calloc(d.X.rows, sizeof(float*)); d.X.cols = h*w*3; d.y = make_matrix(n, 5*boxes);...原创 2018-10-31 17:59:06 · 861 阅读 · 0 评论 -
darknet源码剖析(五)box_iou详细分析
在darknet中iou的计算是调用box_iou函数(box.c文件)float box_iou(box a, box b){ return box_intersection(a, b)/box_union(a, b);}iou的计算公式比较简单,交集面积/并集面积。先来看并集面积计算方式:float box_union(box a, box b){ f...原创 2019-02-05 16:25:49 · 2485 阅读 · 0 评论 -
darknet源码剖析(四)do_nms_sort详解
在yolo模型inference执行完成后,会产生很多的冗余结果,此时就需要调用nms对冗余结果进行去重。nms函数在darknet框架中是do_nms_sort函数,位于box.c文件中,现对do_nms_sort过程做详细分析: for(i = 0; i <= k; ++i){ if(dets[i].objectness == 0){ ...原创 2019-02-05 11:46:24 · 3790 阅读 · 1 评论 -
darknet源码剖析(三) load_data_detection详细分析
load_data_detection是数据加载过程的最后一步。下面就来对他进行详细分析。首先是空间分配过程: d.X.rows = n; d.X.vals = calloc(d.X.rows, sizeof(float*)); d.X.cols = h*w*3; d.y = make_matrix(n, 5*boxes);d是data类型数据, da...原创 2019-01-21 19:12:50 · 3587 阅读 · 0 评论 -
darknet源码剖析(二) 数据加载
在上一篇文章中,我们分析了darknet的网络结构与初始化过程,在源码中是load_network函数。接下来继续分析数据加载过程。数据加载过程中涉及的函数有load_data、load_threads、load_data_in_thread、load_thread。数据加载过程如下图所示。(1)load_data中首先启动一个线程调用load_threads,load_threads...原创 2019-01-19 18:31:30 · 1336 阅读 · 6 评论 -
darknet源码剖析(一) network初始化
network是darknet的核心组件,本文以yolov1为例对network的结构进行分析,并对network相关操作函数进行分析。darknet的网络结构使用network结构体进行保存,network的构建过程主要包括以下几个函数:load_network(src/networks.c)->parse_network_cfg(src/parser.c)->make_ne...原创 2019-01-18 21:04:31 · 3903 阅读 · 3 评论 -
Linux codeblocks darknet调试方法
使用GDB对darknet进行调试过于复杂,考虑使用codeblocks以图形化界面对darknet进行调试。现给出编译配置方法。1)编译*.cu文件由于codeblocks无法使用多种编译器进行编译(或许可以,但本人不会),因此需要先对*.cu文件进行编译,生成*.o文件。这里编译*.cu的方法是使用darknet代码中给出的makefile中的命令。我使用的方法更为直接,直接执行dar...原创 2018-11-09 15:32:40 · 1223 阅读 · 0 评论 -
darknet源码剖析(七)
至此load_data_detection的所有功能就都分析完了,总结一下就是获取16幅图片的地址,进行随机变换,并读取对应图片的标注。再次回到load_threads函数中,load_threads共创建64个进程,每个进程加载16幅图像数据。 for(i = 0; i < args.threads; ++i){ pthread_join(threads[i...原创 2018-11-01 15:58:18 · 1498 阅读 · 0 评论 -
darknet源码剖析(四)
pthread_t load_thread = load_data(args);load_data位于src/data.c中pthread_t load_data(load_args args){ pthread_t thread; struct load_args *ptr = calloc(1, sizeof(struct load_args)); *pt...原创 2018-10-30 19:50:53 · 713 阅读 · 1 评论 -
darknet源码剖析(三)
进入train_detector函数。list *options = read_data_cfg(datacfg);list的定义位于darknet.h,为链表。read_data_cfg位于option_list.c中。read_data_cfg的作用在于将数据集配置转化为链表。 char *train_images = option_find_str(options,...原创 2018-10-30 17:38:38 · 1899 阅读 · 1 评论 -
darknet源码剖析(二)
进入run_detector函数:char *prefix = find_char_arg(argc, argv, "-prefix", 0);其中find_char_arg位于src/utils.c文件中,char *find_char_arg(int argc, char **argv, char *arg, char *def){ int i; for(i ...原创 2018-10-30 14:17:22 · 904 阅读 · 2 评论 -
darknet源码剖析(一)
darknet编译较为简单,在github上下载代码后直接make即可。注意更改makefile文件中的相关选项。GPU=1CUDNN=1OPENCV=0OPENMP=0DEBUG=1编译完成后即可开始使用。根据yolov3的训练与测试过程,对darknet进行解析。darknet使用c语言编写,main函数位于examples/darknet.c文件中。训练yolov3...原创 2018-10-30 13:38:09 · 3042 阅读 · 0 评论 -
darknet源码剖析(六)
继续分析load_data_detection,进入fill_truth_detection函数。fill_truth_detection的作用是读取图片对应的标注信息。首先进入find_replace函数。void find_replace(char *str, char *orig, char *rep, char *output){ char buffer[4096] =...原创 2018-10-31 20:05:17 · 1240 阅读 · 1 评论 -
darknet源码剖析(六) 模型训练初探
终于到了最核心的部分了,模型训练的过程由两个部分组成,分别是正向传播与反向传播的过程。首先来看模型的正向传播过程,还是根据函数的调用过程。(1)train_network(network.c) int batch = net->batch; int n = d.X.rows / batch;根据yolov1的配置,batch的值为8,d.X.rows的值为64...原创 2019-02-11 19:22:31 · 644 阅读 · 0 评论