Giter Club home page Giter Club logo

ncnn-android-squeezenet's Introduction

ncnn-android-squeezenet

The squeezenet image classification

this is a sample ncnn android project, it depends on ncnn library only

https://github.com/Tencent/ncnn

apk download

https://github.com/nihui/ncnn-android-squeezenet/releases

how to build and run

step1

https://github.com/Tencent/ncnn/releases

  • Download ncnn-YYYYMMDD-android-vulkan.zip or build ncnn for android yourself
  • Extract ncnn-YYYYMMDD-android-vulkan.zip into app/src/main/jni and change the ncnn_DIR path to yours in app/src/main/jni/CMakeLists.txt

step2

  • Open this project with Android Studio, build it and enjoy!

screenshot

ncnn-android-squeezenet's People

Contributors

nihui avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

ncnn-android-squeezenet's Issues

为什么GPU和CPU如此相仿?

感谢大佬在ncnn项目中的付出指点,我用此项目做android GPU测试,在Samsung Galaxy S8(CPU:骁龙835 GPU:Adreno (TM) 540)上用GPU CPU分别同样图像跑1000次,CPU耗时110ms GPU耗时约100ms,看起来没有实质差别,是因为大佬把CPU优化得实在太好了吗?核心测试代码如下
图像 1

java.lang.UnsatisfiedLinkError: dlopen failed: library "libpthread.so.0" not found

I am trying to run the project and got stuck with the exception. The project builds successfully and tries to run on my android device, but I have the following error:

2020-02-07 15:36:02.087 23982-23982/com.tencent.squeezencnn E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.tencent.squeezencnn, PID: 23982
    java.lang.UnsatisfiedLinkError: dlopen failed: library "libpthread.so.0" not found
        at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
        at java.lang.System.loadLibrary(System.java:1669)
        at com.tencent.squeezencnn.SqueezeNcnn.<clinit>(SqueezeNcnn.java:27)
        at com.tencent.squeezencnn.MainActivity.<init>(MainActivity.java:39)
        at java.lang.Class.newInstance(Native Method)
        at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:69)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1216)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2864)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3081)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1831)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:201)
        at android.app.ActivityThread.main(ActivityThread.java:6806)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)

Previously I had similar exception, but with libomp.so file. I could solve it by creating app/src/jniLibs/arm64-v8a directory and placing libomp.so file from internet in the directory. When I try to do the same, but with libpthread.so.0 file, I have an error.

My working environment:
Android 9 device
Android Studio 3.5.3
Ubuntu 19.04
Ndk 21.0.6113669

Excuse me. Why do I get the following error when compiling ncnn-android-squeezenet with Android Studio? Please help me if you encounter similar problem again.

By not providing "Findncnn.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "ncnn", but CMake did not find one.

Could not find a package configuration file provided by "ncnn" with any of the following names:
ncnnConfig.cmake
ncnn-config.cmake

Add the installation prefix of "ncnn" to CMAKE_PREFIX_PATH or set "ncnn_DIR" to a directory containing one of the above files. If "ncnn" provides a separate development package or SDK, be sure it has been installed.

my CmakeList.txt,
project(squeezencnn)
cmake_minimum_required(VERSION 3.10)
set(${CMAKE_SOURCE_DIR}/ncnn_DIR ${CMAKE_SOURCE_DIR}/ncnn-20230223-android-vulkan/${ANDROID_ABI}/lib/cmake/ncnn)
find_package(ncnn REQUIRED)
add_library(squeezencnn SHARED squeezencnn_jni.cpp)
target_link_libraries(squeezencnn ncnn)

Detection Result not correct

I used the following command to compile ncnn arm64-v8a library and my ndk version is 20.1.5948944(/home/liuwenjie/Android/Sdk/ndk/20.1.5948944)
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake
-DANDROID_ABI="arm64-v8a" -DANDROID_PLATFORM=android-21 -DCMAKE_INSTALL_PREFIX=/home/liuwen/ncnn_lib ..
This will create the libncnn.a static library.

