学生休息室

分享技术和现实生活中的例子,学生如何在他们的日常项目中使用MATLAB和Simulink # studentsuccess万博1manbetx

推进老年痴呆症研究失速捕手——MATLAB基准代码

今天的博客作者是Neha高尔,深度学习技术传教士在MathWorks学生竞争的团队。

你好!与DrivenData合作,我们在MathWorks兴奋地为你带来这一挑战。通过这个挑战,你可以帮忙找到一个阿尔茨海默氏症的治疗目标达成在未来一两年。你也将得到实际工作经验的现场视频数据集的老鼠的大脑。我们也鼓励你使用MATLAB来训练你的模型通过提供免费MATLAB许可证。

这一挑战的目标是进行分类概述了血管段

  • “流动”——如果血液通过血管或移动
  • “停滞不前”,如果船没有血液流动。

解决这一挑战的主要资产是视频本身!每个视频都是确定的文件名,这是一个数字字符串随后mp4,例如,100000. mp4所有的视频都是托管在一个公共s3 bucket。

完整的训练数据集包含超过580000个视频,这大约是1.5 tb !更快地帮助促进模型原型,有两个版本的数据子集,称为n微。

除了视频,你是提供“train_metadata.csv”和“test_metadata.csv”文件。这些文件包含的信息,如文件名,每个文件的URL,每个视频的帧数,纳米指示子集。”train_labels.csv”标签的训练数据的文件。

详情查看的数据集问题描述在网页上的竞争。

gif

开始使用MATLAB

我们提供一个基本的基准起动器在MATLAB代码纳米版本的数据子集。在这段代码中,我们走过一个基本的分类模型,我们结合pre-trained图像分类模型和一个LSTM网络。然后,我们将使用这个模型来预测船舶的类型的测试数据和保存一个CSV文件所需的格式的挑战。你也可以下载这个基准MATLAB代码。

这可以作为基本的代码,你可以开始分析数据并努力开发更高效,优化,使用更精确的模型可用的训练数据。此外,我们提供了一些提示和技巧完成1.5 tb的数据集。挑战的问题描述页面,提交视频所需的所有细节,标签性能和指标。

所以,让我们开始使用这个数据集!

负荷训练数据

访问文件的变量值train_metadata.csv,加载文件的形式tabulartext数据存储在工作区中。

运输大亨= tabularTextDatastore (“train_metadata.csv”、“ReadSize”、“文件”、“TextType”,“字符串”);火车=阅读(运输大亨);

我们可以预览数据存储。这个文件的可视化前8行。

预览(运输大亨)

表

你也可以在MATLAB使用导入csv文件readtable函数。在这里,我们创建标签的训练train_labels.csv文件并将它存储在表的一种形式。然后把变量的值停滞直言,因为大多数深倚函数接受分类值使用。

trainlabels = readtable (“train_labels.csv”);trainlabels。停滞不前= categorical(trainlabels.stalled);

在这个起动器代码中,我们将使用纳米数据库的子集。这里,我们检索文件和标签为纳米子集从上面创建的表并将其保存在变量nanotrainnanotrainlabels。(使用完整的数据集,您不需要这一步)。

nanotrain =火车(火车。纳米= =‘真正的’,:);nanotrainlabels = trainlabels(火车。纳米= =‘真正的’,:);

访问和处理视频文件

MATLAB数据存储在一个方便的工作方式和代表太大的数据集合的一次装入内存。它是一个对象用于读取一个文件或一组文件或数据。数据存储作为存储库相同的结构和格式的数据。了解更多关于不同的数据存储,看看下面的文件:

  1. 开始使用数据存储
  2. 选择数据存储文件格式或应用程序
  3. 数据存储深度学习

在这篇博客,我们使用了filedatastore读取每个文件使用它的URL。每个文件处理使用readVideo辅助函数,定义在这个博客。

我们保存数据存储在一个MAT-filetempdir在继续下一个部分之前或当前文件夹。如果垫文件已经存在,然后从MAT-file加载数据存储没有重新评估他们。

tempfds = fullfile (tempdir fds_nano.mat);如果存在(tempfds,“文件”)负载(tempfds, fds)其他fds = fileDatastore (nanotrain。url, ReadFcn, @readVideo);文件= fds.Files;保存(tempfds fds);结束

