当前位置:   article > 正文

基于mindspore的项目_mindspore和pytorch区别

mindspore和pytorch区别

1. pytorch和mindspore的区别

与PyTorch典型区别 — MindSpore master documentation

2. 目标检测的发展

(1)双阶段:

用于对象检测的第一类深度网络是基于区域的CNN(R-CNN)系列。

1. RCNN

 一张图片通过搜索算法获得2k个候选区域,将每个区域化为固定大小,输入CNN提取候选框特征,随后采用SVM分类器判断候选区域的类别,使用线性回归获得更准确的边界框。

  • 优点:首个将深度学习引入目标检测任务;
  • 缺点:

(1)整个目标检测阶段涉及到三个模型,用于特征提取的CNN、用于分辨目标物体类别的SVM分类器、用于调整边界框的线性回归模型。RCNN无法做到端到端训练,只能分别训练这三个模型,这增大了训练难度与训练时间。

(2)每张图片要提取2000个训练区域,随后又要用CNN分别提取每个区域的特征,特征的数量将非常大,这降低了模型的推理速度。通常每张图片需要45秒进行预测,基本无法处理大型数据集。

2. Fast RCNN

在RCNN中,每个候选区域都需要用CNN单独提取特征。为了减少算法的计算时间,Fast-RCNN希望在每张图片上只使用一次CNN,就能提取到所有关注区域的特征。为此,RCNN设计了如下步骤的目标检测算法:

首先对图片使用启发式算法,得到大量候选区域。随后将图片输入到卷积神经网络中,得到图片的特征,与候选区域的相对位置结合,就可以得到候选区域的特征。随后使用ROI池化层将候选区域调整至相同尺寸,并将调整后的结构输入到全连接神经网络中。最后在全连接神经网络后面添加softmax层,预测目标的列别;并以相同的方式添加线性回归层。

与RCNN相比,Fast RCNN计算一张图片只需要2秒,速度有大幅提升,每张图片的计算时间只有但仍不够理想。因为它依然用到了选择性搜索方法得到感兴趣区域,而这一过程通常很慢。

3. Faster RCNN

Faster RCNN针对感兴趣区域的生成方式,对RCNN进行了优化,进一步提高了计算速度和准确率。具体来说,Faster RCNN使用Reigion Proposal Network(RPN)生成感兴趣区域:

首先,将图片输入到CNN中得到高层特征映射,随后将其传递到RPN中。

RPN会在特征映射上使用一个滑动窗口,并在每个窗口设置K个不同大小、不同长宽比的先验框。

对于每个先验框,RPN会分别预测该框包含目标物体的概率,以及对该框的调整回归量。最终得到不同形状、尺寸的边界框,调增尺寸后将其传递到完全连接层,得到目标类别以及最终的先验框。

Faster RCNN进一步提高了计算速度,并获得了较高的准确率。时至今日,依然是目标检测领域的主流算法之一。

(2)单阶段

与两阶段方法相比,一阶段算法具有更高的卷积运算共享度、更快的速度和更小的内存占用,但是检测精度低。

1. Yolo

YOLO系列[29]–[31]将提出候选区域和分类结合到一个单一的回归问题中,通过回归输出层的边界框位置和类别,实现了一阶段的端到端学习。

(1)Yolov1

对于一张输入图片,首先将图片缩放成统一的尺寸,并在图片上划分出若干表格。随后使用卷积神经网络提取图片特征,并使用全连接层在每个网格上进行回归预测,每个网格预测K个box,每个box预测五个回归值。其中的四个回归值代表box的位置,第五个回归值代表box中含有物体的概率和位置的准确程度。

随后对于含有物体的box,使用全连接层,回归预测物体的在各个类别的条件概率。因而,卷积网络共输出的预测值个数为N×(K×5+C),其中N为网格数,K为每个网格生成box个数,C为类别数。

(2)改进版本

  1. YOLOv2使用了很多trick,包括:Batch Normalization、高分辨率图像分类器、使用先验框、聚类提取先验框的尺度信息、约束预测边框的位置、在passthrough层检测细粒度特征、分层分类等。

