Error: Undefined function 'preprocessData' for input arguments of type 'cell'.

I am implementing MATLAB 2019b examle "Object Detection Using YOLO v2 Deep Learning"(https://www.mathworks.com/help/vision/ug/train-an-object-detector-using-you-only-look-once.html), but when I run the following line of code:
anchorBoxes = estimateAnchorBoxes(preprocessedTrainingData ,numAnchors)
it gives me error as mentioned in title. Thanks for helping out.
A small piece of code from example is mentioned below:
%...............Code..................................%
unzip vehicleDatasetImages.zip
data = load('vehicleDatasetGroundTruth.mat');
vehicleDataset = data.vehicleDataset;
rng(0)
shuffledIdx = randperm(height(vehicleDataset));
idx = floor(0.6 * height(vehicleDataset));
trainingDataTbl = vehicleDataset(shuffledIdx(1:idx),:);
imdsTrain = imageDatastore(trainingDataTbl{:,'imageFilename'});
bldsTrain = boxLabelDatastore(trainingDataTbl(:,'vehicle'));
trainingData = combine(imdsTrain,bldsTrain);
inputSize = [224 224 3];
preprocessedTrainingData = transform(trainingData, @(data)preprocessData(data,inputSize));
numAnchors = 5;
anchorBoxes = estimateAnchorBoxes(preprocessedTrainingData ,numAnchors)
%.................................................................................................................................................%

1 Comment

I am also getting the similar error. Unable to resolve it. I copied all the supporting function into a .m file. I then tried calling the function through its name in the command window but unable to do so. Someone please help how to go ahead with it.

Sign in to comment.

 Accepted Answer

The preprocessData function is a supporting function that is part of that example and is not on the MATLAB path in general. Scroll down to the Supporting Functions section of that example and make a copy of that function, either as a local function inside the file where you're implementing your own variant of the example or as a separate function file.

4 Comments

Thanks Steven, I have already tried it but still same. I separately save this local function in my working directly but issue didnt resolve yet.
As per your suggestion, I embedded this function in my .m file, now its working fine. Thanks for your quick and fruitful response. :)
I have changed the code for detection of balls from 1000 images but still stuck on following problem while executing code:
trainingDataForEstimation = transform(trainingData,@(data)preprocessData(data,inputSize));
numAnchors = 7;
[anchorBoxes, meanIoU] = estimateAnchorBoxes(trainingDataForEstimation, numAnchors)
OUTPUT:
Invalid transform function defined on datastore.
The cause of the error was:
Error using bboxresize>iParseInputs (line 89)
The value of 'bboxA' is invalid. Expected input number 1, bboxA, to be integer-valued.
Error in bboxresize (line 49)
params = iParseInputs(bboxA,scale);
Error in training>preprocessData (line 56)
data{2} = bboxresize(data{2},scale);
Error in training>@(data)preprocessData(data,inputSize) (line 17)
trainingDataForEstimation = transform(trainingData,@(data)preprocessData(data,inputSize));
Error in matlab.io.datastore.TransformedDatastore/read (line 148)
data = self.Transforms{ii}(data);
Error in matlab.io.Datastore/readall (line 250)
data = [data; read(copyds)]; %#ok<AGROW>
Error in matlab.io.datastore.TransformedDatastore/readall (line 188)
data = readall@matlab.io.Datastore(copyds);
Error in estimateAnchorBoxes>iReadallBoxes (line 270)
boxes = readall(ds);
Error in estimateAnchorBoxes>iCheckBoxesFromDatastore (line 215)
boxes = iReadallBoxes(ds);
Error in estimateAnchorBoxes>iParseInputs (line 168)
boxes = iCheckBoxesFromDatastore(datastore);
Error in estimateAnchorBoxes (line 136)
[boxes, numAnchors, params] = iParseInputs(datastore, numAnchors, varargin{:});
Error in training (line 19)
[anchorBoxes, meanIoU] = estimateAnchorBoxes(trainingDataForEstimation, numAnchors)
Hi, Did you find the solution??
Im getting the same problem

Sign in to comment.

More Answers (2)

some fix needed in preprocessing , first round and be sure it is positive top left , i think maybe check box outside image will be good , i didnt did it . also rounding of box cordinates is important !. also see that in image we have several bounding boxes and we check them all !
function data = preprocessData(data,targetSize)
% Resize image and bounding boxes to the targetSize.
scale = targetSize(1:2)./size(data{1},[1 2]);
data{1} = imresize(data{1},targetSize(1:2));
boxEstimate=round(data{2});
boxEstimate(:,1)=max(boxEstimate(:,1),1);
boxEstimate(:,2)=max(boxEstimate(:,2),1);
data{2} = bboxresize(boxEstimate,scale);
end

9 Comments

same fo the next function
function B = augmentData(A)
% Apply random horizontal flipping, and random X/Y scaling. Boxes that get
% scaled outside the bounds are clipped if the overlap is above 0.25. Also,
% jitter image color.
B = cell(size(A));
I = A{1};
sz = size(I);
if numel(sz)==3 && sz(3) == 3
I = jitterColorHSV(I,...
'Contrast',0.2,...
'Hue',0,...
'Saturation',0.1,...
'Brightness',0.2);
end
% Randomly flip and scale image.
tform = randomAffine2d('XReflection',true,'Scale',[1 1.1]);
rout = affineOutputView(sz,tform,'BoundsStyle','CenterOutput');
B{1} = imwarp(I,tform,'OutputView',rout);
% Apply same transform to boxes.
boxEstimate=round(A{2});
boxEstimate(:,1)=max(boxEstimate(:,1),1);
boxEstimate(:,2)=max(boxEstimate(:,2),1);
[B{2},indices] = bboxwarp(boxEstimate,tform,rout,'OverlapThreshold',0.25);
B{3} = A{3}(indices);
% Return original data only when all boxes are removed by warping.
if isempty(indices)
B = A;
end
end
The modified functions were extremely helpful! Thank you Michael!
Thanks Michael, I had a similar problem and your solution works well.

Sign in to comment.

Tejas Phutane i too have this error

1 Comment

I tried verifying 1000 images in batches of 50 images and found errors in total 60 images.This method solved my problem

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!