How to generate mask R-CNN training set data from matlab's image labeler

10 views (last 30 days)
I use Image labeler to mark images, Rectangle to mark object positions and Pixel to mark object categories. However, the generated gTruth file cannot be directly used for mask R CNN training, nor can it directly use the imageDatastore and boxLabelDatastore instructions to directly generate relevant data.
I followed the instructions on matlab's web page and used imageDatastore to grab the RGM image path from gTruth.
imageFilesA = gTruth.DataSource.Source;
imds = imageDatastore(imageFilesA);
Reorganize object position label data and use boxLabelDatastore to generate boxes and labels data.
rawBoxes = gTruth.LabelData{:, 1};
allBoxes = cell(size(rawBoxes,2));
for i = 1:numel(rawBoxes)
boxes = rawBoxes{i};
numBoxes = size(boxes, 1);
allBoxes{i,2} = string(repmat({'WWL'}, numBoxes, 1));
end
allBoxes = cell2table(allBoxes,'VariableNames',{'Boxes','Labels'});
blds = boxLabelDatastore(allBoxes);
But the final masks data cannot be generated. Because when I use imageDatastore to generate mask image file path data, I follow the instructions to generate H*W*M data (where H*W is the image size and M is the number of objects in the image).
Assuming that the first image has 4 markers and I generate a 1*4 cell image file path, an error will occur when using imageDatastore. If I store four image file paths into a 1*4 table, imageDatastore can be used, but when I need to combine three data later, a parameter error will be displayed.
Here is one of the methods I tried
maskPaths = gTruth.LabelData{:, 2};
numImages = numel(maskPaths);
logicalMasks = cell(numImages, 1);
tempdir='F:\MaskRCNN\ImageIMDS\';
targetMaskPaths = {};
for i = 1:numImages
mask = imread(maskPaths{i});
[H, W] = size(mask);
boxes = rawBoxes{i};
M = size(boxes, 1);
for j = 1:M
logicalMask = mask;
tempMaskFilePath = fullfile(tempdir, sprintf('mask_%d_target_%d.png', i, j));
imwrite(uint8(logicalMask), tempMaskFilePath);
targetMaskPaths{i,j} = tempMaskFilePath;
end
end
classes = ["WL"];
labelIDs = [0 1];
pxds = imageDatastore(targetMaskPaths);
Error message
Error using matlab.io.datastore.ImageDatastore (line 305)
Files must be a valid string scalar, character vector, cell array of character vectors,
string array, or a matlab.io.datastore.FileSet.
Error in imageDatastore (line 139)
ds = matlab.io.datastore.ImageDatastore(location, varargin{:});
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error in MaskTest (line 77)
pxds = imageDatastore(targetMaskPaths);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Here is one of the methods I tried
maskPaths = gTruth.LabelData{:, 2};
numImages = numel(maskPaths);
logicalMasks = cell(numImages, 1);
tempdir='F:\MaskRCNN\ImageIMDS\';
targetMaskPaths = {};
for i = 1:numImages
mask = imread(maskPaths{i});
[H, W] = size(mask);
boxes = rawBoxes{i};
M = size(boxes, 1);
targetMaskPaths = cell(M, 1);
for j = 1:M
logicalMask = mask;
tempMaskFilePath = fullfile(tempdir, sprintf('mask_%d_target_%d.png', i, j));
imwrite(uint8(logicalMask), tempMaskFilePath);
targetMaskPaths{i,j} = tempMaskFilePath;
end
logicalMasks{i} = targetMaskPaths';
end
classes = ["WL"];
labelIDs = [0 1];
pxds = imageDatastore(targetMaskPaths);
Error message
Error using trainMaskRCNN (line 181)
[trainedNet] = trainMaskRCNN(trainingData, net, options);
^^^^^^^^^^^^
Invalid argument at position 1. Expected input to be one of these types:
logical
Instead its type was uint8.
Error in MaskTest (line 99)
[trainedNet] = trainMaskRCNN(trainingData, net, options);

Answers (1)

Gayathri
Gayathri on 28 Oct 2024
I understand that you are facing an error while creating the ImageDatastore” object of the tempMaskFilePath in the first approach mentioned.
This is because ImageDatastore” function expects the input to be a valid string scalar, character vector, cell array of character vectors / string arrays or a matlab.io.datastore.FileSet”.
I created a sample code snippet to replicate the issue. To resolve this, we can make the “targetMaskPaths” variable to a one-dimensional array of string arrays using the line of code shown below.
targetMaskPaths{end+1} = tempMaskFilePath;
With this code we can obtain a structure for “pxds” variable as shown below.
For more information on “ImageDatastore” function please refer to the following link.
And for more information on Mask R-CNN, please refer to the below link.
Hope you find this information helpful.

Products


Release

R2024b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!