darknet源码学习(一) 入口及测试总体流程

【darknet 学习笔记-02】目标检测test_detector源码分析 在01中已经实现了对图片中的物体的检测与识别,本节分析目标检测test_detector的执行过程,对源码进行分析。 终端输入的命令如下,本节即分析该命令的执行过程。 ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg darknet的主程序入口在darknet/example/darknet.c 中,在01中我们打印出来... 阅读详情

        最近在使用YOLO fastest训练检测模型,之前听过很多次YOLO这个系列,跑过相关测试demo及现成的训练代码,但对里面的细节几乎一无所知。这次在对自己的数据格式进行转换调整后,进行训练,发现检测效果及性能都很好,在iPhone6s及以上机型可以轻松做到实时。但在训练的过程中,日志的输出却存在一些异常的地方。后来跟一些技术群里面的同学讨论过,应该是代码部分存在点小问题,所以需要研究下代码的细节。

        darknet的主函数在darknet.c文件中,入口main函数根据命令行输入参数不同进入不同的功能函数。

if (0 == strcmp(argv[1], "average")){
        average(argc, argv);
    } else if (0 == strcmp(argv[1], "yolo")){
        run_yolo(argc, argv);
    } else if (0 == strcmp(argv[1], "voxel")){
        run_voxel(argc, argv);
    } else if (0 == strcmp(argv[1], "super")){
        run_super(argc, argv);
    } else if (0 == strcmp(argv[1], "detector")){
        run_detector(argc, argv);
    } else if (0 == strcmp(argv[1], "detect")){
        float thresh = find_float_arg(argc, argv, "-thresh", .24);
        int ext_output = find_arg(argc, argv, "-ext_output");
        char *filename = (argc > 4) ? argv[4]: 0;
        test_detector("cfg/coco.data", argv[2], argv[3], filename, thresh, 0.5, 0, ext_output, 0, NULL, 0, 0);
    } else if (0 == strcmp(argv[1], "cifar")){
        run_cifar(argc, argv);
    } else if (0 == strcmp(argv[1], "go")){
        run_go(argc, argv);
    } else if (0 == strcmp(argv[1], "rnn")){
        run_char_rnn(argc, argv);
    } else if (0 == strcmp(argv[1], "vid")){
        run_vid_rnn(argc, argv);
    } else if (0 == strcmp(argv[1], "coco")){
        run_coco(argc, argv);
    } else if (0 == strcmp(argv[1], "classify")){
        predict_classifier("cfg/imagenet1k.data", argv[2], argv[3], argv[4], 5);
    } else if (0 == strcmp(argv[1], "classifier")){
        run_classifier(argc, argv);
    } else if (0 == strcmp(argv[1], "art")){
        run_art(argc, argv);
    } else if (0 == strcmp(argv[1], "tag")){
        run_tag(argc, argv);
    } else if (0 == strcmp(argv[1], "compare")){
        run_compare(argc, argv);
    } else if (0 == strcmp(argv[1], "dice")){
        run_dice(argc, argv);
    } else if (0 == strcmp(argv[1], "writing")){
        run_writing(argc, argv);
    } else if (0 == strcmp(argv[1], "3d")){
        composite_3d(argv[2], argv[3], argv[4], (argc > 5) ? atof(argv[5]) : 0);
    } else if (0 == strcmp(argv[1], "test")){
        test_resize(argv[2]);
    } else if (0 == strcmp(argv[1], "captcha")){
        run_captcha(argc, argv);
    } else if (0 == strcmp(argv[1], "nightmare")){
        run_nightmare(argc, argv);
    } else if (0 == strcmp(argv[1], "rgbgr")){
        rgbgr_net(argv[2], argv[3], argv[4]);
    } else if (0 == strcmp(argv[1], "reset")){
        reset_normalize_net(argv[2], argv[3], argv[4]);
    } else if (0 == strcmp(argv[1], "denormalize")){
        denormalize_net(argv[2], argv[3], argv[4]);
    } else if (0 == strcmp(argv[1], "statistics")){
        statistics_net(argv[2], argv[3]);
    } else if (0 == strcmp(argv[1], "normalize")){
        normalize_net(argv[2], argv[3], argv[4]);
    } else if (0 == strcmp(argv[1], "rescale")){
        rescale_net(argv[2], argv[3], argv[4]);
    } else if (0 == strcmp(argv[1], "ops")){
        operations(argv[2]);
    } else if (0 == strcmp(argv[1], "speed")){
        speed(argv[2], (argc > 3 && argv[3]) ? atoi(argv[3]) : 0);
    } else if (0 == strcmp(argv[1], "oneoff")){
        oneoff(argv[2], argv[3], argv[4]);
    } else if (0 == strcmp(argv[1], "partial")){
        partial(argv[2], argv[3], argv[4], atoi(argv[5]));
    } else if (0 == strcmp(argv[1], "visualize")){
        visualize(argv[2], (argc > 3) ? argv[3] : 0);
    } else if (0 == strcmp(argv[1], "imtest")){
        test_resize(argv[2]);
    } else {
        fprintf(stderr, "Not an option: %s\n", argv[1]);
    }

