카메라 이미지 품질 향상 AI 경진대회

여러분들은 어떻게 해당 문제를 풀고자 했었나요?

2021.07.31 04:44 3,685 Views

안녕하세요.

이번 대회는 풀고자 하는 문제도 정말 흥미로웠고 참여자도 꽤 많아서 정말 재미있게 참여를 했습니다.

이제 대부분의 팀들이 이때까지 실험했던 것을 바탕으로 마지막 훈련을 진행 중이거나 마지막 반전을 위해 새로운 실험을 시도 하는 팀도 있을 것 같습니다.


저는 다른 참여자 분들은 이 문제 해결을 시도하면서 생각한 아이디어를 간단히! 자유롭게! 어떤 접근 방법이든! 서로 공유! 해보면 좋을 것 같습니다.

조금 더 일찍 이런 게시글을 적었다면 다른 사람이 시도한 내용을 가지고 서로 시너지가 되어 팀마다 참신한 아이디어가 나왔지 않았을까 생각이 들지만 늦게나마 토론 공간이 있으면 좋겠다고 생각이 들었습니다. 다른 팀들이 어떤 접근을 했었는지 다들 궁금해 할 것 같습니다. 저만 그런것 아니겠죠..?


우선 제가 시도 했던 방법을 간단히 나열 해보겠습니다.




첫 번째 시도

제가 시도했던 것들을 설명드리면 해당 대회의 데이터셋은 해상도가 꽤 큰 편인 것 같아 patch단위로 접근을 했습니다.(베이스라인도 patch 죠!) 하지만 patch단위로 훈련을 시키고 추론한 결과를 보면 patch마다 색감이 달라 정말 이질감이 드는 이미지가 만들어집니다. 특히 patch의 경계부분은 더 이질감이 듭니다. 그래서 생각한 것은 patch 주변 context를 같이 학습 시키면 어느정도 보완이 되지 않을까 생각하고 patch 주변 이미지 일부를 모델에 같이 넣거나 원 해상도 이미지를 resize하여 같이 학습 시키고자 많은 노력을 했었습니다. 하지만 patch 때문에 생기는 문제를 보완하기는 힘들었습니다.

추가로 patch의 단점을 보완하고자 후처리 시스템을 시도하려 했지만 psnr 점수와 추론시간을 고려해서 유의미한 결과가 나오지 않았습니다.


두 번째 시도

또 한 가지 시도 한것은 원래 해상도 그대로 훈련을 시켜보고 싶어 시도한 방법입니다. 원래 해상도를 그대로 모델에 넣기에는 제가 가진 자원에서 한계가 있어 down sampleing resize를 한 후 up sampling하는 방식으로 모델을 구성해 보았습니다. 이것은 많은 분들이 시도 해보셨을 것 같은데 결과가 썩 좋지는 않았습니다. LB 가 28 후반 정도 나왔던것 같습니다.





시도한 아이디어에 대한 상세한 파라미터들도 있겠지만 접근 방법, 아이디어를 공유하는 차원에서 간단히 적어보았습니다.

어떻게보면 누구나 생각할 수 있는 간단한 아이디어 이지만 또 다른 누군가에겐 더 참신한 아이디어가 생각 날 수 있는 글이 되었으면 좋겠습니다. 제 개인적으로는 생각한 것들을 직접 구현 하면서 많은 것들을 배워갈 수 있었습니다!

다른 참가자 분들도 대회 중 실패했던 아이디어, 구상만하고 시도를 못해본 아이디어, 어떠한 아이디어든 정리하고 의견을 나누면 비슷한 연구 혹은 대회에 도움이 될 수 있을 것 같습니다.


로그인이 필요합니다
0 / 1000
파이썬초보만
2021.07.31 11:28

1. 이미지의 context를 patch에 어떻게 넣을까 고민하다가
이미지를 여러 방식으로 normalization 하고 patch를 자른다던지 concat하여 입력으로 넣는 방법을 고려했습니다.

2. SR모델에 이미지를 resize하여 입력으로 넣고 upsampling 후에 원본이미지를 더해주는 방법을 고려했습니다.

완벽한 테스트를 하진 못했지만 두 방법 다 유의미한 스코어 향상은 없었습니다. 

더 생각해 본 건 빛번짐이 사진 상의 위치에서 다르게 나는것 같아 patch에 어떻게 좌표정보를 넣을 지를 생각해 봤습니다. 

