상세 컨텐츠

본문 제목

LabelImg 활용: YOLO 객체인식을 위한 데이터셋 제작 가이드

카테고리 없음

by nyjeong 2023. 11. 24. 13:43

본문

 

  Yolo는 You Only Look Once의 약자로, 물체감지와 객체 인식 분야에서 가장 많이 사용되고 있는 모델입니다. 

 

  저는 현재 졸업 프로젝트를 진행중인데, 저희 팀뿐만 아니라 많은 팀이 Yolo 모델을 이용하더라고요!

저희 팀의 경우, YOLOv8을 사용하고있는데, 각 버전별로 차이점이 존재하니, 직접 사용해보시고 선택하시면 될 것 같습니다.

 

  우선 저희 프로젝트를소개하자면, '객체 인식과 NLP를 활용한 객관·단답·서술식 시험 채점 AI 소프트웨어' 를 제작하는 프로젝트입니다. 시험 채점을 위해서는 문제 번호, 문제와 답의 영역, 보기 영역, 선택한 답과 같은 부분을 정확히 인식하여야 합니다. 따라서 이를 위해 YOLOv8 모델을 활용하여 객체 인식을 진행하는 것입니다.

 

  YOLO 모델 사용에는 학습시킬 이미지와 그 이미지에 대한 라벨링 txt 파일이 필요합니다. 그래서 저희는 LabelImg를 활용하여 객체 인식을 위해 필요한 데이터 셋을 제작하였는데, 이 과정을 천천히 설명해 드리려 합니다.

 

LabelImg 설치 방법은 다음 링크에서 확인하실 수 있습니다. Mac과 Windows에 따라 방법이 다르니 주의하세요! 

 

LabelImg 설치 방법 설명 링크

 

labelImg 실행 방법

 

 

  그 후, 명령 프롬프트에서 'cd labelImg' 후 'python labelImg.py'를 입력하면,  다음과 같이 LabelImg가 실행됩니다.

저 명령 프롬프트를 끄게되면 LabelImg 화면도 꺼지더라고요! 주의하시면 될 거 같아요.

 

 

LabelImg 첫 화면

 

 

LabelImg 화면 왼쪽 바

 

 

  저희는 YOLO를 위한 데이터 셋을 제작하는 것이므로, 왼쪽 노란 동그라미 부분이 YOLO가 되도록 클릭해줍니다. 여기에는 PascalVOC, YOLO, CreateML이 차례대로 존재하니 클릭해주면 변경됩니다. YOLO를 선택하여 라벨링하는 경우, 라벨링한 위치 TXT파일이 생성됩니다. 

 

  그리고 매번 진행한 라벨링을 저장하기 귀찮거나 까먹을 수 있으니 자동 저장이 되도록 설정을 변경해줍니다. 위에 View를 클릭하면, 맨 위에 Auto Save mode가 있는데 이를 클릭해 주시면 됩니다.

 

  왼쪽 버튼들 중 자주 사용하는 것들에 대해서만 간략히 소개해드리면, Open을 통해 사진을 하나씩 선택하여 가져올 수 있고, Open Dir을 통해서는 라벨링할 사진들을 모아둔 폴더를 선택하여 여러 사진들을 한번에 가져올 수 있습니다.

  Change Save Dir로 저장할 폴더를 변경할 수 있는데, 변경하지 않는다면, 원래 사진을 가져온 폴더에 라벨링 txt 파일이 함께 저장됩니다.

  Next Image와 Prev Image 버튼을 통해 전 이미지와 다음 이미지로 이동을 할 수 있는데, 이는 각각 'a'와 'd' 키로 대체할 수 있습니다.

  그리고 Create RectBox 버튼을 통해 원하는 부분에 박스로 라벨링을 진행하는데, 이 또한 'w' 키로 대체 가능합니다.

 

클래스 지정

 

  'w'키 또는 Create RectBox 버튼을 누르고 위 사진과 같이 원하는 부분을 박스치면, 다음과 같이 라벨 클래스를 지정할 수 있습니다. 혼자 라벨링을 진행하는 경우, 사진에서와 같이 사용하는 클래스들을 미리 순서에 맞게 만들어놓고 진행하는 것이 필수적이진 않지만, 라벨링을 더 빠르게 진행할 수 있습니다. 하지만, 라벨링을 해야할 사진이 많아 여러 명이 나눠서 라벨링을 하는 경우, 라벨 클래스 순서가 다르면 통합이 되지 않으므로, 무조건 미리 클래스들의 순서를 정해주어야 합니다.

 

