Updated image classifier and object detector tests
This commit is contained in:
parent
82a238a0c8
commit
8284732874
|
@ -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,31 +452,32 @@ 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 "
|
||||||
@"The vision task is in image or video mode. The delegate must not be"
|
@"delegate must not be set in the task's options."
|
||||||
@"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
|
||||||
code:MPPTasksErrorCodeInvalidArgumentError
|
errorWithDomain:kExpectedErrorDomain
|
||||||
userInfo:@{
|
code:MPPTasksErrorCodeInvalidArgumentError
|
||||||
NSLocalizedDescriptionKey :
|
userInfo:@{
|
||||||
@"The vision task is in live stream mode. An object must be set as the delegate of"
|
NSLocalizedDescriptionKey :
|
||||||
@"the task in the its options to ensure asynchronous delivery of results."
|
@"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 {
|
- (void)testClassifyFailsWithCallingWrongApiInImageMode {
|
||||||
|
@ -619,19 +619,22 @@ 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;
|
||||||
|
|
||||||
XCTestExpectation *expectation = [[XCTestExpectation alloc]
|
XCTestExpectation *expectation = [[XCTestExpectation alloc]
|
||||||
initWithDescription:@"classifyWithOutOfOrderTimestampsAndLiveStream"];
|
initWithDescription:@"classifyWithOutOfOrderTimestampsAndLiveStream"];
|
||||||
|
|
||||||
expectation.expectedFulfillmentCount = 1;
|
expectation.expectedFulfillmentCount = 1;
|
||||||
|
|
||||||
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
|
||||||
|
@ -693,27 +698,27 @@ static NSString *const kLiveStreamTestsDictExpectationKey= @"expectation";
|
||||||
for (int i = 0; i < iterationCount; i++) {
|
for (int i = 0; i < iterationCount; i++) {
|
||||||
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;
|
||||||
[self assertImageClassifierResult:imageClassifierResult
|
[self assertImageClassifierResult:imageClassifierResult
|
||||||
hasExpectedCategoriesCount:maxResults
|
hasExpectedCategoriesCount:maxResults
|
||||||
expectedCategories:
|
expectedCategories:
|
||||||
[MPPImageClassifierTests
|
[MPPImageClassifierTests
|
||||||
expectedResultCategoriesForClassifyBurgerImageWithFloatModel]];
|
expectedResultCategoriesForClassifyBurgerImageWithFloatModel]];
|
||||||
|
|
||||||
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];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user