Table of Contents
  1. 프로젝트 소개
  2. 프로젝트 결과물
    1. 개발 환경
    2. 시연 영상
  3. 기능 소개
    1. ARKit & SceneKit을 이용한 AR 개발
    2. 딥러닝을 이용한 조명 인식
      1. 1. Google Vision API 방식
      2. 2. YOLO(real time object detection) 방식
  4. 마치며

딥러닝을 이용하여 더욱 현실감 있는 AR 어플리케이션을 개발한 이야기를 공유합니다.

✔︎ 1부. 딥러닝으로 더욱 현실감 있는 AR 앱 만들기
2부. ARKit을 이용하여 iOS AR앱 만들기
3부. Custom YOLO v3 모델 만들기
4부. CoreML을 이용하여 iOS에 YOLO v3 모델 탑재하기


프로젝트 소개

AR(Augmented Reality)을 이용한 다양한 어플리케이션들이 출시되고 있습니다. 그런데 AR 어플리케이션 속의 가상 오브젝트들은 여러가지 이유로 현실감이 많이 떨어져 서비스 몰입도를 낮추는 것 같습니다.

부자가 되고 싶은 자 AR을 개발해라(..?)
출처 : http://www.etoland.co.kr/

대부분의 AR 어플리케이션에서 사용되는 3D 모델들은 아래 Apple Sample Code인 Placing Objects and Handling 3D Interaction에 사용된 램프 모델과 같이 고정된 그림자 이미지를 가지고 있습니다. 이러한 고정된 그림자는 보통 어떠한 상황에서도 어색하지 않을 범용적인 형태의 그림자를 가지고 있지만, 상황에 따라 주변 물체와의 이질감을 유발하는 원인 중 하나입니다.

Apple의 Sample Code에 사용된 램프 모델<br>출처 - <a href=https://developer.apple.com/documentation/arkit/placing_objects_and_handling_3d_interaction>Placing Objects and Handling 3D Interaction</a>Apple의 Sample Code에 사용된 램프 모델
출처 - Placing Objects and Handling 3D Interaction

고정된 그림자 이미지가 아닌, 임의의 가상 조명을 생성하여 오브젝트에 그림자를 랜더링하는 몇몇 AR 어플리케이션들이 있지만, 가상 조명의 위치나 밝기가 현실에 존재하는 실제 조명과 달라 부조화스러운 그림자를 생성해 오히려 현실감을 떨어뜨렸습니다.

따라서 이번 프로젝트에서는 부조화스러운 그림자 문제를 현실 조명의 위치밝기 정보를 수집하여 해결해 보도록 하겠습니다.

✔︎ 프로젝트 목표
현실의 조명의 위치와 밝기 정보가 반영된, 더욱 현실감 있는 AR 어플리케이션 만들어보자!


프로젝트 결과물


개발 환경

1인 개발로 총 4개월이 소요되었으며, 다음과 같은 언어와 프레임워크를 사용하여 개발하였습니다.

개발에 사용된 언어, 프레임워크 및 툴개발에 사용된 언어, 프레임워크 및 툴

✔︎ 개발 환경


시연 영상


기능 소개

전체적인 어플리케이션은 다음과 같이 여섯 단계로 서비스 로직이 진행됩니다.

✔︎ ARKit & SceneKit을 이용한 AR 개발

  • 평면 탐지(Plane Detection)
  • 설치가능한 가상 오브젝트 추천
  • 가상 오브젝트 설치 및 인터랙션

✔︎ 딥러닝을 이용한 조명 인식

  • Google Vision API 방식
  • YOLO(real time object detection) 방식

ARKit & SceneKit을 이용한 AR 개발

1. 평면 탐지(Plane Detection)
2. 설치가능한 가상 오브젝트 추천
3. 가상 오브젝트 설치 및 인터랙션

어플리케이션이 현실 공간을 인식하여 벽면이나 바닥을 인식합니다. 공간이 인식되면 현재 바라보고 있는 장소에 설치 가능한 가구를 목록을 보여주고, 원하는 가구를 선택하여 설치할 수 있습니다. 또한 설치된 가구를 원하는 장소로 이동하거나 회전하는 등의 기본적인 인터랙션이 가능합니다.


딥러닝을 이용한 조명 인식

본 어플리케이션에서는 두 가지 조명 인식 방식을 구현하였습니다. 하나는 Google Vision API를 이용한 방법이고, 다른 방법은 YOLO라는 딥러닝 모델을 이용한 방법으로 다음과 같은 특징을 가지고있습니다.


