darknet添加新层以编译yolo_cpp_dll-------shufflenet模块

2023-05-16

首先感谢AlexeyAB大神提供的YOLOv4源码,以及gmayday1997大神提供的split以及shuffle模块源码,本文以两位的工作进行yolov4版本中轻量化模块shufflenet模块的添加。

①首先寻找到channel_slice.c和channel_shuffle.c的源文件及.h头文件,以及加入split.c与split.h六个文件。

②接下来添加新层。参考DarkNet(1)--添加新层教程(slice层为例)

     2.1  makefile文件的154行OBJ=中添加channel_slice.o,channel_shuffle.osplit.o

            include/darknet.h文件中添加相应的层名字

// layer.h
typedef enum {
…
CHANNEL_SHUFFLE,
CHANNEL_SLICE,
SPLIT,
…
}

      2.2    添加新函数中相应参数的名字

// layer.h
struct layer {
…
    int axis; // added by fht 2021/03/22
    int begin_slice_point;// added by fht 2021/03/22
    int end_slice_point;// added by fht 2021/03/22
…
}

③src/parser.c文件中,引用文件添加

#include "split.h"
#include "channel_shuffle.h"
#include "channel_slice.h"

layer_type结构中加入

LAYER_TYPE string_to_layer_type(char * type)
{……
    if (strcmp(type, "[channel_shuffle]") == 0) return CHANNEL_SHUFFLE;
    if (strcmp(type, "[channel_slice]") == 0) return CHANNEL_SLICE;
    if (strcmp(type, "[split]") == 0) return SPLIT;
……
}

并在文件中加入三个释意函数:

layer parse_split(list *options,size_params params,network net){

    int batch,h,w,c;
    h = params.h;
    w = params.w;
    c = params.c;
    batch = params.batch;
    char *l = option_find(options,"from");
    if(!l) error("Split Layer must specify input layers");
    int index = atoi(l);
    if(index <0) index = params.index + index;
    layer from = net.layers[index];
    layer layer_ = make_split_layer(batch,from.out_w,from.out_h,from.out_c,index);
    return layer_;
}

channel_slice_layer parse_channel_slice(list *options,size_params params,\
                                        network net){

    int batch,h,w;
    h = params.h;
    w = params.w;
    //c = params.c;
    batch = params.batch;
    char *l = option_find(options,"from");
    int len = strlen(l);
    if(!l) error("Channel Slice Layer must specify input layers");
    int begin_slice_point = option_find_int(options,"start",2);
    int end_slice_point = option_find_int(options,"end",2);
    int axis = option_find_int(options,"axis",1);
    int n = 1;
    int *layers = (int*)calloc(n,sizeof(int));
    int* sizes = (int*)calloc(n, sizeof(int));
    int *c = (int*)calloc(n, sizeof(int));
    for(int i = 0; i < n; ++i){
        int index = atoi(l);
        l = strchr(l, ',')+1;
        if(index < 0) index = params.index + index;
        layers[i] = index;
        sizes[i] = net.layers[index].outputs;
        c[i] = net.layers[index].out_c;
    }
    channel_slice_layer layer_ = make_channel_slice_layer(batch,w,h,c[0],begin_slice_point,\
                                                     end_slice_point,axis, n, layers,sizes);
    return layer_;
}

layer parse_channel_shuffle(list *options,size_params params){

    int batch,h,w,c;
    h = params.h;
    w = params.w;
    c = params.c;
    batch = params.batch;
    int groups = option_find_int(options,"groups",2);
    layer l = make_channel_shuffle_layer(batch,w,h,c,groups);
    return l;
}

network parse_network_cfg_custom(char *filename, int batch, int time_steps)的while(n)循环结构中,加入层选项 

