상세 컨텐츠

본문 제목

미니 스튜디오 어플 (프로젝트)

컴퓨터

by 잘못된 선택 2021. 9. 28. 11:37

본문

졸업 작품 프로젝트로 딥러닝 기술을 이용하여 증명사진을 찍는 어플을 만들었습니다.

여권사진 비용이 비싸 부담스러운 사람들에게 무료로 여권사진을 찍을 수 있도록 하는 것이 취지였습니다.

 

어플명은 미니 스튜디오이고 아래 설명과 같이 사진을 찍을때 자세를 교정해주고 찍은 사진의 배경을 제거해주는 어플입니다. 사진이기 때문에 약간의 보정 기능도 추가해 주었습니다.

 

 개발 범위

구분 기능 범위
배경 자동 제거 기능 사진에서 배경을 자동으로 인식, 제거하여 편리성을 제공 
자세 교정 기능 사진의 피사체를 추적, 요구하는 자세와 대조하여 올바른 자세를 유도
증명사진 편집 기능 증명 사진의 전반적인 화질을 보정해주는 기능을 제공
부가기능
사진 편집 기능 갤러리 이미지의 전반적인 편집 기능을 제공
일반 카메라 기능 사용자가 평소에도 어플리케이션을 사용할 수 있도록 일반 카메라 제공

자동 배경 제거 기능

 

       DeepLab v3+를 사용하여 이미지의 Human Mask 를 생성하고 이미지로부터 Cropped 하여 배경을 제거한다.

       사람이 나온 이미지와 라벨된 이미지를 사용하여 모델을 학습한 후 DeepLab v3+ Lite 에 적용하여 배경 제거의 퀄리티를 증진시킨다.

 

자세 교정 기능

 

       MLKIT API을 사용하여 사용자의 얼굴 기울기와 각도를 계산한 후 자세 교정을 돕는다.

       Fritzs API을 사용하여 사용자의 Body Skeleton을 생성한 후 각 특징점을 사용하여 어깨의 기울기를 계산한 후 자세 교정을 도와준다.

 

증명사진 편집 기능

 

       자동 배경 제거를 통해 얻은 이미지의 사진의 대비, 선명도, 명암, 잘라내기 등 기본적인 편집이 가능하도록 한다.

 

 

부가 기능

 

 

사진 편집 기능

 

       갤러리 내 사진의 대비, 선명도, 명암, 잘라내기 등 기본적인 사진의 편집을 가능하도록 한다.

 

일반 카메라 기능

 

       증명사진 카메라가 아닌 일반 카메라로 작동 가능하도록 한다.

 

 개발 고려사항/제약사항

 

       개발 환경의 제한 요소는?

 

       다양한 성능의 기기를 가지고 있지 않기 때문에 다양한 사양의 기기에서의 테스팅이 힘들다.

       딥러닝이 안드로이드에서 구현하기 어려울 경우 서버 컴퓨터를 이용해야 하는데 그럴 경우 비용이 많이 든다.

       모든 팀원의 개발 환경이 좋은 것은 아니여서 딥 러닝으로 모델을 학습할 때 시간이 오래 걸리거나 제한이 걸릴 수 있다.

 

       기술적/기간적 어려움은?

 

       딥러닝 기술  적용 시 휴대 기기의 성능에 영향을 받을 수 있다.

       안드로이드에서 딥러닝 기술의 적용이 어려울 수 있다.

       구현의 난이도가 높은 만큼 짧은 기간에 만들기 어려울 수 있다.

       자세 교정할 경우 표정과 턱의 각도 등을 자동으로 파악하는 기술이 어려울 수 있다.

       배경을 구분하여 잘라내는 작업에서 윤곽이 얼마나 깔끔하게 잘라낼 수 있는지는 얼마나 적합한 기술을 적용시키는 가에 따라 달라질 것이다.

 

 

컴포넌트

MINISTUDIO는 다음과 같은 컴포넌트를 가지며 각 컴포넌트의 주요 기능은 아래 표와 같다.

 

메인 컴포넌트 기능
메인 컴포넌트
(MainActivity)
카메라가 화면을 출력해주고 기본적인 객체 생성과 사진을 찍을 수 있도록 기본적인 버튼 등을 제공한다.
DeepLab v3+ 컴포넌트
(DeepLabLite)
Deeplab V3+ 을 이용해 학습한 모델로 이미지에 대해 배경 제거를 수행한다.
어깨 교정 컴포넌트
(PoseEstimate)
어깨의 뼈대를 특정하여 양 어깨의 높이를 비교하여 기울기를 바로잡아준다.
얼굴 교정 컴포넌트
(FaceDetection)
얼굴 윤곽선과 특징에 매핑되는 133개의 점으로 고개의 각도와 기울기를 바로잡아준다.
사진 편집 컴포넌트
(EditActiivty)
이미지의 Crop, Brightness, Saturation, Contrast, Sharpness와 같은 편집을 할 수 있는 기능들을 제공한다.

 

 

 

시스템간의 구조

         MainActivity Camera2 객체를 생성하여 PoseEstimate FaceDetection에 연결한다.

 

         FaceDetectiion의 경우 Camera2 객체로부터 실시간으로 이미지를 받아 OpenCV를 사용하여 눈, , 입 특징점의 위치를 추출한 후, 추출된 위치의 값을 계산하여 머리의 기울기 방향 등을 얻는다.

 

         PoseEstimate의 경우 Camera2 객체로부터 실시간으로 이미지를 받아 Fritzs를 사용하여 사용자의 어깨에 대한 특징점 위치를 추출한 후, 추출된 값을 계산하여 어깨의 기울기 방향 등을 얻는다.

 

         MainActivity는 앞서 FaceDetection PoseEstimate에서 계산된 값을 가지고 카메라 화면을 출력하는 매 순간마다 사용자에게 자세 교정 알림을 출력한다.

 

         카메라 촬영 버튼이 클릭될 경우 카메라 사진이 Deeplab V3+ Lite로 전달되며 Deeplab v3+ Lite는 해당 이미지의 배경을 제거하여 EditActivity로 전달한다.

 

         EditActivity는 증명사진 비율로 사진을 자를 수 있도록 해주며 사용자가 원하는 여러 편집을 거친 후에 사진을 저장한다.

 

 

