yolov5分文件解析(封装部分-detect.py)

在进行整体的学习之前,有必要将其中的参数和部分库进行搜索和学习,在我的学习过程中搜录了以下内容

yolov5

说到yolov5的图像处理,就绕不开神经网络卷积处理的Feature Map (特征图)表征的是神经空间内一种特征;其分辨率大小取决于先前卷积核的步长 。 层与层之间会有若干个卷积核(kernel),上一层中的每个feature map跟每个卷积核做卷积,对应产生下一层的一个feature map。 feature map的含义在计算机视觉领域基本一致,可以简单译成特征图,例如RGB图像,所有像素点的R可以认为一个feature map(这个概念与在CNN里面概念是一致的)

卷积:卷积也可以形式化地描述,事实上,它就是一种数学运算,跟减加乘除没有本质的区别。虽然这种运算本身很复杂,但它非常有助于简化更复杂的表达式。在物理和工程上,卷积被广泛地用于化简等式——等会儿简单地形式化描述卷积之后——我们将把这些领域的思想和深度学习联系起来,以加深对卷积的理解。但现在我们先从实用的角度理解卷积:卷积就是一种对图形的处理方式。

对比起之前的版本yolov4,v3等,yolov5的网络结构有一定的变化,但是有一个很显著的特点就是:小目标检测效果好Yolov5的目标检测网络有s,m,l,x四个版本)其大小,深度还有feature map的参数都不同(github上搜索yolov5第一个开源项目底下有四个版本的性能对比)

:先对其中会出现的一些名词进行解释:

1.backbone:翻译为主干网络的意思,既然说是主干网络,就代表其是网络的一部分,这个主干网络大多时候指的是提取特征的网络,其作用就是提取图片中的信息,共后面的网络使用。这些网络经常使用的是resnet VGG等,而不是我们自己设计的网络,因为这些网络已经证明了在分类等问题上的特征提取能力是很强的。在用这些网络作为backbone的时候,都是直接加载官方已经训练好的模型参数,后面接着我们自己的网络。让网络的这两个部分同时进行训练,因为加载的backbone模型已经具有提取特征的能力了,在我们的训练过程中,会对他进行微调,使得其更适合于我们自己的任务。

2.head:head是获取网络输出内容的网络,利用之前提取的特征,head利用这些特征,做出预测。

3.neck:是放在backbone和head之间的,是为了更好的利用backbone提取的特征

4.bottleneck:瓶颈的意思,通常指的是网网络输入的数据维度和输出的维度不同,输出的维度比输入的小了许多,就像脖子一样,变细了。经常设置的参数 bottle_num=256,指的是网络输出的数据的维度是256 ,可是输入进来的可能是1024维度的。

5.GAP:在设计的网络中经常能够看到gap这个层,是Global Average Pool全局平均池化,就是将某个通道的特征取平均值,经常使用AdaptativeAvgpoold(1),在pytorch中,这个代表自适应性全局平均池化,说人话就是将某个通道的特征取平均值。
重点:卷积神经网络  feature map  特征工程算法 
 # Inference
        t1 = time_synchronized()
        """
        前向传播 返回pred的shape是(1, num_boxes, 5+num_class)
        h,w为传入网络图片的长和宽,注意dataset在检测时使用了矩形推理,所以这里h不一定等于
        num_boxes = h/32 * w/32 + h/16 * w/16 + h/8 * w/8
        pred[..., 0:4]为预测框坐标
        预测框坐标为xywh(中心点+宽长)格式
        pred[..., 4]为objectness置信度
        pred[..., 5:-1]为分类结果
        """

   Yolov5中的网络文件是yaml格式,和3,4代的cfg不同,3代和4代我只是浏览了一下,所以不会涉及

    接下来是内部参数的介绍

    weights:训练的权重(之前提到的s,m,l,x)
    source:测试数据,可以是图片/视频路径,也可以是'0'(电脑自带摄像头),也可以是rtsp等视频流

   0是本机摄像头 1是其他usb摄像头以此类推(也可以下载IP摄像头,对地址和ip进行链接,从而达到使用手机摄像头的作用)
    output:网络预测之后的图片/视频的保存路径
    img-size:网络输入图片大小
    conf-thres:置信度阈值
    iou-thres:做nms的iou阈值
    device:设置设备
    view-img:是否展示预测之后的图片/视频,默认False
    save-txt:是否将预测的框坐标以txt文件形式保存,默认False
    classes:设置只保留某一部分类别,形如0或者0 2 3
    agnostic-nms:进行nms是否也去除不同类别之间的框,默认False
    augment:推理的时候进行多尺度,翻转等操作(TTA)推理
    update:如果为True,则对所有模型进行strip_optimizer操作,去除pt文件中的优化器等信息,默认为False

     argsparse是python的命令行解析的标准模块,内置于python,不需要安装。这个库可以让我们直接在命令行中就可以向程序中传入参数并让程序运行

    parse一般是指把某种格式的文本(字符串)转换成某种数据结构的过程。最常见的 parser,是把程序文本转换成编译器内部的一种叫做“抽象语法树”(AST)的数据结构。也有简单一些的 parser,用于处理 CSV,JSON,XML 之类的格式

help函数用在解释引用东西的说明
>>help('sys')             # 查看 sys 模块的帮助 
>>>help('str')             # 查看 str 数据类型的帮助
>>>a = [1,2,3]
>>>help(a)                 # 查看列表 list 帮助信息
>>>help(a.append)          # 显示list的append方法的帮助

def detect(save_img=False):

    source, weights, view_img, save_txt, imgsz = opt.source, opt.weights, opt.view_img, opt.save_txt, opt.img_size #detect文件中所包含的参数
    save_img = not opt.nosave and not source.endswith('.txt')  # save inference images
    webcam = source.isnumeric() or source.endswith('.txt') or source.lower().startswith(('rtsp://', 'rtmp://', 'http://'))#三种通讯协议
    #
    save_dir = Path(increment_path(Path(opt.project) / opt.name, exist_ok=opt.exist_ok))  # increment run
    (save_dir / 'labels' if save_txt else save_dir).mkdir(parents=True, exist_ok=True)  #

    

第一次应用层补充: (9.18)

  就如同之前我们提到的,我们使用YoloV5这门算法更多的应用场景是机器视觉(机器学习),我们需要用这样一种工具来得到 confs(置信度)和clss(标签),将这两样结果通过通信(主要形式为话题通信,ros相关,可以从本人博客“ros话题通信”做相关了解)的方式从一个节点转移到主机当中。

  (待解决)主机在接收到“置信度”和”标签“这两类信息之后,(出现了新的问题:如何把slam建图和本机摄像头的检测目标联系起来

 


版权声明:本文为qq_58652978原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。