본문 바로가기

내가 작업한 것들/소프트웨어

고성능 신경망 Super-Resolution Image library - libsrcnn 소개

libsrcnn 은?

 libsrcnn 은 POSIX 를 포함한 Windows 에서도 DLL 로 사용이 가능 하도록 제공되는 오픈소스 라이브러리로서, Super-Resolution Imaging 을 OpenCV 와 같은 별도의 라이브러리를 사용하지 않고도 쓸 수 있도록 설계되고 만들어진 신경망이 적용된 고성능 엔진 입니다.

 초창기는 ShuWang 의 오픈소스로 부터 시작하여, OpenCV 에서 발생하는 여러 낮은 성능과, Multi-thread 를 이용하지 못하는 단점등을 모두 보완한 프로젝트로서, 현존 이미지 복호처리 중 가장 띄어난 결과를 보여 주는 알고리즘이라 하겠습니다.

 본 라이브러리는 ShuWang 의 오픈소스로 부터 기반을 하여 GCC, LLVM, CLANG 등으로 POSIX 에서 문제 없이 구동되도록 만들어 졌습니다.


Super-Resolution Convoluitional Neural Networks

 libsrcnn 은 위의 Super Resolution Convolutional Neural Network 를 기반으로 만들어 졌으며, 다음과 같은 일반적인 resize 엔진과의 차이가 있습니다.

 먼저 원본 이미지는 ShuWang 의 오픈소스에 있던 bufferfly_GT 로 부터 시작하며, 크기는 256x256 을 가지는 RGB 이미지 입니다.

보통 Super-Resolution 관련 논문등에서 가장 많이 등장하는 나비의 이미지로, 여러 변화를 주었을때 그 차이를 알아내기 쉬운 장점이 아마 플레이보이 모델이었던 '레나' 와 비슷하게 쓰이는 대상이 아닌가 합니다.

이분이 그 '레나'

먼저 위의 나비 이미지를 2배 ( 면적은 4배 ) 씩 키운 이미지를 각기 다른 resize algorithm 으로 완성을 시키면, 다음 순서로 이미지 차이를 볼 수 있습니다. ( 자세히 보시려면 클릭하여 크게 보시기 바랍니다 )

NearestBiLinearBiCubic

각기 다른 방법으로 크기가 조정된 이미지들은 알고리즘에 따라 신호의 세기가 변하는 부분들에서 그 품질의 차이가 발생하고, 이를 SRCNN 으로 처리된 이미지들과 비교 해 보면 원본대비 영상의 신호가 얼마나 왜곡이 되는지 알 수 있게 됩니다.

SRCNN

그래서 각기 SRCNN 으로 복호화 된 이미지인 위 한장의 나비사진을 대상으로 각기 다른 데이터들과 비교를 해 보면 다음과 같이 차이를 알 수 있게 됩니다.

nearest 와 SRCNN 차이

biLinear 와 SRCNN 차

BiCubic 과 SRCNN 차이

특징을 보면 Nearest 와 BiLinear 는 원본대비 신호의 세기가 많이 변하는 각 edge 라 불리는 부분들이 크게 변화가 발생 하는 반면, BiCubic 과 같은 경우는 신호 전체가 차이가 발생 할 만큼, 눈에는 보이지 않지만 신호의 왜곡이 발생 하는 것을 알 수 있습니다.

 원본이 가지는 낮은 해상도의 신호에서 이를 최대한 유지하면서 크기를 조정할 수 있는 SRCNN 은 이런 이유로 매우 느리지만 가장 좋은 품질의 이미지 결과를 얻을 수 있습니다.


그럼 얼마나 느린가?

 이쯤 되면 SRCNN 을 처리하는데 얼마나 느린가? 란 의문이 들 만도 합니다만, 아래의 간단한 결과들만 봐도 libsrcnn 이 매우 느린걸 엄청나게 빠르게 만들어 놨구나! 라는걸 알 수 있을 겁니다.

 먼저 원래 OpenCV 를 이용해서 만든 SRCNN 성능은 다음과 같습니다. 실험을 한 PC 는 Windows 10 에 Intel i7-7700 CPU 를 사용하는 데스크탑 이었습니다. 위 작업에 사용된 나비 이미지를 2배로 키우는 작업을 진행 하는데 걸린 시간을 각기 측정 하였습니다.

기본 SRCNN 성능

OpenMP 를 쓰도록 개선한 SRCNN 의 성능

원래 SRCNN 성능은 정말 보잘것 없는 정도 였는데, 256x256 짜리 이미지를 512x512 로 바꾸는데 걸리는 시간이 무려 11초 였습니다. 하지만 이를 여러 CPU core 를 모두 쓰도록 만들어서 구현하면 ... 2.8초가 됩니다. 거의 4배에 가까운 차이 입니다. 하지만, 이 성능도 사실은 OpenCV 의 태생적 문제로 인한 느린 구조로 만족 할 수 없는 수준이라 이를 C++ 로만 구현한 libsrcnn 은 다음과 같은 성능을 가집니다.

11초에서 2.8초 ... 그리고 0.5초. 원래 소스대비 22배의 성능 향상이라 하겠습니다. 심지어 OpenMP 를 쓰도록 했던 것에 비하면 거의 5배 입니다.


소스코드 및 다운로드

 libsrcnn 은 다음 위치에서 소스코드 및, 다운로드 등이 가능 합니다, 단 릴리즈는 소스코드 특성상 Windows DLL 만 따로 올리고 있으며, Linux 나 MacOSX 등은 소스를 내려받거나, clone 을 해서 빌드한 다음 사용하시는 것을 권장 드립니다.