提示:处理完成的数据集(~ 1.5 tb),创建数据存储的文件夹位置训练数据(“s3: / / drivendata-competition-clog-loss /火车”),而不是与每个urlURL为了节省时间和内存。这一步需要花很长时间。

(可选)我们可以预览数据存储,确保每个视频帧现在出现在概述部分。

dataOut =预览(fds);瓦= imtile (dataOut);imshow(瓷砖);

截图

分类

创建一个深度学习网络视频分类:

  1. 转换视频序列的特征向量使用pretrained卷积神经网络,如GoogLeNet,从每一帧中提取特征。
  2. 培养一个长短期记忆(LSTM)网络视频序列预测标签。
  3. 组装一个网络,直接将视频通过结合网络层。

下图说明了网络体系结构。

  • 向网络输入图像序列,使用序列输入层。
  • 利用卷积层提取特征,也就是说,应用卷积操作独立视频的每一帧,使用序列折叠层卷积层紧随其后。
  • 恢复序列结构和重塑输出向量序列,使用序列展开层和一个平层。
  • 分类结果向量序列,包括LSTM层输出层紧随其后。

流程图

负载Pretrained卷积网络

将帧的视频转换成特征向量,我们使用的激活pretrained网络。加载一个pretrained GoogLeNet模型使用googlenet函数。这个函数需要深度学习工具箱™模型GoogLeNet网络支持包万博1manbetx

netCNN = googlenet;

帧转换为特征向量

利用卷积网络特征提取器的输入视频帧到网络时激活。

这个图表说明了通过网络数据流。

流程图

输入大小应该匹配的输入大小pretrained网络,这里GoogLeNet网络。然后调整大小以输入数据存储大小使用变换函数。

inputSize = netCNN.Layers (1) .InputSize (1:2);fdsReSz =变换(fds, @ (x) imresize (x, inputSize));

将视频序列的特征向量,特征向量的输出激活函数的最后池层GoogLeNet网络(“pool5-7x7_s1”)。分析的每一个大小和位置堵塞血管内的概述部分,我们不修改序列的长度。

提示:转换后的视频序列,保存在MAT-file序列tempdir文件夹中。如果垫文件已经存在,然后从MAT-file加载序列没有改造。这一步需要花很长时间。

layerName = " pool5-7x7_s1”;tempFile = fullfile (tempdir sequences_nano.mat);如果存在(tempFile,“文件”)负载(tempFile,“序列”)其他numFiles =元素个数(文件);序列=细胞(numFiles, 1);我= 1:numFiles流(“阅读文件% d % d…\ n”,我,numFiles);序列{我1}=激活(layerName netCNN、读取(fdsReSz),“OutputAs”,“列”,“ExecutionEnvironment”,“汽车”);结束保存(tempFile“序列”);结束

然后我们视图的大小头几个序列。每个序列都是一个D——- - - - - -年代数组,D是功能的数量(池层的输出大小)和年代是视频的帧数。

序列(1:10)

表

准备训练数据

在这里,我们准备培训的数据分区的数据为训练和验证的分区。我们分配90%的数据训练验证分区分区和10%。

标签= nanotrainlabels.stalled;numObservations =元素个数(序列);idx = randperm (numObservations);地板(N = 0.9 * numObservations);idxTrain = idx (1: N);sequencesTrain =序列(idxTrain);labelsTrain =标签(idxTrain);idxValidation = idx (N + 1:结束);sequencesValidation =序列(idxValidation);labelsValidation =标签(idxValidation);

然后我们得到的序列长度的训练数据和可视化在直方图的阴谋。

numObservationsTrain =元素个数(sequencesTrain);numObservationsTrain sequenceLengths = 0 (1);i = 1: numObservationsTrain = sequencesTrain序列{};sequenceLengths (i) =(序列,2)大小;最终图直方图(sequenceLengths)标题(“序列长度”)包含(序列长度)ylabel(频率)

图

创建LSTM网络

接下来,创建一个长短期记忆(LSTM)网络可以表示视频序列的特征向量进行分类。

然后我们定义LSTM网络架构和指定以下网络层。

numFeatures =大小(sequencesTrain {1}, 1);numClasses = 2;层= [sequenceInputLayer (numFeatures‘名’,‘序列’)bilstmLayer(2000年,“OutputMode”,“去年”、“名称”、“bilstm”) dropoutLayer(0.5,“名字”,“下降”)fullyConnectedLayer (numClasses,“名字”,“俱乐部”)softmaxLayer classificationLayer(“名字”,“softmax”)(“名字”、“分类”)];