(1)Batch Normalization(批量正则化。YOLOv2中在每个卷积层后加Batch Normalization(BN)层,去掉dropout. BN层可以起到一定的正则化效果,能提升模型收敛速度,防止模型过拟合。YOLOv2通过使用BN层使得mAP提高了2%。

2)High Resolution Classifier(高分辨率分类器。原来的YOLO网络在预训练的时候采用的是224*224的输入(这是因为一般预训练的分类模型都是在ImageNet数据集上进行的),然后在detection的时候采用448*448的输入,这会导致从分类模型切换到检测模型的时候,模型还要适应图像分辨率的改变。而YOLOv2则将预训练分成两步:先用224*224的输入从头开始训练网络,大概160个epoch(表示将所有训练数据循环跑160次),然后再将输入调整到448*448,再训练10个epoch。注意这两步都是在ImageNet数据集上操作。最后再在检测的数据集上fine-tuning,也就是detection的时候用448*448的图像作为输入就可以顺利过渡了。作者的实验表明这样可以提高几乎4%的mAP。

(3)Convolutional With Anchor Boxes(带Anchor Boxes的卷积。YOLOv1利用全连接层直接对边界框进行预测,导致丢失较多空间信息,定位不准。YOLOv2去掉了YOLOv1中的全连接层,使用Anchor Boxes预测边界框,同时为了得到更高分辨率的特征图,YOLOv2还去掉了一个池化层。由于图片中的物体都倾向于出现在图片的中心位置,若特征图恰好有一个中心位置,利用这个中心位置预测中心点落入该位置的物体,对这些物体的检测会更容易。所以总希望得到的特征图的宽高都为奇数。YOLOv2通过缩减网络,使用416*416的输入,模型下采样的总步长为32,最后得到13*13的特征图,然后对13*13的特征图的每个cell预测5个anchor boxes,对每个anchor box预测边界框的位置信息、置信度和一套分类概率值。使用anchor boxes之后,YOLOv2可以预测13*13*5=845个边界框,模型的召回率由原来的81%提升到88%,mAP由原来的69.5%降低到69.2%.召回率提升了7%,准确率下降了0.3%。

(4)Dimension Clusters(维度聚类)。在Faster R-CNN和SSD中,先验框都是手动设定的,带有一定的主观性。YOLOv2采用k-means聚类算法对训练集中的边界框做了聚类分析,选用boxes之间的IOU值作为聚类指标。综合考虑模型复杂度和召回率,最终选择5个聚类中心,得到5个先验框,发现其中中扁长的框较少,而瘦高的框更多,更符合行人特征。通过对比实验,发现用聚类分析得到的先验框比手动选择的先验框有更高的平均IOU值,这使得模型更容易训练学习。

(5)New Network(新的网络)。 YOLOv2采用Darknet-19,其网络结构如下图所示,包括19个卷积层和5个max pooling层,主要采用3*3卷积和1*1卷积,这里1*1卷积可以压缩特征图通道数以降低模型计算量和参数,每个卷积层后使用BN层以加快模型收敛同时防止过拟合。最终采用global avg pool 做预测。采用YOLOv2,模型的mAP值没有显著提升,但计算量减少了。

(7)细粒度特征(Fine-Grained Features)。 YOLOv2借鉴SSD使用多尺度的特征图做检测,提出pass through层将高分辨率的特征图与低分辨率的特征图联系在一起,从而实现多尺度检测。YOLOv2提取Darknet-19最后一个max pool层的输入,得到26*26*512的特征图。经过1*1*64的卷积以降低特征图的维度,得到26*26*64的特征图,然后经过pass through层的处理变成13*13*256的特征图(抽取原特征图每个2*2的局部区域组成新的channel,即原特征图大小降低4倍,channel增加4倍),再与13*13*1024大小的特征图连接,变成13*13*1280的特征图,最后在这些特征图上做预测。使用Fine-Grained Features,YOLOv2的性能提升了1%。

(8)多尺度训练(Multi-Scale Training)。 YOLOv2中使用的Darknet-19网络结构中只有卷积层和池化层,所以其对输入图片的大小没有限制。YOLOv2采用多尺度输入的方式训练,在训练过程中每隔10个batches,重新随机选择输入图片的尺寸,由于Darknet-19下采样总步长为32,输入图片的尺寸一般选择32的倍数{320,352,…,608}(最小的选项是320×320,最大的是608×608。我们调整网络的尺寸并继续训练)。采用Multi-Scale Training, 可以适应不同大小的图片输入,当采用低分辨率的图片输入时,mAP值略有下降,但速度更快,当采用高分辨率的图片输入时,能得到较高mAP值,但速度有所下降。
 

YOLOv3借鉴了SSD的思想,使用了多尺度特征进行目标检测,与SSD不同的是,YOLOv3采用上采样+特征融合的方式,对多尺度特征进行了一定的融合。

YOLOv7[38]结合了扩展高效层聚合网络(E-ELAN)[39]、粗到细标签分配和计划的重新参数化[6]卷积等策略,在保持单级网络优势的同时,表现出与Faster RCNN相对相似的性能。

(3)基于Transformer

DETR

DETR是首个用transformer完成目标检测任务的代表性工作。

首先,DETR使用CNN提取图片的特征,再加上NLP领域常用的位置编码,最终生成了一批序列化数据。

在encoder阶段,将序列化数据其送入encoder中,利用注意力机制提取数据中的特征。在decoder阶段,输入N个随机初始化向量,每个object query关注图片的不同位置。经过decoder的解码,最终会生成N个向量,每个向量对应一个检测到的目标。最后将这N个向量输入到神经网络中,得到每个目标的类别和位置。

相较于其它目标检测算法,DETR生成的检测框数量大幅减少,与真实的检测框数量基本一致。DETR使用匈牙利算法,将预测框与真实框进行了匹配,随后就可以计算出loss,完成对模型的训练。

DETR取得了好于Faster RCNN的检测效果,并且它不需要预先指定候选区域,不需要使用NMS去除重复的目标框,算法流程十分简洁。

3. Yolov5

 以Yolov5s的网络结构为主线,讲解与其他三个模型(Yolov5m、Yolov5l、Yolov5x)的不同点。

YOLOv1

【目标检测论文阅读】YOLOv1 - 知乎

YOLOv1的检测流程:

  • Resize image:将输入图片resize到448x448。
  • Run ConvNet:使用CNN提取特征,FC层输出分类和回归结果,每个网格预测K个box,每个box预测五个回归值。其中的四个回归值代表box的位置,第五个回归值代表box中含有物体的概率和位置的准确程度。(图像分割成7 x 7的单元格)
  • Non-max Suppression:非极大值抑制筛选出最终的结果。

YOLOv1维度输出:

  • 输入:448 x 448 x 3
  • 卷积后:7 x 7 x 1024
  • 全连接:1 x 1 x 4096 -->1 x 1 x 1470
  • 输出: 7 x 7 x 30 (由fc层后的向量reshape而来)

7 x 7 :网格数目,输出tensor中的 7 x 7 对应着输入图像的 7 x 7 个单元格

30维:

  • 20类对象:分类的数目,注意这些概率值其实是在各个边界框置信度下的条件概率,也就是说不管一个单元格预测多少个边界框,该单元格只预测一组类别概率值(YOLOv1的一大缺点)。
  • 2个bounding box的置信度:Pr(object )代表该边界框含有目标的可能性;IoU_{pre}^{truth }代表边界框的准确度;置信度计算为:IoU_{pre}^{truth }*Pr(object)
  • 2个bounding box的位置:4个数值(x, y, w, h)来表示其位置。(x,y)中心点,(w,h)对应的宽和高,都归一化为0-1

 YOLOv1的损失计算:

总结起来就是:

  • 对于有object的cell,那么计算cell的分类误差,然后cell中两个bbox的置信度误差,然后cell中和ground truth box的IoU最大的bbox的位置误差。
  • 对于没有object的cell,那就只计算cell中两个bbox的置信度误差。

 YOLOV1缺点:

  • 每个单元格只能预测一个类别
  • 训练难度比较法
  • 偶然出现的长宽比无法预测,泛化能力低
  • 定位误差大,损失函数
  • 多次下采样,信息丢失比较多

YOLOv2

主要是加了很多trick,来提高预测精度。

tricks:

  • batch nomalization(替换dropout,防止过拟合)
  • 采用了卷积和anchor boxes来预测边界框(移除全连接层,实现一个box可以预测多个类别)
  • 移除一层pool(提高特征图分辨率)
  • k-means方法对方框进行聚类分析(使得预测框与ground truth的IOU更好)
  • 替换主干网络Darknet-19(global avg pooling做预测,使用1x 1来降低计算量和参数
  • 粗略-精细的预测方法(适合小目标)
  • 多尺度训练的方法

YOLOv维度输出:

  • (20+5)x 2 

YOLOv3

改进点:

  • 类别预测方面主要是将原来的单标签分类改进为多标签分类(softmax->logistic)
  • YOLO v3采用多个scale融合的方式做预测——predictions across scales
  •  backbone网络架构完全不一样(darknet-19->darknet-53)

输出:

255=(80+4+1)*3=(class\_num+position+confidence)*anchor\_num

YOLOv4 

Yolov4在Yolov3的基础上进行了很多的创新。

比如输入端采用mosaic数据增强,
Backbone上采用了CSPDarknet53、Mish激活函数、Dropblock等方式,
Neck中采用了SPP、FPN+PAN的结构,spp是金字塔池化层,可以增强感受野。
输出端则采用CIOU_Loss、DIOU_nms操作。

YOLOv5

深入浅出Yolo系列之Yolov5核心基础知识完整讲解 - 知乎大白在之前写过 《深入浅出Yolo系列之Yolov3&Yolov4核心基础知识完整讲解》对 Yolov4的相关基础知识做了比较系统的梳理,但Yolov4后不久,又出现了Yolov5,虽然作者没有放上和Yolov4的直接测试对比,但在COCO…https://zhuanlan.zhihu.com/p/172121380

创新点: 

(1)输入端:Mosaic数据增强、自适应锚框计算、自适应图片缩放
(2)Backbone:Focus结构,CSP结构

  • focus结构

实际上就是下采样操作,具体步骤:

采用切片操作把高分辨率的图片/特征图拆分成多个低分辨率的图片/特征图,如下图所示:隔行采样+拼接

 将4×4×3的Tensor通过间隔采样拆分成4份,在通道维度上进行拼接生成2×2×12的Tensor。Focus层将w-h平面上的信息转换到通道维度,再通过卷积的方式提取不同特征。采用这种方式可以减少下采样带来的信息损失。

  • csp结构

CSP结构是将原输入分成两个分支,分别进行卷积操作使得通道数减半,然后一个分支进行Bottleneck * N操作,然后concat两个分支,使得BottlenneckCSP的输入与输出是一样的大小,这样是为了让模型学习到更多的特征。

(3)Neck:FPN+PAN结构

FPN 结构通过自顶向下进行上采样,使得底层特征图包含更强的图像强语义信息;PAN 结构自底向上进行下采样,使顶层特征包含图像位置信息,两个特征最后进行融合,使不同尺寸的特征图都包含图像语义信息和图像特征信息,保证了对不同尺寸的图片的准确预测。


(4)Prediction:GIOU_Loss

IoU系列(IoU, GIoU, DIoU, CIoU)_iou giou diou_PoomHey的博客-CSDN博客

总的损失函数: classification loss + localization loss + confidence loss

YOLOv5使用二元交叉熵损失函数计算类别 概率和目标置信度得分 的损失。
YOLOv5使用 CIOU Loss作为bounding box回归的损失。

普通IoU存在的问题:

  1. 若两者不相交,则IoU为0,Iou作为损失时,梯度无法更新,无法对方框预测值进行优化;
  2. IoU无法区分两个对象之间不同的对齐方式。

GIoU_loss的计算过程:

GIOU作为loss函数时,Loss=1-GIOU,当A、B两框不相交时A∪B值不变,最大化GIOU就是就小化C,这样就会促使两个框不断靠近。

疑惑点:
  • anchor box 和 bounding box 的区别

        ground truth是真实标注框,也就是人工标注,一般被看作“真值”

        Bounding box一般认为(为什么是一般认为,原因参照下面一段最后括号中的内容)是网络最终预测的结果,也就是“可能值”,因为网络可能预测正确也可能错误

        Anchor box被称作预选框,anchor的机制会更复杂一些,有许多帖子来专门讲解这个。总的来说就是在图像上会按照一定的规律放置一些anchor,网络会学习anchor相对于ground truth的偏移量,我们可以把anchor看作bounding box的“爷爷”,anchor+/-/×/÷偏移量所得到的框是bounding box的“父亲”,“父亲”经过非极大值抑制(NMS)之后就是bounding box了(但是也可以说“父亲”就是bounding box了,只是因为“父亲”很少出现在这个领域的相关内容中,所以一般说bounding box的时候指的是NMS之后的结果)

        IOU在不同的阶段会代表不同目标之间的交并比,比如在训练阶段需要判断anchor是正样本还是负样本,这个时候就需要用ground truth和anchor box计算IOU。在推理预测阶段进行NMS操作的时候,又要计算“父亲”每个框的IOU来进行合并删除操作

  • 最后的输出维度如何计算
  • anchor-based 和 anchor free的区别

        根据是否预定义锚框将目标检测算法分为Anchor-based和Anchor-free两种。

        1)Anchor-free:

        无锚框的目标检测算法是直接预测物体的边界框。代表:yolov1

        优点:是泛化能力强、框架更简洁、异常尺度目标检测精度高,

        缺点:是不适合进行通用目标检测,适用多尺度目标检测、小目标检测等,精度低于基于锚框的算法。

        2)Anchor-based:

        基于锚框的目标检测算法就是结合场景和数据事先定义好锚框,锚框就是定义好的大小不同的检测框,然后对锚框里的内容进行分类和回归。代表:YOLOv2、YOLOv3、YOLOv4、YOLOv5用的都是基于锚框的。

        优点:是技术较成熟,对特定场景效果好;

        缺点:缺点是泛化能力差,计算冗余等。

        选择anchor的方法1)yolov3:用k-means算法在训练集中所有样本的真实框(ground truth)中聚类,得到具有代表性形状的宽高(维度聚类)

        anchor转化为bbox的过程:1)三种scale的feature map,每个cell对应3个anchor;2)anchor是通过(x,y,w,h)来计算bbox,其中xy为偏移量,wh为缩放量;3)选择与gt置信度(nms非极大值抑制)最高的作为最后的bbox。

  • 各类loss的总结

IoU系列(IoU, GIoU, DIoU, CIoU)_iou giou diou_PoomHey的博客-CSDN博客

4. GAN进行数据增强

YangChen、Yong-Jin LIU 等人提出的算法 CartoonGAN:Generative Adversarial Networks for Photo Cartoonization 基于 GAN 网络,迭代训练生成器和判别器,由判别器提供的对抗性损失约束,最终将自然图片转换为具有卡通风格的图片,效果惊艳。

下图为卡通图像生成的整体框架:

以 GenerativeAdversarial Networks(GAN)为基础,其架构包括一个生成器(Generator)和一个判别器(Discriminator),通过迭代训练两个网络,由判别器提供的对抗性损失约束,最终使得网络能够将自然图片转换为具有卡通风格的图片结果,并且保持原图片的内容信息。

图 1 卡通图像生成整体架构

生成器结构

生成器采用自编码器,为全卷积结构,包括编码器如图 3,解码器如图 4。

图 3 编码器结构

图 4 解码器结构

编码器输入为真实图片,其架构由 7×7 的卷积核,步长为 1 的卷积层开始,随后紧跟两个步长为 2 的降采样块,进行特征提取,对风格图片生成有用的信息将在这个过程中被提取。然后紧接 4 个残差块(Residual Block),用来重建内容特征。

