• Tistory
    • 태그
    • 위치로그
    • 방명록
    • 관리자
    • 글쓰기
Carousel 01
Carousel 02
Previous Next

'전공관련/실습 프로그램'에 해당되는 글 4건

  • 2013.06.14 Gender Classification
  • 2013.04.17 Canny Edge 구현 1
  • 2013.04.16 웹캠을 이용한 가위바위보 게임 18
  • 2013.04.16 Skin Color Detection에 적합한 Color Model 을 찾기위한 간단한 실험

Gender Classification

전공관련/실습 프로그램 2013. 6. 14. 11:39




대학원 생활 첫학기... 


학기 Term Project로 주어진 성별인식기.. 막막하지.. 막막하더라.. ㅋㅋ 


가뜩이나 과목도 내수준에 안맞는걸 잘못 선택해서 힘들어 죽을뻔.. ㅋㅋ 


이거 하면서 공부 그래도 조금은 한듯 하다.. 


코딩 방법도 그렇고.. 이론적으로도 그렇고.. ㅋ 


처음에는 LBP + SVM 을 이용하여 시도했는데 인식률이 그닥..


두번째. MCT + SVM 이건 처음보다 조금 낫긴한데 그래도 별로다.. ㅋ 


논문을 찾아보다 LGDP 라 이름붙인 방법을 찾았다..


이건 Gabor Filter + LDP 인데 지금까지 성별 인식 쪽에서는 가장 성능이 좋은것 같다.


뭐 아래 사진이 구현한 프로그램의 모습이다..


Open 버튼으로 Training Set 과 Test Set 을 불러오고..


Learning & Classify 버튼으로 학습 및 판별을 한다..


이때 SVM 은 SVM light 를 사용했다..



Gabor 필터는 어떤거냐하믄.. 아래와 같은 사진에 .. 그밑에 커널을 생성하여 필터링 한 것이다..


커널 생성이 Gabor 필터의 핵심인듯하다.. 


나는 저 커널을 생성할때 각도를 0, 45, 90, 135 이렇게 네개로 나누고


Lambda 를 30, 40 이 두개 선택해서 총 8개의 커널을 생성했다.


이외에도 커널 사이즈는 27, sigma 는 10 뭐 이런거 있는데 


이런 값들은 다 노가다로 테스트 해가면서 내가 사용하고자하는 Set 에 맞는 


실험값을 정한 것이다..




여튼 저 사진을 위와같은 커널로 필터링 하면 아래와 같이 이미지가 바뀐다.


이제 저 이미지를 가지고 LDP 방식으로 피쳐를 뽑아내는 것이다..



아래 두장은 다른 파라미터는 같고 Lambda 값만 바꾼 사진.. 


약간씩 모양이 다르게 나타난다.




한장의 사진으로 8개의 이미지를 생성하고 


그 하나의 이미지에서 4096( 64 by 64 ) 개의 피쳐를 사용하니..


총 사용한 Feature 갯수는 음.. 4096 * 8 * 200 = 6556300 개... ㅋ 무식하게 많다..


PCA를 이용하여 피쳐 개수를 줄이면 된다고 하는데.. 중요한건 그걸 할줄 모른다..


시간이 없는 관계로 저거 그냥 무식하게 다 때려넣고... 돌리는거다 ㅋㅋ 


이렇게 200개의 이미지를 트레이닝 하고 100장의 이미지를 테스트 하면.. 


놀랍게도 얘는 인식률이 96프로나 나온다.. ㅋㅋ 


뭐... 이미지가 몽땅 FERET DB 에서 나온거고.. 얼굴 위치가 거의다 맞춰져 있으니까.. 


이런 제한 조건이니까 이정도 나오는거겠찌.. 만 ㅋㅋ 다른거에 비해 LGDP 성능 괜찮은거 같다..


이렇게 테스트돌리면 얘도 한장당 8개의 결과가 나오는데.. 


뭐 이 여덟개의 결과값을 다 더해서 . 


0보다 크면 남자 작으면 여자.. 로 판별했다..



이런거 참 신기하면서 어렵고 재밋으면서 짜증나고.. ㅋㅋ 그런 분야다..


