Skip to content

Sol.Pic(Solve Picture)은 수학문제 이미지를 AI를 활용해 풀이과정과 정답을 제공해주는 모바일기반 어플리케이션 입니다.

Notifications You must be signed in to change notification settings

SolPict/SolPic-client

Repository files navigation

프로젝트 소개


Sol.Pic(Solve Picture)은 수학문제 이미지를 AI를 활용해 풀이과정과 정답을 제공해주는 모바일기반 어플리케이션 입니다.

클라이언트 | 서버 | 노션

구성

분석과정

image-1

미리보기

다양한 문제 제공

펼치기

문제풀이 기능

펼치기

리뷰노트 서비스 제공

펼치기

기술 스택

프론트엔드

프론트엔드

백엔드

백엔드

기술선택이유

  • 모바일 ✓ vs 웹

    • 프로젝트의 메인기능인 이미지를 찍어서 문제를 해결하는 과정을 거치므로 유저입장에서 쉽게 이미지를 찍을 수 있는 모바일 기술을 선택하였습니다.
    • 모바일일 경우 좀 더 유연한 환경에서 서비스를 제공받을 수 있기 때문에 사용자 경험을 극대화하기 위해 모바일 기술을 선택하였습니다.
  • Expo ✓ vs Cli

    • 짧은 프로젝트 기한 동안 여러 가지를 구현해야 하는 입장으로써 다양한 API와 Expo Go라는 앱을 제공해 주어 개발을 용이하게 도와주기 때문에 Expo를 선택하였습니다.
    • 모바일 플랫폼 환경에서 처음으로 개발해 보기 때문에 초기세팅과 빌드 및 배포 그리고 학습적인 측면에서 좀 더 간편하기 때문에 Expo를 선택하였습니다.
  • Python ✓ vs Javascript

    • 프로젝트에서 딥러닝 모델을 사용해야 해야 해서 pytorch 또는 TensorFlow가 꼭 필요한 상황이었기 때문에 Python언어를 선택하였습니다.
    • 그 외에도 수식 관련 다룰 수 있는 SymPy, 이미지 처리(OCR) 관련해서도 OpenCV, EasyOCR 등 데이터를 조작하고 다룰 수 있게 도와주는 라이브러리들이 많았기 때문에 Python언어를 선택하였습니다.
  • S3 ✓

    • 기존 데이터베이스(MongoDB)가 있지만 프로젝트 특성상 이미지라는 용량이 큰 파일을 다루기 때문에 대용량의 데이터를 다루기 용이한 S3을 선택하였습니다.
    • 클라이언트 측에서도 쉽게 접근할 수 있는 기능을 제공해 주기 때문에 서버의 부담을 줄일 수 있고 요청 또한 서버와 병렬적으로 보내서 작업할 수 있기 때문에 S3을 선택하였습니다.

진행 과정

총 프로젝트 기간: 9월 2일 ~ 10월 2일

주차 계획
1주차 - 아이디어 선정
- 선정된 아이디어 기술 스택 결정 및 검증
2주차 - Expo 이용한 새로운 플랫폼(모바일) 정적페이지 구현
- 이미지 분석(OCR) 기술 구현 가능 여부 판단 -> API 사용으로 결론
- 딥러닝 모델 구현 가능 여부 판단 -> 학습된 딥러닝 모델 가져오기로 결론
3주차 - 프로젝트에 적합한 이미지 분석(OCR) API 탐색 및 적용
- 프로젝트에 적합한 딥러닝 모델 탐색 및 적용
4주차 - 새로운 환경(FastAPI) 서버 CRUD 구현
- 클라이언트측 UI, UX 구현
- GPU 부재로 인한 집에서 서버 연결
- 상호연결에 의한 에러 처리

사전 설명

딥러닝 모델이 "사고"해서 수학문제를 풀 수 있을까?

해당 질문의 답변은 "사고"해서 풀 수 없습니다.

"사고"의 사전적 의미로는 "어떤 것에 대하여 깊이 있게 생각한다."라는 뜻이 있습니다. 그럼 여기서 "생각한다"의 사전적 의미를 한 번 더 살펴보면 "결론을 얻으려고 헤아리고 판단하고 인식하는 관념의 과정"이라는 뜻을 찾을 수 있습니다.

AI와 사람을 비교했을 때, 사람의 경우 직관적이고 창의적인 과정을 통해 수학 문제를 해결합니다. 반면 AI는 대규모 데이터를 기반으로 규칙을 찾아내어 결과를 추론하고 예측하는 방식으로 문제에 접근하므로, “사고”를 한다고 볼 수 없습니다.

때문에 AI경우 수 많은 데이터를 기반으로 정답에 근접한 값을 단순히 "찾는다" 라는 표현이 더 가깝습니다.

그러면 어떻게 수학문제를 풀어야 할까요?