YOLO fastest测试命令:

./darknet detector  test ./data/voc.data  ./Yolo-Fastest/VOC/yolo-fastest-xl.cfg  ./Yolo-Fastest/VOC/yolo-fastest-xl.weights  data/dog.jpg  -thresh 0.55

训练命令:

./darknet detector train voc.data yolo-fastest.cfg yolo-fastest.conv.109 

由于argv[1]==“detector”,所以进入的分支函数是run_detector(),并将argv参数一并传入。

在run_detector()函数内,又会根据参数argv[2]的不同选择执行不同的分支:

if (0 == strcmp(argv[2], "test")) test_detector(datacfg, cfg, weights, filename, thresh, hier_thresh, dont_show, ext_output, save_labels, outfile, letter_box, benchmark_layers);
    else if (0 == strcmp(argv[2], "train")) train_detector(datacfg, cfg, weights, gpus, ngpus, clear, dont_show, calc_map, mjpeg_port, show_imgs, benchmark_layers, chart_path);
    else if (0 == strcmp(argv[2], "valid")) validate_detector(datacfg, cfg, weights, outfile);
    else if (0 == strcmp(argv[2], "recall")) validate_detector_recall(datacfg, cfg, weights);
    else if (0 == strcmp(argv[2], "map")) validate_detector_map(datacfg, cfg, weights, thresh, iou_thresh, map_points, letter_box, NULL);
    else if (0 == strcmp(argv[2], "calc_anchors")) calc_anchors(datacfg, num_of_clusters, width, height, show);
    else if (0 == strcmp(argv[2], "draw")) {
        int it_num = 100;
        draw_object(datacfg, cfg, weights, filename, thresh, dont_show, it_num, letter_box, benchmark_layers);
    }
    else if (0 == strcmp(argv[2], "demo")) {
        list *options = read_data_cfg(datacfg);
        int classes = option_find_int(options, "classes", 20);
        char *name_list = option_find_str(options, "names", "data/names.list");
        char **names = get_labels(name_list);
        if (filename)
            if (strlen(filename) > 0)
                if (filename[strlen(filename) - 1] == 0x0d) filename[strlen(filename) - 1] = 0;
        demo(cfg, weights, thresh, hier_thresh, cam_index, filename, names, classes, avgframes, frame_skip, prefix, out_filename,
            mjpeg_port, dontdraw_bbox, json_port, dont_show, ext_output, letter_box, time_limit_sec, http_post_host, benchmark, benchmark_layers);

        free_list_contents_kvp(options);
        free_list(options);
    }
    else printf(" There isn't such command: %s", argv[2]);

当第二个参数为test时,执行test_detector(),在这个函数内部:

1.network net = parse_network_cfg_custom(cfgfile, 1, 1);

