토이 프로젝트 주제
1. 문제 선정 이유
안녕하세요! 저희 팀의 주제는 “더욱 완벽하고 아름다운 추억을 만들어주는 AI 지우개” 입니다.
여러분 모두 여행을 다녀오신 후 유명 관광지에서 촬영한 사진에 다른 관광객이 찍혀있거나, 그저 자연의 아름다운 경관을 간직하고 싶지만 옥에 티처럼 존재하는 누군가가 감상을 방해하신 경험이 한번쯤은 있으실 겁니다.
이에 기존에 Computer Vision 관련 논문 스터디를 진행해 온 지식과 경험을 바탕으로 더욱 만족스러운 여행 사진을 위한 프로세스를 개발하고자 이와 같은 주제를 선정하게 되었습니다.
2. 기존 모델과의 차이점
이에 저희 팀은 지울 대상(사람)의 영역을 Segmentation과 Object Detection을 통해 자동으로 지정하여 쉽고, 빠르며, 간편하게, 어떠한 조작도 필요없는 모델을 제안합니다.
3. 문제 해결 아이디어
이미지가 Input으로 들어오면 해당 이미지에 대해 Segmentation을 진행
Segmentation된 대상 중 Person Class를 가진 객체에 대해
선택 1. 모든 Person Class를 Erase → 아름다운 경관을 위해
→ Semantic Segmentation 적용
선택 2. 특정 Person ID를 가진 객체만 Erase → 나만 잘나온 사진을 위해
→ Instance Segmentation 적용
> 해당 섹션에서 기존에 모델 속도 향상을 위해 Semantic / Instance Segmentation으로 별도 설계하였던 부분은 Instance Segmentation의 Inference 속도가 충분히 빨라 후에 Instance Segmentation만 사용하도록 변경되었습니다.
선택된 영역을 지우는 것에 그치지 않고, 주변 영역 이미지를 이용해 제거된 영역을 자연스럽게 복구하는 Inpainting 적용
프로젝트 진행
1. Segmentation / Inpainting 위한 데이터 및 모델 탐색
Segmentation 모델 탐색
2021년, 2022년 Computer Vision 계의 가장 큰 화두는 Transformer라고 해도 과언이 아닙니다. 비단 Computer Vision 영역 뿐만 아니라 자연어 처리를 포함한 AI 전 영역에 걸쳐 가장 큰 관심을 받고 있는 Transformer는 Self-Attention 기법을 효과적으로 수행하여 Computer Vision의 Object Detection, Segmentation 등 다양한 분야에서 기존 모델에 비해 압도적인 성능을 이끌어 냈습니다.
Self-Attention이란?
Vision 분야에 Transformer를 적용한 최초의 모델인 ViT(Vision Transformer, Transformers for Image Recognition at Scale) 이후에도 Transformer를 Vision 분야에 효율적으로 적용하려는 많은 시도들이 있었고 결국 2021년, 아티클을 작성하는 현재(2022년 6월 29일) 기준 1839회의 인용수를 기록하는 Swin Transformer 모델이 발표됩니다. Swin Transformer는 기존 Text에 적용되던 Transformer를 Image 분석 영역에 적용하기 위해 존재했던 많은 어려움들을 Shifted Windows를 통해 매우 효과적으로 해결하는 Backbone Network를 제안합니다.
Swin Transformer의 구조는 위와 같습니다. 그 중 우측에 나와있는 Swin Transformer Block에 대해서 잠시 설명을 더해보자면, Swin Transformer의 경우 기존 ViT에서 사용하던 MSA(Multi-head Self Attention)이 아닌, Windows-MSA, Shifted Windows-MSA를 사용합니다.
W-MSA는 현재 윈도우(Window)에 있는 패치(Patch)들끼리만 self-attention 연산을 수행합니다. 이미지의 경우 보통 주변 픽셀들과 서로 연관성이 높기 때문에, 윈도우 내에서만 self-attention을 수행하여 효율적으로 연산량을 줄일 수 있었습니다.
그러나 W-MSA의 경우 윈도우가 고정되어 있어 고정된 부분에서만 self-attention을 수행한다는 단점이 있었습니다. 이에 해당 논문 저자들은 이 윈도우를 shift해서 self-attention을 한번 더 수행하였고, 이것이 바로 SW-MSA라 할 수 있습니다.
SW-MSA의 경우 위 그림과 같이 수행되는데, 먼저 window를 shift 시키는 cyclic shift가 수행됩니다. 우측 하단으로 window가 shift되는데, 이때 A, B, C 구역은 원래 좌측 상단에 있었던 것들이기 때문에 반대편에서 self-attention을 수행하는 것이 의미가 없다고 판단하여 해당 부분에 mask를 씌우고 self-attention이 수행되지 않도록 합니다. 이렇게 mask 연산이 진행된 후에는 다시 원래 값으로 되돌리는 reverse cyclic shift가 수행됩니다. 이를 통해 결과적으로 윈도우 사이의 연결성을 표현할 수 있습니다.
위와 같은 방식으로 우수한 성능을 이끌어낸 Swin Transformer를 Backbone Network로 사용하여 Instance Segmentation과 Object Detection을 훌륭하게 수행해내는, Masked-attention Mask Transformer for Universal Image Segmentation에서 발표된 Mask2Former 을 Segmentation 모델로 선정하였습니다. Mask2Former는 2022년 6월에 발표된 Segmentation 모델로, semantic, instance, panoptic 어떠한 segmentation task에서도 우수한 성능을 보이고 있습니다.
Mask2Former의 핵심인 Masked Attention을 언급하기에 앞서, Mask2Former의 구조를 알아봅시다. Mask2Former는 MaskFormer의 구조를 그대로 따르고 있습니다.
Mask2Former의 구조
MaskFormer는 크게 3가지 영역으로 나눠져 있는데요.
Backbone : 저화질의 특징(feature) 추출
→ 위에서 언급한 Swin Transformer를 Backbone 모델로 사용
Pixel Decoder : Backbone에서 나온 output feature를 up-sampling 하여 고화질의 픽셀 단위 임베딩(Embedding) 생성
Transformer Decoder : Pixel Decoder에서 나온 이미지 Feature들을 이용하여 Object Query(각 segment를 표현하는 C차원의 feature 벡터)를 생성
이때, Mask2Former에서는 MaskFormer의 Transformer Decoder에서 사용하던 Cross-Attention을 Masked Attention으로 변경하였습니다. Masked Attention에 대해 간단하게 설명하자면, 예측된 mask 영역 내에서 cross-attention을 수행하여 내제된 특징들을 추출하는 방식입니다. 이외에도 몇가지 특징을 언급해보자면 아래와 같습니다.
•
작은 물체를 잘 분할할 수 있도록 pixel decoder에서 나오는 다양한 scale의 feature들을 각각 하나의 transformer decoder layer의 input으로 입력
→ 고화질의 feature도 효율적인 활용
•
self-attention과 masked attention의 순서 변경
→ query feature들을 학습 가능하게 함
•
dropout도 제거
→ 이전 모델(MaskFormer)보다 효율적인 연산 지원
또한, 간편하게 모델을 구현해볼 수 있는 MMDetection Tool Box를 지원하여 누구나 쉽게 모델을 사용해볼 수 있다는 장점을 가집니다.
Image Segmentation
MMDetection Tool Box란?
Inpainting 모델 탐색
생소하게도 들릴 수 있는 Inpainting이란 이미지에서 가려지거나 손상된 부분을 여러 기법을 통해 사실적으로 복원하는 방법을 말합니다. Computer Vision 에서는 가려진 부분을 예측하기 위해 딥러닝 신경망을 학습하는 방식으로 접근합니다.
DeepFillv2에서는 Inpainting을 성공적으로 수행하기 위해 예측을 위한 Convolution Layer 대신 Gated Convolutional Layer를 제안합니다. 이를 통해 기존 GAN 기반 inpainting 모델들에 비해 훨씬 자연스럽고 부드러운 복원을 진행한다는 특징이 있어 먼저 DeepFillv2를 Inpainting 모델로 선정하여 여러 실험을 진행하였습니다.
2. Segmentation 모델 구현 및 수정
기존 Segmentation 모델들의 output은 아래 이미지와 같이 해당하는 Class를 특정 색상으로 둘러싸는 Mask를 출력합니다. 저희는 이러한 Segmentation 결과를 Mask로써 활용하고자 코드 상에서 Mask 정보를 가지는 Tensor를 별도로 추출, Binarization을 진행해 mask로 변환해주었습니다.
일반적인 Segmentation 모델 수행 결과
Input
Output
CODE
Binarization을 거친 Mask 결과
TEST CASE 1
input
output
TEST CASE 2
input
output
너무나도 훌륭한(?) Segmentation 성능 때문에 아쉽게도 사람이 들고 있는 스노우 보드는 mask 영역에 포함되지 않았습니다. 이러한 상황을 보완하고자 기존에 mask생성을 위해 선정된 segmentation 외에도 Object Detection 역시 함께 활용하여 mask 생성을 진행했습니다.
Object Detection Mask 생성 결과
TEST CASE 3
input
output
저희의 목표는 단순히 이미지 내에서 무자비하게 모든 사람을 지워버리는 것이 아닌, 이 글을 읽고 있는 여러분을 위한 모델을 만드는 것입니다. 이를 위해 객체에 대한 신뢰도 순서로 Tensor를 정렬하여 지우고 싶지 않은 나와 내 소중한 사람들은 사진에서 지워지지 않도록 설정하였습니다.
나만 빼고 mask 생성하도록 한 결과
TEST CASE 4
input
output : 나만 빼고!
CODE
3. Inpainting 모델 구현
직접 생성한 Mask를 적용한 이미지를 입력으로 넣기 전에, 앞서 선택했던 모델 Deepfillv2와 먼저 친해지는 시간을 가져보겠습니다.
TEST CASE 1
TEST CASE 2
결과 이미지를 정사각형 형태의 고정된 사이즈로 바꿔주는 원치 않는 resizing 단계가 있었고, 추후에 이를 제거하여 원본 이미지 사이즈를 그대로 유지할 수 있도록 하였습니다. Inpainting 결과는 썩 만족스럽진 않지만,, 그럭저럭 지우고 싶은 대상을 잘 지워주는 것 같습니다.
4. 모델 통합 및 보완
대망의 모델 통합 시간입니다!
1. Instance Segmentation과 Object Detection을 통해 생성한 Mask와 Input 이미지를 2. Inpainting 모델에 입력하여 새롭게 생성된 Output 이미지를 얻어보겠습니다.
Deepfillv2의 모델 성능 확인을 위해 MMedit Tool Box에 존재하는 AOT-GAN Inpainting 모델도 사용하여 결과를 비교해 보았습니다.
실험 1
1. original input
2. masked by instance segmentation
결과 1. Deepfillv2
결과 2. AOT-GAN
앗..? 결과가 생각보다 만족스럽지 않습니다..
아직 정확한 이유를 모르겠으나 일단 Object Detection을 통해 생성된 mask는 어떨지에 대한 실험부터 진행해보겠습니다.
실험 2
1. original input
2. masked by object detection bounding box
Deepfillv2
AOT-GAN
!!! 성능이 훨씬 좋아졌습니다
object detection의 사각형 마스크보다 segmentation mask가 더 디테일하게 객체의 영역을 지정해주기 때문에 segmentation mask를 사용하는 것이 더 좋은 성능을 보여줄 것이라고 예측했던 것을 배신하는 결과입니다.
이에 다음과 같은 가정을 세우고 새로운 실험을 진행했습니다.
가정 : segmentation mask가 너무 Fit하여 충분하지 않았다
해결법 : Segmentation Mask 크기를 키워서 적용해보자!
Mask의 크기를 키우기 위해 기존 Computer Vision 이미지를 다루는 기법 중 하나인 Morphology 연산 내 팽창(Dilation) 연산을 Mask 이미지에 적용하였습니다.
모폴로지 연산(morphology)
실험 3
1. original image
2. morphology 연산 거쳐 더 큰 mask를 만듦
Segmentation mask 그대로 썼을 때
Deepfillv2
AOT-GAN
확장된 Mask 썼을 때
Deepfillv2
AOT-GAN
마스크의 크기를 확대하여 Inpainting 성능이 비약적으로 상승했습니다. 우리가 원했던 결과와 더욱 가까워졌어요! 하지만 여전히 조금은 거뭇거뭇하기도 하고 보정된 영역이 흐릿흐릿하기도 합니다. 또한, 이미지 사이즈가 커질 경우 Inpainting을 진행하는데 시간이 오래 걸린다는 단점이 있었습니다.
더욱 실제와 같은 결과를 빠르게 얻고 싶은 Viz 팀의 욕심을 만족시키기 위해 더욱 좋은 Inpainting 모델을 조사하던 중 매력적인 모델 LaMa(LArge MAsk Inpainting)를 찾게 됩니다.
최근 Image Inpainting 모델들(예: Deepfillv2)은 Inpainting Network와 Loss function단계에서 Receptive field가 충분히 효과적이지 못하다는 큰 단점을 가지고 있었고, 이에 복잡한 기하학적 구조의 mask 영역이나 높은 resolution을 갖는 이미지, 큰 영역의 mask를 처리하는데 어려움을 겪었습니다. 이러한 문제들을 효과적으로 해결하고자, LaMa는 다음과 같은 방법들을 통해 Inpainting을 성공적으로 수행합니다.
더 넓은 Receptive Field를 갖는 Fast Fourier Convolution을 사용한 Network Achitecture
더 고차원의 Receptive Field Perceptual Loss
앞선 두 단계의 잠재력을 해방시켜줄 수 있는 Training 단계에서 더 큰 Mask의 활용
LaMa의 개략적인 전체 구조
LaMa를 통해 진행한 Inpainting 예시
매우 준수한 성능을 보여주는 LaMa를 Inpainting 모델로 적용하여 다시 한번 실험을 진행해보았습니다.
실험 4
original image
LaMa를 통해 Inpainting을 진행한 결과
왼쪽의 오리지널 이미지가 없었더라면 오른쪽 이미지를 보고 무언가 이상한 점을 눈치챌 수 있었을까요..? 너무나도 훌륭한 결과를 보여줍니다. 이전 결과들보다도 훨씬 좋은 결과를 얻을 수 있었습니다.
More Examples
실험 5
original image
팽창된 segmentation mask
결과
추가로, 팽창된 segmentation mask로도 불충분한 inpainting 결과를 보여주는 경우가 있었는데요. 이럴 때는 segmentation mask를 이용하여 inpainting한 결과 이미지에 detection mask를 한번 더 적용하여 inpainting을 진행하였습니다.
팽창된 segmentation mask를 이용한 inpainting 결과 이미지를 input으로 이용
detection box mask
결과
이제는 사람이 있었던 사진이었는지도 모를 만큼 자연스러워졌습니다
5. End-to-End
각각의 모델들을 통합하여 정리하고 누구나 쉽게 사용해볼 수 있도록 코랩환경으로 demo를 제작하였습니다.
또한 해당 과정에서 ipywidget을 활용해 원하는 이미지를 업로드할 수 있는 버튼과 segmentation 진행 후 원하는 객체만 지울 수 있도록 선택할 수 있는 check box를 추가하였습니다.
프로젝트 결과
Segmentation과 Inpainting 모델을 통합하여 객체 선택부터 masking, inpainting까지 AI 모델로 진행되는 통합 모델을 개발하였습니다.
Colab
Colab을 통해 누구나 직접 사용해보실 수 있습니다.
Demo
소요 시간
환경 구축 : 약 5~10분
구축 이후 실제 inference 시간 : 10초~60초 내외 소요
프로젝트 의의 및 한계와 추후 발전 방향
1. 의의
•
기존 어플리케이션과 다르게, instance segmentation 및 object detection을 통해 사용자의 별다른 영역 지정 없이도 매우 정확한 mask 지정이 가능합니다.
•
segmentation mask에 대해 팽창 연산을 수행하여 주변 배경까지 포함시키는 mask를 생성해 더욱 자연스러운 inpainting이 가능합니다.
•
사용자가 지우고 싶은 객체를 선택하도록 입력을 받아 활용성을 증가시켰습니다.
2. 한계
•
Colab에 작성된 demonstration code에 매끄럽지 못한 부분이 존재합니다.
•
지울 인물을 선택할 때, 후보군이 segmentation의 output에 의존하기 때문에 segmentation 단계에서 탐지하지 못하거나 threshold에 의해 filtering 된 객체는 지울 수 없습니다.
•
환경 구축 단계에서 불필요한 파일까지 모두 다운로드하기 때문에, 다소 긴 시간이 소요됩니다.
•
사람이 다른 객체와 함께 있는 경우(ex. 스노우보드를 들고 가는 사진), 사람을 제외한 다른 객체는 지워지지 않아 어색한 inpainting이 진행됩니다.
3. 추후 발전 방향
1.
사람 이외의 객체도 선택하여 지울 수 있도록 모델을 확장합니다.
2.
PyQt를 활용하여 Colab이 아닌 하나의 프로그램에서 모델이 수행될 수 있도록 합니다.
3.
객체의 상태(사람만 있는지 혹은 다른 사물을 포함하는지)에 따라 Segmentation Mask를 적용할 지 Bounding Box Mask를 적용할 지 결정하는 알고리즘을 작성하여 모델에 추가합니다.
4.
탐지된 객체들의 평균 신뢰도 값을 threshold 설정에 이용하여 더욱 정확하고 많은 객체들이 segment 될 수 있도록 알고리즘을 수정합니다.