Quantcast
Channel: OpenCV Q&A Forum - RSS feed
Viewing all articles
Browse latest Browse all 1117

Error when loading torch model in OpenCV 3.4.1 Android

$
0
0
I'm trying to do face recognition on Android using [OpenFace](https://cmusatyalab.github.io/openface/) nn4.small2.v1 neural network. To see if the network could be loaded with OpenCV, I tried to run [a code taken from GitHub](https://github.com/berak/opencv_smallfry/blob/master/facerec_dnn/facerec_dnn.cpp) that uses the model. Using the prebuilt Windows version of OpenCV, I can run the code and the network is loaded without a problem. However, If I try to load the network on Android, readNetFromTorch fails with the error : "The function/feature is not implemented (Unsupported Lua type) in void cv::dnn::experimental_dnn_v4::TorchImporter::readObject(), file /build/master_pack-android/opencv/modules/dnn/src/torch/torch_importer.cpp, line 981". I am using Xamarin for my app, so I have a Xamarin.Android project, and a Android shared library project where I have my C++ code. Here's the C# code that calls the native code : [DllImport("OpenCV", EntryPoint = "TryOpenCV", CharSet = CharSet.Ansi)] private static extern int TryOpenCV_native([MarshalAs(UnmanagedType.LPStr)]string netPath, [MarshalAs(UnmanagedType.LPStr)]string cascadePath); public static int TryOpenCV(string netPath, string cascadePath) { return TryOpenCV_native(newPath, cascadePath); } And here's the C++ code : extern "C" int TryOpenCV(const char *netPath, const char *cascadePath) { if (netPath && cascadePath) { cv::Mat mat = cv::Mat(96, 96, CV_8UC1); cv::String m_sNetPath(netPath); cv::String m_sCascadePath(cascadePath); try { bool testNetPath = cv::utils::fs::exists(m_sNetPath); bool testCascadePath = cv::utils::fs::exists(m_sCascadePath); cv::CascadeClassifier cascade; cascade.load(m_sCascadePath); if (cascade.empty()) { cv::String empty("cascade is empty"); } cv::dnn::Net torchNet = cv::dnn::readNetFromTorch(m_sNetPath); cv::Mat inputBlob = cv::dnn::blobFromImage(mat, 1. / 255, cv::Size(96, 96), cv::Scalar(), true, false); torchNet.setInput(inputBlob); torchNet.forward(); mat.release(); return 0; } catch (cv::Exception &e) { cv::String m_exception(e.what()); return 1; } } return returnInt(); } The filepath I have for netpath and cascadePath is something like "/data/user/0/com.my.app/files/name.of.file.xxx". I can create a Mat, both testNetPath and testCascadePath are true and the cascade load successfully (at least I hope so, because it's not empty), so OpenCV is working, can see the files, and so should load them both. Stepping through the C++ code also gives me error when calling e.what() for some reason, but I get the error string when debugging the C# side. I really can't see what's wrong here, but I am new to C++ so maybe I'm missing something obvious.

Viewing all articles
Browse latest Browse all 1117