Ncnn_yolox_flutter - a plugin to run YOLOX on ncnn

Overview

ncnn_yolox_flutter

This is a plugin to run YOLOX on ncnn.

Demo

on Android

Real Device Simulator

on iOS

Real Device Simulator

Stream

How to use

1. Add the YOLOX model to assets

For example, you can use yolox_onnx_to_ncnn.ipynb

Note that you will need to manually modify the model.


If you want to use yolox_tiny, you can find it in example/assets/yolox.


Don't forget to add the model of assets to your pubspec.yaml.

flutter:
  assets:
    - assets/yolox/

2. Load the model

final ncnn = NcnnYolox();

ncnn.initYolox(
  modelPath: 'assets/yolox/yolox.bin',
  paramPath: 'assets/yolox/yolox.param',
);

3. Get the result

/// When using image file
/// **Exif Orientation is ignored**
_results = ncnn.detect(
  imagePath: "path",
);

/// When using image pixels
_results = ncnn.detect(
  pixels: image.pixels,
  pixelFormat: PixelFormat.bgra,
  width: image.width,
  height: image.height,
);

Please check example/lib for specific usage.

How to set up for using custom ncnn and custom YOLOX model

1. Build ncnn

See build_ncnn.yaml for details.

If you want pre-built ncnn, look at the URL of the Releases referenced in these files. Such as this https://github.com/KoheiKanagu/ncnn_yolox_flutter/releases/download/x.y.z/ncnn-android.zip

2. Download ncnn

The library is a binary file, so it is not packaged in the repository. The ncnn libraries for iOS and Android are CMake and Cocoapods, downloaded from Github Releases.

The ncnn library zip you are downloading is the artifact of build_ncnn.yaml. Change the URL if you want.


If you do not want to download the ncnn library, remove the process of downloading the zip. Then install the ncnn library manually.

Please refer to the comments in these files.

3. Change the parameters of YOLOX

Change ios/Classes/yolox.cpp if you want.

For example, if you want to change the size of the input image, change YOLOX_TARGET_SIZE.

Alternatively, you can change the ncnn::Net yolox; in the void initYolox(char *modelPath, char *paramPath) method.


The original yolox.cpp is ncnn/yolox.cpp at 20220216 · Tencent/ncnn.

Comments
  • Reloading the YOLOx models

    Reloading the YOLOx models

    I tried switching YOLOx Model, but as soon as I initialized the model, memory usage increased. On my device, that memory use is 2GB, approximately 15-17 times initialized before the memory leak began. It would be appreciated if this case could be reloaded, or disabled without increasing memory.

    final ncnn = NcnnYolox();
    Future<void> reloadNewModels(newModelPath, newParamPath) async {
      await ncnn.initYolox(
        modelPath: newModelPath,
        paramPath: newParamPath,
      );
    }
    
    bug 
    opened by newbie-dev-101 11
  • Is it possible to have two different models loaded at once?

    Is it possible to have two different models loaded at once?

    I want to have two models loaded simultaneously so that I can use one model to locate and crop an image, and another model to run on the cropped image. An example would be a license plate reader, one model to crop the license plate, one model to read the license plate...

    My attempt to accomplish this was unsuccessful:

    I went into the package ncnn_yolox.dart file and copied the NcnnYolox class so that I now have class NcnnYolox and class NcnnYolox2.

    In my Flutter project I initialized both models and created _labels and _labels2:

    final ncnn = NcnnYolox();
    final ncnn2 = NcnnYolox2();
    
    Future<void> main() async {
      WidgetsFlutterBinding.ensureInitialized();
    
      await ncnn.initYolox(
        modelPath: 'assets/yolox/yolox.bin',
        paramPath: 'assets/yolox/yolox.param',
      );
    
      await ncnn2.initYolox2(
        modelPath: 'assets/yolox/yolox2.bin',
        paramPath: 'assets/yolox/yolox2.param',
      );
    
      runApp(
        const MyApp(),
      );
    }
    

    Then to test I tried running the models separately on images and it appears that in both cases it is only running the model I initialized second (yolox2). So I guess I'm really loading one and then the other on top of that first one.

    Is it possible to load multiple models?

    If so, can you provide some insight into how to go about this?

    question 
    opened by jmtrutna 7
  • Error in building

    Error in building

    I can't seem to build successfully. These are my errors.

    Downloading android-arm-profile/linux-x64 tools...
    Downloading android-arm-release/linux-x64 tools...
    Downloading android-arm64-profile/linux-x64 tools...
    Downloading android-arm64-release/linux-x64 tools...
    Downloading android-x64-profile/linux-x64 tools...
    Downloading android-x64-release/linux-x64 tools...
    Launching lib/main.dart on sdk gphone64 x86 64 in debug mode...
    
    FAILURE: Build failed with an exception.
    
    * What went wrong:
    Execution failed for task ':ncnn_yolox_flutter:externalNativeBuildDebug'.
    > Build command failed.
      Error while executing process /home/dnth/Android/Sdk/cmake/3.18.1/bin/ninja with arguments {-C /home/dnth/Desktop/ncnn_yolox_flutter/android/.cxx/cmake/debug/armeabi-v7a ncnn_yolox_flutter}
      ninja: Entering directory `/home/dnth/Desktop/ncnn_yolox_flutter/android/.cxx/cmake/debug/armeabi-v7a'
      [1/2] Building CXX object CMakeFiles/ncnn_yolox_flutter.dir/home/dnth/Desktop/ncnn_yolox_flutter/ios/Classes/yolox.cpp.o
      FAILED: CMakeFiles/ncnn_yolox_flutter.dir/home/dnth/Desktop/ncnn_yolox_flutter/ios/Classes/yolox.cpp.o 
      /home/dnth/Android/Sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=armv7-none-linux-androideabi24 --gcc-toolchain=/home/dnth/Android/Sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64 --sysroot=/home/dnth/Android/Sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/sysroot -DUSE_NCNN_SIMPLEOCV -Dncnn_yolox_flutter_EXPORTS -isystem _deps/ncnn-src/armeabi-v7a/include/ncnn -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security   -O0 -fno-limit-debug-info  -fPIC -fno-exceptions -pthread -MD -MT CMakeFiles/ncnn_yolox_flutter.dir/home/dnth/Desktop/ncnn_yolox_flutter/ios/Classes/yolox.cpp.o -MF CMakeFiles/ncnn_yolox_flutter.dir/home/dnth/Desktop/ncnn_yolox_flutter/ios/Classes/yolox.cpp.o.d -o CMakeFiles/ncnn_yolox_flutter.dir/home/dnth/Desktop/ncnn_yolox_flutter/ios/Classes/yolox.cpp.o -c /home/dnth/Desktop/ncnn_yolox_flutter/ios/Classes/yolox.cpp
      In file included from /home/dnth/Desktop/ncnn_yolox_flutter/ios/Classes/yolox.cpp:20:
      In file included from _deps/ncnn-src/armeabi-v7a/include/ncnn/layer.h:18:
      In file included from _deps/ncnn-src/armeabi-v7a/include/ncnn/mat.h:38:
      In file included from _deps/ncnn-src/armeabi-v7a/include/ncnn/allocator.h:23:
      In file included from _deps/ncnn-src/armeabi-v7a/include/ncnn/platform.h:61:
      /snap/flutter/current/usr/include/pthread.h:682:6: error: 'regparm' is not valid on this platform
           __cleanup_fct_attribute;
           ^~~~~~~~~~~~~~~~~~~~~~~
      /snap/flutter/current/usr/include/bits/pthreadtypes-arch.h:103:50: note: expanded from macro '__cleanup_fct_attribute'
      # define __cleanup_fct_attribute __attribute__ ((__regparm__ (1)))
                                                       ^            ~
      In file included from /home/dnth/Desktop/ncnn_yolox_flutter/ios/Classes/yolox.cpp:20:
      In file included from _deps/ncnn-src/armeabi-v7a/include/ncnn/layer.h:18:
      In file included from _deps/ncnn-src/armeabi-v7a/include/ncnn/mat.h:38:
      In file included from _deps/ncnn-src/armeabi-v7a/include/ncnn/allocator.h:23:
      In file included from _deps/ncnn-src/armeabi-v7a/include/ncnn/platform.h:61:
      /snap/flutter/current/usr/include/pthread.h:694:3: error: 'regparm' is not valid on this platform
        __cleanup_fct_attribute;
        ^~~~~~~~~~~~~~~~~~~~~~~
      /snap/flutter/current/usr/include/bits/pthreadtypes-arch.h:103:50: note: expanded from macro '__cleanup_fct_attribute'
      # define __cleanup_fct_attribute __attribute__ ((__regparm__ (1)))
                                                       ^            ~
      In file included from /home/dnth/Desktop/ncnn_yolox_flutter/ios/Classes/yolox.cpp:20:
      In file included from _deps/ncnn-src/armeabi-v7a/include/ncnn/layer.h:18:
      In file included from _deps/ncnn-src/armeabi-v7a/include/ncnn/mat.h:38:
      In file included from _deps/ncnn-src/armeabi-v7a/include/ncnn/allocator.h:23:
      In file included from _deps/ncnn-src/armeabi-v7a/include/ncnn/platform.h:61:
      /snap/flutter/current/usr/include/pthread.h:717:6: error: 'regparm' is not valid on this platform
           __cleanup_fct_attribute;
           ^~~~~~~~~~~~~~~~~~~~~~~
      /snap/flutter/current/usr/include/bits/pthreadtypes-arch.h:103:50: note: expanded from macro '__cleanup_fct_attribute'
      # define __cleanup_fct_attribute __attribute__ ((__regparm__ (1)))
                                                       ^            ~
      In file included from /home/dnth/Desktop/ncnn_yolox_flutter/ios/Classes/yolox.cpp:20:
      In file included from _deps/ncnn-src/armeabi-v7a/include/ncnn/layer.h:18:
      In file included from _deps/ncnn-src/armeabi-v7a/include/ncnn/mat.h:38:
      In file included from _deps/ncnn-src/armeabi-v7a/include/ncnn/allocator.h:23:
      In file included from _deps/ncnn-src/armeabi-v7a/include/ncnn/platform.h:61:
      /snap/flutter/current/usr/include/pthread.h:730:3: error: 'regparm' is not valid on this platform
        __cleanup_fct_attribute;
        ^~~~~~~~~~~~~~~~~~~~~~~
      /snap/flutter/current/usr/include/bits/pthreadtypes-arch.h:103:50: note: expanded from macro '__cleanup_fct_attribute'
      # define __cleanup_fct_attribute __attribute__ ((__regparm__ (1)))
                                                       ^            ~
      In file included from /home/dnth/Desktop/ncnn_yolox_flutter/ios/Classes/yolox.cpp:20:
      In file included from _deps/ncnn-src/armeabi-v7a/include/ncnn/layer.h:18:
      In file included from _deps/ncnn-src/armeabi-v7a/include/ncnn/mat.h:38:
      In file included from _deps/ncnn-src/armeabi-v7a/include/ncnn/allocator.h:23:
      In file included from _deps/ncnn-src/armeabi-v7a/include/ncnn/platform.h:61:
      /snap/flutter/current/usr/include/pthread.h:735:6: error: 'regparm' is not valid on this platform
           __cleanup_fct_attribute __attribute__ ((__noreturn__))
           ^~~~~~~~~~~~~~~~~~~~~~~
      /snap/flutter/current/usr/include/bits/pthreadtypes-arch.h:103:50: note: expanded from macro '__cleanup_fct_attribute'
      # define __cleanup_fct_attribute __attribute__ ((__regparm__ (1)))
                                                       ^            ~
      In file included from /home/dnth/Desktop/ncnn_yolox_flutter/ios/Classes/yolox.cpp:21:
      In file included from _deps/ncnn-src/armeabi-v7a/include/ncnn/net.h:26:
      /home/dnth/Android/Sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/android/asset_manager.h:140:5: error: expected function body after function declarator
          __RENAME_IF_FILE_OFFSET64(AAsset_seek64);
          ^
      /home/dnth/Android/Sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/android/asset_manager.h:169:5: error: expected function body after function declarator
          __RENAME_IF_FILE_OFFSET64(AAsset_getLength64);
          ^
      /home/dnth/Android/Sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/android/asset_manager.h:181:5: error: expected function body after function declarator
          __RENAME_IF_FILE_OFFSET64(AAsset_getRemainingLength64);
          ^
      /home/dnth/Android/Sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/android/asset_manager.h:199:5: error: expected function body after function declarator
          __RENAME_IF_FILE_OFFSET64(AAsset_openFileDescriptor64);
          ^
      9 errors generated.
      ninja: build stopped: subcommand failed.
    
    
    * Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
    
    * Get more help at https://help.gradle.org
    
    BUILD FAILED in 1m 0s
    Exception: Gradle task assembleDebug failed with exit code 1
    Exited (sigterm)
    
    

    Output for flutter --version

    Flutter 3.0.2 • channel stable • https://github.com/flutter/flutter.git
    Framework • revision cd41fdd495 (12 days ago) • 2022-06-08 09:52:13 -0700
    Engine • revision f15f824b57
    Tools • Dart 2.17.3 • DevTools 2.12.2
    

    Output for flutter doctor

    Doctor summary (to see all details, run flutter doctor -v):
    [✓] Flutter (Channel stable, 3.0.2, on Ubuntu 20.04.4 LTS 5.13.0-51-generic, locale en_US.UTF-8)
    [✓] Android toolchain - develop for Android devices (Android SDK version 32.1.0-rc1)
    [✓] Chrome - develop for the web
    [✓] Linux toolchain - develop for Linux desktop
    [✓] Android Studio (version 2021.1)
    [✓] VS Code
    [✓] Connected device (3 available)
    [✓] HTTP Host Availability
    

    Is there any suggestion how to fix this error?

    bug wontfix 
    opened by dnth 5
  • Pixel4: Failed to start stream

    Pixel4: Failed to start stream

    Thank you for your work hard with this library. It was pretty cool. I'm new to flutter. I found a few problems while running streaming. when I install an application on a physical device, Pixel4 on streaming mode, the image after convert are looked false. At the same time on iPhone11Pro and Samsung S8 are fine. so images below are CameraImage before converting between Pixel4 and Samsung S8 and what happens on both. Pixel4 pixel4 Samsung S8 s8

    CameraImage from debug this point. https://github.com/KoheiKanagu/ncnn_yolox_flutter/blob/74adaf7ee26f187cb2dc4fa3eacbd7d68e8b290a/example/lib/widgets/image_stream_floating_action_button_widget.dart#L116-L119

    bug wontfix 
    opened by siri-sinthawat 5
  • [Inquiry] Performance compared to native Android

    [Inquiry] Performance compared to native Android

    Hi thanks for the work.

    How much more time does it take doing the inference with flutter in android (preprocessing and analyzing frames) compared when running YOLOX natively on android?

    question wontfix 
    opened by ankandrew 4
  • 部分安卓手机 在 yuv420 转换得到 rgba的过程中,最终得到的图片数据乱码。

    部分安卓手机 在 yuv420 转换得到 rgba的过程中,最终得到的图片数据乱码。

    大概有1/3的安卓手机有这样的问题,新手机也是。 我把转化后的图贴在左上角了,如此图:https://img9.doubanio.com/view/photo/l/public/p2872870726.webp resultsImg 有值,但是乱码,如果把摄像头用手捂住,图片则为绿色。 啥时候帮看一下啊,或者给个思路,有点着急,感谢!

    final yuv420sp = ncnn.yuv420sp2Uint8List( y: image.planes[0].bytes, u: image.planes[1].bytes, v: image.planes[2].bytes);

    final pixels = ncnn.yuv420sp2rgb( yuv420sp: yuv420sp, width: image.width, height: image.height);

    final rotated = ncnn.kannaRotate( pixels: pixels, pixelChannel: PixelChannel.c3, width: image.width, height: image.height, deviceOrientationType: deviceOrientationType, sensorOrientation: sensorOrientation); final rgba = ncnn.rgb2rgba( rgb: rotated.pixels, width: rotated.width, height: rotated.height);

    ui.decodeImageFromPixels( rgba, rotated.width, rotated.height, ui.PixelFormat.rgba8888, (resultsImg) async { //这个就是展示截屏右上角的图片 })

    bug 
    opened by finekewei 4
  • Bump ffi from 1.2.1 to 2.0.0

    Bump ffi from 1.2.1 to 2.0.0

    Bumps ffi from 1.2.1 to 2.0.0.

    Changelog

    Sourced from ffi's changelog.

    2.0.0

    Switch Windows memory allocation to use CoTaskMemAlloc and CoTaskMemFree, which will enable support for NativeFinalizer. This release requires Dart 2.17.0 or greater.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 3
  • How do breakpoints on library files?

    How do breakpoints on library files?

    It is my intention to use my own Yolox model. While starting is executing, the app shuts down. Until the app closes, this is the last function I can breakpoint. https://github.com/KoheiKanagu/ncnn_yolox_flutter/blob/74adaf7ee26f187cb2dc4fa3eacbd7d68e8b290a/lib/ncnn_yolox.dart#L214-L224 My opinion is that there were some errors with this function, https://github.com/KoheiKanagu/ncnn_yolox_flutter/blob/74adaf7ee26f187cb2dc4fa3eacbd7d68e8b290a/ios/Classes/yolox.cpp#L260-L265 but they were not shown except for this code. zI/flutter_exampl(32246): Background concurrent copying GC freed 446(62KB) AllocSpace objects, 16(8MB) LOS objects, 49% free, 11MB/22MB, paused 10.670ms total 78.214ms W/flutter_exampl(32246): 0xebadde09 skipped times: 0 F/libc (32246): Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x2f03 in tid 32279 (1.ui), pid 32246 (flutter_example) I think is a failure of my own NCNN model but I don't know where? Maybe is model output. Is it possible for you to help me find the way to breakpoint this function or do something to fix the error? I'm using Android Studio. yolox2ncnn How I convert YOLOx Model PTH => ONNX(2 output) => NCNN (2 output) => convert Slice Operation to YOLOv5 focus => optimize => NCNN (1 output)

    Param file Input images 0 1 images DetectionOutput DetectionOutput_320 3 1 859 861 862 output

    bug 
    opened by newbie-dev-101 3
  • Support Vulkan

    Support Vulkan

    Although ncnn supports Vulkan, it is disabled in ncnn built with this plugin. If Vulkan were supported, it would probably improve performance for image rotation and resizing.

    enhancement wontfix 
    opened by KoheiKanagu 3
  • Provide method similiar to detect method that accepts e.g. bytes (List<int> or Uint8List) as argument

    Provide method similiar to detect method that accepts e.g. bytes (List or Uint8List) as argument

    I have to preprocess my images before doing interference. In order to apply transformations I read the image into an Image object with the flutter image plugin. I would really like to use ncnn_yolox_flutter, but if I wanted to I need to write my transformed image to the filesystem first so that ncnn_yolox_flutter can read it again for interference which is redundant.

    Providing a detect method that accepts the bytes of a file would solve most of the problems, because I can encode the Image object as png which results in a List or Uint8List. Another approach would be to accept 3d arrays which contain the rgb values of the image, because then we can safe even more time, because we don't need to encode the raw data to a image file type first.

    The flutter image plugin stores the data of the image as follows:

    /// Pixels are encoded into 4-byte Uint32 integers in #AABBGGRR channel order.
    final Uint32List data;
    

    So providing a method that accepts something similar or something that does not need to much conversion would be appreciated a lot!

    enhancement good first issue 
    opened by leeflix 3
  • lib/pages/my_home_page.dart:56:5: Error: Type 'Reader' not found

    lib/pages/my_home_page.dart:56:5: Error: Type 'Reader' not found

    win10,android studio 安卓环境报错,请教如何处理

    `Launching lib\main.dart on sdk gphone x86 in debug mode... Running Gradle task 'assembleDebug'... lib/pages/my_home_page.dart:56:5: Error: Type 'Reader' not found. Reader read, ^^^^^^ lib/pages/my_home_page.dart:56:5: Error: 'Reader' isn't a type. Reader read, ^^^^^^ lib/providers/ncnn_yolox_controller.dart:22:9: Error: Type 'Reader' not found. final Reader _read; ^^^^^^ lib/providers/ncnn_yolox_controller.dart:22:9: Error: 'Reader' isn't a type. final Reader _read; ^^^^^^ lib/providers/my_camera_controller.dart:14:9: Error: Type 'Reader' not found. final Reader _read; ^^^^^^ lib/providers/my_camera_controller.dart:14:9: Error: 'Reader' isn't a type. final Reader _read; ^^^^^^

    FAILURE: Build failed with an exception.`

    bug 
    opened by lry789 2
  • Bump image from 3.2.2 to 4.0.7 in /example

    Bump image from 3.2.2 to 4.0.7 in /example

    Bumps image from 3.2.2 to 4.0.7.

    Changelog

    Sourced from image's changelog.

    4.0.7 - January 05, 2023

    • Fix Image.getRangeIterator skipping last line.

    4.0.6 - January 04, 2023

    • Image.remapChannels(ChannelOrder order) to remap the order of channels from rgb to bgr, etc.
    • Image.getBytes({ChannelOrder? order}) will return the image data, optionally reordering the channels.
    • Image.fromBytes can take an optional ChannelOrder? order named arg to specify the channel order of the input data.

    4.0.5 - January 01, 2023

    • Improved antialiasing for drawLine
    • Add antialias arg for drawCircle, fillCircle.
    • Added radius argument to drawRect, fillRect, copyCrop, and copyResizeCropSquare to support rounded rectangles.
    • Add Image.getPixelClamped method.
    • Added TGA decoder 8-bit, 16-bit, 32-bit, and RLE compression modes.

    4.0.4 - December 31, 2022

    • Fix for animated PNG with palette images, which needed a global palette for all frames.
    • Fix TIFF encoder for palette images.
    • Cleaned up EXIF classes.

    4.0.3 - December 30, 2022

    • Fix for encoding GIF transparency.

    4.0.2 - December 30, 2022

    • No changes, dart formatted code and fix documentation link.

    4.0.1 - December 30, 2022

    • Use strict analyzer settings, clean up warnings.

    4.0.0 - December 30, 2022

    • Major update of the Dart Image Library. Includes support for:
      • Major overhaul of the API. Dart has changed a lot in the 10 years since this library was written, so the API has been modernized.
      • Flexible ImageData, with support for 1, 2, 4, 8, 16, and 32 bit images, and 1-4 channels per pixel.
      • 16, 32, and 64-bit floating-point format images.
      • 8, 16, and 32-bit integer format images.
      • Palette images with 1, 2, 4, and 8-bit colors.
      • Improved pixel access API.
      • Merged HDR and Animation functionality into the single Image class.
      • New Command API with support for executing on Isolate threads.
      • New filters and drawing commands.

    ... (truncated)

    Commits
    • 7e3876b Update to 4.0.7
    • 31c8cff Update to 4.0.6
    • 7f9877e Add test for Image functions that can now take ChannelOrder
    • 629d3ff Add Image.remapChannels(ChannelOrder order) to re-arrange the color channels ...
    • 3528847 Add ChannelOrder to specify the order of color channels in Image.fromBytes, a...
    • 922e151 update docs
    • ce46312 Update version to 4.0.5
    • 1865112 Add antialiasing to rounded drawRect, rounded fillRect, rounded copyCrop, cop...
    • 734fa4d tga decoder: add rle compression and 8-bit and 16-bit support
    • 82139b2 add missing interpolation mode to getPixelInterpolate
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies dart 
    opened by dependabot[bot] 0
  • detections an order of magnitude slower on android

    detections an order of magnitude slower on android

    I just bought a Pixel 6a to do some testing (I'd previously only been testing on an iphone 13) and when I'm running detections on an image stream I'm getting results at ~ 3.5 FPS whereas on my iphone i'm getting results ~ 31 FPS...

    Has anyone else had a similar experience??

    Code below for how I'm running on stream:

    import 'dart:ui' as ui;
    
    import 'package:camera/camera.dart';
    import 'package:flutter/material.dart';
    import 'package:ncnn_yolox_flutter/models/kanna_rotate/kanna_rotate_device_orientation_type.dart';
    import 'package:ncnn_yolox_flutter/models/pixel_channel.dart';
    import 'package:ncnn_yolox_flutter/models/pixel_format.dart';
    import 'package:ncnn_yolox_flutter/models/yolox_results.dart';
    import 'package:ncnn_yolox_flutter/ncnn_yolox.dart';
    import 'package:test_android/src/app.dart';
    
    import '../../main.dart';
    import '../widgets/yolox_camera_layout_widget.dart';
    
    class TestPage extends StatefulWidget {
      const TestPage({Key? key}) : super(key: key);
    
      @override
      State<TestPage> createState() => _TestPageState();
    }
    
    class _TestPageState extends State<TestPage> {
      late CameraController controller;
      KannaRotateDeviceOrientationType get deviceOrientationType =>
          controller.value.deviceOrientation.kannaRotateType ??
          KannaRotateDeviceOrientationType.portraitUp;
    
      int get sensorOrientation => controller.description.sensorOrientation ?? 90;
      double? _screenWidth;
      bool processing = false; // for detection camera stream
      bool cameraOpen = false; // for camera or body
    
      final ncnn = NcnnYolox();
      ui.Image? previewImage; // used in detection camera stream
    
      List<YoloxResults> yoloxResults = [];
    
      @override
      void initState() {
        super.initState();
        initCoco();
        controller = CameraController(cameras[0], ResolutionPreset.medium);
        controller.initialize().then((_) {
          if (!mounted) {
            return;
          }
          setState(() {});
        }).catchError((Object e) {
          if (e is CameraException) {
            switch (e.code) {
              case 'CameraAccessDenied':
                // Handle access errors here.
                break;
              default:
                // Handle other errors here.
                break;
            }
          }
        });
      }
    
      @override
      void dispose() {
        controller.dispose();
        super.dispose();
      }
    
      @override
      void didChangeAppLifecycleState(AppLifecycleState state) {
        switch (state) {
          case AppLifecycleState.resumed:
          case AppLifecycleState.inactive:
            print('Lifecycle Inactive!!!!!!!');
            //controller.dispose();
            _stopImageStream();
            setState(() {
              processing = false;
              cameraOpen = false;
            });
            break;
          case AppLifecycleState.paused:
          case AppLifecycleState.detached:
            break;
        }
      }
    
      initCoco() async {
        await ncnn.initYolox(
          modelPath: 'assets/yolox_coco.bin',
          paramPath: 'assets/yolox_coco.param',
          autoDispose: true,
          nmsThresh: 0.35,
          confThresh: 0.3,
          targetSize: 416,
        );
      }
    
      onDetected(
        List<YoloxResults> results,
        ui.Image image,
      ) {
        setState(() {
          yoloxResults = results;
          previewImage = image;
        });
      }
    
      Future<void> _startImageStream() async {
        print('Start Stream!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!');
        await controller.startImageStream(
          (image) {
            if (processing) {
              return;
            }
    
            switch (image.format.group) {
              case ImageFormatGroup.unknown:
              case ImageFormatGroup.jpeg:
                print('not support format');
                return;
              case ImageFormatGroup.yuv420:
                _yuv420(image);
                break;
              case ImageFormatGroup.bgra8888:
                _bgra(image);
                break;
            }
          },
        );
      }
    
      Future<void> _stopImageStream() async {
        print('Stop Stream?????????????????????????????????????????');
        controller.stopImageStream();
        setState(() {
          processing = false;
          cameraOpen = false;
        });
      }
    
      void _yuv420(CameraImage image) {
        processing = true;
    
        final stopwatchYuv420sp2Uint8List = Stopwatch()..start();
        final yuv420sp = ncnn.yuv420sp2Uint8List(
          y: image.planes[0].bytes,
          u: image.planes[1].bytes,
          v: image.planes[2].bytes,
        );
        stopwatchYuv420sp2Uint8List.stop();
    
        final stopwatchYuv420sp2rgb = Stopwatch()..start();
        final pixels = ncnn.yuv420sp2rgb(
          yuv420sp: yuv420sp,
          width: image.width,
          height: image.height,
        );
        stopwatchYuv420sp2rgb.stop();
    
        final deviceOrientationType =
            controller.value.deviceOrientation.kannaRotateType;
        final sensorOrientation = controller.description.sensorOrientation;
    
        final stopwatchKannaRotate = Stopwatch()..start();
        final rotated = ncnn.kannaRotate(
          pixels: pixels,
          pixelChannel: PixelChannel.c3,
          width: image.width,
          height: image.height,
          deviceOrientationType: deviceOrientationType,
          sensorOrientation: sensorOrientation,
        );
        stopwatchKannaRotate.stop();
    
        final stopwatchRgb2rgba = Stopwatch()..start();
        final rgba = ncnn.rgb2rgba(
          rgb: rotated.pixels!,
          width: rotated.width,
          height: rotated.height,
        );
        stopwatchRgb2rgba.stop();
    
        final stopwatchDetect = Stopwatch()..start();
        final results = ncnn.detectPixels(
          pixels: rotated.pixels!,
          pixelFormat: PixelFormat.rgb,
          width: rotated.width,
          height: rotated.height,
        );
        stopwatchDetect.stop();
    
        final stopwatchDecodeImageFromPixels = Stopwatch()..start();
        ui.decodeImageFromPixels(
          rgba,
          rotated.width,
          rotated.height,
          ui.PixelFormat.rgba8888,
          (resultsImg) async {
            stopwatchDecodeImageFromPixels.stop();
    
            onDetected(results, resultsImg);
            processing = false;
    
            final sumMs = stopwatchYuv420sp2Uint8List.elapsedMilliseconds +
                stopwatchYuv420sp2rgb.elapsedMilliseconds +
                stopwatchKannaRotate.elapsedMilliseconds +
                stopwatchRgb2rgba.elapsedMilliseconds +
                stopwatchDetect.elapsedMilliseconds +
                stopwatchDecodeImageFromPixels.elapsedMilliseconds;
            print(
              '''====
    yuv420sp2Uint8List: ${stopwatchYuv420sp2Uint8List.elapsedMilliseconds}ms
    yuv420sp2rgb: ${stopwatchYuv420sp2rgb.elapsedMilliseconds}ms
    kannaRotate: ${stopwatchKannaRotate.elapsedMilliseconds}ms
    rgb2rgba: ${stopwatchRgb2rgba.elapsedMilliseconds}ms
    detect: ${stopwatchDetect.elapsedMilliseconds}ms
    decodeImageFromPixels: ${stopwatchDecodeImageFromPixels.elapsedMilliseconds}ms
    
    FPS: ${1000 / sumMs}
    ====
    ''',
            );
          },
        );
      }
    
      void _bgra(CameraImage image) {
        processing = true;
    
        final deviceOrientationType =
            controller.value.deviceOrientation.kannaRotateType;
        final sensorOrientation = controller.description.sensorOrientation;
    
        final stopwatchKannaRotate = Stopwatch()..start();
        final rotated = ncnn.kannaRotate(
          pixels: image.planes[0].bytes,
          pixelChannel: PixelChannel.c4,
          width: image.width,
          height: image.height,
          deviceOrientationType: deviceOrientationType,
          sensorOrientation: sensorOrientation,
        );
        stopwatchKannaRotate.stop();
    
        final stopwatchDetect = Stopwatch()..start();
        final results = ncnn.detectPixels(
          pixels: rotated.pixels!,
          pixelFormat: PixelFormat.bgra,
          width: rotated.width,
          height: rotated.height,
        );
        stopwatchDetect.stop();
    
        final stopwatchDecodeImageFromPixels = Stopwatch()..start();
        ui.decodeImageFromPixels(
          rotated.pixels!,
          rotated.width,
          rotated.height,
          ui.PixelFormat.bgra8888,
          (resultsImg) async {
            stopwatchDecodeImageFromPixels.stop();
    
            onDetected(results, resultsImg);
            processing = false;
    
            final sumMs = stopwatchKannaRotate.elapsedMilliseconds +
                stopwatchDetect.elapsedMilliseconds +
                stopwatchDecodeImageFromPixels.elapsedMilliseconds;
    
            print(
              '''====
    kannaRotate: ${stopwatchKannaRotate.elapsedMilliseconds}ms
    detect: ${stopwatchDetect.elapsedMilliseconds}ms
    decodeImageFromPixels: ${stopwatchDecodeImageFromPixels.elapsedMilliseconds}ms
    
    
    
    FPS: ${1000 / sumMs}
    ====
    ''',
            );
          },
        );
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Test'),
          ),
          floatingActionButton: cameraOpen
              ? FloatingActionButton(
                  onPressed: () {
                    setState(() {
                      cameraOpen = !cameraOpen;
                      _stopImageStream();
                    });
                  },
                )
              : FloatingActionButton(
                  onPressed: () {
                    setState(() {
                      cameraOpen = !cameraOpen;
                      _startImageStream();
                    });
                  },
                ),
          body: cameraOpen
              ? YoloxCameraLayoutWidget(
                  previewImage: previewImage,
                  results: yoloxResults,
                  labels: cocoLabels,
                )
              : Center(
                  child: Text('Body'),
                ),
        );
      }
    }
    
    extension DeviceOrientationExtension on DeviceOrientation {
      KannaRotateDeviceOrientationType get kannaRotateType {
        switch (this) {
          case DeviceOrientation.portraitUp:
            return KannaRotateDeviceOrientationType.portraitUp;
          case DeviceOrientation.portraitDown:
            return KannaRotateDeviceOrientationType.portraitDown;
          case DeviceOrientation.landscapeLeft:
            return KannaRotateDeviceOrientationType.landscapeLeft;
          case DeviceOrientation.landscapeRight:
            return KannaRotateDeviceOrientationType.landscapeRight;
        }
      }
    }
    
    final cocoLabels = [
      'person',
      'bicycle',
      'car',
      'motorcycle',
      'airplane',
      'bus',
      'train',
      'truck',
      'boat',
      'traffic light',
      'fire hydrant',
      'stop sign',
      'parking meter',
      'bench',
      'bird',
      'cat',
      'dog',
      'horse',
      'sheep',
      'cow',
      'elephant',
      'bear',
      'zebra',
      'giraffe',
      'backpack',
      'umbrella',
      'handbag',
      'tie',
      'suitcase',
      'frisbee',
      'skis',
      'snowboard',
      'sports ball',
      'kite',
      'baseball bat',
      'baseball glove',
      'skateboard',
      'surfboard',
      'tennis racket',
      'bottle',
      'wine glass',
      'cup',
      'fork',
      'knife',
      'spoon',
      'bowl',
      'banana',
      'apple',
      'sandwich',
      'orange',
      'broccoli',
      'carrot',
      'hot dog',
      'pizza',
      'donut',
      'cake',
      'chair',
      'couch',
      'potted plant',
      'bed',
      'dining table',
      'toilet',
      'tv',
      'laptop',
      'mouse',
      'remote',
      'keyboard',
      'cell phone',
      'microwave',
      'oven',
      'toaster',
      'sink',
      'refrigerator',
      'book',
      'clock',
      'vase',
      'scissors',
      'teddy bear',
      'hair drier',
      'toothbrush'
    ];
    
    

    yolox camera layout widget:

    import 'dart:ui' as ui;
    
    import 'package:flutter/material.dart';
    import 'package:ncnn_yolox_flutter/ncnn_yolox_flutter.dart';
    
    class YoloxCameraLayoutWidget extends StatelessWidget
        with WidgetsBindingObserver {
      YoloxCameraLayoutWidget({
        Key? key,
        this.previewImage,
        required this.results,
        required this.labels,
      }) : super(key: key);
    
      final ui.Image? previewImage;
    
      final List<YoloxResults> results;
    
      YoloxResults? produceResults;
    
      final List<String> labels;
    
      @override
      Widget build(BuildContext context) {
        return LayoutBuilder(
          builder: (context, constraints) {
            if (previewImage == null) {
              return const Center(
                child: CircularProgressIndicator(),
              );
            }
    
            final cameraWidget = FittedBox(
              child: SizedBox(
                //height: _screenHeight,
                //width: _screenWidth,
                width: previewImage!.width.toDouble(),
                height: previewImage!.height.toDouble(),
                child: CustomPaint(
                  painter: YoloxResultsPainter(
                    image: previewImage!,
                    results: results,
                    labels: labels,
                  ),
                ),
              ),
            );
    
            return cameraWidget;
          },
        );
      }
    }
    
    opened by jmtrutna 4
  • Bump hooks_riverpod from 2.1.1 to 2.1.3 in /example

    Bump hooks_riverpod from 2.1.1 to 2.1.3 in /example

    Bumps hooks_riverpod from 2.1.1 to 2.1.3.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies dart 
    opened by dependabot[bot] 0
  • Bump camera from 0.10.0+4 to 0.10.1 in /example

    Bump camera from 0.10.0+4 to 0.10.1 in /example

    Bumps camera from 0.10.0+4 to 0.10.1.

    Commits
    • 3d8b73b [camera] Remove deprecated Optional type (#6870)
    • 3a093e4 [various] Enable avoid_print (#6842)
    • b2cdcb6 [camera_android_camerax] unnecessary_parenthesis lint fix (#6841)
    • 1381802 [camera] Attempt to fix flaky new Android test (#6831)
    • 929c9a6 [camera] Re-enable ability to concurrently record and stream video (#6808)
    • 610370e Revert "[camera] Add ability to concurrently record and stream video (#6290)"...
    • 374e598 [camera] Add ability to concurrently record and stream video (#6290)
    • 63f1b8f [camera] Handle empty grantResults on permission request (#6758)
    • 9990a4b [ci] Improve analysis_options alignment with flutter/packages (#6728)
    • 1aabcd6 [camera] Export VideoCaptureOptions so that implementers can use it (#6666)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies dart 
    opened by dependabot[bot] 0
Releases(0.4.2)
  • 0.4.2(Dec 4, 2022)

    What's Changed

    • fix: Supports the latest riverpod with example app. by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/82
    • fix: Fixed a problem with incorrect object detection on iOS when the image source is camera in the example app. by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/83
    • build: bump 0.4.2 by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/84

    Full Changelog: https://github.com/KoheiKanagu/ncnn_yolox_flutter/compare/0.4.1...0.4.2

    Source code(tar.gz)
    Source code(zip)
  • 0.4.1(Nov 5, 2022)

    What's Changed

    • feat: Added option to autoDispose recently loaded model. by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/76
    • feat: Added NMS and confidence and image size options to initYolox. by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/77
    • build: bump 0.4.1 by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/78

    Full Changelog: https://github.com/KoheiKanagu/ncnn_yolox_flutter/compare/0.4.0...0.4.1

    Source code(tar.gz)
    Source code(zip)
  • 0.4.0(Oct 27, 2022)

    What's Changed

    • improvement detect method by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/46
    • upload artifact by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/49
    • Bump actions/cache from 3.0.4 to 3.0.7 by @dependabot in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/54
    • Bump actions/upload-artifact from 3.1.0 to 3.1.1 by @dependabot in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/70
    • Bump actions/cache from 3.0.7 to 3.0.11 by @dependabot in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/67
    • Bump camera from 0.9.8+1 to 0.10.0+4 in /example by @dependabot in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/69
    • Bump image from 3.2.0 to 3.2.2 in /example by @dependabot in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/68
    • fix: Fixed a memory leak on model loading by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/71
    • Bump image_picker from 0.8.5+3 to 0.8.6 in /example by @dependabot in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/66
    • ci: bump flutter 3.3.5 by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/73
    • build: dart 2.18.0 by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/72
    • fix: The Width of the stream's CameraImage is width from the length of the pixels by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/45
    • Bump pedantic_mono from 1.19.2 to 1.20.0 in /example by @dependabot in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/57

    Full Changelog: https://github.com/KoheiKanagu/ncnn_yolox_flutter/compare/0.3.0...0.4.0

    Source code(tar.gz)
    Source code(zip)
  • 0.3.0(Jun 20, 2022)

    What's Changed

    • Bump actions/cache from 2.1.7 to 3.0.4 by @dependabot in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/39
    • Bump actions/upload-artifact from 2 to 3 by @dependabot in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/38
    • Bump actions/download-artifact from 2 to 3 by @dependabot in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/40
    • impl DetectResults by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/43
    • 0.3.0 by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/44

    Full Changelog: https://github.com/KoheiKanagu/ncnn_yolox_flutter/compare/0.2.0...0.3.0

    Source code(tar.gz)
    Source code(zip)
  • 0.2.0(Jun 20, 2022)

    What's Changed

    • Add PixelChannel to KannaRotateResults by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/27
    • Support Flutter3 by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/29
    • Bump ffi from 1.2.1 to 2.0.0 by @dependabot in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/31
    • add workflows by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/30
    • refactor example app by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/32
    • support freezed by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/33
    • impl convenient detect by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/35
    • fix readme by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/36
    • 0.2.0 by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/37

    New Contributors

    • @dependabot made their first contribution in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/31

    Full Changelog: https://github.com/KoheiKanagu/ncnn_yolox_flutter/compare/0.1.2...0.2.0

    Source code(tar.gz)
    Source code(zip)
  • 0.1.2(Mar 24, 2022)

    What's Changed

    • Fixed to initialize dynamicLibrary lookupFunction in the constructor. by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/20

    Full Changelog: https://github.com/KoheiKanagu/ncnn_yolox_flutter/compare/0.1.1...0.1.2

    Source code(tar.gz)
    Source code(zip)
  • 0.1.1(Mar 10, 2022)

    What's Changed

    • Fixed orientation of preview image in example app. by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/18

    Full Changelog: https://github.com/KoheiKanagu/ncnn_yolox_flutter/compare/0.1.0...0.1.1

    Source code(tar.gz)
    Source code(zip)
  • 0.1.0(Mar 10, 2022)

    What's Changed

    • Supports real-time image streams by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/14
    • Fixed a problem with object detection in the sample app. by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/15
    • 0.1.0 by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/16

    Full Changelog: https://github.com/KoheiKanagu/ncnn_yolox_flutter/compare/0.0.7...0.1.0

    Source code(tar.gz)
    Source code(zip)
  • 0.0.7+1(Mar 10, 2022)

  • 0.0.7(Mar 10, 2022)

    What's Changed

    • fix LICENSE by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/10

    Full Changelog: https://github.com/KoheiKanagu/ncnn_yolox_flutter/compare/0.0.6...0.0.7

    Source code(tar.gz)
    Source code(zip)
  • 0.0.5(Mar 10, 2022)

    What's Changed

    • 0.0.5 by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/6

    Full Changelog: https://github.com/KoheiKanagu/ncnn_yolox_flutter/compare/0.0.4...0.0.5

    Source code(tar.gz)
    Source code(zip)
  • 0.0.4(Mar 10, 2022)

    What's Changed

    • 0.0.4 by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/5

    Full Changelog: https://github.com/KoheiKanagu/ncnn_yolox_flutter/compare/0.0.3...0.0.4

    Source code(tar.gz)
    Source code(zip)
  • 0.0.3(Mar 10, 2022)

    What's Changed

    • 0.0.3 by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/4

    Full Changelog: https://github.com/KoheiKanagu/ncnn_yolox_flutter/compare/0.0.2...0.0.3

    Source code(tar.gz)
    Source code(zip)
  • 0.0.2(Mar 10, 2022)

    What's Changed

    • 0.0.2 by @KoheiKanagu in https://github.com/KoheiKanagu/ncnn_yolox_flutter/pull/3

    Full Changelog: https://github.com/KoheiKanagu/ncnn_yolox_flutter/compare/0.0.1...0.0.2

    Source code(tar.gz)
    Source code(zip)
  • 0.0.1(Mar 10, 2022)

Owner
KoheiKanagu
Flutter
KoheiKanagu
Flutter plugin for sound. Audio recorder and player.

Flutter Sound user: your documentation is there The CHANGELOG file is here Overview Flutter Sound is a Flutter package allowing you to play and record

null 764 Jan 2, 2023
WebRTC plugin for Flutter Mobile/Desktop/Web

Flutter-WebRTC WebRTC plugin for Flutter Mobile/Desktop/Web Sponsored with ?? by Enterprise Grade APIs for Feeds & Chat. Try the Flutter Chat tutorial

Flutter WebRTC 3.4k Jan 8, 2023
A flutter plugin to handle Android / iOS camera

?? Overview Flutter plugin to add Camera support inside your project. CamerAwesome include a lot of useful features like: ?? Live camera flip ( switch

Apparence.io 511 Jan 5, 2023
A Flutter plugin to use speech recognition on iOS & Android (Swift/Java)

speech_recognition A flutter plugin to use the speech recognition iOS10+ / Android 4.1+ Basic Example Sytody, speech to todo app Installation Depend o

Erick Ghaumez 331 Dec 19, 2022
A Flutter audio-plugin to playing and recording sounds

medcorder_audio Flutter record/play audio plugin. Developed for Evrone.com Funded by Medcorder Medcorder.com Getting Started For help getting started

Evrone 106 Oct 29, 2022
Simple plugin to implement Picture in Picture support for Android only.

flutter_pip Simple plugin to implement Picture in Picture support for Android only. Android Setup You need to declare that your app supports Picture i

null 0 Dec 22, 2021
Flutter (web-only at this moment) plugin for recording audio (using the microphone).

Microphone Flutter (web-only at this moment) plugin for recording audio (using the microphone). Getting started To learn more about the plugin and get

null 28 Sep 26, 2022
Playify is a Flutter plugin for play/pause/seek songs, fetching music metadata, and browsing music library.

Playify Playify is a Flutter plugin for play/pause/seek songs, fetching music metadata, and browsing music library. Playify was built using iOS's Medi

Ibrahim Berat Kaya 32 Dec 14, 2022
Flutter plugin for use Video.js in flutter web

Flutter Video.js player Flutter plugin for use Video.js in flutter web Installation Add it to your package's pubspec.yaml file dependencies: video_j

null 15 Oct 17, 2022
Flutter plugin for selecting multiple images from the Android and iOS image library

Flutter plugin for selecting multiple images from the Android and iOS image library, taking new pictures with the camera, and edit them before using such as rotating, cropping, adding sticker/filters.

Weta Vietnam 91 Dec 19, 2022
Flutter plugin for sound. Audio recorder and player.

Sounds Sounds is a Flutter package allowing you to play and record audio for both the android and ios platforms. Sounds provides both a high level API

Brett Sutton 75 Dec 8, 2022
Image Editor Plugin with simple, easy support for image editing using Paints, Text, Filters, Emoji and Sticker like stories.

ImageEditorPro Image Editor Plugin with simple, easy support for image editing using Paints, Text, Filters, Emoji and Sticker like stories. To start w

Zeeshan 206 Dec 2, 2022
A Flutter audio plugin (Swift/Java) to play remote or local audio files on iOS / Android / MacOS and Web

AudioPlayer A Flutter audio plugin (Swift/Java) to play remote or local audio files on iOS / Android / MacOS and Web. Online demo Features Android / i

Erick Ghaumez 489 Dec 18, 2022
Flutter plugin for playing or streaming YouTube videos inline using the official iFrame Player API.

Flutter plugin for playing or streaming YouTube videos inline using the official iFrame Player API. The package exposes almost all the API provided by iFrame Player API. So, it's 100% customizable.

Sarbagya Dhaubanjar 558 Jan 2, 2023
This Flutter plugin created to show how to use OpenCV and ZXing C++ libraries natively in Flutter with Dart FFI using the camera stream

OpenCV and ZXing C++ libraries natively in Flutter with Dart FFI using the camera stream

Khoren Markosyan 17 Oct 21, 2022
A Flutter media player plugin for iOS and android based on ijkplayer

Flutter media player plugin for android/iOS based on ijkplayer.

于飞白呀 1.4k Jan 4, 2023
Flutter Advanced: Background Fetch | Run code in the background Android & iOS | Run code in the background Android & iOS

flutterbackground A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you starte

Pawan Kumar 40 Dec 16, 2022
Flutter Navigation - all types of navigation in flutter run main.tabBar.dart to see tabBar, and run main.dart to see the otheres

pop_up_bar A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you started if th

Michael Odumosu 0 Jan 1, 2022
Flutter plugin to run all creme sharing routines.

Creme Share plugin A Flutter plugin to share content from your Flutter app to social apps. Platform Support Android (WIP) iOS ❌ ✔️ Usage To use this p

Creme 10 Dec 20, 2022
Flutter Multi-platform allows developers to unleash their app to run on the wide variety of different platforms with little or no change.

Flutter Multi-platform sample Flutter Multi-platform allows developers to unleash their app to run on the wide variety of different platforms with lit

MindInventory 22 Dec 31, 2022