За допомогою машинного навчання створити такий додаток досить просто. Про це піде мова в цій статті.

Про розпізнавання орієнтирів

Сервіс розпізнавання орієнтирів дозволяє отримати назву атракціону, його координати (довготу і широту) і навіть оцінити надійність оригінального зображення. Рівень довіри буде визначатися, коли зображення буде завантажено для розпізнавання. Чим більше довіра, тим більша ймовірність того, що орієнтир на оригінальному зображенні буде визнаний. Усі ці дані можна використовувати для персоналізації додатка для користувачів.

Коли ви використовуєте функцію розпізнавання орієнтирів, пристрій викликає хмарний API, а модель алгоритму виявлення працює в хмарі. При використанні сервісу пристрій необхідно підключити до інтернету.

Підготовка

Настроювання середовища розробки

1. Створіть програму в AppGallery Connect

Для отримання додаткових відомостей див.

2.Увімкніть КОМПЛЕКТ ML

Натисніть тут, щоб дізнатися більше.

3.Завантажте файл agconnect-services.json, який автоматично створюється після створення програми. Скопіюйте його в папку програми проекту Студії Android.

4. Налаштуйте адресу репозиторію Maven для SDK ядра HMS.

5.Інтегруйте SDK розпізнавання орієнтирів.

Настройте SDK в файле build.gradle в папке app.
// Import the landmark recognition SDK.
implementation 'com.huawei.hms:ml-computer-vision-cloud:2.0.5.304'

При необходимости добавьте конфигурацию плагина AppGallery Connect одним из следующих способов.

Способ 1. Добавьте следующий код в объявление в заголовке файла:
apply plugin: 'com.android.application'
apply plugin: 'com.huawei.agconnect'

Способ 2. Добавьте конфигурацию плагина в блок плагинов.
plugins {
    id 'com.android.application'
    id 'com.huawei.agconnect'
}

Розробка коду

1.Отримайте дозвіл на використання камери.

Обов’язково налаштуйте статичну роздільну здатність.

<uses-permission android:name="android.permission.CAMERA" />

Також обов’язково отримаєте динамічну роздільну здатність.

ActivityCompat.requestPermissions(
        this, new String[]{Manifest.permission. CAMERA
}, 1);

2.Налаштуйте ключ API. Сервіс працює в хмарі, а це означає, що для налаштування даних аутентифікації в хмарі потрібен ключ API. Необхідно налаштувати ключ API, інакше під час роботи програми виникне помилка.

// 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.Створіть орієнтир аналізатор одним з наступних способів.

// 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.Перетворіть зображення, зроблене за допомогою камери або збережене на пристрої, на растрове зображення. SDK розпізнавання орієнтирів не має цієї функції, тому вам потрібно зробити це в іншій службі.

// 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);
}

Увімкніть знакову службу у функціях зворотного виклику.

@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.Запустіть розпізнавання орієнтирів після отримання растрового зображення. Оскільки служба працює в хмарі, погане з’єднання може уповільнити передачу даних. Таким чином, рекомендується додати маску до растрового зображення, перш ніж запускати розпізнавання.

// 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.
            }
        }
    });
}

Тестування програми

Нижче представлена робота сервісу на прикладі вежі «Східна перлина» в Шанхаї.

Нотатки

1. Перш ніж розпізнати орієнтир, налаштуйте ключ API для налаштування даних хмарної аутентифікації для свого додатка. В іншому випадку під час роботи застосунку виникне помилка.

2. Розпізнавання орієнтирів здійснюється в хмарі, тому обробка може зайняти деякий час. Перед розпізнаванням орієнтирів рекомендується додати маску.