#0 face_clustering 프로젝트 - 시작, 환경 구성

한치·2020년 2월 29일
0

face_clustering

목록 보기
1/3
post-thumbnail

계기

오랜만에 코로나로 인해서 밖에 활동을 못하고 있습니다. 한동안 춤에만 몰두하느라 (그게 근 4년 여러분 춤이 이렇게 무섭습니다) 그래서 잊혀졌던 것들 중에 해보고 싶었던 것들을 대충 둘러보다가 face_clustering관련된 글을 어쩌다가보게되었고, 예전부터 느끼고있던 momentsgoogle photo에 만족하지 못하고 있던 사진 clustering을 개인 컴퓨터에서 1차적으로 할 수 있도록 하는것을 목표로 간단한 프로젝트를 진행해보겠다고 생각을 하게되었습니다.

기능 목표

일차적으로는 face_recognition부터 시작해서 사진 또는 영상을 분류하고 처리하는 라이브러리들을 사용해봅니다. 그것을 기반으로 사진을 분류하는 내부 웹서버를 올려서 분류하고 정리하는 웹페이지정도를 만드는게 목표, 기존에 아쉬웠던 점은 아래와 같습니다.

  1. 1차로 사진과 영상을 분석기가 분류합니다.
  2. 클러스터 단위로 분석된 사진들을 1차적으로 네이밍합니다.
  3. 1차로 검증된 사진들을 사람이 2차로 검증할 수 있는 과정을 추가하면 좋겠습니다.(1차 분류된 사진들을 사람이 검증할 수 있는 기능.)
    2.1 2차로 검증하는 과정에서도 분류된 리스트에서 가장 가까운 distance(맞는 표현인지 모르겠다만..)를 가진 클러스터들을 순차적으로 보여주면 좋겠습니다.(코스트 크겠지요..?)

일단 대충 이렇게 적어놓고 진행하는데, 결국, 내가 바라는 건 1차적으로 분석해주되 맞고 틀리고, 또는 사람이 맞고 아니고를 사람이 더 검증할 수 있는 레이어가 하나 추가되었으면 하는 것입니다.(google photomoments 둘 다 그런 기능을 제공하긴하나 너무 불편합니다.)

구성 목표

웹 관련 모든 작업은 집 개인 컴퓨터로 작업하고, 이미지나 영상은 로컬 네트워크 드라이버에 붙어있는 시놀로지를 통해서 획득하는 것으로 합니다.
데이터는 다 시놀로지에 있고, 인덱싱 관련 정보만 컴퓨터가 들고있으면 지금 용량으로도 커버 할 수 있지않을까!

우분투 설치

딱히 작업할 환경이 마땅치 않아서, 로컬 컴퓨터에서 virtualbox위에 ubuntu를 설치하기로 했습니다. windows는 dlib 설치 관련 이슈가 있던데, 회사에서 리눅스를 써서 그런지 뭔가 작업은 linux인 느낌이라 따로 컴퓨터에서 다이렉트로 작업은 시도하지 않았습니다.

vitualbox에 ubuntu 18.04 LTS 버전을 다운로드해서 설치하고, openssh 서버를 올려준다음에 putty-xming을 이용해서 접속해서 작업할 예정입니다.

원격 작업 환경 설정

개인적으로 virtualbox 위에서 작업하는건 반응이 너무 시원치않아서 좋아하지 않습니다.(컴퓨터 성능이 시원치않은게 이렇게..) 그래서 openssh server 세팅을 하고 원격에서 작업해주도록 하겠습니다.

openssh server 설치

아래의 명령으로 우분투에 openssh server를 설치하고 서비스를 실행합니다.

sudo apt-get update
sudo apt-get install openssh-server
sudo service ssh start

putty, xming 설정

putty와 xming은 구글에서 검색해서 알아서 설치하는 것으로 하겠습니다. xming을 설치하면 기본적으로 127.0.0.1:0.0로 실행됩니다. putty에서 해당 주소로 X11 forwarding을 설정해주시면 되겠습니다.
putty에서의 설정은 왼쪽 카테코리에서 Connection > SSH > X11 > X11forwarding 탭에서 설정해줍니다.
Enable X11 forwarding 체크 박스를 체크해주고, X dispaly location 값에 127.0.0.1:0.0 값을 입력하면 설정이 완료됩니다.

virtualbox forwarding

ssh로 virtualbox 내의 ubuntu에 접속하려면 포워딩 작업이 필요합니다. 윈도우에서 ipconfig로 virtualbox의 ip addr를 획득해줍니다. 제 컴퓨터에서는 192.168.56.1로 되어있네요.

그 다음으로는 ubuntu에서 ifconfig로 내부의 ip addr를 획득합니다. 제 우분투에서는 net-tools를 설치해주어야 ifconfig를 수행가능하네요. 아래의 명령어로 ifconfig 설치 후 명령어를 수행해줍니다. ubuntu의 주소는 10.0.2.15로 되어있습니다.

sudo apt install net-tools

위 값들을 이용해서 virtualbox에서 ubuntu의 네트워크 메뉴에 들어갑니다. 설정 > 네트워크 > 고급 > 포트 포워딩 메뉴로 들어가서 위의 값들을 포워딩 메뉴에 추가해줍니다.

putty를 통해서 192.168.56.1(virtualbox ip addr)로 접속을 시도하면 정상적으로 접속되는 것을 확인할 수 있습니다.

환경 구성

