当前位置: 首页 > news >正文

Matlab 创建YOLO v2目标检测网络(仅仅是网络)

版本要求:matlab大于等于2019。

此示例演示如何修改预先训练的MobileNet v2网络,以创建YOLO v2对象检测网络。

将预训练的网络转换为YOLO v2网络的过程类似于图像分类的迁移学习过程:

1)加载预训练的网络。

2)从预训练的网络中选择一层用于特征提取。

3)去除特征提取层之后的所有层。

4)添加新层以支持对象检测任务。

1.加载预训练的网络

使用mobilenetv2加载预先训练过的mobilenetv2网络。这需要MobileNet v2 Network™的深度学习工具箱模型支持包。如果没有安装此支持包,则该功能提供下载链接。在加载网络之后,将网络转换为layerGraph对象,以便您可以操作这些层。

net = mobilenetv2();
lgraph = layerGraph(net);

更新网络输入大小

更新网络输入大小以满足训练数据需求。例如,假设训练数据是300 × 300 RGB的图像。设置输入大小。

imageInputSize = [300 300 3];

接下来,创建一个新的图像输入层,与原来的层同名。

imgLayer = imageInputLayer(imageInputSize,"Name","input_1")

可以查看,结构:

imgLayer = 
  ImageInputLayer with properties:

                      Name: 'input_1'
                 InputSize: [300 300 3]
        SplitComplexInputs: 0

   Hyperparameters
          DataAugmentation: 'none'
             Normalization: 'zerocenter'
    NormalizationDimension: 'auto'
                      Mean: []

用新的图像输入层替换旧的图像输入层。

lgraph = replaceLayer(lgraph,"input_1",imgLayer);

使用analyzeNetwork函数显示和检查网络中的层。

 

analyzeNetwork(lgraph);

选择特征提取层

当输出特征宽度和高度比输入图像小8到16倍时,YOLO v2特征提取层是最有效的。这个下采样量是空间分辨率和输出特征质量之间的权衡。您可以使用analyzeNetwork函数或Deep Network Designer应用程序来确定网络中各层的输出大小。注意,选择一个最佳的特征提取层需要经验评估。

设置特征提取层为“block_12_add”。这一层的输出尺寸大约是输入图像尺寸300 × 300的16倍。

 

featureExtractionLayer = "block_12_add";

特征提取层后删除层

index = find(strcmp({lgraph.Layers(1:end).Name},featureExtractionLayer));
lgraph = removeLayers(lgraph,{lgraph.Layers(index+1:end).Name});

 创建YOLO v2检测子网

 检测子网络由串行连接的卷积层、ReLU层和批处理归一化层组成。这些层后面是yolov2TransformLayer和yolov2OutputLayer。

首先,创建两组串行连接的卷积层、ReLU层和批处理归一化层。设置卷积层过滤器大小为3 × 3,过滤器数量与特征提取层输出的通道数量相匹配。在卷积层中指定“相同”填充以保留输入大小。

 

filterSize = [3 3];
numFilters = 96;

detectionLayers = [
    convolution2dLayer(filterSize,numFilters,"Name","yolov2Conv1","Padding", "same", "WeightsInitializer",@(sz)randn(sz)*0.01)
    batchNormalizationLayer("Name","yolov2Batch1")
    reluLayer("Name","yolov2Relu1")
    convolution2dLayer(filterSize,numFilters,"Name","yolov2Conv2","Padding", "same", "WeightsInitializer",@(sz)randn(sz)*0.01)
    batchNormalizationLayer("Name","yolov2Batch2")
    reluLayer("Name","yolov2Relu2")
    ]

输出:

detectionLayers = 
  6x1 Layer array with layers:

     1   'yolov2Conv1'    2-D Convolution       96 3x3 convolutions with stride [1  1] and padding 'same'
     2   'yolov2Batch1'   Batch Normalization   Batch normalization
     3   'yolov2Relu1'    ReLU                  ReLU
     4   'yolov2Conv2'    2-D Convolution       96 3x3 convolutions with stride [1  1] and padding 'same'
     5   'yolov2Batch2'   Batch Normalization   Batch normalization
     6   'yolov2Relu2'    ReLU                  ReLU

接下来,创建检测子网络的最后一部分,它有一个卷积层,后面是一个yolov2TransformLayer和一个yolov2OutputLayer。卷积层的输出对每个锚框预测如下:

对象类概率。

   1.x和y位置的偏移量。

   2.宽度和高度的偏移。

   3.指定锚框和类的数量,并为卷积层计算过滤器的数量。

