代码之家  ›  专栏  ›  技术社区  ›  csch0

将vncoremlFeatureValue观测结果(3D双数组)转换为多个ui图像

  •  0
  • csch0  · 技术社区  · 6 年前

    我有一个coreml模型,运行后返回一个vncoremlFeatureValueObservation对象,其中有1个“multiarray:double 10 x img_size x img_size array”

    如何将其转换为10个ui图像,每个ui图像都具有img诳尺寸x img诳尺寸,其值为灰度?

    1 回复  |  直到 6 年前
        1
  •  1
  •   csch0    6 年前

    在仔细观察了一下之后,我发现我必须添加以下辅助功能:

    https://github.com/hollance/CoreMLHelpers 到我的Xcode项目。 从多阵列初始化问题来看: https://stackoverflow.com/a/44462908/403403

    然后我拼凑出这个解决方案:

     let request = VNCoreMLRequest(model: model) { (request, error) in
                guard let results = request.results as? [VNCoreMLFeatureValueObservation] else {
                    fatalError("Model failed to process image")
                }
    
                let obs : VNCoreMLFeatureValueObservation = (results.first)!
                let m: MLMultiArray = obs.featureValue.multiArrayValue!
                var mArrays = [MLMultiArray]()
    
    
                for i in 1..<10 {
                    let start = i*(IMG_SIZE*IMG_SIZE) 
                    guard let tmp : MLMultiArray = try? MLMultiArray(shape:[768,768], dataType:MLMultiArrayDataType.double) else {
                        fatalError("Unexpected runtime error. MLMultiArray")
                    }
                    for n in 0..<(IMG_SIZE*IMG_SIZE) {
                        tmp[n] = m[start+n]
                    }
                    mArrays.append(tmp)
                }
    
                guard let mlMultiArray : MLMultiArray = try? MLMultiArray(shape:[768,768], dataType:MLMultiArrayDataType.double) else {
                    fatalError("Unexpected runtime error. MLMultiArray")
                }
    
                for n in 0..<(IMG_SIZE*IMG_SIZE) {
                    mlMultiArray[n] = m[n]
                }
    
                let imagePredict : UIImage = mlMultiArray.image(offset: 0, scale: 255)!
    
                self.imagePred1.image = imagePredict
                self.imagePred2.image = mArrays[0].image(offset: 0, scale: 255)!
                self.imagePred3.image = mArrays[1].image(offset: 0, scale: 255)!
                self.imagePred4.image = mArrays[2].image(offset: 0, scale: 255)!
                self.imagePred5.image = mArrays[3].image(offset: 0, scale: 255)!
                self.imagePred6.image = mArrays[4].image(offset: 0, scale: 255)!
                self.imagePred7.image = mArrays[5].image(offset: 0, scale: 255)!
                self.imagePred8.image = mArrays[6].image(offset: 0, scale: 255)!
                self.imagePred9.image = mArrays[7].image(offset: 0, scale: 255)!
    
    
    
            }
    

    希望有一个更清洁的方法,但现在有效