AI 기술을 여기 참가하면서 처음 접하게 되어 기술적인 용어를 잘 모르는지라, 요상한 용어가 나오더라도 양해를 구합니다.
저는 base line 이 제시한 auto encoder 모델을 계속 개량해나가는 방식으로 접근했습니다. 다른 모델에 대한 지식이 없으니, 주어진 도구를 최대한 잘 활용하는 것이 최선이라고 생각했습니다.
따라서 simulation의 depth map 이미지와 sem 이미지만을 주로 활용하게 되었네요. train 데이터는 아래에 또 기술하겠으나 해당 데이터를 추가하면서 큰 효과를 보지는 못했습니다. 다만 train 데이터를 활용하는 모델을 작성하면서 재미는 있었네요 :)
1.baseline의 auto encoder 모델을 그대로 사용
- 개인 컴퓨터로는 연산능력의 한계가 있으므로 baseline 코드를 그대로 작동시켜도 basline보다 상당히 떨어지는 결과를 얻었습니다. (public score 약 9.4)
- Auto encoder의 bottleneck 부분이 너무 좁아져 표현력이 떨어지는지 여부도 고민을 했었습니다. 이부분은 계속 적절한 값을 찾으려고 노력해보고는 있는데 잘 안되네요.
2.전처리(threshold)된 이미지를 auto encoder model에 전달
- 사용자 정의 dataset 구현을 통해 데이터를 로딩할때 threshold값으로 배경과 hole 영역을 분리했습니다. 분리한 2개의 이미지는 (2,72,48) 형태로 합쳐져서 auto encoder에 전달됩니다
- 전달된 (2,72,48) 이미지는 2*72*48-> 1024 ->. .. -> bottle neck(128) -> ... -> 1024 -> 72*48 의 레이어들을 통과하도록 구성하였습니다. 지금도 이 구조에서 큰 차이는 없는 것 같네요.
- threshold 값이 부적절했는지, 혹은 분리한 이미지의 빈공간이 어색했는지 점수는 상당히 좋지않았습니다. (public score약 30) 그러나 hole과 배경을 구분하여 모델에 전달한다는 아이디어 자체는 괜찮았던 것 같아서, 계속 유지하게 됩니다.
3.background와 hole 영역의 구분
- 계속 진행중에 있는 사안으로, 초기에는 ostu method를 활용한 threshold를 활용해보기도 했고, watershed 알고리즘, cv2의 findcontours를 위시한 외곽선 검출방법등을 활용해보았으나 썩 맘에 들지 않았습니다.
- 최종적으로는 sem이미지를 또다른 auto encoder 모델에 넣고, 해당 sem 이미지의 짝이 되는 depth map 이미지에서 가장 높은 값으로 구성된 (72,48)의 이미지를 재구축하도록 하는 방식을 사용하게 되었습니다.
- 주어진 이미지에서 배경 이미지를 추출하는 auto encoder를 한번 거치고, 여기서 나온 배경 이미지와 sem 이미지의 차를 구하면 상당히 온전한 hole 영상을 얻게 됩니다.

[model을 통해 hole 부분만 추출한 사례 : background 이미지와 sem 이미지의 차를 계산하여 주변부가 검게 보임]
4.잘 안됐지만 시도해본 방법들
- cross entropy loss를 활용한 배경 값(140,150,160,170)의 선택 모델을 추가 -> 괜찮은 방법이라고 생각했으나 적절한 모델을 구축하지 못한듯 싶습니다. simulation 데이터를 기준으로는 거의 99%의 정확도로 맞추었으나 train dataset의 배경을 예측한 결과 150,160 사이가 애매하게 선택되어 별 재미를 보지는 못했습니다( public score 약 6.3)

[train set depth 130을 입력하여 모델이 배경 픽셀 값을 예측한 결과]
- convolution auto encoder로 모델 변경 -> 적절한 모델을 구축하지 못한 점도 있었으나, 컴퓨터 성능상 학습시간도 오래걸리고 배치 갯수도 제한되어 좋지 못한 결과로 끝났습니다.(public score 약10.5) 순위권에 계신 분중에 cnn을 사용하여 좋은 성적을 거두시는 분이 계신다면 추후에 어떤 방식을 사용하셨는지 보고싶네요.
- denoising auto encoder -> 일부 모델에는 가우시안 노이즈를 넣었는데, 약간의 성능 향상은 있었던 것 같습니다. 운이 없었는지 우연인지 점수가 가장 좋았던 모델은 가우시안 노이즈를 넣지 않았던 모델이네요.
- gaussian filter -> "statistics" 님의 이미지 처리 예제에서 적용한 gaussian filter 를 일부 모델에 적용해보았습니다. 입력 이미지의 노이즈가 엄청나게 줄어드는 효과가 있습니다...만 제가 짜놓은 모델과의 궁합은 좋지 못했습니다. 이 노이즈 감소 효과는 "배가 고파졌다"님이 추천한 prism palette를 사용해보면 굉장히 뚜렷하게 볼 수 있습니다.
- train data를 모델 학습시 제2의 loss 값으로 활용 -> train set의 average depth의 의미가 각 이미지들의 최대 깊이의 평균을 의미하는 것으로 추정되어 train set의 site별로 평균 이미지를 만들어 auto encoder에 넣어보았습니다. 해당 이미지의 최대깊이(최저 5% 픽셀값 평균)와 ground truth를 비교하여 loss값에 더하는 식으로 train set의 값을 모델에 반영해보고자 했으나 결과는 그저 그랬습니다.(public score 약6.5) 다만 모델 하나에 2가지의 데이터셋을 넣고, loss값을 추가로 넣는 등의 작업은 처음 해보는 일이라 그런지 매우 즐거운 일이었습니다 :)
5.분석기법
- 토크게시판에 올려놓은 방법으로 시뮬레이션 데이터를 모델에 넣어 얻은 결과를 한번 훑어보는 편입니다.
- 특정 이미지나 값의 전체적인 분포는 histogram을 통해 파악하는 편입니다. (plt.hist 가 아주 좋습니다)
- 이미지 뷰어를 2개 켜놓고 모델 입력 전후의 이미지를 함께 확인합니다. 모델 수정에 따라서 전후의 양상이 변하는 경향성이 종종 보여서, 구식의 번거로운 방법이지만 자주 활용하고 있습니다.(honeyview 활용중)
그림은 별로 없고 재미 없는 글만 가득하네요. 초보자라 이것저것 해 본 것에 비해서 거둔 성적은 조금 민망하지만, 어느 누군가에게라도 인사이트를 제공할 수 있었으면 좋겠습니다.
시간이 얼마 남지 않았지만 다들 좋은 결과 있으시길 바랍니다.