Updated image classifier and object detector tests

This commit is contained in:
Prianka Liz Kariat 2023-05-02 08:45:44 +05:30
parent 82a238a0c8
commit 8284732874
2 changed files with 65 additions and 60 deletions

View File

@ -27,8 +27,8 @@ static NSDictionary *const kMultiObjectsRotatedImage =
@{@"name" : @"multi_objects_rotated", @"type" : @"jpg"}; @{@"name" : @"multi_objects_rotated", @"type" : @"jpg"};
static const int kMobileNetCategoriesCount = 1001; static const int kMobileNetCategoriesCount = 1001;
static NSString *const kExpectedErrorDomain = @"com.google.mediapipe.tasks"; static NSString *const kExpectedErrorDomain = @"com.google.mediapipe.tasks";
static NSString *const kLiveStreamTestsDictImageClassifierKey= @"image_classifier"; static NSString *const kLiveStreamTestsDictImageClassifierKey = @"image_classifier";
static NSString *const kLiveStreamTestsDictExpectationKey= @"expectation"; static NSString *const kLiveStreamTestsDictExpectationKey = @"expectation";
#define AssertEqualErrors(error, expectedError) \ #define AssertEqualErrors(error, expectedError) \
XCTAssertNotNil(error); \ XCTAssertNotNil(error); \
@ -56,7 +56,6 @@ static NSString *const kLiveStreamTestsDictExpectationKey= @"expectation";
XCTAssertEqual(imageClassifierResult.classificationResult.classifications.count, 1); \ XCTAssertEqual(imageClassifierResult.classificationResult.classifications.count, 1); \
XCTAssertEqual(imageClassifierResult.classificationResult.classifications[0].headIndex, 0); XCTAssertEqual(imageClassifierResult.classificationResult.classifications[0].headIndex, 0);
@interface MPPImageClassifierTests : XCTestCase <MPPImageClassifierDelegate> { @interface MPPImageClassifierTests : XCTestCase <MPPImageClassifierDelegate> {
NSDictionary *liveStreamSucceedsTestDict; NSDictionary *liveStreamSucceedsTestDict;
NSDictionary *outOfOrderTimestampTestDict; NSDictionary *outOfOrderTimestampTestDict;
@ -442,7 +441,7 @@ static NSString *const kLiveStreamTestsDictExpectationKey= @"expectation";
#pragma mark Running Mode Tests #pragma mark Running Mode Tests
- (void)testCreateImageClassifierFailsWithResultListenerInNonLiveStreamMode { - (void)testCreateImageClassifierFailsWithDelegateInNonLiveStreamMode {
MPPRunningMode runningModesToTest[] = {MPPRunningModeImage, MPPRunningModeVideo}; MPPRunningMode runningModesToTest[] = {MPPRunningModeImage, MPPRunningModeVideo};
for (int i = 0; i < sizeof(runningModesToTest) / sizeof(runningModesToTest[0]); i++) { for (int i = 0; i < sizeof(runningModesToTest) / sizeof(runningModesToTest[0]); i++) {
MPPImageClassifierOptions *options = [self imageClassifierOptionsWithModelName:kFloatModelName]; MPPImageClassifierOptions *options = [self imageClassifierOptionsWithModelName:kFloatModelName];
@ -453,30 +452,31 @@ static NSString *const kLiveStreamTestsDictExpectationKey= @"expectation";
[self [self
assertCreateImageClassifierWithOptions:options assertCreateImageClassifierWithOptions:options
failsWithExpectedError: failsWithExpectedError:
[NSError [NSError errorWithDomain:kExpectedErrorDomain
errorWithDomain:kExpectedErrorDomain
code:MPPTasksErrorCodeInvalidArgumentError code:MPPTasksErrorCodeInvalidArgumentError
userInfo:@{ userInfo:@{
NSLocalizedDescriptionKey : NSLocalizedDescriptionKey :
@"The vision task is in image or video mode. The delegate must not be" @"The vision task is in image or video mode. The "
@"set in the task's options." @"delegate must not be set in the task's options."
}]]; }]];
} }
} }
- (void)testCreateImageClassifierFailsWithMissingResultListenerInLiveStreamMode { - (void)testCreateImageClassifierFailsWithMissingDelegateInLiveStreamMode {
MPPImageClassifierOptions *options = [self imageClassifierOptionsWithModelName:kFloatModelName]; MPPImageClassifierOptions *options = [self imageClassifierOptionsWithModelName:kFloatModelName];
options.runningMode = MPPRunningModeLiveStream; options.runningMode = MPPRunningModeLiveStream;
[self assertCreateImageClassifierWithOptions:options [self assertCreateImageClassifierWithOptions:options
failsWithExpectedError: failsWithExpectedError:
[NSError errorWithDomain:kExpectedErrorDomain [NSError
errorWithDomain:kExpectedErrorDomain
code:MPPTasksErrorCodeInvalidArgumentError code:MPPTasksErrorCodeInvalidArgumentError
userInfo:@{ userInfo:@{
NSLocalizedDescriptionKey : NSLocalizedDescriptionKey :
@"The vision task is in live stream mode. An object must be set as the delegate of" @"The vision task is in live stream mode. An object "
@"the task in the its options to ensure asynchronous delivery of results." @"must be set as the delegate of the task in its "
@"options to ensure asynchronous delivery of results."
}]]; }]];
} }
@ -619,7 +619,7 @@ static NSString *const kLiveStreamTestsDictExpectationKey= @"expectation";
MPPImageClassifierOptions *options = [self imageClassifierOptionsWithModelName:kFloatModelName]; MPPImageClassifierOptions *options = [self imageClassifierOptionsWithModelName:kFloatModelName];
NSInteger maxResults = 3; NSInteger maxResults = 3;
options.maxResults = maxResults; options.maxResults = 3;
options.runningMode = MPPRunningModeLiveStream; options.runningMode = MPPRunningModeLiveStream;
options.imageClassifierDelegate = self; options.imageClassifierDelegate = self;
@ -631,7 +631,10 @@ static NSString *const kLiveStreamTestsDictExpectationKey= @"expectation";
MPPImageClassifier *imageClassifier = [self imageClassifierWithOptionsSucceeds:options]; MPPImageClassifier *imageClassifier = [self imageClassifierWithOptionsSucceeds:options];
outOfOrderTimestampTestDict = @{kLiveStreamTestsDictImageClassifierKey: imageClassifier, kLiveStreamTestsDictExpectationKey: expectation}; outOfOrderTimestampTestDict = @{
kLiveStreamTestsDictImageClassifierKey : imageClassifier,
kLiveStreamTestsDictExpectationKey : expectation
};
MPPImage *image = [self imageWithFileInfo:kBurgerImage]; MPPImage *image = [self imageWithFileInfo:kBurgerImage];
@ -649,7 +652,7 @@ static NSString *const kLiveStreamTestsDictExpectationKey= @"expectation";
}]; }];
AssertEqualErrors(error, expectedError); AssertEqualErrors(error, expectedError);
[self waitForExpectations:@[expectation] timeout:1e-2f]; [self waitForExpectations:@[ expectation ] timeout:1e-2f];
} }
- (void)testClassifyWithLiveStreamModeSucceeds { - (void)testClassifyWithLiveStreamModeSucceeds {
@ -680,10 +683,12 @@ static NSString *const kLiveStreamTestsDictExpectationKey= @"expectation";
expectation.expectedFulfillmentCount = iterationCount + 1; expectation.expectedFulfillmentCount = iterationCount + 1;
expectation.inverted = YES; expectation.inverted = YES;
MPPImageClassifier *imageClassifier = [self imageClassifierWithOptionsSucceeds:options]; MPPImageClassifier *imageClassifier = [self imageClassifierWithOptionsSucceeds:options];
liveStreamSucceedsTestDict = @{kLiveStreamTestsDictImageClassifierKey: imageClassifier, kLiveStreamTestsDictExpectationKey: expectation}; liveStreamSucceedsTestDict = @{
kLiveStreamTestsDictImageClassifierKey : imageClassifier,
kLiveStreamTestsDictExpectationKey : expectation
};
// TODO: Mimic initialization from CMSampleBuffer as live stream mode is most likely to be used // TODO: Mimic initialization from CMSampleBuffer as live stream mode is most likely to be used
// with the iOS camera. AVCaptureVideoDataOutput sample buffer delegates provide frames of type // with the iOS camera. AVCaptureVideoDataOutput sample buffer delegates provide frames of type
@ -694,11 +699,11 @@ static NSString *const kLiveStreamTestsDictExpectationKey= @"expectation";
XCTAssertTrue([imageClassifier classifyAsyncImage:image timestampInMilliseconds:i error:nil]); XCTAssertTrue([imageClassifier classifyAsyncImage:image timestampInMilliseconds:i error:nil]);
} }
[self waitForExpectations:@[expectation] timeout:5]; [self waitForExpectations:@[ expectation ] timeout:1e-2f];
} }
- (void)imageClassifier:(MPPImageClassifier *)imageClassifier - (void)imageClassifier:(MPPImageClassifier *)imageClassifier
didFinishImageClassificationWithResult:(MPPImageClassifierResult *)imageClassifierResult didFinishClassificationWithResult:(MPPImageClassifierResult *)imageClassifierResult
timestampInMilliseconds:(NSInteger)timestampInMilliseconds timestampInMilliseconds:(NSInteger)timestampInMilliseconds
error:(NSError *)error { error:(NSError *)error {
NSInteger maxResults = 3; NSInteger maxResults = 3;
@ -710,8 +715,8 @@ static NSString *const kLiveStreamTestsDictExpectationKey= @"expectation";
if (imageClassifier == outOfOrderTimestampTestDict[kLiveStreamTestsDictImageClassifierKey]) { if (imageClassifier == outOfOrderTimestampTestDict[kLiveStreamTestsDictImageClassifierKey]) {
[outOfOrderTimestampTestDict[kLiveStreamTestsDictExpectationKey] fulfill]; [outOfOrderTimestampTestDict[kLiveStreamTestsDictExpectationKey] fulfill];
} } else if (imageClassifier ==
else if (imageClassifier == liveStreamSucceedsTestDict[kLiveStreamTestsDictImageClassifierKey]) { liveStreamSucceedsTestDict[kLiveStreamTestsDictImageClassifierKey]) {
[liveStreamSucceedsTestDict[kLiveStreamTestsDictExpectationKey] fulfill]; [liveStreamSucceedsTestDict[kLiveStreamTestsDictExpectationKey] fulfill];
} }
} }