建立网络,cfgfile为模型配置文件,batch设置为1(大于0),用来表明为detection模式分配内存,同时也代表了batch的数量,time_step设置为1,解释下这个参数,darknet是一个开源深度学习框架,它不仅仅支持yolov这一系列的目标检测,同时还可以分类,分割甚至RNN,LSTM等。只是后面这些功能用的人比较少,而且time_steps是RNN中的概念,即在更新梯度时,不仅仅考虑当前的输入的一个batch,而且还考虑前面time_steps个batch,所以才在后面又对net->batch做了乘time_steps的运算。由于这里是目标检测,不用考虑以前的历史数据,所以time_steps设置为1.

2.load_weights(&net, weightfile)

对建立好的网络结构加载权重文件。

3.load_image(input, 0, 0, net.c)

读取图像input为图像地址,net.c为输入层通道数,然后根据参数,选择缩放的方式:

if(letter_box) 
        sized = letterbox_image(im, net.w, net.h);
else 
        sized = resize_image(im, net.w, net.h);
4.float *X = sized.data;
network_predict(net, X)

模型进行推理,X为输入图像数据

5.detection *dets = get_network_boxes(&net, im.w, im.h, thresh, hier_thresh, 0, 1, &nboxes, letter_box)

通过网络提取出检测到的目标的位置以及类别。

6.draw_detections_v3(im, dets, nboxes, thresh, names, alphabet, l.classes, ext_output)

将目标的位置以及类别标注在图片中。

后面还有一些保存结果及释放内存的操作,至此一个完整的推理过程结束。

解读darknet-YOLO V2代码(一) 解读darknet中的YOLO V2移植到vs2015后的代码,作者是AlexeyAB,github地址是https://github.com/AlexeyAB/darknet。 命令参数:detector demo data/voc.data yolo-voc.cfg yolo-voc.weights -c 0 程序入口:darknet.c 由382行的run_detector()进入de 阅读详情

相关推荐

darknet整体框架

darknet是使用C和CUDA编写的开源的神经网络框架,它快速且使用简单,之前在海康做caffe方面的工作,本想研究caffe的源代码,但是被导师推荐阅读darknet源代码加深对深度学习的理解而且还能巩固C语言,由此记录一下我的darknet源码阅读之路。 一、darknet安装 本记录主要是阅读源码,所以opencv gpu我就先不弄了,darknet安装非常简单,直接源码安装,在git...

zhengmingzhang的博客 1万+

内涵:目标检测之DarkNet-DarkNet源码解读<一>测试篇

目标检测-DarkNet源码解读DarkNet源码解读1.一些思考 1.1 DarkNet的本质 1.2 深度学习分为两条线 1.3 检测任务的步骤2.代码走读 2.1 程序入口 2.2 步骤1 加载网络 2.2 加载图片 2.3 前向 2.4 后处理3.一些细节 3.1 双向链表来存储网络 3.2 回调函数来模拟虚函数 3.3 分类阈值与nms操作到底是怎么操作的4.回头看 4.1 Yolov3到底是什么1.1大胆猜测1.2 小心求证1.2.1 入口函数1.2.2 核心操作1.2.2.1 加载网络2 .

4708

Windows下的darknet安装

1、下载darknet源码后,解压到文件夹: 下载链接:https://link.zhihu.com/?target=https%3A//github.com/AlexeyAB/darknet 解压后的文件夹里面的内容是: 2、打开build文件夹下的darknet文件夹,并用编辑器(推荐使用sublime,安装包在硬盘内)打开darknet.vcxproj,用搜索功能(ctrl+f)查找CUDA,修改为自己的CUDA版本号,安装CUDA和CuDNN在下一笔记中。 注意:一共...

Von12138的博客 3789

暗网:互联网冰山下的隐秘世界,你真的了解它吗?一文揭秘!

