Отсутствующие типы атрибутов в Microsoft Face API (с Android). Как я могу использовать атрибут эмоции?

Я пытаюсь использовать Microsoft Face API с Android Studio для создания приложения. На данный момент я просто играю с API, но у меня проблема. Типов атрибутов лица, которые должны быть доступны (см. на этой странице), единственные типы атрибутов, которые я могу выбрать, - это возраст, лицевые волосы, пол, поза головы и улыбка. Я действительно хочу использовать тип атрибута Emotion, но он не распознается.

Я получаю ошибку: Cannot resolve symbol 'Emotion'

Вот соответствующий раздел кода:

Face[] result = faceServiceClient.detect(inputStreams[0], true, true, new FaceServiceClient.FaceAttributeType[]{FaceServiceClient.FaceAttributeType.Emotion});

а вот весь код в моей MainActivity:

package me.ianterry.face;

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.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import com.microsoft.projectoxford.face.*;
import com.microsoft.projectoxford.face.contract.*;

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

public class MainActivity extends AppCompatActivity {
    private FaceServiceClient faceServiceClient =
            new FaceServiceRestClient("https://westcentralus.api.cognitive.microsoft.com/face/v1.0", "MY KEY");

    private ImageView mImageView;
    private Button mProcessButton;
    private ProgressDialog progress;
    public final String TAG = "attributeMethod";

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

        final Bitmap myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test_image);
        mImageView = findViewById(R.id.image);
        mImageView.setImageBitmap(myBitmap);

        mProcessButton = findViewById(R.id.btn_process);
        mProcessButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                detectAndFrame(myBitmap);
            }
        });
        progress = new ProgressDialog(this);
    }


    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;
                }
                mImageView.setImageBitmap(drawFaceRectangleOnBitmap(myBitmap, faces));
                attributeMethod(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... inputStreams) {
                //return new Face[0];
                try {

                    publishProgress("Detecting...");
                    Face[] result = faceServiceClient.detect(inputStreams[0], true, true, new FaceServiceClient.FaceAttributeType[]{FaceServiceClient.FaceAttributeType.Emotion});
                    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 static 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 = 8;
        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;
    }

    private void attributeMethod(Face[] faces) {
        for (Face face : faces) {
            FaceAttribute attribute = face.faceAttributes;
            Log.d(TAG, "age: " + attribute.age);
            Log.d(TAG, "gender: " + attribute.gender);
        }
    }
}

Этот код более или менее взят прямо из этого руководства.


person I4N_T    schedule 17.04.2018    source источник


Ответы (1)


Поддержка Emotion была добавлена ​​в SDK версии 1.2.5. Источник

Вам следует использовать версию 1.4.1, пока не будет выпущена версия 1.4.3.

person Maria Ines Parnisari    schedule 17.04.2018
comment
1.4.3 еще не был опубликован в Maven, но он исправляет серьезную ошибку в 1.4.2. Я бы порекомендовал вам пока использовать 1.4.1. - person cthrash; 18.04.2018