การใช้ Tesseract ทำ OCR ภาษาไทย

Nuttaset kuapanich
Super AI Engineer
Published in
7 min readJan 1, 2021

บทความล่าสุด 2024

ในปัจจุบันที่การจัดเก็บข้อมูลส่วนใหญ่ถูกบันทึกในรูปแบบของดิจิทัล เพื่อให้ข้อมูลเหล่านั้นไม่สูญหาย และสามารถนำไปใช้ต่อได้ง่าย ไม่ว่าจะเป็นงานในด้าน “Data Science” หรือด้าน “Machine Learning” แต่ถึงอย่างไรก็ตามยังมีข้อมูลอยู่อีกมากที่ยังอยู่ในรูปแบบของเอกสารที่เป็น กระดาษหากจะต้องมานั่งกรอกข้อมูลจากเอกสารเหล่านั้นเองที่ละตัวก็คงจะไม่ไหวเป็นแน่~

เราจึงขอแนะนำเครื่องมือหนึ่งที่ช่วยให้เราดึงข้อความจากเอกสารออกมาเป็น text ได้อย่างรวดเร็ว และง่ายดาย ซึ่งนั่นก็คือ Tesseract นั่นเอง! โดยในบทความนี้จะเน้นการใช้ tesseract ทำ OCR ภาษาไทยครับ

What is OCR?

OCR นั้นย่อมากจาก Optical Character Recognition ซึ่งเป็นการแปลงไฟล์เอกสารที่แสกนมา ให้เป็นไฟล์ข้อความโดยอัตโนมัติ ทำให้ไม่ต้องเสียเวลาและใช้คนจำนวนมากในการพิมพ์กรอกข้อมูลจากเอกสารเหล่านั้น

What is Tesseract?

Tesseract นั้นเป็นเครื่องมือในการทำ OCR ซึ่งเป็นซอฟต์แวร์ฟรี ที่อยู่ภายใต้ใบอนุญาตของ Apache และได้รับการสนับสนุนจาก Google ตั้งแต่ปี 2006 โดย tesseract จะทำการดึงข้อความจากรูปภาพออกมาให้ในรูปแบบของ text

ดังนั้นก่อนที่เราจะใช้ tesseract ทำ OCR เอกสารนั้น เราจะต้องแปลงเอกสารเหล่านั้นให้เป็นไฟล์รูปภาพก่อน (อาจจะสแกนแล้วบันทึกเป็นรูปภาพ) จึงจะให้ tesseract ทำ OCR ให้เราได้

มาเริ่มกันเถอะ!

เราจะแนะนำวิธีการใช้ tesseract 2 แบบนั่นก็คือ

  1. สั่งผ่าน command line
  2. สั่งผ่าน python script (ใช้ pytesseract)

1. สั่งผ่าน command line

สามารถดูข้อมูลเพิ่มเติมของ tesseract ocr ได้ ที่นี่

1.1 การติดตั้ง และคำสั่งที่น่าสนใจ

ถ้าใช้ Ubuntu สามารถติดตั้งโดยใช้คำสั่งนี้

sudo apt-get install tesseract-ocr-tha

ส่วนถ้าใครใช้ Windows (Windows 10) สามารถติดตั้งโดยดูขั้นตอนตาม link นี้ได้เลยครับ

แต่ผมก็จะทำให้ดูเป็นตัวอย่างด้วยละกัน ~

  1. เข้าไปในเว็บไซต์ https://github.com/UB-Mannheim/tesseract/wiki เพื่อทำการโหลดไฟล์ .exe สำหรับติดตั้งโปรแกรมตามกรอบสีแดงด้านล่าง

2. เมื่อโหลดเสร็จแล้วจะได้ไฟล์หน้าตาแบบนี้มา

คลิ๊กที่ไฟล์นั้นเพื่อทำการรัน

ตอนรันจะขึ้นมาแบบนี้
กด Next > ได้เลย
อ่านข้อกำหนด แล้วกด I Agree
เลือกรูปแบบการติดตั้งที่ต้องการ แล้วกดปุ่ม Next >
กดปุ่ม + ที่ Additional language data เพื่อติดตั้งข้อมูลภาษาไทย
เลือกที่ช่อง Thai แล้วกด Next >
ตรวจเช็คที่อยู่ของโปรแกรมว่าต้องการแก้ไขหรือไม่

