Study/AI System2009. 5. 23. 23:14

과제로 MLP를 이용한 데이터 분류기를 구현해 보았습니다.

 

1. 설계 주제

 

동물의 특성 hair, feathers, eggs, milk, airborne, aquatic, predator, toothed, backbone, breathes, venomous, fins, legs, tail, domestic의 15가지 특징 벡터를 입력으로 받아 들여 어느 동물인지 구별하여 동물의 특징(서식지, 이동형태, 먹이)과 이름, 사진을 보여주는 분류기를 설계합니다.

 

2. 데이터 설명

 

입력 데이터는 100개이며, legs특성을 제외한 모든 특성은 참과 거짓을 나타내는 0, 1의 두 가지 값을 가지며 legs특성은 0, 2, 4, 5, 6 8의 값을 가집니다.

출력 데이터 또한 100개 이며 1개의 데이터마다 각 동물의 특징을 분류 할 수 있는 10개의 값을 가지고 있다. 값은 0.1과 0.9 두 가지입니다.

 

3. 분류기 설계

 

3.1 선택 이유

동물에 대한 특성을 입력하여 판별하기에 MLP(Multilayer Perceptron)는 학습 알고리즘으로서 어느 정도 성능이 좋은 오류 역전파 알고리즘을 사용하여 학습을 하고 많은 양의 데이터에 성능이 좋은 신경망 회로이기에 선택하게 되었습니다.

 

3.2 구조

MLP는 입력 층, 중간 층, 출력 층의 3가지 층으로 구성되어 있으며 중간층과 각 unit 의 입출력 특성을 비선형으로 함으로써 네트워크의 능력을 향상시킬 수 있습니다. 출력 값과 원하는 출력 값을 비교하여 그 차이를 감소시키는 방향으로 연결강도를 조정합니다.

 

3.3 구현

http://lcn.epfl.ch/tutorial/english/ 사이트의 C언어로 작성된 MLP를 이용한 빨간 망토라는 간단한 예제 프로그램을 바탕으로 WPF를 사용하여 C#언어로 구현하였습니다.

패턴수와 중간층 개수를 입력받아 초기화 시킬 수 있다. 학습 결과 확인을 쉽게 하기 위하여 동물 이름을 선택하면 동물의 속성을 보여주어 쉽게 속성을 체크할 수 있도록 하였습니다.

 

영어로 된 동물이름을 한글화 하였고 데이터 파일은 xml포맷을 사용하였습니다.

입력 값은 체크박스와 콤보박스로 여러 가지를 선택할 수 있게 하였습니다.

결과 값은 패턴 오류율, 오류율 0.01을 기준으로 학습 충분 패턴과 학습 필요 패턴을 구분하고 동물의 특징과 동물 사진을 보여줌으로써 결과 값을 확실하게 인식할 수 있도록 하였습니다. 빨간 망토 예제와 같은 정확성을 위하여 c#의 random함수와 exp함수를 사용하지 않고 c언어의 random함수와 exp함수를 dll로 만들어 import하여 사용하였습니다.

 

4. 실험

 

4.1 실험 데이터

100개의 입력 데이터는 ZOO 데이터 베이스를 사용하였고 본래 17가지 특성 중 마지막 2가지 특성의 의미를 파악하지 못해 2가지를 제외한 15가지 속성을 가지게 되었습니다.

100개의 출력 데이터는 각 동물의 특성을 나타낼 수 있도록 10가지로 분류하여 만들었습니다.

 

4.2 분류기 학습 및 학습 결과

입력데이터와 목표 출력데이터에 대하여 동물패턴을 학습시킨 결과는 다음과 같습니다.

중간층은 10개로 정하고 두 패턴씩만 검색해 보았습니다. 학습 횟수는 한번에 1000회 하였습니다.

 

- 처음화면

                                                             

 

- 10패턴

                                     

                학습횟수: 1000                                                                    학습횟수: 1000

                송아지 검색 성공                                                                   메기 검색 성공

 

- 20패턴

                                                       

                학습 횟수: 1000                                                                    학습 횟수: 1000

                돌고래 검색 성공                                                                    가제 검색 성공

 

- 30패턴

                                   

                학습 횟수: 2000                                                                    학습 횟수: 3000

                개구리 검색 성공                                                                    큰 박쥐 검색 성공

 

- 40패턴             

                                   

                학습 횟수: 18000                                                                    학습 횟수: 2000

                홍학 검색 성공                                                                         고릴라 검색 성공

 

- 50 패턴

                                                   

                학습 횟수: 2000                                                                    학습 횟수: 32000

                밍크 검색 성공                                                                       갈매기 검색 성공

 

- 60 패턴

                                   

                학습 횟수: 14000                                                                    학습 횟수: 61000

                염소 검색 성공                                                                         종달새 검색 성공

 

- 70 패턴                

                                   

                학습 횟수: 5000                                                                     학습 횟수: 83000

                너구리 검색 성공                                                                     타조 검색 성공

 

- 80 패턴                   

                                   

                학습 횟수: 1000                                                                    학습 횟수: 11000

                해마 검색 성공                                                                       순록 검색 성공

 

- 90 패턴                   

                                     

                학습 횟수: 15000                                                                     학습 횟수: 48000

                작은 뱀 검색 성공                                                                      도둑 갈매기 검색 성공

 

- 100패턴                 

                                   

                학습 횟수: 4000                                                                     학습 횟수: 12000

                타조 검색 성공                                                                        백조 검색 성공

 

