深度学习

理解和使用深度学习网络

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

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

加载和准备数据

将数据加载为一个大图像

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

将图像分割为RGB通道和蒙版

检查图像,你很快意识到这有4个通道:3个RGB通道和第四个不透明的掩模通道。使用辅助函数 separateChannels 我们正在移除不透明度蒙版通道。对于进一步的培训,我们将只使用3个RGB通道。
brgb = apply(bimg,1, @separateChannels,'UseParallel',true);

设置大图的空间参考

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

创建培训数据

训练集由3条信息组成,这些信息可以从每个区域的GeoJSON文件中解析出来
  1. 建筑ID
  2. 建筑多边形坐标(以经纬度为单位)
  3. 建筑材料
为了提取训练集,我们打开每个区域的GeoJSON文件,读取它,并使用 jsondecode 函数。
idx = 1: number (regionNames)Fid = fopen(“火车——”+ regionNames(idx) +“.geojson”);trainingStructs(idx) = jsondecode(fread(fid,inf,“*字符”));文件关闭(fid);结束
提取每个ROI的ID,材料和坐标,在我们循环训练集时增加区域的索引,以确保我们引用的是正确的区域,通过翻转建筑区域坐标的Y图像坐标来纠正坐标约定,将材料的文本数组转换为分类数组,以便后续分类。
regionIdx = 1;for k = 1:numTrain trainID{k} = trainingStruct(k).id;trainMaterial{k} = trainingStruct(k).properties.roof_material;坐标= trainingStruct(k).geometry.coordinates;如果iscell(坐标)坐标=坐标{1};end trainCoords{k} = squeeze(坐标);if numtrainregionscumaggregated (regionIdx) regionIdx = regionIdx + 1;end traincods {k}(:,2) = brgb(regionIdx).SpatialReferencing(1).YWorldLimits(2)-…(trainCoords {k} (:, 2) -brgb (regionIdx) .SpatialReferencing (1) .YWorldLimits (1));结束
trainMaterial = categorical(trainMaterial);

可视化培训数据

我们还提供了可视化数据的方法,以确保您抓取的是正确的感兴趣的区域。使用函数bigimageshow,数据是这样的:

探索数据

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

首先,我们将创建一个 imageDatastore 对于training_data文件夹。这用于管理图像文件的集合,其中每个单独的图像都适合内存,但整个图像集合并不一定适合。
为了进一步增强和预处理数据图像,我们建议查看以下资源:
imds = imageDatastore(“training_data”“IncludeSubfolders”,真的,...“FileExtensions”“使用”“LabelSource”“foldernames”
显示所有5种材料的分布情况。
labelInfo = countEachLabel(imds)
请注意,每种材料的样本数量可能非常不同,这意味着类别是不平衡的。如果你不解决这个问题,这可能会影响你的模型的性能,因为这可能会使模型偏向于预测训练集中更频繁的材料。

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

在本例中,我们使用 ResNet-18神经网络 作为分类器的基线。您也可以使用其他网络来执行 转移学习
注意:您首先必须下载ResNet-18网络支持包的深度学习工具箱模型。金宝app
Net = resnet18;
为了重新训练ResNet-18对新图像进行分类,需要替换网络的最后一个全连接层和最后一个分类层。在ResNet-18中,这些层有名称 “fc1000” 而且 “ClassificationLayer_predictions” ,分别。将新的全连接层设置为与新数据集中的类数量相同的大小。为了在新层中比在转移层中更快地学习,可以使用函数增加全连接层的学习率因子 “WeightLearnRateFactor” 而且 “BiasLearnRateFactor” 属性。
numClasses = numel(categories(imds.Labels));lgraph = layerGraph(net);newFCLayer = fullyConnectedLayer(numClasses,'Name','new_fc','WeightLearnRateFactor',10,'BiasLearnRateFactor',10);lgraph = replaceLayer(lgraph,'fc1000',newFCLayer);newClassLayer = classificationLayer('Name','new_classoutput');lgraph = replaceLayer(lgraph,'ClassificationLayer_predictions',newClassLayer);
命令查看修改后的网络 analyzeNetwork 函数。也可以使用 深度网络设计器应用程序
analyzeNetwork (lgraph);

培训方案

配置图像数据存储以使用神经网络所需的输入图像大小。为此,我们注册了一个名为 readAndResize
将训练数据分成训练集和验证集。注意,这是随机选择一个分割,但您可能想要查看 splitEachLabel 函数的其他选项,以确保类是平衡的
[imdsTrain,imdsVal] = splitEachLabel(imds,0.7,“随机”);
指定培训选项,包括小批量大小和验证数据。集 InitialLearnRate 以较小的值减慢在迁移层的学习速度。在前面的步骤中,您增加了全连接层的学习率因子,以加快新的最终层的学习速度。这种学习率设置的组合导致只在新层中快速学习,而在其他层中学习较慢。
提示:您可以使用不同的选项来改进培训。 请查看 文档trainingOptions 了解更多。
选项= trainingOptions(“个”...“MiniBatchSize”32岁的...“MaxEpochs”5,...“InitialLearnRate”1的军医,...“洗牌”“every-epoch”...“ValidationData”imdsVal,...“ValidationFrequency”、地板(元素个数(imdsTrain.Files) / (32 * 2),...“详细”假的,...“阴谋”“训练进步”);

培训网络

在这里,您将使用imagedatastores,图层图和训练选项来训练您的模型。
注意,使用CPU进行训练需要很长时间。但是,MATLAB会自动检测你是否有 金宝app支持GPU 帮助你加速训练。
设置 doTraining 标记为 加载一个预先保存的网络。
doTraining= false;如果doTrainingnetTransfer = trainNetwork(imdsTrain,lgraph,options);其他负载resnet_presaved.mat结束

注意:这是初始代码,最终精度低于80%。我们并不是在试图用这些代码赢得竞争,而是取决于你来改进它,提交并赢得比赛!

对测试集进行预测

一旦我们有了训练好的网络,我们就可以在测试集上进行预测。为此,首先我们将为测试集创建一个图像数据存储。
imdsTest= imageDatastore (“test_data”“FileExtensions”“使用”);
接下来我们预测标签( testMaterial) 和分数( testScores )使用训练好的网络
注意:这将花费一些时间,但就像训练网络一样,MATLAB将确定您是否有受支持的GPU,并显著加快这一过程。金宝app
[testMaterial,testScores] = category (netTransfer,imdsTest)
下面的代码将显示一些测试图像的预测材料。
数字displayindexes = randi(numTest,4,1);k = 1:数值(displayindexes)testImg = readimage(imdsTest,displayIndices(k));次要情节(2 2 k)imshow (testImg);标题(string (testMaterial (displayIndices (k))),“翻译”“没有”结束
感谢您跟随这段代码!我们很高兴知道您将如何修改此启动器代码并使其成为您的。我们强烈建议查看我们的 深度学习技巧和技巧页面 有关如何改进基准测试模型的更多想法。
不要忘记访问比赛页面开始,如果您有任何进一步的问题,请随时在DrivenData论坛上与我们联系或发送电子邮件至studentcompetitions@mathworks.com。
|
  • 打印
  • 发送电子邮件

评论

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