라벨이 machine learning인 게시물 표시

opencv feature matching으로 월리 찾기 재도전

이미지
옛 추억을 되살리며 월리는 내가 찾아보기로 했다. 컴퓨터는 그냥 인식 할 수 있나만 보기로... 여기서 월리는 이런 모습을 하고 있었다. 내가 찾아봐도 잘 안보이는데 컴퓨터 따위가 잘 찾을 수 있을리가.... 위치는 잘 찾나 코드를 돌려보기로 했다. 아오 스벙 그래도 저 작대기들이 밀집되어 있는 곳에 월리가 있는 것은 사실이다. 근데 그래도 그렇지 이건 좀 너무하다. 다른 코드를 돌려보기로 했다.  SIFT 코드를 이용한 것이다. 결과는 다음와 같다.  웃어야할지 울어야할지 몰라 이제 놓아주기로 했다 월리는

opencv feature matching 으로 월리 찾기

이미지
Feature Matching은 두 사진의 공통점을 찾아내주는 건데, 뭘 예제로 하면 좋을까 하다가 월리를 찾아라 만한 예제는 또 없으리라는 생각에 돌려보았다. 코드는 다음과 같았다. 여기서도 오류는 있는지라, img3=cv2.drawMatches(img1,kp1,img2,kp2,matches[:10],None,flags=2) 코드로 바꿔줘야 했다. 앞번과 똑같은 오류인 걸 보니 버전 차이가 좀 있는 것 같다. 원본은 다음과 같고  결과는 다음과 같다 작아서 잘 안보이나 하겠지만 크게 보아도 별반 다를 거는 없이 그냥 망했다. 어제 애플 스토어를 방문하여 아이폰X를 보고 왔다. 희대의 얼굴인식을 시도해봤는데 고개를 돌리는대로 지문인식을 하듯이 얼굴을 읽는 모양새가 신기하였다만 opencv tutorial 에서 그 정도의 알고리즘을 기대하는 것은 무리였는가보다. 사진은 그냥 봤던거 자랑 ㅎ  PS. Sift 로도 월리를 찾아보았다. 크기와 상관없이 feature matching 을 가능하게 해주는 코드니까 좀 더 낫겠지 싶었다. .

opencv SIFT 망한 후기

이미지
뾰족한 연필도 가까이서 보면 뭉툭해진다는 걸 굳이 어떤 프로그래머가 생각해내서는 그렇게 사물이 확대가 되어도 모서리인지 아닌지 판단을 할 수 있게끔 새로 프로그램을 짰다고 한다. 근데 정말로 사람이 모서리인지 아닌지 판별할 수 없는 정도의 모습이라면 어떻게 프로그램이 판별을 할 수 있는 거지...? 언덕을 찍어서 코드를 돌려도 모서리라고 판별을 할 수 있는 정도인가? 설명에 따르면 이런 코드를 소개한 논문 원본이 워낙 쉽게 잘 쓰여 있어서 이를 설명하는 것은 그 논문을 요약하는 것이나 다름 없는 정도라는데 도대체 설명이 무슨 뜻인지 모르겠다. 이건 내가 초등학교 4학년 때 짜여진 코드인데, 그 당시 사람들이 썼던 코드를 대학교 4학년이 다 되어서도 이해하지 못한다니 괴롭다... 코드는 다음과 같다. 공식 사이트 tutorial에 나온 것과는 조금 다른게, cv2.drawKeypoionts(gray, kp,img)에서 새 번째 요소인 img 를 꼭 추가해 줘야 코드가 돌아간다. 어떻게 이런 오류를 업로드 할 수 있었는지 의문이다.  원본 사진은 어제 내가 갔다온ㅎ 홍콩의 익청맨션의 사진이다.  동그라미들이 다닥다닥 붙어있는 것은 알겠는데 대체 이걸로 뭘 하자는 건지는 모르겠다. 찍힌 것들을 보면 뭐 모서리에만 찍힌 것도 아니고, 형상을 잘 잡아내지도 못하는 것 같은데. 사실 이 코드가 'KeyPoints'를 잡아낸다고 하는데 뭘 보고 KeyPoints 라고 칭하는지도 잘 모른다.

opencv Harris Detector(모서리 탐지)