몇 십번의 실험을 하여 본 결과 대부분의 패턴들이 50000번 미만의 횟수로 학습이 되어 쉽게 검색 할 수 있었습니다. 학습 할수록 에러율이 감소 되었고 찾고자 하는 패턴의 값에 가까워 져 가는 걸 동물의 특징의 변화로 알 수 있었습니다.

패턴의 수가 증가할 수록 평균적으로 학습 횟수가 조금씩 증가 하였습니다. 하지만 간 혹 몇몇 패턴들은 오랜 학습 횟수에도 에러율이 감소하지 않고 일정 수준에서 맴돌았으며 검색이 되지 않았습니다. 또한 중간층의 개수가 증가 할수록 학습 속도가 감소 되어졌습니다.

 

4.3 실험 결과

패턴의 수가 증가 할 수 록 약간의 학습 횟수가 증가하였지만 대부분의 평균적 학습 횟수로 패턴을 찾을 수 있었습니다. 또한 학습 횟수에 따라 오류율이 줄어들면서 가까운 값을 찾아가는 것을 보고 오류역전파 알고리즘의 특징인 목표 출력 값에 가깝게 연결 강도를 조정하는 것을 볼 수 있었습니다. 그래서 많은 양의 데이터에 효율적인 MLP의 성능을 볼 수 있었습니다. 하지만 몇 몇 패턴들은 많은 학습 횟수에도 에러율이 줄지 않고 일정 수준에서 맴도는 현상으로 패턴을 찾지 못하여 오류 역전파 알고리즘의 문제점을 확인 할 수 있었습니다.

 

오인식의 이유는 오류역전파 알고리즘을 사용할 때 발생하는 다음 4가지 문제점과.

 

① 학습이 완료되기까지 많은 횟수의 반복학습이 필요.

② 응용분야에 따라 학습 파라미터의 조절이 필요.

③ 추가 학습시 전체적인 재학습이 필요.

④ 학습의 완료시점을 예측할 수 없음.

 

오류역전파 알고리즘의 문제점인 지역 최소점에 빠질 가능성이 있다는 점, 포화영역에서 잘 동작하지 않는다는 점, 신호기 입력에서 출력까지 한 방향으로만 흘러가는 전 방향 방식이라는 것입니다.

또한 중간층이 증가 할수록 학습 속도가 감소하는 것은 중간층이 있을 때 학습은 어려워 지기 때문이다. 왜냐하면 어떤 연결강도가 오차를 유발 시키는지 알 수 없기 때문입니다.

실험 결과가 간 혹 다른 동물이 나올 때가 있는데 입력 속성와 출력 속성이 같은 중복된 데이터가 몇 가지가 있어서 가장 나중에 일치하는 동물이 나오게 되는 것입니다.

 

실험결과 그래프는 다음과 같습니다.

                            

 

 

5. 요약

MLP를 이용하여 15가지의 특성을 가지는 동물 입력패턴 100개와 이에 대응하는 목표 출력 패턴 100개를 학습시킨 후 찾고자 하는 동물의 특성을 입력하여 찾아내는 동물 분류기를 WPF를 사용하여 C#으로 구현하여 보았습니다. 입, 출력 데이터는 zoo 데이터베이스를 사용하여 분류기에 맞게 수정 및 생성하였습니다. 실험 결과 패턴이 증가함에 따라 학습 횟수도 조금씩 증가하였지만 대부분 평균적인 학습 횟수로 찾고자 하는 패턴을 검색할 수 있었습니다. 하지만 몇몇 패턴들은 일정 값에 머무르는 오류역전파 알고리즘의 문제점을 보였습니다.

또한 중간층이 많아짐에 따라 학습 속도가 감소가 감소함을 보였습니다. 이것은 중간층이 있으면 학습은 어려워 지기 때문입니다. 왜냐하면 어떤 연결강도가 오차를 유발 시키는지 알 수 없기 때문입니다.

 

오류역전파 학습 알고리즘은 다층의 구조를 갖는 복잡한 신경망 학습 알고리즘으로 최급하강법을 기본으로 한 매우 유용한 패턴인식 해법입니다.

하지만 문제점도 여러 가지 존재합니다.

지역 최소점에 빠질 가능성이 있다는 점, 포화영역에서 잘 동작하지 않는다는 점, 신호기 입력에서 출력까지 한 방향으로만 흘러가는 전 방향 방식이라는 것입니다.

또한 사용할 때 다음의 문제점이 있습니다.

 

① 학습이 완료되기까지 많은 횟수의 반복학습이 필요.

② 응용분야에 따라 학습 파라미터의 조절이 필요.

③ 추가 학습시 전체적인 재학습이 필요.

④ 학습의 완료시점을 예측할 수 없음.

 

1, 2 번을 해결하기 위한 해결방안으로는 일괄 수정법, 출력값의 제한, 모멘텀 방법, 수정 모멘텀 방법, 학습계수의 최적화 방법, 복잡도 방법, 선택적 재학습 방법, 연결강도 개수의 축소의 8가지 방법입니다. 하지만 3, 4번은 피할 수 없습니다.

 

이번 실험에서도 위와 같은 여러 가지 문제점이 발생하였습니다.

 

6. 소감

