大型训练数据集导致错误“内存不足”。在选项中输入“帮助内存”。引起的原因:内存不足。在选项中输入“帮助记忆”。
5次浏览(过去30天)
显示旧的注释
玛丽亚Rasib
2021年3月13日
你好!我目前正在进行语义分割项目,遵循链接中提到的代码
“//www.tianjin-qmedu.com/help/vision/ug/semantic-segmentation-using-deep-learning.html”。
我使用2500张原始图像和2500张720x960x3大小和50个类的标记图像在RTX 2080Ti, 11GB GPU上训练语义分割(Resnet网络),但我面临着错误,“内存不足”。在选项中输入“帮助内存”。引起的原因:内存不足。在选项中输入“帮助记忆”。
先谢谢你。
答案(1)
神骑士
2021年3月14日
您是否遵循了示例中的以下建议?:
“CamVid数据集中的图像大小为720 * 960。图像大小的选择是为了在NVIDIA™Titan X(内存为12 GB)上训练时能够容纳足够大的一批图像。如果你的GPU没有足够的内存,或者减少训练批次的大小,你可能需要将图像调整到更小的大小。”
在您的情况下,您正在耗尽CPU内存。也许您正在尝试将整个数据集作为单个变量加载到MATLAB中,而不是将数据存储在文件中?
5个评论
玛丽亚Rasib
2021年3月14日
在这里,我将粘贴整个代码与函数!请告诉我哪里做错了
{
clear ()
resnet18 ();
%加载数据集
分割= fullfile(pwd,'CamVid');
imgDir = fullfile(分割,'images');
imds = imageDatastore(imgDir);
I = readimage(imds,10);
I = histeq(I);
imshow(我)
加载CamVid像素标记图像
类= [
“天空”
“桥”
“建筑”
“墙”
“colum_pole”
“traffic_cone”
“electric_pole”
“street_light”
“traffic_light”
“paved_roads”
“unpaved_roads”
“solid_yellow_lanes”
“pavement_sidewalk”
“concrete_barrier”
“篱笆”
“police_vehicle”
“construction_vehicle”
“military_vehcles”
“fribrigade”
“traditional_truck”
“container_truck”
“hino_bus”
“traditional_bus”
“汽车”
“范”
“mini_van”
“黄包车”
“购物车”
“皮卡”
“mini_pickup”
“加油”
“救护车”
“摩托车”
“树”
“vegetation_misc”
“sign_board”
“Speed_limit”
“广告”
“Direction_board”
“Distance_board”
“行人”
“山”
“grassy_road_divider”
“自行车”
];
labelIDs = camvidPixelLabelIDs();
labelDir = fullfile(分割,'label');
pxds = pixelLabelDatastore(labelDir,classes,labelIDs);
读取并显示一个像素标记的图像,方法是将其覆盖在图像的顶部。。
C = readimage(pxds,10);
cmap = camvidColorMap;
B = labeloverlay(I,C,'ColorMap',cmap);
imshow (B)
pixelLabelColorbar(提出、类);
分析数据集统计信息
tbl = countEachLabel(pxds);
frequency = tbl.PixelCount/sum(tbl.PixelCount);
数字
栏(1:元素个数(类)、频率)
xticks(1:元素个数(类))
xticklabels (tbl.Name)
xtickangle (45)
ylabel(频率)
准备培训和测试数据
[imdsTrain, imdsVal, imdsTest, pxdsTrain, pxdsVal, pxdsTest] = partitionCamVidData(imds,pxds);
numTrainingImages = numel(imdsTrain.Files);
numValImages = nummel (imdsVal.Files);
numTestingImages = nummel (imdste . files);
%创建网络
指定网络映像大小。这通常与训练图像大小相同。
imageSize = [720 960 3];
指定类的数量。
numClasses = nummel(类);
创建DeepLab v3+。
lgraph = deeplabv3plusLayers(imageSize, numClasses, "resnet18");
使用类权重平衡类
imageFreq = tbl。PixelCount ./ tb . imagepixelcount;
classWeights = median(imageFreq) ./ imageFreq;
使用pixelClassificationLayer指定类的权重。
%"由于错误而产生的评论"
pxLayer = pixelClassificationLayer('Name','labels','Classes',tbl.Name,'ClassWeights', ClassWeights);
lgraph = replaceLayer(lgraph,"classification",pxLayer);
%选择培训选项
定义验证数据。
pximdsVal = pixelLabelImageDatastore(imdsVal,pxdsVal);
定义培训选项。
options = trainingOptions('sgdm',…
“LearnRateSchedule”、“分段”,…
“LearnRateDropPeriod”10…
“LearnRateDropFactor”,0.3,…
“动量”、0.9……
“InitialLearnRate”,1 e - 3,…
“L2Regularization”,0.005,…
ValidationData, pximdsVal,……
“MaxEpochs”10…
“MiniBatchSize”4…
“洗牌”、“every-epoch’,……
'CheckpointPath', tempdir,…
“VerboseFrequency”,2,…
“阴谋”、“训练进步”,…
“ValidationPatience”,4);
%开始训练
pximds = pixelLabelImageDatastore(imdsTrain,pxdsTrain);
%pximds =高(pximds);
%用于预负荷训练
[net, info] = trainNetwork(pximds,lgraph,options);
在一个映像上测试网络
I = readimage(imdsTest,3);
C = semanticseg(I, net);
显示结果\
B = labeloverlay(I,C,'Colormap',cmap,' transparent ',0.4);
imshow (B)
pixelLabelColorbar(提出、类);
%将C中的结果与存储在pxdsTest中的预期地面真相进行比较
expectedResult = readimage(pxdsTest,3);
实际= uint8(C);
expect = uint8(expectedResult);
预计imshowpair(实际)
使用jecord函数
iou = jaccard(C,expectedResult);
表(类、借据)
%评估训练网络
pxdsResults = semanticseg(imdsTest,net,…
“MiniBatchSize”4…
WriteLocation, tempdir,……
“详细”,假);
metrics = evaluateSemanticSegmentation(pxdsResults,pxdsTest,'Verbose',false);
指标。DataSetMetrics
指标。ClassMetrics
逐一启动所有函数
CamVid PixelLabelDs.m . % start
函数labelIDs = camvidPixelLabelIDs()
labelIDs = [
%的“天空”
135 206 236;...%的“天空”
%“建设”
166 227 027;...%“桥”
074 194 154;...%“建设”
163 046 018;...%的“墙”
%“极”
030 073 204;...%”Column_Pole”
251 116 077;...%”TrafficCone”
132 017 209;...%”electric_pole”
078 080 199;...%“路灯”
023 125 202;...%“红绿灯”
%的道路
119 061 128;...%”pavedRoad”
217 112 230;...%”unpaved_road”
212 218 030;...%“实黄线”
118 103 122;...%”pavement_Sidewalk”
225 150 119;...%”concrete_barrier”
155 104 041;...%“栅栏”
%“车辆”
117 082 016;...% "police_vehicle "
126 165 140;...%”constuction_vehicle”
169 166 090;...%”military_vehicle”
160 237 109;...%“消防队”
074 054 062;...%“传统卡车”
178 009 055;...%货柜车
200 029 177;...%”Hino_bus”
240 009 145;...%“传统巴士”
255 001 077;...%的“汽车”
200 165 038;...%“范”
080 216 156;...%”mini_van”
092 083 219;...%的“黄包车”
253 057 087;...%“购物车”
% 005 172 216;...%”qingqi”
082 035 004;...%“皮卡”
196 004 086;...%”mini-pickup”
163 176 081;...%”油轮”
082 043 112;...%“救护车”
192 099 099;...%”motor_bike”
%的“树”
055 088 015;...%的“树”
128 222 091;...%”VegetationMisc”
%”SignSymbol”
196 138 200;...%的“招牌”
240 146 005;...%”speedlimit”
211 203 050;...%的“广告”
181 113 130;...%”Directionboard”
097 132 151;...%”distanceboard”
%“行人”
167 046 047;...%“行人”
% 081 058 088;...%的“动物”
%“山”
120 114 104;...%的山脉
001 037 003;…% grassy_road_divider
252 002 002;...%的自行车
];
结束
CamVid PixelLabelDs.m的%end
%开始像素颜色条
函数pixelLabelColorbar(cmap, classNames)
在当前轴上添加一个颜色条。颜色条被格式化
%显示带有颜色的类名。
甘氨胆酸colormap(提出)
将色条添加到当前图形。
C = colorbar('peer', gca);
使用类名作为标记。
c.TickLabels = classNames;
numClasses = size(cmap,1);
%中心打勾标签。
c.Ticks = 1/(numClasses*2):1/numClasses:1;
删除标记。
c.TickLength = 0;
结束
像素颜色条的%结束
像素颜色条的%结束
% startcomvidcolormap.m
函数cmap = camvidColorMap()
定义CamVid数据集使用的颜色图。
Cmap = [
135 206 236;...%的“天空”
166 227 027;...%“桥”
074 194 154;...%“建设”
163 046 018;...%的“墙”
030 073 204;...%”Column_Pole”
251 116 077;...%”TrafficCone”
132 017 209;...%”electric_pole”
078 080 199;...%“路灯”
023 125 202;...%“红绿灯”
119 061 128;...%”pavedRoad”
217 112 230;...%”unpaved_road”
212 218 030;...%“实黄线”
118 103 122;...%”pavement_Sidewalk”
225 150 119;...%”concrete_barrier”
155 104 041;...%“栅栏”
117 082 016;...% "police_vehicle "
126 165 140;...%”constuction_vehicle”
169 166 090;...%”military_vehicle”
160 237 109;...%“消防队”
074 054 062;...%“传统卡车”
178 009 055;...%货柜车
200 029 177;...%”Hino_bus”
240 009 145;...%“传统巴士”
255 001 077;...%的“汽车”
200 165 038;...%“范”
080 216 156;...%”mini_van”
092 083 219;...%的“黄包车”
253 057 087;...%“购物车”
%005 172 216;...%”qingqi”
082 035 004;...%“皮卡”
196 004 086;...%”mini-pickup”
163 176 081;...%”油轮”
082 043 112;...%“救护车”
192 099 099;...%”motor_bike”
055 088 015;...%的“树”
128 222 091;...%”VegetationMisc”
196 138 200;...%的“招牌”
240 146 005;...%”speedlimit”
211 203 050;...%的“广告”
181 113 130;...%”Directionboard”
097 132 151;...%”distanceboard”
167 046 047;...%“行人”
% 081 058 088;...%的“动物”
120 114 104;...%的山脉
001 037 003;...% grassy_road_divider
252 002 002;...%的自行车
];
%在[0 1]之间归一化。
Cmap = Cmap ./ 255;
结束
Comvid colormap.m的结束代码
分区comvid
function [imdsTrain, imdsVal, imdsTest, pxdsTrain, pxdsVal, pxdsTest] = partitionCamVidData(imds,pxds)
对CamVid数据进行分区,随机选取60%的数据进行训练。的
% rest用于测试。
设置初始随机状态,例如再现性。
rng (0);
numFiles = nummel (imds.Files);
shuffledIndices = randperm(numFiles);
使用60%的图像进行训练。
numTrain = round(0.80 * numFiles);
trainingIdx = shuffledIndices(1:numTrain);
使用20%的图像进行验证
numVal = round(0.10 * numFiles);
valIdx = shuffledIndices(numTrain+1:numTrain+numVal);
使用其余的测试。
testdx = shuffledIndices(numTrain+numVal+1:end);
为训练和测试创建图像数据存储。
trainingImages = imds.Files(trainingIdx);
valImages = imds.Files(valIdx);
testImages = imds.Files(testdx);
imdsTrain = imageDatastore(trainingImages);
imdsVal = imageDatastore(valImages);
imdsTest = imageDatastore(testImages);
提取类和标签id信息。
classes = pxds.ClassNames;
labelIDs = camvidPixelLabelIDs();
为训练和测试创建像素标签数据存储。
trainingLabels = pxds.Files(trainingIdx);
valLabels = pxds.Files(valIdx);
testLabels = pxds.Files(testdx);
pxdsTrain = pixelLabelDatastore(trainingLabels, classes, labelIDs);
pxdsVal = pixelLabelDatastore(valLabels, classes, labelIDs);
pxdsTest = pixelLabelDatastore(testLabels, classes, labelIDs);
结束
%结束分区camvid
}
神骑士
2021年3月18日
我不是深度学习方面的专家。我的理解是,对于语义分割,你最好裁剪输入,而不是减少采样。然而,模型的训练输入比它用来处理的图像要小是正常的
semanticseg
函数负责这个。
另请参阅
发生错误
由于对页面所做的更改,无法完成操作。重新加载页面以查看其更新状态。
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。