클래스 순서 설정

 

 

  저희 팀의 경우, 시험지를 채점하기 위해서는 공통 지문이나 그림 등이 아닌 문제와 보기 부분을 찾아내고, 각 문제의 번호, 각 보기의 위치와 체크 여부를 인식해야하므로 각 문제별로 문제과 보기 부분을 합친 qna, 문제 번호 부분인 num, 보기 1~5의 위치를 각 a1~a5로, 체크한 부분을 checked 라는 클래스로 라벨링하기로 결정하였습니다. qna, num, a1, a2, a3, a4, a5, checked 순서대로 설정해놓기 위해서는 C:\Users\USER\labelImg\data\predefined_classes.txt 파일에 다음과 같이 작성한 후, 저장해주면 됩니다. 그러면 qna부터 0번, checked는 7번으로 저장이 됩니다.

 

  저희 팀의 경우, 실제 문제를 풀고 채점하는 과정을 똑같이 진행하기 위해, 2021 6월, 9월, 수능 전과목 시험지를 모두 인쇄하여 직접 답을 표시한 후, 다시 스캔하여 얻은 이미지로 라벨링을 진행하였습니다.

 

  먼저 위 사진과 같이 답이 표시된 시험지에서 qna 부분을 라벨링 해줍니다. 

  qna 라벨링의 경우, 문제와 보기를 포함하도록 하고, 그림이나 표, 도형, 공통지문 등이 문제와 보기 사이에 위치되어 있는 경우는 포함시키고 그 밖 문제 위나 보기 아래에 존재하는 경우는 다음 사진들과 같이 제외시킵니다. 또한  국어와 같은 경우, 문제와 보기가 한 쪽에 함께 연결되어 있는 것이 아니라 다음 쪽에 존재하는 등 하나의 네모 박스로 한번에 모두 포함시킬 수 없는 경우가 존재하는데, 이런 경우는 각각 부분별로 따로 qna 라벨링 해줍니다. 

 

qna 설정

 

이후, 이 라벨링된 파일을 통해 qna 부분을 학습시키면, 다음과 같이 꽤 높은 정확도로 qna 부분을 인식하는 것을 확인할 수 있습니다.

qna 학습

 

  위에서와 같이 학습된 qna부분을 이용해 각 문제별로 뽑아내어 개별 이미지 파일로 자장합니다.

  그 후 각 문제 이미지 별로 문제번호, 보기, 체크된 곳을 각각 num, a1~a5, checked로 아래와 같이 라벨링해줍니다.

 

문제별 라벨링

 

  라벨링을 한 후 저장된 txt 파일을 보면, 아래 사진과 같이 맨 왼쪽이 클래스 번호, 그리고 나머지 숫자가 그 클래스의 위치를 의미하는 숫자입니다. 클래스가 위에서와 같이 숫자로 저장되므로 앞에서 클래스 순서를 맞춰주지 않고 다 각자 라벨링을 하였다면, classes.txt 파일의 클래스 순서와 다른 경우 다른 클래스로 인식하여 제대로 학습이 안 될 것이므로 주의하여야 합니다.

라벨링 txt

 

  그 다음에 앞에서 qna부분을 학습시킨 것과 똑같이 이들도 학습시켜주면 다음과 같이 문제의 번호, 보기 부분, 체크한 보기를 거의 정확하게 인식해내는 것을 확인할 수 있습니다.

 

num, a1~a5, checked 인식

 

  위와 같이 문제번호와 체크한 보기를 인식해낸다면, 이제 객관식 채점을 할 준비가 된 것 입니다.

 

 

  더 정확한 객체 인식을 위해서는 정확하고 많은 라벨링된 데이터가 필요합니다.

 

  저희 팀의 경우, 국어나 영어와 같이 엄청 긴 지문이 존재하거나, 사진이나 표가 답이나 문제로 잘못 인식되는 경우가 발생하여, 국어와 영어만 2021 3월 모의고사를 추가적으로 라벨링하여 더 학습시켜주었습니다.

  이뿐만 아니라 qna와 num, a1~a5, checked 모두 6월, 9월, 수능 중 하나의 데이터 셋만 사용하는 것보다 모두 사용하여 학습시킨 경우에 더 정확히 인식해내는 것을 볼 수 있었습니다.

 

  그러니 만약 객체 인식이 제대로 되지 않는다면, 특별히 학습이 잘 안되는 경우를 더 학습시키거나, 전반적으로 라벨링 데이터 셋을 더 만들면 더 정확한 인식 결과를 확인하실 수 있을 것입니다.

 

 

  그리고 LabelImg를 사용하여 라벨링 시 주의해야하는 점은, Change Save Dir를 하지 않으면 사진 원본들이 들어있던 폴더에 함께 라벨링 txt 파일이 저장되는데, 구분 또는 분리를 위해 텍스트 파일을 다른 파일로 옮기거나 한다면, LabelImg를 다시 켜서 같은 사진들을 불러와도 라벨링을 진행했던 것이 다 사라지게 되니, 이어서 작업을 하고 싶은 경우, 텍스트 파일들을 다른 파일로 옮기지 말고 그대로 두어야 합니다.

 

  저는 초반에 텍스트 파일을 다른 폴더로 옮겼다가 하던 작업이 다 사라져서 뭐지 하고 다시 했었는데, 알고보니 텍스트 파일을 옮겨서더라고요!

 

 

  처음 라벨링을 할 때는 생각보다 복잡해 오랜 시간이 걸렸지만, 하다보면 익숙해져서 더 빠르게 라벨링을 진행할 수 있었습니다. 여러분도 한 번 LabelImg를 활용하여 직접 라벨링 해보고, 이를 이용해 YOLO모델로 객체인식을 한 번 해보는건 어떨까요?