막상 C외의 작업은 살짝살짝 맛만 본 수준이라 고통을 예상하면서 이 파트에 진입합니다.

zsh 설치

zsh 쓰는게 편해서 설치합니다.

sudo apt install zsh
sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

git 설치

face_clustering을 위한 repository는 github에 만들어두었으므로, clone하려고 했으나 git도 깔려있지 않네요. 깔아줍니다.

sudo apt install git
git clone https://github.com/lindychi/face-clustering.git

python 설치

face_clustering에서 사진 처리 관련 모든 영역을 작성할 python3가 설치되어있지만 경로가 지정되지 않았으므로, 아래의 명령어로 python가 python3를 실행하도록 합니다. pip은 설치가 실제로 안되있어서 python3-pip을 설치해줍니다. 환경 관리를 위해서는 poetry를 사용해볼 생각이라서 설치해줍니다.

sudo update-alternatives --install /usr/bin/python python /usr/bin/python3
sudo apt-get install python3-pip
sudo pip install --upgrade pip
sudo pip install poetry
sudo apt-get install python3-venv

poetry 설치간 에러 리스트

keyring.alt error
Error initializing plugin EntryPoint(name='Windows (alt)', value='keyrings.alt.Windows', group='keyring.backends').

sudo pip install --upgrade keyrings.alt

pexpect error
ERROR: Cannot uninstall 'pexpect'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

sudo pip uninstall pexpect # 실패
sudo pip3 install --ignore-installed poetry # 해결을 포기하고 무시하고 설치

poetry 구성

cd ${WORK_SPACE}
poetry init
poetry shell

face_recognition 설치

poetry shell 이후에는 설치를 poetry add 명령어를 통해서 하게된다. face_recognition 설치에 필요한 것들도 미리 함께 설치한다.

sudo apt install cmake (저장소에서 받아서 init할 경우에는 cmake가 처음부터 필요하다. 주의)
poetry add face_recognition

우분투로 전환

여기까지가 윈도우에서 작성한 내용이었고, virtualbox에서 작업하다가 dlib를 설치하다가 멈추어버린 관계로 개인 컴퓨터를 ubuntu로 새로 설치하고 진행하도록 한다.

emacs 세팅

emacs 세팅은 페이지를 따로 빼서 정리하기로 하고 이번 글에서는 패스하도록 합니다.

face_recognition

face_detection binary

와우.. c랑만 투닥투닥한 세월을 가진 저로서는 이런 라이브러리가 잘 지원된다는게 몹시 놀랍다고 느끼는 편입니다. 다들 익숙하실지 모르겠지만 저는 꽤나 신기하네요. face_detectionface_recognition 바이너리도 기본적으로 제공되네요. face_detection을 당장 써야하므로 사용해봅니다. 바이너리를 실행하는 폴더에 사진 세장을 다져두고 현재 위치를 넣어봅니다.

face_detection ./      
./IMG_5133.JPG,342,641,446,538
./IMG_5132.JPG,309,405,381,333
./IMG_5131.JPG,277,413,349,341

속도가 엄청 빠르진 않으나, 직접 일일이 하나씩 열어서 확인하는것보다는 너어어무 빠른 속도입니다. 아주 좋습니다.

face_detect sample code

당장, 저 기능을 사용하고 싶으니 샘플 코드를 가져다가 수행해봅니다. 일단은 파일 하나를 직접지정해서 사진을 불러와서 얼굴 위치를 확인하는 코드를 수행해봅니다.

face_recog.py

import face_recognition

image = face_recognition.load_image_file("IMG_5133.JPG")
face_locations = face_recognition.face_locations(image)
print(face_locations)

바로 수행해봅니다.

face_recog.py 수행 결과

python face_recog.py  
[(343, 641, 450, 533)]

아주 잘 동작합니다. ukayzm - face_clustering의 코드를 참고하여 cv2를 이용해 얼굴이 인식된 부위에 네모난 상자를 추가해 출력해봅니다.

face_recog.py 화면 출력 변경

코드를 살짝 수정해서 cv2를 이용해서 얼굴이 인식된 부위에 네모를 그리고 창으로 띄워보았습니다. imshow 대신에 imwrite를 사용하면 파일로 떨어집니다. flask를 통해서 보여줄 예정이라서 아마 file로 떨구거나 이미지 위에 바로 그려서 출력해줄 것 같네요. 아래 코드를 수행하면 원본 사진이 출력되고, 키를 입력하면 얼굴에 사각형이 쳐진 사진이 출력됩니다.
아, cv2의 설치는 poetry install opencv-python를 통해서 했습니다.

import face_recognition
import cv2

image = face_recognition.load_image_file("IMG_5133.JPG") # image load

cv2.imshow('origin', image[:, :, ::-1]) # rgb fix print
cv2.waitKey(0)
cv2.destroyAllWindows()

face_locations = face_recognition.face_locations(image)
print(face_locations)
(top, right, bottom, left) = face_locations[0]
cv2.rectangle(image, (left, top), (right, bottom), (0, 0, 255), 2) # paint rectangle

cv2.imshow('IMG_5133.JPG.LOCA', image[:, :, ::-1]) # rgb fix print
cv2.waitKey(0)
cv2.destroyAllWindows()

대충 ubuntu 설정과 face_recognition이 쉽고 유용한 도구라는 것까지 확인했네요. 이후에는 flask에서 파일을 어떤식으로 다루어서 보고, 처리할 것인지에 대한 내용을 진행하도록 하겠습니다.

profile
안녕하세요

0개의 댓글