Faster-RCNN
前言我们知道RCNN和Fast-RCNN都是双阶段的算法,依赖于候选框搜索算法。而搜索算法是很慢的,这就导致这两个算法不能实时。基于这个重大缺点,Faster-RCNN算法问世。 贡献Fast-RCNN仍依赖于搜索候选框方法,其中以Selective Search为主。在Fast-RCNN给出的时间测试结果中,一张图片需要2.3s的前向推理时间,其中2s用于生成2000个ROI。可以看到整个算法的时间消耗几乎都在区域候选框搜索这个步骤了,如果我们能去掉候选框搜索这个过程是不是实时有希望了?Faster-RCNN就干了这件事,论文提出在内部使用深层网络代替候选区域。新的候选区域网络(RPN)在生成ROI的效率大大提升,一张图片只需要10毫秒!!! 网络结构Faster-RCNN的网络结构如下图表示: 我们可以发现除了添加一个RPN网络之外,其他地方和Fast-RCNN是完全一致的。引用知乎上看到的一张更详细的网络结构如下: RPN网络RPN网络将第一个卷积网络(backbone,如VGG16,ResNet)的输出特征图作为输入。它在特征图上滑动一个$3 \times 3$的卷积核, ...
YOLOV1损失函数代码详解(detection_layer.c)
前言灵魂拷问,你真的懂YOLOV1的损失函数吗?进一步,懂了损失函数,你清楚它的反向求导过程吗?为了解决这俩问题,本文就结合DarkNet中的YOLOV1的损失函数代码实现(在src/detection_layer.c中)来帮助你理解。 损失函数公式YOLOV1的损失函数就是这样,不做过多解释了。需要注意的一个点是,在反向传播求导的时候,各个变量的梯度其实应该都有一个系数2的,但是代码中全部都省掉了,这对整个优化过程其实是没有影响的。 代码详细解析123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 ...
Windows下VSCode使用SSH连接报Bad owner or permissions on C:\\Users\\Administrator/.ssh/config错误问题解决
问题描述在 Windows 系统下的 VSCode 安装 Remote - SSH 扩展后,使用扩展配置 SSH 并进行远程连接,可能会发生 Bad owner or permissions on C:\Users\Administrator/.ssh/config 错误,造成无法进行 SSH 远程连接的问题。 原因是由于使用 Remote - SSH 扩展所依赖的 Remote - SSH: Editing Configuration Files 扩展编辑了 C:\Users\Administrator.ssh\config 文件后,此文件的权限发生了改变: 如上图所示,编辑了 %USER_HOME%.ssh\config 文件后,不但在 VSCode 中由于配置文件权限问题而无法进行 SSH 远程连接,就连使用系统的 PowerShell 进行 SSH 连接时也会报此错误,而把此配置文件删除后,使用 PowerShell 即可正常进行远程连接。但 VSCode 的 SSH 连接又依赖此配置文件,所以就产生了冲突,要么只有 PowerShell 能用,要么就都不能用。 解决方法方 ...
Fast RCNN
前言我们知道RCNN需要把每一个可能有目标的候选框搜索出来,然后把每个候选框传入CNN提取特征,每一张图片要产生大约2K个候选框,而每个框对应的图像都要传入CNN,这个时间开销肯定是很难承受的。基于RCNN这个致命问题,Fast-RCNN出现了。 算法介绍Fast-RCNN是在SPPNet和RCNN的基础上进行改进的。SPPNet的主要贡献是在整张图像上计算全局特征图,然后对于特定的proposal,只需要在全局特征图上取出对应坐标的特征图就可以了。但SPPNet仍然需要将特征保存在磁盘中,速度还是很慢。结合RCNN的思想,论文提出直接将候选框区域应用于特征图,并使用ROI Pooling将其转化为固定大小的特征图,最后再连接两个并行的分类头和回归头完成检测任务。整个算法可以用下面的图来表示: 贡献&创新点 Fast-RCNN 只对整个图像进行一次特征提取,避免R-CNN的上千次特征提取。 使用ROI Pooling层替换最后一层的Max Pooling层,巧妙避免RCNN中的将每个候选框Resize到固定大小的操作。 Fast RCNN在网络的尾部采用并行的全连接层,可同时 ...
RCNN
背景介绍什么是目标检测所谓目标检测就是在一张图像中找到我们关注的目标,并确定它的类别和位置,这是计算机视觉领域最核心的问题之一。由于各类目标不同的外观,颜色,大小以及在成像时光照,遮挡等具有挑战性的问题,目标检测一直处于不断的优化和研究中。 目标检测算法分类 这张甘特图已经说明了目标检测算法主要分为两类,即: Two Stage目标检测算法。这类算法都是先进行区域候选框生成,就是找到一个可能包含物体的预选框,再通过卷积神经网络进行分类和回归修正,常见算法有R-CNN,SPP-Net,Fast-RCNN,Faster-RCNN和R-FCN等。 One Stage目标检测算法。这类算法不使用候选框生成,直接在网络中提取特征来预测物体的分类和位置。常见的One-Stage算法有:YOLO系列,SSD,RetinaNet。 RCNN算法贡献RCNN是第一个使用卷积神经网络来对目标候选框提取特征的目标检测算法。同时,RCNN使用了微调(finetune)的技术,使用大数据集上训练好的分类模型的前几层做backbone,进行更有效的特征提取。 RCNN总览看下图: 首先,R-CNN是将传统图像 ...
AlexeyAB DarkNet卷积层的反向传播解析
前言前面已经详细讲解了卷积层的前向传播过程,大致思路就是使用im2col方法对数据进行重排,然后利用sgemm算法计算出结果,反向传播实际上就是前向传播的逆过程,我们一起来分析一下源码吧。 反向传播解析 首先调用gradient_array()计算当前层l所有输出元素关于加权输入的导数值(也即激活函数关于输入的导数值),并乘上上一次调用backward_convolutional_layer()还没计算完的l.delta,得到当前层最终的敏感度图。这部分的代码如下:1234567891011121314151617181920212223/*** 计算激活函数对加权输入的导数,并乘以delta,得到当前层最终的delta(敏感度图)** 输入:x 当前层的所有输出(维度为l.batch * l.out_c * l.out_w * l.out_h)** n l.output的维度,即为l.batch * l.out_c * l.out_w * l.out_h(包含整个batch的)** ACTIVATION 激活函数类型** delta ...
Ubuntu配置v2ray详细教程
简介🌟Linux/Windows/macOS 跨平台 v2ray GUI 🔨 使用 c++ 编写,支持订阅,扫描二维码,支持自定义路由编辑 🌟。使用 Qt 框架的跨平台 v2ray 客户端。支持 Windows, Linux, macOS。 安装 下载V2ray客户端,这里以最简单的AppImage文件为例,下载链接:https://github.com/Qv2ray/Qv2ray/releases/download/v1.99.6/Qv2ray-refs.tags.v1.99.6-linux.AppImage或者打开网站:https://github.com/Qv2ray/Qv2ray/releases/tag/v1.99.6 选择下图文件注意:建议下载1.99.6及以上版本,其它版本可能出现找不到openssl库。 下载核心文件,下载链接:https://github.com/v2ray/v2ray-core/releases/download/v4.22.1/v2ray-linux-64.zip或者打开网站:https://github.com/v2ray/v2ray-c ...
AlexeyAB DarkNet卷积层的前向传播解析
前言今天来介绍一下DarkNet中卷积层的前向传播和反向传播的实现,卷积层是卷积神经网络中的核心组件,了解它的底层代码实现对我们理解卷积神经网络以及优化卷积神经网络都有一些帮助。 卷积层的构造卷积层的构造主要在src/convolutional_layer.c中的make_convolutional_layer中进行实现,下面给出部分核心代码。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126/*** batch 每个batch含有的图片数** step** h 图像高度(行数)** w 图像宽度(列数 ...
AlexeyAB DarkNet网络的前向和反向传播介绍以及layer的详细解析
前言前面我们已经成功的获取了目标检测的网络结构(cfg文件的内容),并将网络保存在了一个network结构体中,然后我们还分析了数据加载方式。现在数据和网络结构都有了,接下来就是开始训练/测试的过程了,这个过程主要调用的是network的前向传播和反向传播函数,而network的前向传播和反向传播又可以细分为每一个layer的前向传播和反向传播,今天我们来看一下网络的前向传播和反向传播以及layer是如何定义的。 网络的前向传播和反向传播网络的前向传播函数在src/network.c中实现,代码如下: 123456789101112131415161718192021222324252627282930/*** 前向计算网络net每一层的输出** state用来标记当前网络的状态,** 遍历net的每一层网络,从第0层到最后一层,逐层计算每层的输出*/void forward_network(network net, network_state state){ // 网络的工作空间, 指的是所有层中占用运算空间最大的那个层的 workspace_size, // 因为实 ...
AlexeyAB DarkNet加载数据进行训练
前言之前讲了DarkNet的底层数据结构,并且将网络配置文件进行了解析存放到了一个network结构体中,那么我们就要来看一下Darknet是如何加载数据进行训练的。 加载训练数据DarkNet的数据加载函数load_data()在src/data.c中实现(src/detector.c函数中的train_detector直接调用这个函数加载数据)。load_data()函数调用流程如下:load_data(args)->load_threads()->load_data_in_threads()->load_thread()->load_data_detection(),前四个函数都是在对线程的调用进行封装。最底层的数据加载任务由load_data_detection()函数完成。所有的数据(图片数据和标注信息数据)加载完成之后再拼接到一个大的数组中。在DarkNet中,图片的存储形式是一个行向量,向量长度为h*w*3。同时图片被归一化到[0, 1]之间。 load_threads()完成线程分配和数据拼接load_threads在src/data.c中实现, ...