Smart image cropping using self-attention
가볍게 기록해보는 이미지 크롭에 방식에 대한 고민. 보통 object-fit으로만 사용하는 미리보기 이미지를 머신러닝을 사용하여 좀 더 이쁘게 뽑아줄 수 없나? 데이터 없이 self supervised 이미지 모델의 self-attention만 사용해도 뽑을 수 있으면 더 좋고.
다른 곳은 어떻게 할까?
트위터에서 블로그 포스트로 공개한 Speedy Neural Networks for Smart Auto-Cropping of Images을 보고 아이디어가 떠올랐다. 저 글의 요지는 1) 사람이 주목하는 부분을 데이터로 수집하고 2) 해당 부분을 추론하도록 모델을 학습하여 3) 트윗 프리뷰 이미지를 모델을 이용해 만들어주었다는 것이다.
근데 이게 윤리적인 문제는 있다고. 아이트래커를 사용해 데이터를 수집했으니 사람들의 편향이 당연히 들어갔을 것 같긴 하다.
Dino 모델
근데 내가 당장 아이트래커를 가져올 수는 없으니 어떻게 테스트해볼지 생각해봤다. 1) object detection을 활용해 잡는 방법 2) self attention을 이용해 잡는 방법 두가지가 생각났고, self attention이 더 무난하게 잡을 것 같아 그 쪽으로 결정했다.
그래서 어떤 모델을 가져올지 고민하다가 self supervised 방식으로 학습한 DINO 모델이 떠올랐고 성능이 중요한 것은 아니니 제일 작은 DINO 모델(vit-small-16patch)를 가져와서 진행했다. 여기서 생각한 가정은 “DINO가 잡는 부분이 사람들이 주목하고 싶은 부분과 비슷할 것이다!”라는 것.
진행
진행한 방식은 다음과 같다.
- 적당한 이미지를 가져온다. (Unsplashed에서 많이 가져왔다)
- DINO 모델로 self attention 값을 추출한다.
- 주변 픽셀 값을 활용해 적절히 뭉갠다. (outlier 값들이 있을 수 있으니)
- 제일 높은 값을 가진 픽셀 위치를 위주로 crop 한다.
여기서 3이 크게 의미있는 과정인지는 모른다. 비전 관련해서 깊게 공부해본 적이 없기 때문에 필요하면 개선이 가능할 것 같아 패스했다.
결과
Unsplashed를 켜서 보이는 사진 적당히 5개 정도 가져와서 샘플만 뽑아보았다. 각 행별로 첫번째 이미지가 원본 이미지, 두번째 이미지가 attention 값, 세번째 이미지가 box blur한 값, 네번째 이미지는 center crop한 값, 마지막 이미지가 attention 정보를 활용해 crop한 이미지이다.
강아지 사진들 경우는 당연히 잘 될 것 같았고 잘 됐다. 서핑복 입은 남성 사진이 잘 안될 것 같았는데 다행히 은근 잘 잘렸다.
오브젝트가 길게 위치하는 이미지 혹은 여러 오브젝트가 등장하는 이미지는 어텐션이 여러 곳에 분포해서 이상하게 잘릴 것 같다. 예를 들어 트위터 블로그 포스트의 예시는 그렇게 잘 잡히지는 않는다. 아래 이미지인데, 얼굴쪽으로 잘 잘린 것 같지만, 잘 보면 농구대 네트쪽이 높은 attention 값을 가지고 있다.
–
코드는 GitHub Repository에 있다. https://github.com/jeongukjae/image-cropping-using-attention