Android caffe Forward Prefilled() 在多线程对象中不起作用

Android caffe ForwardPrefilled() doesn't work in Multithread objects

我在使用 m_caffe_net->forwardPrefilled 时遇到问题,但仅限于 android 线程情况。

我的算法是一个基本的caffe过程如:

加载模型->处理->得到结果。 (CPU模式)

如果我将代码集成到 ui 线程中,一切正常。但是 Android 说 这不是一个好的提示,因为冻结了 gui。

我测试了线程、AsyncTask 和可运行对象,并且总是得到相同的 SIGSEV 11 错误

所以我在 Android Studio 中测试了我的调用堆栈,我注意到最后一个调用是 omp_get_num_threads。

是否需要使用 openmp set_num_threads omp 函数在多核模式下执行 forwardPrefilled()?

我的样本与此类似:

https://github.com/sh1r0/caffe-android-demo

Caffe lib编译是这样的:

https://github.com/sh1r0/caffe-android-lib

提前致谢。

终于找到了解决办法:

我在 caffe script/build_caffe.sh 文件中禁用了 openmp 选项。

cmake -DCMAKE_TOOLCHAIN_FILE="${WD}/android-cmake/android.toolchain.cmake" \
      -DANDROID_NDK="${NDK_ROOT}" \
      -DCMAKE_BUILD_TYPE=Release \
      -DANDROID_ABI="${ANDROID_ABI}" \
      -DANDROID_NATIVE_API_LEVEL=21 \
      -DANDROID_USE_OPENMP=OFF \
      -DADDITIONAL_FIND_PATH="${ANDROID_LIB_ROOT}" \
      -DBUILD_python=OFF \
      -DBUILD_docs=OFF \
      -DCPU_ONLY=ON \
      -DUSE_LMDB=ON \
      -DUSE_LEVELDB=OFF \
      -DUSE_HDF5=OFF \
      -DBLAS=${BLAS} \
      -DBOOST_ROOT="${BOOST_HOME}" \
      -DGFLAGS_INCLUDE_DIR="${GFLAGS_HOME}/include" \
      -DGFLAGS_LIBRARY="${GFLAGS_HOME}/lib/libgflags.a" \
      -DGLOG_INCLUDE_DIR="${GLOG_ROOT}/include" \
      -DGLOG_LIBRARY="${GLOG_ROOT}/lib/libglog.a" \
      -DOpenCV_DIR="${OPENCV_ROOT}" \
      -DPROTOBUF_PROTOC_EXECUTABLE="${ANDROID_LIB_ROOT}/protobuf_host/bin/protoc" \
      -DPROTOBUF_INCLUDE_DIR="${PROTOBUF_ROOT}/include" \
      -DPROTOBUF_LIBRARY="${PROTOBUF_ROOT}/lib/libprotobuf.a" \
      -DCMAKE_INSTALL_PREFIX="${ANDROID_LIB_ROOT}/caffe" \

结果有点慢,但它有效:)。