zoukankan      html  css  js  c++  java
  • darknet源码学习

    darknet是一个较为轻型的完全基于C与CUDA的开源深度学习框架,其主要特点就是容易安装,没有任何依赖项(OpenCV都可以不用),移植性非常好,支持CPU与GPU两种计算方式。
    1、test源码(泛化过程)
       (1)test image
       a(预测):load_network(network.c) ---> network_predict(network.c) ---> forward_network(network.c) ---> forward_yolo_layer(yolo_layer.c) ----> calc_network_cost(network.c)
       b(后处理):get_network_boxes(network.c) ---> make_network_boxes(network.c) ---> fill_network_boxes(network.c)---> get_yolo_detections(yolo_layer.c)
                do_nms_sort(box.c) ---> draw_detections(image.c) ---> save_image(image.c)
       (2)test 过程中thresh作用
        a:get_yolo_detections接口中:

    int get_yolo_detections(layer l, int w, int h, int netw, int neth, float thresh, int *map, int relative, detection *dets)
    {
    int i,j,n;
    float *predictions = l.output;
    if (l.batch == 2) avg_flipped_yolo(l);
    int count = 0;
    for (i = 0; i < l.w*l.h; ++i){
    int row = i / l.w;
    int col = i % l.w;
    for(n = 0; n < l.n; ++n){
    int obj_index = entry_index(l, 0, n*l.w*l.h + i, 4);
    float objectness = predictions[obj_index];
    if(objectness <= thresh) continue;
    int box_index = entry_index(l, 0, n*l.w*l.h + i, 0);
    dets[count].bbox = get_yolo_box(predictions, l.biases, l.mask[n], box_index, col, row, l.w, l.h, netw, neth, l.w*l.h);
    dets[count].objectness = objectness;
    dets[count].classes = l.classes;
    for(j = 0; j < l.classes; ++j){
    int class_index = entry_index(l, 0, n*l.w*l.h + i, 4 + 1 + j);
    float prob = objectness*predictions[class_index];
    dets[count].prob[j] = (prob > thresh) ? prob : 0;
    }
    ++count;
    }
    }
    correct_yolo_boxes(dets, count, w, h, netw, neth, relative);
    return count;
    }

        b:draw_detections接口中:
          int left = (b.x - b.w / 2.) * im.w;
          int right = (b.x + b.w / 2.) * im.w;
          int top = (b.y - b.h / 2.) * im.h;
          int bot = (b.y + b.h / 2.) * im.h;

    2、train源码(训练过程)
       (1)根据配置文件解析、创建、配置net的各个层(以卷积层为例),同时配置net的其他参数
       load_network(network.c) ---> parse_network_cfg(parser.c)--->parse_convolutional(parser.c) --->make_convolutional_layer(convolutional_layer.c);
       注意:make_convolutional_layer过程中特别需要注意以下几个函数指针的配置,分别用来确定前向求损失函数,反向求误差函数,update函数(用来更新参数)
       void (*forward)   (struct layer, struct network); ---> l.forward = forward_convolutional_layer;
       void (*backward)  (struct layer, struct network); ---> l.backward = backward_convolutional_layer;
       void (*update)    (struct layer, update_args); ---> l.update = update_convolutional_layer;

       parse_network_cfg(section list node的概念处理配置文件)
       总结:该过程最后得到的就是一个根据配置文件创建好的一个net框架, 只差灌入数据

       (2)加载数据
       load_thread(data.c)--->load_data_detection(data.c)--->fill_truth_detection(data.c 读取图像的标签数据 其他数据集也可以在这里作修改 然后更改路径)

       (3)开始训练
       train_network(network.c) ---> train_network_datum(network.c 网络训练前向求损失反向求误差最后更新网络参数) --->forward_network (network.c) ---> backward_network (network.c) ---> update_network(network.c) (forward backward update分别使用对应层的函数进行处理)

       
      

  • 相关阅读:
    Sqli-labs Less-47 order by后的注入
    Sqli-labs Less-46 order by后的注入
    Sqli-labs Background-9 order by后的injection
    Sqli-labs Less-45 堆叠注入
    jsp,servlet知识点
    jsp页面编码不统一可能会出问题
    jsp页面找不到,jsp页面乱码
    BZOJ 2843: 极地旅行社 lct splay
    2018/3/23 省选模拟赛
    bzoj 4573: [Zjoi2016]大森林 lct splay
  • 原文地址:https://www.cnblogs.com/llfctt/p/9037672.html
Copyright © 2011-2022 走看看