How to create a box label datastore?

Hello, I've been trying to create a box label datastore using the blds function.
What I understood, is that I need to create a table with the first column containing a type 'double' array, coordinates of bounding boxes, and a string variable with its class.
Now, how can I assign a 1x4 'double' vector into 1 single cell? In this 'fake' case, coordinates of bb are all the same, so is the class. I would need something like:
[0, 0, 300, 300] 'stopSignal'
[0, 0, 300, 300] 'stopSignal'
bbox = [0 0 300 300]; %images: 4170
maxSamples = 4170;
varTypes = {'double', 'string'};
size = [4170 2];
T = table('size',size, 'VariableTypes', varTypes);
for i = 1:maxSamples
T (i,1) = {bbox};
end
The error occurs because bbox is a 1x4 double vector, while MATLAB expects only a 1x1 variable to be stored in one single cell.
What am I missing?

 Accepted Answer

you can easily create and edit a cell. then convert it to table.
here is an example:
boxes = cell(10,2); %number of images x 2=(coordinates of box , labels)
% fill boxes :
for i=1:10
n = randi(3); % number of box in i-th image, it maybe diffrenent so i consider it
boxes{i,1} = rand(n,4); % nx4 each row coordinate of a box
boxes{i,2} = string(randi(2,n,1)); % here i create n label for every image between 2 possible labels
end
% Convert to table
boxes = cell2table(boxes,'VariableNames',{'Boxes','Labels'});
blds = boxLabelDatastore(boxes)
blds =
boxLabelDatastore with properties: LabelData: 10x2 cell array {[0.1264 0.5256 0.1346 0.2392]} {[1 ]} {[0.3028 0.0742 0.1592 0.0875]} {[2 ]} {3×4 double } {3×1 categorical} ... and 7 more rows ReadSize: 1
Remember if this blds is gonna use for a deep learning applications, values of each box should be checked. 0 is invalid for deep learning. and sum of 3-th element and first one shouldn't be more than image width, and sum of 4th and 2th element shouldn't be more than image height.

3 Comments

Thank you for your answer! But sadly this didn't fix my problem: if I run your code, everything is perfect. But in my case, instead of using:
boxes {i,1} = rand(n,4);
I'm using:
boxes {i,1} = [2 2 298 298];
and this gives the following error:
Error using
boxLabelDatastore>iAssertValidBBoxFormat (line
861)
The size of bounding box data must be M-by-4,
M-by-5, or M-by-9, where M is the number of boxes
in each table element. The column in the training
data table that contains the bounding boxes must
be a cell array.
I don't understand. Using rand gives an array. My imput is an array. What's the difference?
My table:
Table created by your code:
There's a pretty clear difference. I don't understand why!
Oh yes. when all boxes are 1x4, the cell2table automatically change the table first column to double not cell.
so here's the solution:
create boxes as cell, then use table function.
for i=1:10
boxes(i,1) = {[2 2 298 298]};
end
labels = num2cell(string(randi(2,10,1)));
boxes = table(boxes,labels);
blds = boxLabelDatastore(boxes)
blds =
boxLabelDatastore with properties: LabelData: 10x2 cell array {[2 2 298 298]} {[2]} {[2 2 298 298]} {[2]} {[2 2 298 298]} {[1]} ... and 7 more rows ReadSize: 1
Thank you! Works like a charm.

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!