numClasses = 5;

anchorBoxes = [
    16 16
    32 16
    ];

numAnchors = size(anchorBoxes,1);
numPredictionsPerAnchor = 5;
numFiltersInLastConvLayer = numAnchors*(numClasses+numPredictionsPerAnchor);

将convolution2dLayer、yolov2TransformLayer和yolov2OutputLayer添加到检测子网中。

detectionLayers = [
    detectionLayers
    convolution2dLayer(1,numFiltersInLastConvLayer,"Name","yolov2ClassConv",...
    "WeightsInitializer", @(sz)randn(sz)*0.01)
    yolov2TransformLayer(numAnchors,"Name","yolov2Transform")
    yolov2OutputLayer(anchorBoxes,"Name","yolov2OutputLayer")
    ]

输出:

detectionLayers = 
  9x1 Layer array with layers:

     1   'yolov2Conv1'         2-D Convolution            96 3x3 convolutions with stride [1  1] and padding 'same'
     2   'yolov2Batch1'        Batch Normalization        Batch normalization
     3   'yolov2Relu1'         ReLU                       ReLU
     4   'yolov2Conv2'         2-D Convolution            96 3x3 convolutions with stride [1  1] and padding 'same'
     5   'yolov2Batch2'        Batch Normalization        Batch normalization
     6   'yolov2Relu2'         ReLU                       ReLU
     7   'yolov2ClassConv'     2-D Convolution            20 1x1 convolutions with stride [1  1] and padding [0  0  0  0]
     8   'yolov2Transform'     YOLO v2 Transform Layer.   YOLO v2 Transform Layer with 2 anchors.
     9   'yolov2OutputLayer'   YOLO v2 Output             YOLO v2 Output with 2 anchors.

完成YOLO v2检测网络

将检测子网与特征提取网络连接。

lgraph = addLayers(lgraph,detectionLayers);
lgraph = connectLayers(lgraph,featureExtractionLayer,"yolov2Conv1");

使用analyzeNetwork函数检查网络。然后可以使用trainYOLOv2ObjectDetector函数来训练网络。

analyzeNetwork(lgraph)

参考:

Create YOLO v2 Object Detection Network - MATLAB & Simulink - MathWorks 中国

 

相关文章:

  • Java集合04:Collection子接口二:Set接口
  • 查看CPU核数、内存使用情况【一文读懂】
  • 【 java 多线程】死锁的问题
  • 全网都在说一个错误的结论
  • 免杀实战之面向PHP的WebShell免杀
  • LeetCode刷题复盘笔记—一文搞懂有序数组/链表转成二叉搜索树 二叉搜索树变平衡
  • Leetcode257. 二叉树的所有路径 Binary Tree Paths - Python递归法/回溯法
  • 【操作系统篇】第二篇——计算机系统概述(下)
  • 一箭双雕!刷完阿里 P8 架构师 spring 学习笔记 + 源码剖析,涨薪 8K
  • 【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
  • 汇编语言相关习题
  • Java(二):IDEA使用教程
  • Codeforces Round #826 (Div. 3) E,F
  • MPLS 虚拟专用网络 配置实验
  • AppCode 2022Improves compatibility
  • @jsonView过滤属性
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Android开源项目规范总结
  • ECS应用管理最佳实践
  • Flex布局到底解决了什么问题
  • JAVA 学习IO流
  • Koa2 之文件上传下载
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Python_网络编程
  • Redux系列x:源码分析
  • vue数据传递--我有特殊的实现技巧
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 关于Java中分层中遇到的一些问题
  • 观察者模式实现非直接耦合
  • 小程序测试方案初探
  • 用jQuery怎么做到前后端分离
  • ​linux启动进程的方式
  • #stm32驱动外设模块总结w5500模块
  • $NOIp2018$劝退记
  • (3)选择元素——(17)练习(Exercises)
  • (39)STM32——FLASH闪存
  • (7)STL算法之交换赋值
  • (javascript)再说document.body.scrollTop的使用问题
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)计算机毕业设计高校学生选课系统
  • (接口自动化)Python3操作MySQL数据库
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (三)Honghu Cloud云架构一定时调度平台
  • (十) 初识 Docker file
  • (五)MySQL的备份及恢复
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)重识new
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .Net6 Api Swagger配置
  • @RestController注解的使用
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [383] 赎金信 js
  • [AIGC] Java 和 Kotlin 的区别