개선 방향

카메라

 

    카메라 출력 화면에도 바로 필터가 적용되게 하여 약간의 피부 보정 효과를 실시간으로 적용한다.

 

    원본 이미지에 그래픽 이미지를 합성하여 보여주는 기능, 소품(선글라스, 모자  ) AR로 입혀서 사진을 찍을 수 있도록 개선한다.

    다양한 배경을 적용할 수 있게 개선한다.(검은색, 무늬 배경 등등)

 

배경 제거

 

    딥러닝의 매개변수 조작, 모델 구조 개선 및 데이터 개선을 통해 성능을 향상 시킨다.

 

    다양한 영상기법을 이용하여 배경이 제거된 이미지 경계를  부드럽게 처리하여 배경이 제거되는 이미지의 Aliasing 현상을 줄인다.

 

    비교적 작게 촬영된 인물도 인식하여 피사체의 크기에 상관없이 배경제거가 가능하게 한다.

 

    여러 사람이 찍히는 경우에도 찍히는 모든 사람에 대해 자연스러운 배경제거가 가능하게 한다.

 

    성능 향상을 위해서는 직접 학습시키기 보다는 이미 완성도 높게 만들어진 api를 가져다 사용하는 방안도 고려된다.

 

 

자세 교정

 

    턱을 당기는 각도도 계산해주도록 개선한다.

 

    얼굴 뿐만아니라 몸통의 좌우 회전도 계산해주도록 개선한다.

 

 

사진 편집

 

    기본적인 명암, 대비, 선명도 등의 기능 뿐만 아니라 이미지에 필터를 적용할 수 있도록 개선한다.

 

    이미지의 테두리를 선택할 수 있게 하여 증명사진에 더욱 가까울 수 있도록 개선 한다.

 

    배경이 제거된 영상을 활용해서 배경을 합성하는 기능을 추가한다.

 

 

 

 

프로젝트 수행 후기

메인 부분

 

    Camera2 API가 여러 개의 카메라를 달고 나오는 요즘 기기에 맞춰 Default로 뼈대만 주어지는 API 이므로 기존 Camera1 API와 다르게 모든 부분을 개발자가 오버라이드를 통해 세팅해줘야 하는 어려움이 존재한다. 따라서 Camera2 API를 자세 교정과 통합을 위해 사용하기 위해서는 공부가 필요하였다.

    통합 과정에서 서로 같은 라이브러리이지만 다른 버전을 사용하거나 다른 라이브러리인데 동일한 이름의 클래스 혹은 메소드를 오버라이드해서 사용하는 경우가 있었다. Android Studio에서 동일한 클래스 혹은 메소드가 중복으로 선언된 것으로 판단하고 에러를 발생시키는 문제가 발생하였다. 따라서 해당 라이브러리를 분해하여 필요한 기능들만 따로 오버라이드 하여 사용하는데 어려움이 있었다.

 

UI 부분

 

    안드로이드의 부드러운 화면 전환이나 전 화면으로 복귀를 위해서라면 특이한 방식의 Layout을 사용해야 했었다. 먼저 Main이 되는 Activity를 통해 FrameLayout만 구동하고 해당 Layout에 다른 Layout을 띄우는 방식으로 구성이 되는데 처음 해보는 작업이라 상당히 난이도가 있었다.

 

배경제거

 

    6만 개 가량의 사람 이미지 DATA Hyperparameter를 조작하여 모델을 학습시켰음에도 원하는 만큼의 성능이 나오지 않은 점이 아쉬운 부분이었다.

 

자세교정

 

    자세를 교정하는데 있어 계산된 값의 ThreshHold를 알맞게 설정해줘야 하는데 이 부분은 직접 실험적 테스트를 통해 진행되었다. 따라서 시간이 많이 소요되는 작업이었다.

 

    PoseEstimate의 기반이 되는 Fritzs(Camera2 API 기반) FaceDection의 기반이 되는 MLKit(Camera1 API기반)이 각기 다른 안드로이드 카메라 API를 사용하므로 구식(Camera1 API)을 신식(Camera2 API)로 통합하는 과정에서 어려움을 느꼈었다.

 

팀 후기

 

    이번 팀 프로젝트를 통해 안드로이드 어플리케이션의 전반적인 구동 원리를 이해하고 안드로이드 어플리케이션의 제작 능력을 한 단계 향상 시켰다.

 

    Deeplearning 기반인 Deeplab v3+의 모델을 학습시키면서 이미지 딥러닝에 대해 한층 공부하게 되었고 학습 데이터인 PASCAL2 COCO dataset도 사용해볼 기회를 얻게 되었다.

 

    통합의 어려움을 다시 한번 느끼게 되었으며 계획적인 설계가 동반되지 않은 무분별한 API사용은 프로젝트 통합에 큰 난관으로 작용한다는 것을 몸소 체험하였다.

 

    배경 제거에 학습이 더 잘 된 모델을 적용하여 더 좋은 성능을 냈다면 더 완성도 있는 프로젝트가 되었을텐데 아쉬움이 남는다.

 

 

 

 

관련글 더보기

댓글 영역