暗网是互联网匿名技术催生的一片复杂生态。它像一把锋利的双刃剑,一面是弱势群体在绝境中寻求庇护的希望之光,另一面则是犯罪者藏污纳垢的阴暗角落。对我们绝大多数人而言,深入了解其运作原理和潜在威胁,不是为了探险猎奇,而是为了筑起更坚固的数字防线。🌐 暗网是互联网需特殊工具访问的匿名隐蔽层。🧅 Tor浏览器通过"洋葱路由"实现匿名访问。⚖️ 技术中性,用途分善恶:保护隐私 vs. 非法交易温床。🛡️个人信息在暗网被交易,导致被攻击!防护是关键!🚫切勿因好奇尝试访问暗网!风险极高(法律、安全、心理)!

所有成功的背后,都是痛苦的坚持,所有的痛苦,都是傻瓜般的不放弃! 1万+

【darknet 学习笔记-01】darknet安装

下载: git clone https://github.com/pjreddie/darknet cd darknet 对darknet/example/darknet.c main()部分添加两行代码,如下所示: printf("argc = %d\n", argc); for(int i = 0; i < argc; i ++) printf("%d, %s\n", ...

CVer 706

TVM tutorials代码学习-from_darknet.py

TVM tutorials代码学习-from_darknet.py准备环境详解小结 准备环境 要运行tvm源码下tutorials/frontend/from_darknet.py代码需要额外安装cffi和cv2包 pip install cffi pip install opencv-python 详解 #导入包 import numpy as np #计算库 import matpl...

Mars_WH的专栏 1134

网络安全解析:你的数据是如何流入暗网的?

暗网是互联网的隐蔽角落,用户在此可保持匿名。人们常将其与深网(Deep Web)混淆,但二者并不相同。深网泛指所有未被搜索引擎索引的网络内容,包括电子邮件账户、私有数据库和付费服务等。这些内容并非非法,只是无法通过常规搜索引擎访问。而暗网则是深网中需要特殊软件(如Tor)才能访问的特定隐蔽区域。尽管暗网以非法活动闻名,它也为注重隐私的个人和组织(如专制政权下的记者或需要安全披露信息的举报人)提供了平台。

m0_71614285的博客 3396

YOLO-Darknet实战(一):Darknet安装与测试

最强YOLO-Darknet目标检测实战教程!

不积跬步,无以至千里! 4147

Darknet源码阅读【吐血整理,持续更新中】

Darknet源码阅读 Darknet是一个较为轻型的完全基于C与CUDA的开源深度学习框架,其主要特点就是容易安装,没有任何依赖项(OpenCV都可以不用),移植性非常好,支持CPU与GPU两种计算方式。 更多信息(包括安装、使用)可以参考:Darknet: Open Source Neural Networks in C 为什么要做这个? 我在阅读Yolo论文的时候对很多实现细节不太明白,但是...

I good vegetable a! 8783

darknet:Darknet(AB版)框架原始码解析:详细的中文注释(逐句)和原理分析!

说明 2019接近尾声,开始想扩展到一个框架。比较了多个框架,发现darknet是一个较大的轻型的完全基于C与CUDA的开源深度学习框架,没有任何依赖项(OpenCV都可以不用),移植性非常好,支持CPU与GPU两种计算方式。真正可以对神经网络的组件一探究竟,是提高自己对深度学习有效范本。 ``本人对Darknet的解读,为期接近3个月时间,从2020年8月5日到至今(10月23日),期间几乎查遍了优快云,知乎,github所有能看到关于Darknet的解读资源,这里特别感谢github上: 在此期间,也感谢那些微信上的联系人,经历他们的交流,因此让我疑惑的很多问题逐渐变得清晰起来。 由于darknet代码整个工程量还是很大的,以后,为了方便朋友们快速简单地了解darknet整个框架思想,我写了一个darknet迷你版本,整个代码只实现了所有和分类网络相关的火车部分。去除了其他seg,d

单相PWM整流器四象限运行原理

简述单相PWM整流器四象限运行原理。

m0_75208156的博客 8297