指定培训选项

作为下一步,我们使用指定培训选项trainingOptions功能:

  • 设置一个mini-batch尺寸16,0.0001的初始学习速率,梯度阈值的2(防止梯度爆炸)。
  • 截断在每个mini-batch序列有相同的长度最短的序列。
  • 混乱的数据每一时代。
  • 验证每个时代网络一次。
  • 显示在一块训练进展和抑制详细输出。
miniBatchSize = 16;numObservations =元素个数(sequencesTrain);numIterationsPerEpoch =地板(numObservations / miniBatchSize);选择= trainingOptions(“亚当”,…MiniBatchSize, MiniBatchSize,……“InitialLearnRate”, 1的军医,…“GradientThreshold”, 2,…“洗牌”、“every-epoch’,……ValidationData, {sequencesValidation, labelsValidation},…ValidationFrequency, numIterationsPerEpoch,…… 'Plots','training-progress', ... 'Verbose',false, ... 'ExecutionEnvironment','auto');

火车LSTM网络

然后,我们训练网络使用trainNetwork函数。注意,这个函数可以花很长时间运行所涉及的计算。

[netLSTM,信息]= trainNetwork (sequencesTrain、labelsTrain层,选择);

图

作为下一步,我们计算网络的分类精度验证设置使用分类函数。你可以使用相同的mini-batch大小选项用于培训。

YPred =分类(netLSTM、sequencesValidation MiniBatchSize, MiniBatchSize);YValidation = labelsValidation;精度=意味着(YPred = = YValidation)

组装视频分类网络

直接创建一个分类的网络视频,网络组装使用创建的网络层。使用层从卷积网络将视频转换成向量序列和层次从LSTM网络分类向量序列。

下图说明了网络体系结构。

  • 向网络输入图像序列,使用序列输入层。
  • 利用卷积层提取特征,也就是说,应用卷积操作独立视频的每一帧,使用序列折叠层卷积层紧随其后。
  • 恢复序列结构和重塑输出向量序列,使用序列展开层和一个平层。
  • 分类结果向量序列,包括LSTM层输出层紧随其后。

流程图

添加回旋的层

首先,我们创建一个层GoogLeNet网络的图。

cnnLayers = layerGraph (netCNN);

然后我们把输入层(“数据”)和池层用于激活后的层(“pool5-drop_7x7_s1”、“loss3-classifier”、“概率”、“输出”)。

layerNames =[“数据”“pool5-drop_7x7_s1”“loss3-classifier”“概率”“输出”);cnnLayers = removeLayers (cnnLayers layerNames);

添加顺序输入层

我们创建一个序列输入层接受图像序列包含的图像大小相同的输入GoogLeNet网络。规范化的图像使用相同的平均形象GoogLeNet网络设置”归一化“选择序列的输入层”zerocenter”和“的意思是”选项的平均图像输入层GoogLeNet。

inputSize = netCNN.Layers (1) .InputSize (1:2);averageImage = netCNN.Layers (1) .Mean;inputLayer = sequenceInputLayer (inputSize [3],……“正常化”、“zerocenter’,……“的意思是”,averageImage,…“名称”、“输入”);

然后添加序列输入层到层图。应用卷积层独立的图像序列,我们去除图像序列的序列结构,包括一个序列折叠层之间的序列输入层和卷积层。然后我们连接的输出序列折叠一层一层的输入第一个卷积(“conv1-7x7_s2”)。

层= [inputLayer sequenceFoldingLayer(“名字”,“折叠”)];lgraph = addLayers (cnnLayers层);lgraph = connectLayers (lgraph“折叠/”,“conv1-7x7_s2”);

添加LSTM层

下一步是添加LSTM层到层图通过移除序列LSTM网络的输入层。恢复序列结构被序列折叠层,我们可以包含一个序列卷积后展开层层。LSTM层期望向量序列。重塑的输出序列展开层向量序列,我们包括平层后的序列展开层。

我们从LSTM网络层和删除序列输入层。

lstmLayers = netLSTM.Layers;lstmLayers (1) = [];

添加序列折叠层平层,LSTM层的层图。连接最后卷积层(”pool5-7x7_s1”)的输入序列展开层(“展开/”)。

层= [sequenceUnfoldingLayer(“名字”,“展开”)flattenLayer(“名字”,“平”)lstmLayers);lgraph = addLayers (lgraph层);lgraph = connectLayers (lgraph、“pool5-7x7_s1”、“展开/”);

