Browsing Tag

ChatGPT

NCLOUD

[NCLOUD] CLOVA Face Recognition (CFR)의 유명인 얼굴 인식을 활용하여 닮은꼴 연예인 찾기

안녕하세요. MANVSCLOUD 김수현입니다.

ChatGPT 출시 이후 AI 열풍이 가속화되고 많은 사용자들이 인공지능에 대한 관심이 늘어나고 있습니다.

그러므로 오늘은 네이버 클라우드의 AI 서비스 중 하나를 가볍게 소개하는 글과 함께 재밌게 실습까지 해보는 과정을 준비했습니다.

이번 포스팅에서 준비한 네이버 클라우드 AI 서비스는 ‘CLOVA Face Recognition (CFR)‘ 이며 해당 서비스를 이용하여 나의 사진을 업로드하고 업로드 된 사진을 분석하여 닮은꼴 연예인을 찾아보는 시간이 되겠습니다.


CLOVA Face Recognition (CFR)

CLOVA Face Recognition은 비전 데이터를 이용하여 얼굴을 인식하고 관련된 다양한 정보를 제공합니다. 여기서 비전이란 Computer Vision으로 디지털 이미지와 동영상 속 인물/사물을 식별하는 기술입니다.

CLOVA Face Recognition은 크게 두 가지 기능을 제공합니다.

1) 유명인 얼굴 인식
2) 얼굴 감지

이는 네이버가 보유한 대량의 이미지 DB를 통해 유명인 얼굴 및 사진 중 어느 부분이 얼굴인지 지속적인 기계 학습을 통해 만들어진 서비스입니다.

또한 CFR은 REST API를 지원하고 있어 간단하게 사용자가 원하는 기능을 구현할 수 있도록 합니다.


A to Z

이번 A to Z 역시 VPC, Server 생성에 대한 가이드는 생략하며 Flask를 사용할 것입니다.
또한 css로 결과물을 꾸미는 과정은 주제와 관계없어 생략한 점 참고 부탁드립니다.

1. VPC, Server, Public IP 연결 및 ACG 설정
: ACG 설정은 (인바운드) 22(SSH)와 flask 웹 서버를 접속할 수 있는 포트를 추가해줍니다.
flask의 기본 포트는 5000이지만 해당 가이드에서는 10000으로 설정하였습니다.
또한 (아웃바운드) 80, 443을 추가합니다.

2. AI·NAVER API에서 [Application 등록]
Application 등록 버튼을 눌러 Application 이름과 사용할 AI Service를 선택합니다.
이번 과정에서는 CLOVA Face Recognition (CFR)만 선택하면 되며 하단에 서비스 환경 등록은 따로 설정하지 않아도 됩니다.

3. Python 개발 환경 구성
콘솔에서 할 작업은 완료되었으므로 이제 생성된 서버로 접속하여 Python 개발 환경을 구성해줄 것입니다.

cfr 계정을 만들어주고 pyenv를 이용하여 cfr 사용자의 홈디렉토리만 python 3.7.13 버전을 사용할 수 있도록 설정하겠습니다.

[root@manvscloud-cfr-server ~]# yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel git gcc openssl-devel libffi-devel wget xz-devel
[root@manvscloud-cfr-server ~]# useradd cfr
[root@manvscloud-cfr-server ~]# su - cfr
[cfr@manvscloud-cfr-server ~]$ /usr/bin/curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | /usr/bin/bash
[cfr@manvscloud-cfr-server ~]$ vi /home/cfr/.bash_profile

/home/cfr/.bash_profile 에서는 총 2가지를 추가해주어야합니다.

1) pyenv 설정 추가

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

2) AI·NAVER API의 Application 인증 키 추가

export AI_CLIENT_ID=abcdefg
export AI_CLIENT_KEY=ABCDEFGHIJKLMNOPQRSTUVWXYZ

Application 인증 키는 AI·NAVER API 콘솔에서 생성한 Application의 [인증 정보]를 클릭하여 확인할 수 있습니다.

/home/cfr/.bash_profile 에 설정 값 입력 후 아래 명령어로 즉시 적용 및 python 설치를 진행합니다.

