AI를 이용한 노트 필기 앱 : APlus (데이터 전처리-csv 파일생성)

✔️ 목표

  • AIHub 에서 제공하는 한국어 글자체 이미지 데이터를 이용하여 사용자의 필기를 인식하는 노트 필기앱을 만드려고 한다.
  • 이를 위해 아래와 같이 총 3가지 파일을 다운 받아(약 12GB) 실습을 진행했다.

    손글씨
    01_handwriting_syllable_images 02_handwriting_syllable_images
    (+ handwriting_data_info1.json)

    인쇄체
    01_printed_syllable_images(+ printed_data_info.json)

✔️ json 파일 이해하기

  • 데이터의 label 및 정보가 json 파일 형태로 제공된다.
  • name-value 형식의 쌍
  • 값들의 순서화된 리스트 형식

    json (JavaScript Object Notation) 파일 이란?
    : 데이터를 저장, 전송할 때 많이 사용되는 경량의 DATA 교환 형식
    (JSON은 데이터 포맷일 뿐이며 어떠한 통신 방법도, 프로그래밍 문법도 아닌 단순히 데이터를 표시하는 표현 방법일 뿐이다!)

✔️ CSV 파일 생성 실습

import os
import json
import pandas as pd
from tqdm import tqdm #  진행상황을 피드백으로 제공
cd data
# 압축 해제
# !unzip -qq 01_handwriting_syllable_images.zip
# !unzip -qq 02_handwriting_syllable_images.zip

데이터 형태 확인

with open('handwriting_data_info1.json', 'r', encoding='utf-8') as handwriting_data:
    data_01 = json.load(handwriting_data)
type(data_01)
data_01.keys()
data_01['info']
data_01['images'][:2]
data01_anno = data_01['annotations']

print(len(data01_anno))
data01_anno[0]

csv 파일 생성

anno_list = [] # annotation을 담을 배열
id_list = [] # 이미지 id를 담을 배열
syllable_list = [] # 음절을 담을 배열 

for i in range(0, len(data01_anno)):
    if data01_anno[i]['attributes']['type'] == '글자(음절)':
        anno_list.append(data01_anno[i])
        id_list.append(data01_anno[i]['id'])
        syllable_list.append(data01_anno[i]['text'])
anno_list[:5]
# 경로 + label 저장할 list
syllable_file = []
# 1_syllable 파일 경로 + label
syllable1_filename = os.listdir("1_syllable")
syllable1_filename[:5]
for i in tqdm(range(0,len(syllable1_filename))):
    if syllable1_filename[i][:-4] in id_list:
        path = '1_syllable/' + syllable1_filename[i]
        number = id_list.index(syllable1_filename[i][:-4]) # 배열에서 원하는 id의 위치 찾기
        text = syllable_list[number]
        syllable_file.append([path, text])
        print(len(syllable_file))
syllable_file[:5]
# 2_syllable 파일 경로 + labe
syllable2_filename = os.listdir("2_syllable")
syllable2_filename[:5]
for i in tqdm(range(0,len(syllable2_filename))):
    if syllable2_filename[i][:-4] in id_list:
        path = '2_syllable/' + syllable2_filename[i]
        number = id_list.index(syllable2_filename[i][:-4]) # 배열에서 원하는 id의 위치 찾기
        text = syllable_list[number]
        syllable_file.append([path, text])
        
        print(len(syllable_file)) # 729,249
syllable_file[135842:135847]

한글 완성형 2350자만 사용 : output_class = 가 ... 힝

hangeul_2350 = []

# print(syllable_file[0][1])
for syllable in tqdm(syllable_file):
    if syllable[1] in output_class:
        hangeul_2350.append(syllable)
        
print(len(hangeul_2350))
hangeul_2350[:5]
# dataframe으로 변환
df = pd.DataFrame(hangeul_2350)

# rename
df.columns = ['img_path', 'label']

df.head()
# csv 파일로 저장
df.to_csv('hand_hangeul_2350.csv', index=False, encoding='utf-8-sig')

위와 같은 과정을 인쇄체에도 적용해주고 다음과 같이 concat을 통해 합친 후 최종 csv 파일을 만들어 주었다.

df1 = pd.read_csv('./hand_hangeul_2350.csv')
df2 = pd.read_csv('./printed_hangeul_2350.csv')

df = pd.concat([df1, df2]) # 두 data frame을 합친다.
df.to_csv('hangeul_2350.csv', index=False, encoding='utf-8-sig')

최종 결과물

다음과 같이 결과물이 나온다! 이미지는 잘렸지만 실제로는 264474 rows × 2 columns shape을 갖는다

✔️ 다음으로 할 일은? 🤔

다음 번에는 만들어진 csv 파일을 이용하여 pytorch로 VGG 모델을 구현하고 학습을 진행시켜보려고 한다.

좋은 웹페이지 즐겨찾기