onnxruntime/js/react_native/e2e/ios/MNISTDataHandler.mm
Ashrit Shetty df873177eb
Update win-ort-main to tip main 250116 (#23398)
### Description
This PR is to update the win-ort-main branch to the tip main
branch as of 2025-01-16.

### Motivation and Context
This update includes the OpenVino fix for debug builds.

---------

Signed-off-by: Liqun Fu <liqfu@microsoft.com>
Signed-off-by: Liqun Fu <liqun.fu@microsoft.com>
Signed-off-by: Junze Wu <junze.wu@intel.com>
Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Jianhui Dai <jianhui.j.dai@intel.com>
Co-authored-by: Yueqing Zhang <yuz75@Pitt.edu>
Co-authored-by: amancini-N <63410090+amancini-N@users.noreply.github.com>
Co-authored-by: Adrian Lizarraga <adlizarraga@microsoft.com>
Co-authored-by: liqun Fu <liqfu@microsoft.com>
Co-authored-by: Guenther Schmuelling <guschmue@microsoft.com>
Co-authored-by: Yifan Li <109183385+yf711@users.noreply.github.com>
Co-authored-by: yf711 <yifanl@microsoft.com>
Co-authored-by: Wanming Lin <wanming.lin@intel.com>
Co-authored-by: wejoncy <wejoncy@163.com>
Co-authored-by: wejoncy <wejoncy@.com>
Co-authored-by: Scott McKay <skottmckay@gmail.com>
Co-authored-by: Changming Sun <chasun@microsoft.com>
Co-authored-by: Jean-Michaël Celerier <jeanmichael.celerier+github@gmail.com>
Co-authored-by: Dmitry Deshevoy <mityada@gmail.com>
Co-authored-by: xhcao <xinghua.cao@intel.com>
Co-authored-by: Yueqing Zhang <yueqingz@amd.com>
Co-authored-by: Yulong Wang <7679871+fs-eire@users.noreply.github.com>
Co-authored-by: Jiajia Qin <jiajiaqin@microsoft.com>
Co-authored-by: Wu, Junze <junze.wu@intel.com>
Co-authored-by: Jian Chen <cjian@microsoft.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Matthieu Darbois <mayeut@users.noreply.github.com>
Co-authored-by: Prathik Rao <prathik.rao@gmail.com>
Co-authored-by: wonchung-microsoft <wonchung@microsoft.com>
Co-authored-by: Vincent Wang <wangwchpku@outlook.com>
Co-authored-by: PARK DongHa <luncliff@gmail.com>
Co-authored-by: Hector Li <hecli@microsoft.com>
Co-authored-by: Sam Webster <13457618+samwebster@users.noreply.github.com>
Co-authored-by: Adrian Lizarraga <adrianlm2@gmail.com>
Co-authored-by: Preetha Veeramalai <preetha.veeramalai@intel.com>
Co-authored-by: jatinwadhwa921 <jatin.wadhwa@intel.com>
Co-authored-by: Satya Kumar Jandhyala <satya.k.jandhyala@gmail.com>
Co-authored-by: Corentin Maravat <101636442+cocotdf@users.noreply.github.com>
Co-authored-by: Xiaoyu <85524621+xiaoyu-work@users.noreply.github.com>
Co-authored-by: Tianlei Wu <tlwu@microsoft.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Jie Chen <jie.a.chen@intel.com>
Co-authored-by: Jianhui Dai <jianhui.j.dai@intel.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Edward Chen <18449977+edgchen1@users.noreply.github.com>
Co-authored-by: Baiju Meswani <bmeswani@microsoft.com>
Co-authored-by: kunal-vaishnavi <115581922+kunal-vaishnavi@users.noreply.github.com>
Co-authored-by: Justin Chu <justinchuby@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Co-authored-by: Ted Themistokleous <107195283+TedThemistokleous@users.noreply.github.com>
Co-authored-by: Jeff Daily <jeff.daily@amd.com>
Co-authored-by: Artur Wojcik <artur.wojcik@outlook.com>
Co-authored-by: Ted Themistokleous <tedthemistokleous@amd.com>
Co-authored-by: Xinya Zhang <Xinya.Zhang@amd.com>
Co-authored-by: ikalinic <ilija.kalinic@amd.com>
Co-authored-by: sstamenk <sstamenk@amd.com>
Co-authored-by: Yi-Hong Lyu <yilyu@microsoft.com>
Co-authored-by: Ti-Tai Wang <titaiwang@microsoft.com>
2025-01-16 15:20:25 -08:00

164 lines
5.5 KiB
Text

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
#import "MNISTDataHandler.h"
#import "OnnxruntimeModule.h"
#import "TensorHelper.h"
#import <Foundation/Foundation.h>
#import <React/RCTLog.h>
NS_ASSUME_NONNULL_BEGIN
@implementation MNISTDataHandler
RCT_EXPORT_MODULE(MNISTDataHandler)
// It returns mode path in local device,
// so that onnxruntime is able to load a model using a given path.
RCT_EXPORT_METHOD(getLocalModelPath : (RCTPromiseResolveBlock)resolve rejecter : (RCTPromiseRejectBlock)reject) {
@try {
NSString* modelPath = [[NSBundle mainBundle] pathForResource:@"mnist" ofType:@"ort"];
NSFileManager* fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:modelPath]) {
resolve(modelPath);
} else {
reject(@"mnist", @"no such a model", nil);
}
} @catch (NSException* exception) {
reject(@"mnist", @"no such a model", nil);
}
}
// It returns image path.
RCT_EXPORT_METHOD(getImagePath : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject) {
@try {
NSString* imagePath = [[NSBundle mainBundle] pathForResource:@"3" ofType:@"jpg"];
NSFileManager* fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:imagePath]) {
resolve(imagePath);
} else {
reject(@"mnist", @"no such an image", nil);
}
} @catch (NSException* exception) {
reject(@"mnist", @"no such an image", nil);
}
}
// It gets raw input data, which can be uri or byte array and others,
// returns cooked data formatted as input of a model.
RCT_EXPORT_METHOD(preprocess : (NSString*)uri resolve : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject) {
@try {
NSDictionary* inputDataMap = [self preprocess:uri];
resolve(inputDataMap);
} @catch (NSException* exception) {
reject(@"mnist", @"can't load an image", nil);
}
}
// It gets a result from onnxruntime and a duration of session time for input data,
// returns output data formatted as React Native map.
RCT_EXPORT_METHOD(postprocess : (NSDictionary*)result resolve : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject) {
@try {
NSDictionary* cookedMap = [self postprocess:result];
resolve(cookedMap);
} @catch (NSException* exception) {
reject(@"mnist", @"can't pose-process an image", nil);
}
}
- (NSDictionary*)preprocess:(NSString*)uri {
UIImage* image = [UIImage imageNamed:@"3.jpg"];
CGSize scale = CGSizeMake(28, 28);
UIGraphicsBeginImageContextWithOptions(scale, NO, 1.0);
[image drawInRect:CGRectMake(0, 0, scale.width, scale.height)];
UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
CGImageRef imageRef = [scaledImage CGImage];
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
const NSUInteger rawDataSize = height * width * 4;
std::vector<unsigned char> rawData(rawDataSize);
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
CGContextRef context = CGBitmapContextCreate(rawData.data(), width, height, 8, bytesPerRow, colorSpace,
kCGImageAlphaPremultipliedLast | kCGImageByteOrder32Big);
CGColorSpaceRelease(colorSpace);
CGContextSetBlendMode(context, kCGBlendModeCopy);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
CGContextRelease(context);
const NSInteger dimSize = height * width;
const NSInteger byteBufferSize = dimSize * sizeof(float);
unsigned char* byteBuffer = static_cast<unsigned char*>(malloc(byteBufferSize));
NSData* byteBufferRef = [NSData dataWithBytesNoCopy:byteBuffer length:byteBufferSize];
float* floatPtr = (float*)[byteBufferRef bytes];
for (NSUInteger h = 0; h < height; ++h) {
for (NSUInteger w = 0; w < width; ++w) {
NSUInteger byteIndex = (bytesPerRow * h) + w * bytesPerPixel;
*floatPtr++ = rawData[byteIndex];
}
}
floatPtr = (float*)[byteBufferRef bytes];
NSMutableDictionary* inputDataMap = [NSMutableDictionary dictionary];
NSMutableDictionary* inputTensorMap = [NSMutableDictionary dictionary];
// dims
NSArray* dims = @[
[NSNumber numberWithInt:1],
[NSNumber numberWithInt:1],
[NSNumber numberWithInt:static_cast<int>(height)],
[NSNumber numberWithInt:static_cast<int>(width)]
];
inputTensorMap[@"dims"] = dims;
// type
inputTensorMap[@"type"] = JsTensorTypeFloat;
// encoded data
NSString* data = [byteBufferRef base64EncodedStringWithOptions:0];
inputTensorMap[@"data"] = data;
inputDataMap[@"Input3"] = inputTensorMap;
return inputDataMap;
}
- (NSDictionary*)postprocess:(NSDictionary*)result {
NSMutableString* detectionResult = [NSMutableString string];
NSDictionary* outputTensor = [result objectForKey:@"Plus214_Output_0"];
NSString* data = [outputTensor objectForKey:@"data"];
NSData* buffer = [[NSData alloc] initWithBase64EncodedString:data options:0];
float* values = (float*)[buffer bytes];
int count = (int)[buffer length] / 4;
int argmax = 0;
float maxValue = 0.0f;
for (int i = 0; i < count; ++i) {
if (values[i] > maxValue) {
maxValue = values[i];
argmax = i;
}
}
if (maxValue == 0.0f) {
detectionResult = [NSMutableString stringWithString:@"No match"];
} else {
detectionResult = [NSMutableString stringWithFormat:@"%d", argmax];
}
NSDictionary* cookedMap = @{@"result" : detectionResult};
return cookedMap;
}
@end
NS_ASSUME_NONNULL_END