解码器架构由 5 个残差块开始,通过两个上采样块(步长为 2)来实现对不同风格特征的重建,最后在添加一层使用 7×7 卷积核、步长为 1 的卷积层,得到最终输出生成的卡通图片结果。

6. 开发板部署

Atlas 200 AI加速模块(型号 3000)是一款高性能的AI智能计算模块,集成了昇腾310 AI处理器(Ascend 310 AI处理器),可以实现图像、视频等多种数据分析与推理计算。

(1)环境准备

联网

 烧录

(2)模型转换

第一步:ckpt转onnx

原因:运行模型所需的环境难以配置。深度学习模型的结构通常比较庞大,需要大量的算力才能满足实时运行的需求。

  • onnx:

        ONNX文件不仅仅存储了神经网络模型的权重,同时也存储了模型的结构信息以及网络中每一层的输入输出和一些其它的辅助信息。可以用Netron可视化onnx模型。其中,算子包括算子属性、图结构和权重信息。

  1. 模型部署,指把训练好的模型在特定环境中运行的过程。模型部署要解决模型框架兼容性差和模型运行速度慢这两大问题。
  2. 模型部署的常见流水线是“深度学习框架-中间表示-推理引擎”。其中比较常用的一个中间表示是 ONNX。
  3. 深度学习模型实际上就是一个计算图。模型部署时通常把模型转换成静态的计算图,即没有控制流(分支语句、循环语句)的计算图。
  4. PyTorch 框架自带对 ONNX 的支持,只需要构造一组随机的输入,并对模型调用 torch.onnx.export 即可完成 PyTorch 到 ONNX 的转换。
  5. 推理引擎 ONNX Runtime 对 ONNX 模型有原生的支持。给定一个 .onnx 文件,只需要简单使用 ONNX Runtime 的 Python API 就可以完成模型推理。

现在主流的推理框架包括:TensorRTONNXRuntimeOpenVINOncnnMNN 等。

  • onnx转om

        使用CANN提供的ATC模型转换工具。可以将开源矿机的网络模型转换为昇腾AI处理器支持的模型文件(.om格式),用于后续的模型推理。

第二步:CANN实现om推理

 主要实现的过程是 模型预处理和后处理,最后输出。

第三步:优化模型

(待做事项)

 遇到的问题:

  1. 转.om模型:用的atc显示没有input_shape错误,是因为netron查看onnx,发现模型输入名字命名为x;其次,shape必须要和onnx模型的输入相同;最后,soc_version需要和开发板型号对应,比如200dk 2a是310b1。
  2. om模型运行:关键就是输入输出要符合。不符合会无法预测,如果tensor进入会导致alc资源分配错误。
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号