我有一个CoreML模型,运行后会返回一个VNCoreMLFeatureValueObservation对象,其中包含一个“MultiArray : Double 10 x IMG_SIZE x IMG_SIZE数组”。
如何将这个结果转换为10个尺寸为IMG_SIZE x IMG_SIZE的UIImage,每个图像的值为灰度?
回答:
经过一番探索后,我发现需要添加这些辅助函数:
https://github.com/hollance/CoreMLHelpers 到我的Xcode项目中。还有一个关于MultiArray初始化的提问: https://stackoverflow.com/a/44462908/403403
然后我拼凑了这个解决方案:
let request = VNCoreMLRequest(model: model) { (request, error) in guard let results = request.results as? [VNCoreMLFeatureValueObservation] else { fatalError("模型处理图像失败") } let obs : VNCoreMLFeatureValueObservation = (results.first)! let m: MLMultiArray = obs.featureValue.multiArrayValue! var mArrays = [MLMultiArray]() for i in 0..<10 { let start = i*(IMG_SIZE*IMG_SIZE) guard let tmp : MLMultiArray = try? MLMultiArray(shape:[768,768], dataType:MLMultiArrayDataType.double) else { fatalError("运行时意外错误。MLMultiArray") } for n in 0..<(IMG_SIZE*IMG_SIZE) { tmp[n] = m[start+n] } mArrays.append(tmp) } self.imagePred0.image = mArrays[0].image(offset: 0, scale: 255)! self.imagePred1.image = mArrays[1].image(offset: 0, scale: 255)! self.imagePred2.image = mArrays[2].image(offset: 0, scale: 255)! self.imagePred3.image = mArrays[3].image(offset: 0, scale: 255)! self.imagePred4.image = mArrays[4].image(offset: 0, scale: 255)! self.imagePred5.image = mArrays[5].image(offset: 0, scale: 255)! self.imagePred6.image = mArrays[6].image(offset: 0, scale: 255)! self.imagePred7.image = mArrays[7].image(offset: 0, scale: 255)! self.imagePred8.image = mArrays[8].image(offset: 0, scale: 255)! self.imagePred9.image = mArrays[9].image(offset: 0, scale: 255)! }
希望有更简洁的方法,但目前这样可以工作