如何在 CoreML 中访问 MLMultiArray 中的元素

Posted

技术标签:

【中文标题】如何在 CoreML 中访问 MLMultiArray 中的元素【英文标题】:How to access elements inside MLMultiArray in CoreML 【发布时间】:2018-05-29 10:46:48 【问题描述】:

我已经使用initWithDataPointer 初始化了MLMultiArray,如下代码所示:

float count = 512 * 384;
  double *tempBuffer = malloc(count * sizeof(double));
  NSError *error = NULL;
  NSArray *shape = [NSArray arrayWithObjects:[NSNumber numberWithInt:1],[NSNumber numberWithInt:512],[NSNumber numberWithInt:384], nil];
  NSArray *stride = [NSArray arrayWithObjects:[NSNumber numberWithInt:1],[NSNumber numberWithInt:1],[NSNumber numberWithInt:1], nil];

  MLMultiArray *mlMultiArray = [[MLMultiArray alloc] initWithDataPointer:tempBuffer
                                                                   shape:shape
                                                                dataType:MLMultiArrayDataTypeDouble
                                                                 strides:stride
                                                             deallocator:^(void * _Nonnull bytes)  free(bytes); 
                                                                   error:&error];

根据此link 中提到的MLMultiArray 文档,需要使用subscript 来访问元素。

如果我以显示的方式访问元素,是否正确?

NSNumber *val = [mlMultiArray objectForKeyedSubscript:[NSArray arrayWithObjects:[NSNumber numberWithInt:1],[NSNumber numberWithInt:1],[NSNumber numberWithInt:1], nil]];

【问题讨论】:

【参考方案1】:

我建议你使用mlMultiArray.dataPointer,将其转换为double *,然后直接访问数据缓冲区的内容。您可以计算元素 i, j, k 使用步幅的位置:

double *ptr = (double *) mlMultiArray.dataPointer;
NSInteger offset = i*stride[0].intValue + j*stride[1].intValue + k*stride[2].intValue;
double val = ptr[offset];

【讨论】:

谢谢,即使我提到的那个也有效。不知何故,我给出了错误的步幅值

以上是关于如何在 CoreML 中访问 MLMultiArray 中的元素的主要内容,如果未能解决你的问题,请参考以下文章

使用 coreML 进行 SceneKit 样式转换

如何在 TensorFlow、Keras 或 PyTorch 中部署 CoreML 模型?

如何在纯 Playground 文件中获取 CoreML

我们如何在 iOS 11 中使用 CoreML 框架进行手写检测

如何在 Keras 中生成 class_labels.txt 以在 CoreML 模型中使用?

如何使用 CoreML 处理来自相机的非方形帧?