NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 팁 앤 테크
  • 매뉴얼

    팁과 테크니컬 노하우를 확인하세요.

    팁 앤 테크

    팁과 테크니컬 노하우를 확인하세요.

    본 사이트의 컨텐츠는 저작권법의 보호를 받으므로 무단 복사, 게재, 배포 등을 금합니다.

    기타 1부 - 욜로 딥러닝으로 이미지를 학습해서 사용하는 방법. (How to learn and use images with YOL…

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 엔지엠은 기타 다른 매크로 프로그램에서 볼 수 없는 머신러닝과 딥러닝 기능이 포함되어 있습니다. Machine Learning과 Deep Learning은 이미지를 분류하고 분석할 수 있는 막강한 기능입니다. 엔지엠만의 독보적인 이미지 분석 기능은 누구나 쉽게 사용할 수 있도록 설계되어 있지만, 자신에게 맞는 이미지 학습 모델을 만드는것은 많은 시간과 노력이 들어가는 작업입니다. 또한, 대부분은 간단한 업무를 자동화하기에 복잡한 이미지를 분류하거나 검출할 필요를 느끼지 못합니다. [ 이미지 체크 ], [ 이미지 서치 ], [ 이미지 매치 ]만으로도 만족할만한 성능을 내기 때문이죠^^;

    UN77Vzx.png

     

     

    딥러닝을 하기 위해서는 아래 내용을 참고해서 이미지를 학습할 수 있는 환경을 구성해야 합니다. 비개발자라면, 이 부분에서 많은 시간을 소비하게 됩니다. 생각보다 여러가지 환경 변수가 존재하기 때문이죠. 개발자 영역을 일반인이 아무런 도움없이 혼자서 한다는건 많은 시행착오를 겪게 만듭니다. 물론, 중간에 포기하게 되는 가장 큰 요인이기도 합니다.

    ※ 이미 만들어진 환경에서 이미지를 학습하려면 아래 내용은 건너뛰세요.

    [ 딥러닝 개발 환경 구축하기 ]

     

    위 내용을 따라하면 욜로를 컴파일해서 이미지를 학습시킬 수 있는 환경이 만들어질겁니다. 하지만, 각자 컴퓨터 환경이 다르기 때문에 잘 안될수도 있죠. 그래서 미리 만들어 놓았으니 다운로드 받아서 진행하시면 됩니다.

     

    학습용 이미지 수집하기.

    대부분은 게임 또는 특정 업무에 이용할겁니다. 그렇기 때문에 직접 캡쳐 프로그램을 이용해서 해당 화면을 캡쳐해서 이미지를 모아야 합니다. 일반적으로 미니멈 300장이고, 맥시멈 5,000장입니다. 이미지의 품질과 찾으려는 오브젝트(사물: 몬스터나 자동차, 동물, 카드, 화투등등...)에 따라 달라집니다. "욜로를 이용해서 딥러닝을 어떻게 해야 하나?"에 대한 내용이므로 예제 이미지들을 이용하도록 하겠습니다. 이미지를 쉽고 빠르게 수집할 수 있는 유틸리티를 다운로드 후 실행하세요.

    [ 이미지 크롤러 다운로드 ]

     

    분류와 검출에 필요한 이미지들을 다운로드 받아줍니다. 물론, 직접 캡쳐한 이미지를 사용해도 됩니다. 예를 들어 몬스터를 분류하고 싶으면, 각각의 사냥터에서 화면을 캡쳐해야 합니다. 캡쳐할때는 아래와 같이 화면 전체를 캡쳐하는게 좋습니다. 물론, 이미지는 클수록 더 좋죠^^;

    Rlnup7R.png

     

     

    이렇게 이미지를 몬스터별로 수백장씩 모았다면, 데이타 셋을 만들어야 합니다. 우선 아래 프로그램을 다운로드 후 실행해주세요.

    [ 욜로 마크 다운로드 받기 ]

     

    욜로 마크를 적당한 위치에 다운로드 받은 후 압축을 풀어줍니다. 아래와 같은 내용들이 포함되어 있는데요. 우선, 모아놓은 이미지를 아래 폴더에 넣어주세요. 예제라서 헬로비너스 이미지 한장만 넣어두었습니다. 여러분들은 최소 300장에서 5,000장까지 이미지를 넣어놔야 합니다.

    KPFf0xQ.png

     

     

    아래 폴더로 이동한 후 obj.names 파일을 메모장으로 열어주세요.

    Zp7KpS7.png

     

     

    오브젝트를 분류하고 검출할 이름을 입력해주세요. 위에서도 언급했듯이 헬로비너스 이미지를 넣었기 때문에 헬로비너스 맴버들의 이름을 입력했습니다. 여러분들은 당연히~ 이미지에서 검출하고 싶은 오브젝트의 이름을 입력해야 합니다. 게임이라면 몬스터 이름들이 되겠죠?

    MSRgQ8F.png

     

     

    참고로, 욜로는 한글을 사용할 수 없습니다-_-; 이미지 이름도 영어로 해야 하고, obj.names에도 영어로 하세요. 그리고, 각각의 경로에도 영어가 있으면 에러가 발생하니 유의해야 합니다. 한글 패치가 가능한지 알아봤지만~ 도움이 될만한 내용은 찾지 못했네요. 마음편히 전부 영어로 하는게 좋을거 같습니다. 아래 스펠링이 맞는지는 모르겠지만... 대충 넘어가도록 하겠습니다. 추가로~ 이미지는 jpg만 됩니다. 이미지 확장자도 엔지엠의 소프트웨어에서 확장자를 일괄 변경해주는게 있으니 큰 문제가 되지는 않을겁니다.

    KfzqDvW.png

     

     

    마지막으로 yolo-obj.cfg 파일을 실행한 후 몇몇 옵션들을 변경해야 합니다.

    tXSBX77.png

     

     

    편집기에서 Control+F로 찾기를 실행하세요. region을 찾으세요.

    [net]
    batch=64
    subdivisions=8
    height=416
    width=416
    channels=3
    momentum=0.9
    decay=0.0005
    angle=0
    saturation = 1.5
    exposure = 1.5
    hue=.1
    
    learning_rate=0.0001
    max_batches = 45000
    policy=steps
    steps=100,25000,35000
    scales=10,.1,.1
    
    [convolutional]
    batch_normalize=1
    filters=32
    size=3
    stride=1
    pad=1
    activation=leaky
    
    [maxpool]
    size=2
    stride=2
    
    [convolutional]
    batch_normalize=1
    filters=64
    size=3
    stride=1
    pad=1
    activation=leaky
    
    [maxpool]
    size=2
    stride=2
    
    [convolutional]
    batch_normalize=1
    filters=128
    size=3
    stride=1
    pad=1
    activation=leaky
    
    [convolutional]
    batch_normalize=1
    filters=64
    size=1
    stride=1
    pad=1
    activation=leaky
    
    [convolutional]
    batch_normalize=1
    filters=128
    size=3
    stride=1
    pad=1
    activation=leaky
    
    [maxpool]
    size=2
    stride=2
    
    [convolutional]
    batch_normalize=1
    filters=256
    size=3
    stride=1
    pad=1
    activation=leaky
    
    [convolutional]
    batch_normalize=1
    filters=128
    size=1
    stride=1
    pad=1
    activation=leaky
    
    [convolutional]
    batch_normalize=1
    filters=256
    size=3
    stride=1
    pad=1
    activation=leaky
    
    [maxpool]
    size=2
    stride=2
    
    [convolutional]
    batch_normalize=1
    filters=512
    size=3
    stride=1
    pad=1
    activation=leaky
    
    [convolutional]
    batch_normalize=1
    filters=256
    size=1
    stride=1
    pad=1
    activation=leaky
    
    [convolutional]
    batch_normalize=1
    filters=512
    size=3
    stride=1
    pad=1
    activation=leaky
    
    [convolutional]
    batch_normalize=1
    filters=256
    size=1
    stride=1
    pad=1
    activation=leaky
    
    [convolutional]
    batch_normalize=1
    filters=512
    size=3
    stride=1
    pad=1
    activation=leaky
    
    [maxpool]
    size=2
    stride=2
    
    [convolutional]
    batch_normalize=1
    filters=1024
    size=3
    stride=1
    pad=1
    activation=leaky
    
    [convolutional]
    batch_normalize=1
    filters=512
    size=1
    stride=1
    pad=1
    activation=leaky
    
    [convolutional]
    batch_normalize=1
    filters=1024
    size=3
    stride=1
    pad=1
    activation=leaky
    
    [convolutional]
    batch_normalize=1
    filters=512
    size=1
    stride=1
    pad=1
    activation=leaky
    
    [convolutional]
    batch_normalize=1
    filters=1024
    size=3
    stride=1
    pad=1
    activation=leaky
    
    
    #######
    
    [convolutional]
    batch_normalize=1
    size=3
    stride=1
    pad=1
    filters=1024
    activation=leaky
    
    [convolutional]
    batch_normalize=1
    size=3
    stride=1
    pad=1
    filters=1024
    activation=leaky
    
    [route]
    layers=-9
    
    [reorg]
    stride=2
    
    [route]
    layers=-1,-3
    
    [convolutional]
    batch_normalize=1
    size=3
    stride=1
    pad=1
    filters=1024
    activation=leaky
    
    [convolutional]
    size=1
    stride=1
    pad=1
    # filters의 수는 5*(classes+5) 공식을 따릅니다.
    filters=40
    activation=linear
    
    [region]
    anchors = 1.08,1.19,  3.42,4.41,  6.63,11.38,  9.42,5.11,  16.62,10.52
    bias_match=1
    # 기본 클래스 2개(Air, Bird)와 추가한 1개(Person)입니다.
    classes=3
    coords=4
    num=5
    softmax=1
    jitter=.2
    rescore=1
    
    object_scale=5
    noobject_scale=1
    class_scale=1
    coord_scale=1
    
    absolute=1
    thresh = .6
    random=0
    

     

     

    classes는 감지 또는 검출하고자 하는 오브젝트의 수입니다. 헬로비너스의 맴버가 6명입니다. obj.names에 6명의 이름이 각각 들어가 있습니다. 이 값을 6으로 변경해줍니다. 물론, 저랑 똑같이하면 안됩니다. 여러분들은 분류하고자 하는 오브젝트의 수를 입력해야 하죠~ 그리고, 위에 filters는 40으로 변경합니다. filters는 5*(classes+5)의 공식으로 처리합니다. 클래스 6에 5를 더한 후 5를 곱해서 필터수를 계산합니다.

    [convolutional]
    size=1
    stride=1
    pad=1
    filters=55
    activation=linear

     

    [region]
    anchors = 1.08,1.19,  3.42,4.41,  6.63,11.38,  9.42,5.11,  16.62,10.52
    bias_match=1
    classes=6
    coords=4
    num=5
    softmax=1
    jitter=.2
    rescore=1

     

     

    이 파일은 트레이닝을 하기 위한 옵션들이 모두 정의되어 있습니다. 자세한 사용법은 아래 링크에서 확인할 수 있습니다.

    https://github.com/AlexeyAB/Yolo_mark

     

    복잡하게 많은 옵션들이 있는데요. 대부분은 위에 설명한 몇가지의 옵션만으로도 정상 동작됩니다. 하지만, 이미지가 거의 비슷하고 미묘하게 다른 부분들이 존재한다면 정확도가 많이 떨어질겁니다. 사람도 비슷한 얼굴을 가진 쌍둥이를 잘 구별하지 못하는것처럼 인공 신경망 알고리즘도 비슷합니다. 그렇기 때문에 특징이 잘 드러나는 이미지를 사용하는게 좋습니다. 고품질의 큰 사이즈 이미지를 사용한다면 더 좋은 결과를 만들어 낼 수 있죠^^;

     

    yolo_mark.cmd를 더블 클릭하여 실행하세요.

    tJZTn4T.png

     

     

    아래 그림과 같은 프로그램이 실행됩니다. 간단한 사용 방법은 아래와 같습니다.

    1. 이미지의 목록입니다. 키보드 좌우로 이미지를 이동할 수 있습니다.
    2. 오브젝트입니다. data/obj.names에 등록한 목록이 표시됩니다.

    Y13Fi88.png

     

     

    마우스로 드래그하여 영역을 설정합니다.

    6Upue4H.png

     

     

    h를 누르면 도움말을 볼 수 있습니다. 마우스 왼쪽으로 영역을 지정하고, 마우스 오른쪽 클릭으로 영역을 이동할 수 있어요. c를 누르면 영역을 모두 삭제합니다. 만약, 잘못된 영역을 삭제하고 싶으면 마우스를 올려놓고 r을 누르세요. 마우스를 올리면 노란색으로 선택 영역이 하이라이트 됩니다. 오브젝트를 전부 등록했으면 esc를 눌러서 작업을 완료하세요. data/train.txt를 보면 작업이 완료된 이미지들이 등록되어 있는걸 알 수 있습니다.

    data/img/...
    data/img/hello_venus_001.jpg

     

    data/img/hello_venus_001.txt 파일이 새롭게 생성되었습니다. 내용은 이미지에서 감지 또는 검출할 오브젝트의 위치와 영역입니다.

    2 0.120703 0.509028 0.175781 0.951389
    2 0.391797 0.506944 0.192969 0.963889
    2 0.646484 0.513889 0.164844 0.950000
    2 0.894531 0.500000 0.148438 0.969444

     

    이 방식은 엔지엠의 HARR와 비슷합니다. HARR 머신러닝이 궁금하신 분은 [ 여기 ]를 한번 읽어보시기 바랍니다. 이 글을 작성하면서 YOLO를 진작 알았더라면... 이라는 생각을 자주하게 됩니다. 개발자들이 어떤 플로우를 머리속에 그리고, 만드는건 비슷합니다. 누구나 생각의 흐름은 유사하거든요. HARR의 막강한 알고리즘으로 많이 사용되었지만, 환경 구성이 너무나 복잡했습니다. 이런저런 문제로 더이상 업그레이드가 없다보니... 이제는 적용조차 쉽지 않네요^^;

    rZghTnM.jpg

     

     

    여기까지 욜로 학습용 데이타셋을 만드는 방법에 대해 알아봤습니다. 솔직히 큰 기술이 필요한건 아니지만, 상당한 시간과 노력이 들어가는 작업입니다. 딥러닝 관련해서 의뢰가 많이 들어오긴하는데요. 비개발자가 알기 어려운 내용은 무료로 공유하고 단순 반복 작업은 직접 할 수 있도록 하는게 더 좋겠다는 생각이 있었습니다. 이미지가 300장이고 각각의 이미지에 분류할 오브젝트가 4개씩 있다고하면 총 1,200개의 박스를 그려야 합니다. 이런 단순한 작업에 비싼돈을 들여서 의뢰하기 보다는 직접 하는게 더 이익일겁니다^^; 특히나~ 실수로 다른 오브젝트를 선택하거나 한다면 정확도에서 많은 손해를 보기 때문이죠. 이건 일일이 찾아서 검증하기도 힘듭니다. 아무튼~ 오늘은 욜로 데이타셋 만들기로 마무리하고, 다음에는 데이타셋으로 트래이닝하는 방법을 알아보도록 하겠습니다.

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천1 비추천0

    댓글목록

    profile_image

    엔지엠소프트웨어님의 댓글

    엔지엠소프트웨어 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 작성일 Date

    png 이미지들을 전부 jpg로 변경하려면 아래 프로그램을 사용하세요.
    http://ngmsoftware.com/bbs/board.php?bo_table=free_board&wr_id=2710