MLP를 구현하면서 많은 시행 착오가 있었지만 신경회로망에 대해 열심히 공부하고 조금이나마 알 수 있었던 좋은 시간이었습니다. 처음 C언어로 된 소스를 분석해서 C#으로 작성하고 입력데이터 한글화와 목표출력데이터 100개를 만드는데 2일정도의 시간이 소요되었습니다. 그 후에 많은 실험으로 잘못된 부분을 수정하고 수정해서 실험하게 되니 참으로 기뻤습니다. 이론적으로만 공부하던 내용을 직접 구현하고 실험해보니 재미도 있고 여러 가지 사실들에 대해 직접 느낄 수 있어서 재미있고 보람있는 시간이었습니다.

 

[ 시연영상 ]

 

전체 소스는 첨부파일을 다운 받으시면 됩니다.

 

'Study > AI System' 카테고리의 다른 글

홉필드 신경회로망을 이용한 연상 메모리  (0) 2009.03.23
신경회로망  (0) 2009.03.18
신경회로망  (0) 2009.03.18
신경회로망  (0) 2009.03.18
신경회로망  (0) 2009.03.17
Posted by 열ㅇl
Study/CxImage2009. 3. 28. 18:53

교수님이 자료 올려주신 것.

'Study > CxImage' 카테고리의 다른 글

컬러 공간 분석  (0) 2009.03.23
CxImage 제공 함수  (0) 2009.03.18
라이브러리 함수 사용자 작성  (0) 2009.03.18
CxImage 라이브러리 함수  (0) 2009.03.18
기본 시작 함수  (0) 2009.03.18
Posted by 열ㅇl
Study/CxImage2009. 3. 23. 18:15

컬러의 개념

  - 빛의 자극으로 생기는 감각의 일종.

  - 빛이 물체에 반사 또는 흡수함으로써 시각적으로 색을 느낌.

  - 인간의 눈에 보이는 가시광선.

 

RGB 컬러공간

  - 빨강, 초록, 파랑, 가산혼합

  - 기본 컬러공간: 컬러의 빛을 물리적으로 검출하고 만드는데 사용되기 때문.

                         컬러 영상을 획득하여 표시하는 공간.

                         영상처리에 있어 모니터는 필수.

                         컴퓨터 모니터에서 3원색을 조합하여 사용.

 

  - 영상에 대한 다양한 정의: 컬러를 표현하는 화소값의 배열.

                                       색과 점의 공간 파형으로 정의.

                                       임의의 방향에 대한 밀도의 공간 분포로 표현.

                                       컬러 공간 모델로부터 계산된 밀도를 표현하는 raster 순서에 저장된 숫자값의 매트릭스에 의해 표현.

 

  - 명암도 영상 변환 공식

    RGB 컬러공간: 0.333 * Red + 0.333 * Green + 0.333 * Blue

    NTSC 제안: 0.299 * Red + 0.587 * Green + 0.114 * Blue

    SQRT(Red^2 + Blue^2) / SQRT(3)

    각 R,G,B 값 중 한가지만 사용.

 

  - 다른 영상 처리 응용에 한계: RGB컬러 요소들의 상호 관계가 너무 커서 특정 색상망 분리가 어려움.

  - 이를 보완할 수 있는 HSI 컬러 공간이 존재.

 

HSI 컬러공간

  - 인간이 색깔을 인식하는 세가지 요인인 Hue, Saturation, Intenstity를 컬러 공간으로 옮겨 놓은 것.

   

   색의 3요소:

   - Hue(색상): 빨강, 노랑 ,파랑 등과 같이 다른 색과 구별될 수 있는 색의 명칭이나 색의 특성, 색의 구분, 순수색.

   - Saturation(채도): 색깔이 '연하다', '진하다', '탁하다'하는 등의 정도를 나타내는 말.

   - Intensity(명도): 색의 밝고 어두운 정도, 즉 색의 명암.

   - 색입체: 먼셀, 오스왈드, P.C.C.S등

 

             

 

 

  - Hue: 원통 모양의 주변, 순수색 표현(0 ~ 360)

  - Saturation: 중심으로부터의 거리(0 ~ 1)

  - Intensity: 하단 꼭지점에서 최상부까지의 거리(0 ~ 1)

 

   

 

 

CMY(K) 컬러 공간

  - 색의 3원색: 청록(Cyan), 자홍(Magenta), 노랑(Yellow), 감산혼합

  - Cyan = 255 - Red = Green + Blue.

  - Magenta = 255 - Green = Red + Blue.

  - Yellow = 255 - Blue = Red + Green.

 

  - Cyan _ Magenta + Yellow = 검정(K) -> 이론상

  - k = min(Cyan, Magenta, Yellow).

  - C = 기존 Cyan - K

  - M = 기존 Magenta - K

  - Y = 기존 Yellow - K

  - CMYK 컬러 공간의 한계: RGB보다 작은 범위인 관계로 한계가 있다.

                                       다소 뿌옇게 인쇄(선명도 떨어짐).

                                       CMYK 형태로 직접 모니터로 불러들여 작업하지 않음.(CMYK(모니터)->RGB(인쇄)->CMYK).

 

다른 컬러 공간

  - YIQ
인간의 시각체계와 유사하게 흉내낸 최초의 컬러 공간
1950년대, 컬러 텔레비전(NTSC방식) 개발자들에 의해 구성
명도(Luminance)와 색도(chrominance)요소
Y는 명도 - 밝기를 가지는 흑백영상의 수상기에 나타나는 영상을 표시
  - YUV
PAL 방식의 TV에서 사용되는 컬러 공간
인간의 눈이 색상보다는 밝기에 민감하다는 사실에 착안한 방식
Y:U:V 의 비율을 통상 4:2:2로 구성한다.
 
  - YCbCr