Then I used ncnn-android-squeezenet squeezencnn_jni.cpp to compile libsqueezencnn.so. The libsqueezencnn.so has been created successfully and the apk is installed in my ViVO Z3.But the ncnn output.channel is always 0.

The only difference changed(squeezencnn_jni.cpp)

175 cls_scores.resize(out.w);
176 for (int j=0; j<out.w; j++)
177 {
178 cls_scores[j] = out[j]; ----------> const float* prob = out.channel(j);
----------> cls_scores[j] = prob[0];
179 }

CMakeLists.txt

cmake_minimum_required(VERSION 3.4.1)

set(CMAKE_ANDROID_STL_TYPE c++_static)

set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O2 -fvisibility=hidden -fomit-frame-pointer -fstrict-aliasing -ffunction-sections -fdata-sections -ffast-math -fopenmp")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2 -fvisibility=hidden -fvisibility-inlines-hidden -fomit-frame-pointer -fstrict-aliasing -ffunction-sections -fdata-sections -ffast-math -std=c++11 -fopenmp")
set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS_RELEASE} -Wl,--gc-sections -fopenmp")
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} -Wl,--gc-sections -fopenmp")

if(CMAKE_BUILD_TYPE MATCHES Release)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gc-sections -fopenmp")
endif()

set(NCNN_PATH /home/liuwenjie/ncnn_lib)
include_directories(${NCNN_PATH}/include)
include_directories(${NCNN_PATH}/include/ncnn)

add_library(ncnn STATIC IMPORTED)
set_target_properties(ncnn PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/arm64-v8a/libncnn.a)
find_library(log-lib log)
add_library(hello-jni SHARED squeezencnn_jni.cpp)
target_link_libraries(hello-jni android ncnn ${log-lib} jnigraphics z)

Android.mk

LOCAL_PATH := $(call my-dir)

NCNN_INSTALL_PATH := ${LOCAL_PATH}/ncnn-android-vulkan-lib

include $(CLEAR_VARS)
LOCAL_MODULE := ncnn
LOCAL_SRC_FILES := $(NCNN_INSTALL_PATH)/$(TARGET_ARCH_ABI)/libncnn.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := squeezencnn
LOCAL_SRC_FILES := squeezencnn_jni.cpp

LOCAL_C_INCLUDES := $(NCNN_INSTALL_PATH)/include $(NCNN_INSTALL_PATH)/include/ncnn

LOCAL_STATIC_LIBRARIES := ncnn

LOCAL_CFLAGS := -O2 -fvisibility=hidden -fomit-frame-pointer -fstrict-aliasing -ffunction-sections -fdata-sections -ffast-math
LOCAL_CPPFLAGS := -O2 -fvisibility=hidden -fvisibility-inlines-hidden -fomit-frame-pointer -fstrict-aliasing -ffunction-sections -fdata-sections -ffast-math
LOCAL_LDFLAGS += -Wl,--gc-sections

LOCAL_CFLAGS += -fopenmp
LOCAL_CPPFLAGS += -fopenmp
LOCAL_LDFLAGS += -fopenmp

LOCAL_LDLIBS := -lz -llog -ljnigraphics -lvulkan -landroid

include $(BUILD_SHARED_LIBRARY)

squeezencnn_jni.cpp

Both CMakeLists.txt and Android.mk could create libsqueezencnn.so library but produce 0.(sample in the following)
` std::vector cls_scores;
{
const float mean_vals[3] = {104.f, 117.f, 123.f};
in.substract_mean_normalize(mean_vals, 0);

    ncnn::Extractor ex = squeezenet.create_extractor();

    ex.set_vulkan_compute(use_gpu);

    ex.input(squeezenet_v1_1_param_id::BLOB_data, in);

172 ncnn::Mat out;
173 ex.extract(squeezenet_v1_1_param_id::BLOB_prob, out);

175 cls_scores.resize(out.w); -----> out.w == 0
}
`


