Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How can I directly use the functions of RealSR without calling through the CLI? #68

Open
laverne01 opened this issue Jul 1, 2024 · 7 comments

Comments

@laverne01
Copy link

laverne01 commented Jul 1, 2024

I tried creating a convert function in JNI (which calls the process function of RealSR) and used it in Kotlin. However, the output image after upscaling is just black. I would appreciate your advice on what might be going wrong.

JNIEXPORT jobject JNICALL Java_com_example_realsrandroid_ImageUpscale_convert( JNIEnv *env, jobject /* this */, jobject bitmapIn, jobject assetManager) { ncnn::Mat in_img = ncnn::Mat::from_android_bitmap(env, bitmapIn,ANDROID_BITMAP_FORMAT_RGBA_8888); ncnn::Mat out_img = ncnn::Mat(in_img.w * scale, in_img.h * scale, in_img.c, (size_t) in_img.elemsize, in_img.elempack); realsr.process(in_img, out_img); out_img.to_android_bitmap(env, bitmapIn, ANDROID_BITMAP_FORMAT_RGBA_8888); return bitmapIn; }

I have initialized RealSR on it.

realsr.scale = 4; realsr.tilesize = 200; realsr.prepadding = 10; AAssetManager *mgr = AAssetManager_fromJava(env, assetManager); realsr.load(mgr);

@RobbWatershed
Copy link

RobbWatershed commented Jul 1, 2024

I've buried hours into that problem and didn't find a working solution for retrieving the output bitmap in memory from NCNN's native environment to my app's Java/Kotlin environment.

I eventually ended up :

  • C++ side : writing a PNG file to storage once the image has been rescaled
  • Kotlin side : reading the resulting PNG file from storage

Here's the Kotlin side of the JNI interface I made : https://github.com/avluis/Hentoid/blob/master/app/ai-upscale/src/main/java/me/devsaki/hentoid/ai_upscale/AiUpscaler.kt

  • dataIn : input Bitmap; passed in memory
  • outPath : path to the PNG file to save (points to the app's private temp storage)

If you find anything more elegant, I'd be super glad to know 🙃

@laverne01
Copy link
Author

@RobbWatershed Thank you, this helps me a lot!

@tumuyan
Copy link
Owner

tumuyan commented Jul 2, 2024

Calling functions directly with jni instead of writing to a file is difficult.
I tried but failed, so that's why I'm using the current solution

@laverne01
Copy link
Author

Calling the function directly makes the code look better. I will try it out and will message back if I have a solution. Thank you.

@RobbWatershed
Copy link

FYI, if that might be of any help, I've made my AI rescale module a standalone project : https://github.com/RobbWatershed/AI_Upscale

@laverne01
Copy link
Author

Thank you! I was able to directly call the function with JNI without using the CLI. The next thing I’m working on is using GFPGAN or Codeformer for face enhancement on Android. Do you have any ideas or documentation for this?

@RobbWatershed
Copy link

The next thing I’m working on is using GFPGAN or Codeformer for face enhancement on Android. Do you have any ideas or documentation for this?

Nope, sorry. I'm more into drawn image enhancement.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants