【深度学习】行业基础 目标检测 yolov5

常见框架:

  • 框架复现了很多论文研究出来的模型,所以可以直接套用已有模型,基本上不用改,但如果是嵌入式,就可能需要改动一些东西。但是有一些又不容易改,huawei
  • paddlepaddle,但国际上普遍不认,因为是百度旗下的。需要用ONNX从pd转成ONNX,再从ONNX转到目标框架
  • tensorflow
  • pytorch
  • caffe2

常见的目标检测所用模型:

  • ResNet,目前较为“官方”的模型结构,很多论文或模型都会拿它作为比较
  • Faster RCNN,最早的模型,虽然慢,但是仍在目前所有模型中拥有最高的精确度。它是two-stage的,一张图片要检测两次,第一次框出大概范围,第二次再精细去框,所以计算量大,比较慢
  • SSD,Single Shot MultiBox Detector,SSD和yolo都是one-stage的。SSD的速度快,但是精确度不够。在精确度和时间(计算量)的trade-off中,yolo处于SSD和Faster RCNN中间。

图片标注

  • 图片标注文件
    • parscal voc 导出xml文件,常用,因为可以用文字标记那个是什么东西,还可以直接用左上角右下角的xy来框出矩形来标记
    • coco,coco数据集用的标记方式
    • yolo,yolo中数据集用的标记方式。coco和yolo的标记都差不多,每一行表示一个标记点,第一个数字为0(我估计是不同的类别index),后面四个数字表示以中心点为原点所偏移的位置来表示标记矩形左上角右下角的xy
    • 可用图片标注:[labmeImg]

关于部署

  • 部署 不同框架之间的转换 用ONNX,yolov5代码中export.py就是用于导出的
  • 将整个pytorch安装到设备上是不现实的,因为它本身就有一点几个G,很大,而且python语言在设备上适配度不高,一般情况下设备还是用C++比较多,所以部署时还有一个问题是python代码和c++代码的转换。
  • 我们所训练出的模型只是一个关于模型使用的各个结构和参数的一个description文件,到实际落地设备上再通过预测驱动程序进行实际应用。换言之,交递过去的文件是不能进行检测的,要设备根据文件进行调整驱动后才可用。

部署工具:

  • OpenVINO,适用于部署到CPU,因为是intel开发的,和大多数拥有intel芯片的硬件适配。OpenVINO推理简介
  • TensorRT,Tensor是一个有助于在NVIDIA图形处理单元(GPU)上高性能推理c++库。它旨在与TesnsorFlow、Caffe、Pytorch以及MXNet等训练框架以互补的方式进行工作,专门致力于在GPU上快速有效地进行网络推理。什么是TensorRT

yolov5

train.py中有一些值得注意的参数含义

# yolov5 train.py line 452
def parse_opt(known=False):
    parser = argparse.ArgumentParser()
    parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')  # 选择用哪个权重模型来跑,权重将在下面图片进行解释。用CPU跑建议yolov5s
    parser.add_argument('--cfg', type=str, default='', help='model.yaml path')
    parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='dataset.yaml path')  # 表示默认使用coco123格式的数据集
    parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch-low.yaml', help='hyperparameters path')  # 表示默认使用hyp.scratch-low.yaml这个超参,data/hyps/文件夹下还有很多别的超参文件,如‘hyp.VOC.yaml’(支持VOC的超参),‘hyp.scratch-low.yaml’文件中有各个参数的含义注释。
    parser.add_argument('--epochs', type=int, default=300)  # epoch表示轮数,对于每一张图片要训练多少轮,一般要多一些轮数,但是考验机器算力,CPU训练的话大概100合适
    parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs, -1 for autobatch')  # 批大小,如果用笔记本一个GPU去算 大概只能用1。批大小越大,所用时间越短。
    parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=640, help='train, val image size (pixels)')  # 图片大小,默认是转成640 x 640来进行处理。意思是统一将图片reshape成640*640,但是目前对于现实情况来说,如果比较大的图片亚太小了就容易丢失信息。720p以下分辨率的图片可以用640,如果是1080p的图片一般用960.
    parser.add_argument('--rect', action='store_true', help='rectangular training')

yolov5下的各种权重模型

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qzx9kUTF-1658138691976)(photo/yolo5_1.png)]
  • 图中红圈部分mAP表示该权重模型的精确度,数值越大精确度越高。目标检测中的mAP是什么?
  • 蓝圈中params表示参数量大小 FLOPs表示计算量的大小,数值越大表示计算量越大,需要的算力要求越高。详见【YOLOv5-6.x】模型参数量param及计算量FLOPs解析
  • 从图中数值可以看出yolov5n的计算量小但是准确率偏低,yolov5s的准确率和计算量适中,适合普通笔记本跑。yolov5myolov5l 这类需要用服务器才跑得动。

params:

  • 有参数的层主要包括:卷积层,全连接层,BN层,Embedding层,少数激活函数层(AconC)…
  • 无参数层:多数激活函数层(Sigmoid/ReLU/SiLU/Mish),池化层,Dropout层

FLOPs:

floating point operations的缩写(s表复数),浮点运算数,可以理解为计算量

yolov5/models/yolo.py

  • 稍微注意一下def forward,在部署时有用
  • 模型主体部分:
    # 模型的主体部分在 line 92
    class Model(nn.Module):
        # YOLOv5 model
        def __init__(self, cfg='yolov5s.yaml', ch=3, nc=None, anchors=None):  # model, input channels, number of classes
    

猜你喜欢

转载自blog.csdn.net/m0_51711485/article/details/125857076