Career/Drowsy Behavior Detection

개인 프로젝트 : 전처리

김 정 환 2020. 12. 24. 00:26
반응형

1. 유의미하지 않은 features 제거

1) 문제 

    - 같은 행동을 취하고 있는 두 이미지의 Euclidean distance가 2.3, 그리고 다른 행동을 취하고 있는 두 이미지의 Euclean distance가 2.4로 전혀 구별하지 못했습니다.

 

2) 해결

    - Coursera 강의에서 배운 meaningful features가 생각이 났습니다. 그래서 구글에 meaningful feature extraction라는 키워드로 검색을 진행했습니다.

 

    - 검색 결과, 저의 이미지에는 쓸모 없는 부분이 너무 많다는 사실을 알 수 있었습니다. 아래의 예시를 보면, 아버지가 행동하고 있는 범위는 사진의 절반 만으로도 충분히 볼 수 있습니다. 가운데를 기준으로 오른쪽은 실제로 쓸모 없는 부분입니다.

 

    - 따라서 유의미하지 않은 부분들은 잘라 내기로 했습니다. 다시 영상을 촬영하기에는 시간이 없어서 간단한 코딩을 통해서 이미지를 잘라주는 코드를 만들었습니다. 그래서 아래와 같이 필요한 부분만 얻을 수 있게 하였습니다.

 

3) 성과

    - 같은 행동을 취하고 있는 두 이미지의 Euclidean distance가 2.3에서 1.5로 감소하였습니다. 그리고 다른 행동을 취하고 있는 두 이미지의 Euclean distance가 2.3으로 거의 그대로 였습니다.

 

 

 

2. Feature scaling

1) 문제

    - Coursera 강의에서 전처리 단계에는 feature scaling을 한다고 배웠습니다. 데이터의 distribution을 조정하기 위해서 라고 알고 있습니다. 그래서 문제는 발견되지 않았지만 성능 향상을 기대하며 feature scaling을 적용하기로 했습니다.

 

2) 해결

(1) Normalization 적용

    - OpenCV로 불러온 이미지를 numpy로 변경했습니다. 그리고 각 element에 아래 공식을 적용하여 normalizaiton을 했습니다.

    - Normalization의 사용 이유

        * 값들의 범위를 0~1 사이로 재조정

        * 보통 학습 이전에 적용

        * scale이 큰 feature의 영향이 커지는 현상을 방지

 

 

(2) Standardization 적용

    - OpenCV로 불러온 이미지를 numpy로 변경했습니다. 그리고 각 element에 아래 공식을 적용하여 standardization을 했습니다.

    - Standardization의 사용 이유

        * 값의 범위를 평균이 0이고 분산이 1이 되도록 재조정

        * 보통 학습 이전에 적용

        * scale이 큰 feature의 영향이 커지는 현상을 방지

 

 

(3) 코드 (일부분)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        for pair in range(num_of_pairs):
            # from the list AA AB AA AB, pick only front A
            image = Image.open(path_list[pair * 2])
            image = image.resize((self.image_height, self.image_width))
            image = np.asarray(image).astype(np.float64)
 
            #image = (image - np.min(image)) / (np.max(image) - np.min(image))
            image = (image - image.mean()) / image.std()
 
            pairs_of_images[0][pair, :, :, :] = image
 
            # from the list AA AB AA AB, pick rear A and B
            image = Image.open(path_list[pair * 2 + 1])
            image = image.resize((self.image_height, self.image_width))
            image = np.asarray(image).astype(np.float64)
 
            #image = (image - np.min(image)) / (np.max(image) - np.min(image))
            image = (image - image.mean()) / image.std()
 
            pairs_of_images[1][pair, :, :, :] = image
cs

 

3) 성과

1) Normalization 결과

    - 적용하기 전후에 같은 행동에 대한 Euclidean distance의 차이가 없었습니다.

    - 이유를 생각해보았습니다. 이미지의 값들은 0 ~ 255로 한정되어 있기 때문입니다. 따라서 0 ~ 1로 줄인다고 해도 비율만 줄어들 뿐이었습니다.

 

 

2) Standardization 결과

    - 적용하기 전후에 같은 행동에 대한 Euclidean distance의 차이가 1.1에서 0.8로 감소했습니다.

    - 이유를 생각해보았습니다. 수집한 데이터들은 보면 터널에서의 어두운 이미지, 터널에서 나올 때 갑자기 밝아지는 이미지, 주간 주행의 밝은 이미지들이 있었습니다. Histogram으로 한 이미지의 값 분포를 나타내었을 때, 한 쪽으로 치우친 경우가 있었습니다. 그래서 학습된 모델은 Bias 되었습니다.

 

반응형

'Career > Drowsy Behavior Detection' 카테고리의 다른 글

개인 프로젝트 : 문제 해결  (0) 2020.12.25
개인 프로젝트 : 개발  (0) 2020.12.25
개인 프로젝트 : 데이터 수집  (0) 2020.12.21
개인 프로젝트 : 설계  (0) 2020.12.21
개인 프로젝트 : 시작  (0) 2020.12.21