색상 정보로부터 명도를 분리하는 또 하나의 다른  컬러 공간
Y는 명도 , Cb 푸른색  ,  Cr  붉은색의 정보를 표시
JPEG, MPEG 및 디지털 텔레비전의 표준으로 사용

 

'Study > CxImage' 카테고리의 다른 글

GS_Library  (0) 2009.03.28
CxImage 제공 함수  (0) 2009.03.18
라이브러리 함수 사용자 작성  (0) 2009.03.18
CxImage 라이브러리 함수  (0) 2009.03.18
기본 시작 함수  (0) 2009.03.18
Posted by 열ㅇl
Study/AI System2009. 3. 23. 00:01

❏ 문제 설명

홉필드 알고리즘을 이용하여 특정 패턴을 학습 시킨 후 노이즈가 있는 패턴을 입력하였을 때 근접한 패턴을 찾게 만듭니다.

 

프로그램 설명

WPF를 통해 구현하였으므로 .net Framework3.0이상에서 실행됩니다.

ㄱ,ㄴ,ㄷ, 세가지 패턴이 등록되어 있으며 노이즈가 있는 패턴 입력 시 근접한 패턴을 찾아 출력합니다.


[ 실행화면 ]


[ 시연영상 ]

'Study > AI System' 카테고리의 다른 글

Multilayer Perceptron을 이용한 Zoo 데이터 분류  (0) 2009.05.23
신경회로망  (0) 2009.03.18
신경회로망  (0) 2009.03.18
신경회로망  (0) 2009.03.18
신경회로망  (0) 2009.03.17
Posted by 열ㅇl
Study/CxImage2009. 3. 18. 16:15

1. 파일처리

 

 Load  특정 포맷을 갖는 영상 파일을 읽는다.
 LoadResource  리소스에 저장한 영상 데이터를 읽어 들인다.
 Save  특정 포맷을 갖는 영상 파일로 저장한다.
 Decode  메모리 버퍼에 있는 특정 포맷을 갖는 영상 데어티를 읽는다.
 Encode  특정 포맷을 갖는 영상 데어티를 메모리 버퍼에 저장한다.

 

2. 영상정보 관리

 

- 정보 가져오기

 GetBits  영상 데어티가 있는 포인터를 반환한다.
 GetBpp  화소당 비트수를 반환한다.
 GetDIB  영상 데이터의 DIB(Device Independent Bitmap)을 반환한다.
 GetHeight  영상 데이터의 높이를 반환한다.
 GetWidth  영상 데이터의 너비를 반환한다.
 GetPalette  팔레트 정보의 첫 번째 인덱스가 있는 포인터를 반환한다
 GetPixelColor  영상 데이터 내 해당 화소값을 RGB 데이터로 반환한다.
 GetPixelGray  영상 데이터 내 해당 화소값을 명암값을 반환한다.
 GetPixelIndex  영상 데이터 내 해당 화소값을 인덱스를 반환한다.

 

- 정보 설정하기

 SetPalette  팔레트 정보를 설정한다.
 SetPixelColor  영상 데이터 내 해당 화소값을 RGB 데이터로 설정한다.
 SetPixelIndex  영상 데이터 내 해당 화소값을 명암값으로 설정한다.
 SetTransColor  24비트 영상에 투명도를 컬러로 설정한다.
 SetTransIndex  1, 4, 8 비트 영상에 투명도를 인덱스로 설정한다.

 

- 정보 일치 확인

 IsEnabled  페인팅(painting)이 가능하면 true를 반환한다.
 IsTransfered  투명도가 가능하면 true를 반환한다.
 IsValid  영상 데이터가 불러들인 상태이면 true를 반환한다.

 

- 정보 생성하기

 Copy  기존 영상 데이터를 복사하여 새로운 영상 데이터를 만든다.
 Create  높이, 너비 등을 인자로 받아 새로운 영상 데이터를 만든다.
 CreateFromHBITMAP

 DDB(Device Dependent Bitmap)을 갖고 새로운 영상 데이터
 를
만든다.

 CreateFromHANDLE

 클립보드와 같은 클로벌 핸들에서 얻은 것을 갖고 새로운 영상 데

 이터를 만든다.

 CopyToHandle  기존 영상 데이터를 클립보드와 같은 글로벌 핸들에 복사한다.
 CreateFromArray  1차원 배열을 갖고 새로운 영상 데이터를 만든다.

 

- 정보 해제하기

 Transfer

 기존 영상 데이터를 새로운 영상 데이터에 복사한다.

 그 후 기존 영상 데이터의 내용을 비운다.

 Destory  기존 영상 데이터에 할당한 메모리를 해제한다.
 FreeMemory

 메모리 버퍼에 올려져 있는 영상 데이터에 할당한 메모리를 해제

 한다.

 Clear  영상 데이터의 특정 화소값을 새로 초기화 한다.

 

- 정보 출력하기

 Draw  영상 데이터를 DC(Device Context)에 보내어 출력한다.
 DrawText  영상 데이터 안에 문자열을 삽입한다.

 

3. 컬러 공간 처리

 

- 컬러 공간 분리

 GrayScale  명암도 영상으로 변환한다.
 HSLtoRGB  HSL 컬러 공간을 RGB 컬러 공간으로 변환한다.
 RGBtoHSL  RGB 컬러 공간을 HSL 컬러 공간으로 변환한다.
 Threshold  이진 영상으로 변환한다.

 

