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

Я пытаюсь использовать Microsoft Face API с Android Studio для создания приложения. Сейчас я просто играю с API, но у меня возникла проблема. Из типов атрибутов лица, которые должны быть доступны (см. На этой странице), единственными доступными для выбора типами атрибутов являются Age, FacialHair, Gender, HeadPose и Smile. Я действительно хочу использовать тип атрибута 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);
        }
    }
}

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

1 ответ

Решение

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

Вы должны использовать версию 1.4.1 до выхода версии 1.4.3.

Другие вопросы по тегам