Vulkan + CMake

I tried to create project ncnn with Vulkan support.

  1. I installed vulkan sdk and built libraries as described
  2. I created CMakeLists.txt:
cmake_minimum_required(VERSION 3.4.1)
set(lib_DIR "${CMAKE_SOURCE_DIR}/../jniLibs")
include_directories(${CMAKE_SOURCE_DIR}/includes)
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -fvisibility=hidden -fomit-frame-pointer -fstrict-aliasing -ffunction-sections -fdata-sections -ffast-math -flax-vector-conversions")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fvisibility=hidden -fvisibility-inlines-hidden -fomit-frame-pointer -fstrict-aliasing -ffunction-sections -fdata-sections -ffast-math -fno-rtti -fno-exceptions -flax-vector-conversions")
set (CMAKE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} -Wl,--gc-sections")

add_library(ncnn_lib STATIC IMPORTED)
set_target_properties(
        ncnn_lib
        PROPERTIES IMPORTED_LOCATION
        ${lib_DIR}/${ANDROID_ABI}/libncnn.a
)
add_library(
        ncnncore
        SHARED
        ncnnnative.cpp
)
target_link_libraries(
        ncnncore
        ncnn_lib
        log
        jnigraphics
        android
        vulkan
)
  • as you can see I tried to link with vulkan library as it is done in Android.mk file here but got error: /Users/mitya/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: cannot find -lvulkan

  • if I use find_library(vulkan_lib vulkan) and link with ${vulkan-lib} I get The following variables are used in this project, but they are set to NOTFOUND.

  • if I remove vulkan from linking I get a bunch of errors like undefined reference to vkCreatePipelineLayout'

Also I tried to follow instructions on
https://developer.android.com/ndk/guides/graphics/getting-started#downloading but no changes.

Any ideas/suggestions how to use ncnn+vulkan with android cmake?

图片预处理resize在哪一步

1.我在pc端运行squeezenet ncnn的demo时,ncnn/examples/squeezenet.cpp图片预处理为

https://github.com/Tencent/ncnn/blob/28bd8d5c7fcb1339132db76a1d5b0fd9643a6ec7/examples/squeezenet.cpp#L33
ncnn::Mat in = ncnn::Mat::from_pixels_resize(bgr.data, ncnn::Mat::PIXEL_BGR, bgr.cols, bgr.rows, 227, 227);

将本项目运行到android studio上时,ncnn-android-squeezenet/app/src/main/jni/squeezencnn_jni.cpp图片预处理为

if (width != 227 || height != 227)
return NULL;
if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888)
return NULL;
// ncnn from bitmap
ncnn::Mat in = ncnn::Mat::from_android_bitmap(env, bitmap, ncnn::Mat::PIXEL_BGR);

我不明白为啥是先判定不等于227就返回空,我在整个cpp文件里并没有看到resize 227的代码,我理解的是应该把from_android_bitmap 换成 from_android_bitmap_resize( .... 227, 227 )。

2.ncnn读取图片的格式为什么?我自己训练的分类算法,训练时输入的图片,若用PIL读取转换为tensor的话,此处用PIXEL_BGR;若用OpenCV读取转换为tensor的话,此处用PIXEL_BGR2RGB,是否为这样?

Could NOT find Vulkan

环境为 android studio 4.1.1
用的 ncnn为 ncnn-20220216-android-vulkan
安说明修改了 CMakeLists.txt后,build时报如下错误
CMake Error at D:/Android/SDK/cmake/3.10.2.4988404/share/cmake-3.10/Modules/FindPackageHandleStandardArgs.cmake:137 (message):
Could NOT find Vulkan (missing: Vulkan_LIBRARY)
Call Stack (most recent call first):
D:/Android/SDK/cmake/3.10.2.4988404/share/cmake-3.10/Modules/FindPackageHandleStandardArgs.cmake:378 (_FPHSA_FAILURE_MESSAGE)
D:/Android/SDK/cmake/3.10.2.4988404/share/cmake-3.10/Modules/FindVulkan.cmake:69 (find_package_handle_standard_args)
ncnn-20220216-android-vulkan/armeabi-v7a/lib/cmake/ncnn/ncnnConfig.cmake:18 (find_package)
CMakeLists.txt:14 (find_package)

ninja: error: rebuilding 'build.ninja': subcommand failed

Could NOT find Threads (missing: Threads_FOUND)?

D:\Download\ncnn-android-squeezenet-master\app\src\main\jni\CMakeLists.txt : C/C++ debug|arm64-v8a : CMake Error at C:/Users/xwf20/AppData/Local/Android/Sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/FindPackageHandleStandardArgs.cmake:137 (message):
Could NOT find Threads (missing: Threads_FOUND)
Call Stack (most recent call first):
C:/Users/xwf20/AppData/Local/Android/Sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/FindPackageHandleStandardArgs.cmake:378 (_FPHSA_FAILURE_MESSAGE)
C:/Users/xwf20/AppData/Local/Android/Sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/FindThreads.cmake:205 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
ncnn-20230223-android-vulkan/arm64-v8a/lib/cmake/ncnn/ncnnConfig.cmake:14 (find_package)
CMakeLists.txt:6 (find_package)
@nihui 我按照Readme里的步骤操作,为什么会报这个错误呢? 求解惑,谢谢大佬。

用ubuntu 20.04编译ncnn到aarch64的安卓上时,CmakeLists.txt中find_package(ncnn REQUIRED)出现的问题

ncnn-android-squeezenet/app/src/main/jni/CMakeLists.txt:8 (find_package):
By not providing "Findncnn.cmake" in CMAKE_MODULE_PATH this project has
asked CMake to find a package configuration file provided by "ncnn", but
CMake did not find one.

按照ncnn官方提供的教程,进行了:Build for Android跟Build for ARM Cortex-A family with cross-compiling,将Build for ARM Cortex-A family with cross-compiling得到的build-android-aarch64/install 路径移动到了本项目的jni路径下,然后按照本项目的readme,将ncnn_DIR更改为自己ncnn的root路径:/home/noblaker/git/ncnn,所以不太明白此问题的原因,望解答,感谢。
CmakeLists.txt文件如下(只更改了此文件):
CMakeLists.txt

Gradle sync failed : executing external native build for ndkBuild

I get error when build project. Although i strictly follow step by step in README. Error logs as bellow:

Gradle sync failed: Cause: executing external native build for ndkBuild /home/vinai/Android/ncnn-android-squeezenet/app/src/main/jni/Android.mk

Can you help me?

vulkan error

unknown type name 'PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR'; did you mean 'PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHX'? |  
unknown type name 'PFN_vkBindBufferMemory2KHR'; did you mean 'PFN_vkBindBufferMemory2KHX'? |  
unknown type name 'PFN_vkBindImageMemory2KHR'; did you mean 'PFN_vkBindImageMemory2KHX'? |  
unknown type name 'PFN_vkGetImageMemoryRequirements2KHR'; did you mean 'PFN_vkGetImageMemoryRequirements'? |  
unknown type name 'PFN_vkGetBufferMemoryRequirements2KHR'; did you mean 'PFN_vkGetBufferMemoryRequirements'? |  
unknown type name 'PFN_vkGetImageSparseMemoryRequirements2KHR'; did you mean 'PFN_vkGetImageSparseMemoryRequirements'? |  
unknown type name 'PFN_vkCreateSamplerYcbcrConversionKHR' |  
unknown type name 'PFN_vkDestroySamplerYcbcrConversionKHR' |  

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.