早就出了  不过还不是官方的呀 只是搬运过来 都说比v5这好那好 其实... 我是没太感觉多大提升 大佬们原谅小弟无知和搬运啊~~  一切为了自我提高

最新最快的实时检测框架~~ 大伙去体会~~ 7月份出的~~

论文地址:https://arxiv.org/pdf/2207.02696.pdf

代码地址:https://github.com/WongKinYiu/yolov7

Yolov7_json

在5 FPS到160 FPS范围内的速度和精度达到了新的高度,并在GPU V100上具有30 FPS或更高的所有已知实时目标检测器中具有最高的精度56.8%AP。YOLOv7-E6目标检测器(56 FPS V100,55.9% AP)比基于Transform的检测器SWINL Cascade-Mask R-CNN(9.2 FPS A100,53.9% AP)的速度和准确度分别高出509%和2%,以及基于卷积的检测器ConvNeXt-XL Cascade-Mask R-CNN (8.6 FPS A100, 55.2% AP) 速度提高551%,准确率提高0.7%。

Yolov7_json_02

 以及YOLOv7的表现优于:YOLOR、YOLOX、Scaled-YOLOv4、YOLOv5、DETR、Deformable DETR , DINO-5scale-R50, ViT-Adapter-B和许多其他目标检测器在速度和准确度上。

此外,研究者只在MS COCO数据集上从头开始训练YOLOv7,而不使用任何其他数据集或预训练的权重。

Yolov7_目标检测_03

02

背景

最近,模型重参数化(model re-parameterization)和动态标签分配(dynamic label assignment)已成为网络训练和目标检测的重要课题。主要是在上述新概念提出之后,目标检测器的训练演变出了很多新的问题。

在今天分享中,研究者将介绍其发现的一些新问题,并设计解决这些问题的有效方法。对于模型重参数化,研究者用梯度传播路径的概念分析了适用于不同网络层的模型重参数化策略,并提出了有计划的重参数化模型。

此外,当发现使用动态标签分配技术时,具有多个输出层的模型的训练会产生新的问题。即:“如何为不同分支的输出分配动态目标?” 针对这个问题,研究者提出了一种新的标签分配方法,称为从粗到细的引导式标签分配。

03

新框架详细分析

扩展的高效层聚合网络

扩展的高效层聚合网络。 提出的扩展ELAN(E-ELAN)完全没有改变原有架构的梯度传输路径,而是使用组卷积来增加添加特征的基数,并以shuffle和merge cardinality的方式组合不同组的特征 . 这种操作方式可以增强不同特征图学习到的特征,提高参数的使用和计算。

Yolov7_目标检测_04

 在大多数关于设计高效架构的文献中,主要考虑因素不超过参数的数量、计算量和计算密度。有人从内存访问成本的特点出发,分析了输入/输出通道比、架构的分支数量以及element-wise操作对网络推理速度的影响。有些人在执行模型缩放时还考虑了激活,即更多地考虑卷积层输出张量中的元素数量。

基于concatenate模型的模型缩放

模型缩放的主要目的是调整模型的一些属性,生成不同尺度的模型,以满足不同推理速度的需求。

例如EfficientNet的缩放模型考虑了宽度、深度和分辨率。对于Scale-yolov4,其缩放模型是调整阶段数。有些研究者分析了卷积和群卷积对参数量和计算量的影响,并据此设计了相应的模型缩放方法。

Yolov7_深度学习_05

 基于串联模型的模型缩放。从(a)到(b),我们观察到当在基于串联的模型上执行深度缩放时,计算块的输出宽度也会增加。这种现象会导致后续传输层的输入宽度增加。因此,研究者提出(c),即在对基于concatenation的模型进行模型缩放时,只需要对计算块中的深度进行缩放,其余传输层进行相应的宽度缩放。

Planned re-parameterized convolution

尽管RepConv在VGG基础上取得了优异的性能,但当将它直接应用于ResNet、DenseNet和其他架构时,它的精度将显著降低。作者使用梯度流传播路径来分析重参数化的卷积应该如何与不同的网络相结合。作者还相应地设计了计划中的重参数化的卷积。

RepConv实际上结合了3×3卷积,1×1卷积,和在一个卷积层中的id连接。通过分析RepConv与不同架构的组合及其性能,作者发现RepConv中的id连接破坏了ResNet中的残差和DenseNet中的连接,为不同的特征图提供了更多的梯度多样性。

Yolov7_深度学习_06

提出的重参数化模型。在提出的计划重参数化模型中,我们发现一个带有残差或串联连接的层,其RepConv不应该有恒等连接。在这些情况下,它可以被不包含身份连接的 RepConvN 替换。

