현실감각 0% :: '컴퓨터 관련' 카테고리의 글 목록 (9 Page)

컴퓨터 관련 2010. 10. 18. 16:29

벡터의 사영(projection)



사영(projection), 직교(orthogonal), 정규 직교(orthonormal)...
수업시간에 죽어라 들어도 잘 이해가 안가던것들이었는데 이 그림 한방으로 이해되었다.
머리가 원체 나빠서 그림으로 보여줘야 잘 이해함.-_-;


출처 : 패턴인식개론(개정판), page 50, 한빛미디어


별거 아니다. 사영이란 쉽게 말해 벡터 y를 벡터 x와 수직인 방향에서 올려다봤을때 보여지는 벡터 y라고나 할까.
즉 방향은 벡터 x와 동일하고 길이는 사영되어 나타난 값 (그림의 y'ux)만큼 되는 것이다.

그런데 여기서 y와 x의 내적이 0이 된다면? 쉬운 예로 x = |-2 2|, y = |2, 2| 이면 dot(x,y) = 0인데
이러한 경우는 그래프를 그려봐도 알겠지만 y가 x에 대해 수직이다.
즉 y'ux의 길이가 0이다. 이런경우를 직교(orthogonal)한다고 한다.

그리고 x와 y의 값이 동일할 때, 즉 |x| = |y| 인 직교이면서도 길이까지 같은 경우를 정규 직교(orthonormal)이라고 한다.

아 정말 개쉬운걸 가지고 고생했다.








컴퓨터 관련 2010. 4. 24. 17:30

3D 입체영상 구조의 이해



혹시 1980~1990년대에 학창시절을 보낸 사람들이면 누구나 한번쯤은 접해 보았을 매직아이를 기억하는가? 이렇듯 과거에도 3D 입체영상 기술은 존재하였다. 하지만 최근에는 스테레오 카메라 기술이 대폭 향상되었고 최근 아바타와 같은 입체영화, 3D TV의 개발 등으로 다시 큰 관심을 불러들이고 있다. 2010년 IT트랜드 TOP 10에도 포함되어 있을만큼 큰 관심을 불러오고 있는 3D 입체영상. 그 기본 원리와 간단한 제작 방법을 소개한다.



인간이 영상을 3차원으로 보는 원리

인간의 눈은 구조상으로만 본다면, 현대의 카메라와 똑같다. 아래 그림을 보면 알 수 있지만 눈의 주요 구조라 할 수 있는 망막, 수정체, 홍채의 역할은 각각 카메라의 필름(혹은 디지털카메라의 CCD), 렌즈, 조리개와 일치한다. 그런데 왜 사람은 영상을 3차원으로 볼 수 있는 반면에 카메라로 찍은 사진은 어디까지나 평면으로 보이는가? 뭐 고등학교 생물시간때 졸지 않은 사람들이라면 기억하고 있겠지만, 혹시라도 과학을 싫어했던 사람을 위해 그 이유를 말하자면 사람은 눈을 두개나 달고 있기 때문이다. 정말인지 아닌지 간단하게 측정할 수 있는 방법이 있다. 바로 한쪽 눈만 가지고 사물을 바라보는 것이다. 지금 한쪽 눈을 가리고 주변에 어느정도 거리가 떨어져 있는 사물(연필, 책, 컵 등)을 잡으려고 노력했을때 두 눈을 뜨고 있을때보다 쉽지 않다는 것을 느낄 것이다. 물론 몇십년간 뇌가 학습한 물체의 크기, 원근법과 눈의 미세한 떨림, 그림자 등 으로 어느정도의 깊이정보는 판단하기 때문에 완벽하게 평면으로 인지하지는 않겠지만 말이다.



그림1. 사람 눈과 사진기의 비교.(출처 : 두산동아 encyber 백과사전)

그럼 왜 눈이 두개일때 거리감을 알 수 있는 것인가? 뭐 이쪽에 대해 완벽하게 이해하기 위해서는 stereo vision이라든지, camera calibration 과목 등을 심도깊게 배워야 하겠지만, 전공한 사람 입장에서도 차원을 넘나드는 수학의 압박으로 인해 별로 상세하기 쓰기엔 무리가 있어 간단한 그림을 통해 이해하는 것을 목표로 하였다. 하지만 쓰다보면 분명 수식이나 수학적 기호가 나올것이다. 관심 없다면 그냥 '아 눈이 두개 붙어있어서 사람은 입체적으로 볼 수 있구나'라고만 이해하고 넘어가자.

예를 들어 사람의 두 눈이(혹은 스테레오카메라) 아래 그림 2와 물체의 한 점을 바라보고 있다고 가정하자.



그림2. 눈(또는 스테레오 카메라)의 기하학적 구조.(출처 : 강의자료-_-;)


그림 2는 물체에서 반사된 빛이 눈(또는 스테레오 카메라)에 들어오는 구조를 기하학적으로 표현한 것이다. 저는 고등학교 수학시간 이후로 기하학하고는 절교했어요 하는 분들을 위해 그림을 아래와 같이 좀 더 친근하게(?) 그려보았다.



그림 3. 그림 2를 좀 더 이쁘게(?) 그린 그림.(출처 : 내 손가락 노가다)


그림 2를 보면 dl, dr, L, f와 같은 뭔뜻인지 모를 변수들이 나열되어 있는것을 볼 수 있다. dl은 왼쪽눈의 망막 중심에서 상이 맺힌 곳까지의 거리를 의미하며, dr은 마찬가지로 오른쪽눈의 망막 중심에서 상이 맺힌 곳까지의 거리를 의미한다. 그림 3과 연계해서 본다면 dl은 바로 녹색선, dr은 파란색선의 길이라고 할 수 있다. L은 두 눈(망막) 중심간의 거리이다. 즉 그림 3의 빨간색 선이라고 할 수 있다. 마지막으로 f는 망막과 수정체 까지의 거리를 의미한다. 그림 3에서 황토색의 선을 의미한다.(귀찮아서 왼쪽눈에만 표시하였다.) 자 이 변수들을 왜 설명했나면, 바로 이 변수 4개만 있으면 해당 물체의 거리값을 산출해 낼 수 있기 때문이다. L과 f는 뭐 변함이 없으니 상수라고 해도 무난하다. 개인차는 있겠지만 L은 왼쪽눈의 중심과 오른쪽눈의 중심이니까 약 7cm정도 되고, f는 눈의 지름이니까 약 3cm 정도 된다. 그럼 변동하는 값인 진짜 변수는? 바로 dl과 dr뿐이 없다.


식 1. 거리값 산출 공식.(출처 : 강의자료-_-)

식 1의 dl과 dr, L과 f는 위에서 설명한 그대로이고, x는 바로 눈이 판단하는 물체의 거리값을 의미한다. L과 f는 뭐 위에서도 설명하였듯이 변동이 없고, dl과 dr만 변동이 있는데, 그림 3의 dl(녹색선)과 dr(파란색선)의 길이가 변동값을 의미한다. L과 f는 상수라고 봐도 상관없으니 각각 7cm와 3cm를 대입해서 21이 나왔고, 그림 3의 윗쪽 그림의 dl과 dr은 대충 길이를 보아하니 0.5cm와 1cm, 그리고 아랫쪽 그림의 dl과 dr은 1.5cm와 3cm로 가정하고 계산해보겠다. 윗쪽 그림의 눈으로 바라본 물체 거리값은 (21/1.5) = 14, 아랫쪽 그림의 눈으로 바라본 물체 거리값은 (21/4.5) = 4.666... 즉 윗쪽 물체가 아랫쪽 물체보다 눈으로부터 더 멀리 있다는 것을 수치를 통해 알 수 있다. 우리의 뇌는 눈으로부터 받은 데이터를 가지고 거리값을 쉬지도 않고 산출해내고 있다. 뇌의 주인이 아무리 수학을 싫어한다 해도 말이다. 얼마나 신기한가?ㅋ

아무튼 '왜 눈이 두개여야지 물체를 입체적으로 볼 수 있는가?'에 대한 설명은 여기까지. 이해하고 넘어가면 좋겠지만 뭐 수학이 싫으면 위에서 말했다시피 '눈이 두개라서 입체로 보이는구나'만 알고 넘어가자.



스테레오 비전 카메라

'그럼 카메라도 사람의 눈처럼 두개로 만들면 입체적으로 볼 수 있겠네?'라고 생각했다면 당신은 이미 3D 입체영상의 기본 구조에 대해 90% 이상 이해하였다고 볼 수 있다. 그래서 만들어진 것이 바로 스테레오 비전 카메라(이하 스테레오 카메라)이다. 그 형태는 여러가지가 있지만 보통 그림 4와 같이 두개의 렌즈를 달고 있는 카메라처럼 생겼다.



그림 4. 스테레오 카메라의 생김새

우리가 흔히 쓰는 카메라처럼 생긴 스테레오 카메라도 많이 있지만 솔찍히 이녀석은 별로 카메라처럼 생기진 않았다. 그래서 과거 스테레오 카메라에 대해 모를때에는 연구실에 굴러다니는 이녀석을 자 대신 사용했던 기억도... 보기보단 비싼 녀석이다.;; 아무튼 이녀석으로 사진을 찍으면 아래 그림 5와 같이 두장의 영상으로 산출된다.


그림 5. 스테레오 카메라로 찍은 미 국방부 사진(출처 : 곤잘레스 이미지 프로세싱)

이것은 저 카메라로 찍은 사진은 아니고 지금 스테레오 카메라보다는 좀 떨어지는 성능을 가지는 녀석으로 찍은 미 국방부 항공사진이다. '응? 이거 똑같은 사진 두장 아냐?'라고 생각하실지도 모르겠다. 혹시 매직아이가 되시는 분은 한번 매직아이로 이 두 사진을 보시라. 단순히 초첨을 흐릿하게 하는것으로 힘들면 사팔뜨기 신공을 발휘해도 좋다. 아무튼 그렇게 바라보면 펜타곤이 주변의 다른 땅들보다 튀어나와 보임을 알 수 있다. 이 사진은 좀 옛날거고 해상도도 낮아서 인터넷에서 구한 최근 사진을 밑에 함께 올려보았다. 아 저 여자분 누군지도 모르고, 어디서 구했는지도 몰라 출처를 표기 안했는데, 초상권이라든지 저작권 문제에 휘말리기 싫으니 혹여 관련있는 사람이라면 메일로 연락바랍니다.



그림 6. 스테레오 카메라로 찍은 사진(출처 : 인터넷 어디에선가...;)


아 눈아프다..; 아무튼 스테레오 카메라로 찍은 사진들을 매직아이로 보면 입체로 보인다는 것은 이제 모두 알았을 것이다. 그런데 매직아이는 옛날에나 사진을 입체로 보던 방법이라 눈아프고, 요즘에는(뭐 이방법도 오래되긴 마찬가지지만...) 두 영상을 각각 붉은값을 증가시키고, 푸른값을 증가시킨후에 하나로 합쳐 영상을 만든 후에, 붉은색과 푸른색을 차단하는 렌즈 각각을 부착한 안경으로 보는 방법을 많이 사용한다.
그림 7은 그림 6을 뽀샵을 이용해서 3D 영상용으로 만든 것이다.



그림 7. 그림 6을 이용하여 만든 3D 영상(출처 : 내 손가락 노가다)


집에 3D안경은 커녕 빨간색 파란색 셀로판지도 없어서 초점확인은 안했지만 뭐 만드는 방법은 대충 이렇다. 뽀샵을 기준해서 설명하자면, 스테레오 카메라로 찍은 사진 두장을 서로 다른 레이어층에 삽입하여 하나의 영상으로 만들고, 왼쪽 영상은 커브 등을 통해 붉은값을 증가시키고, 오른쪽 영상 역시 동일한 방법으로 푸른값을 증가시킨 후에, 투명도를 조절하여 두 영상을 하나로 만든다. 그다음에 세부조정을 통해 초점을 맞춰야 하는데 필자 같은 경우는 위에서 말했다시피 안경이 없어서 대충 그럴싸하게만 만들어 놓았다. 아무튼 이런식으로 만들어진 영상은 특수 안경을 사용하면 왼쪽눈에는 스테레오 카메라의 왼쪽 렌즈로 찍힌 영상만 보여지고, 오른쪽 눈에는 카메라의 오른쪽 렌즈로 찍힌 영상만 보여지기 때문에 입체로 느껴지게 된다.

사진의 한 부분을 필터링 하기에는 색상을 이용한 방법이 가장 쉽고 좋아 이런 방법을 사용하지만, 이 방법은 영상의 색상을 왜곡시키기 때문에 자연영상을 표현하기에는 조금 부적합하다. 하지만 사진이 아닌 TV등 발광을 통해 영상을 보여주는 기기에서는 해당 발광체의 빛의 종류라든지 파장 등을 다르게 해서 빛의 형태를 다르게 한다면, 편광필터 등 색의 왜곡 없이도 빛의 종류에 따라 효과적으로 차단하는 렌즈를 통해 충분히 자연색을 그대로 느끼면서도 3D로 영상을 볼 수 있을 것이다. 아 이미 그러한 기술이 있는지도 모르겠다. 전공이 전자 또는 광학쪽도 아닐 뿐더러, 아바타를 2D로 그냥 보는 바람에;;

아 그리고 마지막으로.. '그럼 흔히 쓰는 카메라로도 3D 영상을 만들수 있나?' 하는 의문을 가지신 분도 있을 것이다. 일단 그에 대한 대답은 '가능하다' 이다. 동일한 종류의 카메라 두대를 서로 거리를 두고 고정시켜 찍을수도 있고, 단순히 카메라 하나를 가지고 위치를 바꿔 영상을 찍는 방법으로도 생성할 수 있다. 하지만 초점을 동일하게 맞춰야 하는것과 같은 캘리브레이션 문제 등으로 인해 완벽하게 찍기란 힘들것이다. 스테레오 카메라가 괜히 비싼게 아닐테니 말이다.

아무튼 결론은 3D TV 나오면 사고싶다. 아바타 3D로 못본게 한이 되었음..ㅠㅠ



실수로, 혹은 제 무지로 인해 잘못된 내용이 있을 수 있습니다. 잘못된 내용이 있다면 연락주시면 바로 수정토록 하겠습니다.
그리고 질문받을 실력은 아니지만 혹시 질문 있으시면 이메일로 해주시기 바랍니다. 방명록에 해주시면 못봐서 짬되버리는 경우가 많아요.
chabert1@nate.com



컴퓨터 관련 2009. 9. 7. 20:19

MATLAB을 이용한 인공신경망(neural network) 소스



오일석씨가 지은 패턴인식 책 보고 완성.
Digital Image Processing과 Neural Networks for Pattern Recognition을 보며 신나게 해딩하던 차에 이런 좋은 한글책을 ^-^ 세종대왕 만세!!
귀찮아서 그냥 대충 코딩했기 때문에 최적화 뭐 이런거 하나도 안되어있음. 매트랩이란 녀석이 최적화한다고 속도가 엄청 빨라지는것도 아니고..ㅋ


학습값
I =
    0.8112    0.0193    0.0839    0.9748
    0.6513    0.2312    0.4035    0.1220
    0.2684    0.2578    0.3317    0.1522
    0.3480    0.1217    0.8842    0.0943
    0.9300    0.3990    0.0474    0.3424
    0.7360    0.7947    0.5449    0.6862
    0.8936    0.0548    0.3037    0.0462
    0.1955    0.7202    0.7218    0.8778
    0.5824    0.0707    0.9227    0.8004
    0.2859    0.5437    0.9848    0.7157

목적값
T =
     1     0     0
     1     0     1
     1     1     0
     0     0     0
     1     1     1
     0     0     1
     0     1     1
     0     1     1
     1     1     1
     1     1     1

입력층과 은닉층간의 가중치 u
u =
    0.9628   -1.0548   -1.4900    4.6783    0.3130    1.9933    4.3942    1.9676    0.0856   -1.4651    1.0196    0.1796    0.2629
   -3.6112   -0.8629   -0.5201   -0.9986    4.4307    1.1881   -3.1616    2.9116    0.9480   -1.5138    2.3744   -1.2099    0.0539
    2.4828   -0.1772    0.9085   -0.7226   -0.9081   -0.1228   -4.3781    3.3554    0.2269   -0.0148    3.1880   -0.5654   -0.1098
   -6.2477   -0.3111   -2.9886   -1.7098    1.8842    0.0702   -3.0357   -1.5709    0.1525   -0.2013   -2.1933   -0.6751    0.2851
    0.0799    0.6906    0.1948   -0.8849   -3.8720   -0.8651   -1.5374   -0.7111   -0.4327    0.9893    1.1455    0.7605    0.4394

은닉층과 출력층간의 가중치 v
v =
   -5.1439   -2.6505   -0.6496
    0.6622    0.9621   -1.2617
    0.0273   -1.7237   -1.9407
    1.7515   -3.6440    1.6147
   -4.5748   -2.1589    3.2406
   -0.7716   -1.4656    1.5587
   -1.5545    5.2279    0.7999
   -1.9958    1.5138    4.1915
   -0.8095   -0.1873    0.4061
    1.3743    1.2738   -1.5010
   -1.4723    2.6831    2.4242
    1.4935   -0.0126   -0.7687
    0.5689    0.3002   -1.2387

학습값을 그대로 이용하여 실험하였을때의 결과
output =
    0.9999    0.0009    0.0036
    0.9054    0.0471    0.9537
    0.9892    0.8976    0.0049
    0.0087    0.0011    0.0035
    0.9840    0.9504    0.9992
    0.0034   -0.0008    1.0000
    0.0082    0.8939    0.9774
    0.0152    0.9851    0.9980
    0.9970    0.9724    0.9415
    0.9000    0.9943    0.9848


귀찮아서 학습값을 실험데이터로 돌렸는데.. 뭐 결과는 나쁘지 않았다.
인터넷에 떠도는 인공신경망 소스들 대다수가 출력값이 1개만 제대로 나오는데 비해 3개를 하던 10개를 하던 만족할 만한 결과가 나왔으니 뭐...ㅋ

파일은 아래 첨부


파일설명
   nt : 인공신경망 트레이닝 함수.  ex : [u v] = nt(I, T);
   nr : 인공신경망 테스트 함수.  ex : output = nr(I, u, v);
   sig, sigp : 시그모이드 함수.