종이 시험지 자동 채점 프로그램 | Tensorflow Object Detection API | Faster RCNN | Ch3. 문제 분류 모델 학습하기

박나연·2021년 11월 23일
0

2021CapstoneDesign

목록 보기
5/7
post-thumbnail

학습을 위한 라벨링 (Labeling)

먼저 이번 챕터에서 진행하는 학습은 촬영된 시험지에 몇개의 문제가 있는지, 그 위치를 파악하기 위한 것입니다. 따라서 앞서 만들어낸 데이터에서 문제 위치를 직접 라벨링해야 했고, 처음에는 CVAT라는 라벨링 툴을 활용하여 라벨링을 진행했었습니다. 또한 이 라벨링툴에서는 TFRecord로 바로 변환해주는 기능이 있어 이를 활용하여 학습을 진행했습니다. 그러나 학습 후 예측결과를 inference하는 과정에서 아무것도 detection 되지 않는 모습을 확인할 수 있었고, 이에 대해 어떤 것이 문제인지 살펴보며 약 2주 정도가 지난 것 같습니다.

직접 커스텀데이터를 사용하여 학습을 진행하는 많은 블로그에서는 먼저 각 이미지를 라벨링한 정보를 xml파일로 우선 저장을 하고, 그것을 csv파일로 통합한 뒤, TFRecord파일로 변환하는 과정을 거치고 있었습니다. 조금 번거롭다는 생각이 들었지만, 문제원인을 찾기 위해 이 방법을 진행했고, 빠른 테스트를 위해 3개의 이미지로만 실행해본 결과 무언가 detection 되는 것을 시각화 해낼 수 있었습니다.

따라서 저는 LabelImg 라는 라벨링 툴을 활용하여 각 이미지에 대한 라벨링 정보를 xml파일로 저장하는 과정을 재진행했습니다.

또한 이번 라벨링을 새롭게 진행하면서 몇가지 수정사항이 있었습니다.
1. 오지선다형 시험만을 데이터에 포함했습니다.
- 사지선다형을 제외하여 좀 더 학습 범위를 좁혀 정확도 향상에 집중했습니다.
2. 라벨링하지 않는 서술형이 포함된 이미지를 제외했습니다.
- 아무것도 라벨링되어 있지 않은 이미지를 학습하는 경우에 꽤 있었습니다.
3. 이미지를 회전하는 데이터 증강과정을 제외했습니다.
- 실제 데이터를 segmentation하고, 투시변환을 하는 과정에서 회전된 시험지를 이미 바로잡아주는 과정을 거치게 됩니다. 따라서 학습에 혼동을 주는 회전이미지는 불필요하다 판단했습니다.

총 1992장의 데이터로 증강을 완료했고, 이를 6 : 2 : 2 비율로 train : val : test set으로 split했습니다.

라벨링을 완료하면 xml 파일들을 가지고 다음 단계로 넘어갑니다.


xml to csv to TFRecord

https://seoftware.tistory.com/108?category=929874

TFRecord파일을 생성하기 위한 모든 코드는 위 블로그를 참고하였습니다. 모든 코드의 출처가 표시되어있으며 코드를 하나의 주피터 노트북파일로 합쳐 깃허브에 업로드하였습니다.

💥xml to csv to TFRecord

! python research/generate_tfrecord.py --csv_input=data/images_new/train/train_labels.csv --output_path=research/object_detection/data/question_train.record --i

앞서 생성한 csv파일을 통해 TFRecord파일을 위 한줄코드로 생성할 수 있습니다.


모델 학습하기

학습을 진행하기 위해 고민한 시간이 많이 흘렀습니다. 학습은 코랩으로 진행했고, 학습을 위한 디렉토리 구성은 아래와 같습니다.


디렉토리 구성

train.py 파일과 object_detection 폴더를 함께 두어야 에러가 나지 않습니다.


config 파일 수정사항

본격적으로 학습을 하기 전 몇가지 요구사항이 있습니다. 먼저 config파일 속 몇가지를 수정해 실행해야 합니다.

1. num_classes

2. input_path

아래 있는 eval_input_reader도 마찬가지로 수정합니다.


Label map

item {
	id: 1
	name: 'question'
}

Training

모듈을 import하고 아래 코드를 순서대로 실행합니다.

import numpy as np
import os
import six.moves.urllib as urllib
import sys
import tarfile
import tensorflow as tf
import zipfile

from collections import defaultdict
from io import StringIO
from matplotlib import pyplot as plt

from PIL import Image

from object_detection.utils import label_map_util
from object_detection.utils import visualization_utils as vis_util

!protoc object_detection/protos/string_int_label_map.proto --python_out=.

from google.colab import files
! pip install tensorflow==1.15
!pip install tf_slim
!pip install lvis
!pip install tensorflow-addons
!clear

버전을 다운그레이드해야 에러가 나지 않았습니다.

위 코드를 실행한 후 런타임을 다시시작합니다.

!protoc object_detection/protos/*.proto --python_out=.
!export PYTHONPATH=$PYTHONPATH:/content/object_detection
!export PYTHONPATH=$PYTHONPATH:/content/slim/

마지막으로 아래 코드를 실행하면 학습이 진행됩니다.

!python train.py --train_dir=object_detection/samples/configs/ --pipeline_config_path=object_detection/samples/configs/faster_rcnn_inception_resnet_v2_atrous_coco.config

마지막 config 파일을 앞에서 사용하고자 하는 모델의 config파일의 수정본을 넣으면 됩니다.

저는 4500 step까지 학습을 진행했고, 더 이상 하려 해도 코랩으로는 진행할 수 없었습니다.

학습을 진행하며 사용한 모든 코드는 깃허브에 업로드완료 했습니다.

💬Training Code

profile
Data Science / Computer Vision

0개의 댓글