최정명
2021.08.02 18:24

와 저도 patch에 positional embedding 처럼 patch에 대한 좌표 정보를 어떻게 넣을지 고민했었는데 구현을 해보진 못했습니다.

해상도가 큰 영상이다 보니 입력할 때 처리할 수 있는 방법이 다양한것 같습니다 ㅎㅎ

홍의_제자
2021.07.31 13:36

삭제된 댓글입니다

f1930n8
2021.07.31 15:01

EfficientNetV2에서 사용된 Progressive Learning이 굉장히 흥미로워서
이를 적용한 학습을 구성해 보았지만, 아쉽게도 좋은 성적을 받지는 못했습니다.

Training Dataset의 Image Size를 에폭에 따라 점차 키워가면서 학습하는 방법인데
Image Size에 따른 성능 향상과 학습속도 저하의 Trade Off 를 어느정도 완화해줄 수 있을 것이라고 생각했습니다.
훈련 과정에서는 20에폭마다 패치의 크기를 192x192x3 → 256x256x3 → 320x320로 Resampling하여 사용하고 
추론 과정에서는 320x320x3 크기의 패치를 사용했습니다.

다만 RandAugment, Distributed Train Step 구현 및 Modeling 과정에서 시간을 너무 많이 사용해서 다양한 실험은 진행하지 못했습니다.

경량화와 관련된 내용은, 처음에 큰 모델로 학습시켜서 어느 정도의 성능을 높인 후 작은 모델로 넘기는 방법을 고민했습니다.
구체적으로는 Knowledge Distillation, Weight Pruning, Quantization 등을 후보로 두었습니다.
경량화가 전문 분야는 아니지만, TensorFlow와 PyTorch 모두에서 이와 관련된 좋은 튜토리얼을 제공하고 있기 때문에 충분히 구현은 가능할 것으로 보았습니다.

이번 대회를 계기로 다른 분들의 코드를 보면서 좀 더 겸손해 질 수 있었던 것 같습니다.
다른 분들도 모두 노력한 만큼 좋은 결과 얻으시길 바라겠습니다.

최정명
2021.08.02 18:31

저도 patch 크기를 256 -> 512 -> 768 로 점점 패치를 키우면서 학습을 해보았었는데 학습 중에는 CV 성능이 좋게 나왔었는데 LB로는 큰 차이가 없는것 같더라고요.
나머지 private sample에 있는 것을 합쳐보면 어떨지는 모르겠지만요...

EfficientNetV2는 지금 알았네요
덕분에 잠시 읽어 보았는데 Progressive Learning이 이미지 크기를 점점 키우면서 정규화도 점점 강하게 적용 시키는거네요!
한 번 관련 논문 정독 해봐야겠네요 ㅎㅎ 감사합니다.

양치기
2021.08.02 18:44

1번 방법 비슷하게, 전체 이미지를 패치 사이즈(256x256)로 리사이즈 한 이미지 + 패치 이미지가 전체 이미지에서 차지하는 영역을 1 나머지를 0으로 한 마스크(256x256), 패치 이미지(256x256) 이렇게 7채널 입력을 가지고 학습시켜봤는데 27점 정도의 성능이 나왔습니다.

패치를 작게하고 패치 주변의 값들을 보충해주기 보다는 패치를 크게하는게 성능이 좋을 것 같다는 생각이 들어서 패치를 크게만들었는데 속도가 너무 느려서 이미지 크기를 줄이고 줄어든 이미지에서 패치를 뽑아내 학습시켰더니 29점 정도로 성능이 크게 올라갔습니다.

추가로 테스트 데이터셋의 이미지의 채널 별 평균, 분산 값과 학습 데이터셋 이미지의 채널 별 평균, 분산 값을 구해서 값이 유사한 이미지를 매칭하여 검증 데이터셋을 만들었는데 랜덤하게 추출한 검증셋보다는 정확했던 것 같습니다.

라미라미
2021.08.02 20:51

저는 pixel loss와 더불어 SRGAN 논문에 나온 content loss(vgg19 pretrainted model로 특성맵을 구한 후 MSE 적용)를 함께 적용해보았습니다.
대회를 진지하게 준비한건 이번이 처음이라 성능은 딱히 좋은 편은 아니었지만 다른 분들은 pixel loss 외에 어떤 loss를 적용해보셨는지 궁금하네요.