-컬러 공간 분리

 SplitCMYK  CMYK 컬러 공간을 채널별로 분리한다.
 SpliHSL  HSL 컬러 공간을 채널별로 분리한다.

 

- 변환

 RGBQUARDtoRGB  팔레트 정보를 갖는 RGBQUARD 구조체 배열을 RGB로 변환한다.
 RGBtoRGBQUARD  RGB를 팔레트 정보를 갖는 RGBQUARD 구조체 배열로 변환한다.

 

- 기타

 Colorize  영상의 Hue, Staturation 값을 대치한다.
 HuePalette  무지개 팔레트를 생성한다.
 ShiftRGB  영상의 R,G,B값을 조절한다.
 DecreaseBpp  화소당 비트수를 감소시킨다.
 IncreaseBpp  화소당 비트수를 증가시킨다.

 

4. 변환처리

 

- 필터링

 Dither  이진 영상으로 변환한다. (총 7가지 방법 제공)
 Dilate  영상의 밝은 부분을 개선한다.
 Erode  영상의 어두운 부분을 개선한다.
 Filter  2차원 마스크를 갖고 회선하여 필터링한다.
 Gamma  컬러 영상의 밸런스를 조절한다.
 Jitter  영상내 각 화소 위치를 기준으로 난수를 발생시켜 효과를 얻는다.
 Light  영상의 밝기와 대비조절을 한다.
 Mean  영상에 평균값 필터링한다.
 Median  영상에 중간값 필터링한다.
 Mix  두 영상을 블렌딩(blending)처리한다.
 Repair  인위적으로 생긴 효과를 제거하기 위한 블러링 수행한다.

 

- 잡음관련

 Noise  동형 잡음(uniform noise)을 더한다.

 

- 주파수 영역

 FFT2  FFT(Fast Fourier Transform: 고속 퓨리에 변환)를 수행한다.

 

- 히스토그램

 Histogram  영상의 히스토그램 정보를 얻는다.
 HistogramEqualize  영상에 히스토그램 평활화를 수행한다.
 HistogramStreach  영상에 히스토그램 스트레칭을 수행한다.

 

- 기타

 Combine  R,G,B, 알파 채널을 하나의 영상으로 병합한다.
 Contour  영상의 윤곽을 추출한다.
 Lut  룩업 테이블(Lookup table)을 영상에 적용한다.
 Negative  역 변환을 수행하여 영상을 반전한다.
 RedEyeRemove  적목 현상을 제거한다.

 

5. 기하학 변환

 Corp  영상의 일부를 추출한다.
 Flip  영상의 상하를 뒤집는다.
 Resample  영상의 크기를 조절한다.
 Mirror  영상의 좌우를 뒤집는다.
 Skew  영상을 비스듬하게 한다.
 Expand  영상의 주변(border)을 확장한다.
 Rotate  회전한다.

'Study > CxImage' 카테고리의 다른 글

GS_Library  (0) 2009.03.28
컬러 공간 분석  (0) 2009.03.23
라이브러리 함수 사용자 작성  (0) 2009.03.18
CxImage 라이브러리 함수  (0) 2009.03.18
기본 시작 함수  (0) 2009.03.18
Posted by 열ㅇl
Study/CxImage2009. 3. 18. 15:32

Jitter효과

- 새로운 클래스 생성 후 math 헤더파일 추가

- 코드

 

 RGBQUAD color;
 int rnd_height, rnd_width;

 // 영상의 높이와 너비를 가져온다.
 int height = m_pImage->GetWidth();
 int width = m_pImage->GetWidth();

 for(int i=0; i<height; i++)
 {
  for(int j=0; j<width; j++)
  {
   rnd_height = i + (long)((rand() / (float)RAND_MAX - 0.5) * (radius * 2));
   rnd_width = j + (long)((rand() / (float)RAND_MAX - 0.5) * (radius * 2));

   // 영상의 범위를 넘어서면
   if(rnd_height > height || rnd_width > width)
   {
    rnd_height = height;
    rnd_width = width;
   }

   // 영상(rnd_width, rnd_height)내 화소값에서 R,G,B값을 가져온다.
   color = m_pImage->GetPixelColor(rnd_width, rnd_height);


   // 영상 내 화소값의 R,G,B에 할당한다.
   m_pImage->SetPixelColor(j, i, color);
  }
 }

 

- 메뉴바에 새로운 메뉴 생성 후 호출 함수 정의 (View클래스)

 // 도큐먼트 클래스에 있는 m_pImage를 가져오기 위해 참조 호출한다.
 CKDY013Doc *pDoc = GetDocument();
 ASSERT_VALID(pDoc);

 CFilter cFilter;
 cFilter.GS_Jitter(pDoc->m_pImage, 4);

 // 화면 갱신
 Invalidate(FALSE);

 

 

 

'Study > CxImage' 카테고리의 다른 글

컬러 공간 분석  (0) 2009.03.23
CxImage 제공 함수  (0) 2009.03.18
CxImage 라이브러리 함수  (0) 2009.03.18
기본 시작 함수  (0) 2009.03.18
CxImage 소개 및 기본 설치  (0) 2009.03.11
Posted by 열ㅇl
Study/CxImage2009. 3. 18. 15:27

Jitter 효과(View 클래스)

  - 메뉴에 사용자 메뉴를 만든 후 관련 함수 생성.

  - 코드삽입

   CKDY013Doc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);

   // Jitter() 함수 호출
   long radius = 4;
   pDoc->m_pImage->Jitter(radius);

   //화면 갱신
   Invalidate(FALSE);

 

