현재 0.1.4.15 에서 최대성능을 낼 수 있도록 마무리 하였습니다.
( 이미지 출처 : http://www.hankookilbo.com/v/ef6de8f4e946dce8da4863b38f94fabc )
이 프로그램은 아직 GUI 가 없는 개발중인 프로그램 이긴 합니다만, 원래 제가 만든게 아니라 Wang Shu 란 분의 github 로 부터 fork 해서 따로 제작중인 프로그램 입니다.
원본이 수년 전 부터 발전이 없다 보니, 제가 별도로 OpenMP 나 다른 GUI 등을 붙여서 만들기 위해 작업중인 프로그램 인데, 이 프로그램의 취지는 바로 리사이즈계의 끝판왕 Super Resolution 을 사용 합니다. ( 대신 정말 정말 느립니다 )
Super Resolution 은 https://en.wikipedia.org/wiki/Super-resolution_imaging 을 참조 하시면 될 듯 합니다.
소스는 현재 https://github.com/rageworx/SRCNN_OpenCV_GCC 에 공개 되어 있으나, bash 나 zsh ( 또는 oh-my-zsh ) 등을 쓰시면서 gcc 와 make, 그리고 OpenCV 에 대해 이해가 있으셔야 하는 제한이 있긴 합니다.
라이센스는 원작자가 LGPL 로 돌려 두었기에 저 역시 동일하게 LGPL 을 사용 중 입니다.
라이센스는 원작자rk GPLv2 로 올려 두었더군요, 그래서 동일하게 GPLv2 입니다.
다운로드는 Windows 에 한해 받으실 수 있도록 static build 를 제공 합니다. ( Windows 만의 독특한 구조 때문에 ... )
위치 : https://github.com/rageworx/SRCNN_OpenCV_GCC/releases
마지막 버젼이 현재 0.1.4.15 가 올라가 있으며, 256x256 이미지 2배 키우는데 약 8초 걸리는듯 합니다.
단, OpenCV 를 안쓰는 버젼은 현재 0.5 초가 걸리나, 해당 버젼은 따로 libsrcnn 으로 라이브러리로만 제공합니다.
다른 플랫폼 (POSIX) 에서는 소스를 내려 받아서 그냥 빌드 하시면 bin 안에 srcnn 이미지가 생기고 그냥 쓰시면 됩니다.
대신 apt-get 이나 pacman 등으로 opencv3 나 libopencv-dev 등을 먼저 시스템에 설치 하시고 빌드 해야 합니다.
현재 Windows 의 경우 OpenCV3.4.1 이 OpenMP 를 쓰도록 설정이 안되어 있는 듯 합니다. ( 모든 CPU 의 core 를 쓰지 않는 듯 합니다 ) -> 수정 됨
저해상도 이미지를 고해상도로 올려 보시고자 하시는 분들은 한번씩 써 보시기 바랍니다.
윈도우에서는 srcnn-static.exe 가 있는 위치에 이미지를 복사 해 두고, cmd 나 powershell 등으로 해당 위치로 이동 한 다음.
srcnn-static(.exe) --scale=(확대배율) (원본 파일 이름) ( 옵션: 출력 파일 이름, 없으면 원본파일 뒤에 _resized 가 붙어서 만들어짐 )
으로 이미지를 만드시면 됩니다.
아직 버그가 있을 수 있으므로, 관련 사항은 댓글등으로 남겨 주시고 ...
알고리즘상 정말 느립니다. 이건 제가 개선하는데 한계가 있을 듯 합니다 -> OpenMP 를 사용하도록 변경 되었습니다만, CPU 사용률이 낮아 좀 더 개선이 필요 합니다.
버그는 대부분 제거한 상태 이며, OpenMP 최소한으로 써서 최적의 상태로 만들긴 했습니다만, 다른 능력자분 계시면 source 개발에 참여 해 주세요. 이게 본업이 아니다 보니 짬짬히 시간 내다 보니 자세한 스케쥴링은 고려하지 못했습니다.
모공에 햇살씨 드라마에 여주인공 분을 고해상도로 만들고 싶다는 분의 글을 보고 나서 만들어 본거라 ... GUI 는 나중에 붙여 보겠습니다.
감사합니다.
=====
소스를 읽어보니 만들어놓은 kernel이 제일 중요한거였군여 -_ㅜ
엄청나게 느린데 또 CPU 코어를 잡아먹지는 않는군요...
배포해주신 버전이 OpenMP를 제대로 사용하는 건지 확인이 필요할 듯 합니다.
8스레드 CPU에서 점유율이 대략 12-13% 나오는데, OpenMP 안 쓰는 느낌이라서요.
https://github.com/rageworx/SRCNN_OpenCV_GCC/releases
하지만 속도 차이는 많이 나진 앖습니다.
(이전에 MIOHDR 를 보시면 이해가 가실 듯 .. 동일 소스로 다른 플랫폼 다 돌리기 위해 만들다 보니 그러 합니다)
간단하게 질문 좀 드려도 될까요? (아질게는 아니겠죠...)
1. 제가 이해하기로는 이미지를 Y/Cr/Cb로 재구성한 뒤에 각각을 bicubic interpolation으로 확대하고 여기에 다시 convolution 필터들을 적용한 뒤에 합친다... 로 이해했는데, 혹시 제가 맞게 이해한 건가요?
2. Convolution 알고리즘 쪽은 잘 모르지만, 코드를 읽어보니 전체적으로 Mat, vector를 사용하는 부분을 전통의(?) malloc()이나 new[]로 대체하면 좀 더 빠른 속도를 낼 수 있을 것 같습니다.
아주 마이너한 부분이지만 Convolution99( ) 함수 내의 tempRow, tempCol 계산은 좀 더 줄일 수도 있을 것 같네요.
전 그걸 fork 해서 조금씩 시간 날때 수정 중 입니다... 더욱이 원본 코드는 Matlab 을 쓰던 사람이 만든 것 입니다.
추후 OpenCV 관련은 다 제거할 예정이며, malloc/new 는 사실 의미 없다 보시면 됩니다. vector 를 resize() 해 놓고 쓰면 new 랑 같을 텐데요, 이건 의미 없다 보입니다.
나중에 한 1.0 되는 때 되면 제가 만든 다른 라이브러리들 처럼 OpenCV 는 필요 없을 걸로 예상 중 입니다... 끄때 되면 낮은해상도 이미지 보는 특정 뷰어로 쓰일 수 있어 보입니다. ㅎㅎㅎ
전 시간 나는대로 같은 알고리듬을 최적화해보겠습니다. 좋은 정보 다시 한번 감사드립니다.
ProcessSRCNN() 내에서 원본 이미지를 YCbCr로 변환한 뒤 BiCubic 리샘플 해서 imgResized를 생성하고,
ImgResized에서 convolution99()를 걸어서 imgConv1를 생성,
imgConv1에서 convolution11()를 걸어서 imgConv2를 생성,
imgConv2에서 convolution55()를 걸어서 imgConv3를 생성하는데,
다시 RGB로 변환하는 건 ImgResized일 뿐,
생성된 ImgConv1, ImgConv2, ImgConv3은 사용되지 않는 걸로 보입니다.
혹시 제가 뭘 놓친 걸까요?
그런데, conv3 결과를 따로 저장할 수 있어야 하는거 같군요... 이거 함수 인자를 변경 해야 할거 같습니다.
그런데 저장된 영상을 보니 어떤 용도인지는 모르겠군요 -_-;;
또한 Conv99-11-55 거치면서 소스내에서 src 이미지에 연산이 다들 들어가고 있긴 합니다.
각 과정을 보시고 싶으시면 libsrcnn 에서 Makefile.debugtest 로 빌드 하시면 내용을 볼 수는 있습니다만, fltk 와 fl_imgtk 가 필요 합니다.
Conv55()에서 사용하는 원본(src)는 Conv11()에서 만들어진 결과입니다.
Conv99()를 처리하는 부분 앞에서 (The First Layer 주석 앞) imgResized를 별도로 저장한 뒤에 최종 결과물과 비교해보시면 아마 동일한 이미지가 출력될 것입니다.
수학적인 영상처리 만으로 슈퍼레졸루션을 만드는 알고리즘은 없나요?
딥러닝 방식은 예술이나 엔터테인번트 쪽에선 좋지만
정밀측정과 같은 과학적 신뢰도가 필요한 뷴야에선
위험해서 말이죠...
궁금합니다!