✔︎ Google Vision API 방식 ✔︎ YOLO(real time object detection) 방식
• 네트워크 통신 필요 • 네트워크 통신 불필요
• 실시간 조명 추적 불가능 • 실시간 조명 추적 가능
• 조명의 정확한 좌표를 얻을 수 없음 • 조명의 2차원 좌표 획득 가능
• 조명의 온오프 상태를 알 수 없음 • 조명의 온오프 상태 구분가능
• 범용적인 조명 인식이 가능 • 학습된 5개의 조명만 인식가능

1. Google Vision API 방식

Google Vision API를 이용한 가상조명 설치

Google Vision API를 이용한 방식은 사용자가 조명을 바라보고 인식 버튼을 누르면 이미지를 Google Vision API 서버로 전달하여 조명 존재여부를 요청하고, 이미지 중앙좌표의 3차원 좌표를 hitTest 메소드를 통하여 획득합니다. 그리고 Google Vision API에서 조명이 존재한다고 반환하는 경우, 앞서 얻은 3차원 좌표에 가상 조명을 설치하는 방식입니다.

이 방법의 경우 조명의 실제 3차원 좌표가 아닌 곳에 가상 조명이 설치된 가능성이 있고, 실시간으로 조명을 인식하는 것이 아니라 사용자가 인식하고자 하는 조명 개수만큼 인식 버튼을 눌러야한다는 단점이 있습니다. 그럼에도 불구하고 Google에서 학습한 방대한 모델을 이용하기 때문에 범용적인 조명을 인식할 수 있다는 장점을 가지고 있습니다.


2. YOLO(real time object detection) 방식

YOLO 조명 on 상태 인식
YOLO 조명 off 상태 인식

이 방식은 Realtime Object Detection 모델 중 하나인 YOLO 모델을 이용한 방식입니다. YOLO 모델은, 해당 이미지 안에 존재하는 조명의 온오프 상태, 종류, 신뢰도(confidence) 그리고 바운딩 박스(2차원 박스의 대각선 두 점의 좌표)를 반환합니다. 매프레임마다 바운딩 박스 좌표를 hitTest 메소드에 입력하여 조명의 3차원 좌표를 계산하고, 조명의 상태에 따라 경우 해당 좌표에 가상 조명을 추가하거나 삭제합니다.

모바일에 탑재한 YOLO 딥러닝 모델을 이용하기 때문에 네트워크 통신이 필요하지 않으며, 실시간으로 조명의 상태 및 좌표를 인식할 수 있다는 장점을 가지고 있습니다. 하지만 학습된 조명만 인식이 가능하다는 단점을 가지고 있습니다.


마치며

현실 조명에 대한 정보가 가상 오브젝트에 반영되었으므로, 아래 영상과 같이 오브젝트의 그림자가 조명과의 상대적 위치에 따라 현실감 있게 랜더링 되는 것을 보실 수 있습니다.

그림자가 조명을 중심으로 랜더링 됩니다.

그 뿐만 아니라 카메라를 통해 들어오는 밝기(lm)과 색 온도(Kelvin)를 매프레임마다 가상 조명에 실시간으로 반영해주고 있기 때문에 가상 오브젝트가 주변과 유사한 텍스쳐로 표현되어 더욱 현실감을 높여줍니다.

에디슨 전구의 따뜻한 색 온도가 반영되어 오브젝트를 더욱 현실감 있게 표현해줍니다.<br>- 왼쪽 : 조명인식 전(前) / 오른쪽 : 조명인식 후(後)에디슨 전구의 따뜻한 색 온도가 반영되어 오브젝트를 더욱 현실감 있게 표현해줍니다.
- 왼쪽 : 조명인식 전(前) / 오른쪽 : 조명인식 후(後)

현실 조명의 위치와 밝기 그리고 색 온도 정보를 그대로 가상 조명으로 재현하여 더욱 현실감 있는 AR 어플리케이션 구현이라는 목표를 달성할 수 있었습니다. 🎉

이상으로 전체적인 프로젝트에 대한 소개를 마치고 다음 2부에서는 iOS AR 어플리케이션 개발 방법에 대해 공유하겠습니다.

✔︎ 1부. 딥러닝으로 더욱 현실감 있는 AR 앱 만들기
2부. ARKit을 이용하여 iOS AR앱 만들기
3부. Custom YOLO v3 모델 만들기
4부. CoreML을 이용하여 iOS에 YOLO v3 모델 탑재하기