Распознавание достопримечательностей с помощью машинного обучения

Kate

Administrator
Команда форума
Бывает листаешь книгу или журнал, видишь красивое место или здание, но не знаешь, где оно и как называется. Тут пригодилось бы приложение, которое распознает его по фотографии.

С помощью машинного обучения создать такое приложение довольно просто. Об этом и пойдет речь в этой статье.

О распознавании достопримечательностей​

Сервис распознавания достопримечательностей позволяет получить название достопримечательности, ее координаты (долготу и широту) и даже оценить достоверность исходного изображения. Уровень достоверности будет определен при загрузке изображения для распознавания. Чем больше достоверность, тем вероятнее, что достопримечательность на исходном изображении будет распознана. Все эти данные можно использовать, чтобы персонализировать приложение для пользователей.

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

Подготовка​

Настройка среды разработки​

1. Create an app in AppGallery Connect

907a8a0843900ca2b12dc417985d7cd7.jpg

Подробнее см. в Кратком руководстве по Android.

2.Включите ML Kit

c000edd274b0f2ea715608f2470eed66.jpg

Нажмите здесь, чтобы узнать подробнее.

3.Загрузите файл agconnect-services.json, который автоматически создается после создания приложения. Скопируйте его в папку app проекта Android Studio.

36942b9b58cf015b623681ecbac5d631.jpg
3dd2ab9a28418423c847edeb4bd61c03.png

4. Настройте адрес репозитория Maven для HMS Core SDK.

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

Тестирование приложения​

Ниже показана работа сервиса на примере башни «Восточная жемчужина» в Шанхае.

831208c24f560d371c5101988894ae4e.png

Примечания​

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

2. Распознавание достопримечательностей выполняется в облаке, поэтому обработка может занять некоторое время. Перед распознаванием достопримечательностей рекомендуется добавить маску.

 
Сверху