클립보드 복사(Doc 클래스)

  - 새로운 함수 생성 후 코드 삽입

  - 매개변수 CxImage* pCopyImage

   HANDLE hDIB = m_pCopyImage->CopyToHandle();

   // 클립보드 열기
   if(::OpenClipboard(AfxGetMainWnd()->GetSafeHwnd()))
   {
    // 클립보드 초기화
    if(::EmptyClipboard())
    {
     // 클립보드에 전송
     if(::SetClipboardData(CF_DIB, hDIB) == NULL)
     {
      AfxMessageBox("클립보드 데이타 전송 오류");
     }
    }
   }
   // 클립보드 닫기
   ::CloseClipboard();

 

  - ID_EDIT_COPY 아이디 함수 재정의 후 코드 삽입 (View 클래스)

 

   CKDY013Doc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);

   // 클립보드에 복사하기
   pDoc->CopyClipBoard(pDoc->m_pImage);

 

클립보드 붙이기(App 클래스)

  - ID_EDIT_PASTE 아이디 함수 재정의 후 코드 삽입

   POSITION pos = GetFirstDocTemplatePosition();
   CDocTemplate *pTemplate = GetNextDocTemplate(pos);

   CKDY013Doc* pDoc = (CKDY013Doc*)pTemplate->OpenDocumentFile(NULL);
 
   if(pDoc)
   {
    HANDLE hBitmap = NULL;
 
    // 클립보드에서 데이터 가져오기
    if(::OpenClipboard(AfxGetMainWnd()->GetSafeHwnd()))
    {
     hBitmap = ::GetClipboardData(CF_DIB);
    }
 
    if(hBitmap)
    {
     // 클립보드에서 얻은 데이터로부터 CxImage 생성
     pDoc->m_pImage = new CxImage();
   
     pDoc->m_pImage->CreateFromHANDLE(hBitmap);
   
     POSITION pos = pDoc->GetFirstViewPosition();
   
     CKDY013View *pView = (CKDY013View*)pDoc->GetNextView(pos);
   
     CSize sizeTotal = CSize(pDoc->m_pImage->GetWidth(), pDoc->m_pImage->GetHeight());
   
     pView->SetScrollSizes(MM_TEXT, sizeTotal);
     pView->ResizeParentToFit(FALSE);
    }
    // 클립보드 닫기
    ::CloseClipboard();
   }

 

  - ID_EDIT_PASTE 아이디의 Update함수 추가 후 코드 삽입

   if(!IsClipboardFormatAvailable(CF_DIB))
   {
    pCmdUI->Enable(FALSE);
   }

 

'Study > CxImage' 카테고리의 다른 글

컬러 공간 분석  (0) 2009.03.23
CxImage 제공 함수  (0) 2009.03.18
라이브러리 함수 사용자 작성  (0) 2009.03.18
기본 시작 함수  (0) 2009.03.18
CxImage 소개 및 기본 설치  (0) 2009.03.11
Posted by 열ㅇl
Study/CxImage2009. 3. 18. 13:58

영상 파일을 읽어 오기 (Doc 클래스)

  - CxImage* m_pImage 변수 정의

  - 가상함수 정의창에서 OnOpenDocument() 함수 재정의

  - 코드 삽입

   m_pImage = new CxImage();
   m_pImage->Load(lpszPathName, 0);

 

종료시 메모리 해제 (Doc 클래스)

  - 가상함수 정의창에서 DeleteContents()함수 재정의

  - 코드삽입

     if(m_pImage)
    {
      delete m_pImage;
    }

 

파일 열기 함수 (App 클래스)

  - Class Wizard에서 ID_FILE_OPEN 선택후 OnFileOpen() 함수 재정의.

  - 메시지 맵에서 ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) 주석처리

  - 코드 삽입

   char szFilter[] = "지원 영상처리 파일(*.bmp, *.jpg, *.gif, *.png, *.tif) |*.bmp; *.jpg; *.gif; *.png; *.tif|| ";
   CFileDialog fileDlg(TRUE, NULL, NULL, OFN_EXPLORER | OFN_HIDEREADONLY, szFilter);

   if(fileDlg.DoModal() == IDOK)
   {
      OpenDocumentFile(fileDlg.GetPathName());
   }

 

영상 출력하기 (View 클래스)

  - OnDraw()함수에 코드 삽입

  if(pDoc->m_pImage)
  {
    CRect rect = CRect(0, 0, (int)pDoc->m_pImage->GetWidth(), (int)pDoc->m_pImage->GetHeight());
    GetClientRect(&rect);

    pDoc->m_pImage->Draw(pDC->GetSafeHdc(), rect, 0);
  }

 

영상 크기에 따른 스크롤 지원하기 (View 클래스)

  - OnInitialUpdate() 함수에 코드삽입

    CKDY013Doc* pDoc = GetDocument();

    CScrollView::OnInitialUpdate();

    CSize sizeTotal;
    if(pDoc->m_pImage)
    {
        sizeTotal = CSize(pDoc->m_pImage->GetWidth(),
        pDoc->m_pImage->GetHeight());
    }
    else
    {
       sizeTotal.cx = sizeTotal.cy = 100;
    }

    SetScrollSizes(MM_TEXT, sizeTotal);
    ResizeParentToFit(FALSE);

 