기존 수학 문제 풀어주는 AI의 해결과정

대부분의 서비스에서 AI가 수학문제를 풀 수 있는 것의 대한 해답은 문제 전체를 구조화된 코드 형태로 바꾸는 것에 있습니다.

구조화된 형태로 변환된 수학 문제는 딥러닝 AI에 의해 큰 문제 유형(대수학, 기하학, 통계학 등등)으로 먼저 분류됩니다. 그 후, 세부적으로(이차 방정식, 미적분, 확률과 통계 등등) 다시 분류되어 각 유형에 맞는 풀이 과정을 거칩니다. 문제 해결 과정과 정답은 기록되어, 마지막으로 자연어 생성(NLG) 과정을 통해 사용자에게 풀이 과정과 함께 결과가 제공됩니다.

image


문제, 해결방안

1. 이미지 인식에서 도전 과제

1-1. 수식으로 인한 이미지 분석(OCR) 과정의 어려움

이미지 분석에서 정확도를 Confident로 나타낼 수 있는데 1에 가까울 수록 높은 정확도를 나타냅니다.

기존에 사용하려던 이미지 분석(OCR) 기술은 수식이 아닌 텍스트에 대해서는 비교적 정확하게 분석하는 것을 확인할 수 있고 텍스트 분석 결과의 신뢰도(Confident)가 1에 가까웠습니다. 하지만, 수식에 대한 분석은 정확도가 떨어지며, 신뢰도(Confident)가 0에 가까운 결과를 보여주었습니다.

기존 이미지 분석 결과
image image

그렇게 수식을 인식시킬 방법을 고민하다가 두 가지 방법을 시도했습니다.

첫 번째 방법은 OpenCV를 사용하여 수식 영역과 텍스트 영역을 분리한 후, 각각 따로 분석하는 방식이었습니다.
그러나 이 방법에서는 영역 분리가 제대로 이루어지지 않았고, 기대했던 성과를 얻기 위해선 openCV에 대해 깊게 공부할 시간이 필요하다는 것을 깨달았습니다.

기존 이미지 분석 결과
image image

두 번째 방법은 여러 수식 전용 외부 API 서비스를 비교한 후, 가장 정확하게 수식을 분석해 주는 API를 선택하는 것이었습니다.
이 방법을 통해, 수식과 텍스트 영역을 별도로 처리하는 대신, 수식 인식에 특화된 API를 사용하여 보다 정확한 결과를 얻을 수 있었습니다. 그 결과, 수식 분석이 성공적으로 완료되었고, 이전 방식에서 겪었던 문제들을 해결할 수 있었습니다.

기존 이미지 분석 결과
image image

2. 딥러닝 모델 적용까지 도전과제

2-1. 모델 새로 만들기 vs. 학습된 모델 활용하기

제가 선택한 방법은 기존에 학습된 모델을 활용하는 것이었습니다. 이를 선택한 이유는 두 가지입니다.

첫째, 딥러닝 모델을 만들기 위한 학습시간이 부족했습니다.

딥러닝 모델을 만들기 위해서는 신경망의 구조, 역전파 알고리즘, 손실 함수의 작동 원리 등 딥러닝의 핵심 개념들을 깊이 이해해야 합니다. 또한, 모델을 만든 후에는 최적화 작업도 필요하며, 이는 높은 수준의 지식과 경험이 요구됩니다. 이 과정에는 많은 시간이 소요되기 때문에, 시간을 보다 효율적으로 관리하기 위해 기존에 학습된 모델을 활용하는 방법을 선택했습니다.

둘째, 학습에 필요한 데이터 양이 충분하지 않았습니다.

딥러닝 모델이 좋은 성능을 발휘하려면 많은 양의 학습 데이터가 필요합니다. 특히, 수학 문제 풀이와 관련된 모델의 경우 문제 유형에 따른 다양한 데이터를 확보해야 하는데, 이는 수학적 개념, 문제의 난이도, 문제 유형에 따라 달라질 수 있지만, 일반적으로 모델을 제대로 학습시키려면 최소 10,000개 이상의 많은 양의 데이터(문제, 풀이, 정답)가 필요합니다. 때문에 프로젝트 기한 동안 충분한 데이터를 확보하기 어렵다고 판단해서 학습된 모델을 활용하는 방법을 선택했습니다.

image

이러한 이유로 이미 학습된 모델을 가져와 제가 원하는 방향으로 추가 학습시키는 방식을 선택했습니다. 제가 사용한 모델은 단순한 수학 문제를 입력받아 풀이 과정과 답을 제공하는 AI 딥러닝 모델이었습니다.

3. 딥러닝 모델 적용 후 도전과제

3-1. 수학 문제 해결을 위한 고성능 그래픽 카드(GPU)의 필요성

