Trong bộ Cognitive Services của Microsoft, hiện tại ở thời điểm lúc này, gồm những nhóm công cụ sau đây:

Vision

  • Computer Vision API
  • Content Moderator
  • Emotion API (Preview)
  • Face API
  • Video API (Preview)

Speech

  • Bing Speech API
  • Custom Speech Service (Preview)
  • Speaker Recognition API (Preview)

Language

  • Bing Spell Check API
  • Language Understanding Intelligent Service (Preview)
  • Linguistic Analysis API (Preview)
  • Text Analytics API (Preview)
  • Translator API
  • Web Language Model API (Preview)

Knowledge

  • Academic Knowledge API
  • Entity Linking Intelligence Service (Preview)
  • Knowledge Exploration Service (Preview)
  • QnA Maker (Preview)
  • Recommendations API (Preview)

Search

  • Bing Autosuggest API
  • Bing Image Search API
  • Bing News Search API
  • Bing Video Search API
  • Bing Web Search API

Hôm nay, ta thử dùng một API trong nhóm Vision là Face API để thử kiểm nghiệm xem nó có nhận diện được chính xác khuôn mặt người trong một bức ảnh bất kỳ hay không.

Đầu tiên mở Android Studio lên, tạo một project mới và nhớ chỉnh độ phù hợp là từ 5.1 trở lên.

Tiếp đó, trong Gradle Scripts, bạn vào build.gradle (Project: tên_project) và gõ thêm vào đó dòng code:

mavenCentral()

Sau khi gõ xong thì ta sẽ được file đó như vầy:

//Nội dung file build.gradle (Project: tên_project)
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
        mavenCentral()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
//Nội dung file build.gradle (Module: app)
apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.example.myapplication"
        minSdkVersion 19
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
    compile 'com.microsoft.projectoxford:face:1.0.0'
}

Bước kế tiếp, vào app -> res -> values -> strings.xml và thêm vào đó một dòng mới:

<string name="face_api">code_api_mà_bạn_đăng_ký</string>

Cái code này bạn lấy trên trang web của Microsoft, chỉ cần đăng nhập, nhấn subscribe và chọn đúng code của Face API là được.

Toàn bộ nội dung strings.xml như sau:

<resources>
    <string name="app_name">My Application</string>
    <string name="face_api">bd0ef</string>
</resources>

Tiếp tục, vào app -> res -> layout -> activity_main.xml và dán code này vào: Chỗ này nhớ vào thẻ Text ở góc dưới màn hình nhé. Giao diện app thiết lập ở đây, bạn muốn thì có thể tuỳ chỉnh lại theo ý mình. Nhưng lần đầu tiên làm, nên làm theo y chang cho hiểu đã.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.myapplication.MainActivity">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="400dp" />

    <Button
        android:id="@+id/btnProcess"
        android:text="GO"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

Bước quan trọng không kém, bạn tìm hình và copy nó, nhấp chuột phải vào thư mục drawable trong đường dẫn app -> res -> drawable và chọn Paste (hoặc nhấp chọn và nhấn Ctrl + V).

Tiếp theo, vào app -> manifests và mở AndroidManifest.xml ra. Thêm vào dòng code này:

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

Code đầy đủ của nó sẽ là:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication">
    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Cuối cùng, vào app -> java -> thư mục đầu tiên -> mở file MainAcitivity trong đó ra và dán vào code này:

package com.example.myapplication;

import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.view.CollapsibleActionView;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import com.microsoft.projectoxford.face.FaceServiceClient;
import com.microsoft.projectoxford.face.FaceServiceRestClient;
import com.microsoft.projectoxford.face.contract.Face;
import com.microsoft.projectoxford.face.contract.FaceRectangle;
import com.microsoft.projectoxford.face.rest.ClientException;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;

public class MainActivity extends AppCompatActivity {

    private FaceServiceClient faceServiceClient = new FaceServiceRestClient("bd0ef3f87f2b419da6eddd4597d5013d");
    ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final Bitmap myBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.tên_file_hình_ảnh);
        imageView = (ImageView)findViewById(R.id.imageView);
        imageView.setImageBitmap(myBitmap);
        Button btnProcess = (Button)findViewById(R.id.btnProcess);
        btnProcess.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                detectAndFrame(myBitmap);
            }
        });
    }
    private void detectAndFrame(final Bitmap myBitmap){
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        myBitmap.compress(Bitmap.CompressFormat.JPEG,100,outputStream);
        ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());

        AsyncTask<InputStream, String ,Face[]> detectTask = new AsyncTask<InputStream, String, Face[]>() {

            private ProgressDialog progress = new ProgressDialog(MainActivity.this);

            @Override
            protected void onPostExecute(Face[] faces){
                progress.dismiss();
                if(faces == null) return;
                imageView.setImageBitmap(drawFaceRectangleOnBitmap(myBitmap,faces));
            }

            @Override
            protected void onPreExecute(){
                super.onPreExecute();
                progress.show();
            }

            @Override
            protected void onProgressUpdate(String... values){
                super.onProgressUpdate(values);
                progress.setMessage(values[0]);
            }

            @Override
            protected Face[] doInBackground(InputStream... params) {
                publishProgress("Detecting...");
                try {
                    Face[] result = faceServiceClient.detect(params[0],true,false,null);
                    if(result == null)
                    {
                        publishProgress("Detection finished. Nothing detected!");
                        return null;
                    }
                    publishProgress(String.format("Detection Finished. %d face(s) detected",result.length));
                    return result;
                } catch (Exception e) {
                    publishProgress("Detection failed.");
                    return null;
                }

            }
        };
        detectTask.execute(inputStream);
    }

    private Bitmap drawFaceRectangleOnBitmap(Bitmap myBitmap, Face[] faces) {
        Bitmap bitmap = myBitmap.copy(Bitmap.Config.ARGB_8888,true);
        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(Color.WHITE);
        int strokeWidth=12;
        paint.setStrokeWidth(strokeWidth);
        if(faces != null)
        {
            for(Face face:faces)
            {
                FaceRectangle faceRectangle = face.faceRectangle;
                canvas.drawRect(faceRectangle.left,
                        faceRectangle.top,
                        faceRectangle.left+faceRectangle.width,
                        faceRectangle.top + faceRectangle.height,
                        paint);
            }
        }
        return bitmap;
    }
}

Lưu ý quan trọng: Trong đoạn code cuối cùng này tôi có tô đỏ một chỗ. Đó là tên của bức hình mà bạn bỏ vào trong drawable thực hiện ở bước khi nãy. Nếu không sửa nó thành tên của bức hình mà bạn muốn kiểm tra nhận diện mặt, thì khả năng chạy được là rất thấp.

Hoàn tất quá trình thiết lập mọi thứ. Thử nhấn Shift + F10 và chạy thử xem. Khuyến cáo bạn kích hoạt tính năng Developer trên điện thoại của mình, tick vào USB Debugging và chạy thử nghiệm trực tiếp app trên điện thoại (cắm dây nối điện thoại với máy tính vào là được). Và quan trọng không kém, nhớ bật mạng Internet cho điện thoại! Tôi quên bật mạng cho điện thoại và cứ tự hỏi sao test trên máy ảo thì thành công, còn trên điện thoại thì nó không đánh dấu được vùng khuôn mặt! Hahah….

Kết quả sau cùng:

face.PNG
Hình tỷ lệ người hơi nhỏ nên nó vẽ viền nhận dạng hơi đậm

Nếu có thắc mắc gì, bạn cứ email cho tôi. Cám ơn!

VÕ TÌNH THƯƠNG

votinhthuong9@gmail.com

Advertisements