AI 활용

아이들 학습지를 한꺼번에 스캔해서 AI에게 자동으로 분류시키는 이야기

아이들 학습지를 한꺼번에 스캔해서 AI에게 자동으로 분류시키는 이야기

Photo: public.resource.org (CC0 1.0) via Flickr

안녕하세요, まさきん입니다.

저희 집에는 아이가 여럿 있습니다. 각자 다니는 학습지나 교재가 다릅니다. 프린트물 더미를 매번 손으로 분류하는 게 은근히 부담이었습니다.

한꺼번에 스캔하고, 이후 분류는 AI에게 맡긴다. 그런 구조를 만들어봤습니다. 이번에는 실제로 쓰고 있는 코드와 규칙까지 구체적으로 소개합니다.

계기는 “분류만으로 시간이 녹는다”는 것

끝낸 학습지나 프린트물은 아이 수만큼 종류가 있습니다. 과목도 학년도 제각각입니다. 한꺼번에 놓아두면 결국 어느 것이 누구 것인지 알 수 없게 됩니다.

한 장씩 손으로 넘겨서 확인하는 건 단순 작업이지만 시간이 걸립니다. 그래서 이 “분류” 부분만 자동화할 수 없을지 생각했습니다.

구조의 전체 흐름

흐름은 단순합니다. 다음 3단계로 나누고 있습니다.

  1. 끝낸 프린트물을 한꺼번에 스캔해서 PDF로 만든다
  2. PDF를 한 장씩 이미지로 변환하고, AI에게 헤더나 레이아웃의 특징으로부터 “누구의·어느 과목” 프린트인지 판정하게 한다
  3. 판정 결과를 바탕으로 아이별·과목별 도구에 반영한다

포인트는 스캔 시점에는 분류를 생각하지 않아도 된다는 것입니다. 일단 한꺼번에 읽어들이고, 판단은 나중에 AI에게 맡깁니다.

PDF를 페이지별 이미지로 변환한다

스캔한 PDF는 그대로 AI에게 읽히면 제대로 인식되지 않을 수 있습니다. 특히 손글씨 채점 결과가 들어간 스캔 PDF는 문자 레이어를 갖지 않은 단순한 이미지 모음인 경우가 많기 때문입니다.

그래서 먼저 PyMuPDF(fitz)로 페이지를 한 장씩 PNG 이미지로 변환합니다.

import fitz

doc = fitz.open("scan.pdf")
for i in range(doc.page_count):
    pix = doc[i].get_pixmap(matrix=fitz.Matrix(2, 2))  # 2배 해상도
    pix.save(f"page_{i+1}.png")

Matrix(2, 2)로 해상도를 2배로 높인 다음 이미지화하면, AI가 글자나 체크란을 읽어내는 정확도가 올라갑니다. 손글씨 채점 결과는 특히 해상도가 낮으면 놓치는 경우가 늘어납니다.

빠지기 쉬운 함정: 좌표의 단위

체크란만 확대해서 확인하고 싶을 때, get_pixmapclip 인자로 범위를 지정할 수 있습니다. 여기에 함정이 하나 있습니다. clip의 좌표는 PDF의 포인트 좌표, 즉 원본 페이지 크기로 지정하는 것으로, 확대 후의 픽셀 좌표가 아닙니다.

# 2배·4배로 확대해도, clip의 수치는 페이지의 실제 크기(A4라면 약 590×836pt) 그대로 지정한다
pix = doc[i].get_pixmap(matrix=fitz.Matrix(4, 4), clip=fitz.Rect(0, 140, 589, 600))

배율을 곱했다고 해서 clip의 수치까지 키워버리면, 범위가 이미지 밖으로 나가 헛돌게 됩니다. 이 부분을 혼동하면 “왜인지 자른 이미지가 새하얗다”는 현상에 빠지므로, 처음에 알아두면 시간을 절약할 수 있습니다.

판정 로직

AI에게 전달하고 있는 지시를 일반화해서 소개합니다.