더 많이 배우고싶다..


저작자표시 (새창열림)

'전공관련 > 실습 프로그램' 카테고리의 다른 글

Canny Edge 구현  (1) 2013.04.17
웹캠을 이용한 가위바위보 게임  (18) 2013.04.16
Skin Color Detection에 적합한 Color Model 을 찾기위한 간단한 실험  (0) 2013.04.16
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

Canny Edge 구현

전공관련/실습 프로그램 2013. 4. 17. 13:39




Canny Edge Detection.


Canny Edge는 이름 그대로 1986년에 John F Canny 에 의해 개발된 Edge 검출 알고리즘이다.


캐니엣지검출 알고리즘은 크게 다섯가지 단계로 구성되어 있다.


1. 블러링을 통한 노이즈 제거

2. 마스크를 이용한 엣지 검출

3. Non-Maximum Value 제거

4. Double Threshold 로 크기 구분

5. 엣지 연결


일반적으로는 OpenCV 에서 함수로 제공하고 있지만 영상의 이해를 위해 공부하는 차원에서 

직접 구현해 보기로 했다.




영상관련된 분야로 넘어와서 제일 먼저 했던 프로그램인지라 다이얼로그에 사진도 띄우지 못하고 기본적인

OpenCV 의 함수만을 사용하다보니 모양이 위와같이 나왔다.

ListBox에서 사진을 선택할 수 있고, 하단의 버틀을 누를때마다 새로운 윈도우를 띄워서 결과 영상을 보여준다.



제일먼저 연산에 사용할 이미지를 불러온다.

영상은 Gray Scale 로 변환하여 불러오게 된다.





불러온 이미지에 블러링을 통하여 노이즈를 감소시킨다.

논문에서 사용된 것과 마찬가지로 가우시안 블러를 사용하였고



위와 같은 5 X 5 마스크를 컨벌루션 연산을 통해 구하였다.






다음은 소벨 마스크를 이용하여 전체적인 엣지를 구하는데 이또한 OpenCV 함수를 사용하지 않고


위와 같은 마스크를 콘벌루션 연산을 통해 각각 Magnitude 와 Phase 값을 구하였다.


이때 Magnitude는 계산을 간단히 하기위해 x축 데이터와 y축 데이터의 절대값의 합으로 구하였고

Phase는 arctan 함수를 이용하여 구하였다.

phase는 45도 단위로 범위를 나눠서 총 네가지 경우로 분류를 하였다.





그다음은 위에서 Sobel Operation 을 통해 얻은 외곽선에서 Non-Maximum Value 를 구분해 내야 한다

방법은 여러가지가 있겠지만 이번 실험에서는 Phase 방향의 앞 뒤 픽셀의 데이터를 비교하는 방식으로 Non-Maximum Value 를 찾았다.


Phase 방향의 앞 뒤 픽셀이 모두 255의 값을 가지면 그 픽셀은 Non-Maximum value 로 살려두고 

전후 두 픽셀중 하나라도 0의 값을 가지면 그 픽셀은 값은 0으로 바꿔주게 된다.




다음 단계는 위의 사진처럼 검출된 엣지를 크기에 따라 세 단계로 구분해야한다. 

위의 단계에서 살아남은 데이터들을 Double Threshold 를 이용하여 세 단계로 구분을 한다.

Low Threshold 보다 낮은 Magnitude를 가지는 픽셀은 엣지가 아니라 판단하고 0으로 버리고 

Low Threshold 와 High Threshold 사이의 값은 엣지인지 아닌지 판별이 필요한 값으로 두고 128의 값으로 

High Threshold 이상의 값은 확실한 엣지로 판단하고 255의 값을 가지게 한다.


이후 128의 값을 가지는 픽셀들을 Blob 방식으로 따라가다가 255의 값을 가지는 Edge를 만나게 되면 그 따라온 픽셀들은

실제 엣지라 판단을 내리고 그 크기를 255로 바꿔주고,

반대의 경우로 따라가다가 실제 강한 Edge를 만나지 못하고 끝나버릴 경우 그 픽셀은 Edge 가 아니라 판단하고 

크기를 0으로 치환해 주게 된다.


