From 82847328745377febcdb3cf6e1fc41e904d08a71 Mon Sep 17 00:00:00 2001 From: Prianka Liz Kariat Date: Tue, 2 May 2023 08:45:44 +0530 Subject: [PATCH] Updated image classifier and object detector tests --- .../MPPImageClassifierTests.m | 95 ++++++++++--------- .../object_detector/MPPObjectDetectorTests.m | 30 +++--- 2 files changed, 65 insertions(+), 60 deletions(-) diff --git a/mediapipe/tasks/ios/test/vision/image_classifier/MPPImageClassifierTests.m b/mediapipe/tasks/ios/test/vision/image_classifier/MPPImageClassifierTests.m index 71347579b..1f06a3e41 100644 --- a/mediapipe/tasks/ios/test/vision/image_classifier/MPPImageClassifierTests.m +++ b/mediapipe/tasks/ios/test/vision/image_classifier/MPPImageClassifierTests.m @@ -27,8 +27,8 @@ static NSDictionary *const kMultiObjectsRotatedImage = @{@"name" : @"multi_objects_rotated", @"type" : @"jpg"}; static const int kMobileNetCategoriesCount = 1001; static NSString *const kExpectedErrorDomain = @"com.google.mediapipe.tasks"; -static NSString *const kLiveStreamTestsDictImageClassifierKey= @"image_classifier"; -static NSString *const kLiveStreamTestsDictExpectationKey= @"expectation"; +static NSString *const kLiveStreamTestsDictImageClassifierKey = @"image_classifier"; +static NSString *const kLiveStreamTestsDictExpectationKey = @"expectation"; #define AssertEqualErrors(error, expectedError) \ XCTAssertNotNil(error); \ @@ -56,7 +56,6 @@ static NSString *const kLiveStreamTestsDictExpectationKey= @"expectation"; XCTAssertEqual(imageClassifierResult.classificationResult.classifications.count, 1); \ XCTAssertEqual(imageClassifierResult.classificationResult.classifications[0].headIndex, 0); - @interface MPPImageClassifierTests : XCTestCase { NSDictionary *liveStreamSucceedsTestDict; NSDictionary *outOfOrderTimestampTestDict; @@ -442,7 +441,7 @@ static NSString *const kLiveStreamTestsDictExpectationKey= @"expectation"; #pragma mark Running Mode Tests -- (void)testCreateImageClassifierFailsWithResultListenerInNonLiveStreamMode { +- (void)testCreateImageClassifierFailsWithDelegateInNonLiveStreamMode { MPPRunningMode runningModesToTest[] = {MPPRunningModeImage, MPPRunningModeVideo}; for (int i = 0; i < sizeof(runningModesToTest) / sizeof(runningModesToTest[0]); i++) { MPPImageClassifierOptions *options = [self imageClassifierOptionsWithModelName:kFloatModelName]; @@ -453,31 +452,32 @@ static NSString *const kLiveStreamTestsDictExpectationKey= @"expectation"; [self assertCreateImageClassifierWithOptions:options failsWithExpectedError: - [NSError - errorWithDomain:kExpectedErrorDomain - code:MPPTasksErrorCodeInvalidArgumentError - userInfo:@{ - NSLocalizedDescriptionKey : - @"The vision task is in image or video mode. The delegate must not be" - @"set in the task's options." - }]]; + [NSError errorWithDomain:kExpectedErrorDomain + code:MPPTasksErrorCodeInvalidArgumentError + userInfo:@{ + NSLocalizedDescriptionKey : + @"The vision task is in image or video mode. The " + @"delegate must not be set in the task's options." + }]]; } } -- (void)testCreateImageClassifierFailsWithMissingResultListenerInLiveStreamMode { +- (void)testCreateImageClassifierFailsWithMissingDelegateInLiveStreamMode { MPPImageClassifierOptions *options = [self imageClassifierOptionsWithModelName:kFloatModelName]; options.runningMode = MPPRunningModeLiveStream; [self assertCreateImageClassifierWithOptions:options failsWithExpectedError: - [NSError errorWithDomain:kExpectedErrorDomain - code:MPPTasksErrorCodeInvalidArgumentError - userInfo:@{ - NSLocalizedDescriptionKey : - @"The vision task is in live stream mode. An object must be set as the delegate of" - @"the task in the its options to ensure asynchronous delivery of results." - }]]; + [NSError + errorWithDomain:kExpectedErrorDomain + code:MPPTasksErrorCodeInvalidArgumentError + userInfo:@{ + NSLocalizedDescriptionKey : + @"The vision task is in live stream mode. An object " + @"must be set as the delegate of the task in its " + @"options to ensure asynchronous delivery of results." + }]]; } - (void)testClassifyFailsWithCallingWrongApiInImageMode { @@ -619,19 +619,22 @@ static NSString *const kLiveStreamTestsDictExpectationKey= @"expectation"; MPPImageClassifierOptions *options = [self imageClassifierOptionsWithModelName:kFloatModelName]; NSInteger maxResults = 3; - options.maxResults = maxResults; + options.maxResults = 3; options.runningMode = MPPRunningModeLiveStream; options.imageClassifierDelegate = self; - XCTestExpectation *expectation = [[XCTestExpectation alloc] + XCTestExpectation *expectation = [[XCTestExpectation alloc] initWithDescription:@"classifyWithOutOfOrderTimestampsAndLiveStream"]; expectation.expectedFulfillmentCount = 1; MPPImageClassifier *imageClassifier = [self imageClassifierWithOptionsSucceeds:options]; - - outOfOrderTimestampTestDict = @{kLiveStreamTestsDictImageClassifierKey: imageClassifier, kLiveStreamTestsDictExpectationKey: expectation}; + + outOfOrderTimestampTestDict = @{ + kLiveStreamTestsDictImageClassifierKey : imageClassifier, + kLiveStreamTestsDictExpectationKey : expectation + }; MPPImage *image = [self imageWithFileInfo:kBurgerImage]; @@ -649,7 +652,7 @@ static NSString *const kLiveStreamTestsDictExpectationKey= @"expectation"; }]; AssertEqualErrors(error, expectedError); - [self waitForExpectations:@[expectation] timeout:1e-2f]; + [self waitForExpectations:@[ expectation ] timeout:1e-2f]; } - (void)testClassifyWithLiveStreamModeSucceeds { @@ -680,10 +683,12 @@ static NSString *const kLiveStreamTestsDictExpectationKey= @"expectation"; expectation.expectedFulfillmentCount = iterationCount + 1; expectation.inverted = YES; - 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 // with the iOS camera. AVCaptureVideoDataOutput sample buffer delegates provide frames of type @@ -693,27 +698,27 @@ static NSString *const kLiveStreamTestsDictExpectationKey= @"expectation"; for (int i = 0; i < iterationCount; i++) { XCTAssertTrue([imageClassifier classifyAsyncImage:image timestampInMilliseconds:i error:nil]); } - - [self waitForExpectations:@[expectation] timeout:5]; + + [self waitForExpectations:@[ expectation ] timeout:1e-2f]; } - (void)imageClassifier:(MPPImageClassifier *)imageClassifier - didFinishImageClassificationWithResult:(MPPImageClassifierResult *)imageClassifierResult - timestampInMilliseconds:(NSInteger)timestampInMilliseconds - error:(NSError *)error { - NSInteger maxResults = 3; - [self assertImageClassifierResult:imageClassifierResult - hasExpectedCategoriesCount:maxResults - expectedCategories: - [MPPImageClassifierTests - expectedResultCategoriesForClassifyBurgerImageWithFloatModel]]; - - if (imageClassifier == outOfOrderTimestampTestDict[kLiveStreamTestsDictImageClassifierKey]) { - [outOfOrderTimestampTestDict[kLiveStreamTestsDictExpectationKey] fulfill]; - } - else if (imageClassifier == liveStreamSucceedsTestDict[kLiveStreamTestsDictImageClassifierKey]) { - [liveStreamSucceedsTestDict[kLiveStreamTestsDictExpectationKey] fulfill]; - } + didFinishClassificationWithResult:(MPPImageClassifierResult *)imageClassifierResult + timestampInMilliseconds:(NSInteger)timestampInMilliseconds + error:(NSError *)error { + NSInteger maxResults = 3; + [self assertImageClassifierResult:imageClassifierResult + hasExpectedCategoriesCount:maxResults + expectedCategories: + [MPPImageClassifierTests + expectedResultCategoriesForClassifyBurgerImageWithFloatModel]]; + + if (imageClassifier == outOfOrderTimestampTestDict[kLiveStreamTestsDictImageClassifierKey]) { + [outOfOrderTimestampTestDict[kLiveStreamTestsDictExpectationKey] fulfill]; + } else if (imageClassifier == + liveStreamSucceedsTestDict[kLiveStreamTestsDictImageClassifierKey]) { + [liveStreamSucceedsTestDict[kLiveStreamTestsDictExpectationKey] fulfill]; + } } @end diff --git a/mediapipe/tasks/ios/test/vision/object_detector/MPPObjectDetectorTests.m b/mediapipe/tasks/ios/test/vision/object_detector/MPPObjectDetectorTests.m index 9e1c38722..728d08abc 100644 --- a/mediapipe/tasks/ios/test/vision/object_detector/MPPObjectDetectorTests.m +++ b/mediapipe/tasks/ios/test/vision/object_detector/MPPObjectDetectorTests.m @@ -451,7 +451,7 @@ static NSString *const kLiveStreamTestsDictExpectationKey = @"expectation"; #pragma mark Running Mode Tests -- (void)testCreateObjectDetectorFailsWithResultListenerInNonLiveStreamMode { +- (void)testCreateObjectDetectorFailsWithDelegateInNonLiveStreamMode { MPPRunningMode runningModesToTest[] = {MPPRunningModeImage, MPPRunningModeVideo}; for (int i = 0; i < sizeof(runningModesToTest) / sizeof(runningModesToTest[0]); i++) { MPPObjectDetectorOptions *options = [self objectDetectorOptionsWithModelName:kModelName]; @@ -472,7 +472,7 @@ static NSString *const kLiveStreamTestsDictExpectationKey = @"expectation"; } } -- (void)testCreateObjectDetectorFailsWithMissingResultListenerInLiveStreamMode { +- (void)testCreateObjectDetectorFailsWithMissingDelegateInLiveStreamMode { MPPObjectDetectorOptions *options = [self objectDetectorOptionsWithModelName:kModelName]; options.runningMode = MPPRunningModeLiveStream; @@ -484,9 +484,10 @@ static NSString *const kLiveStreamTestsDictExpectationKey = @"expectation"; userInfo:@{ NSLocalizedDescriptionKey : @"The vision task is in live stream mode. An " - @"object must be set as the delegate of" - @"the task in the its options to ensure " - @"asynchronous delivery of results." + @"object must be set as the " + @"delegate of the task in its options to ensure " + @"asynchronous delivery of " + @"results." }]]; } @@ -567,10 +568,7 @@ static NSString *const kLiveStreamTestsDictExpectationKey = @"expectation"; MPPObjectDetectorOptions *options = [self objectDetectorOptionsWithModelName:kModelName]; options.runningMode = MPPRunningModeLiveStream; - options.completion = - ^(MPPObjectDetectionResult *result, NSInteger timestampInMilliseconds, NSError *error) { - - }; + options.objectDetectorDelegate = self; MPPObjectDetector *objectDetector = [self objectDetectorWithOptionsSucceeds:options]; @@ -635,13 +633,14 @@ static NSString *const kLiveStreamTestsDictExpectationKey = @"expectation"; options.maxResults = maxResults; options.runningMode = MPPRunningModeLiveStream; + options.objectDetectorDelegate = self; XCTestExpectation *expectation = [[XCTestExpectation alloc] initWithDescription:@"detectWithOutOfOrderTimestampsAndLiveStream"]; expectation.expectedFulfillmentCount = 1; MPPObjectDetector *objectDetector = [self objectDetectorWithOptionsSucceeds:options]; - liveStreamSucceedsTestDict = { + liveStreamSucceedsTestDict = @{ kLiveStreamTestsDictObjectDetectorKey : objectDetector, kLiveStreamTestsDictExpectationKey : expectation }; @@ -694,7 +693,7 @@ static NSString *const kLiveStreamTestsDictExpectationKey = @"expectation"; MPPObjectDetector *objectDetector = [self objectDetectorWithOptionsSucceeds:options]; - liveStreamSucceedsTestDict = { + liveStreamSucceedsTestDict = @{ kLiveStreamTestsDictObjectDetectorKey : objectDetector, kLiveStreamTestsDictExpectationKey : expectation }; @@ -711,12 +710,13 @@ static NSString *const kLiveStreamTestsDictExpectationKey = @"expectation"; [self waitForExpectations:@[ expectation ] timeout:0.5]; } +#pragma mark MPPObjectDetectorDelegate Methods - (void)objectDetector:(MPPObjectDetector *)objectDetector - didFinishObjectDetectionWithResult:(MPPObjectDetectionResult *)objectDetectionResult - timestampInMilliseconds:(NSInteger)timestampInMilliseconds - error:(NSError *)error { + didFinishDetectionWithResult:(MPPObjectDetectionResult *)objectDetectionResult + timestampInMilliseconds:(NSInteger)timestampInMilliseconds + error:(NSError *)error { NSInteger maxResults = 4; - [self assertObjectDetectionResult:result + [self assertObjectDetectionResult:objectDetectionResult isEqualToExpectedResult: [MPPObjectDetectorTests expectedDetectionResultForCatsAndDogsImageWithTimestampInMilliseconds: