Stingle Object Recognition
Library for detecting objects and recognising faces from org.stingle.ai.image and video using TensorFlow open source library
How to include?
git clone https://github.com/stingle/org.stingle.ai.image-recognition-java.git
cd org.stingle.ai.image-recognition-java
./gradlew build
At first you need to find generated .aar file in the build outputs. The .aar file path is the following:
org.stingle.ai.image-recognition-java/imagerecognition/build/outputs/aar/stingle-imagerecognition-1.0.0.aar
Add your .aar as a dependency using Android Studio.
- put the .aar file into app/libs folder
- add the dependency in file->project struture->dependencies section
If you need help, please follow this link: Add your AAR or JAR as a dependency
After adding the dependency you will find the module dependency in your app level build.gradle file.
implementation files('libs/stingle-imagerecognition-1.0.0.aar')
How do I use?
Find or train the best TFLite model file for you and add into your app under assets folder. there are several already trained models to use
You can execute this code to get an object recognition instance.
StingleImageRecognition imageDetector = new StingleImageRecognition.Builder(this)
.maxResults(5)
.modelPath("model.tflite")
.scoreThreshold(0.5f)
.build();
// runnning object detection on any bitmap and get the results list.
try {
List<StingleImageRecognition.DetectionResult> results =
imageDetector.runObjectDetection(bitmap);
Log.d(TAG, results.toString());
} catch (Exception e) {
Log.d(TAG, e.getMessage());
}
// runnning object detection on any bitmap and draw the results on the imageview.
try {
List<StingleImageRecognition.DetectionResult> results =
imageDetector.runObjectDetection(bitmap, imageView);
Log.d(TAG, results.toString());
} catch (Exception e) {
Log.d(TAG, e.getMessage());
}
// preparing bitmap before passing to org.stingle.ai.image detection library:
Bitmap rotatedBitmap = imageDetector.prepareBitmap(currentPhotoPath); // using best practice sizes by TFLite library
or
Bitmap rotatedBitmap = imageDetector.prepareBitmap(currentPhotoPath, 300, 400); // width and height specification
or
Bitmap rotatedBitmap = imageDetector.prepareBitmap(currentPhotoPath, inputImageView); // retrieving sizes from passed imageview
Runing object detection on the video file:
// getting detected objects from the video file located on the raw folder.
try {
Uri videoUri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.sample_1);
Set<StingleImageRecognition.DetectionResult> results =
imageDetector.runVideoObjectDetection(videoUri, 2_000L);
} catch (Exception e) {
Log.d(TAG, e.getMessage());
}
// getting detected objects from the specific video file path or media uri.
try {
Set<StingleImageRecognition.DetectionResult> results =
imageDetector.runVideoObjectDetection(videoFilePath, 1_000L);
} catch (Exception e) {
Log.d(TAG, e.getMessage());
}
// getting detected objects from the specific video file path or media uri with the factor of skipping video frames.
try {
Set<StingleImageRecognition.DetectionResult> results =
imageDetector.runVideoObjectDetection(videoFilePath, 0.5f);
} catch (Exception e) {
Log.d(TAG, e.getMessage());
}
Runing object detection on the gif file:
// getting detected objects from the specific gif file with the factor of skipping gif frames.
try {
Uri gifUri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.gif_sample_1);
imageDetector.runGifObjectDetection(gifUri, 0.5f, results -> {
Log.d(TAG, results);
});
} catch (Exception e) {
Log.d(TAG, e.getMessage());
}
For face detection
FaceRecogniser faceRecogniser = new FaceRecogniser();
faceRecogniser.init(context, "facenet.tflite");
// As facerecognizer does not store any data, you need to supply it with previous results.
// It accepts any collection.
Set<Person> personData = ...
FaceRecogniser.Result result = faceRecogniser.recognise(bitmap, personData).get();
// Then store accordingly
personData.addAll(result.personList);
An important point: try to always run the object detection functionns on the background thread to not to block the main/UI thread.
Compatibility
Minimum Android SDK: Stingle org.stingle.ai.image recognition requires a minimum API level of 23.
Also you can see
Demo project in github
License
Apache 2.0. See the LICENSE. file for details.