딥러닝 모델을 사용하는데 가장 큰 어려움은 그래픽카드(GPU)의 부재였습니다.

그래픽카드가 필요한 이유는 2가지가 존재하는데

첫 번째 이유는 대규모 딥러닝 모델(LLM)이 연산을 수행하는 데 많은 시간이 걸리기 때문입니다. 연산을 수행하는데 복잡하고 많은 행렬 계산이 필요합니다. 연산을 CPU로 처리할 경우 상당한 시간이 소요되어 성능 저하를 초래할 수 있는 반면, GPU는 병렬 작업에 특화되어 있어 동시에 많은 계산을 수행할 수 있어 연산 시간을 획기적으로 단축할 수 있습니다. 그렇기 때문에 수학 문제를 해결할때 복잡한 수식과 행렬 계산을 GPU를 사용하면 훨씬 더 빠르게 처리할 수 있습니다.

두 번째 이유는 대규모 딥러닝 모델(LLM)을 학습하고 훈련하는 과정에서도 많은 시간이 필요합니다. 대규모 모델을 학습하기 위해선 최소 몇 백만에서 많게는 수 억개의 매개변수를 조정해야 합니다.따라서 시간을 효율적으로 단축하기 위해 병렬적으로 수행해야 하며, GPU의 병렬 처리 능력을 활용하여 훈련 시간을 크게 단축할 수 있습니다.

따라서, 대규모 딥러닝 모델에서 연산과 훈련 과정에서 요구되는 많은 시간을 효율적으로 단축할 수 있도록 도와줍니다.

3-2. 고성능 GPU 없는 개발 환경에서 개발하기

딥러닝 모델을 사용하기 위해서는 고성능 GPU가 반드시 필요했지만 프로젝트를 진행했던 개발 환경에서는 GPU가 부재인 상황이였습니다. 그래서 이를 해결하기 위해 두 가지 방법을 활용해서 개발을 진행하였습니다.

첫 번째 방법으로는, 클라우드 기반 개발 환경인 ‘Colab’을 활용했습니다. Colab은 클라우드 환경에서 고성능 GPU를 제공하므로, 이를 통해 딥러닝 모델을 실행하고, 입력에 따른 출력을 받아와서 사용할 수 있었습니다. 이렇게 클라우드 환경을 이용하면 GPU가 없는 환경에서도 복잡한 모델을 실행한 결과를 받아서 사용할 수 있었습니다.

image-7

두 번째 방법으로는, 로컬 서버를 외부에서 접근할 수 있게 해주는 도구인 ‘ngrok’을 사용했습니다.
ngrok을 통해 집에 있는 데스크톱 컴퓨터를 서버로 활용할 수 있었습니다. ngrok은 로컬에서 실행 중인 서버를 안전한 터널링을 통해 인터넷에 공개할 수 있게 해주며, 이를 통해 외부 어디서든 로컬 서버에 접근할 수 있습니다. 이렇게 데스크톱의 성능을 활용하여 더 안정적인 환경에서 모델을 실행할 수 있었습니다.

image

위의 방법들을 통해 고성능 GPU의 부족 문제를 간접적으로 해결하면서, GPU가 없는 환경에서도 대규모 모델을 사용하면서 개발을 진행할 수 있었습니다.

4. 딥러닝 모델 정확도 향상 전략

4-1. 딥러닝 모델의 성능을 높이는 이미지 처리 전략

이미지 분석(OCR)을 통한 정확도를 향상하기 위해 저는 2가지 방법을 사용하였습니다.

첫 번째 방법으로, 비교를 통해서 좀 더 정확도가 높은 API를 사용하였습니다.

기존 OCR 경우 원본 사진이 흐릿하거나 초점이 안맞을 경우 이미지 인식에서 부정확한 경우가 많았습니다. 하지만 새로운 API를 사용하면서 이러한 문제들이 크게 개선되었습니다.

변경 전 변경 후
image image
image image

원본 사진이 다소 어둡거나 번호 인식에 문제가 있었던 부분이 개선된 것을 확인할 수 있습니다. 더 정확한 분석을 제공하는 API를 통해 이미지 분석의 정확도가 크게 향상되었습니다.

두 번째 방법으로, 이미지 자르기 기능과 회전 기능을 추가해 정확도를 더욱 높였습니다.

이미지 자르기 이미지 회전
image

위 사진처럼, 이미지 자르기를 통해 불필요한 부분을 제거하여 OCR 처리 시 중요한 부분만 인식할 수 있도록 했습니다. 또한, 기울어진 이미지를 회전 기능으로 보정해, 인식 대상이 똑바로 정렬되도록 하여 인식의 정확도를 더욱 높였습니다. 이러한 전처리 과정은 OCR 엔진이 텍스트를 보다 정확하게 추출할 수 있게 해 주었습니다.