아래는 스캔한 학습지 이미지입니다.
다음 힌트를 바탕으로 어느 아이·어느 과목의 프린트인지 판정해주세요.

- 페이지 상단의 로고나 제목 디자인
- 줄이나 레이아웃 형식(칸의 크기, 줄 간격 등)
- 기재된 단원명이나 문제 형식
- 이름란에 적힌 이름

판정 결과는 "아이 ID" "과목" "단원" 세 항목으로 답해주세요.
판단이 어려운 경우는 "불명"이라고 답하고, 억지로 결정하지 말 것.

실제 분류에서는 제목의 문구·레이아웃의 특징·이름란 이 세 가지를 조합한 “식별표”를 먼저 만들어두고, AI에게는 그 표와 대조시키는 방식을 쓰고 있습니다. 예를 들어 “한자 쓰기 학습지로 우측 상단에 학년명이 들어 있다”와 “계산 학습지로 각 문제 좌측 하단에 작게 문제 유형 기호가 인쇄되어 있다”는 겉모습만으로 거의 확실하게 구별할 수 있습니다. 표로 만들어두니 AI의 판정이 흔들리기 어려워졌습니다.

분류 수고를 구조로 줄인다는 발상은, 프린트물 외에도 쓸 수 있을지 모릅니다. 방치하기 쉬운 휴대폰 요금제 재검토도 비슷한 이야기라고 느낍니다.

가입하지 않아도 100포인트를 받는 요금 시뮬레이션 휴대폰비 '구조화'도 들여다보기

누르면 라쿠텐 로그인 페이지가 열립니다. 로그인하면 캠페인 내용이 표시됩니다.

채점 규칙은 역시 “체크만으로” 통일

여러 아이의 교재를 다루는 데 있어, 또 하나 정해둔 것이 있습니다. 채점 기준을 아이에 상관없이 통일하는 것입니다.

구체적으로는 각 문제의 왼쪽 또는 좌측 상단에 있는 체크란이 칠해져 있는지 여부만을 정답·오답 판단 재료로 삼습니다.

글자의 정성스러움이나 지우개로 고친 흔적은 판단에 포함하지 않습니다. 이유는 단순합니다. 체크가 되어 있는지는 기계적으로 읽어낼 수 있지만, 손글씨의 정성스러움을 평가에 섞으면 순식간에 기준이 흔들립니다.

그래서 “정오 판단은 체크란의 칠해짐만으로 하고, 글씨를 잘 쓰고 못 쓰고나 빨간 글씨 정정은 판단 재료로 삼지 않는다”는 규칙을, 처음에 AI에게 주는 지시로 명문화하고 있습니다. 이 한 문장이 있는지 없는지로 판정의 흔들림이 꽤 달라졌습니다.

체크란 놓침을 막는 확대 절차

스캔 이미지 전체를 축소한 채로 보면, 체크란의 칠해짐이 뭉개져서 안 보일 수 있습니다. “전부 써 있으니까 전부 정답”이라고 성급하게 판단하지 않도록, 다음 절차를 반드시 거칩니다.

  1. 페이지 전체를 확인하고 대략적인 레이아웃을 파악한다
  2. 체크란 열만 잘라내서 확대한다(앞서 언급한 clip을 사용)
  3. 확대한 이미지로 한 문제씩 칠해져 있는지 확인한다
  4. 판정이 애매한 체크란이나, 아예 글자를 읽을 수 없는 부분은 추측하지 말고 사람에게 확인받는다

썸네일 크기의 축소 이미지만으로 판단을 끝내면 칠해짐을 놓치는 일이 생기기 쉽다고 실감하고 있습니다.

과목에 따라 “오답의 단위”를 바꾼다

또 하나 신경 쓰고 있는 점이 있습니다. 오답을 기록하는 단위를 과목마다 바꾸는 것입니다.

