자동으로 배경을 삭제 remove.bg를 재현해 보았다

조금 전에 화제가 된 「레도 베. bg」라는 배경을 삭제해 주는 서비스를 사용해 보았습니다. 그 정밀도의 높이에 감명을 받고, 흥미를 가졌기 때문에 스스로도 시험해 보았습니다. 이 코드는 모두 여기 기사에 있습니다.

remove.bg란?


  • 자동으로 이미지에서 배경을 제거하는 서비스
  • 기본 무료로 사용 가능, API 취득은 유료
  • 머리카락 한 개까지 추출해 준다


  • Semantic Segmentation



    이 서비스를 사용해 보면 먼저 생각해 낸 것이 세그멘테이션의 이용입니다. 그래서 torchvision의 DeepLabv3에서 바삭바삭하게 시도해 보았습니다. 다음이 그 결과입니다.

    어느 정도 능숙해지고 있습니다만 머리카락 한 개 한 개를 추출할 수 없는 것 같습니다.
    세그멘테이션으로 배경 삭제를 할 수 없는 원인으로는
    · 머리카락 하나에 주목해도 loss는 그렇게 변하지 않는다
    · 원래 데이터 세트의 대상 이미지가 대규모입니다.
    · bilinear interpolation에서 upsampling
    라는 점이 있다고 생각됩니다.
      세그멘테이션과 세세한 배경 삭제에서는 목적이 다르기 때문에 잘 안 되는 것은 당연했습니다.

    Image Matting



      세그멘테이션이 잘 되지 않았기 때문에, 다른 책을 조사하고 있으면 「Image Matting」이라고 하는 태스크가 있는 것을 알았습니다. Image Matting은 이미지와 비디오에서 전경을 추출하는 작업입니다.

    이미지 처리 범위



    Image Matting은 이미지의 일부만 처리합니다. 먼저 이미지를 "전경", "배경", "그 중 하나"로 거칠게 분할합니다. (이 3 클래스로 분할 한 것을 trimap을 말합니다) 다음으로 "그 중 하나"에 대해서만 투명도를 나타내는 알파 채널을 예측해 갑니다. 이렇게 하면 미세 부분의 예측 누설 손실을 상대적으로 크게 할 수 있습니다. 다음 예제는 이미지의 회색 부분만 추론합니다.


    데이터 세트



    유명한 데이터 세트는 Adobe에서 제공하는 Matting Dataset입니다. 세그멘테이션용의 데이터 세트에 비해 꽤 세세하게 되어 있습니다. (Adobe의 Brian Price 님에게 이메일로 연락하여받을 수 있습니다.)


    처리 흐름


  • 마스크 만들기
    Image Matting을 실행하려면 입력 이미지와 별도로 앞서 설명한 trimap을 준비해야 합니다. 이를 위해 먼저 세그멘테이션을 사용하여 마스크 이미지를 생성합니다.
  • trimap 만들기
    생성한 마스크에서 trimap을 만듭니다. OpenCV의 팽창 수축 처리를 실시하여 작성합니다.
  • IndexNet Matting에서 추론
    이번에는 Image Matting 중 IndexNet Matting이라는 모델을 이용하여 추론합니다. 이유는, 논문의 작자에 의한 공식 실장이나 학습 끝난 모델이 공개되고 있어 시험하기 쉬웠기 때문입니다.


  • 결과



    위의 파이프라인에서 추론한 결과를 몇 개 올립니다. 왼쪽이 원래 이미지, 중앙이 추론 결과, 오른쪽이 remove.bg를 이용한 결과입니다.  



    요약



    DeepLearning을 이용해 배경 삭제(전경 추출)에 임했습니다.
    remove.bg의 완전 재현이라고는 하지 않았습니다만, 꽤 잘 배경을 잘라낼 수 있었습니다!

    (이 기사에서 사용한 이미지는 모두 파쿠타소님으로부터 취득한 것입니다.)

    좋은 웹페이지 즐겨찾기