Один из сервисов, к которому было больше всего внимания на презентации 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;
    }}

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


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

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



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



Как еще можно использовать возможность распознавания лица? Вот несколько вариантов:
1. Украсить черты лица.
2. Создать интересные эффекты с помощью преувеличения или изменения контуров и черт лица.
3. Создать функцию определения возраста, которая предотвратит доступ детей к неподходящему контенту.
4. Разработать функцию защиты глаз с помощью определения количества времени, которое пользователь смотрит на экран.
5. Определять, живой ли человек перед камерой с помощью случайных команд (например, потрясти головой, мигнуть, открыть рот).
6. Рекомендовать продукты пользователям в соответствии с их возрастом и полом.

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

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