Darknet框架简介

Darknet框架简介为什么选择darknet? darknet是一个较为轻型的完全基于C与CUDA的开源深度学习框架,其主要特点就是容易安装,没有任何依赖项(OpenCV都可以不用),移植性非常好,支持CPU与GPU两种计算方式。 为什么选择darknet? 相比于TensorFlow来说,darknet并没有那么强大,但这也成了darknet的优势: darknet完全由C语言实现,没有任何依赖项,当然可以使用OpenCV,但只是用其来显示图片、为了更好的可视化; darknet支持CPU(

耶律大石的博客 2万+

大学物理第二章 质点动力学详解

大学物理第二章 质点动力学概念详解

weixin_63026364的博客 1万+

Darknet概述

优点 Darknet是一个比较小众的深度学习框架,没有社区,主要靠作者团队维护,所以推广较弱,用的人不多。而且由于维护人员有限,功能也不如tensorflow等框架那么强大,但是该框架还是有一些独有的优点: 1.易于安装:在makefile里面选择自己需要的附加项(cuda,cudnn,opencv等)直接make即可,几分钟完成安装; 2.没有任何依赖项:整个框架都用C语言进行编写,可以不依赖...

搬砖笔记 9万+

银河麒麟V10离线升级OpenSSH实战:从编译到回滚全流程

OpenSSH作为Linux系统远程登录的核心组件,其版本升级直接关系到系统安全与等保合规。在信创环境下,银河麒麟V10自带的OpenSSH版本往往无法满足漏洞扫描与安全加固要求,而离线编译升级涉及依赖处理、编译参数、服务替换与回滚方案等多个技术环节。本文围绕银河麒麟V10(x86_64)平台,详细讲解OpenSSH离线升级的完整实操流程,包括环境摸底、依赖包安装、源码编译、配置文件兼容性处理、服务重启验证以及常见问题排查,并分享批量升级与安全加固的工程经验,帮助运维人员在不断网、不重装的前提下一次成功完成

weixin_30582943的博客 383

手把手教你用Switched-Capacitor Converter实现高效DC-DC转换(附常见拓扑对比)

本文详细介绍了开关电容转换器(SC)在高效DC-DC电源设计中的应用,对比了四种常见拓扑结构的优缺点,并提供了损耗分析与效率优化的实战技巧。通过无电感设计,SC转换器在5G模块和可穿戴设备中展现出超高功率密度和微小体积的优势,是电源管理领域的革命性技术。

weixin_30790841的博客 272

Ubuntu18.04配置darknet环境实现YOLOv4目标检测(一)——配置YOLOv4环境darknet

目录 1. 概述 2.darknet配置 2.1 下载darknet 2.2 编译darknet 3.测试 3.1 测试图片 3.2 测试视频 1. 概述 YOLO官方网址:https://pjreddie.com/darknet/yolo/ 作者开源项目地址:https://github.com/pjreddie/darknet YOLOv1论文地址:https://...

linghu8812的博客 1万+

Marvell 88E6390x交换芯片:从零构建No-CPU模式网络交换系统

本文详细介绍了如何为Marvell 88E6390x以太网交换芯片构建No-CPU模式网络交换系统。通过解析其核心价值与硬件准备,并手把手指导使用CodeBlocks、IMPGUI和SwitchGUI等软件工具进行配置代码编写、镜像生成与烧录,最终实现交换芯片脱离外部CPU独立工作,适用于成本敏感、空间受限的嵌入式网络设备设计。

plant的博客 482

使用darknet训练自己的数据集以及对python接口的调用

一、使用labelimg标注自己的数据集 labelimg百度网盘链接 大概12.5M,下载完成之后可以直接点击labelImg.exe进行使用 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown ...

weixin_43871135的博客 2万+

IEEE S&P 2026 大模型安全论文整理

本文梳理了 IEEE S&P 2026(第47届 IEEE 安全与隐私研讨会)中与 LLM Safety 相关的论文,涵盖大模型越狱攻击、防御与对齐、隐私保护、RAG 安全、多模态大模型安全、智能体安全、图-LLM 安全、工具链安全及生成式 AI 安全与隐私等方向。

CSPhD-winston的博客 1330

【系统架构设计师-2024下半年真题】案例分析-参考答案及部分详解(完整回忆版)

根据h中描述,为了保证高可靠性,有ping/echo,心跳机制两种策略,从资源利用率问为啥心跳更好。王工觉得使用ping/echo好,但李工觉得从系统资源利用率来说,使用心跳机制好 1、针对质量属性可以使用ping/echo和心跳模式实现,分别简述ping/echo和心跳的实现原理。 2、张工认为心跳策略比较适合,简述为什么?

数据知道的博客 1万+

darknet训练完成后批量测试图片

darknet训练完成后批量测试图片 参考博客https://blog.youkuaiyun.com/fqlovetb/article/details/84393806 darknet训练自己的数据集,以及训练完成后对单张图片的检测见如下地址https://blog.youkuaiyun.com/qq_38915710/article/details/97112788 下面介绍darknet批量测试图片并保存在自己...

如云漂泊的博客 5139

基于Simulink的BCH码编解码仿真建模示例

BCH码是一类循环码,能够纠正一定数量的随机错误。灵活性:可以根据需要选择不同的码长和纠错能力。高效性:适用于短码长和中等码长的场景,广泛用于卫星通信、存储系统等。实现简单:编码和解码过程可以通过硬件或软件高效实现。在本示例中,我们将使用MATLAB/Simulink中的和模块来完成BCH码的编解码操作,并通过仿真验证其误码率(BER)性能。通过本指南,我们介绍了如何基于Simulink搭建一个BCH码的编解码模型,并进行了仿真以验证其性能。背景介绍:理解BCH码的基本原理及其在通信系统中的应用。

xiaoheshang_123的博客 188

darknet 源码阅读

BBuf/Darknet: AlexeyAB-DarkNet源码解析 (github.com) 1. 依赖 1.1 环境要求 window系统或者linux系统。 CMake版本高于3.8。 CUDA 10.0,cuDNN>=7.0。 OpenCV版本高于2.4。 Linux下需要GCC 或者Clang, Window下需要Visual Studio 15、17或19版。 1.2 数据集获取 MS COCO数据集: 使用./scripits/get_coco_dataset.sh来获取

u010451780的专栏 1118

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Darknet框架3:YOLOV4-Darknet环境搭建以及测试coco2017的mAP,FPS!

文章目录一. YOLOV4网络结构二. YOLOV4环境搭建 一. YOLOV4网络结构 YOLOV3 Homepage 目标检测算法YOLOV3之Keras实现-转 推荐:AlexeyAB/darknet yolov3训练自己的数据集——第一次实操完整记录(推荐!) YOLOv4网络结构图如下: 二. YOLOV4环境搭建 1. 本机的软硬件环境! Ubuntu18.04 CUDA-version: 10010 (10020), cuDNN: 7.6.4, OpenCV v

AI新视界 6587

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

[darknet源码系列-1] darknet源码中的常见数据结构

[darknet源码系列-1] darknet源码中的常见数据结构 FesianXu 20201117 at UESTC 前言 最近笔者在好奇如何从最底层开始搭建一个深度学习系统,之前都是采用现成的成熟深度学习框架,比如PyTorch,TensorFlow等进行模型的搭建,对底层原理了解不是特别深刻。因此笔者最近在阅读darknet的源码,希望能从中学习到一些底层的知识,本文主要是对darknet中常见的数据结构进行记录和分析。如有谬误请联系指出,转载请联系作者并注明出处,谢谢。 ∇...

机器学习杂货铺1号店 1473

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: Python2环境 安装cv2/opencv-python出错
下一篇: YOLO fastest输出日志的理解
GeneralJing
博客等级 码龄15年 17粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值