Segalin et al. (2017) 에서 사용된 photo features 중에서, 마지막으로 Texture 관련 feature 들을 살펴보도록 한다. texture 는 보통 ‘질감’으로 번역되는데, 사진의 명암이나 컬러 등이 공간적으로 어떻게 나열 또는 분포되어 있는지에 관한 feature 들이다.

1. 첫번째로 entropy 이다.

30) entropy

논문에는 이미지의 동질성(homogeneousness)을 보여주는 feature 라고 설명되어 있다. 이미지를 gray scale 로 변환한 후, $9 \times 9$ 개의 패치로 나눈다. 그리고 각 패치의 히스토그램을 통해 엔트로피를 구한 후, 모두 더한 값을 이미지의 크기로 나눈다. 계산은 scipy.filters.rank.entropy() 함수를 통해 구하면 된다. $9 \times 9$ 개의 패치로 나누는 작업은 skimage.morphology.square() 함수를 통해 구현하면 되며, 합치면 아래와 같은 모양이 된다.

import skimage.morphology
import skimage.filters.rank

gray_img = cv2.imread(image_path, 0)
entropy = skimage.filters.rank.entropy(image=gray_img, footprint=skimage.morphology.square(9))
entropy = entropy.mean()

2. 다음으로는 wavelet texture 관련된 12개의 feature 들이다. 앞선 포스트에서 Low Depth of Field 관련한 내용에 나왔던 Daubechies wavelet transform 을 3 level 로 실시하는데, 이를 HSV 각각 채널마다 실시해서 9개의 feature 를 추출하고, 3 level 의 평균을 구하기 때문에 3개가 추가되어, 총 12개의 feature 가 된다. 별도로 이름을 붙이려니 너무 길어져서 번호만 쓴다.

31) 32) 33) 34) 35) 36) 37) 38) 39) 40) 41) 42)

논문의 코드에 잘 구현되어 있는 듯 하다. 다만, 앞서 Low Depth of Field 관련 feature 를 추출할 때에는 wavelet 옵션이 ‘db3’ 였는데, 여기에서는 ‘db2’이다. ‘db’라는 글자는 Daubechies 이고, 뒤에 붙는 숫자는 number of vanishing moments 라고 하는데, 왜 2와 3으로 다른지는 설명되어 있지 않다.

3. 세번째는 Tamura feature 들이다. 여기서 Tamura 는 사람 이름이다(Tamura et al., 1978). 이 논문에서 6가지 feature 를 제안했고, 이 가운데 3개의 feature 를 본 논문에서 사용했다.

43) (Tamura) coarseness

단어 그대로, 얼마나 texture 의 입자들이 굵고 거친지 여부를 나타내주는 feature 이다. 개념의 간단함과는 다르게, 알고리즘은 다소 복잡하다. 각 화소별로 이웃 화소의 평균을 구하는데, 이웃의 크기는 2의 제곱들(1, 2, 4, 8, 16, 32)로 정한다. 그리고 이렇게 구한 평균들이 화소의 좌우 사이에 얼마나 차이가 나는지를 계산한 후, 가장 차이가 크게 나는 이웃의 크기를 찾고, 이를 바탕으로 coarseness 를 계산한다. 논문의 코드에 잘 구현되어 있다.

44) (Tamura) contrast

contrast (대비)는 texture 의 quality 를 나타내주는 feature 중 하나로, gray-level 의 범위(range)와 gray-level 히스토그램의 양극화(polarization), 두 가지 요인에 의해 영향을 받는다고 한다. 논문의 코드에 잘 구현되어 있다.

45) (Tamura) directionality

edge 의 방향이 얼마나 특정 방향으로 몰려있는지를 나타내주는 feature 이다. 본 논문에는 edge pixel 의 방향의 분포를 구한 후, 그 분포의 entropy (E) 를 구하고, 1/(E+1) 을 구하면 그게 directionality 라고 되어 있다. 그런데 논문의 코드에는 약간 다르게 구현되어 있다. 먼저 edge detection 을 위해 프리윗(Prewitt) 마스크를 쓴 것 같은데, 왜 하필 이걸 써야 하는지에 대해 설명되어 있지 않다. 이에 대해서는 원래 논문인 Tamura et al. (1978)에도 없는 것 같다.

