C语言
肖飒风
潜龙在渊
展开
-
yolov3测试代码test_detector
void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh, char *outfile, int fullscreen){ //从datacfg文件中读取类别名称 list *options = read_data_cfg(datacfg); char *name_list = option_find_str(opti原创 2020-05-29 14:48:22 · 1682 阅读 · 2 评论 -
yolo中的parse_yolo函数
l = parse_yolo(options, params);layer parse_yolo(list *options, size_params params){ int classes = option_find_int(options, "classes", 20); int total = option_find_int(options, "num", 1); int num = total; char *a = option_find_str(option原创 2020-05-28 18:25:52 · 628 阅读 · 0 评论 -
l = parse_upsample(options, params, net)
l = parse_upsample(options, params, net);layer parse_upsample(list *options, size_params params, network *net){ int stride = option_find_int(options, "stride",2); layer l = make_upsample_layer(params.batch, params.w, params.h, params.c, stride);原创 2020-05-26 21:22:58 · 183 阅读 · 0 评论 -
l = parse_shortcut(options, params, net)
l = parse_shortcut(options, params, net)layer parse_shortcut(list *options, size_params params, network *net){ char *l = option_find(options, "from"); //获取需要shortcut层的索引 int index = atoi(l); if(index < 0) index = params.index + index;原创 2020-05-26 20:49:51 · 244 阅读 · 0 评论 -
YOLOv3论文翻译讲解
YOLOv3: An Incremental Improvement论文地址;代码地址摘要作者对YOLO进行了进一步的更新,做了一些小设计更改让其表现更好。YOLOv3比YOLOv2相较大了一些,但是检测更加准确,而且检测速度依然很快。320×320 YOLOv3模型能在28.2mAP的精度下运行速度达到了22ms,和SSD的准确度相同但是速度快了3倍。在使用之前的0.5 IOU mAP 检测指标时,YOLOv3表现相当棒。 在Titan X上,它在51毫秒内可达到57.9 AP50,而RetinaN翻译 2020-05-26 18:57:30 · 609 阅读 · 0 评论 -
parse_reorg(options, params)
l = parse_reorg(options, params);layer parse_reorg(list *options, size_params params){ //设置参数 int stride = option_find_int(options, "stride",1); int reverse = option_find_int_quiet(options, "reverse",0); int flatten = option_find_int_quiet(o原创 2020-05-26 13:45:07 · 176 阅读 · 0 评论 -
parse_route(options, params, net)
route_layer parse_route(list *options, size_params params, network *net){ char *l = option_find(options, "layers");//获取需要加载的层数,是相对于此层的层数例如 -1就是上一层 int len = strlen(l);//加载几层 if(!l) error("Route Layer must specify input layers"); int n =原创 2020-05-26 11:18:41 · 251 阅读 · 0 评论 -
YOLOv1源码讲解
1、首先就是从darknet.c中的主函数开始运行,darkne.c中含有多种功能函数,包括了目标检测、语义分割等函数,这里主要讲YOLOv1相关代码,也就是目标检测代码,如下所示://通过接收外界参数来选择使用哪种功能函数int main(int argc, char **argv){ //test_resize("data/bad.jpg"); //test_box();...原创 2020-05-22 17:19:21 · 1620 阅读 · 0 评论 -
更新权重update_network(net)
update_network(net)1、全连接层权重更新void update_connected_layer(layer l, update_args a){ float learning_rate = a.learning_rate*l.learning_rate_scale;//学习率 float momentum = a.momentum; float decay = a.decay; int batch = a.batch; //更新偏置 a原创 2020-05-22 17:06:53 · 700 阅读 · 0 评论 -
反向网络函数backward_network(net)
backward_network(net)函数void backward_network_gpu(network *netp){ int i; network net = *netp; network orig = net; cuda_set_device(net.gpu_index); for(i = net.n-1; i >= 0; --i){ layer l = net.layers[i]; if(l.stopbackw原创 2020-05-22 16:47:10 · 622 阅读 · 0 评论 -
前向传播网络函数forward_network(net)
l.forward_gpu(l, net);函数1.前向卷积网络函数void forward_convolutional_layer_gpu(convolutional_layer l, network net){ fill_gpu(l.outputs*l.batch, 0, l.output_gpu, 1);//初始化GPU网络每一层输出的 l.output_gpu为0;l.output = calloc(l.batch*l.outputs, sizeof(float)); if(l原创 2020-05-21 15:05:35 · 2080 阅读 · 0 评论 -
卷积im2col函数
1、im2col函数一个图像 input_num=1;图像通道 input_channel=1;图像高 input_h=4;图像宽 input_w=4;kernel高 kernel_h=3;kernel宽 kernel_w=3;stride=1;pad=0;卷积后,输出图像的计算公式:output_h=(input_h-kernel_h)/stride+1;output_w=(input_w-kernel_w)/stride+1;如下图,(注:图像中数据不代表图像的颜色数值)原图(原创 2020-05-19 22:04:38 · 1526 阅读 · 0 评论 -
loss = train_network(net, train)backward_network(net)
train_network(net, train)函数主体float train_network(network *net, data d){ assert(d.X.rows % net->batch == 0);//判断data d.X中保存的训练图像数据能否被min_batch整除 int batch = net->batch;//将min_batch赋给batch,表示每次训练的数据 int n = d.X.rows / batch;//d.X中的训练数据分几次原创 2020-05-18 16:07:43 · 332 阅读 · 0 评论 -
darknet加载训练数据load_data函数
pthread_create(&thread, 0, load_threads, ptr)函数中最重要的是load_threads函数load_threads函数void *load_threads(void *ptr){ int i; load_args args = *(load_args *)ptr;//定义并初始化一个指向load_args结构体的指针并将指向一个指向load_args结构体指针的指针 if (args.threads == 0) args.th原创 2020-05-14 18:45:49 · 4955 阅读 · 0 评论 -
nets[i] = load_network(cfgfile, weightfile, clear);
nets[i] = load_network(cfgfile, weightfile, clear);其函数主体如下所示network *load_network(char *cfg, char *weights, int clear){ network *net = parse_network_cfg(cfg);//通过cfg文件构建网络 if(weights &...原创 2020-05-13 14:57:40 · 797 阅读 · 0 评论 -
l = parse_detection(options, params)
l = parse_detection(options, params);函数主体detection_layer parse_detection(list *options, size_params params){ int coords = option_find_int(options, "coords", 1);//设置位置损失项前缀因子参数 int classes = option_find_int(options, "classes", 1);//设置类别 int re原创 2020-05-12 17:54:28 · 162 阅读 · 0 评论 -
l = parse_connected(options, params);
l = parse_connected(options, params);函数主体layer parse_connected(list *options, size_params params){ //设置网络参数 int output = option_find_int(options, "output",1); char *activation_s = option_find_str(options, "activation", "logistic"); ACTIVATIO原创 2020-05-12 17:24:14 · 139 阅读 · 0 评论 -
l = parse_dropout(options, params);
l = parse_dropout(options, params);函数主体dropout_layer parse_dropout(list *options, size_params params){ float probability = option_find_float(options, "probability", .5);//保留多少参数 dropout_layer layer = make_dropout_layer(params.batch, params.inputs原创 2020-05-12 15:29:30 · 111 阅读 · 0 评论 -
l = parse_local(options, params);
l = parse_local(options, params);函数主体local_layer parse_local(list *options, size_params params){ //设置网络参数 int n = option_find_int(options, "filters",1); int size = option_find_int(options, "size",1); int stride = option_find_int(options, "st原创 2020-05-12 11:36:04 · 155 阅读 · 0 评论 -
l = parse_maxpool(options, params);
parse_maxpool(options, params);函数主体maxpool_layer parse_maxpool(list *options, size_params params){ int stride = option_find_int(options, "stride",1);//池化步长 int size = option_find_int(options, "size",stride);//滤波器尺寸 int padding = option_find_i原创 2020-05-11 19:07:55 · 114 阅读 · 0 评论 -
l = parse_convolutional(options, params);
l = parse_convolutional(options, params);函数主体如下所示//进行卷积层操作,最后返回layer类型的结构体convolutional_layer parse_convolutional(list *options, size_params params){ int n = option_find_int(options, "filters",1);//设置卷积核个数,同时也是输出特征图个数 int size = option_find_int(原创 2020-05-11 18:46:10 · 182 阅读 · 0 评论 -
make_convolutional_layer
convolutional_layer layer =make_convolutional_layer(batch,h,w,c,n,groups,size,stride,padding,activation, batch_normalize, binary, xnor, params.net->adam);函数主体convolutional_layer make_convolutional_layer(int batch, int h, int w, int c, int n, int group原创 2020-05-11 18:43:02 · 387 阅读 · 0 评论 -
parse_net_options(options, net);
parse_net_options(options, net);函数主体如下void parse_net_options(list *options, network *net){ net->batch = option_find_int(options, "batch",1);//初始化训练批,每batch个样本更新一次参数。 net->learning_rate = option_find_float(options, "learning_rate", .001);//初原创 2020-05-11 10:26:46 · 263 阅读 · 0 评论 -
network *net = make_network(sections->size - 1);
make_network函数主体//由函数头可知其参数为一个整型变量,返回一个指向network结构体的指针//此函数就是为了给网络层分配内存空间network *make_network(int n)//这里的n是去掉了net层的,因为它是用来保存训练参数的层{ network *net = calloc(1, sizeof(network));//创建一个指向network的指针,其指向分配域起始地址 /* <1>.malloc函数 函数原型为void *原创 2020-05-09 18:41:04 · 199 阅读 · 0 评论 -
list *sections = read_cfg(filename);
read_cfg函数主体list *read_cfg(char *filename){ FILE *file = fopen(filename, "r");//打开文件 if(file == 0) file_error(filename);//若文件不存在,则显示错误,并跳出函数; char *line; int nu = 0; list *options = make_list();//创建list链表结点,用来存储之后的文件数据; section *c原创 2020-05-09 14:37:10 · 345 阅读 · 0 评论 -
关于C语言中指针含义的详细解析
一、什么是指针C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址。CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位。这里,数据对象是指存储在内存中的一个指定数据类型的数值或字符串,它们都有一个自己的地址,而指针便是保存这个地址的变量。也就是说:指针是一种保存变量地址的变量;如果学习过汇编语言的小伙伴很容易理解。**所谓指针,也就是内存的地址;所谓指针变量,也就是保存了内存地址的变量。**指针说白了就是一块内存的地址,而指针变量就是用来保存这块地址,原创 2020-05-08 19:53:27 · 3669 阅读 · 1 评论 -
char *train_images = option_find_str(options, "train", "data/train.list");
char *train_images = option_find_str(options, "train", "data/train.list");这是darknet中训练yolo模型时读取保存在链表中文件的函数,这里详细解析一下其内部结构;前面已经写过了如何存入链表的博客;现在分析一下如何从链表中读取需要的数据;其函数主体如下所示://其参数分别为链表头指针、关键字和默认数据char...原创 2020-05-07 19:01:48 · 508 阅读 · 0 评论 -
darknet中的list *options = read_data_cfg(datacfg);
list *options = read_data_cfg(datacfg);这是darknet中训练yolo模型时读取datacfg文件的一条语句,这里详细解析一下其内部结构;首先先看list的定义,其实一个双向链表结构typedef struct list{ int size; node *front; node *back;} list;然而我们发现它与其...原创 2020-05-07 18:23:41 · 709 阅读 · 0 评论 -
C语言链表讲解
一、C语言中有了数组为什么还要使用链表链表和数组作为算法中的两个基本数据结构,在程序设计过程中经常用到。数组是大家在学习C语言中学到的第一种数据存储方法,其可以存储各种类型的数据,那么为什么还要使用链表来储存数据呢?这里首先先讲解一下两者的特性;数组的特性,在于可以方便的遍历查找需要的数据。在查询数组指定位置(如查询数组中的第4个数据)的操作中,只需要进行1次操作即可,时间复杂度为O(1)。但...原创 2020-05-06 17:51:08 · 482 阅读 · 0 评论