[DEEP LEARNING] 윈도우 10에서 Darknet을 이용한 YOLOv3 데이터 학습 전 세팅 방법

    저번 설치에 이어서 학습 방법 및 검출 방법에 대해서 알아보겠습니다

     

    YOLOv3를 이용해 학습 시킬때 세팅을 해줘야 하는 부분이 몇가지 있습니다

     

    • 학습과 트레이닝 데이터를 정의하는 data 파일
    • CNN레이어의 구조를 정의하는 cfg 파일
    • 학습시킨 가중치 정보가 들어있는 weights 파일

    1. 학습과 트레이닝 데이터를 정의하는 data 파일

     

    일단 저는 일본 GIS 협회에서 제공하는 도로 손상 데이터 세트를 이용하여 학습을 시켰습니다

    https://github.com/sekilab/RoadDamageDetector

     

    sekilab/RoadDamageDetector

    Contribute to sekilab/RoadDamageDetector development by creating an account on GitHub.

    github.com

    data파일도 여러 형식의 파일이 있습니다

     

    • 학습 시킬 이미지, 이미지에 마커가 레이블링된 좌표파일 (맨오른쪽이미지 img폴더의 jpg와 txt) 
    • 학습 이미지 경로들이 담긴 텍스트 (train.txt, vaild.txt)
    • 클래스의 종류가 담긴 네임파일 (obj.names)
    • 그 경로들을 담고있는 데이터파일 (obj.data)

     

    ※ yolo는 기본적으로 jpg와 txt파일의 형식으로 있어야합니다. xml이라면 txt로 바꿔주셔야합니다

    (저의 경우 다운받은 데이터 세트가 xml 형식 이었어서 txt로 수정후 진행하였습니다)

     

    아주 손쉽게 xml을 txt로 바꿔주는 프로그램이 github에 있었습니다

     

    https://github.com/Isabek/XmlToTxt

     

    Isabek/XmlToTxt

    ImageNet file xml format to Darknet text format. Contribute to Isabek/XmlToTxt development by creating an account on GitHub.

    github.com

    다시 돌아와서 obj.data 파일의 내용을 설명 드리겠습니다

     

    classes : 비행기, 자동차, 강아지, 고양이 등 감지할 데이터 종류의 수 (obj.names 에 입력한 이름의 개수를 적어주면 됩니다)

    train : 학습할 이미지의 경로가 담긴 리스트 파일

    valid : 모델의 성능을 평가하기 위한 이미지 경로가 담긴 리스트 파일

    names : 클래스 이름이 들어있는 리스트 파일(data파일에서 클래스가 80개로 정의되었다면 80개의 클래스의 이름이 모두 있어야 합니다)

    backup : 학습된 가중치 파일인 weights 파일이 저장되는 폴더

     

    2. CNN 레이어의 구조를 정의하는 cfg파일

     

    제가 사용한 cfg 파일입니다

    왼쪽이 스크롤 최상단이고, 오른쪽이 스크롤 최하단입니다

     

    저는 체크한 부분들만 수정하였습니다

     

    ※ 최하단부분에 체크한 yolo 필터는 총 3개가 있습니다. 3개다 yolo부분의 anchors classes num yolo필터 바로 위의 convolutionaldfilters 를 다 변경해주셔야 합니다)

     

    batch : 한번에 이미지 몇장을 처리할지 정할 수 있음

    subdivisions : batch를 이 값만큼 나누어서 처리함 (GPU의 out of memory 발생시 16, 32, 64 등으로 숫자를 늘려줌) 

    height, width : 입력되는 이미지의 크기 (32의 배수로 클수록 정확도가 높다)

    classes : 데이터 종류의 수

    max_batches : 4000 x classes의 개수

    steps : 위에서 설정한 max_batches 사이즈의 80%와 90%를 설정

    filters : (classes + 5) * 3

    anchors : anchor box 의 레이블링 좌표입니다 (anchor box의 갯수가 많을수록 IOU는 올라가지만 학습시간이 조금더 걸립니다)

    num : anchors 에 적힌 좌표의 개수

     

    그 이외에 수정하지 않은 부분은

     

    angle : augmentation에 관련된 값으로써, 이미지를 - + 몇 도 돌릴 것인지에 대한 설정 값, 보통 0으로 두거나, 다양한 각도에서 학습하고 싶은 경우 30 ~ 45 정도, 경우에 따라 90도 가능함

    saturation : augmentation에 관련된 값으로써 이미지에 채도를 추가하고자 할 때 설정하는 값

    exposure : augmentation에 관련된 값으로써 노출 값을 추가하고자 할 때 설정하는 값

    hue : augmentation에 관련된 값으로서 색상을 변경하고자 할 때 설정하는 값 

    burn_in : 보통 1000이고, multi-gpu 사용 시 몇 만큼의 iteration 이 지날 때 마다 학습률을 조정 할 것인지에 대한 값multi-gpu 사용 시 1000 * gpu 수 만큼 조절함
    learning_rate : 보통 0.001이고, multi-gpu 사용 시 학습률을 0.001 / gpu 수 만큼 조절하기도 함

     

    ※ anchors의 값이 중요한것 같습니다

    anchor box의 값과 이미지에 마킹된 box의 IOU가 50% 가 넘지않으면 그냥 무시한다고 합니다

     

    anchors 계산 방법

    darknet.exe detector calc_anchors data/obj.data -num_of_clusters 9 -width 416 -height 416

     

    num_of_clusters에 사용하고자 하는 앵커 박스 갯수를 넣어주고 -width, -height에 네트워크의 이미지 사이즈를 넣어준 후 실행합니다

    k-means++ 를 통해서 지정된 데이터들에 적당한 앵커 박스 크기를 출력해 줍니다. 평균 IOU도 계산해 주므로 num_of_clusters를 조정해 가면서 적당한 값을 찾으면 됩니다

     

     

    3. 학습시킨 가중치 정보가 들어있는 파일

     

     

    학습시킨 가중치 정보는 backup/ 이곳에 쌓이게 됩니다
    iteration 100번에 한번씩 100단위로 저장되고, 1000이후로는 1000 단위로 저장됩니다
    darknet.sln 에서 detector.c 파일에서 수정 가능합니다
    (저의경우는 100단위는 제가 삭제했습니다)

     

    여기까지 세팅 방법에 대해서 알아봤습니다

    궁금한점이나 잘못된점 있으면 댓글 달아주세요!

     

    댓글