Implementation Overview
이번 과제 연구B를 하면서 가장 어려웠던 점은 지금까지 연구된 Watermark를 분석하는 것이었다. 과제 연구A와 주제가 바뀌어서 시간이 짧았던 이유도 있지만, 과제 연구 B의 어려웠던 점은 과제의 성격 때문이었던 것 같다. 과제연구 A에서는 아직 시도되지 않은 것을 나름대로 생각해 구현하는 것이었기 때문에, 조그만 아이디어도 결과물이 될 수 있었다. 하지만 이번 과제 연구는 지금 까지 구현된 Watermark의 다양한 시도를 살펴보고, watermark의 핵심이 무엇일까? 그리고 그 핵심적인 것에 나의 생각을 어떻게 덧붙일 수 있을까? 하는 고민이 구현보다 몇 배나 되었던 것 같다.
먼저 전체적인 구현의 흐름을 이해하기 위해, 앞에서 요약한 watermark의 과정의 분석을 하고자 한다. 진행 정도의 watermark에 있는 내용을 간단히 요약하면서 watermark 의 핵심사항을 어디까지 그대로 이용할 것인지 그리고, 어떤 부분을 다르게 구현할 것인지를 설명하는 하겠다. 그리고, 나름대로 생각했었던 고민들을 적어보고자 한다.
2D 이미지에 watermark를 넣기 위해서는 2D 이미지의 분석이 필요한데 2D 이미지의 분석에는 여러가지 방법이 사용될 수 있다. 대표적인 예로 spartial domain을 frequency domain으로 보내는 fourier transformation과 최근 각광을 받고 있는 wavelet이 있다. 처음에는 연구의 방향을 fourier transformation으로 잡았는데 도중에wavelet으로 방향을 바꾸게 되었다. 바꾸게 된 이유와 wavelet으로 분석을 하므로써 얻을 수 있는 이득에 대해 설명할 것이다.
마지막으로 matlab을 이용하여 구현한 부분에 대해 설명할 것인데, matlab을 사용하게 된 이유를 간단히 설명하고, 구현의 알고리즘과 함께 matlab을 이용하여 나온 이미지의 캡쳐를 통해 워터마킹이 어느 정도 구현되었는지를 결론내리고, 보완점을 짚어보도록 하겠다.
획기적인 결과가 나오지는 않았지만 과제 연구를 하는 동안 처음 방향과는 다르게 컴퓨터 그래픽스의 전반적인 많은 것들을 공부할 수 있었고, 그래픽에 대한 상당한 흥미를 얻었다. 과제 연구를 지도해 주신 이승용 교수님과 강민수 (컴퓨터 그래픽스랩 박사과정) 형께 진심으로 감사의 말씀을 전하고 싶다.
How can I approach to the Watermark?
지금까지 watermark에 대한 연구물들을 토대로 watermark는 한마디로 무엇일까? 그리고 watermark의 기술을 발전시키기 위한 핵심적인 사항은 무엇일까?를 한 학기 동안 고민해서 한 얻은 결론을 간단히 기술하겠다.
현재 2D watermark 연구방향은 pertubation이라고 할 수 있고, watermark 기술을 발전시키기 위해서는 원본 data를 분석하여 중요한 data가 무엇인지를 알아 내야 한다.
위와 같은 주장을 할 수 있게 된 이유를 watermark의 요약과 함께 설명하겠다.
앞에서 논문 내용을 정리하였듯이 watermark는 눈에 보이면 지우거나 가공하여 훼손시킬 수 있다. 그래서 watermark는 눈에 보이지 않아야 한다. 그리고, signal process, geometric distortions 에 대해서 견고해야 한다. 견고하다는 말을 달리표현하면 이미지의 형체를 알아볼 수 있는 범위내에서는 watermark가 살아 있어야 한다는 뜻이다. 다른 부수적 특징들도 있지만 이 두가지는 watermark의 생명과 같은 특징들이다.
위의 두 조건을 만족시키는 솔루션은 첫째 견고하기 위해서 중요한 data에 watermark를 넣는다. 이를 통해 중요한 data가 변형되지 않아 원본을 알아볼 수 있을 경우에는 watermark가 살아있게 하는 것이다. 중요한 data가 변형되어 다른 이미지가 되었다면 watermark의 역할인 소유권 확인과 같은 필요성이 없어진다. 둘째 watermark를 눈에 보이지 않고, clipping과 같은 processing으로 없어지지 않게 하기 위해 골고루 퍼트리는 것이다. 골고루 퍼트린다는 것으로는 표현이 부족하지만 아무튼 중요한 data에 watermark를 넣되 사람이 인식하지 못할 미세한 정도로 특정 부분에만 넣지 않고, 골고루 퍼트려야 한다는 것이다. 이를 위해서 spartial domain에서 watermark를 넣는 것보다 frequency domain에서 넣는 것이 바람직한데 frequency domain에서 watermark를 넣을 경우 사람이 인식할 확률이 적고, watermark가 골고루 퍼지게 된다.
위의 이유를 들어, 주장한 것이 타당하다고 동의할지는 모르지만 지금까지 연구의 진행 방향으로 볼 때, watermark는 frequency-domain-oriented , 중요한 부분 분석-oriented라는 것만은 부인할 수 없을 것이다. 더 자세한 내용은 watermark를 설명한 부분을 참조하길 바란다.
처음에는 spartial domain에의 접근을 심각하게 고려하였다. 연구되지 않은 쪽으로 무언가를 시도해 보고자 하는 일종의 호기심이었는데, 자칫 watermark의 생명을 잃은 연구가 되지 않을까 싶어 frequency domain으로 마음을 굳혔다. 즉, 기본적으로 watermark 연구를 위한 방향은 많은 사람들이 걷고 있는 방향을 그대로 따르기로 한 것이다.
다음으로 watermark Insertion과 Extraction을 어떤 방향으로 설정하였는지 결정한 부분을 설명하고자 한다. 기본적인 방향을 정했을 때, watermark를 삽입하는 process와 watermark를 확인하는 process를 독자적으로 구현해보고 싶었다. 그래서 원본 이미지 없이 watermark를 확인하는 방식으로 한 번 시도해 볼까? 아니면 watermark를 빠르게 수행하는 알고리즘을 구현해 볼까? 하는 고민을 하였다. 그러나 이 고민도 watermark의 핵심이 되는 부분이 아니라고 생각했다. 그래서 이미지에 중요한 part를 찾는 부분에 더 치중하고자 워터마크 프로세스의 기본 골격은 참고란의 'Wavelet-based digital image watermarking' 에 나온 골격을 그대로 유지하기로 하였다. 이 부분에 대해서 간단히 설명하고, 2D 이미지를 분석하는 부분으로 넘어가겠다.
위의 그림은 watermark를 삽입하는 과정 을 보여준다. DWT라는 것은 이미지를 분석하기 위해 Digital wavelet transform을 한다는 것이다. 각각의 항목에 대한 설명은 뒤에서 차차 설명하겠고, 여기서는 process의 전반적인 흐름만 설명하고자 한다. DWT에 의해 wavelet form으로 변형이 되면 변형된 wavelet 각각의 subband에 대해 어떤 서브 벤드가 가장 의미 있는 data를 많이 가지고 있는지를 조사한다. 이는 이미지 분석 파트에서 설명할 것이다. 중요한 부분을 많이 가지고 있는 부분을 찾으면 찾은 subband에 water mark를 넣게 되는데 이 부분은 factor를 곱하는 형식으로 하게 될 것이다. 즉 watermark sequence라는 factor의 sequence로 부터 subband에서 찾은 분산값을 적용하여 삽입될 watermark의 크기를 조절하고, subband에 해당하는 계수와 함께 곱하여 원본 이미지에 더해지게 된다.
위의 그림은 이미지에서 watermark를 꺼내는 프로세스이다. 이미지에 들어간 watermark를 찾는 과정으로 여기 필요한 것들은 watermark sequency, 즉 중요한 subband 부터 차례로 곱해진 factor와 원본 이미지, 그리고 watermark가 저장되어 있는 이미지이다. 원본 이미지를 DWT을 거쳐서 wavelet form으로 만든다. 그리고, watermark가 삽입되어 있는 Attacked Image도 DWT를 거쳐 wavelet form으로 만든다. 두 wavelet form을 비교하여 차를 계산하면 Attacked Image의 wavelet form은 watermark만 남계된다. 이 watermark는 원본이미지로 부터 계산된 watermark와 서로 비교될 수 있다.
전체적인 process를 개괄적으로 설명했는데, 구현부분은 아래에서 자세히 설명할 것이다.
Image Analysis
이부분은 wavelet form으로 변형된 이미지에서 우리가 인식할 때 중요한 부분을 많이 포함하는 subband를 찾는 과정에 대한 설명 이다. wavelet form에서 각각의 subband는 frequency domain이다. 각각의 subband를 비교하여 그 곳에 water mark를 넣는 것은 frequency domain에다가 watermark를 넣는 것을 의미한다.
Watermark가 포함되어야 할 subband를 찾는 것을 얼마나 잘 하느냐는 사람이 인식할 때 중요한 부분을 얼마나 잘 찾느냐와 같은 의미이다. 그래서 이 프로세스를 하기전에 wavelet form에 대한 언급을 잠시 하고자 한다.
위의 처음 이미지는 wavelet으로 변형전의 이미지 이다. 그리고, 두번째의 이미지는 변형 후의 이미지이다. wavelet form으로 변형에 궁금하신 분은 wavelet 메뉴를 참고하시길 바라고 여기서는 wavelet form의 분석만을 해 보겠다. 우선 위의 그림은 3단계의 wavelet을 적용한 결과이다. 그래서 wavelet form image를 1/4로 나누고 나눈 부분의 좌측 상단을 다시 1/4로 나누고, 다시 1/4로 나누어 생각해 보겠다. 가장 작은 좌측 상단의 1/4를 살펴보면 이부분이 가장 원본 이미지와 유사하다는 것을 느낄수 있을 것이다. 그 이유는 Harr bases wavelet은 평균값으로 절반씩 작아지기 때문이다. 위의 이미지는 3단계를 통한 것이므로 가로 세로 각각 2^3 = 8 만큼 작아졌다. 그래서 이미지는 8^2 = 64 배로 줄어든 것을 알 수 있다.
단계가 작아질수록 점점 원본 이미지와 거리가 멀다는 사실을 알 수 있을 것이다. subband에서의 이미지 모습은 edge detection과 비슷하다는 사실을 관찰할 수 있는데 그 이유는 Harr bases wavelet을 이해하면 쉽게 알 수 있을 것이다. 평균에 대한 detail 값은 평균에서 값들이 많이 차이 날수록 커지는데, 이와 같은 부분이 edge라고 말할 수 있다. 이는 edge를 detect 할때의 sobel mask와 흡사한 결과를 가져온다고 볼수 있다. 즉 근처의 값들이 유사할 경우 값은 작고, 근처의 값들과 많은 차이가 날 경우 값이 커진다.
그럼 다시 본론으로 돌아오자. 위에서 설명한 wavelet의 특성으로부터 어떻게 subband에서 watermark를 넣는데 중요하게 여겨지는 값들을 찾을 수 있을까?
wavelet에 대해서 설명하였듯이 각각의 subband는 edge의 분포와 비슷하다. 이를 검증하기 위해 각각의 subband에서의 값들을 수치적으로 분석하였다. 그랬더니 대부분 작은 값들이고, 특정부분들만 큰값인데, 이는 edge와 비슷한 분포를 가졌다. 따라서 watermark도 edge 분포와 비슷하게 넣기로 결정했는데, 다음과 같은 mask를 이용해서, 주위 pixel들에 가중치를 적용한 다음에 결과값이 특정 수치 이상의 pixel에만 watermark를 넣도록 하였다.
0.025 0.025 0.025 0.025 0.025
0.025 0.08 0.08 0.08 0.025
0.025 0.08 0.2 0.08 0.025
0.025 0.08 0.08 0.08 0.025
0.025 0.025 0.025 0.025 0.025
위의 마스크를 이용할 경우 주위 값들과 smooth를 시키는 것인가 착각할 수 있는데, 마스크를 사용해 값을 치환한다는 것이 아니다. 마스크의 가중치로 값을 계산하면, 주위의 분포에 따라 결과를 얻을 수 있는데, 주위의 값들이 클 경우 그 pixel의 값도 커지게 된다. 이는 사실상 mask를 이용해 mopology 비슷한 결과를 얻는 noise제거 기법과 비슷 하다. 마스크를 이용해 중요한 곳만을 남긴 wavelet form은 다음과 같다.
Watermark를 넣을 곳을 결정하는 두가지 기준 중 하나는 wavelet 자체 특성에 있고, 두번째는 subband에 있다. 첫번째의 기준은 wavelet 으로 바꾼 후의 subband image가 edge detection 비슷하게 나타난다면, edge 같은 값들 중에서 정말 edge를 찾고, 작은 값들을 noise로 간주한다는 내용이다. 즉 edge를 찾듯이 각각의 subband를 검사하여, 특정값 이상의 값들에만 watermark를 넣자는 것이다. 이를 통해서 watermark가 정말 중요한 부분에만 들어가게 되면서 이미지의 변형을 최소화하고자 한 것이다. 그럼 두 번째의 기준인 subband는 어떻게 결정할 것인가?
subband를 결정하기 위해서 wavelet 각각의 subband에 분산을 구하였다. 위의 이미지의 경우에 분산의 그림은 아래와 같았다.
위의 분산 table 에서 1은 wavelet 3단계의 average에 해당하는 것이고, 2는 3단계의 horizontal에 해당하는 것이다. 3은 3단계의 vertical에, 4는 3단계의 detail에 해당한다. 3단계에서 분산값이 큰데 이는 이 subband들에서 값들이 실제 이미지와 유사하게 다양한 값들이 골고루 분포하기 때문이다. 5는 wavelet 2단계의 horizontal, 6은 2단계의 vertical, 7은 2단계의 detail에 해당한다. 2단계의 분산값은 3단계에 비할 때 detail에 해당하므로 3단계의 wavelet 보다 분산값이 적다. 8은 wavelet 1단계의 horizontal, 9은 1단계의 vertical, 10은 1단계의 detail에 해당한다. 1단계는 가장 detail한 값들이므로 역시 분산이 가장 적다.
위의 분산분포에 따라 나름대로 어느 곳에 watermark를 넣어야 할지를 결정해야 하는데, watermark를 넣을 곳은 4군데로 정했다. 그 이유는 watermark를 각각의 subband에다가 넣을 경우 값의 증폭이 심해져 watermark가 보이기 때문이다. 4군데는 물론 분산값이 큰 곳이어야 한다. 분산이 큰 값일 수록 그 곳의 data가 실제 이미지와 유사하고, 사람들이 인식하도록 다양한 값들이 분포된 값들이기 때문이다. wavelet의 특성상 각각의 subband는 단계별로 detail한 값을 나타내므로 resolution에 각각 watermark를 넣도록 하였다. 그래서 선택된 subband는 1, 3, 6, 9 이다. 즉 3단계의 average와 vertical, 그리고, 남은 두 단계의 vertical을 선택하였다.
위의 과정을 통해 wavelet에 watermark를 넣은 후의 모습은 다음과 같다.
Watermarking Insertion
Watermarking Extraction이미지 분석에서 어느 부분에 watermark를 넣을지를 찾는 과정을 설명하였다. 즉 watermakr insertion의 중요한 대부분이 image analysis에서 설명된 셈이나 다름없다. 여기서는 어떤 watermark를 넣을지에 대해 설명하고, watermark의 특성을 살펴보도록 하겠다.
위의 그림은 wavelet form에 watermark를 넣은 그림인데, watermark는 여러가지 정보가 될수 있다. 위에서는 단순한 계수의 나열을 watermark로 간주하였다. 그 이유는 어떤 data라도 결국 binary 형식의 data로 저장되고 그 data를 숫자로 생각하면 결국 watermark의 data는 계수가 되기 때문이다. watermark로 삽입되는 data는 자신의 고유성을 나타내는 것으로 어떤 data의 수치도 상관없다. 그러나 0을 계수로 사용할 경우, watermark는 삽입되지 않은 것이나 다름없기 때문에 0이 아닌 계수를 생각해야 될 것이다.
Watermark를 넣을 때 어느 정도의 factor를 곱해 원본 이미지를 pertubation시켜야 하는지 결정해야 하는데, factor의 값이 클수록 watermark를 detect하기 쉽다. 그러나 factor의 값이 지나치게 클 경우에는 이미지의 손상이 예상된다. 그래서 이런 문제점을 해결하기 위해서, watermark를 pertubation 시킬 때, 이미지의 손상이 되지 않을 정도의 계수로 한번 더 곱해주는 방법을 취하였다. 그리하여, watermark는 어느 정도의 한계내에서 결정된다.
Watermark를 Insertion하는 것은 두 부분으로 나뉘는데, 첫번째 image 분석의 측면은 위에서 설명되었고, 두번째 watermark로 어떤 data를, 그리고 어느 정도의 값으로 넣을지는 실험적인 test를 많이 필요로 한다. 물론 결과물을 출력하기 위해서 code에서는 많은 test를 거쳐 얻은 값들을 사용하였다. 이런 계수들을 결정하여 얻은 최종 watermarked된 이미지는 다음과 같다.
(좌:원본, 우:Watermark inserted)
이미지에 들어간 watermark를 찾는 과정에서 필요한 것들로는 watermark sequence, 원본 이미지, 그리고 Attack된 이미지이다. 원본 이미지를 DWT을 거쳐서 wavelet form으로 만든다. 그리고, watermark가 삽입되어 있는 Attacked Image도 DWT를 거쳐 wavelet form으로 만든다. 두 wavelet form을 비교하여 차를 계산하면 Attacked Image의 wavelet form은 watermark만 남계된다. 이 watermark는 원본이미지로 부터 계산된 watermark와 서로 비교하는 것이 watermark를 찾아 비교하는 process이다. 앞에서 설명한 것을 다시 한번 remind시켰는데, 여기서는 필요로 하는 세부요소들을 설명하고자 한다.
두 wavelet form을 비교하여 얻은 watermark와 원본이미지로 부터 계산된 watermark의 비교를 하여야 한다고 했는데, 그럼 어떻게 두 watermark의 유사도를 비교 할 수 있을까? 사실 이부분은 watermark를 넣은 것 못지 않게 중요한 부분이다. 왜냐하면 watermark를 아무리 잘 넣었다고 하더라도 꺼내서 비교하는 부분이 제대로 되지 않는 다면 넣은 watermark는 무형지물 이기 때문이다.
결론 부터 얘기하자면 watermark의 유사도는 Wavelet-based digital image watermarking에 있는 유사도 식을 이용하였다. 물론 이부분을 달리하여 새로운 유사도 측정 방법을 만들 수 있겠지만, watermarking 기법의 검증을 확실히 하고자 기존의 방식을 그대로 사용하였다.
유사도 측정의 수치는 Normal distribution에서 비롯되는데, 두 개의 watermark 차이가 distribution 분포로 볼 때, 얼만큼 떨어져 있느냐를 확률적으로 측정하였다고 볼 수 있다. 두 watermark가 distribution 분포상 많이 떨어져 있으면 다르다고 보고, 가까이 있으면 같은 것으로 측정하였다.
출처 : http://home.postech.ac.kr/%7Enhkwak/class/CG/cs499B/src/progress_implementation.html