1. 들어가기전에
- 딥러닝을 전문적으로 공부한 것은 아니며, 시행착오를 겪으며 얻은 경험을 정리한 글입니다.
- 더 나은 방법이 있을 수 있으니 재미로(?) 봐주세요.
2. 문제 인식
- 배경제거 카메라 앱 출시 이후 "화질이 좋지 않다"는 피드백이 많았습니다.
화질이 좋지 않다는 의미를 아래 두 가지로 볼 수 있을것 같습니다.
- 화면에 보이는 이미지 퀄리티
- 배경제거된 결과의 퀄리티
- 이 글에서는 배경제거 결과 퀄리티 개선에 대한 이야기만 다룹니다.
3. 배경제거 퀄리티 개선 방법
- 이쪽 업계(?) 논문을 뒤져보니 크게 두가지 방법으로 개선할 수 있을 것 같았습니다.
- 배경제거라는게 원하는 사물과 나머지를 분리하는 것이고, 최종적으로 원하는 사물의 마스크 이미지를 잘 생성하면 좋은 퀄리티라고 할수 있겠네요.
- 처음부터 마스크 이미지를 잘 만든다 -> 지금보다 더 좋은 딥러닝 모델로 변경한다.
- 이미 생성된 마스크 이미지를 개선한다 -> 마스크 개선용 딥러닝 모델을 추가한다.
4. 적당한 모델 찾기
-
마스크 이미지 개선 딥러닝 모델을 찾고, Pretrained Model을 iOS 에서 사용할 수 있도록 coremltools로 CoreML모델로 변환했습니다.
-
그 결과 용량이 130메가짜리 CoreML 모델이 나왔고, 이를 아이폰 15 프로에서 1초가 넘는 추론시간이 필요했습니다.
5. 모델 최적화 하기
-
다행히 coremltools 에는 optimize방법들을 제공하고 있었습니다.
-
간단하게 스크립트를 만들어서 각종 옵션들과 최적화 방법 등등을 적용해서 약 180개의 최적화된 모델들을 생성했습니다.
-
그리고 각 모델들의 퀄리티 / 용량 / 속도 등을 비교하기 위해 스크립트를 만들었습니다.
퀄리티 비교는 iOS Vision 라이브러리에 있는 이미지 유사도 비교 API를 사용했습니다.
-
이를 통해 최적화된 후보 모델 몇 가지를 골랐습니다.
6. iOS 기기에서 돌려보기
-
iOS에서 CoreML 모델을 돌릴 때는 CPU / GPU / NE (뉴럴 엔진) 3가지 방법(이하 계산 유닛)을 사용할 수 있습니다.
-
최적화를 했지만 그럼에도 불구하고, 일부 기종에서는 계산 유닛에 따라 사용하기가 힘들다는 결론을 얻었습니다.
7. 모델 수정하기
- 공개된 모델을 모바일에서 사용할 수 있게 수정하기로 했습니다.
- 백본 네트워크를 모바일 최적화된 모델로 변경하고, 일부 레이어 구조를 변경했습니다.
- 학습에는 2021년 맥북 M1 Pro 16GB 모델로 약 3일이 걸렸습니다.
- 학습된 모델은 용량이 13메가였고, 속도도 기존과 비교할 수 없을 정도로 빨라졌습니다.
- 이를 8비트 팔레트 최적화만 해서 약 6.8메가로 최종 모델을 생성해냈습니다.
8. 다시 iOS 기기에서 돌리기
- 모바일에 최적화된 새로 만든 딥러닝 모델은
- 아이폰 SE에서는 CPU로 약 1.5초 정도 걸리는데 메모리가 부족해서 포기
- 아이폰 12에서는 GPU에서 모델 로드 2초, 추론은 1초 이내
- 아이폰 15프로에서는 NE에서 모델 로드시 최초 1초 이내, 추론은 0.4초 이내
- 위와 같은 최종 결과를 얻었습니다.
9. 결론
- 실제 적용 결과는 아래와 같습니다. 아래가 수정된 모델, 위가 기존 모델

- 일부 결과는 오리지널 딥러닝 모델에 비해 아쉬운 점이 있지만
- 작은 용량, 빠른 로드/추론 속도를 얻을 수 있었습니다.
### 10. 앞으로
- 더 정교한 백본 모델 적용 및 레이어 구조 개선 예정.
- 마스크 개선뿐 아니라 처음부터 마스크를 잘 생성하는 모델도 연구 계획.
- 배경제거 카메라앱은 앱스토어에서 확인 할 수 있습니다.
(참고로 유료앱입니다)
// 3줄 요약
- 배경제거 카메라 앱의 마스크 퀄리티 개선을 위해 딥러닝 모델을 찾아서 테스트
- 속도 부족으로 모바일에 최적화된 모델 학습 및 최적화 처리
- 더 나은 속도, 퀄리티, 작은 용량의 딥러닝 모델 생성해서 앱에 적용함.
끝.