처음 실행시 나타나는 창 제거하기 (App 클래스)

  - Instantance() 함수 ParseCommandLine(cmdInfo); 다음에 코드 삽입

    CKDY013Doc* pDoc = GetDocument();

    CScrollView::OnInitialUpdate();

    CSize sizeTotal;


    if(pDoc->m_pImage)
    {
        sizeTotal = CSize(pDoc->m_pImage->GetWidth(),
        pDoc->m_pImage->GetHeight());
    }
    else
    {
       sizeTotal.cx = sizeTotal.cy = 100;
    }

    SetScrollSizes(MM_TEXT, sizeTotal);
    ResizeParentToFit(FALSE);

 

드래그 앤 드롭으로 영상 파일 열기 (APP 클래스)

  - Instantance() 함수  if (!ProcessShellCommand(cmdInfo)) return FALSE; 다음에 코드 삽입

  pMainFrame->DragAcceptFiles();

 

영상의 크기에 맞춰 보여주기 (Frame 클래스)

  - 가상함수 정의창에서 ActivateeFrame 함수 선택

  - Frame 클래스에 Doc헤더파일 추가

  - 코드 삽입

   CRect rect, rectClient;
   GetWindowRect(&rect);
   GetClientRect(&rectClient);

   CxImage *m_pImage = ((CKDY013Doc *)GetActiveDocument())->m_pImage;

   if(m_pImage)
   {
     int height = (int)m_pImage->GetHeight() + rect.Height() - rectClient.Height() + 5;
     int width = (int)m_pImage->GetWidth() + rect.Width() - rectClient.Width() + 5;

     SetWindowPos(NULL, 0, 0, width, height, SWP_NOMOVE | SWP_SHOWWINDOW);
   }

 

영상 저장(Doc 클래스)

  - 가상함수 정의창에서 OnSaveDocument() 함수 재정의.

  - 코드 삽입

   int format_type = 0;
 
   // 확장자명을 찾기
   char *ext = (char*)strstr(lpszPathName, ".");

  // 소문자로 변환하기
   ext = strlwr(ext);
 
  // 확장자명을 기준으로 저장한다.
   if(!strcmp(ext, ".bmp"))
   {
      format_type = CXIMAGE_FORMAT_BMP;
   }
   else if(!strcmp(ext, ".gif"))
  {
      format_type = CXIMAGE_FORMAT_GIF;
  }
  else if(!strcmp(ext, ".jpg"))
  {
     format_type = CXIMAGE_FORMAT_JPG;
  }
  else if(!strcmp(ext, ".png"))
  {
     format_type = CXIMAGE_FORMAT_PNG;
  }
  else
  {
     AfxMessageBox("CXIMAGE_FORMAT을 확인하여 주십시요.", MB_OK |

                              MB_ICONSTOP);
     return TRUE;
  }
 
  return m_pImage->Save(lpszPathName, format_type);

 

'Study > CxImage' 카테고리의 다른 글

컬러 공간 분석  (0) 2009.03.23
CxImage 제공 함수  (0) 2009.03.18
라이브러리 함수 사용자 작성  (0) 2009.03.18
CxImage 라이브러리 함수  (0) 2009.03.18
CxImage 소개 및 기본 설치  (0) 2009.03.11
Posted by 열ㅇl
Study/AI System2009. 3. 18. 01:08

퍼셉트론

  - 1957년 미국의 Rosenblatt가 단순히 패턴을 인식하기 위해 제안한 모델.

  - 입력 패턴이 두 개의 클래스 중 어느 하나에 속함을 결정할 때 주로 사용되는 모델.

  - 입력값이 정확하지 않고 다른 클래스에 대한 분포가 평균값에서만 차이가 난다는 점에서 최대유사 가우시안 분류기와 개념상 유

    사.

  - 이동,확대,중복 및 회전된 패턴인 경우 결정 경계선이 계속적으로 진동함으로써 정확히 분류되지 못하는 단점.

  - 이점을 보완하고자 최소 평균 자승 알고리즘 또는 Widrow-Hoff방법이 제시,

  - 이 방법은 원하는 출력값과 실제 출력값과의 평균 자승 오류를 최소화 시킨 것.

  - 3층의 퍼셉트론 모델에서는 활성화 함수로써 시그모이드 함수를 이용한 학습 방법이 오류 역전파 알고리즘.

 

  문제점:

  - XOR문제나 패리티 비트 문제 등의 학습이 불가능함.

  - 즉, 두가지 패턴을 동시에 선형 분리할 수 없다는 것.

 

다층 퍼셉트론

  - 입력층과 출력층 사이에 하나 이상의 계층을 갖는 신경 회로망

  - 예) 3층 퍼셉트론은 입력층과 출력층 사이에 하나의 은닉층을 갖음.

  - 단층 퍼셉트론의 단점을 해결하기 위해 제안된 모델.

  - 적당한 학습 알고리즘이 없다는 이유로 많이 사용되지는 못하였지만 새로운 알고리즘의 개발로 많이 사용되고 있음.

  - 그것이 오류 역전파 알고리즘.

 

오류 역전파 알고리즘

  - 델타 규칙에 하나 이상의 은닉층이 있는 3층 이상의 신경 회로망으로 확장한 학습 방법. (일반화된 델타 규칙)

  - 일반화된 LMS알고리즘.

  - 원하는 출력값과 실제 출력값과의 차이의 제곱을 가장 최소화 하고자 경사 하강 방법 적용.

  - 입력 노드와 관련없는 클래스의 모든 노드의 원하는 출력값은 점점 낮아지고 반대인 경우는 점점 높아짐.

  - XOR문제나, 음성 인식 및 합성 문제, 시각 패턴 인식 문제 등에 많이 이용되어 좋은 결과를 보여줌.

 

  몇가지 문제점

  - 첫째, 수렴을 위해 필요한 훈련 데이터의 입력 횟수가 대개 100번 이상으로 매우 많음.(특히 음성의 경우)

  - 둘째, 가중치가 수렴하지 않고 발산하는 경우 심각한 문제점을 초래할 수 있음.

 

