Blog Content

    티스토리 뷰

    유사 이미지 검출하기 [머신러닝, 딥러닝 실전 개발 입문]

    파이썬을 이용한 머신러닝, 딥러닝 실전 개발 입문 도서를 스터디하여 정리한 내용입니다.

    코드는 http://wikibook.co.kr/python-machine-learning/ 에서 다운 가능합니다.


    [이미지와 딥러닝 - 유사 이미지 검출하기]

    Average Hash 알고리즘 사용

    PIL(Pillow) 라이브러리


    Average Hash

    • 이미지를 비교 가능한 해시 값으로 나타낸 것
    • 이미지가 조금 다르더라도(이미지 해상도 크기, 색조, JPEG/PNG 등의 압축 형식 등) 유사한지를 검출해야 할 때 사용.


    구체적인 방법

    1) 이미지 크기를 8 x 8(또는 16 x 16)로 축소한다.

    2) 색을 그레이스케일로 변환한다.

    3) 이미지의 각 픽셀의 평균을 계산한다.

    4) 각 픽셀의 어두운 정도가 평균보다 크면 1, 평균보다 작으면 0으로 입력한다.


    이 방법으로 하면 64비트를 비교하기만 하면 되므로 빠르게 유사한 이미지를 검색할 수 있다.

    이미지를 다룰 때는 파이썬의 이미지라이브러리 Pillow를 사용한다.


    pip3 install Pillow


    src/ch7/avhash.py 실행


    [출력 결과]

    [[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0]
    [0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0]
    [0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0]
    [1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0]
    [0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0]
    [0 1 0 1 1 1 1 1 1 1 1 1 0 0 0 0]
    [0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0]
    [1 1 0 0 1 1 1 1 1 1 1 1 1 0 1 0]
    [1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0]
    [0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0]
    [0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0]
    [0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1]]
    000001000180018003c003c003c087e07ff05ff07ff2cffa9ffe3ffe3ffe1fff


    많은 이미지에서 유사한 이미지 검색하기


    샘플 이미지 데이터 : http://www.vision.caltech.edu/Image_Datasets/Caltech101/Caltech101.html

    적당한 의자 이미지를 골라서 유사한 이미지를 검색해보자!!!


    src/ch7/avhash-search.py 실행


    [출력결과]

    0.0 > D:/workspace_my/my-machine-learning/image_deeplearning/image/101_ObjectCategories/chair/image_0016.jpg
    0.22265625 > D:/workspace_my/my-machine-learning/image_deeplearning/image/101_ObjectCategories/stop_sign/image_0019.jpg
    0.2265625 > D:/workspace_my/my-machine-learning/image_deeplearning/image/101_ObjectCategories/chair/image_0031.jpg
    0.23046875 > D:/workspace_my/my-machine-learning/image_deeplearning/image/101_ObjectCategories/airplanes/image_0129.jpg
    0.234375 > D:/workspace_my/my-machine-learning/image_deeplearning/image/101_ObjectCategories/umbrella/image_0009.jpg
    0.23828125 > D:/workspace_my/my-machine-learning/image_deeplearning/image/101_ObjectCategories/airplanes/image_0124.jpg
    0.24609375 > D:/workspace_my/my-machine-learning/image_deeplearning/image/101_ObjectCategories/chair/image_0001.jpg
    0.24609375 > D:/workspace_my/my-machine-learning/image_deeplearning/image/101_ObjectCategories/chair/image_0002.jpg
    0.24609375 > D:/workspace_my/my-machine-learning/image_deeplearning/image/101_ObjectCategories/dragonfly/image_0001.jpg
    ok



    해밍거리: 같은 문자 수를 가진 2개의 문자열에 대응하는 위치에 있는 문자 중 다른 것의 개수를 나타냄.

    현재 이미지를 256글자의 해시 값으로 나타냈으므로 이를 기반으로 몇 글자가 다른지 찾고, 이를 기반으로 이미지의 차이를 구분하는 것



    결론

    Average Hash는 리사이즈하고 이진화하기만 하면 되는 간단한 처리이지만

    유사한 이미지를 찾을 때 충분히 활용할 수 있는 방법임


    + 11.21 추가

    가공된 데이터 추가 후 이미지를 잘 찾는지 테스트해봄!

    의자를 막 반전, 앵글변경 등 가공해서 데이터를 늘려놓고 유사한 의미지를 잘 찾는지 테스트해보면

     유사한 이비지 일부분 찾고 옴을 알 수 있다!

    정확도를 높이기 위해서는 rate 값 조정 등 해야 할 것 같다.

    Comments