어쨌든 edge 를 구하고, edge 의 방향에 따른 각도도 구한다. 그리고 각도를 16개 구간으로 나누어, 방향이 각 구간에 해당되는 화소의 히스토그램을 구한다. 여기까지는 무난히 진행되는데, 이 다음이 문제다. 원래 Tamura et al.(1978) 논문에서는 sharpness of the peak of histogram 을 통해 구하는 것으로 되어 있다. 히스토그램의 peak 을 탐지해서, “sum the second moments around each peak from valley to valley”를 구하는 것으로 되어 있다(p.467). 그런데 본 논문의 코드에서는 가장 빈도가 높은 구간(peak) 하나만 기준으로 second moment 의 합을 구한다. 그리고 원래 논문에서는 평균을 구한 후 normalizing factor 를 곱하고 1에서 빼는 것이 directionality 로 되어 있는데, 본 논문에서는 그냥 합을 구하는 것에서 끝나버린다. 검색을 더 해보니, 어떤 논문(Majtner & Svoboda, 2012)에서 peak detection 을 하는 것이 성능에 별 도움이 안되고 그냥 합을 구하는 것이 대안적인 방법이라고 제안한 것 같다(본 논문에서는 이런 언급도 없다). 어쨌든 directionality 를 사용하기로 한다면, 그냥 sum 에서 끝나는 것도 나름의 근거가 있는 방법인 것 같기는 하다.

4. 다음은 Gray-level cooccurrence matrix (GLCM) 관련 feature (12개)들이다. GLCM은 “a matrix where the element (i, j) is the probability p(i, j) of observing values i and j for a given channel (H, S or V) in the pixels of the same region W” 라고 정의되어 있다. 아래의 네 가지 feature 를 각각 H, S, V 채널마다 추출해서 총 12개라고 논문에 나와 있지만, 논문의 코드에서는 gray image 하나에 대해서만 실행되어 있다.이름도 gray-level 이니, 그게 맞는 것 같기도 하고.

46) (GLCM) contrast
47) (GLCM) correlation
48) (GLCM) energy
49) (GLCM) homogeneity

구현은 scikit-learn 을 사용했다. GLCM 을 구하는 코드GLCM의 속성을 구하는 함수까지 잘 구현되어 있다.

5. 마지막으로 GIST descriptors (Oliva & Torralba, 2001)이다. 기본적으로는 scene 분류를 위한 descriptor 추출기 같다. scene 의 특징을 내용이나 등장 물체가 아니라 scene 자체의 모양(?)을 통해 나타내고 분류할 수 있다는 접근이다. 이 descriptor 자체를 feature 로 사용한 모양인데, 문제는 이게 논문의 코드에 구현되어 있지 않다. 관련된 모듈[1]도 있고, 몇몇 repository[2] 에서 구현한 코드를 제공하기는 하는데, 그게 맞게 되어 있는지를 알 수가 없다. 결정적으로 본 논문에서는 24개의 feature 라고 되어 있는데, 24개의 output 이 나오는 코드가 없는 것 같다. 일단 현재로서는 능력 밖의 일이라 판단되어 여기까지만 하는 것으로.

어쨌든 일단 feature 공부를 위해 논문 한 편을 살펴보았다. 의외로 코드와 함께 제공되는 논문이 많지 않아서 쉽지는 않지만, 그래도 이 논문에서 사용된 많은 feature 들이 이전 또는 이후 논문들에서 계속해서 등장하고 있기 때문에 좋은 공부가 된 것 같다. 계속해서 다른 논문들을 몇 편 더 살펴볼 예정이다.


[1] https://pypi.org/project/pyleargist/

[2] https://github.com/whitphx/lear-gist-python
https://github.com/imoken1122/GIST-feature-extractor

<참고문헌>

  • Majtner, T., & Svoboda, D. (2012). Extension of Tamura texture features for 3D fluorescence microscopy. Presented at 2012 Second International Conference on 3D Imaging, Modeling, Processing, Visualization & Transmission, Zurich, Switzerland. https://doi.org/10.1109/3dimpvt.2012.61

  • Oliva, A., & Torralba, A. (2001). Modeling the shape of the scene: A holistic representation of the spatial envelope. International Journal of Computer Vision, 42(3), 145-175. https://doi.org/10.1023/a:1011139631724

  • Segalin, C., Perina, A., Cristani, M., & Vinciarelli, A. (2017). The pictures we like are our image: Continuous mapping of favorite pictures into self-assessed and attributed personality traits. IEEE Transactions on Affective Computing, 8(2), 268-285. https://doi.org/10.1109/taffc.2016.2516994

  • Tamura, H., Mori, S., & Yamawaki, T. (1978). Textural features corresponding to visual perception. IEEE Transactions on Systems, Man, and Cybernetics, 8(6), 460-473. https://doi.org/10.1109/tsmc.1978.4309999