使展开层恢复序列结构,连接”miniBatchSize“输出序列的折叠层的相应输入序列展开层。

lgraph = connectLayers (lgraph、“折叠/ miniBatchSize”、“展开/ miniBatchSize”);

组装网络

然后我们检查网络是否有效使用analyzeNetwork函数。

analyzeNetwork (lgraph)

截图

截图

组装网络,以便它是准备使用的预测assembleNetwork函数。

净= assembleNetwork (lgraph)

代码截图

准备测试数据

就像我们的训练数据,现在我们将阅读测试文件filedatastore和作物框架使用readVideo函数。然后裁剪文件数据存储大小按照inputSize使用转换函数。

当我们使用的所有文件从一个文件夹,我们可以直接给的s3文件夹url 当创建数据存储。这个速度创建数据存储。

testfds = fileDatastore (‘s3: / / drivendata-competition-clog-loss /测试/’,‘ReadFcn’, @readVideo);testfdsReSz =变换(testfds @ (x) {imresize (x, inputSize)});

使用测试数据进行分类

一旦我们有训练网络,我们可以对我们的测试执行预测集。为此,我们将使用组装的测试集视频网络。的分类函数将一个单元阵列包含输入视频,所以你必须输入一个1×1单元阵列包含视频。

测试文件= testfds.Files;numTestFiles =元素个数(测试文件);YPred =细胞(numTestFiles, 1);i = 1: numTestFiles流(“阅读文件% d % d…\ n”,我,numTestFiles);YPred{我1}=分类(净、读取(testfdsReSz)、“ExecutionEnvironment”,“汽车”);结束

保存提交文件

我们创建一个表的结果基于文件名和预测分数。提交所需的文件格式是一个与coulmn csv文件的名字:文件名停滞不前

我们将MATLAB中所有测试结果表,这使得它很容易想象,写所需的文件格式。

测试= readtable (“test_metadata.csv”);检测结果=表(test.filename YPred (: 1), VariableNames,{“文件名”,“停滞”});

然后将结果写入一个CSV文件。这是您提交的文件的挑战。

writetable(检测结果,“testResults.csv”);

辅助函数

readVideofunction读取视频文件名并返回一个裁剪4 d框架。

整个视频的感兴趣的领域是橙色的色彩区域的每一帧视频我们要提取使用的培训。因此,每一帧剪裁是每段的边界框,使用计算detectROI函数。

功能视频= readVideo(文件名)vr = VideoReader(文件名);我= 0;%视频= 0;虽然hasFrame (vr)我= + 1;帧= readFrame (vr);如果我< 2 Bbox = detectROI(框架);结束帧= imcrop(框架、Bbox);视频(::,:,i) =框架;结束结束

detectROIfunction检测部分概述定义和基于阈值的阈值图像。这个函数是使用MATLAB生成的颜色阈值的应用。检测指定的区域橙色圈标记,我们使用Blob分析。我们选择让感兴趣的领域最大的blob主轴。看看下面的视频了解更多信息。

函数[Bbox] = detectROI (frameIn) % %设置探测器和初始化变量持续性探测器如果isempty(探测器)探测器= vision.BlobAnalysis (“BoundingBoxOutputPort”,没错,‘MajorAxisLengthOutputPort’,真的);最终阈值= (104 255;13 143;9 98];掩码= (frameIn(:: 1) > =阈值(1,1))& (frameIn(:,: 1) < =阈值(1、2)&……(frameIn(:,: 2) > =阈值(2,1))& (frameIn(:,: 2) < =阈值(2,2))&……(frameIn(:,:, 3) > =阈值(3,1))& (frameIn(:,:, 3) < =阈值(3 2));[~,~,Bbox1 majorAxis] =检测器(面具);如果~ isempty (majorAxis) %确定最大团[~,mIdx] = max (majorAxis);Bbox = Bbox1 (mIdx:); end end

谢谢你的跟随了这个博客。我们兴奋地找出如何修改这个起动器代码,使它成为你的。我们强烈建议看我们深度学习页面提示和技巧更多的想法如何提高基准模型。你也可以看看这个博客:你准备好视频分类挑战5,学习不同的方法对视频分类。

随时与我们联系DrivenData论坛如果你有任何进一步的问题。

|
  • 打印
  • 发送电子邮件

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。