추가로, 더 나은 정확도를 위해 직접 이미지 분석(OCR) 기술을 배우고 활용하는 것도 고려해 볼 수 있습니다. 이 방법은 이미지 전처리와 후처리를 더욱 세밀하게 다룰 수 있게 해 주며, 특정 문제에 맞춤형으로 OCR 성능을 최적화할 수 있는 가능성을 제공합니다. 예를 들어, 텍스트 추출 전 이미지의 노이즈를 제거하거나, 특정 문자 패턴에 맞게 조정하는 등의 작업을 수행할 수 있습니다. 이를 통해 더 정밀한 OCR 처리 결과를 얻을 수 있을 것입니다.

4-2. 딥러닝 모델의 언어 최적화 전략

학습된 모델의 사용 언어에 맞춰 입력을 해주는 작업을 통해 정확도를 향상해주는 방법을 사용하였습니다.

언어 입력 결과
한글 image image
영어 image image

결과를 보면, 한글로 입력했을 때는 "5"라는 오답이 나오는 것을 볼 수 있습니다. 반면, 영어로 입력했을 때는 정상적으로 "0.5 (1/2)"라는 답이 도출되었습니다. 이는 모델이 영어 데이터로 학습된 경우, 영어로 입력할 때 더 정확한 결과를 제공할 수 있다는 것을 보여줍니다.

따라서, 모델에 입력하기 전에 한글 데이터를 영어로 변환하는 전처리 과정을 추가했습니다. 이를 통해, 입력 언어와 모델의 학습 언어를 일치시킴으로써, 결과의 정확도를 향상시킬 수 있었습니다. 이 방법은 특히 모델이 특정 언어에서 학습된 경우에 유용하며, 자연스러운 언어 처리가 중요한 딥러닝 모델에서 효과적으로 사용할 수 있습니다.

이를 통해 입력 데이터와 모델의 학습 데이터 간의 언어적 일관성이 모델 성능에 중요한 영향을 미친다는 점을 확인할 수 있게 해주었습니다.

프로젝트 소감

돌이켜 봤을때 프로젝트 느낀점을 한마디로 표현하면 "선택의 연속" 이였습니다. 어떤 아이디어로 만들지부터, 누가 이 프로젝트를 사용하면 좋을지에 대한 측면과 어떤 기능을 제공해주면 좋을지에서부터 시작을 하게 되었습니다. 아이디어가 정해지고 나니 어떤 기능을 제공해주어야 할지 어떤 플랫폼에서 서비스를 제공해주어야 할지, 어떤 상태관리를 써야 할지, 어떤 라이브러리를 써야 할지 등등 수많은 선택 중 어떤 것을 사용하면 좀 더 유저에게 좋은 경험을 전달할 수 있을지에 초점을 맞춰서 선택했습니다.

그렇게 기획단계가 끝나고 구현단계에서도 선택은 따라왔었고, 항상 맞는 선택만 하지는 않았습니다. 2주차 때 OCR과 딥러닝 모델을 구현해보려고 호기롭게 도전하는 선택을 했지만, 결과는 미흡한 기능과 촉박해진 프로젝트 기간만 남게 되었습니다. 하지만 그런 도전을 통해 어느 정도까지 구현이 가능할지에 대한 판단 기준과 기초 지식이 많이 중요하다는 것을 깨달았고, 스스로 내린 결정에 책임감을 직접 경험해 볼 수 있었습니다. 남은 시간에 빠르게 판단하여 API와 모델을 가져오는 선택을 하였고 그렇게 무사히 프로젝트 구현을 끝마쳤습니다.

이러한 선택들이 모여 프로젝트를 완성하게 되었고, 내가 선택한 결정들이 실제 사용자에게 어떻게 가치를 전달할 수 있을지에 대해 생각을 해보았습니다. 프로젝트가 실제 환경에서 어떤 방식으로 활용될 수 있을지, 그리고 그로 인해 사용자가 어떤 경험을 할 수 있을지 고민하며 깊이 있는 학습을 할 수 있었습니다. 또한, 기술적인 부분 외에도 모든 의사결정을 스스로 판단하고 근거를 조사하면서 문제 해결 능력과 상황 판단력이 성장했다고 느꼈습니다.

이러한 과정을 통해 자신감과 책임감을 느꼈고 많은 것을 배우고 성장할 수 있었던 좋은 기회가 됐습니다. 이는 앞으로의 프로젝트와 커리어에 큰 도움이 될 것으로 생각합니다.

앞으로도 이러한 경험을 바탕으로 더 큰 도전과 책임감을 가지고, 새로운 기술과 도구를 익히며 계속해서 성장해 나가는 그런 개발자가 되겠습니다.

About

Sol.Pic(Solve Picture)은 수학문제 이미지를 AI를 활용해 풀이과정과 정답을 제공해주는 모바일기반 어플리케이션 입니다.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published