The following APIs will enable you to identify entities (faces and/or celebrities) from images.
## Set up your backend
Run `amplify add predictions`, then use the following answers:
```console
? Please select from one of the categories below (Use arrow keys)
`Identify`
? What would you like to identify? (Use arrow keys)
`Identify Entities`
? Provide a friendly name for your resource
`identifyEntities`
? Would you like use the default configuration? (Use arrow keys)
`Default Configuration`
? Who should have access? (Use arrow keys)
`Auth and Guest users`
```
Run `amplify push` to create the resources in the cloud.
## Working with the API
### Detect entities in an image
To detect general entities like facial features, landmarks etc, default configuration from CLI workflow will suffice (i.e. celebrity detection enabled & entity identification from collection disabled).
Amplify will now detect general entity features when `IdentifyActionType.DETECT_ENTITIES` is passed in. Results are mapped to `IdentifyEntitiesResult`. For example:
```java
public void detectEntities(Bitmap image) {
Amplify.Predictions.identify(
IdentifyActionType.DETECT_ENTITIES,
image,
result -> {
IdentifyEntitiesResult identifyResult = (IdentifyEntitiesResult) result;
EntityDetails metadata = identifyResult.getEntities().get(0);
Log.i("MyAmplifyApp", metadata.getBox().toShortString());
},
error -> Log.e("MyAmplifyApp", "Entity detection failed", error)
);
}
```
```kotlin
fun detectEntities(image: Bitmap) {
Amplify.Predictions.identify(IdentifyActionType.DETECT_ENTITIES, image,
{ result ->
val identifyResult = result as IdentifyEntitiesResult
val metadata = identifyResult.entities.firstOrNull()
Log.i("MyAmplifyApp", "${metadata?.box?.toShortString()}")
},
{ Log.e("MyAmplifyApp", "Entity detection failed", it) }
)
}
```
```kotlin
suspend fun detectEntities(image: Bitmap) {
try {
val result = Amplify.Predictions.identify(IdentifyActionType.DETECT_ENTITIES, image)
val identifyResult = result as IdentifyEntitiesResult
val value = identifyResult.entities.firstOrNull()?.box?.toShortString()
Log.i("MyAmplifyApp", "$value")
} catch (error: PredictionsException) {
Log.e("MyAmplifyApp", "Entity detection failed", error)
}
}
```
```java
public void detectEntities(Bitmap image) {
RxAmplify.Predictions.identify(IdentifyActionType.DETECT_ENTITIES, image)
.subscribe(
result -> {
IdentifyEntitiesResult identifyResult = (IdentifyEntitiesResult) result;
EntityDetails metadata = identifyResult.getEntities().get(0);
Log.i("MyAmplifyApp", metadata.getBox().toShortString());
},
error -> Log.e("MyAmplifyApp", "Entity detection failed", error)
);
}
```
As a result of passing in an image, the bounding box ([`android.graphics.RectF`](https://developer.android.com/reference/android/graphics/RectF)) that captures detected entity will be printed to the console.
### Detect pre-determined entities in an image
You can also match entities from a pre-created [Amazon Rekognition Collection](https://docs.aws.amazon.com/rekognition/latest/dg/collections.html) in Amplify. To access this feature, you must used advanced configuration in Amplify CLI:
Run `amplify add predictions`, then use the following answers:
```console
? Please select from one of the categories below (Use arrow keys)
`Identify`
? What would you like to identify? (Use arrow keys)
`Identify Entities`
? Provide a friendly name for your resource
`identifyEntities`
? Would you like use the default configuration? (Use arrow keys)
`Advanced Configuration`
? Would you like to enable celebrity detection? (Y/n)
`Y`
? Would you like to identify entities from a collection of images? (y/N)
`Y`
? How many entities would you like to identify? (50)
`10`
? Would you like to allow users to add images to this collection? (Use arrow keys)
`Yes`
? Who should have access? (Use arrow keys)
`Auth and Guest users`
```
Run `amplify push` to create the resources in the cloud
**Note**: If entity detection was already configured, run `amplify update predictions` to reconfigure as necessary.
The value of `collectionId` is the name of your collection, which can be created directly via CLI. The value of `maxEntities` must be a number greater than `0` or less than `51` (50 is the max number of entities Rekognition can detect from a collection). If either value of `collectionId` or `maxEntities` is invalid, then `identify` will just detect entities in general with facial features, landmarks, etc.
If both `collectionId` and `maxEntities` are properly configured, then Amplify will detect entity matches from the Rekognition Collection in your app. Results are mapped to `IdentifyEntityMatchesResult`. For example:
```java
public void detectEntities(Bitmap image) {
Amplify.Predictions.identify(
IdentifyActionType.DETECT_ENTITIES,
image,
result -> {
IdentifyEntityMatchesResult identifyResult = (IdentifyEntityMatchesResult) result;
EntityMatch match = identifyResult.getEntityMatches().get(0);
Log.i("AmplifyQuickstart", match.getExternalImageId());
},
error -> Log.e("AmplifyQuickstart", "Identify failed", error)
);
}
```
```kotlin
fun detectEntities(image: Bitmap) {
Amplify.Predictions.identify(IdentifyActionType.DETECT_ENTITIES, image,
{ result ->
val identifyResult = result as IdentifyEntityMatchesResult
val match = identifyResult.entityMatches.firstOrNull()
Log.i("AmplifyQuickstart", "${match?.externalImageId}");
},
{ Log.e("AmplifyQuickstart", "Identify failed", it) }
)
}
```
```kotlin
suspend fun detectEntities(image: Bitmap) {
try {
val result = Amplify.Predictions.identify(IdentifyActionType.DETECT_ENTITIES, image)
val identifyResult = result as IdentifyEntityMatchesResult
val imageId = identifyResult.entityMatches.firstOrNull()?.externalImageId
Log.i("MyAmplifyApp", "$imageId")
} catch (error: PredictionsException) {
Log.e("MyAmplifyApp", "Identify failed", error)
}
}
```
```java
public void detectEntities(Bitmap image) {
RxAmplify.Predictions.identify(IdentifyActionType.DETECT_ENTITIES, image)
.subscribe(
result -> {
IdentifyEntityMatchesResult identifyResult = (IdentifyEntityMatchesResult) result;
EntityMatch match = identifyResult.getEntityMatches().get(0);
Log.i("AmplifyQuickstart", match.getExternalImageId());
},
error -> Log.e("AmplifyQuickstart", "Identify failed", error)
);
}
```
### Detecting Celebrities
To detect celebrities you can pass in `IdentifyActionType.DETECT_CELEBRITIES`. Results are mapped to `IdentifyCelebritiesResult`. For example:
```java
public void detectCelebs(Bitmap image) {
Amplify.Predictions.identify(
IdentifyActionType.DETECT_CELEBRITIES,
image,
result -> {
IdentifyCelebritiesResult identifyResult = (IdentifyCelebritiesResult) result;
CelebrityDetails metadata = identifyResult.getCelebrities().get(0);
Log.i("MyAmplifyApp", metadata.getCelebrity().getName());
},
error -> Log.e("MyAmplifyApp", "Identify failed", error)
);
}
```
```kotlin
fun detectCelebs(image: Bitmap) {
Amplify.Predictions.identify(IdentifyActionType.DETECT_CELEBRITIES, image,
{ result ->
val identifyResult = result as IdentifyCelebritiesResult
val metadata = identifyResult.celebrities.firstOrNull()
Log.i("MyAmplifyApp", "${metadata?.celebrity?.name}")
},
{ Log.e("MyAmplifyApp", "Identify failed", it) }
)
}
```
```kotlin
suspend fun detectCelebs(image: Bitmap) {
try {
val result = Amplify.Predictions.identify(IdentifyActionType.DETECT_CELEBRITIES, image)
val identifyResult = result as IdentifyCelebritiesResult
val celebrityName = identifyResult.celebrities.firstOrNull()?.celebrity?.name
Log.i("MyAmplifyApp", "$celebrityName")
} catch (error: PredictionsException) {
Log.e("MyAmplifyApp", "Identify failed", error)
}
}
```
```java
public void detectCelebs(Bitmap image) {
RxAmplify.Predictions.identify(IdentifyActionType.DETECT_CELEBRITIES, image)
.subscribe(
result -> {
IdentifyCelebritiesResult identifyResult = (IdentifyCelebritiesResult) result;
CelebrityDetails metadata = identifyResult.getCelebrities().get(0);
Log.i("MyAmplifyApp", metadata.getCelebrity().getName());
},
error -> Log.e("MyAmplifyApp", "Identify failed", error)
);
}
```
As a result of passing in an image, `identify` will return the name of a detected celebrity.