Avez-vous déjà vu un point de repère ou un paysage à couper le souffle en feuilletant un livre ou un magazine et été frustré parce que vous ne savez pas comment il s’appelle ou où il se trouve ? Ne serait-il pas formidable s’il y avait une application qui pourrait vous dire ce que vous voyez ! Heureusement, l’apprentissage automatique rend remarquablement facile le développement d’une telle application.
Introduction à la reconnaissance des monuments
Le service de reconnaissance de point de repère vous permet d’obtenir le nom du point de repère, la longitude et la latitude du point de repère, et même une valeur de confiance de l’image d’entrée. Lorsque vous entrez une image pour la reconnaissance, une valeur de confiance sera fournie, une valeur de confiance plus élevée indiquant que le point de repère dans l’image d’entrée est plus susceptible d’être reconnu. Vous pouvez ensuite utiliser ces informations pour créer une expérience hautement personnalisée pour vos utilisateurs.
Lors de l’utilisation de la reconnaissance des points de repère, l’appareil appelle l’API sur le cloud pour la détection et le modèle d’algorithme de détection s’exécute sur le cloud. Vous devrez vous assurer que l’appareil est connecté à Internet lorsque vous utilisez ce service.
Les préparatifs
Configuration de l’environnement de développement
1. Créez une application dans AppGallery Connect.
Pour plus de détails, voir Premiers pas avec Android.
2. Activez le kit ML.
Cliquez ici pour plus de détails.
3. Téléchargez le fichier agconnect-services.json, qui est automatiquement généré après la création de l’application. Copiez-le dans le répertoire d’applications du projet Android Studio.
4. Configurez l’adresse du référentiel Maven pour le HMS Core SDK.
5. Intégrez le SDK de reconnaissance des points de repère.
Configurez le SDK dans le fichier build.gradle du répertoire de l’application.
// Import the landmark recognition SDK.
implementation 'com.huawei.hms:ml-computer-vision-cloud:2.0.5.304'
Ajoutez la configuration du plug-in AppGallery Connect selon les besoins via l’une des méthodes suivantes :
Méthode 1 : ajoutez les informations suivantes sous la déclaration dans l’en-tête du fichier :
apply plugin: 'com.android.application'
apply plugin: 'com.huawei.agconnect'
Méthode 2 : ajoutez la configuration du plugin dans le bloc plugins :
plugins {
id 'com.android.application'
id 'com.huawei.agconnect'
}
Développement de codes
1. Obtenez l’autorisation de l’appareil photo pour utiliser l’appareil photo.
(Obligatoire) Définissez l’autorisation statique.
<uses-permission android:name="android.permission.CAMERA" />
(Obligatoire) Obtenez l’autorisation de manière dynamique.
ActivityCompat.requestPermissions(
this, new String[]{Manifest.permission. CAMERA
}, 1);
2. Définissez la clé API. Ce service s’exécute sur le cloud, ce qui signifie qu’une clé API est requise pour définir les informations d’authentification cloud pour l’application. Cette étape est obligatoire et si vous ne la terminez pas, une erreur sera signalée lors de l’exécution de l’application.
// Set the API key to access the on-cloud services.
private void setApiKey() {
// Parse the agconnect-services.json file to obtain its information.
AGConnectServicesConfig config = AGConnectServicesConfig.fromContext(getApplication());
// Sets the API key.
MLApplication.getInstance().setApiKey(config.getString("client/api_key"));
}
3. Créez un analyseur de points de repère à l’aide de l’une des méthodes suivantes :
// Method 1: Use default parameter settings.
MLRemoteLandmarkAnalyzer analyzer = MLAnalyzerFactory.getInstance().getRemoteLandmarkAnalyzer();
// Method 2: Use customized parameter settings through the MLRemoteLandmarkAnalyzerSetting class.
/**
* Use custom parameter settings.
* setLargestNumOfReturns indicates the maximum number of recognition results.
* setPatternType indicates the analyzer mode.
* MLRemoteLandmarkAnalyzerSetting.STEADY_PATTERN: The value 1 indicates the stable mode.
* MLRemoteLandmarkAnalyzerSetting.NEWEST_PATTERN: The value 2 indicates the latest mode.
*/
private void initLandMarkAnalyzer() {
settings = new MLRemoteLandmarkAnalyzerSetting.Factory()
.setLargestNumOfReturns(1)
.setPatternType(MLRemoteLandmarkAnalyzerSetting.STEADY_PATTERN)
.create();
analyzer = MLAnalyzerFactory.getInstance().getRemoteLandmarkAnalyzer(settings);
}
4. Convertissez l’image collectée à partir de l’appareil photo ou de l’album en bitmap. Ceci n’est pas fourni par le SDK de reconnaissance des points de repère, vous devrez donc l’implémenter vous-même.
// Select an image.
private void selectLocalImage() {
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent, REQUEST_SELECT_IMAGE);
}
Activez le service de reconnaissance des points de repère dans le rappel.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Image selection succeeded.
if (requestCode == REQUEST_SELECT_IMAGE && resultCode == RESULT_OK) {
if (data != null) {
// Obtain the image URI through getData(). imageUri = data.getData();
// Implement the BitmapUtils class by yourself. Obtain the bitmap of the image with its URI.
bitmap = BitmapUtils.loadFromPath(this, imageUri, getMaxWidthOfImage(), getMaxHeightOfImage());
}
// Start landmark recognition.
startAnalyzerImg(bitmap);
}
}
5. Démarrez la reconnaissance des points de repère après avoir obtenu le bitmap de l’image. Comme ce service fonctionne sur le cloud, une mauvaise connexion réseau peut ralentir la transmission des données. Par conséquent, il est recommandé d’ajouter un masque au bitmap avant la reconnaissance des points de repère.
// Start landmark recognition.
private void startAnalyzerImg(Bitmap bitmap) {
if (imageUri == null) {
return;
}
// Add a mask.
progressBar.setVisibility(View.VISIBLE);
img_analyzer_landmark.setImageBitmap(bitmap);
// Create an MLFrame object using android.graphics.Bitmap. JPG, JPEG, PNG, and BMP images are supported. It is recommended that the image size be greater than or equal to 640 x 640 px.
MLFrame mlFrame = new MLFrame.Creator().setBitmap(bitmap).create();
Task<List<MLRemoteLandmark>> task = analyzer.asyncAnalyseFrame(mlFrame);
task.addOnSuccessListener(new OnSuccessListener<List<MLRemoteLandmark>>() {
public void onSuccess(List<MLRemoteLandmark> landmarkResults) {
progressBar.setVisibility(View.GONE);
// Called upon recognition success.
Log.d("BitMapUtils", landmarkResults.get(0).getLandmark());
}
}).addOnFailureListener(new OnFailureListener() {
public void onFailure(Exception e) {
progressBar.setVisibility(View.GONE);
// Called upon recognition failure.
// Recognition failure.
try {
MLException mlException = (MLException) e;
// Obtain the result code. You can process the result code and set a different prompt for users for each result code.
int errorCode = mlException.getErrCode();
// Obtain the error message. You can quickly locate the fault based on the result code.
String errorMessage = mlException.getMessage();
// Record the code and message of the error in the log.
Log.d("BitMapUtils", "errorCode: " + errorCode + "; errorMessage: " + errorMessage);
} catch (Exception error) {
// Handle the conversion error.
}
}
});
}
Tester l’application
Ce qui suit illustre le fonctionnement du service, en utilisant comme exemples la tour de la Perle de l’Orient à Shanghai et la pyramide de Menkaure :
Plus d’information
1. Avant d’effectuer la reconnaissance de point de repère, définissez la clé API pour définir les informations d’authentification cloud pour l’application. Sinon, une erreur sera signalée pendant l’exécution de l’application.
2. La reconnaissance des points de repère s’exécute sur le cloud, la réalisation peut donc être lente. Il est recommandé d’ajouter un masque avant d’effectuer la reconnaissance des points de repère.