opencv 如何为Keras.NET的model.predict函数准备图像?

hjzp0vay  于 2023-01-26  发布在  .NET
关注(0)|答案(1)|浏览(231)

我目前正在Keras.NET项目中使用C#,遇到了一个非常烦人的问题。Keras.NET的.predict函数只接受Numpy Ndarray或原生C#数组,但我使用OpenCvSharp库获得图像,该库使用Mat对象来处理图片。我需要将这些Mat对象转换为Numpy Ndarray,但没有明确的方法来实现。
我从OpenCvSharp函数GetArray开始(),它将值吐出到byte[]类型的原生c#数组中,但据我所知,这只适用于单通道Mat对象,而我的图像是BGR,因此有3个通道,减少图像中的通道不是一个选项,因为我的模型使用3通道图像进行训练(我试着让它在1通道图像上训练,但我认为Keras默认情况下需要3)。
然后我试着将Mat转换为位图,然后转换为Numpy Ndarray,但第二次转换没有明确的解决方案。
然后我尝试了SciSharp的Ndarray,但是Keras非常挑剔,只接受numpy数组,而且同样没有明确的方法来将一个数组转换为另一个数组。
我已经搜索了一整天,仍然没有找到一个很好的解决方案。我希望有经验的人在kerasidnet图像预测可以帮助我在这里。
我最后尝试的是:
私有静态void PredictImage(系统.绘图.位图img,顺序模型,矩形,材质realFrame){
变量ndarray = img.到NDArray();

//Console.WriteLine(nDarray.shape);
        var newArr = NumSharp.np.expand_dims(ndarray, axis: 0);
        //Console.WriteLine(newArr.shape);
        var val = model.Predict(newArr);

最后一行是:论据一:无法从“NumSharp.NDArray”转换为“Numpy.NDarray”

db2dz4w8

db2dz4w81#

我在开发一个Web服务时遇到过类似的问题,我将base64编码的图像转换为NDarray进行预测,对我有效的解决方案是将位图转换为扁平字节数组,然后按照henon的建议复制值
https://github.com/SciSharp/Numpy.NET/blob/7f6eadb6566478c5e04cd044e08b97df965f9f0e/test/Numpy.UnitTest/NumpyTest.cs#L971
完成此操作后,可以使用shape()调整平面阵列的大小,将阵列转换为所需的形状。
希望这能帮上忙。

相关问题