과목기록하는 단위구체적인 예
한자·히라가나 연습글자 단위”校”、“ぬ”처럼 글자 자체를 키로 한다
수학문제 패턴 단위”단위 환산” “나머지가 있는 나누기” “자리값”처럼 문제 유형을 키로 한다
과학·사회테마+소항목 단위”테마명:섹션:번호”처럼 계층화한 키로 한다

같은 “틀린 문제”라도 과목에 따라 돌아봐야 할 단위가 다릅니다. 한자를 단원 단위로 묶어버리면 다음 복습의 정밀도가 떨어집니다. 반대로 수학의 “패턴”을 문제 하나 단위로 하면 복습 대상을 좁히기 어려워집니다.

수학의 경우 각 문제 구석에 작게 문제 유형을 나타내는 기호를 인쇄해두고, 채점 결과를 읽을 때는 그 기호 단위로 오답을 집계하고 있습니다. 같은 유형의 문제가 여러 개 있고 하나라도 틀렸으면 그 유형 전체를 “복습 필요”로 취급한다는 단순한 규칙입니다.

과학·사회는 프린트물 끝의 복습 코너가 당일의 메인 주제와 다른 단원에서 출제되는 경우가 있어서, 문제 문장을 테마 목록과 대조한 다음 어느 테마의 복습인지 특정하도록 하고 있습니다. 짐작만으로 정하지 않고 반드시 대조한 뒤 기록하는 부분입니다.

이 구조는 원래 다른 목적으로 만들었던 “틀린 항목을 기록하고 반복 출제하는” 구조를 그대로 가져온 것입니다. 목적이 바뀌어도 기반 로직은 그대로 쓸 수 있었습니다.

실행 환경을 나눈 이유

이 구조는 AI와의 대화 자체는 클라우드 샌드박스 환경에서 진행하고, 실제 파일 조작이나 상태 관리는 집 컴퓨터 쪽의 상주 프로세스에 맡기는 2단 구성으로 되어 있습니다.

이유는 단순합니다. 채점 결과를 저장하는 데이터베이스나 학습지 생성용 스크립트가 집 컴퓨터에만 있기 때문입니다. 클라우드 쪽에서 집 쪽으로는 간단한 명령을 보내기만 하는 경량 클라이언트 스크립트를 거쳐 접근합니다.

# 예: 판정 결과를 바탕으로 틀린 키를 반영한다
python3 tools/kanji_drill/kanji_bridge_client.py mark-miss 校庭 音楽
python3 tools/kanji_drill/kanji_bridge_client.py mark-correct 教室

# 반영 전에, 집 쪽 상주 프로세스가 살아있는지 확인한다
python3 tools/kanji_drill/kanji_bridge_client.py health

health 명령을 반영 직전에 반드시 끼워넣도록 하고 있습니다. 집 쪽 프로세스가 멈춰 있는 걸 모르고 mark-miss를 계속 보내면, 명령은 성공한 것처럼 보이지만 실제로는 아무것도 반영되지 않는 사고로 이어지기 때문입니다.

해보고 느낀 점

가장 도움이 된 것은 “누구의·어느 과목인지”를 확인하는 작업이 없어진 것입니다. 한꺼번에 스캔하고 나머지는 결과만 보면 됩니다.

다만 AI의 판정을 완전히 신뢰하는 것은 아닙니다. “불명”이라고 나온 부분이나 체크란 판정이 애매한 부분은 반드시 직접 눈으로 확인하고 있습니다. 억지로 분류시키기보다 모르는 것은 모른다고 말하게 하는 쪽이, 결과적으로 신뢰할 수 있는 구조가 된다고 느낍니다.

이런 분에게 추천합니다

정리

여러 아이의 교재는 양이 늘어날수록 분류 부담이 커집니다. 스캔과 AI 분류를 조합해서, 그 부분만 잘라내어 자동화할 수 있었습니다.

좌표 단위나 채점 기준 명문화 같은 소소한 노하우가, 실은 정확도를 안정시키는 데 가장 효과적이었다고 느낍니다. 구조화를 생각할 때는 이런 “판단 기준 자체를 정하는” 작업이 의외로 중요할지도 모릅니다.