이미지
사물의 모서리를 탐지한다는 게 별다른 것은 없지만서도, 나름대로 사물의 경계를 탐지하는 데에 있어서는 중요하게 작용할 것이다. opencv 를 이용해 체스판의 모서리를 파악해보는 코드를 돌렸다 Harris Corner Detector 라고 하는데 1988년에 완성된 코드라고 한다. 지금에 와서는 분명히 더 많이 발전을 했을 텐데도 어떻게 모서리를 감지하는 것인지 신기하기만 하다 갈 길이 멀구나 하는 것을 단박에 느낄 수 있었다. 예제로 등록되어 있는 코드를 그대로 갖다 베낀 것인데(솔직히 제대로 돌아갈 거라는 기대조차 하지 않았다. 분명히 오류가 뜨겠거니 했었지..) 기가 맥히게 모서리를 잘 잡아내어서 놀랐다. 물론 융털처럼 되어 있는 바닥까지도 모서리로 판단하는 것은 어쩔 수 없지만.. 보다 좋은 모서리 탐지 코드가 있다길래 한 번 돌려보았다. 따로 이름이 있는 것은 아니고 harris detector를 좀 더 발전시킨 것인데, 사실 좀 더 잘 잡는 것인지 어쩐지는 잘 모르겠다. 그냥 Harris 탐지기가 모서리에 빨간 점을 다닥다닥 찍어 놓은 것과는 달리 개선된 코드는 깔끔하게 하나씩만 찍은 것이 마음에 들긴 하지만 막 다른 점이 있지는 않다. 원리가 어떤고 하니 다닥다닥 찍힌 점의 원심을 찾는 코드를 여러번 돌림으로써 점의 개수를 줄인다고 한다. 원심을 찾아나갈 수록 그것이 모서리에 가까워지는지 어쩐지는 확실하지 않다만 아마도 그렇기 때문에 코드를 그렇게 짰겠지.

AndrewNg 재개!

이미지
딴짓이 그리워지는 시험기간을 맞아 한 달만에 수업을 다시 들으려니 다 까먹었다. week 2의 과제를 남겨두고 그만둔 터라 상황이 심각했다. 결국 복습이 필요하다. 무엇보다도 이 cost function이 중요한 건데, 왜 2로 나눠주는지를 도통 모르겠어서 한참을 헤맸는데, 수학적 의미가 있는 것은 아니었다. Derivative term에서 차수 2가 내려오면 자연스럽게 사라지도록 하는 편의상의 기능을 할 뿐이란다 ㅂㄷㅂㄷ 새로운 세타값들을 찾아나가는 것까지는 기억이 나는데 그 방법이 아리송하다. 알파는 시행이 되는 속도를 말하는 것일테고, 각 점에서 내린 접선의 기울기를 빼주는 듯한데, 왜 그렇지?? 보아하니 예전에도 같은 의문을 가졌던 모양이다. 답은 위의 그래프를 위에서 바라봤을 때 찾을 수 있다. 강의에서도 이렇게 설명해줬다면 더 좋았을 듯 한데, J함수를 각 세타 변수로 편미분 해 주면, X자로 이어진 선의 한 단위의 방향이 등장하게 된다. 그 방향으로 알파만큼 곱해주어 각 세타변수에서 빼주게 된다면 다음 X자가 등장하는 것이다. 그렇게 단계단계 밟아간다면 최저점인 세타1로 도달한다는 것인데, 아직까지도 국소적 최저점인 세타0으로 도달하는 경우와 전역적 최저점 세타1로 도달하는 경우 둘을 구별할 수 있는지에 대한 의문은 남아있다. 과제로 나온 문제도 이런 방법들로 풀 수가 있다. 2번 문제는 Gradient Descent를 MatLab으로 표현하라는 문제인데, 문법만 익힌다면 문제없이 풀 수 있을 듯 하다. 먼저 cost function을 matlab으로 표현을 해야 하는데, 어려운 문법이 사용되는 것은 아니다. X, y, theta가 주어진 상황이므로 이들을 활용하여 차근차근 해결하면 된다. 문제에서 X와 theta 는 다음과 같이 설정되어 있다. X = [ones(m, 1), data(:,1)];  theta = zeros(2, 1);  X의 형식을 찾...

Andrew Ng 5일차-state space 모델링