View File

@ -451,7 +451,7 @@ static NSString *const kLiveStreamTestsDictExpectationKey = @"expectation";
#pragma mark Running Mode Tests #pragma mark Running Mode Tests
- (void)testCreateObjectDetectorFailsWithResultListenerInNonLiveStreamMode { - (void)testCreateObjectDetectorFailsWithDelegateInNonLiveStreamMode {
MPPRunningMode runningModesToTest[] = {MPPRunningModeImage, MPPRunningModeVideo}; MPPRunningMode runningModesToTest[] = {MPPRunningModeImage, MPPRunningModeVideo};
for (int i = 0; i < sizeof(runningModesToTest) / sizeof(runningModesToTest[0]); i++) { for (int i = 0; i < sizeof(runningModesToTest) / sizeof(runningModesToTest[0]); i++) {
MPPObjectDetectorOptions *options = [self objectDetectorOptionsWithModelName:kModelName]; MPPObjectDetectorOptions *options = [self objectDetectorOptionsWithModelName:kModelName];
@ -472,7 +472,7 @@ static NSString *const kLiveStreamTestsDictExpectationKey = @"expectation";
} }
} }
- (void)testCreateObjectDetectorFailsWithMissingResultListenerInLiveStreamMode { - (void)testCreateObjectDetectorFailsWithMissingDelegateInLiveStreamMode {
MPPObjectDetectorOptions *options = [self objectDetectorOptionsWithModelName:kModelName]; MPPObjectDetectorOptions *options = [self objectDetectorOptionsWithModelName:kModelName];
options.runningMode = MPPRunningModeLiveStream; options.runningMode = MPPRunningModeLiveStream;
@ -484,9 +484,10 @@ static NSString *const kLiveStreamTestsDictExpectationKey = @"expectation";
userInfo:@{ userInfo:@{
NSLocalizedDescriptionKey : NSLocalizedDescriptionKey :
@"The vision task is in live stream mode. An " @"The vision task is in live stream mode. An "
@"object must be set as the delegate of" @"object must be set as the "
@"the task in the its options to ensure " @"delegate of the task in its options to ensure "
@"asynchronous delivery of results." @"asynchronous delivery of "
@"results."
}]]; }]];
} }
@ -567,10 +568,7 @@ static NSString *const kLiveStreamTestsDictExpectationKey = @"expectation";
MPPObjectDetectorOptions *options = [self objectDetectorOptionsWithModelName:kModelName]; MPPObjectDetectorOptions *options = [self objectDetectorOptionsWithModelName:kModelName];
options.runningMode = MPPRunningModeLiveStream; options.runningMode = MPPRunningModeLiveStream;
options.completion = options.objectDetectorDelegate = self;
^(MPPObjectDetectionResult *result, NSInteger timestampInMilliseconds, NSError *error) {
};
MPPObjectDetector *objectDetector = [self objectDetectorWithOptionsSucceeds:options]; MPPObjectDetector *objectDetector = [self objectDetectorWithOptionsSucceeds:options];
@ -635,13 +633,14 @@ static NSString *const kLiveStreamTestsDictExpectationKey = @"expectation";
options.maxResults = maxResults; options.maxResults = maxResults;
options.runningMode = MPPRunningModeLiveStream; options.runningMode = MPPRunningModeLiveStream;
options.objectDetectorDelegate = self;
XCTestExpectation *expectation = [[XCTestExpectation alloc] XCTestExpectation *expectation = [[XCTestExpectation alloc]
initWithDescription:@"detectWithOutOfOrderTimestampsAndLiveStream"]; initWithDescription:@"detectWithOutOfOrderTimestampsAndLiveStream"];
expectation.expectedFulfillmentCount = 1; expectation.expectedFulfillmentCount = 1;
MPPObjectDetector *objectDetector = [self objectDetectorWithOptionsSucceeds:options]; MPPObjectDetector *objectDetector = [self objectDetectorWithOptionsSucceeds:options];
liveStreamSucceedsTestDict = { liveStreamSucceedsTestDict = @{
kLiveStreamTestsDictObjectDetectorKey : objectDetector, kLiveStreamTestsDictObjectDetectorKey : objectDetector,
kLiveStreamTestsDictExpectationKey : expectation kLiveStreamTestsDictExpectationKey : expectation
}; };
@ -694,7 +693,7 @@ static NSString *const kLiveStreamTestsDictExpectationKey = @"expectation";
MPPObjectDetector *objectDetector = [self objectDetectorWithOptionsSucceeds:options]; MPPObjectDetector *objectDetector = [self objectDetectorWithOptionsSucceeds:options];
liveStreamSucceedsTestDict = { liveStreamSucceedsTestDict = @{
kLiveStreamTestsDictObjectDetectorKey : objectDetector, kLiveStreamTestsDictObjectDetectorKey : objectDetector,
kLiveStreamTestsDictExpectationKey : expectation kLiveStreamTestsDictExpectationKey : expectation
}; };
@ -711,12 +710,13 @@ static NSString *const kLiveStreamTestsDictExpectationKey = @"expectation";
[self waitForExpectations:@[ expectation ] timeout:0.5]; [self waitForExpectations:@[ expectation ] timeout:0.5];
} }
#pragma mark MPPObjectDetectorDelegate Methods
- (void)objectDetector:(MPPObjectDetector *)objectDetector - (void)objectDetector:(MPPObjectDetector *)objectDetector
didFinishObjectDetectionWithResult:(MPPObjectDetectionResult *)objectDetectionResult didFinishDetectionWithResult:(MPPObjectDetectionResult *)objectDetectionResult
timestampInMilliseconds:(NSInteger)timestampInMilliseconds timestampInMilliseconds:(NSInteger)timestampInMilliseconds
error:(NSError *)error { error:(NSError *)error {
NSInteger maxResults = 4; NSInteger maxResults = 4;
[self assertObjectDetectionResult:result [self assertObjectDetectionResult:objectDetectionResult
isEqualToExpectedResult: isEqualToExpectedResult:
[MPPObjectDetectorTests [MPPObjectDetectorTests
expectedDetectionResultForCatsAndDogsImageWithTimestampInMilliseconds: expectedDetectionResultForCatsAndDogsImageWithTimestampInMilliseconds: