OMR ๋ต์์ง๋ฅผ ์น์์ ์ ๋ก๋ํ๋ฉด ์๋์ผ๋ก ์ธ์ํ๊ณ ์ฑ์ ํ์ฌ CSV ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๋ ์์คํฑ ์์คํ ์ ๋๋ค.
์๋ณธ ํ๋ก์ ํธ: OMRChecker by Udayraj Deshmukh๋ฅผ forkํ์ฌ, ์น ๊ธฐ๋ฐ ์ธํฐํ์ด์ค์ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ ์ถ๊ฐ ๊ฐ๋ฐํ์์ต๋๋ค.
| ๊ธฐ๋ฅ | ์ค๋ช |
|---|---|
| ์น ๊ธฐ๋ฐ UI | ๋ธ๋ผ์ฐ์ ์์ ๋๋๊ทธ์ค๋๋กญ์ผ๋ก ์ด๋ฏธ์ง ์ ๋ก๋, ๊ฒฐ๊ณผ ํ์ธ, CSV ๋ค์ด๋ก๋ |
| ์ฉ์ง ์๋ ํฌ๋กญ | 3๊ฐ ์ฝ๋ ๋ง์ปค๋ฅผ ๊ฐ์งํ์ฌ OMR ์ฉ์ง ์์ญ๋ง ์๋ ์ ๋ ฌ ๋ฐ ํฌ๋กญ |
| ์ปฌ๋ฌ ๋๋กญ์์ | ๋นจ๊ฐ์ ์ธ์ ํ ํ๋ฆฟ์ด ๋งํน์ผ๋ก ์ค์ธ์๋์ง ์๋๋ก max(B,G,R) ๊ธฐ๋ฒ์ผ๋ก ์ปฌ๋ฌ ์ํฌ ์ ๊ฑฐ |
| ๊ฐ๋ก/์ธ๋ก ์๋ ํ๋ณ | ์ธ๋ก ์ด๋ฏธ์ง๋ ์๋ฐฉํฅ ํ์ ์๋ ํ ์ต์ ๋ฐฉํฅ์ ์๋ ์ ํ (๋ง์ปค ๊ฒ์ถ + ํ๋ฒ ์ธ์๋ฅ ๊ธฐ๋ฐ) |
| ๋ต์ ํค CSV ์ฑ์ | ๋ต์ ํค CSV ์ ๋ก๋ ์ ์๋ ์ฑ์ (์ ๋ต/์ค๋ต/๋ฏธ๊ธฐ์ ๋ฐฐ์ ์ค์ ๊ฐ๋ฅ) |
| ์ ํ 0 ๋ฌด์ | 08๊ณผ 8์ ๋์ผํ ์ ๋ต์ผ๋ก ์ธ์ |
| ๊ฐ๋ณ ๋ฌธ์ ์ | ๋ต์ ํค CSV์ ์๋ ๋ฌธ์ ๋ง ์ฑ์ (Q1~Q38์ด๋ฉด 38๋ฌธ์ ๋ง) |
| ๋๋ฒ๊ทธ ๋ชจ๋ | ๊ฒฐ๊ณผ ํ ์ด๋ธ ํ ํด๋ฆญ ์ ์ ์ฒด ์ฒ๋ฆฌ ๊ณผ์ ์ ๋จ๊ณ๋ณ๋ก ํ์ธ (์๋ณธโํ์ โ๋ง์ปค๊ฒ์ถโAffineโ์ ์ฒ๋ฆฌโ์ต์ข ๊ฒฐ๊ณผ) |
| ๋น ๋ต์ ํค ํ ํ๋ฆฟ | 44/38/22๋ฌธํญ ๋น CSV ํ ํ๋ฆฟ ๋ค์ด๋ก๋ ์ ๊ณต |
| ๋ค์ํ ์ค์บ๋ ์ง์ | ๋ง์ปค ํฌ๊ธฐ ์๋ ์กฐ์ (30~120px)์ผ๋ก ์ฌ๋ฌ ์ค์บ๋ ํธํ |
- Python 3.8+
- pip
pip install -r requirements.txtpython3 web_app.py๋ธ๋ผ์ฐ์ ์์ http://localhost:5000 ์ผ๋ก ์ ์ํฉ๋๋ค.
๋ฒ๋ธ ์์น๋ฅผ ์๊ฐ์ ์ผ๋ก ํ์ธํ๊ณ ์ง์ ์์ ํ ์ ์์ต๋๋ค:
http://localhost:5000/template-editor
๊ธฐ๋ฅ:
- ํ ํ๋ฆฟ JSON ์ค์๊ฐ ํธ์ง
- ๋ฒ๋ธ ์์น ์๊ฐํ (๋น ์บ๋ฒ์ค์ ๋ น์ ์ฌ๊ฐํ ํ์)
- JSON ํฌ๋งท ์๋ ์ ๋ฆฌ
- ์ ์ฅ ์ ์๋ ๋ฐฑ์ ์์ฑ
- ํต๊ณ ํ์ (ํ์ด์ง/๋ฒ๋ธ ํฌ๊ธฐ, Field Block ์)
template/44_questions.pdf ํ์ผ์ ์ธ์ํ๋ฉด ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ OMR ๋ต์์ง๊ฐ ๋ฉ๋๋ค.
- 44๋ฌธํญ (Q1~Q44), ๊ฐ ๋ฌธํญ 2์๋ฆฌ ์ซ์ ์๋ต (00~99)
- ํ๋ฒ 9์๋ฆฌ ๊ธฐ์ ๋ ํฌํจ
- 3๊ฐ ์ฝ๋ ๋ง์ปค (์๋ ํฌ๋กญ/์ ๋ ฌ์ ์ฌ์ฉ)
- ๋นจ๊ฐ์ ์ธ์ ๊ถ์ฅ (์ปฌ๋ฌ ๋๋กญ์์์ผ๋ก ์ธ์ ์์ ์๋ ์ ๊ฑฐ)
์ธ์ ํ ํ์๋ค์ด ๋ต์์ ๋งํนํ๊ณ , ์ค์บ๋๋ก ์ค์บํ ์ด๋ฏธ์ง๋ฅผ ์น์ ์ ๋ก๋ํ๋ฉด ๋ฉ๋๋ค.
- ๋น ํ ํ๋ฆฟ ๋ค์ด๋ก๋: 44/38/22๋ฌธํญ ์ค ์ ํํ์ฌ ๋น CSV ๋ค์ด๋ก๋
- ์ ๋ต ์
๋ ฅ: ๋ค์ด๋ก๋ํ CSV์ ์ ๋ต ๊ธฐ์
(์:
Q1,16) - ์ ๋ก๋: ์์ฑ๋ CSV๋ฅผ ๋๋๊ทธํ๊ฑฐ๋ ํ์ผ ์ ํ์ผ๋ก ์ ๋ก๋
- ๋ฐฐ์ ์ค์ : ์ ๋ต/์ค๋ต/๋ฏธ๊ธฐ์ ๊ฐ๊ฐ์ ์ ์ ์ง์
๋ต์ ํค CSV ํ์ (ํค๋ ์์):
Q1,16
Q2,17
Q3,8
...
Q44,36- ์ค์บ๋์์ ์ถ๋ ฅ๋ OMR ๋ต์์ง JPG/PNG ์ด๋ฏธ์ง๋ฅผ ๋๋๊ทธํ๊ฑฐ๋ ํ์ผ ์ ํ
- ์ฌ๋ฌ ์ฅ ๋์ ์ ๋ก๋ ๊ฐ๋ฅ
- ์ต์
์ค์ :
- ์ฉ์ง ์๋ ํฌ๋กญ: ์ค์บ๋ ์ถ๋ ฅ๋ฌผ์์ OMR ์ฉ์ง๋ง ์๋ผ๋ (๊ธฐ๋ณธ ON)
- ๋๋ฒ๊ทธ ๋ชจ๋: ์ธ์ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง๋ฅผ ํ์ธํ ์ ์์ (๊ธฐ๋ณธ ON)
- ํต๊ณ: ์ฒ๋ฆฌ ์๋ฃ, ๋ค์ค ๋งํน, ์ค๋ฅ, ํ๊ท /์ต๊ณ /์ต์ ์ ์
- ํ ์ด๋ธ: ํ๋ฒ(Num) + ๊ฐ ๋ฌธ์ ์๋ต + ์ ๋ต(์ด๋ก)/์ค๋ต(๋นจ๊ฐ) ํ์ด๋ผ์ดํธ
- ๋๋ฒ๊ทธ: ํ ํด๋ฆญ ์ OMR ๋ฒ๋ธ ์ธ์ ์ด๋ฏธ์ง ํ์
- CSV ๋ค์ด๋ก๋ ๋ฒํผ์ผ๋ก ์ ์ฒด ๊ฒฐ๊ณผ ๋ค์ด๋ก๋
speech_lab_OMR_check/
โโโ web_app.py # Flask ์น ์ฑ (๋ฉ์ธ)
โโโ template/
โ โโโ template.json # OMR ๋ ์ด์์ ํ
ํ๋ฆฟ (๋ฒ๋ธ ์ขํ ์ ์)
โ โโโ 44_questions.pdf # ์ธ์์ฉ OMR ๋ต์์ง (44๋ฌธํญ)
โโโ src/ # OMRChecker ์ฝ์ด ๋ชจ๋
โ โโโ core.py # ๋ฒ๋ธ ๊ฐ์ง ๋ฐ OMR ์๋ต ์ฝ๊ธฐ
โ โโโ template.py # ํ
ํ๋ฆฟ ํ์ฑ
โ โโโ evaluation.py # ์ฑ์ ๋ก์ง
โ โโโ constants.py # ์์ ์ ์
โ โโโ logger.py # ๋ก๊น
โ โโโ defaults/ # ๊ธฐ๋ณธ ์ค์ ๊ฐ
โ โโโ processors/ # ์ด๋ฏธ์ง ์ ์ฒ๋ฆฌ๊ธฐ (Levels, GaussianBlur ๋ฑ)
โ โโโ schemas/ # JSON ์คํค๋ง ๊ฒ์ฆ
โ โโโ utils/ # ์ ํธ๋ฆฌํฐ (์ด๋ฏธ์ง, ํ์ฑ, ํ์ผ)
โโโ requirements.txt # Python ํจํค์ง ์์กด์ฑ
โโโ LICENSE # MIT License
โโโ README.md # ์ด ํ์ผ
์น UI์์ ์ง์ ํ ํ๋ฆฟ์ ํธ์งํ๊ณ ์๊ฐํํ ์ ์์ต๋๋ค:
- ๐ผ๏ธ ๋ฒ๋ธ ์์น ์๊ฐํ (์๋จ): ์ต๋ํ ํฌ๊ฒ ํ์๋์ด ์ ๋ฐํ ํ์ธ ๊ฐ๋ฅ
- ๐ JSON ํธ์ง๊ธฐ (ํ๋จ): ํ ํ๋ฆฟ JSON ์ง์ ์์
- ๋ฉ์ธ ํ์ด์ง์์ "โ๏ธ ํ ํ๋ฆฟ ํธ์ง๊ธฐ" ๋งํฌ ํด๋ฆญ
- ์ด๋ฏธ์ง ์
๋ก๋ (์ค์!):
- ์ค์ ์ฑ์ ๊ณผ 100% ๋์ผํ ํ๋ก์ธ์ค ์ ์ฉ
- ๋ ๋ ๋๋กญ์์ โ ํ์ ๋ฐฉํฅ ์ง๋ฅ ์ ํ โ ๋ง์ปค ๊ฒ์ถ โ Affine ๋ณํ (3507ร2480) โ Levels โ GaussianBlur
- ์ฒ๋ฆฌ ํ ๋ฒ๋ธ ์์น ์ค๋ฒ๋ ์ด
- ๋น ํ ํ๋ฆฟ: ํ์ค ํฌ๊ธฐ(3507ร2480) ํฐ ๋ฐฐ๊ฒฝ์ ๋ฒ๋ธ๋ง ํ์
- JSON ํธ์ง:
- ๋ฒ๋ธ ํฌ๊ธฐ ์กฐ์ :
bubbleDimensions(์:[28, 45]) - ํ์ด์ง ํฌ๊ธฐ ํ์ธ:
pageDimensions(๊ธฐ๋ณธ:[3507, 2480]) - Field block ์์น ์กฐ์ :
fieldBlocks๊ฐ์ฒด
- ๋ฒ๋ธ ํฌ๊ธฐ ์กฐ์ :
- ๐พ ์ ์ฅ: ํ ํ๋ฆฟ ์ ์ฅ (์๋ ๋ฐฑ์ )
- ๐๏ธ ์๊ฐํ: ํ์ฌ ๋ฒ๋ธ ์์น ๋ฏธ๋ฆฌ๋ณด๊ธฐ
- โจ ํฌ๋งท ์ ๋ฆฌ: JSON ์๋ ์ ๋ ฌ
- ๐ ์ด๋ฏธ์ง ์ ๋ก๋: ๋๋ฒ๊ทธ ๋ชจ๋์ ๋์ผํ ์ ์ฒ๋ฆฌ โญ
โญ ํต์ฌ: ํ ํ๋ฆฟ ํธ์ง๊ธฐ์์ ๋ณด์ด๋ ์ด๋ฏธ์ง = ์ค์ ์ฑ์ ์ ๋ณด์ด๋ ์ด๋ฏธ์ง!
์์คํ ์ ๋ค์ํ ์ค์บ๋๋ฅผ ์ง์ํ๋ฉฐ, ์๋์ผ๋ก ํฌ๊ธฐ๋ฅผ ๋ณด์ ํฉ๋๋ค:
์ ์ ์ฒ๋ฆฌ (๋ง์ปค ๊ธฐ๋ฐ):
- 3๊ฐ ์ฝ๋ ๋ง์ปค ๊ฒ์ถ
- Affine ๋ณํ์ผ๋ก 3507ร2480 ํ์ค ํฌ๊ธฐ๋ก ์ ๋ ฌ
- ํ์ ๋ฐ ์๊ณก ์๋ ๋ณด์
Fallback ์ฒ๋ฆฌ (๋ง์ปค ์์):
- ๋ง์ปค ๊ฒ์ถ ์คํจ ์ aspect ratio๋ฅผ ์ ์งํ๋ฉฐ ๋ฆฌ์ฌ์ด์ฆ
- ์ค์ ์ ๋ ฌ ํ ํฐ์ ํจ๋ฉ ์ถ๊ฐ
- ์ธ์๋ฅ ์ด ๋จ์ด์ง ์ ์์ผ๋ฏ๋ก ๋ง์ปค๊ฐ ์๋ ์ฉ์ง ์ฌ์ฉ ๊ถ์ฅ
ํ ์คํธ๋ ์ค์บ๋:
- Origin Scanner: 3507ร2480 (์๋ฒฝ ํธํ)
- Another Scanner: 3481ร2458 (๋ง์ปค ๊ธฐ๋ฐ ๋ณด์ ์ผ๋ก ์๋ฒฝ ์ฒ๋ฆฌ)
์ธ์๋ฅ ์ด ๋ฎ์ ๊ฒฝ์ฐ template/template.json ํ์ผ์ bubbleDimensions ๊ฐ์ ์กฐ์ ํ ์ ์์ต๋๋ค:
{
"bubbleDimensions": [28, 45]
}- ์ฒซ ๋ฒ์งธ ๊ฐ (๊ฐ๋ก): ๋ฒ๋ธ์ ๊ฐ๋ก ํฌ๊ธฐ (๊ธฐ๋ณธ: 28)
- ๋ ๋ฒ์งธ ๊ฐ (์ธ๋ก): ๋ฒ๋ธ์ ์ธ๋ก ํฌ๊ธฐ (๊ธฐ๋ณธ: 45)
- ๊ฐ์ ํฌ๊ฒ ํ ์๋ก ์ธ์ ๋ฒ์๊ฐ ๋์ด์ ธ ํ๋ฆฟํ ๋งํน๋ ์ธ์๋์ง๋ง, ๋๋ฌด ํฌ๋ฉด ์ค์ธ์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
- ๊ถ์ฅ ๋ฒ์: ๊ฐ๋ก 25
30, ์ธ๋ก 4248 - ์ฃผ์: ํ์ด์ง ํฌ๊ธฐ๋ฅผ ์ด๊ณผํ์ง ์๋๋ก ์กฐ์ ํด์ผ ํฉ๋๋ค (์ต๋ ๊ฐ๋ก: 30, ์ต๋ ์ธ๋ก: 48)
์ค์บ๋์ ๋ฐ๋ผ ๋ง์ปค ํฌ๊ธฐ๊ฐ ๋ค๋ฅผ ์ ์์ต๋๋ค. ๋ง์ปค ๊ฒ์ถ์ด ์คํจํ๋ ๊ฒฝ์ฐ:
- ๊ณ ํด์๋ ์ค์บ: 300 DPI ์ด์ ๊ถ์ฅ
- ์ฉ์ง ์ ๋ ฌ: ์ค์บ ์ ์ฉ์ง๊ฐ ๊ธฐ์ธ์ด์ง์ง ์๋๋ก ์ฃผ์
- ๋๋น ์กฐ์ : ์ค์บ๋ ์ค์ ์์ ๋๋น๋ฅผ ๋๊ฒ ์ค์
- ๋ง์ปค ์ํ: ๋ง์ปค๊ฐ ์์๋๊ฑฐ๋ ๊ฐ๋ ค์ง์ง ์์๋์ง ํ์ธ
ํ์ฌ ์์คํ ์ 30~120px ๋ฒ์์ ๋ง์ปค๋ฅผ ์๋์ผ๋ก ๊ฒ์ถํฉ๋๋ค.
์ค์บ ์ด๋ฏธ์ง (JPG/PNG - ์ปฌ๋ฌ)
โ
โผ
[๋ ๋ ๋๋กญ์์] max(B,G,R) + ๋นจ๊ฐ ํฝ์
โํฐ์(255) โ ํ๋ฐฑ ๋ณํ
โ
โผ
[์ธ๋ก/๊ฐ๋ก ํ๋จ]
โโ height > width (์ธ๋ก ์ด๋ฏธ์ง)
โ โโ ์๊ณ๋ฐฉํฅ 90๋ ํ์ ์๋ + ๋ง์ปค ๊ฒ์ถ
โ โโ ๋ฐ์๊ณ๋ฐฉํฅ 270๋ ํ์ ์๋ + ๋ง์ปค ๊ฒ์ถ
โ โโ ๋ง์ปค๊ฐ ์ฌ๋ฐ๋ฅธ ์์น์ ์๋ ๋ฐฉํฅ ์ ํ โญ
โโ width >= height (๊ฐ๋ก ์ด๋ฏธ์ง) โ ํ์ ์์
โ
โผ
[๋ง์ปค ๊ฒ์ถ] 3๊ฐ ์ฝ๋ ๋ง์ปค ๊ฒ์ถ (์ผ์ชฝ ์, ์ค๋ฅธ์ชฝ ์, ์ค๋ฅธ์ชฝ ์๋)
โ
โผ
[๋ง์ปค ๋ฐฉํฅ ํ์ธ]
โโ ์ผ์ชฝ ์, ์ค๋ฅธ์ชฝ ์, ์ค๋ฅธ์ชฝ ์๋์ ๋ง์ปค ์๋์ง ํ์ธ
โโ ๋ง์ฝ ์ผ์ชฝ ์๋์ ๋ง์ปค ์์ผ๋ฉด โ 180๋ ํ์ โ ๏ธ
โโ ๋ง์ปค ์์น๊ฐ ์ฌ๋ฐ๋ฅผ ๋๊น์ง ์ถ๊ฐ ํ์
โ
โผ
[Affine ๋ณํ] ๋ง์ปค ๋ฐ๊นฅ์ชฝ ๊ธฐ์ค ์ ๋ ฌ + ํฌ๋กญ โ 3507ร2480 ํ์คํ
โ
โผ
[์ ์ฒ๋ฆฌ] Levels (๋๋น ๊ฐํ) โ GaussianBlur (๋
ธ์ด์ฆ ์ ๊ฑฐ)
โ
โผ
[๋ฒ๋ธ ๊ฐ์ง] ๊ฐ ๋ฒ๋ธ ์์ญ ๋ฐ๊ธฐ ๊ณ์ฐ โ ์๊ณ๊ฐ ๋น๊ต โ ๋งํน ํ์
โ
โผ
[์๋ต ๊ฒฐํฉ] roll_1~9 โ ํ๋ฒ, Q1_1+Q1_2 โ Q1 ๋ฑ
โ
โผ
[์ฑ์ ] ๋ต์ ํค ๋์กฐ โ ์ ๋ต/์ค๋ต/๋ฏธ๊ธฐ์
ํ์ โ ์ ์ ์ฐ์ถ
โ
โผ
๊ฒฐ๊ณผ CSV + ์น ํ
์ด๋ธ + ๋๋ฒ๊ทธ ์ด๋ฏธ์ง
โญ ํต์ฌ ๊ฐ์ (2026-02-12):
- ์ธ๋ก ์ด๋ฏธ์ง ์ ์๊ณ๋ฐฉํฅ/๋ฐ์๊ณ๋ฐฉํฅ ์ง๋ฅ์ ์ ํ (๋ง์ปค ์์น ๊ธฐ๋ฐ)
- ์ผ์ชฝ ์๋ ๋ง์ปค ๊ฐ์ง ์ ์ฆ์ 180๋ ํ์ (๋จ์ํ๋ ๋ก์ง)
- ํ ํ๋ฆฟ ํธ์ง๊ธฐ: ์ค์ ์ธ์ ํ๋ก์ธ์ค์ ๋์ผํ ์ ์ฒ๋ฆฌ (marker_align_and_crop ํฌํจ)
- ๊ณ ํด์๋ PNG ์๊ฐํ (์์ถ ๋ ๋ฒจ 1, ์ด๋ฏธ์ง ํด์๋ ๊ฐ์ )
๋๋ฒ๊ทธ ๋ชจ๋๋ฅผ ํ์ฑํํ๋ฉด ๋ค์ ๋จ๊ณ๋ณ ์ด๋ฏธ์ง๋ฅผ ํ์ธํ ์ ์์ต๋๋ค:
- ์๋ณธ ์ด๋ฏธ์ง: ์ ๋ก๋๋ ์๋ณธ ์ปฌ๋ฌ ์ค์บ ์ด๋ฏธ์ง
- ๋ ๋ ๋๋กญ์์: max(B,G,R) + ๋นจ๊ฐ ํฝ์ โํฐ์ โ ํ๋ฐฑ ๋ณํ
- ํ์ ๋ณด์ : ์ธ๋ก ์ด๋ฏธ์ง โ 90๋ ๊ฐ์ ํ์ (๊ฐ๋ก๋ก ๋ง๋ค๊ธฐ) โญ
- ๋ง์ปค ๊ฒ์ถ: 3๊ฐ ์ฝ๋ ๋ง์ปค ๊ฒ์ถ ๋ฐ ํ์ (์ผ์ชฝ ์, ์ค๋ฅธ์ชฝ ์, ์ค๋ฅธ์ชฝ ์๋)
- Affine ๋ณํ: ๋ง์ปค ๋ฐ๊นฅ์ชฝ ๊ธฐ์ค ์ ๋ ฌ ๋ฐ ํฌ๋กญ โ 3507ร2480 ํ์คํ
- ์ ์ฒ๋ฆฌ ์๋ฃ: Levels (๋๋น ๊ฐํ) + GaussianBlur (๋ ธ์ด์ฆ ์ ๊ฑฐ)
- ํ ํ๋ฆฟ ๋ฒ๋ธ ์์น: ์ธ์ํ ๋ฒ๋ธ ์์น๋ฅผ ๋ น์ ์ฌ๊ฐํ์ผ๋ก ํ์
- ์ต์ข ์ธ์ ๊ฒฐ๊ณผ: ๋ฒ๋ธ ์ธ์ ๋ฐ ๋งํน ํ์, ์ ๋ต/์ค๋ต ํ์ด๋ผ์ดํธ
Fallback ๋จ๊ณ (๋ง์ปค ๊ฒ์ถ ์คํจ ์):
- Fallback ๋ฆฌ์ฌ์ด์ฆ: Aspect ratio ์ ์งํ๋ฉฐ 3507ร2480 ๊ฐ์ ๋ณํ
- ์ต์ข ํฌ๊ธฐ ๋ณด์ : ํฌ๊ธฐ ๋ถ์ผ์น ์ ์ถ๊ฐ ๋ณด์
โญ ํต์ฌ: ์ธ๋ก ์ด๋ฏธ์ง๋ฅผ ๋จผ์ ๊ฐ๋ก๋ก ํ์ โ ๋ง์ปค ๊ฒ์ถ โ Affine ๋ณํ์ด ์ ์ ์๋
MIT License - ์์ธํ ๋ด์ฉ์ LICENSE ํ์ผ์ ์ฐธ์กฐํ์ธ์.
์ด ํ๋ก์ ํธ๋ OMRChecker (MIT License, Copyright (c) 2024-present Udayraj Deshmukh)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ์น ์ธํฐํ์ด์ค ๋ฐ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๊ฐ์ ์ june-oh๊ฐ ๊ฐ๋ฐํ์์ต๋๋ค.
