Один из сервисов, к которому было больше всего внимания на презентации Huawei HMS Core 4.0, — это сервис машинного обучения ML Kit.

Для чего нужен сервис ML Kit? Какие проблемы он может решить при разработке?

Сегодня представляю вашему вниманию одну из самых важных функций ML Kit — распознавание лица.

Обзор функции распознавания лица



Эта функция может распознавать ориентацию лица, выражение лица (радость, отвращение, удивление, грусть и злость), признаки (пол, возраст, предметы одежды и аксессуары), а также определять, открыты глаза или закрыты. Она также может определять координаты носа, глаз, губ и бровей и даже определять группы лиц одновременно.

А главное — функция распознавания лица абсолютно бесплатна и работает на любом телефоне Android.

Разработка функции автоматической съемки при улыбке для группы людей


Я расскажу о том, как вы можете использовать возможности, описанные выше, для создания демо-версии функции автоматической съемки при улыбке. Вы можете скачать демо-версию исходного кода на github.com/HMS-Core/hms-ml-demo.

1. Подготовка


При интеграции любых средств разработки HMS Core процесс подготовки практически одинаковый. Нужно просто добавить репозиторий Maven и импортировать SDK.

1.1 Добавьте репозиторий Maven, предоставленный Huawei, в файл build.gradle на уровне проекта


Добавьте адрес репозитория Maven:

buildscript {
    repositories {        
        maven {url 'http://developer.huawei.com/repo/'}
    }    }allprojects {
    repositories {       
        maven { url 'http://developer.huawei.com/repo/'}
    }}

1.2 Добавьте зависимости SDK в файл build.gradle на уровне приложения


Импортируйте SDK функции распознавания лица и основной SDK:

dependencies{ 
  // import the basic SDK 
  implementation 'com.huawei.hms:ml-computer-vision:1.0.2.300' 
  // Import the face detection SDK
  implementation 'com.huawei.hms:ml-computer-vision-face-recognition-model:1.0.2.300'   
 }

1.3 Добавьте функцию автоматической загрузки модели в файл AndroidManifest.xml


Эта функция в основном используется для обновления модели. Модели можно загружать автоматически и обновлять на мобильном телефоне на базе оптимизированного алгоритма.

<manifest    
   <application  
       <meta-data                     
           android:name="com.huawei.hms.ml.DEPENDENCY"          
           android:value= "face"/>                 
   </application></manifest> 

1.4 Отправьте запрос на право доступа к камере и памяти в файле AndroidManifest.xml


<!--Camera permission--><uses-permission android:name="android.permission.CAMERA" /><!--Storage permission--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2. Разработка кода


2.1 Создайте анализатор лица для съемки фото при обнаружении улыбки


Во-первых, чтобы настроить съемку фото при обнаружении улыбки, выполните следующие действия:

(1) Настройте параметры анализатора.
(2) Передайте параметры анализатору.
(3) Переопределите transactResult в analyzer.setTransacto для обработки контента, возвращенного при распознавании лица. В частности, возвращается значение доверительной вероятности (что на лице есть улыбка). Когда значение доверительной вероятности достигает установленного порогового значения, камера автоматически делает фото.

private MLFaceAnalyzer analyzer;private void createFaceAnalyzer() {
    MLFaceAnalyzerSetting setting =
            new MLFaceAnalyzerSetting.Factory()
                    .setFeatureType(MLFaceAnalyzerSetting.TYPE_FEATURES)
                    .setKeyPointType(MLFaceAnalyzerSetting.TYPE_UNSUPPORT_KEYPOINTS)
                    .setMinFaceProportion(0.1f)
                    .setTracingAllowed(true)
                    .create();                 
    this.analyzer = MLAnalyzerFactory.getInstance().getFaceAnalyzer(setting);
    this.analyzer.setTransactor(new MLAnalyzer.MLTransactor<MLFace>() {
        @Override        public void destroy() {
        }

        @Override        public void transactResult(MLAnalyzer.Result<MLFace> result) {
            SparseArray<MLFace> faceSparseArray = result.getAnalyseList();
            int flag = 0;
            for (int i = 0; i < faceSparseArray.size(); i++) {
                MLFaceEmotion emotion = faceSparseArray.valueAt(i).getEmotions();
                if (emotion.getSmilingProbability() > smilingPossibility) {
                    flag++;
                }
            }
            if (flag > faceSparseArray.size() * smilingRate && safeToTakePicture) {
                safeToTakePicture = false;
                mHandler.sendEmptyMessage(TAKE_PHOTO);
            }
        }
    });}

Во-вторых, мы хотим сохранить это фото:

private void takePhoto() {
    this.mLensEngine.photograph(null,
            new LensEngine.PhotographListener() {
                @Override                public void takenPhotograph(byte[] bytes) {
                    mHandler.sendEmptyMessage(STOP_PREVIEW);
                    Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
                    saveBitmapToDisk(bitmap);
                }
            });}

2.2 Создайте экземпляр LensEngine для захвата динамических потоков камеры и передачи потоков в анализатор


private void createLensEngine() {
    Context context = this.getApplicationContext();
    // Create LensEngine
    this.mLensEngine = new LensEngine.Creator(context, this.analyzer).setLensType(this.lensType)
            .applyDisplayDimension(640, 480)
            .applyFps(25.0f)
            .enableAutomaticFocus(true)
            .create();}

2.3 Отправьте заявку на право доступа к динамическим потокам и прикрепите код создания анализатора и LensEngine


@Overridepublic void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.activity_live_face_analyse);
    if (savedInstanceState != null) {
        this.lensType = savedInstanceState.getInt("lensType");
    }
    this.mPreview = this.findViewById(R.id.preview);
    this.createFaceAnalyzer();
    this.findViewById(R.id.facingSwitch).setOnClickListener(this);
    // Checking Camera Permissions
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
        this.createLensEngine();
    } else {
        this.requestCameraPermission();
    }}
    private void requestCameraPermission() {
    final String[] permissions = new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE};

    if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
        ActivityCompat.requestPermissions(this, permissions, LiveFaceAnalyseActivity.CAMERA_PERMISSION_CODE);
        return;
    }}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {
    if (requestCode != LiveFaceAnalyseActivity.CAMERA_PERMISSION_CODE) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        return;
    }
    if (grantResults.length != 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        this.createLensEngine();
        return;
    }}

Дальнейшие действия


Довольно просто, не правда ли? Даже если вам незнаком процесс разработки, вы все равно можете создать полезную новую функцию всего за полчаса! Теперь посмотрим, что может делать эта функция.

Делать фото одного человека при улыбке:


Делать фото нескольких человека при улыбке:


Чтобы узнать дополнительные подробности, зайдите на наш сайт: developer.huawei.com/consumer/en/doc/development/HMS-Guides/ml-introduction-4

Мы расскажем о других способах использования HUAWEI ML Kit. Следите за обновлениями!