หลังจากนั้นอย่าลืม coppy โฟลเดอร์นั้นด้วย โดยตามตัวอย่างของผมจะต้อง coppy โฟลเดอร์ C:\Program Files\Tesseract-OCR อาจจะแปะไว้ที่ Notepad ไว้ก็ได้เผื่อกันหาย เพราะเราต้องนำที่อยู่ของโฟลเดอร์นี้ไปแก้ไข enviroment ทีหลัง

สามารถเลือกที่จะสร้าง shortcuts หรือไม่ก็ได้ เมื่อเลือกเสร็จแล้วกด Install
เมื่อติดตั้งเสร็จแล้วกด Next >
กด Finish

3. ทำการแก้ไข enviroment โดยเปิด System Properties โดยสามารถพิมพ์ env ในช่อง Windows แล้วเลือกโปรแกรมตามภาพด้านบน

กดที่ Enviroment Variables…
กดที่ Path

กดที่ปุ่ม New แล้วจะมีช่องว่างปรากฏขึ้นด้านล่าง ให้ใส่ที่อยู่โฟลเดอร์ที่เราได้ทำการ coppy ไว้ก่อนหน้านี้ใส่เข้าไป จากนั้นก็กด OK รัวๆเลยจ้า~

เมื่อติดตั้งเสร็จแล้ว ลองพิมพ์ tesseract ใน command line ดูว่าสามารถใช้ได้มั้ย ถ้าออกมาในลักษณะนี้ (แสดงรายการคำสั่งที่ใช้กับ command ของ tesseract)

แสดงว่าติดตั้งสำเร็จ พร้อมใช้งานแล้ว 😆

สามารถดูเวอร์ชั่นของ tesseract ได้ด้วยคำสั่ง

tesseract --version

จะเห็นว่าของผมนั้นเป็นเวอร์ชั่น 4.1.1 (ถ้าเป็นของ Windows จะเป็นเวอร์ชั่น 5.0.0)

นอกจากนี้ยังสามารถดูลิสรายชื่อภาษาที่ tesseract ของเรารองรับได้โดยใช้คำสั่ง

tesseract --list-langs

จะเห็นว่าภาษาที่ tesseract ของผมรองรับนั้นมีอยู่ 2ภาษาได้แก่ ภาษาอังกฤษ (eng) และภาษาไทย (tha) ส่วน osd ผมเข้าใจว่าน่าจะหมายถึง Orientation and Script Detection ซึ่งเกี่ยวกับการแบ่งบรรทัดของข้อความก่อนที่จะดึงออกมาเป็น text (ถ้าผู้เขียนเข้าใจผิดต้องขออภัยด้วยฮะ 😅) โดยเราสามารถเช็คได้ว่าตัวย่อของแต่ละภาษาหมายถึงภาษาอะไรบ้างจาก ลิงค์นี้ เลยครับ

1.2 การใช้งาน

เวลาที่เราจะทำ OCR ภาษาไทย โดยใช้ tesseract นั้น เราต้องกำหนดภาษาที่ต้องการดึงออกมาด้วย (ถ้าไม่กำหนดมันจะดึงเป็นภาษาอังกฤษออกมา) โดยข้อความที่จะทำ OCR จะเป็นรูปภาพ (รองรับ bmp, pnm, png, jfif, jpg, และ tiff) ส่วนไฟล์ข้อความที่ออกมานั้นถ้าไม่กำหนดอะไร จะออกมาเป็นไฟล์ .txt

คำสั่งอย่างง่ายคือ

tesseract -l tha [ที่อยู่ของภาพที่ต้องการทำ OCR] [ที่อยู่ของไฟล์ text ที่ต้องการบันทึก]

ซึ่ง -l นั้นหมายถึงการกำหนดภาษาที่ต้องการทำ OCR โดยด้านหลังก็จะใส่ code ของภาษานั้น ซึ่งในที่นี้เราต้องการทำ OCR ภาษาไทย เราก็จะใส่ tha ต่อท้าย

ขอยกตัวอย่างการรันคำสั่งนี้เพื่อให้ทุกคนเห็นภาพแล้วกันนะครับ ~

สมมติผมต้องการทำ OCR รูปภาพที่มีชื่อว่า test_thai_OCR.jpg ซึ่งอยู่ในหน้า Desktop และผมต้องการดึงข้อมูลออกมาเป็น text ตั้งชื่อว่า test_thai_OCR.txt เก็บไว้ในหน้า Documents แต่ผมอยากรันคำสั่งอยู่ในหน้า home (ขี้เกียจไปไหน 555) ผมสามารถรันคำสั่งได้ตามนี้ครับ

tesseract -l tha Desktop/test_thai_OCR.jpg Documents/test_thai_OCR

จะสังเกตว่าไฟล์ text ที่เราตั้งชื่อไม่ต้องใส่ .txt เพราะโปรแกรมจะเติม txt ให้โดยอัตโนมัติ (ถ้าใส่ก็จะออกมาเป็น test_thai_OCR.txt.txt ก็จะแลดูแปลกๆหน่อย 😂)

หน้าตาโฟลเดอร์ในหน้า home ของผม
ภาพที่ผมต้องการทำ OCR ซึ่งอยู่ในหน้า Desktop
ข้อความที่ tesseract ดึงออกมาซึ่งเก็บไว้ในหน้า Documents

นอกจากนี้เรายังสามารถกำหนด option อื่นๆสำหรับ tesseract ได้อีกด้วย เช่น

--dpi ไว้สำหรับกำหนดความละเอียดของภาพที่จะทำ OCR ซึ่งโดยปกติถ้าเราไม่กำหนด tesseract ก็จะประมาณค่า dpi ไว้ให้อยู่แล้ว ดังภาพด้านล่าง

ซึ่งถ้าเรากำหนดรูปภาพที่ input เข้ามาให้มีความละเอียดมาก ก็จะช่วยให้ tessect ดึงข้อความออกมาได้ถูกต้องมากขึ้น ดังตัวอย่างต่อไปนี้ (แต่อาจจะไม่เสมอไปนะ 😏)

สมมติผมต้องการทำจะทำ OCR ภาพนี้

โดยภาพนี้มีชื่อว่า test_thai_OCR2.png และบันทึก text ตั้งชื่อไฟล์ว่า test_thai_OCR2.txt ถ้าผมจะใช้คำสั่งโดยทั่วไปตามที่ได้แนะนำไว้ข้างต้น ผมจะต้องพิมพ์ว่า

tesseract -l tha test_thai_OCR2.png test_thai_OCR2

ซึ่งได้ข้อความออกมาตามภาพด้านล่าง

จะเห็นว่ายังดึงออกมาผิดอยู่บ้าง แต่ถ้าผมจะกำหนดค่า dpi ไปด้วยเพื่อเพิ่มความละเอียดภาพ จะพิมพ์ออกมาตามนี้

tesseract -l tha --dpi 2400 test_thai_OCR2.png test_thai_OCR2

โดยหลัง --dpi นั้นจะตามด้วยค่าที่เราต้องการ โดยค่าที่กำหนดได้จะอยู่ในช่วง 70–2400 (ผมจึงใช้ 2400 เต็มเหนี่ยวไปเลย อิอิๆ) ซึ่งผลออกมาเป็นไปตามภาพด้านล่าง

จะเห็นว่าดีขึ้นกว่าอันก่อนหน้านี้มากเลยครับ

นอกจากนี้ยังสามารถเติม --psm เพื่อกำหนดโหมดของการแบ่งส่วนของภาพเอกสารได้อีกด้วย โดยจะมีอยู่ทั้งหมด 13 โหมด โดยสามารถดูลักษณะการทำงานของแต่ละโหมดได้ด้วยคำสั่ง

tesseract --help-psm

เวลาเลือกโหมด ก็เติมหมายเลขของโหมดที่ต้องการตามหลัง --psm ในบทความนี้ผมขอยกตัวอย่างการใช้งานมาสัก 1 โหมดหละกันครับ เพื่อให้ทุกคนเห็นภาพ

สมมติผมต้องการทำจะทำ OCR ภาพนี้

โดยภาพนี้มีชื่อว่า test_thai_OCR3.png และบันทึก text ตั้งชื่อไฟล์ว่า test_thai_OCR3.txt ถ้าผมจะใช้คำสั่งตามที่ได้แนะนำไว้ข้างต้น ผมจะต้องพิมพ์ว่า (เพิ่ม --dpi มาด้วยหละกัน 😘)

tesseract -l tha --dpi 2400 test_thai_OCR3.png test_thai_OCR3

ซึ่งได้ข้อความออกมาตามภาพด้านล่าง

จะเห็นว่าข้อความที่ออกมานั้น ไม่มีเค้าโครงเดิมของภาพก่อนหน้านี้เลย (ขนาดกำหนดความละเอียดด้วยค่าสูงสุดแล้วนะเนี่ย 😭)

ดังนั้นเราจะลองมาปรับโหมดของแบ่งส่วนภาพกัน โดยผมขอเลือกใช้โหมด 12 (เป็นโหมดไว้ใช้กับข้อความที่กระจัดกระจายพร้อมกับทำ OSD ด้วย) ถ้าผมจะทำอย่างนั้น ผมต้องใช้คำสั่ง

tesseract -l tha --dpi 2400 --psm 12 test_thai_OCR3.png test_thai_OCR3

จะเห็นว่าผลที่ได้มาแตกต่างจากคำสั่งก่อนหน้านี้ลิบลับ เริ่มเห็นเค้าโครงคำที่ดึงออกมาได้จากรูปภาพชัดเจนมากขึ้นแล้วครับ

ในส่วนของการกำหนดชนิดของไฟล์ที่เป็น output นั้น อย่างที่เคยได้บอกไปก่อนหน้า ว่าถ้าเราไม่ได้กำหนดอะไรไฟล์ที่ออกมาจะเป็น .txt แต่แท้จริงแล้วนั้น tesseract รองรับการสร้างไฟล์ output อีกหลายประเภท เพียงแค่เรากำหนดชนิดไฟล์ที่ต้องการ ต่อท้ายชื่อไฟล์ output เช่น

ผมต้องการทำ OCR ภาพที่มีชื่อว่า test_thai_OCR4.jpg ตามภาพด้านล่าง

ให้ออกมาเป็น ไฟล์ที่ชื่อว่า test_thai_OCR4 สามารถรันด้วยคำสั่ง ตามประเภท output ต่อไปนี้

ไฟล์ .xml ให้เติม alto ต่อท้าย

tesseract -l tha test_thai_OCR4.jpg test_thai_OCR4 alto
ไฟล์ .xml ที่ออกมา

ไฟล์ .hocr ให้เติม hocr ต่อท้าย

tesseract -l tha test_thai_OCR4.jpg test_thai_OCR4 hocr
ไฟล์ .hocr ที่ออกมา

ไฟล์ .pdf ให้เติม pdf ต่อท้าย

tesseract -l tha test_thai_OCR4.jpg test_thai_OCR4 pdf
ไฟล์ .pdf ที่ออกมา

ไฟล์ .tsv ให้เติม tsv ต่อท้าย

tesseract -l tha test_thai_OCR4.jpg test_thai_OCR4 tsv
ไฟล์ .tsv ที่ออกมา

ไฟล์ .txt ให้เติม txt ต่อท้าย (หรือจะไม่ใส่ก็ได้ เพราะเป็นค่า default อยู่แล้ว)

tesseract -l tha test_thai_OCR4.jpg test_thai_OCR4 txt
ไฟล์ .txt ที่ออกมา

และถ้าหากเราต้องการที่จะแปลงภาพนั้น ออกมาเป็น output หลายประเภทในครั้งเดียว เราสามารถใส่ประเภทของไฟล์หลายชนิดเรียงต่อกันได้ เช่นถ้าหากเราต้องการที่จะได้ไฟล์ output ทุกประเภทที่ยกตัวอย่างมาก่อนหน้า เราสามารถทำได้โดยใช้คำสั่งเดียวนั่นก็คือ

tesseract -l tha test_thai_OCR4.jpg test_thai_OCR4 alto hocr pdf tsv txt

นอกจากนี้ยังมี option อื่นๆที่สามารถเติมต่อท้ายชื่อไฟล์ได้ด้วย เช่น

get.images ซึ่งจะ return ออกมาเป็น ไฟล์ .txt ของข้อความที่ดึงออกมาได้ พร้อมกับรูปภาพที่มีชื่อว่า tessinput.tif ซึ่งเป็นภาพที่โปรแกรมใช้ดึงข้อความจริงๆ (เป็นภาพ binary โดยส่วนสีดำคือสิ่งที่โปรแกรมพยายามดึงออกมาเป็นตัวอักษร)

tesseract -l tha test_thai_OCR4.jpg test_thai_OCR4 get.images
ไฟล์ tessinput.tif ที่ออกมา

logfile ซึ่งจะ return ออกมาเป็น ไฟล์ .txt ของข้อความที่ดึงออกมาได้เช่นกัน แต่ที่เพิ่มเติมคือไฟล์ที่มีชื่อว่า tesseract.log ซึ่งคือไฟล์ที่บันทึกข้อความ debug ต่างๆที่เกิดขึ้นระหว่างรันโปรแกร (ใน command line จะไม่ปรากฎอะไร แต่จะถูกเก็บไว้ใน .log ไฟล์แทน)

tesseract -l tha test_thai_OCR4.jpg test_thai_OCR4 logfile
ไฟล์ tesseract.log ที่ออกมา

2. สั่งผ่าน python script (ใช้ pytesseract)

2.1 การติดตั้ง

สำหรับข้อมูลการข้อมูลการติดตั้งอย่างละเอียดรวมถึง ข้อมูลเพิ่มเติมอื่นๆสามารถดูได้ ที่นี่ แต่โดยทั่วไปแล้วเราสามารถใช้คำสั่ง

pip install pytesseract

หรือหากใช้ conda สามารถติดตั้งด้วยคำสั่ง

conda install -c conda-forge pytesseract
conda install -c conda-forge/label/cf202003 pytesseract

2.2 การใช้งาน

เวลาจะใช้งานต้อง import มาก่อน

import pytesseract

โดยผมจะขอยกตัวอย่างคำสั่งที่น่าสนใจต่อไปนี้ครับ

ดูเวอร์ชั่นของ pytesseract

pytesseract.get_tesseract_version()

ดูรายการภาพที่ tesseracct ของเรารองรับ

pytesseract.get_languages()

ในส่วนของการนำรูปภาพมาทำ OCR นั้น เราสามารถกำหนดที่อยู่ของรูปภาพไปได้เลย หรือถ้าหากให้ต้องการความกระชับก็สามารถใช้ไวเบอร์รี่ Pillow ในการเก็บข้อมูลรูปภาพไว้ในตัวแปรก่อน ได้เช่นกัน

เช่นผมต้องการทำ OCR ภาพที่ชื่อว่า test_thai_OCR.jpg โดยต้องการเก็บข้อมูลภาพนี้ไปในตัวแปรที่ชื่อว่า img ผมสามารถเขียนได้ดังนี้

# เรียกใช้โมดูล Image จาก Pillow
from PIL import Image
# เปิดรูปภาพตามที่อยู่ที่ได้ใส่ไว้ แล้วเก็บไว้ในตัวแปร img
img = Image.open('test_thai_OCR.jpg')

ซึ่งเช่นเดียวกับการสั่งผ่าน command line เราสามารถกำหนดชนิดของ output ที่ออกมา รวมถึง option เสริมต่างๆได้

หากเราต้องการที่จะทำ OCR ออกมาเป็นข้อความ แล้วเก็บค่านั้นไว้ในตัวแปรหนึ่งเราสามารถทำได้โดยใช้คำสั่ง image_to_string เช่น จากรูปภาพเดิมผมต้องการเก็บข้อความไว้ในตัวแปร txt สามารถเขียนเป็น

txt = pytesseract.image_to_string('test_thai_OCR.jpg', lang='tha')

จะเห็นว่าผมกำหนด lang='tha' ไว้ เพื่อให้ tesseract ทำ OCCR ออกมาเป็นภาษาไทย นอกจากนี้เรายังสามารถใช้ตัวแปร img ที่สร้างขึ้นใส่เข้าไปแทนที่อยู่รูปภาพได้เช่นกัน กลายเป็น

txt = pytesseract.image_to_string(img, lang='tha')

ดูข้อมูล osd (orientation and script detection) ของภาพนั้น ทำได้โดยใช้คำสั่ง image_to_osd เช่น

pytesseract.image_to_osd(img, lang='tha')

ดู box boundaries ของภาพนั้น ทำได้โดยใช้คำสั่ง image_to_boxes เช่น

pytesseract.image_to_boxes(img, lang='tha')

ถ้าต้องการให้ output ออกมาในรูปแบบของ DataFrame สามารถใช้คำสั่ง image_to_data แล้วกำหนด output_type='data.frame' ตามตัวอย่างด้านล่าง

pytesseract.image_to_data(img, lang='tha', output_type='data.frame')

หรือถ้าต้องการทำเป็น Pandas DataFrame สามารถเขียนเป็น

df = pytesseract.image_to_data(img, lang='tha', pandas_config=1)

ถ้าต้องการบันทึกเป็นไฟล์ csv ก็สามารถเขียนเป็น (ตั้งชื่อไฟล์ว่า thai_OCR.csv)

with open('thai_OCR.csv', 'w') as f:
f.write(df)

การทำเป็นไฟล์ pdf หรือ hocr ใช้คำสั่ง image_to_pdf_or_hocr

กรณีเป็น pdf

# แปลงข้อมูลเก็บไว้ในตัวแปร pdf
pdf = pytesseract.image_to_pdf_or_hocr(img, extension='pdf')
# นำข้อมูลในตัวแปร pdf นั้นบันทึกเป็นไฟล์ pdf
with open('test.pdf', 'w+b') as f:
f.write(pdf)

กรณีเป็น hocr

# แปลงข้อมูลเก็บไว้ในตัวแปร hocr
hocr = pytesseract.image_to_pdf_or_hocr(img, lang='tha', extension='hocr')
# นำข้อมูลในตัวแปร hocr นั้นบันทึกเป็นไฟล์ hocr
with open('test.hocr', 'w+b') as f:
f.write(hocr)

ทำเป็นไฟล์ xml ใช้คำสั่ง image_to_alto_xml เช่น

xml = pytesseract.image_to_alto_xml(img, lang='tha')

และมาในส่วนถึงการกำหนด option สามารถทำได้โดยกำหนด config= ในช่อง argument ของคำสั่งของเรา

เช่นผมต้องการกำหนดให้ psm โหมด 6 ในคำสั่ง image_to_string สามารถทำได้โดยใช้คำสั่งตามด้านล่าง

txt = pytesseract.image_to_string(img, lang='tha', config='--psm 6')

การกำหนด config นี้ นอกเหนือจากคำสั่ง image_to-string แล้ว คำสั่งอื่นๆที่กล่าวมาข้างก็สามารถใช้ได้เช่นกันครับ

ซึ่งเมื่อเราได้ข้อมูล ที่ดึงออกมาจากเอกสารเหล่านี้มาแล้ว เราสามารถนำข้อมูลเหล่านี้ ไปต่อยอดทำอย่างอื่นได้อีก เช่นใช้ Regex (Regular expression) เพื่อนำคำสำคัญในเอกสารนั้นไปให้ Machine Learning เรียนรู้ได้ หรือเราจะเอาข้อมูลจาก text นั้นไปใช้ในการวิเคราะห์เพิ่มเติมสำหรับงาน Data Science ก็ได้ แต่ก็ขึ้นอยู่กับว่าเราจะสามารถทำ OCR ดึงข้อความออกมาได้ถูกต้องมากน้อยแค่ไหนด้วยครับ

--

--

Nuttaset kuapanich
Super AI Engineer

กำลังศึกษาระดับปริญญาตรี คณะปัญญาประดิษฐ์ มหาวิยาลัยซุนยัดเซ็น Email: kuapanich@mail2.sysu.edu.cn