while(n){
        params.index = count;
        fprintf(stderr, "%4d ", count);
        s = (section *)n->val;
        options = s->options;
        layer l = { (LAYER_TYPE)0 };
        LAYER_TYPE lt = string_to_layer_type(s->type);

        if(lt == CHANNEL_SHUFFLE){
            l = parse_channel_shuffle(options,params);
        }else if(lt == CHANNEL_SLICE){
            l = parse_channel_slice(options,params,net);
        }else if(lt == SPLIT){
            l = parse_split(options,params,net);
        }
…………

④src/network.c文件添加如下代码:

#include "split.h"
#include "channel_shuffle.h"
#include "channel_slice.h"
char *get_layer_string(LAYER_TYPE a)
{
    switch(a){
              ……
        case CHANNEL_SHUFFLE:
            return "channel_shuffle";
        case CHANNEL_SLICE:
            return "channel_slice";
        case SPLIT:
            return "split";
              ……
              }
}

int resize_network(network *net, int w, int h)函数中加入:(split.c函数没有用到,并且存在报错,目前并未解决,可以进行尝试)

else if (l.type == CHANNEL_SHUFFLE) {
            resize_channel_shuffle_layer(&l, w, h);
}else if (l.type == CHANNEL_SLICE) {
            resize_channel_slice_layer(&l, w, h);
}

⑤需要用到GPU的(CPU未进行验证),还需要对blas.h文件进行一个添加,否则会出现调用错误:

void channel_shuffle_ongpu(int N, float* output, float* input, int group_row, int group_column, int feature_map_size, int len);
void channel_slice_ongpu(int count, float* output, float* input, int batch_size, int spatial_size, int input_slice_axis, int output_slice_axis, int begin_slice_axis, int bForward);

⑥按照官方代码进行cmake、编译即可。

编译yolo_cpp_dll。

采用文本编译器,记事本、atom、notebook都可

    <ClCompile Include="..\..\src\yolo.c" />
    <ClCompile Include="..\..\src\yolo_layer.c" />
    <CudaCompile Include="..\..\src\channel_shuffle.c">
    <CudaCompile Include="..\..\src\channel_shuffle.h" />
    <CudaCompile Include="..\..\src\channel_slice.h" />
    <CudaCompile Include="..\..\src\split.h" />

所有新加入的文件,右击文件---》属性---》常规---》项目类型选择CUDA C/C++,否则会出现链接器错误的问题。 

然后按照正常编译即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

darknet添加新层以编译yolo_cpp_dll-------shufflenet模块 的相关文章

  • 使用 COM 对象的 Python ctypes 和 DLL

    在 Windows 下 我尝试使用第 3 方 DLL SomeLib dll 使用 Python 2 7 用 C 编程ctypes 对于其某些功能 该库使用另一个 COM DLL SomeCOMlib dll 它本身使用其他DLL LibA
  • 调用 SWIG 生成的 JNI 时出现 UnsatisfiedLinkError?

    我正在尝试创建一个可从 Java 调用的 C 动态库 我在下面编译了一个DLLCygwin http www cygwin com using SWIG http www swig org Doc1 3 Java html compilin
  • 不使用 Obfuscator 的 DLL 加密

    事实上 我被分配了一项任务来保护我的 DLL 这样 如果我将我的软件部署到任何系统 就没有人可以修改或读取我的 DLL 你能帮我如何在不使用混淆器的情况下对其进行加密吗 您将需要软件来执行此操作 以下是您可能需要考虑的一些软件 Eazfus
  • 执行多尺度训练(yolov2)

    我想知道多尺度训练如何YOLOv2 https arxiv org pdf 1612 08242 pdf works 论文中指出 原始YOLO使用的输入分辨率为448 448 通过添加锚框 我们将分辨率更改为416 416 然而 由于我们的
  • 找不到如何使用 HttpContent

    我正在尝试使用HttpContent HttpContent myContent HttpContent Create SOME JSON 但我没有找到定义它的 DLL 首先 我尝试添加对Microsoft Http也System Net
  • 如何停止对辅助隐式加载 DLL 的 DLL 劫持

    例如 COMDLG32 DLL 隐式链接到以下系统 DLL 以及其他 xmllite dll dll srvcli dll wkscli dll 链接信息库 netutils dll 微星 dll 由于这些是由操作系统隐式加载的 而不是使用
  • Unity HTML5 错误:找不到编码 1252 数据

    我使用的是 Mac 在 Google Chrome 中执行我的小应用程序时 出现 不支持代码页 1252 的 pb 我正在使用Unity 2017 年 6 月测试版为了整合几何健身房IFClib 的编码为 NET 4 6 现在在最后一个 U
  • 如何在 C# 库中创建全局对象[重复]

    这个问题在这里已经有答案了 可能的重复 使整个应用程序可以访问数据 可能在运行时发生变化 的最佳方法是什么 https stackoverflow com questions 11781131 best way to make data t
  • android可以在本机模式下从sd卡加载dll吗

    我想把我写的程序移植到android上 该程序是在 Windows 和 Linux 上用 C 编写的 该程序使用 dll 作为插件架构 通过下载程序从特定文件夹加载的 dll 可以将新插件添加到程序中 我的问题是 是否可以将为 androi
  • 根据环境选择目标 32 位或 64 位本机 DLL

    我有一个本机 DLL 有 32 位和 64 位版本 x86 我想创建一个适用于两种体系结构 任何 CPU 的包装器 并根据当前环境 32 位或 64 位 在运行时 加载 DLL 的正确版本 这个过程应该自动发生 这样我的 DLL 的用户就不
  • 如何在 Visual C++ 中创建 ActiveX DLL

    是否有在 Visual Studio 2008 C 中创建 ActiveX DLL 的教程 参考 我有一个使用 DLLRegisterServer UnregisterServer 构建的 DLL 并且已注册 但我在弄清楚使用什么名称来引用
  • Visual Studio 2013 设计器尝试加载错误版本的项目 DLL

    我的解决方案中有一个 Visual Studio 项目 它引用同一解决方案中的类库项目 该项目编译并执行得很好 但是 当我尝试在设计器中打开一个表单时 我收到一条消息 无法加载文件或程序集 MyLibName Version 1 0 547
  • 为 C# 和 C++ 应用程序编写 DLL

    我需要编写几个 DLL 它们都可以从 C 应用程序和 C 应用程序访问 最初 我认为通过用 C 编写 DLL 并从 C 和 C 应用程序链接到它们可以节省时间 精力 这种方法明智吗 还是应该使用 C 编写 DLL 我的建议是在您最舒服的地方
  • 在 C# 中通过 C DLL 使用数组和指针

    我对 C 非常陌生 上周才开始学习 我有一个用 C 编写的自定义 DLL 具有以下函数 DLLIMPORT void test function double test 我想要做的是从 C 获取数组 test 的指针 因此 如果在 DLL
  • 如何使用 java/vb 脚本调用自定义 ActiveX dll 中的方法

    我使用 VB6 创建了一个 ActiveX dll 并使用打包和部署向导将其打包 生成了一个 cab 文件和一个演示 HTML 页面 此 ActiveX dll 包含一个 simgle 方法 该方法返回字符串且不接受任何参数 我遇到的麻烦是
  • 为单个方法引用大 DLL

    我想在 C 中使用大型类库 dll 中的单个方法 是否有性能或其他方面的缺点 我应该使用反射工具 读取 方法代码并将其复制粘贴到我的项目中吗 更新 硬盘空间不是问题 我的应用程序是网络应用程序 是否有性能或其他方面的缺点 唯一真正重要的是可
  • 从 C# 调用非托管 dll。拿2

    我编写了一个 C 程序 它调用一个 C DLL 将命令行参数回显到文件中 当使用 rundll32 命令调用 c 时 它显示命令行参数没有问题 但是当从 c 内部调用它时 它不会显示 我问了这个问题 https stackoverflow
  • 资源文件是否编译为 UNICODE 或 ANSI 代码页?

    首先 如果这个问题已经被回答了一百次了 我深表歉意 噢 但我的搜索显然很糟糕 因为我没有运气回答这个基本问题 EXE DLL中的资源是如何存储的 作为 UNICODE UCS 2 Windows 本机内部字符格式 还是使用资源块的代码页作为
  • 在Windows 7上安装curl后缺少libcurl-4.dll

    按照这个人的安装curl后指示 https stackoverflow com a 28757477 1186038 除了第 2 步 已安装Win64 OpenSSL v1 0 1u 轻型相反 因为下载页面中缺少版本 k http slpr
  • VB - 以隐式方式链接 DLL

    我正在开发 VB6 图形界面 并且需要隐式链接到 DLL 这样做的动机来自于我上一个问题 https stackoverflow com questions 5194573 有问题的 DLL 使用静态 TLS declspec thread

随机推荐