深度学习

理解和使用深度学习网络

开放人工智能加勒比数据科学挑战赛

以下帖子来自Neha Goel,他是学生竞赛和在线数据科学竞赛的冠军。她来这里是为了推广一个新的深度学习挑战,每个人都可以参加。如果你赢了,你会得到钱,如果你使用MATLAB,还会得到奖金。读下去!
大家好!我们MathWorks与Drivennda合作,很高兴为您带来这一挑战。通过本次挑战,您将使用无人机航空图像(大图像)的真实数据集进行分类。竞争环节在这儿吗
奖品是:
的地方 奖金数额
第一 $5,000
第二 2000美元
第三 $1,000
奖金 2000美元
奖金用于特别使用MATLAB的最佳解决方案。比赛将于2019年12月23日午夜结束。
前提很简单:给定航空图像,你能正确地识别单个结构的屋顶材料吗?这项挑战的重点是易受自然灾害影响的城市的灾害风险管理。您将获得哥伦比亚、圣卢西亚和圣危地马拉地区无人驾驶飞机拍摄的大型航空图像。数据包括航空图像和GeoJSON文件,包括建筑迹线、唯一建筑ID和屋顶材质标签(用于训练数据)。
数据集的总容量约为30GB。其中每个国家有3个文件夹——哥伦比亚、危地马拉和圣卢西亚。每个国家/地区的文件夹由区域/地区的子文件夹组成。例如,在“哥伦比亚”内,我们有两个地区,分别命名为“borde_rural”和“borde_soacha”。每个区域的文件夹都有:
  • 区域的BigTIFF图像文件——例如,borde_rural_ortho-cog.tif
  • GeoJSON文件,包含图像范围(纬度/经度)、培训数据和测试数据的元数据
由于我们是竞赛的赞助商,我们还在MATLAB中提供一个基本的“起始代码”:不仅是如何构建和训练基本分类模型,而且还基于lat/long元数据提取单个结构,并将结果保存为挑战所需格式的CSV文件。
这应该作为基本代码,您可以在其中开始分析数据,并使用更多可用的培训数据开发更高效、优化和准确的模型。令人高兴的是,我们已经为您解决了所有繁琐的部分:读取输入文件,识别感兴趣的区域,并将结果保存到文件以供提交。这个MATLAB代码可以在这里下载。
挑战的问题描述页面中,提供了图像、功能、标签和提交指标所需的所有详细信息。
接下来,我将从较高的层次向您介绍代码。如果您对入门代码的完整介绍感兴趣:您可以在Drivenda的网站上查看我的深入博客:http://drivendata.co/blog/disaster-response-roof-type-benchmark/

加载和准备数据

将数据作为大图像加载

bigimage 是MATLAB R2019b中的一个新的图像处理工具箱函数,用于处理可能不适合内存的非常大的图像。这个函数对于这些大图像非常方便。这里我们为每个区域的BigTIFF图像创建了bigimage对象。
bimg=bigimage(区域名称(idx)+“_ortho-cog.tif”);

将图像分割为RGB通道和遮罩

检查图像,你很快意识到这有4个通道:3个通道的RGB和第4个不透明遮罩通道。使用helper函数 分离通道 我们正在移除不透明度蒙版通道。为了进一步的训练,我们将只使用3 RGB通道。
brgb = apply(bimg,1, @ separatchannels,'UseParallel',true);

设置大图像的空间参考

由于每个区域的图像都跨越一个具有特定纬度和经度范围的矩形区域,因此我们希望将其指定为图像的空间参考。这将允许我们使用纬度和经度值而不是像素值来提取图像区域,稍后我们将需要这样做。
有关更多信息,请参阅 设置大图像的空间参照 文档中的示例。

创建培训数据

训练集由3条信息组成,这些信息可以从每个区域的GeoJSON文件中解析
  1. 大楼ID
  2. 建筑多边形坐标(经纬度点)
  3. 的建筑材料
为了提取训练集,我们打开每个区域的GeoJSON文件,读取它,并使用 jsondecode 函数。
idx=1:numel(区域名称)fid=fopen(“火车——”+区域名称(idx)+“.geojson”);trainingStructs (idx) = jsondecode(从文件中读(fid,正无穷,“*字符”));文件关闭(fid);结束
提取每个ROI的ID、材质和坐标,在循环训练集时增加区域的索引,以确保我们引用的是正确的区域。通过翻转建筑区域坐标的Y图像坐标来纠正坐标惯例,将材料的文本数组转换为分类数组,以便以后进行分类。
regionIdx=1;对于k=1:numTrain trainID{k}=trainingStruct(k).id;trainMaterial{k}=trainingStruct(k).properties.roof_material;coords=trainingStruct(k).geometry.coords;if iscell(coords)coords=coords{1};end trainCoords{k}=squage(coords);if NumTrainRegionRegionRegionIdx=regionIdx+1;end trainCoords{k}(:,2)=brgb(regionIdx).空间引用(1).YWorldLimits(2)-…(trainCoords{k}(:,2)-brgb(regionIdx).空间引用(1).YWorldLimits(1));结束
列车材料=分类(列车材料);

可视化训练数据

我们还提供了可视化数据的方法,以确保您正在获取感兴趣的正确区域。使用函数bigimageshow,数据如下所示:

探索数据

从已保存的训练图像创建图像数据存储

首先,我们将创建一个 imageDatastore 用于“training_数据”文件夹。这用于管理图像文件的集合,其中每个单独的图像适合内存,但整个图像集合不一定适合内存。
为了进一步增强和预处理数据图像,我们建议查看以下资源:
imd = imageDatastore (“培训数据”“包含子文件夹”符合事实的...“文件扩展名”“.png”“标签源”“文件夹名称”
显示所有5种材料分布的计数。
labelInfo = countEachLabel (imd)
请注意,每种材质的样本数量可能会非常不同,这意味着这些类并不平衡。如果不解决此问题,这可能会影响模型的性能,因为这可能会使模型偏向于预测训练集中更频繁的材料。

为迁移学习配置预训练网络

在本例中,我们使用 ResNet-18神经网络 作为分类器的基线。您也可以使用其他网络来执行 转移学习
注意:您首先必须下载深度学习工具箱模型的ResNet-18网络支持包。万博1manbetx
网= resnet18;
为了重新训练ResNet-18对新图像进行分类,替换网络的最后一层全连接层和最后一层分类层。在ResNet-18中,这些层有名称 “fc1000” “分类层预测” ,分别。将新的完全连接层设置为与新数据集中的类数量相同的大小。为了在新层中比在转移层中学习得更快,使用该方法增加全连接层的学习速率因子 “权重学习速率因子” “BiasLearnRateFactor” 财产。
numclass=numel(categories(imds.Labels));lgraph=layerGraph(net);newFCLayer=fullyConnectedLayer(numclass,'Name','new_fc','WeightLearnRateFactor',10,'BiasLearnRateFactor',10);lgraph=replaceLayer(lgraph,'fc1000',newFCLayer);newClassLayer=classificationLayer('Name','new classoutput');lgraph=replaceLayer(lgraph,'ClassificationLayer_predictions',newClassLayer);
使用命令查看修改后的网络 分析网络 函数。你也可以用 深度网络设计师app
analyzeNetwork (lgraph);

培训方案

将图像数据存储配置为使用神经网络所需的输入图像大小 阅读和阅读
将培训数据拆分为培训和验证集。请注意,这是随机选择拆分,但您可能希望查看 splitEachLabel 函数用于其他选项,以确保类平衡
[imdsTrain,imdsVal]=splitEachLabel(imds,0.7,“随机”);
指定培训选项,包括小批量和验证数据。集 初始学习率 到一个小的值,以减慢在转移层的学习。在前面的步骤中,您增加了完全连接层的学习率因素,以加速新的最后层的学习。这种学习率设置的组合只会导致在新层中学习快,而在其他层中学习慢。
提示:您可以使用不同的选项来改进培训。 检查 文件培训选项 了解更多。
选项=培训选项(“sgdm”...“MiniBatchSize”,32,...“MaxEpochs”,5,...“初始学习率”,1e-4,...“洗牌”“每个时代”...“验证数据”,imdsVal,...“验证频率”,floor(numel(imdsTrain.Files)/(32*2)),...“冗长”错误的...“阴谋”“培训进度”);

培训网络

在这里,您将使用imagedatastores、layer graph和training选项来训练您的模型。
请注意,使用CPU进行培训需要很长时间。但是,MATLAB将自动检测您是否有 万博1manbetx支持的GPU 帮助你加速训练。
设定 doTraining 国旗下面 加载预存储的网络。
doTraining=假;如果doTrainingnetTransfer=列车网络(imdsTrain、lgraph、选项);其他负载resnet_presaved.mat结束

注:这是起始代码,最终精度低于80%。我们不想用这个代码赢得竞争,这取决于你去改进它,提交并赢得!

在测试集上预测

一旦我们有了经过训练的网络,我们就可以对测试集进行预测。为此,首先我们将为测试集创建一个图像数据存储。
IMD测试= imageDatastore (“测试数据”“文件扩展名”“.png”);
接下来我们预测标签( testMaterial) 和分数( 测试分数 )使用经过培训的网络
注意:这需要一些时间,但就像训练网络一样,MATLAB将确定您是否有受支持的GPU,并显著加快此过程。万博1manbetx
[testMaterial,testScores]=分类(净转移,imdsTest)
以下代码将显示一些测试图像的预测材料。
图形DisplayIndex=randi(numTest,4,1);k = 1:元素个数(displayIndices)testImg = readimage (imdsTest displayIndices (k));次要情节(2 2 k)imshow(testImg);标题(字符串(testMaterial(displayindexs(k))),“口译员”“没有”结束
感谢您跟随这段代码!我们很高兴知道你将如何修改这个启动代码,并使它成为你的。我们强烈建议您查看我们的 深度学习技巧 有关如何改进我们的基准模型的更多想法。
不要忘记访问竞赛页面开始,如果您有任何问题,请随时在DrivenData论坛与我们联系,或发邮件至studentcompetitions@mathworks.com。
|
  • 打印
  • 发送电子邮件

评论

如需留言,请点击在这里登录到您的MathWorks帐户或创建新帐户。