目录

相对于一些早期的检测网络,比如faster-Rcnn来说,网络的架构一般分为,图像输入模块,backbone主干网络,Neck颈部模块,检测头Dense Prediction检测模块。
backbone主干网络一般由:VGG16,Resnet50,ResneXt101,Darknet53等网络构成。
Neck颈部模块一般是一些:FPN,PANet,Bi-FPN等功能块组成,一般实现的功能基础都是上采样。
但是在Yolov5中,作者没有单独给出Neck颈部模块, 而是打包一起放在了头部模块。 Yolov5的主干网络主要是由Focus,BottleneckCSP,SPP功能模块构成。 头部网络主要是由PANet+Detect(也就是Yolov3/v4的原头部网络)构成。
下载地址:https://github.com/ultralytics/yolov5

可以看到在models文件夹下有一堆.yaml文件,这个就是yolov5的网络架构参数文件,有不同的版本,大体的框架是一样的,这里由yolov5s版本举例。先看代码
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# Parameters
nc: 80 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# YOLOv5 v6.0 backbone
backbone:
# [from, number, module, args]
[[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, C3, [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 6, C3, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, C3, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 3, C3, [1024]],
[-1, 1, SPPF, [1024, 5]], # 9
]
# YOLOv5 v6.0 head
head:
[[-1, 1, Conv, [512, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 3, C3, [512, False]], # 13
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]], # cat backbone P3
[-1, 3, C3, [256, False]], # 17 (P3/8-small)
[-1, 1, Conv, [256, 3, 2]],
[[-1, 14], 1, Concat, [1]], # cat head P4
[-1, 3, C3, [512, False]], # 20 (P4/16-medium)
[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 3, C3, [1024, False]], # 23 (P5/32-large)
[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
代码由4部分组成,最上面的控制参数,anchors先验框的配置,backbone主干网络设置,head头部网络设置。
# Parameters
nc: 80 # number of classes 类别数
depth_multiple: 0.33 # model depth multiple 控制模型的深度(BottleneckCSP数)
width_multiple: 0.50 # layer channel multiple 控制conv通道个数 (卷积核数量)
# depth_multiple表示BottleneckCSP模块的层缩放因子,将所有的BottleneckCSP模块的Bottleneck乘上该参数得到最终的个数
# width_multiple表示卷积通道的缩放因子,就是将配置里面的backbone和head部分有关conv通道设置,全部乘以该系数
# 通过这两个参数就可以实现不同复杂度的模型设计。
anchors:
- [10,13, 16,30, 33,23] # P3/8 8倍下采样的层面 [宽度,高度]
- [30,61, 62,45, 59,119] # P4/16 16倍下采样的层面
- [116,90, 156,198, 373,326] # P5/32 32倍下采样的层面
backbone:
# [from, number, module, args]
# from:当前模块输入来自哪一层,-1表示上一层输入
# number:本模块重复次数,1表示只有一个,3表示有3个相同的模块
# conv卷积层 C3:BottleneckCSP SPPF:SPP模块
[[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4 128表示有128个卷积核,3表示3×3的卷积核,2步长为2
[-1, 3, C3, [128]], # 这里的重复次数,要乘上一开始的缩放因子
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 6, C3, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, C3, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 3, C3, [1024]],
[-1, 1, SPPF, [1024, 5]], # 9
]
# 作者没有区分neck模块, 所以里面包含了PANet + Detect部分
head:
[[-1, 1, Conv, [512, 1, 1]], # 卷积层
[-1, 1, nn.Upsample, [None, 2, 'nearest']], # 上采样
[[-1, 6], 1, Concat, [1]], # cat backbone P4 拼接层
[-1, 3, C3, [512, False]], # 13 这里的重复次数,要乘上一开始的缩放因子
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]], # cat backbone P3
[-1, 3, C3, [256, False]], # 17 (P3/8-small)
[-1, 1, Conv, [256, 3, 2]],
[[-1, 14], 1, Concat, [1]], # cat head P4
[-1, 3, C3, [512, False]], # 20 (P4/16-medium)
[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 3, C3, [1024, False]], # 23 (P5/32-large)
[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
这里需要注意的是这两个参数depth_multiple用于控制模型的深度(BottleneckCSP数),width_multiple用于控制conv通道个数 (卷积核数量)。只要牵涉到CSP操作和conv操作的时候就要用该参数,去乘上重复次数,已达到对模型深度的控制。
# yolov5l版本
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel multiple
# yolov5m版本
depth_multiple: 0.67 # model depth multiple
width_multiple: 0.75 # layer channel multiple
# yolov5n版本
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.25 # layer channel multiple
# yolov5s版本
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
# yolov5x版本
depth_multiple: 1.33 # model depth multiple
width_multiple: 1.25 # layer channel multiple
这里可以看出,官方提供的不同版本的主要区别就是模型深度的不同,不同深度的模型,计算量也不一样,有的多,有的少。对于不同的场景,所需要的模型计算量是不一样的,也不是越深的模型越好,视情况而定,杀鸡焉用牛刀。
| Yolov5s | Yolov5m | Yolov5L | Yolov5x | |
| depth_multiple | 0.33 | 0.67 | 1.0 | 1.33 |
| width_multiple | 0.5 | 0.75 | 1.0 | 1.25 |
| BottleneckCSP数(BCSP True) | 1,3,3 | 2,6,6 | 3,9,9 | 4,12,12 |
| BottleneckCSP数(BCSP False) | 1 | 2 | 3 | 4 |
| Conv卷积核数量 | 32,64,128,256,512 | 48,96,192,384,768 | 64,128,256,512,1024 | 80,160,320,640,1280 |

我们可以看到图像最先输入进去之后进行了一个Focus处理。
这个操作就是把数据先切分成4分,每份数据就相当于下采样两倍得到,然后在channel维度进行拼接,然后再进行卷积操作。

就相当于图像的数据没有什么变动,但是多了4倍的数据量。大大提高了原始数据量。这个原理相当于这个视频。
神奇!一张狗狗照片,裁碎竟变四张_哔哩哔哩_bilibili
将细节更好的显现出来。


上图非常清晰的表现出,整个池化的过程。但是在第一次卷积的过程中会因为使用的卷积核大小不一样,导致没办法进行张量的拼接。作者直接采用了填充的方式硬生生的拼了上去。
参考:
深入浅出Yolo系列之Yolov5核心基础知识完整讲解 - 知乎
【目标检测新手首选】PyTorch从零带你搭建YOLOV5目标检测平台!-人工智能/计算机视觉/深度学习_哔哩哔哩_bilibili
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails
是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案
我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT
深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG
(本文是网络的宏观的概念铺垫)目录计算机网络背景网络发展认识"协议"网络协议初识协议分层OSI七层模型TCP/IP五层(或四层)模型报头以太网碰撞路由器IP地址和MAC地址IP地址与MAC地址总结IP地址MAC地址计算机网络背景网络发展 是最开始先有的计算机,计算机后来因为多项技术的水平升高,逐渐的计算机变的小型化、高效化。后来因为计算机其本身的计算能力比较的快速:独立模式:计算机之间相互独立。 如:有三个人,每个人做的不同的事物,但是是需要协作的完成。 而这三个人所做的事是需要进行协作的,然而刚开始因为每一台计算机之间都是互相独立的。所以前面的人处理完了就需要将数据
安全产品安全网关类防火墙Firewall防火墙防火墙主要用于边界安全防护的权限控制和安全域的划分。防火墙•信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。防火墙是一个由软件和硬件设备组合而成,在内外网之间、专网与公网之间的界面上构成的保护屏障。下一代防火墙•下一代防火墙,NextGenerationFirewall,简称NGFirewall,是一款可以全面应对应用层威胁的高性能防火墙,提供网络层应用层一体化安全防护。生产厂家•联想网御、CheckPoint、深信服、网康、天融信、华为、H3C等防火墙部署部署于内、外网编辑额,用于权限访问控制和安全域划分。UTM统一威胁管理(Un
Linux操作系统——网络配置与SSH远程安装完VMware与系统后,需要进行网络配置。第一个目标为进行SSH连接,可以从本机到VMware进行文件传送,首先需要进行网络配置。1.下载远程软件首先需要先下载安装一款远程软件:FinalShell或者xhell7FinalShellxhell7FinalShell下载:Windows下载http://www.hostbuf.com/downloads/finalshell_install.exemacOS下载http://www.hostbuf.com/downloads/finalshell_install.pkg2.配置CentOS网络安装好
在神经网络方面,我完全是个初学者。我整天都在与ruby-fann和ai4r搏斗,不幸的是我没有任何东西可以展示,所以我想我会来到StackOverflow并询问这里的知识渊博的人。我有一组样本——每天都有一个数据点,但它们不符合我能够找出的任何明确模式(我尝试了几次回归)。不过,我认为看看是否有任何方法可以仅从日期预测future的数据会很好,而且我认为神经网络将是生成希望表达这种关系的函数的好方法.日期是DateTime对象,数据点是十进制数,例如7.68。我一直在将DateTime对象转换为float,然后除以10,000,000,000得到一个介于0和1之间的数字,我一直在将