NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    딥러닝 Darknet - YOLO 데이타셋 만들기.

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 오늘은 Yolo mark 프로그램을 이용해서 데이타셋을 만드는 방법을 알아보겠습니다. 엔지엠에서 제공하는 머신러닝을 포함한 대부분의 머신러닝 또는 딥러닝은 유사한 프로세스를 가지고 있습니다. 아래 그림과 같죠.

    [ yolo_mark 다운로드 ], [ OpenCV 4.4.0 설치 ]

    1. 다양한 소스에서 데이타 수집 및 생성
    2. 수집한 데이타가 균질성을 갖도록 데이타 정리
    3. 올바른 ML 알고리즘을 선택하여 데이타 훈련 및 모델 작성
    4. 모델을 분석하여 유의미한 결과 도출
    5. 데이타 시각화 결과를 그래프로 변환

    tzNcarS.png

     

     

    우리는 5단계에서 매우 어려운 부분을 이미 해결했습니다. 3번과 5번이죠^^; 이제 우리가 하고 싶은 또는 해야 할 일에 대해 정리해보죠.

    1. 원하는 오브젝트(물체)를 디텍팅(감지, 검출)하기 위한 학습 이미지를 수집해야 합니다. 그리고, 아직 정제(精製)되지 않은 이미지에서 포지티브(Positive, 긍정적인)와 네거티브(Negative, 부정적인)를 분류하고, 라벨링작업을 해야 합니다.
    2. 데이타 정리는 OpenCV를 이용하면 간단하게 처리할 수 있습니다. 이미지의 크기나, 밝기와 대비를 보정해야 합니다. 추가로 흑백화(Gray-scale)와 임계값(Threshold)을 적절히 조절해서 이미지를 일반화할 수 있습니다. 이런 작업들을 통해 보다 높은 정확도(Accuracy)를 얻을 수 있고, 대상 이미지에서 디텍팅하는 오브젝트와 위치를 예측(Prediction)할 수 있게됩니다.
    3. 엔지엠은 HARR와 파이썬으로 생성된 여러가지 모델(Inception V3)을 사용할 수 있습니다. 다소 복잡한 부분이 있지만, 구글의 티처블 머신과 인터페이스를 구현할 수 있기도 합니다. 하지만, 이번에 알아보는 내용은 Darknet 프레임워크의 YOLO 모델을 사용합니다. 이전 글에서 다크넷의 욜로를 사용할 수 있도록 환경을 구성했습니다.
    4. 모델을 학습하면서 진행되는 값을 보면, 손실율의 평균이 낮아지는지 확인해야 합니다. 이 값이 낮아지지 않는다면 학습이 잘못되고 있다는 뜻입니다. 반복해서 진행되는 횟수와 비교해서 추세를 확인해야 합니다.
    5. 데이타를 시각화 할 수 있는 도구 또는 테스트를 통해 결과를 분석할 수 있습니다. 우리는 컴퓨터가 아니기에 숫자로 나열된 로우(Raw) 데이타를 분석하는데 한계가 있습니다. 그 어떤 누구도 이런 작업을 원하지는 않죠^^; 그래서 시각화 할 수 있는 도구를 이용하여 데이타를 분석하거나 실제 테스트를 수행하여 결과를 확인하는 작업을 반복하게 됩니다.
      L4KQkVS.jpg

     

     

    이제 본론으로 들어가서 욜로 마크를 사용해서 데이타셋을 구성해 보도록 하겠습니다. 아래 링크에서 욜로 마크를 다운로드 받으세요.

    https://github.com/AlexeyAB/Yolo_mark

    XuuzBHw.png

     

     

    압축을 풀고, Visual Studio의 솔루션 파일을 실행하세요. (yolo_mark.sln)

    HiXoy04.png

     

     

    프로젝트에서 우클릭 후 속성에 들어가세요. 그리고, 아래 그림과 같이 OpenCV 경로를 입력해줍니다.

    aYZNjTH.png

     

     

    OpenCV 설치는 [ 이전 글 ]을 참고하세요. 그리고, 해당 폴더의 위치를 잡아주면 됩니다.

    Ldyx0Xu.png

     

     

    우측의 솔루션 탐색기에서 우클릭 후 솔루션 빌드를 선택하세요. 정상적으로 컴파일이 되었습니다.

    Pjjh7HU.png

     

     

    yolo_mark.cmd 파일을 실행하세요. 아래와 같은 화면을 볼 수 있습니다.

    hmuwEkq.png

     

     

    실제로 내가 원하는 이미지로 학습을 해야겠죠? 욜로 마크의 옵션을 설정하세요. yolo_mark.cmd와 같은 위치에 yolo-obj.cfg 파일이 있습니다.

    GIcUs8N.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는 감지 또는 검출하고자 하는 오브젝트의 수입니다. 기본으로 air, bird가 들어 있습니다. 추가로, person을 넣을 예정이기에 이 값을 3으로 변경해줍니다. 그리고, 위에 filters는 40으로 변경합니다. filters는 5*(classes+5)의 공식으로 처리합니다. 클래스 3에 5를 더한 후 5를 곱해서 필터수를 계산합니다.

    [convolutional]
    size=1
    stride=1
    pad=1
    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
    classes=3
    coords=4
    num=5
    softmax=1
    jitter=.2
    rescore=1

     

     

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

    https://github.com/AlexeyAB/Yolo_mark

     

    yolo_mark.cmd파일이 있는 위치에서 data/img 폴더에 학습할 이미지들을 저장시킵니다. 좀 더 편하게 이미지들을 가공하려면 [ 이미지 에디터 커스텀 모듈 ]을 이용할 수 있습니다. 커스텀 모듈은 모든 이미지의 사이즈 및 필터를 균일하게 조정할 수 있습니다. 이 예제에서는 기본 포함되어 있는 이미지외에 person.jpg를 하나 넣어 두었습니다.

    drADnhO.png

     

     

    yolo_mark.cmd가 있는 위치에서 data 폴더로 이동하세요. obj.names파일을 메모장으로 열어줍니다. 라벨링 이름을 하나 추가해줍니다.

    FjFylIW.png

     

     

    같은 위치에 obj.data파일을 메모장으로 열어줍니다. 클래스를 아래와 같이 수정하세요.

    classes= 3
    train  = data/train.txt
    valid  = data/train.txt
    names = data/obj.names
    backup = backup/

     

     

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

    1. 이미지의 목록입니다. 키보드 좌우로 이미지를 이동할 수 있습니다.
    2. 오브젝트입니다. data/obj.names에 등록한 목록이 표시됩니다.
      샘플은 라벨링 작업이 완료되어 있으므로, 새롭게 추가한 이미지와 person 라벨을 선택하세요.

    bBOUzi6.png

     

     

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

    pfVUkMT.png

     

     

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

    data/img/air1.jpg
    data/img/air2.jpg
    data/img/air3.jpg
    data/img/air4.jpg
    data/img/air5.jpg
    data/img/air6.jpg
    data/img/bird1.jpg
    data/img/bird2.jpg
    data/img/bird3.jpg
    data/img/bird4.jpg
    data/img/person.jpg

     

     

    data/img/person.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

     

     

    여기까지 욜로 학습용 데이타셋을 만드는 방법에 대해 알아봤습니다. 다음에는 트래이닝하는 방법을 알아보도록 하겠습니다.

    감사합니다.

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

    댓글목록

    등록된 댓글이 없습니다.