Coarse for auxiliary and fine for lead loss

Coarse for auxiliary and fine for lead head label assigner

与正常模型(a)相比,(b)中的模式具有辅助中心。与通常的独立标签分配器 (c) 不同,研究者提出 (d) 引导头引导标签分配器和 (e) 粗到细引导头引导标签分配器。所提出的标签分配器通过前导头预测和GT实况进行优化,以同时获得训练前导头和辅助头的标签。详细的从粗到细的实现方法和约束设计细节将在附录中详述。

04

实验及可视化

Yolov7_目标检测_07

如上表所述:

  • 与YOLOv4相比,YOLOv7的参数减少了75%,计算量减少了36%,AP提高了1.5%
  • 与最先进的YOLOR-CSP相比,YOLOv7的参数少了43% ,计算量少了15%,AP高了0.4%
  • 在小模型的性能中,与YOLOv4-tiny相比,YOLOv7-Tiny减少了39%的参数量和49%的计算量,但保持相同的AP
  • 在云GPU模型上,YOLOv7模型仍然具有更高的AP,同时减少了19%的参数量和33%的计算量

将所提出的方法与通用GPU上或边缘GPU上最先进的的目标检测器进行了比较,结果如下表所示:

Yolov7_json_08

Yolov7_深度学习_09

 

Yolov7_深度学习_10

  #下面在说一下 搭建与实践~

搭建环境,这里直接用conda按照源码requirements.txt安装就行。

  • 数据准备

现成数据(VisDrone)+配置脚本(yolov7.yaml等):

数据集:官方的VisDrone格式和yolov5的不同,要转换一下

制作自己数据集(lableme标注自己图片+labelme转yolo的脚本):

强烈建议用labelme

labelme格式标注完就是一张图对应一个json:

Yolov7_缩放_11

yolo格式是一个图对应一个txt:

Yolov7_深度学习_12

 

我是把转化完的txt和json都同一个文件夹下:

Yolov7_json_13

 

标注软件:

labelme就一个exe文件50m左右,下载地址:8q3m,windows上下载后直接执行,非常方便

  • labelme转yolov5脚本:

(只写了检测的,labelme的分割、关键点等等脚本有机会写个总的)

import os
import json
import glob
#输入口,就是你图片和json存放的那个文件,输出的txt也在这个文件夹里
labelme_dir=r"C:\Users\ttao\Pictures\my_"
def get_labelme_data(labelme_dir):
    with open(labelme_dir) as f:
        j=json.load(f)
        out_data=[]
        img_h =j["imageHeight"]
        img_w =j["imageWidth"]
        for shape in j["shapes"]:
            label=shape["label"]
            points=shape["points"]
            x,y,x2,y2=points[0][0],points[0][1],points[1][0],points[1][1]
            x_c=(x+x2)//2
            y_c=(y+y2)//2
            w=abs(x-x2)
            h=abs(y-y2)
            out_data.append([label,x_c,y_c,w,h])
    return img_h,img_w,out_data
def rename_Suffix(in_,mode=".txt"):
    in_=in_.split('.')
    return  in_[0]+mode
def make_yolo_data(in_dir):
    json_list=glob.glob(os.path.join(in_dir,'*.json'))
    for json_ in json_list:
        json_path=os.path.join(in_dir,json_)
        json_txt=rename_Suffix(json_)
        img_h,img_w,labelme_datas=get_labelme_data(json_path)
        with open(os.path.join(in_dir,json_txt),'w+') as f:
            for labelme_data in labelme_datas:
                label=labelme_data[0]
                x_c=labelme_data[1]/img_w
                y_c=labelme_data[2]/img_h
                w=labelme_data[3]/img_w
                h=labelme_data[4]/img_h
                f.write("{} {} {} {} {}\n".format(label,x_c,y_c,w,h))
            f.close()
if __name__ == '__main__':
    make_yolo_data(labelme_dir)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.

训练

配置:train.py+数据集配置文件(.yaml)+选择网络的配置文件(默认为yolov7.yaml)
Visdrone数据集
数据集是无人机角度拍摄的,中国各城市的,主要是各种汽车、人等数据集
我具体配置情况如下:

Yolov7_目标检测_14

train.py

–cfg 模型选择,这里默认是yolov7
–data 数据格式配置,我这里是自己的VisDrone数据格式,训练yolo的要改,看下面训练自己数据集
–hyp 超参数,先不管
–batch-size 这个yolov7我设高了容易爆,小点
  • 1.
  • 2.
  • 3.
  • 4.

Yolov7_json_15


 VisDrone.yaml

Yolov7_json_16

 然后就可以训练了

Yolov7_人工智能_17

Yolov7_目标检测_18