AlexeyAB DarkNet数据结构解析
基础数据结构为了解析网络配置参数,DarkNet 中定义了三个关键的数据结构类型。list类型变量保存所有的网络参数, section类型变量保存的是网络中每一层的网络类型和参数, 其中的参数又是使用list类型来表示。kvp键值对类型用来保存解析后的参数变量和参数值。 list类型定义在src/list.h中,代码如下: 12345678910111213// 链表上的节点typedef struct node{ void *val; struct node *next; struct node *prev;} node;//双向链表typedef struct list{ int size; //list的所有节点个数 node *front; //list的首节点 node *back; //list的普通节点} list; section 类型定义在src/parser.c文件中,代码如下: 12345// 定义sectiontypedef struct{ char *type; ...
AlexeyAB DarkNet框架总览
Darknet框架分析主线分析主线的确定Darknet相比当前训练的C/C++主流框架(如Caffe)来讲,具有编译速度快,依赖少,易部署等众多优点,我们先定位到src/darknet.c里面的main函数,这是这个框架实现分类,定位,回归,分割等功能的初始入口。这一节的核心代码如下,注意一下就是run_yolo只提供了yolo目标检测算法的原始实现。而run_detector函数提供了AlexeyAB添加了各种新特性的目标检测算法,所以之后我们会从这个函数跟进去来解析Darknet框架。Darknet提供的其他功能如run_super(高分辨率重建),run_classifier(图像分类),run_char_rnn(RNN文本识别)有兴趣可以自己去读(这个框架用来做目标检测比较好,其他算法建议还是去其它框架实现吧),本系列只讲目标检测。 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666 ...
AlexeyAB版Darknet使用教程
前言自从Joseph Redmon提出了yolov3后,其darknet仓库已经获得了16k的star,足以说明darknet的流行。该作者最新一次更新也是一年前了,没有继续维护。不过自来自俄国的大神AlexeyAB在不断地更新darknet, 不仅添加了darknet在window下的适配,而且实现了多种SOTA目标检测算法。AlexeyAB也在库中提供了一份详细的建议,从编译、配置、涉及网络到测量指标等,一应俱全。通过阅读和理解AlexeyAB的建议,可以为我们带来很多启发。本文是来自翻译AlexeyAB的darknet中的README。 下图是CSPNet中统计的目前的State of the Art的目标检测模型。其中csresnext50-panet-spp-optimal模型是CSPNet中提出来的,结合AlexeyAB版本的Darknet就可以实现。 1. 依赖1.1 环境要求 window系统或者linux系统。 CMake版本高于3.8。 CUDA 10.0,cuDNN>=7.0。 OpenCV版本高于2.4。 Linux下需要GCC 或者Clang, Win ...
ECCV 2018 Convolutional Block Attention Module
前言目前cv领域借鉴了nlp领域的attention机制以后生产出了很多有用的基于attention机制的论文,attention机制也是在2019年论文中非常火。这篇cbam虽然是在2018年提出的,但是其影响力比较深远,在很多领域都用到了该模块,所以一起来看一下这个模块有什么独到之处,并学着实现它。 什么是注意力机制?注意力机制(Attention Mechanism)是机器学习中的一种数据处理方法,广泛应用在自然语言处理、图像识别及语音识别等各种不同类型的机器学习任务中。 通俗来讲:注意力机制就是希望网络能够自动学出来图片或者文字序列中的需要注意的地方。比如人眼在看一幅画的时候,不会将注意力平等地分配给画中的所有像素,而是将更多注意力分配给人们关注的地方。 从实现的角度来讲:注意力机制通过神经网络的操作生成一个掩码mask,,mask上的值一个打分,评价当前需要关注的点的评分。 注意力机制可以分为: 通道注意力机制:对通道生成掩码mask,进行打分,代表是SENet, Channel Attention Module 空间注意力机制:对空间进行掩码的生成,进行打分,代表是Spa ...
最简单最易实现的SE模块
Squeeze-and-Excitation NetworksSENet是Squeeze-and-Excitation Networks的简称,拿到了ImageNet2017分类比赛冠军,其效果得到了认可,其提出的SE模块思想简单,易于实现,并且很容易可以加载到现有的网络模型框架中。SENet主要是学习了channel之间的相关性,筛选出了针对通道的注意力,稍微增加了一点计算量,但是效果比较好。 通过上图可以理解他的实现过程,通过对卷积的到的feature map进行处理,得到一个和通道数一样的一维向量作为每个通道的评价分数,然后将修改的分数分别施加到对应的通道上,得到其结果,就在原有的基础上只添加了一个模块,下边我们用pytorch实现这个很简单的模块。 12345678910111213141516class SELayer(nn.Module): def __init__(self, channel, reduction=16): super(SELayer, self).__init__() self.avg_pool = nn.Ada ...
Windows如何通过VNC从远程控制Ubuntu
简介VNC 工具是提供你一个可以远程图像化桌面的方式。其实 VNC 是一种软件的统称。只要你的 Linux 架设好了一个服务器 (Server) 的 VNC,客户端比如你的 Mac,手机,只要安装任何一种 VNC 客户端软件就能链接上服务器端的电脑。 Ubuntu服务端安装打开 Terminal,输入:1sudo apt-get install x11vnc确认你的 Linux 用户密码,就能安装这个最常用的 x11vnc 软件。这个软件的使用,设置非常简单。安装好后,最好给你的 x11vnc 设置一个用于连接的密码,输入1x11vnc -storepasswd会出现以下画面,设置你的密码:1234Enter VNC password:Verify password:Write password to /home/morvan/.vnc/passwd? [y]/n yPassword written to: /home/morvan/.vnc/passwd开启服务:1x11vnc -auth guess -once -loop -noxdamage -repeat -rfbauth ...
在YOLOv3模型中添加Attention机制
1. 规定格式正如[convolutional],[maxpool],[net],[route]等层在cfg中的定义一样,我们再添加全新的模块的时候,要规定一下cfg的格式。做出以下规定: 在SE模块中,有一个参数为reduction,这个参数默认是16,所以在这个模块中的详细参数我们按照以下内容进行设置: 12[se]reduction=16 在CBAM模块中,空间注意力机制和通道注意力机制中一共存在两个参数:ratio和kernel_size, 所以这样规定CBAM在cfg文件中的格式: 123[cbam]ratio=16kernelsize=7 2. 修改解析部分由于添加的这些参数都是自定义的,所以需要修改解析cfg文件的函数,之前讲过,需要修改parse_config.py中的部分内容: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051def parse_model_cfg(path): # path参数为: cfg/yolov3-ti ...
YOLOv3模型构建中的YOLOLayer
1. Grid创建YOLOv3是一个单阶段的目标检测器,将目标划分为不同的grid,每个grid分配3个anchor作为先验框来进行匹配。首先读一下代码中关于grid创建的部分。 首先了解一下pytorch中的API:torch.mershgrid 举一个简单的例子就比较清楚了: 12345678910111213141516171819Python 3.7.3 (default, Apr 24 2019, 15:29:51) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32Type "help", "copyright", "credits" or "license" for more information.>>> import torch>>> a = torch.arange(3)>>> b = torch.arange(5)>>> x,y = torch.meshgr ...
YOLOv3网络模型的构建
1. cfg文件在YOLOv3中,修改网络结构很容易,只需要修改cfg文件即可。目前,cfg文件支持convolutional, maxpool, unsample, route, shortcut, yolo这几个层。 而且作者也提供了多个cfg文件来进行网络构建,比如:yolov3.cfg、yolov3-tiny.cfg、yolov3-spp.cfg、csresnext50-panet-spp.cfg文件(提供的yolov3-spp-pan-scale.cfg文件,在代码级别还没有提供支持)。 如果想要添加自定义的模块也很方便,比如说注意力机制模块、空洞卷积等,都可以简单地得到添加或者修改。 为了更加方便的理解cfg文件网络是如何构建的,在这里推荐一个Github上的网络结构可视化软件:Netron,下图是可视化yolov3-tiny的结果: 2. 网络模型构建从train.py文件入手,其中涉及的网络构建的代码为: 12# Initialize modelmodel = Darknet(cfg, arc=opt.arc).to(device) 然后沿着Darknet实现进行讲解 ...
使用frp服务实现对内网机器的远程连接
为何要用我们并不是每天都会接触到实验室内网环境。当不在学校时,如何访问内网的资源成了一个头疼的问题。本文旨在提出一种内网穿透解决方案,在外网环境下优雅的访问到内网的任何端口。即使身离学校也可以方便的修改内网模型,访问内网计算资源。 特殊需要 一台公网机(有公网ip的vps, 比如阿里云服务器) frp 端口转发软件 :下载地址 安装windows不用说,这里讲Ubuntu的安装 选择相应版本,右键复制链接 打开终端,输入wget 复制的链接地址即可开始下载 下载完成后,找到安装包,解压即可,解压命令为tar -zxvf 包名 公网机、内网机都需要安装,且frp版本要一致。 配置公网机配置修改 frps.ini 文件,这里使用了最简化的配置: 123# frps.ini[common]bind_port = 7000 #这个端口代表内网机连到公网所需端口,默认7000,可自己定义 Windows 启动 frps: 1./frps.exe -c ./frps.ini Ubuntu 启动 frps: 1./frps -c ./frps.ini Ubuntu 在后台开启运行 frp ...