Updated object detector to call delegates on a dedicated background queue

This commit is contained in:
Prianka Liz Kariat 2023-05-04 01:01:09 +05:30
parent 546b153f07
commit 5dd6b0c72a

View File

@ -37,8 +37,8 @@ static NSString *const kImageOutStreamName = @"image_out";
static NSString *const kImageTag = @"IMAGE"; static NSString *const kImageTag = @"IMAGE";
static NSString *const kNormRectStreamName = @"norm_rect_in"; static NSString *const kNormRectStreamName = @"norm_rect_in";
static NSString *const kNormRectTag = @"NORM_RECT"; static NSString *const kNormRectTag = @"NORM_RECT";
static NSString *const kTaskGraphName = @"mediapipe.tasks.vision.ObjectDetectorGraph"; static NSString *const kTaskGraphName = @"mediapipe.tasks.vision.ObjectDetectorGraph";
static NSString *const kTaskName = @"objectDetector";
#define InputPacketMap(imagePacket, normalizedRectPacket) \ #define InputPacketMap(imagePacket, normalizedRectPacket) \
{ \ { \
@ -58,6 +58,7 @@ static NSString *const kTaskGraphName = @"mediapipe.tasks.vision.ObjectDetectorG
- (instancetype)initWithOptions:(MPPObjectDetectorOptions *)options error:(NSError **)error { - (instancetype)initWithOptions:(MPPObjectDetectorOptions *)options error:(NSError **)error {
self = [super init]; self = [super init];
NSLog(@"Object Detector Initializing with dispatch queu and weak self");
if (self) { if (self) {
MPPTaskInfo *taskInfo = [[MPPTaskInfo alloc] MPPTaskInfo *taskInfo = [[MPPTaskInfo alloc]
initWithTaskGraphName:kTaskGraphName initWithTaskGraphName:kTaskGraphName
@ -85,8 +86,12 @@ static NSString *const kTaskGraphName = @"mediapipe.tasks.vision.ObjectDetectorG
// Capturing `self` as weak in order to avoid `self` being kept in memory // Capturing `self` as weak in order to avoid `self` being kept in memory
// and cause a retain cycle, after self is set to `nil`. // and cause a retain cycle, after self is set to `nil`.
MPPObjectDetector *__weak weakSelf = self; MPPObjectDetector *__weak weakSelf = self;
dispatch_queue_t callbackQueue = dispatch_queue_create([MPPVisionTaskRunner uniqueQueueNameWithTaskName:kTaskName], NULL);
packetsCallback = [=](absl::StatusOr<PacketMap> statusOrPackets) { packetsCallback = [=](absl::StatusOr<PacketMap> statusOrPackets) {
if ([!weakSelf && weakSelf.objectDetectorDelegate if (!weakSelf) {
return;
}
if (![weakSelf.objectDetectorDelegate
respondsToSelector:@selector respondsToSelector:@selector
(objectDetector:didFinishDetectionWithResult:timestampInMilliseconds:error:)]) { (objectDetector:didFinishDetectionWithResult:timestampInMilliseconds:error:)]) {
return; return;
@ -94,10 +99,12 @@ static NSString *const kTaskGraphName = @"mediapipe.tasks.vision.ObjectDetectorG
NSError *callbackError = nil; NSError *callbackError = nil;
if (![MPPCommonUtils checkCppError:statusOrPackets.status() toError:&callbackError]) { if (![MPPCommonUtils checkCppError:statusOrPackets.status() toError:&callbackError]) {
[_objectDetectorDelegate objectDetector:weakSelf dispatch_async(callbackQueue, ^{
[weakSelf.objectDetectorDelegate objectDetector:weakSelf
didFinishDetectionWithResult:nil didFinishDetectionWithResult:nil
timestampInMilliseconds:Timestamp::Unset().Value() timestampInMilliseconds:Timestamp::Unset().Value()
error:callbackError]; error:callbackError];
});
return; return;
} }
@ -109,15 +116,18 @@ static NSString *const kTaskGraphName = @"mediapipe.tasks.vision.ObjectDetectorG
MPPObjectDetectionResult *result = [MPPObjectDetectionResult MPPObjectDetectionResult *result = [MPPObjectDetectionResult
objectDetectionResultWithDetectionsPacket:statusOrPackets.value()[kDetectionsStreamName objectDetectionResultWithDetectionsPacket:statusOrPackets.value()[kDetectionsStreamName
.cppString]]; .cppString]];
[weakSelf.objectDetectorDelegate NSInteger timeStampInMilliseconds = outputPacketMap[kImageOutStreamName.cppString]
.Timestamp()
.Value() /
kMicroSecondsPerMilliSecond;
dispatch_async(callbackQueue, ^{
[weakSelf.objectDetectorDelegate
objectDetector:weakSelf objectDetector:weakSelf
didFinishDetectionWithResult:result didFinishDetectionWithResult:result
timestampInMilliseconds:outputPacketMap[kImageOutStreamName.cppString] timestampInMilliseconds:timeStampInMilliseconds
.Timestamp()
.Value() /
kMicroSecondsPerMilliSecond
error:callbackError]; error:callbackError];
});
}; };
} }