이와 같은 연산을 영상 전체 영역에 대하여 수행하게 되면 실제 엣지와 연결된 엣지들은 살아남고

엣지와 연결되지 않은 애매한 값들은 제거된다. 



이렇게 얻는 영상이 Canny Algorithm 으로 구한 Edge 가 된다.


Lenna 영상에 LowThreshold 15, HighThreshold 60을 주고 연산한 Edge영상은 다음과 같다.



OpenCv에 구현된 케니 엣지 연산의 결과와는 다소 차이가 있지만 다른 마스크를 통한 엣지 검출에 비해 

상당히 만족스러운 결과를 볼 수 있었다.


결과의 차이는 OpenCV 에서 구현한 Canny Detection 단계에서 뭔가 가공된 연산이 있지 않을까.. 하는 생각을하고

Canny Edge Detection 프로그램은 여기서 마친다.


저작자표시 (새창열림)

'전공관련 > 실습 프로그램' 카테고리의 다른 글

Gender Classification  (0) 2013.06.14
웹캠을 이용한 가위바위보 게임  (18) 2013.04.16
Skin Color Detection에 적합한 Color Model 을 찾기위한 간단한 실험  (0) 2013.04.16
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

웹캠을 이용한 가위바위보 게임

전공관련/실습 프로그램 2013. 4. 16. 18:36






캠을 이용한 가위바위보 게임


=====================================================================================================================================


영상처리 공부를 하면서 처음으로 만든 공부를 위한 가위바위보 게임.


처음 목적은 손을 정면으로 인식하는것이 아니라 측면에서 인식해서 손가락 갯수를 파악하여 주먹 가위 보 를 판별하려 했었다.

그러나 진행중에 본의 아니게 방향을 전환하여 가위바위보 를 실제로 하듯이 구현하는 것으로 목표를 바꾸었다.


처음에는 디버깅하면서 구현하기 편하도록 인터페이스 신경쓰지않고 딱 딱 보이도록 구현 해 보았다. 

아래의 사진이 개발용 프로그램의 모습니다.



알고리즘에 대해 설명을 하자면 가장먼저 캠으로 영상을 받아들인다.

그 영상에서 얼굴영역을 찾고 그 열굴 영역 내부의 Cb Cr 값의 평균을 구한다.


이렇게 구한 평균 Cb Cr 값을 이용해 위아래로 적다한 범위를 늘려서 Skin Color 의 범위를 설정한다. 

범위 내의 값을 가진 픽셀은 255로 나머지 픽셀은 0으로 이진화를 하고 모폴로지 연산을 한번 수행해준다.


이때에 얼굴은 평균 피부색값을 찾기위해서만 사용되므로 평균 값을 구한 후에는 그 영역에 사각형을 그려줌으로써

이후 연산에서 얼굴 영역이 나타나지 않도록 가려준다.


이런 과정을 거치면 다음과 같은 영상을 얻을 수 있다.



Skin Color 의 boundary를 좀 더 늘리면 손 모양이 명확하게 나오겠지만 다른 노이즈들도 함께 심해지므로

적당한 범위로 설정 해 준다. 


이후 위 영상의 결과를 레이블링 해서 각각의 덩어리로 구분 한 뒤 손 영역의 레이블만을 남겨두고 나머지 레이블된 영상은

모두 0값을 대입해 줌으로써 주변 노이즈를 제거한 손 영역만을 얻어 낼 수 있다.



위와 같은 연산 결과로 얻어낸 손 영역의 영상이다. 손 군데군데 구멍이 뻥뻥 뚫려 있긴 하지만

 이정도 결과로도 결과가 잘 나오길래 그냥 뒀다.. 사실 귀찮고,, 어렵다.. ㅎ 초보의 패기..


자 저 손 영역에서 어떤 특징을 뽑아내야 가위바위보를 판단할 수 있을까..

히스토그램을 이용하여 구분 가능할 것 같다는 교수님의 말씀을 듣고 히스토그램을 만들어 보았다.

가위바위보를 판별해야하므로 손영상의 세로방향을 히스토그램의 X 축으로

