• 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分别使用对应层的函数进行处理)

       
      

  • 相关阅读:
    Ubuntu 拦截并监听 power button 的关机消息
    Android 电池管理系统架构总结 Android power and battery management architecture summaries
    Linux 内核代码风格
    Linux 内核工作队列之work_struct 学习总结
    微信小程序 登录流程规范解读
    微信小程序监听input输入并取值
    koala 编译scss不支持中文(包括中文注释),解决方案如下
    阻止冒泡和阻止默认事件的兼容写法
    使用setTimeout实现setInterval
    css实现视差滚动效果
  • 原文地址:https://www.cnblogs.com/llfctt/p/9037672.html
Copyright © 2020-2023  润新知