다층 오류 역전파 알고리즘의 문제점

  - 지역 최소점에 빠질 위험이 있다.

  - 포화 영역에서 잘 동작하지 않는다.

  - 전방향 방식으로 입출력이 진행된다. (고차원 시스템 구현시 문제가 될수 있다.)

  - 기타 문제점: 학습이 완료되기까지 많은 횟수의 반복 학습이 필요.

                      응용분야에 따라 학습 파라미터의 조절이 필요.

                      추가 학습시 전체적인 재학습이 필요한 문제.

                      학습의 완료시점을 예측할 수 없다는 문제점.

 

다층 오류 역전파 알고리즘의 문제점에 대한 개선 방법

  - 일괄 수정법

  - 출력값의 제한 방법

  - 모멘텀 방법

  - 수정 모멘텀 방법

  - 학습 계수의 최적화 방법

  - 복잡도 방법

  - 선택적 재학습 방법

  - 연결 강도 개수의 축소방법

 

'Study > AI System' 카테고리의 다른 글

Multilayer Perceptron을 이용한 Zoo 데이터 분류  (0) 2009.05.23
홉필드 신경회로망을 이용한 연상 메모리  (0) 2009.03.23
신경회로망  (0) 2009.03.18
신경회로망  (0) 2009.03.18
신경회로망  (0) 2009.03.17
Posted by 열ㅇl
Study/AI System2009. 3. 18. 01:07

- 정보 전달 방식에 따라 대개 두형태로 분류

- 상호 결합형: 각 노드들이 서로 결합되어 결과를 서로 전달하는 피드백 과정이 있음.

- 계층적 입출력형: 각 노드들로 구성된 계층이 2개에서 n개까지의 계층으로 나누어져 있어 한 층의 노드들은 다른 층의 노드로 출력 결

   과만을 전달하는 방식으로 입출력 관계를 갖음.

 

신경회로망의 기능

  1. 연상기능.

  2. 최근접 데이터의 인출기능.

  3. 특징 추출 기능.

  4. 조합론적 폭발 문제 해결 기능.

  5. 비상 안전 기능.

  6. 감지 정보 처리 기능.

  7. 제어기능.

  8. 지식 정보 처리 기능.

 

홉필드 모델(Hopfield Network)

 
  
- 1982년 미국의 물리학자인 Hopfield가 발표한 모델.

  - 정보의 흐름이 양방향

  - 피드백이기 때문에 자신의 노드로부터 나온 출력값을 다시 입력으로 받는 상호 겷바형 네트워크 구조.

  - 모든 입출력값이 정확한 이진 상태로 표현 가능.

  - 문자를 ASCII나 픽셀값으로 표현이 가능할 경우 가장 적당한 모델.

  - 입력값이 연속적인 형태일 경우는 아날로그 값을 디지털 값으로 바꾸어 주어야 하는 문제점 때문에 다소 좋지 않은 결과 얻을 수

    있음.

 

  두 가지 제약 조건

  - 첫째, 노드간의 결합 강도가 대칭적.

  - 둘째, 신경 회로망내의 모든 노드들이 서로 비동기적으로 동작하는 병렬 컴퓨터 모델의 특징을 갖고 있음.

 

  - 각 뉴런이 그것에 들어온 신호의합계가 어떤 임계치를 넘으면 흥분하고, 그 이하이면 흥분하지 않는 상태가 되는 신경회망을 모델

  - 연상 메모리로 구현 가능.

  - 극소점: 시간이 변함에 따라 에너지의 산을 내려가서 계곡에 떨어져서 빠져나올 수 없는 점에 이른 점.

  - 연상 메모리: '하늘'이란 입력으로 부터 '파랗다', '높다' 등의 개념을 출력하거나, 불완전한 문자열 또는 이미지를 입력하여 완전
                       한
문자열 또는 이미지를 출력하는 원리.

                       기존의 컴퓨터에는 주소에 의해 기억한 내용을 찾아오는 방식과는 다른 방식.

                       기억된 내용과 같은 수준의 정보로부터 검색하는 방식이기 때문에 내용 주소 메모리라고도 불리움.

                       기억한 내용을 완전히 병렬로 검색할 수 있어서 고속의 데이터베이스 검색 등 많은 분야에 응용이 가능.

 

  두가지 제한점

  - 첫째, 너무나 많은 패턴이 기억된다면 분류하는데 제한점이 따름.

  - 학습에 필요한 클래스 수는 입력 노드 수보다 약 15%를 초과하지 않도록 하는 것이 효율적.

  - 둘째, 입력 패턴이 너무나도 부정확하면 다른 클래스로 분류될 가능성이 높음.

 

'Study > AI System' 카테고리의 다른 글

홉필드 신경회로망을 이용한 연상 메모리  (0) 2009.03.23
신경회로망  (0) 2009.03.18
신경회로망  (0) 2009.03.18
신경회로망  (0) 2009.03.17
지식의 표현  (0) 2009.03.17
Posted by 열ㅇl