손영상의 가로방향 255값을 가지는 픽셀의 수를 히스토그램의 Y축 데이터로 사용하여 히스토그램을 그리면 



대략 이런 형태로 나오게 된다. 


이 히스토그램을 어떻게 이용하느냐... 하는것은 나는 일단 저 영역을 3개로 구분하여서 평균값을 구하였다.

좌측 1/3 영역의 평균 픽셀수. 가운데1/3 영역의 평균 픽셀수, 우측 1/3 영역의 평균 픽셀 수를 구하여서 그 데이터를 이용하기로 했다.




매 프레임마다 얻을수 있는 평균 픽셀의 수이다. 

이 세구간의 평균 픽셀 수를 이용하여 각각의 비율과 손 영역 폭과 높이의 비 등의 정보를 이용하여

손의 상태가 주먹인지, 가위인지, 보 인지를 판별하게 된다.


기본적인 알고리즘은 이상과 같고 

이것 외에도 얼굴 인식부분에서 뒤에 여러사람이 있을경우를 대비해서 가장 앞의 한사람의 얼굴만 이용하는 것과

오른손잡이 왼손잡이 용으로 구분하여 반대영역에 손이 들어왔을 경우를 미리 차단하였고

점수 카운트 기능과 음성출력 기능을 추가하였다.


이렇게 만들어 본 프로그램이 어느정도 성능을 보여줘서 

인터페이스까지 신경을 쓴 릴리즈용 프로그램을 만들었다.


사용자의 모습은 보여야하므로 320 x 240 사이즈의 출력 창을 하나 가지고 그외의 정보 (히스토그램, 얼굴,손 영역) 은 표시하지 않는다

구동부는 실제 가위바위보 게임기와 비슷한 디자인을 가지고 있고, 게임 시작버튼은 동전 투입구 이미지를 덧씌워서 

좀더 게임기 스럽게 만들어 보았다.


나중에 좀더 공부하고 나서 다른 방법을 추가해서 인식률을 높이는 작업을 해 봐야겠다.





실제 시연 동영상




저작자표시 (새창열림)

'전공관련 > 실습 프로그램' 카테고리의 다른 글

Gender Classification  (0) 2013.06.14
Canny Edge 구현  (1) 2013.04.17
Skin Color Detection에 적합한 Color Model 을 찾기위한 간단한 실험  (0) 2013.04.16
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,

Skin Color Detection에 적합한 Color Model 을 찾기위한 간단한 실험

전공관련/실습 프로그램 2013. 4. 16. 15:32




공부하기위한 프로그램을 만들다 보니 Skin Color Detection 이 필요해서 Skin Color 에 대하 조사를 해 보니 대부분이 YCbCr 모델이 

피부색 검출에 적합하다고 얘기는 하나 이와 다른 컬러모델과의 비교된 실험이나 근거가 없어서 이에대한 간단한 실험을 해 보았다


이 실험은 개인적으로 비교를 위한 간단히 수행된 실험이며 실험에 사용된 데이터의 양이 적고, 실험 조건이 제한적인 상태에서 비교한 것이므로 객관적 비교가 될 수 없고 단지 어떤 양상으로 나오는지 비교 확인만을 위한 참고자료 일 뿐이다. 


실험에 사용된 Color Model은 RGB, Normalized RGB, YIQ, HSV, YCbCr 다섯가지 컬러모델이 사용되었고 

2차 실험에서 화이트밸런싱된 RGB와 이를 통한 Normalized RGb 모델 두가지가 추가되어 총 7가지 컬러모델에 대한 비교가 이루어 졌다.


RGB모델은 OpenCV 의 IplImage에 capture된 이미지를 저장하여 그대로 사용하였고 HSV, YCbCr 모델은 cvCvtColor 함수를 통해

컬러 공간변환을 통해 그 데이터를 그대로 이용하였다.

Normalized RGB는 R, G, B 값을 각각 총합(R+G+B) 으로 나눠준 값을 0~ 255 범위로 정규화 하여 사용하였고 

YIQ 모델은 다음의 식을 이용하여 그 크기를 구하였다.

Y = 0.299R + 0.578G + 0.114B / I = 0.6R - 0.28G - 0.32B / Q = 0.21R - 0.52G + 0.31B 


