Android, Retrofit2, 네이버 얼굴인식 API 만들기 2


CFR API 레퍼런스 

CFR API는 다음과 같은 API를 제공합니다.

   1. 유명인 얼굴 인식 API

   2. 얼굴 감지 API

=> 두가지 API가 있다!


1. 유명인 얼굴 인식 API 

입력받은 이미지로부터 얼굴을 감지하고 감지한 얼굴이 어떤 유명인과 닮았는지 분석하여 그 결과를 반환하는 REST API입니다. 

이미지에서 다음과 같은 정보를 분석합니다. 

 - 감지된 얼굴의 수 

 - 감지된 각 얼굴을 분석한 정보 : 닮은 유명인 이름 , 해당 유명인을 닮은 정도


2. 얼굴 감지 API 

입력받은 이미지로부터 얼굴을 감지하고 입력된 이미지에서 얼마나 많은 얼굴이 감지되었고 각 얼굴이 어디에 어떤 크기로 위치하며 어떤 모습을 하고 있는지 반환하는 REST API입니다. 이미지에서 다음과 같은 정보를 분석합니다.

 - 감지된 얼굴의 수

 - 감지된 각 얼굴을 분석한 정보 : 감지된 각 얼굴의 좌표 및 크기, 눈, 코, 입의 좌표, 추정 성별 및 추정치, 추정 나이 및 추정치, 감정, 얼굴의 방향



이 두가지 API를 사용해보도록 하겠습니다.




1. Retrofit2 를 사용하기 위해 build.gradle (Module: app) 에 라이브러리 추가


1
2
3
4
5
6
7
dependencies {
    ...
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta3'
    ...
}
 
cs


2. 인터페이스 만들기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public interface NaverApiInterface {
 
    @Multipart
    @POST("/v1/vision/celebrity")
    Call<NaverRepo> naverRepo(@Header("X-Naver-Client-Id"String id
                              ,@Header("X-Naver-Client-Secret"String secret
                              ,@Part MultipartBody.Part file);
 
    @Multipart
    @POST("/v1/vision/face")
    Call<NaverRepo> naverRepo2(@Header("X-Naver-Client-Id"String id
                              ,@Header("X-Naver-Client-Secret"String secret
                              ,@Part MultipartBody.Part file);
}
 
cs

NaverApiIntereface를 만들었습니다. 

지난 글에서

=> HTTP 요청, Client ID와 Client Secret 정보를 헤더에 포함시켜야한다.

=> multipart형식으로 보내고 이름은 image

라고 하였습니다.

naverRepo는 유명인 얼굴 인식 API    @POST("/v1/vision/celebrity")

naverRepo2는 얼굴 감지 API용 인터페이스 입니다.   @POST("/v1/vision/face")


3. Model class 만들기


네이버 API가이드를 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// 닮은 유명인을 찾은 경우
{
 "info": {
   "size": {
     "width"900,
     "height"675
   },
   "faceCount"2
 },
 "faces": [{
   "celebrity": {
     "value""안도하루카",
     "confidence"0.266675
   }
 }, {
   "celebrity": {
     "value""서효림",
     "confidence"0.304959
   }
 }]
}
 
// 닮은 유명인을 찾지 못한 경우
{
    "info": {
        "size": {
            "width"768,
            "height"1280
        },
        "faceCount"0
    },
    "faces": []
}
cs


이를 사용할 수 있는 모델 클레스를 만듭니다. (Info, Faces 클래스는 접어두었습니다.)

1
2
3
4
5
6
7
8
9
10
11
12
public class NaverRepo {
    Info info;
    Faces[] faces;
 
    public Info getInfo() {
        return info;
    }
 
    public Faces[] getFaces() {
        return faces;
    }
}
cs



4. Retrofit 객체 생성, 인터페이스 서비스 생성, 호출

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
String clientId = "클라이언트키";
String clientSecret = "클라이언트시크릿";
 
Retrofit client = new Retrofit.Builder()
                              .baseUrl("https://openapi.naver.com")
                              .addConverterFactory(GsonConverterFactory.create())
                              .build();
 
NaverApiInterface service = client.create(NaverApiInterface.class);
 
RequestBody reBody = RequestBody.create(MediaType.parse("image/jpeg"), file);
 
MultipartBody.Part body = MultipartBody.Part.createFormData("image", file.getName(), reBody);
 
Call<NaverRepo> call = service.naverRepo(clientId,clientSecret,body);
cs



5. API CALL 

유명인 얼굴인식 API , 얼굴 감지 API 가 같은 데이터클레스를 사용하기에 Annotation만 다른 naverRepo, naverRepo2 인터페이스를 호출하여 사용합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//유명인 얼굴 인식 API CALL
Call<NaverRepo> call = service.naverRepo(clientId,clientSecret,body);
call.enqueue(new Callback<NaverRepo>() {
      @Override
      public void onResponse(Call<NaverRepo> call, Response<NaverRepo> response) {
          if (response.isSuccessful()) {
              ...
             } else {
              ...
             }
          }
          @Override
          public void onFailure(Call<NaverRepo> call, Throwable t) {
              ...
          }
});
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//얼굴 감지 API CALL
Call<NaverRepo> call2 = service.naverRepo2(clientId,clientSecret,body);
call2.enqueue(new Callback<NaverRepo>() {
      @Override
      public void onResponse(Call<NaverRepo> call, Response<NaverRepo> response) {
          if (response.isSuccessful()) {
              ...
          } else {
              ...
          }
      }
      @Override
      public void onFailure(Call<NaverRepo> call, Throwable t) {
          ...
      }
});
cs



이상으로 안드로이드 레트로핏 사용을 간단하게 정리해보았습니다.


감사합니다.


+ Recent posts