Android

Clarifai’s Android SDK enables machine learning directly on your device, bypassing the traditional requirement of internet connectivity and extensive computing power. It makes it easy to use image and video recognition on device and in real-time.

Android SDK

The Android SDK is currently available. You can get more information on installing the SDK here

Getting Started On Android

In order to run the SDK, you will need a Clarifai account. Please create one here before proceeding with this guide.

Clarifai Android SDK supports applications running on Android API 21 (Version 5.0 “Lollipop”), or later.

Install the SDK with an *.aar

Much of the Android SDK is built with Kotlin. As such, add the following to the project-level build.gradle:

buildscript {
ext.kotlin_version = "1.3.21"
ext.kotlin_coroutine_version = '1.1.1'
...
dependencies {
...
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}

Next, place the *.aar file into the modules's libs folder of your application, creating one if necessary. In the app-level build.gradle file, add the following dependencies:

repositories {
flatDir {
dirs 'libs'
}
}
...
dependencies {
...
implementation (name:'SDK_FILE_NAME', ext:'aar')
implementation 'android.arch.lifecycle:extensions:1.1.1'
implementation 'com.android.volley:volley:1.1.0'
implementation 'com.google.protobuf:protobuf-java:3.5.0'
implementation 'com.google.protobuf:protobuf-java-util:3.4.0'
implementation 'com.loopj.android:android-async-http:1.4.9'
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutine_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutine_version"
...
}

replacing SDK_FILE_NAME, with the name of the library(without aar extension) added to the /app/libs folder in the previous step.

Start the SDK

The Clarifai SDK is initialized by calling Clarifai.start(applicationContext, apiKey); within the com.clarifai.clarifai_android_sdk.core.Clarifai package. We recommend starting it when your app has finished launching, but that is not absolutely required. Furthermore, work is offloaded to background threads, so there should be little to no impact on the launching of your app.

js
python
java
csharp
objective-c
php
cURL
// Only for the Android SDK
// Only for the Android SDK
import com.clarifai.clarifai_android_sdk.core.Clarifai;
public class MainActivity extends AppCompatActivity {
private final String apiKey = "ENTER YOUR API KEY";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Clarifai.start(getApplicationContext(), apiKey);
}
}
// Only for the Android SDK
// Only for the Android SDK
// Only for the Android SDK
// Only for the Android SDK

Add Device Inputs with SDK

The SDK is built around a simple idea. You give inputs (images) to the library and it returns predictions (concepts). You need to add inputs to make predictions on it.

All inputs are created from a DataAsset object in the Android SDK. A Data Asset is a container for the asset in question, plus metadata related to it. You can create a DataAsset initialized with an Image on Device or from a URL as shown in the example below.

js
python
java
csharp
objective-c
php
cURL
// Only for the Android SDK
// Only for the Android SDK
import com.clarifai.clarifai_android_sdk.dataassets.DataAsset;
import com.clarifai.clarifai_android_sdk.dataassets.Image;
import com.clarifai.clarifai_android_sdk.datamodels.Input;
...
// Initialize Image object from an image URL
Image imageFromUrl = new Image(“”);
// Initialize Image object with an image on device with bitmap
Image imageFromBitmap = new Image(bitmap);
// A Data Asset is a container for the asset in question, plus
// metadata related to it
DataAsset dataAsset = new DataAsset(imageFromBitmap);
// An input object contains the data asset, temporal information, and
// is a fundamental component to be used by models to train on or
// predict
Input input = new Input(dataAsset);
// Only for the Android SDK
// Only for the Android SDK
// Only for the Android SDK
// Only for the Android SDK

Load Models On Device

Clarifai has a variety of Pre-Built Models to predict against. However, only the General Model is readily available within the SDK. For access to other models please contact sales@clarifai.com. The sample code below shows how to load the General Model and make a prediction against it.

js
python
java
csharp
objective-c
php
cURL
// Only for the Android SDK
// Only for the Android SDK
import com.clarifai.clarifai_android_sdk.datamodels.Model;
...
//Get General Model
Model model = Clarifai.getInstance().getGeneralModel();
// Only for the Android SDK
// Only for the Android SDK
// Only for the Android SDK
// Only for the Android SDK

Predict On Device

Just as with our API, you can use the predict functionality on device with any of our available Pre-Built Models. Predictions generate outputs. An output has a similar structure to an input. It contains a data asset and concepts. The concepts associated with an output contain the predictions and their respective score (degree of confidence).

Note that the prediction results from pre-built models on the SDK may differ from those on the API. Specifically, there may be a loss of accuracy up to 5% due to the conversion of the models that allow them to be compact enough to be used on lightweight devices. This loss is expected within the current industry standards.

js
python
java
csharp
objective-c
php
cURL
// Only for the Android SDK
// Only for the Android SDK
import com.clarifai.clarifai_android_sdk.datamodels.Input;
import com.clarifai.clarifai_android_sdk.datamodels.Model;
import com.clarifai.clarifai_android_sdk.utils.Error;
...
// See how to create an input from the examples above
Input input = new Input(dataAsset);
// Use the model you want to predict on. The model in the sample code
// below is our General Model.
final Model model = Clarifai.getInstance().getGeneralModel();
model.addInput(input);
model.predict(new Model.ModelCallbacks() {
@Override
public void PredictionComplete(boolean successful, Error error) {
if (successful) {
List<Output> outputs = model.getOutputs();
for (Output output: outputs) {
List<Concept> concepts = output.getDataAsset().getConcepts();
// concepts now contains a list of each concept found by the prediction
}
} else {
Log.e(TAG, error.getErrorMessage());
}
}
});
// Only for the Android SDK
// Only for the Android SDK
// Only for the Android SDK
// Only for the Android SDK