실험 환경은 먼저 하드웨어의 경우는 노트북에 내장된 Cam 하나와 Logitech 사의 Quick Cam Pro 9000 모델 그리고 

동일한 Logitech 사의 Quick Cam Orbit/Sphere MP 모델 총 세가지 카메라가 사용되었으며 


실험장소와 각 장소별 밝기는 내자리(230Lux), 회의실 테이블(770Lux), 창가(1720Lux), 회의실 구석(45Lux) 네가지 장소에서 테스트를 

수행하였다.


각 장소별로 캠과의 거리, 얼굴 각도 등을 달리하며 10회의 촬영을 했고 결과 비교에는 10회의 평균 값을 이용하여 비교를 했다.


데이터 테이블에 사용된 I 는 내장카메라, y 는 Pro9000, yy 는 orbit/sphere MP 모델을 의미한다.





위 두 사진은 동일한 카메라를 이용하요 조도를 달리하며 비교한 데이터 테이블과 그 결과 그래프이다. 

전반적으로 NRGB 모델과 CbCr 그리고 YIQ의 Q 와 HSV의 H 가 표준편차가 전반적으로 낮게 측정 되었다.





그리고 위 두 사진은 동일한 조도에서 캠을 바꿔가며 실험한 결과를 비교한 테이블과 그래프이다.

위 결과와 유사하게 NRGB 모델과 Q, H 그리고 CbCr 모델이 다른 Color Model에 비해 낮은 표준편차를 보여줬다.


이 실험과 더불어 피부색과 유사한 종이박스도 같이 촬영을 하여 그 값을 비교 실험 해 보았는데

NRGB 와 CbCr 의 경우에서 보여지는 종이 박스와 Skin Color의 차이가

Q 모델의 차이보다 두배 정도의 차이를 보이며 비슷한 색상의 Object와의 구분하는 능력이 뛰어남을 알 수 있었다.


위의 실험들로 미루어 볼때 Skin Color 검출에는 NRGB 모델과 CbCr 모델이 다른 색상에 비해 

조명변화에 조금 더 강인하고 하드웨어적 영향을 적게 받는 색상 모델이라고 생각 할 수 있겠다.


1차 실험 후에 추가적으로 다른분들의 조언을 받아서 몇가지 실험을 더 해 보았다.


화이트 밸런싱을 하고나면 기존의 RGB 값과 형태가 전혀 다르게 나올수 있어서 결과가 달라질수 있다. 

하드웨어의 차이가 이 화이트밸런싱 정도의 차이일 수가 있다는 조언을 듣고 화이트 밸런싱을 한 후에 비교하는 실험과

실제 Normalized RGB 모델을 통해 피부검출이 아닌 얼굴 요소 검출에 사용 적합한 모델이 어떤것인지 비교하는 실험이었다.





위 세장의 사진은 차례대로 Normalized RGB 모델을 Gray Scale 로 출력한 사진이다.

이전 실험에서는 수치로 표현된 값만으로 비교를 해서 NRGB_G 값이 표준편차가 낮아서 매우 유용한 데이터라고 생각을 했었는데

실제로 화면에 출력된 결과를 보이 Skin Color 검출에 유용한 데이터라기보다는 촬영 환경에서 프래임 전체가 비슷한 값을 

가지게 되면서 표준편차가 낮게 측정 됐던 것이었다. 모두 유사한 값이 나와버리니 이는 SkinColor에 사용하기에는 

부적합한 모델인 것 같다. 




위 두 그래프를 보면 입력받은 RGB 데이터와 화이트밸런싱을 거친 RGB 영상의 값을 비교해놓은 그래프이다

위의 그래프는 22개의 값을 일괄 비교한 그래프이고 아래 그래프는 RGB 와 WRGB 의 평균값만을 비교한 것이다.

화이트 밸런싱을 통해 RGB 의 형태가 확연히 달라질수도 있을 것이라는 염려와는 달리 실제 그래프의 형상은 

조도나 하드웨어에 따라 위아래로 그 크기의 차이는 존재하지만 전체적인 그래프의 형태는 달라지지 않았다.