이미지
직선을 다루는 선형대수학에서 이차 방정식 이상을 표현해 낼 수 있는 것은 state space 모델링이 존재하기 때문이다. 다시 말해 변수의 변수 x의 차수가 2 이상일 경우에는 x제곱, x 세제곱 등을 y 와 z 로 바꿔주는 방법으로 한 변수에 대한 이차 이상의 방정식을 두 개 이상의 변수에 대한 선형 방정식으로 바꿔주는 것이다. 물론 원래 변수 x 와 새로이 정의한 y z 사이의 관계에 대해서는 다시 언급을 해줘야 한다. 위에서 볼 수 있듯이 변수 size 의 차수가 2 이상인 경우에는 x(2) x(3)로 바꿔주었다. 이 경우에 size 와 x(2), x(3)의 관계는 과 같은 방식으로 정리될 수 있다. 나름 간단한데 문제를 풀라 그러면 늘 어렵다. 문제는 이런 것이다. 예측할 방정식을 2차로 할 경우에는 점선으로 표현된 바와 같이 밑으로 떨어질 것이다. 이런 것을 방지하기 위해 2차 방정식 대신에 제곱근을 활용하게 된다. (사실 size 가 무한정 갈 것도 아니고 범위를 지정해주는 것이 제일 맘편하긴 할텐데....또 예상치 못한 범위의 변수를 위해 제곱근 방식을 사용하는갑다) 이 때 선형이 아닌 변수들을 다른 변수들로 대체해 준다면 이런 꼴이 될텐데, 그렇다면 여기서 feature scaling을 사용했을 때 원래 변수 size 와 x(1), x(2)의 관계는 어떻게 될까??(1 < size <1000, ) 사실 뭐 볼 것도 없이 x(1)=size, x(2)=size^(1/2)가 될 것 같지만 보기로 제시된 것들 중에는 그게 없다. 지금보니 그냥 정답은 3번이다...그저께는 진짜 헷갈렸는데.... feature scaling 에 대한 이해가 부족했나보다 내가. 여기서 묻고자 하는 것은 사실 이 강의에서 주로 다루는 state space 모델링 중에서 size 와 x(1), x(2)의 관계가 아니라 그냥 지난 시간에 다뤘던 feature scaling을 얼마나...

Andrew Ng 4일차-mean normalization과 feature scaling 헷갈린다

이미지
이제 보니 mean normalization과 feature scaling이 다른 것이었다...?! 강의에서는 mean normalization에 대한 설명을 잘 해주지 않았다. 그저 feature scaling 에 대한 설명만 있었을 뿐. 그저 내가 아는 단어인 mean normalization을 보고 흥분하여 freidberg 책을 들춰본 셈이다. 하지만 궁극적인 목표는 '보다 쉽고 빠른 예측'으로 똑같다고 볼 수 있을 테다. feature scaling 이란 단순히, 해당 데이터에서 데이터의 평균을 뺀 후에 데이터의 범위로 나누어 준 값이다. 이렇게 한다면 새로이 정의된 데이터 x(i)들은 일정 범위 내에서 존재하게 될 것이다. -1과 1 사이일 것이라는 생각이 강하게 들지만 꼭 그러리라는 보장은 없다. 또한 위에서 말하는, Θ값이 작은 범위에서는 빠르게 작아지고 큰 범위에서는 느리게 작아지기 때문에 불필요하게 불균일한 범위들로 이루어진 경우에는 진동하게 될 것이라는 말도 사실 무슨 말인지 잘 모르겠다. 문장 간 주어 서술어 관계가 모호한 것인지, 내 지식이 모자라 주어 서술어 사이를 채워 넣을 수가 없는 것인지 헷갈린다. 후자라는 생각이 강하게 들지만 꼭 그러리라는 보장은 없다.

Andrew Ng 3일차-Friedberg 교재 활용

이미지
2주차 강의부터는 본격적으로 선형대수학의 내용이 나온다. 계수 벡터들을 활용하여 벡터곱을 통해 그래프를 만들어내는 것인데, 내가 지난 학기에 피땀눈물 흘려가며 B0를 받아내야만 했던 이창우 교수님의 선형대수학을 떠올리게 만들었다. 그래 학점이 뭐가 중요하랴 공부한 것이 얼마나 남느냐가 중요한거지... 그래서 지난학기 선대 강의시간에 활용했던 Friedberg's Linear Algebra 를 활용하여 공부를 병행하기로 했다. 강의에서도 설명을 해주긴 한다만 교재와 함께라면 수업시간을 통해 습득하였던 선대의 큰그림을 계속해서 상기할 수 있을 듯 하다. 여기서 나오는 mean normalization을 보고 선대 교재를 봐야겠다 빡 느낌이 왔다. 지난 학기 수업 시간에는 간단하게 언급하고 넘어갔던 내용으로 기억하지만 내가 분명히 이 방법을 쓰면 굉장히 편리하겠다! 생각을 했었다. friedberg 교재에서 mean normalization 은 최소자승법을 설명하는 부분에서 등장하였다. 최소자승법이란 우리가 배우고 있듯이 실제데이터를 직선화하여 예측하는 모델을 뜻하는데 least sqares approximation 이라는 영어 이름이 좀 더 직관적으로 다가올 것이다. J를 최소로 하는 세타 값들을 찾는 것이므로 최소자승법이라는 이름이 붙었다. 실제 데이터 y 값들에 대응하는 Θt+Θ들은 행렬의 곱으로 표현이 가능하다. 데이터의 개수 m 에 대해 의 형태로 (m x 1)크기의 행렬이 탄생하게 되는 것이다. 여기까지는 기본적인 내용이지만 이제부터 왜 mean normalization 이 중요한지를 확인하려면 선형대수학의 기본부터 차근차근 다시 이해해야 할 것 같다. 알고보니 최소자승법이 굉장히 복잡한 문제였다. 하긴 여러개의 데이터 사이를 잇는 최적의 선을 하나의 수식으로 만들어 내는데 간단할 것이라고 생각하는게 잘못이었다...

Andrew Ng 2일차-만만치 않은, 기반 다지기

이미지
gradient descent 란 한 지점에서 기울기가 가장 가파른 지점을 찾아서 그 방향으로 이동하는 것이었다.   이것이 J의 극점, 나름의 최저점을 찾는 방법이다. J가 뭔지조차 생각이 안나는듯 하지만, 간신히 실제 데이터와 예측값의 차이를 뜻한다는 사실을 상기시킬 수 있었다. 그 방향을 찾는 방법은 예상외로 간단하지만서도 직관적으로 와닿지가 않아서 애를 좀 먹고 있다. 한 지점에서 접선을 그렸을 때, 접선과 수직인 방향이 가장 기울기가 가파른 방향이 되는 것인데, 왜일까?!  물론 위 그림과 같이 입체모형에서의 접선을 그었을 경우에는 그 방향이 가장 가파른 방향이 되는 것이 맞다. 그것이 접선의 정의이니까. 하지만 세타0과 세타1에 대해서 각각 편미분을 해주었을때 나오는 값은 입체상에서의 접선(세타0과 세타 1의 값에 따른 J값의 변화량)이 아니라 등고선 상에서의 접선, 즉 세타0이 변함에 따라 세타1이 얼마나 바뀌는지를 알려주는 값이 될 것이다.  강의 자료에 따르면 접선의 방향이 J의 편미분값에 따른다고 되어 있다. 내가 편미분의 정의를 헷갈린 모양이다. J를 세타0에 대해 편미분했을 때 세타0이 향하는 방향이 정해지고, 세타1에 대해 편미분했을 때 세타1의 방향이 정해지는 것이 맞을 것이다.  저 위의 그림에서 각 점 사이의 거리를 별로 중요하게 생각하지 않았는데 learning rate라고 해서 나름대로 중요한 parameter가 되는 듯하다. (식에서는 알파로 표시되었다) 따지자면 다음 단계를 밟는 속도라고 생각하면 될 듯하다. 강의에서는 J가 극점으로 감에 따라서 우변의 우항이 0으로 수렴하므로 자연스레 세타값이 수렴한다고 설명하고 있는데, J가 극점으로 가는 것이 결국엔 세타값이 수렴하는 것이므로 이상한 논리적 오류를 범한게 아닌가 싶다. ...

Andrew Ng1일차-강의 내용 습득 망한 후기

이미지
착오가 있었다. 수강신청을 다시하는 개념이 아니라 그냥 기한 갱신이었다. 오해할 뻔했네. 근데 기한이 갱신 된 채로 강의를 이어 들으려고 하다 보니 도대체가 무슨 말인지 이해하기가 어렵다. 그래서 지난 강의의 스크립트를 보고 다시 이해하려고 한다. 1. 머신러닝의 정의 A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E. 수행해야 하는 업무 T와 그것을 수행하는 경험 E, 해당 업무 수행 능력의 퀄리티 P가 있을 때 E가 늘어남에따라 P 역시 늘어나는 것을 머신러닝이라고 한다. 다시 말해 일을 수행하면 할수록 능력이 좋아지는 것, 업무 수행에 있어서 노하우가 축적되는 것을 머신러닝이라고 한다. 2. Cost Function 머신러닝을 활용하여 예측 프로그램을 짜려는 것이 이 강의의 목적인가본데, 추정 함수와 데이터들이 얼마나 잘 맞아 떨어지는 지를 Cost Function을 통해서 확인한다고 한다. 이 꼴을 Cost Function 이라고 하는데, 잘 확인해 보면 고등학생 때 배운 '분산'의 꼴을 하고 있는 듯 하다. 이제는 분산도 잘 기억이 나지 않지만.... 예측값과 데이터를 1대1로 대응시켰을 때 그 둘의 차이를 제곱한 것을 총 개수의 두배로 나누어 준 것인데, 왜 총 개수로 나눠주지 않고 두배를 해서 나눠주는 것일까?! 다시 보니까 헷갈린다. 으으음...편미분을 했을 때, 1/2m 이 1/m 이 되니까 편의상 1/2m 으로 했다고 하는데, 그렇다면 이 Cost Function 자체가 중요한 것이 아니라 이 함수를 편미분한 값이 중요할 것이라고 예측할 수 있겠다. 또한 이 강의는...