본문 바로가기

Enginius/Projects

MATLAB, CPP - Adaboost eye detection

1. MakeFolder.m

하는 일

: 폴더를 만든다.

변경 할 것

: 이 파일에서 StageIndex를 변경한다. [‘01’, 02’, ‘03’, ‘04’, ‘05’ …]

 

2. CollectSamplesForNextStage.m

하는 일

: 다음 stage를 위해서 sample을 구한다. 처음 stepstep1에선 Original Data에서 가져온다. Positive Sample 2000개를 가져오고, Negative Sample 20000개 중에서 nSamps(현재는 2000)를 가져온다. 그 뒤로부턴, step2에서부터(n-1)stepImagePatchesTP에서 Positive Samples를 가져오고, ImagePatchesFP에서 Negative Samples를 가져온다.

l  TPTrue Positive로 눈인데 눈으로 판단한 경우이다. 이것을 다음 번 stepPositive Sample로 사용한다. 이와 마찬가지로 FP, False Positive: 눈이 아닌데 눈이라고 판단한 것을 다음 번 stepNegative Sample로 사용한다.

변경 할 것

: 이 파일에서 StageIndexInStageIndexOut를 변경한다. [‘00’ ‘01’, ‘01’ ‘02’, ‘02’ ‘03’ …]

 

3. MakeDataFileOfTrainSamps.m

하는 일

: 현재 stepPositive Sample Negative Sample data 파일로 만든다. 이렇게 하는 이유는 C 프로그램에서 data을 읽어서 연산을 하게 하기 위해서이다.

변경할 것

: StageIndex를 변경한다. [‘01’, ‘02’, ‘03’, ‘04’, ‘05’];

 

4. RunningAdaboost.cpp

하는 일

: 앞에서 만들어진 data 파일로 Adaboost를 수행한다. 콘솔 창에 결과가 나오는데 이 때 ensemble threshold를 적어야 한다. 예를 들어 50개의 feature를 구했을 때 30번 째 feature에서 가장 높은 detection rate이 나왔다면, 30번까지의 weak classifier를 사용하고, 이 때의 ensemble threshold를 저장한다.

 

변경할 것

StageStr: 현재 몇 번째 stage를 선택한다. [‘01’, ‘02’, ‘03’, ‘04’, ‘05’]

nSampPos : Training할 때 Positive Sample의 수를 정한다. 이 값은 이전 stage True Positive 결과물의 총 수 이다. (처음에 2000개로 시작했고, 그 뒤로 99% 이상으로 detection 하도록 하므로 그 수가 많이 줄지 않는다. 2000~1960개 정도이다. )

nSampNeg : Training할 때 Negative Sample의 수를 정한다. 이 값은 이전 stageFalse Positive(눈이 아닌데 눈이라고 한 것) 결과물의 총 수이다.

MAX_SEL_HAARFEATS : Training할 때 최대로 고를 weak classifier의 수이다. (처음엔 5, 나중엔 50)

TARGET_DETECTRATES : Training할 때 이루고자 하는 Detection Rate이다. 눈인 것을 눈이라고 판단할 확률을 뜻한다. 높을수록 좋다. (99~99.9로한다. 99.9는 이뤄지지 않는다.)

TARGET_FASPOSRATES : Training할 때 이루고자 하는 False Positive Rate이다. 눈이 아닌 것을 눈이라고 판단할 확률을 뜻한다. 이 값은 낮을수록 좋다. 하지만 Detection Rate가 더 중요하므로 처음에 50으로 하고, 40, 40, 30, 30으로 한다.

 

5. Adaboost 결과로 나온 detection rate중에 제일 큰 것을 고르고, 이 때까지의 weak classifier들을 이용한다. (Ensemble threshold)

 

6. ClassificationImgPatches.m

하는 일

: Original Data (2000개의 positive sample 20000개의 negative sample)을 이용해서 지금까지 구해진 cascade classifier로 그 성능을 확인한다. 이 때 ImagePatchesFPFalse Positive(눈이 아는데 눈이 이라고 판단한 것들)를 넣고, ImagePatchesTPTrue Positive(눈인데 눈이라고 판단한 것들)를 넣는다.

 

변경할 것

nStages: Cascade classifier stage (ex: 5 )

nHaarFeats: stage Feat (ex: [ 2 2 18 46 32 ] )

EnTheta: 앙상블 Threshold 이다. (ex: [ 1.972628 1.429138 5.95318 13.031949 15.263914 ] )

 

7. ClassificationTestImgPatches.m

하는 일

: 6번 과 같지만 이 경우에는 불러오는 파일이 TestImage이다. 출력 역시 각 stage 별로 다르게 출력한다





< 최종 결과 >




1. 최종 Cascade Classifier Stage의 정보

stage의 수: 5

stageweak classifier의 수: [2  2 18 46 32]

앙상블 Theta: [1.972628 1.429138 5.95318 13.031949 15.263914]

 

2. stage weak classifier의 정보


3. stage별 테스트 결과

0. stage를 거치기 전의 수

Test Negative Sample의 수: 3502

Test Positive Sample의 수: 260

1. stage1에서 false positive patch의 수와 true positive patch의 수

False positive patch의 수: 2032

True positive patch의 수: 253

2. stage2에서 false positive patch의 수와 true positive patch의 수

False positive patch의 수: 385

True positive patch의 수: 178

3. stage3에서 false positive patch의 수와 true positive patch의 수

False positive patch의 수: 215

True positive patch의 수: 157

4. stage4에서 false positive patch의 수와 true positive patch의 수

False positive patch의 수: 90

True positive patch의 수: 129

5. stage5에서 false positive patch의 수와 true positive patch의 수

False positive patch의 수: 89

True positive patch의 수: 129



Assignment.vol1.z01

Assignment.vol1.z02

Assignment.vol1.z03

Assignment.vol1.z04

Assignment.vol1.z05

Assignment.vol1.z06

Assignment.vol1.z07

Assignment.vol1.z08

Assignment.vol1.z09

Assignment.vol1.z10

Assignment.vol1.z11

Assignment.vol1.zip