이를 통해 화이트 밸런싱은 SkinColor 검출 단계에서는 크게 영향을 미치지 않는다고 생각해도 될 것 같다.



마지막 표는 NRGB , CbCr 그리고 WNRGB 모델값을 이용하여

얼굴 내부영역의 평군값과 각 얼굴 요소들의 평균값의 차를 비교해 둔 데이터 테이블이다.

이는 얼굴 요소 검출에 사용될 모델을 비교하기 위한 실험으로 

각 요소별로 차이가 크게 날수록 얼굴의 특징이 뚜렷하다는 의미이므로 차이가 클수록 유용한 데이터라 할 수 있겠다.


위 실험만을 봤을 경우에는 NRGB_R 모델과 YCbCr_Cr 모델이 얼굴 전체영역과 각 요소간의 차이가 다른 모델보다 

뚜렷하여 얼굴 요소 검출에 보다 유용하다고 판단 된다.


최종적으로 나만의 결론을 내리자면 

Skin Color 를 검출하고 할 경우에는 NRGB_R, NRGB_B, YCbCr_Cb, YCbCr_Cb 이상 네가지 모델을 적절하게

이용하여 검출하고,

얼굴 요소를 검출 할 경우에는 NRGB_R 모델과 YCbCr_Cr을 이용하여 검출하는 것이 적절한 선택이 아닐까 하는것이 

나만의 결론이다. 




PS. OpenCV의 YCbCr 에 사용된 변환 비율도 YIQ의 Y 과 같던데.. 결과값은 다르게 나온다.

OpenCV 내부적으로 무슨 처리를 한건지 궁금하다.


저작자표시 비영리 변경금지 (새창열림)

'전공관련 > 실습 프로그램' 카테고리의 다른 글

Gender Classification  (0) 2013.06.14
Canny Edge 구현  (1) 2013.04.17
웹캠을 이용한 가위바위보 게임  (18) 2013.04.16
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

,
  • «
  • 1
  • »

카테고리

  • 살다보니.. (449)
    • 주절거림 (3)
    • 취미생활 (36)
      • 지식과 지혜 (3)
      • 풍경이 되어 (4)
      • Memories (17)
      • 엥겔지수를 높여라 (2)
    • mathematics (6)
      • Matrix Computation (2)
      • RandomProcesses (3)
    • English.. (8)
    • Programming (147)
      • C, C++, MFC (51)
      • C# (1)
      • OpenCV (17)
      • Python (58)
      • Git, Docker (3)
      • Matlab (4)
      • Windows (3)
      • Kinect V2 (2)
      • 기타 etc. (8)
    • 전공관련 (80)
      • Algorithm (6)
      • Deep Learning (54)
      • 실습 프로그램 (4)
      • 주워들은 용어정리 (8)
      • 기타 etc. (8)
    • Computer (118)
      • Utility (21)
      • Windows (31)
      • Mac (4)
      • Ubuntu, Linux (58)
      • NAS (2)
      • Embedded, Mobile (2)
    • IT, Device (41)
      • 제품 사용기, 개봉기 (14)
      • 스마트 체험단 신청 (27)
    • Wish List (3)
    • TISTORY TIP (5)
    • 미분류. 수정중 (1)

태그목록

  • 포르투갈
  • DSLR
  • matlab function
  • 스마트체험단
  • SVM
  • 후쿠오카
  • 갤럭시노트3
  • Deep Learning
  • DeepLearning
  • review
  • 칼로리 대폭발
  • LIBSVM
  • random variable
  • matlab
  • 매트랩
  • ReadString
  • 일본
  • portugal
  • 크롬
  • 큐슈
  • function
  • Convolutional Neural Networks
  • Computer Tip
  • 에누리닷컴
  • CStdioFile
  • utility
  • 딥러닝
  • ColorMeRad
  • 매트랩 함수
  • 오봉자싸롱

달력

«   2025/06   »
일 월 화 수 목 금 토
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
06-28 02:05

LATEST FROM OUR BLOG

RSS 구독하기

BLOG VISITORS

  • Total :
  • Today :
  • Yesterday :

Copyright © 2015 Socialdev. All Rights Reserved.

티스토리툴바