[cfr@manvscloud-cfr-server ~]$ source /home/cfr/.bash_profile
[cfr@manvscloud-cfr-server ~]$ pyenv install 3.7.13
[cfr@manvscloud-cfr-server ~]$ pyenv local 3.7.13
[cfr@manvscloud-cfr-server ~]$ python --version
Python 3.7.13

4. 서비스 만들기 (Flask + HTML + CLOVA Face Recognition (CFR))
/home/cfr에서 tree 결과입니다. (필요에 맞게 파일, 디렉토리 생성하시면 됩니다.)
다음과 같은 구조로 간단하게 서비스를 만들어 배포해보겠습니다.

.
├── app.py
└── templates
    ├── index.html
    └── result.html

1) flask 및 requests 패키지 설치

[cfr@manvscloud-cfr-server ~]$ pip install flask requests

2) app.py
아래는 app.py 코드로 파일 업로드 및 CLOVA Face Recognition(CFR) API를 이용하였습니다.
또한 포트는 10000로 설정하였습니다.

import os
import json
import requests
from flask import Flask, render_template, request

app = Flask(__name__)


@app.route('/', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        file = request.files['file']
        if file:
            filename = file.filename
            file.save(filename)

            client_id = os.environ['AI_CLIENT_ID']
            client_secret = os.environ['AI_CLIENT_KEY']
            url = "https://naveropenapi.apigw.ntruss.com/vision/v1/celebrity"
            files = {'image': open(filename, 'rb')}
            headers = {'X-NCP-APIGW-API-KEY-ID': client_id, 'X-NCP-APIGW-API-KEY': client_secret}
            response = requests.post(url,files=files, headers=headers)
            data = json.loads(response.text)

            value = data['faces'][0]['celebrity']['value']
            confidence = data['faces'][0]['celebrity']['confidence']
            confidence = confidence * 100
            confidence = round(confidence, 2)

            return render_template('result.html', value=value, confidence=confidence)
    return render_template('index.html')

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=10000)

3) index.html
다음은 templates/index.html 입니다.
여기서는 공인IP 부분을 지우고 본인의 Public IP로 변경해주세요.
ex) http://공인IP:10000 → http://111.111.111.111:10000

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>닮은 연예인 찾기</title>
</head>
<body>
  <form action="http://공인IP:10000" method="post" enctype="multipart/form-data">
  <input type="file" name="file">
  <input type="submit" value="Upload">
</form>
</body>
</html>

4) result.html
마지막으로 templates/result.html 입니다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>닮은 연예인 찾기 결과</title>
</head>
<body>
<h3>당신의 닮은꼴 연예인은 {{ value }} 입니다.</h3>
<h3>{{ confidence }} % 확률로 일치합니다.</h3>
</body>
</html>

5. python app.py

이제 app.py를 실행 후 웹에서 http://본인IP:10000로 접속 시 다음과 같은 화면이 출력됩니다.

이제 [파일 선택]을 클릭하고 본인의 사진을 업로드한 뒤 [Upload]를 클릭하면 result.html (결과창)으로 넘어가게됩니다.


Result

네?? 손?… 흥민?

뭐… 일단 결과가 그렇습니다.

html이 단순하고 css가 없어 단순하게 결과만 알 수 있지만 간단하게 AI 서비스를 활용해볼 수 있는 시간이었습니다.

추가 기능을 덧붙이고 살짝 꾸며준다면 멋진 나만의 서비스가 하나 뚝딱 만들어지는 거죠.

또한 이미지가 /home/cfr 디렉토리에 바로 저장되는데 이 부분도 여유가 있으신 분들은
boto3를 설치하고 Object Storage에 저장되도록 해보시기 바랍니다.


Personal Comments

어렵고 딥한 AI 기술 연구와 새로운 서비스 개발은 훌륭하신 석·박사님들이 힘내주실 것이니 저는 만들어진 서비스를 어떻게 사용할 것인가 고민하고 다양한 케이스로 활용해봐야겠네요.

Recognition (CFR)을 활용한 닮은꼴 연예인 찾기를 통해 AI에 조금 더 흥미가 생기셨길 바랍니다.

긴 글 읽어주셔서 감사합니다.