การใช้ Tesseract ทำ OCR ภาษาไทย
ในปัจจุบันที่การจัดเก็บข้อมูลส่วนใหญ่ถูกบันทึกในรูปแบบของดิจิทัล เพื่อให้ข้อมูลเหล่านั้นไม่สูญหาย และสามารถนำไปใช้ต่อได้ง่าย ไม่ว่าจะเป็นงานในด้าน “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 แบบนั่นก็คือ
- สั่งผ่าน command line
- สั่งผ่าน python script (ใช้ pytesseract)
1. สั่งผ่าน command line
สามารถดูข้อมูลเพิ่มเติมของ tesseract ocr ได้ ที่นี่
1.1 การติดตั้ง และคำสั่งที่น่าสนใจ
ถ้าใช้ Ubuntu สามารถติดตั้งโดยใช้คำสั่งนี้
sudo apt-get install tesseract-ocr-tha
ส่วนถ้าใครใช้ Windows (Windows 10) สามารถติดตั้งโดยดูขั้นตอนตาม link นี้ได้เลยครับ
แต่ผมก็จะทำให้ดูเป็นตัวอย่างด้วยละกัน ~
- เข้าไปในเว็บไซต์ https://github.com/UB-Mannheim/tesseract/wiki เพื่อทำการโหลดไฟล์ .exe สำหรับติดตั้งโปรแกรมตามกรอบสีแดงด้านล่าง
2. เมื่อโหลดเสร็จแล้วจะได้ไฟล์หน้าตาแบบนี้มา
คลิ๊กที่ไฟล์นั้นเพื่อทำการรัน
หลังจากนั้นอย่าลืม coppy โฟลเดอร์นั้นด้วย โดยตามตัวอย่างของผมจะต้อง coppy โฟลเดอร์ C:\Program Files\Tesseract-OCR
อาจจะแปะไว้ที่ Notepad ไว้ก็ได้เผื่อกันหาย เพราะเราต้องนำที่อยู่ของโฟลเดอร์นี้ไปแก้ไข enviroment ทีหลัง
3. ทำการแก้ไข enviroment โดยเปิด System Properties โดยสามารถพิมพ์ env ในช่อง Windows แล้วเลือกโปรแกรมตามภาพด้านบน
กดที่ปุ่ม 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 ก็จะแลดูแปลกๆหน่อย 😂)
นอกจากนี้เรายังสามารถกำหนด 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
ไฟล์ .hocr ให้เติม hocr
ต่อท้าย
tesseract -l tha test_thai_OCR4.jpg test_thai_OCR4 hocr
ไฟล์ .pdf ให้เติม pdf
ต่อท้าย
tesseract -l tha test_thai_OCR4.jpg test_thai_OCR4 pdf
ไฟล์ .tsv ให้เติม tsv
ต่อท้าย
tesseract -l tha test_thai_OCR4.jpg test_thai_OCR4 tsv
ไฟล์ .txt ให้เติม txt
ต่อท้าย (หรือจะไม่ใส่ก็ได้ เพราะเป็นค่า default อยู่แล้ว)
tesseract -l tha test_thai_OCR4.jpg test_thai_OCR4 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
logfile
ซึ่งจะ return ออกมาเป็น ไฟล์ .txt ของข้อความที่ดึงออกมาได้เช่นกัน แต่ที่เพิ่มเติมคือไฟล์ที่มีชื่อว่า tesseract.log ซึ่งคือไฟล์ที่บันทึกข้อความ debug ต่างๆที่เกิดขึ้นระหว่างรันโปรแกร (ใน command line จะไม่ปรากฎอะไร แต่จะถูกเก็บไว้ใน .log ไฟล์แทน)
tesseract -l tha test_thai_OCR4.jpg test_thai_OCR4 logfile
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 ดึงข้อความออกมาได้ถูกต้องมากน้อยแค่ไหนด้วยครับ