구조화로 줄일 수 있는 부담은 프린트물 분류만이 아닐지도 모릅니다. 다음은 휴대폰 요금제를, 같은 방식으로 재검토해보려고 합니다.

가입하지 않아도 100포인트를 받는 요금 시뮬레이션 휴대폰 요금제도 '구조화'로 재검토해보기

누르면 라쿠텐 로그인 페이지가 열립니다. 로그인하면 캠페인 내용이 표시됩니다.

이 글에는 제휴 광고가 포함되어 있습니다. 이 사이트의 링크를 통해 상품·서비스에 신청하시면 제휴사로부터 보상을 받을 수 있습니다. 또한 운영자는 라쿠텐 그룹 소속 직원으로, 사원 추천 프로그램을 통해 보상을 받는 경우가 있습니다. 기사 내용과 평가는 광고 유무와 관계없이 운영자의 실제 경험과 조사를 바탕으로 작성했지만, 위 관계를 이해하신 후 읽어 주시기 바랍니다. 자세한 내용은 면책조항·제휴 링크 안내를 참고해 주세요. 면책조항·제휴 링크 안내

이 글에는 기계 번역이 포함되어 있습니다. 정확한 조건은 라쿠텐 모바일 공식 사이트의 다국어 페이지에서 확인해 주세요.

라쿠텐 모바일의 통신 지역·전파 상황이 궁금하신 분은, 공식 전파 개선·조사 요청 양식 을 통해 문의하실 수 있습니다.

ABOUT THE AUTHOR
まさきん

라쿠텐 그룹 근무·디지털 마케터(FP 자격 보유)

40대 초반, 맞벌이·네 자녀의 아빠. 라쿠텐 그룹에서 디지털 마케터로 근무하면서, 재무설계사(FP) 자격을 활용해 가계 관리와 자산 형성에도 힘쓰고 있다.

프로필 보기

관련 글

RELATED
Grok을 쓰고 싶어서 X Premium에 가입했더니, 테슬라에서도 쓸 수 있게 되어 있던 이야기 AI 활용

Grok을 쓰고 싶어서 X Premium에 가입했더니, 테슬라에서도 쓸 수 있게 되어 있던 이야기

Grok을 쓰고 싶어서 X의 유료 플랜에 가입했습니다. 그런데 마침 같은 시기에 테슬라 차 안에서도 같은 Grok을 쓸 수 있게 되어 있어서 놀랐습니다. 요금 플랜을 고르는 법부터 차 안에서 쓰는 법까지, 직접 확인한 내용을 정리합니다.

2026.09.01 · 읽는 시간 약 3분
말로 전해지는 가족 일정을 AI로 손쉽게 구글 캘린더에 등록하는 방법 AI 활용

말로 전해지는 가족 일정을 AI로 손쉽게 구글 캘린더에 등록하는 방법

가족 라인이나 대화로 들은 "다음 달 운동회는 10/25 9시부터" 같은 일정을, AI에게 말만 하면 구글 캘린더 등록용 링크로 만들어주는 방법을 소개합니다. 스캔이나 앱 설치도 필요 없습니다.

2026.07.10 · 읽는 시간 약 5분
아침 준비 중에 AI에게 한 장의 '오늘의 브리핑'을 만들게 하는 이야기 AI 활용

아침 준비 중에 AI에게 한 장의 '오늘의 브리핑'을 만들게 하는 이야기

일정·메일·채팅을 AI에게 정리시켜, 아침 준비를 하면서 볼 수 있는 한 장의 브리핑을 자동 생성하는 구조를 만들었습니다. 정보를 모으는 방법부터 화면 디자인까지, 그대로 따라할 수 있는 형태로 소개합니다.

2026.06.22 · 읽는 시간 약 6분
라쿠텐 모바일로 전환 시 최대 14,000포인트 가입하지 않아도 100포인트를 받는 요금 시뮬레이션 →
지금 신청하기 →