หลังจากที่ จบสงคราม End Game ไปเรียบร้อยแล้ว infinity stone ทั้งหมดกลับสู่ timeline ของตัวเอง โลกก็กลับสู่ความ สงบสุขอีกครั้ง และไอ้เจ้า Tesseract หลังจากสิ้น Tony Stark ก็ได้ตกไปอยู่ในมือของเจ้าพ่อ เทคโนโลยีอย่าง Google https://opensource.google/projects/tesseract
มาเรามาลองกันแบบ ง่ายๆ แรกเริ่มประเดิมงานกันก่อนฮะ
ด้วยการสั่ง install ผ่าน home brew บน osx ส่วน os อื่นไปหาเอง
brew install tesseract
หลังจาก install แล้ว ลอง run คำสั่ง
tesseract --list-langs
ระบบจะทำการลิสภาษาที่ support ออกมาให้เรา แม่งไม่มีภาษาไทย ฮาๆๆๆๆ
brew install tesseract-lang
ทำการเพิ่ม package ภาษาลงไปให้หมด แล้ว list-langs มาดูใหม่ จะเห็นว่ามีภาษาไทยแล้วจ้า
หลังากนั้นเราจะมาทดลอง ด้วยการลองโอนเงินไปให้ Grab Taxi สัก 200 ดู แล้วเอา Slip มาใช้งาน
ลอง run command ดู
tesseract IMG_7979.JPG textfile -l tha --dpi 380Tesseract Open Source OCR Engine v4.1.1 with LeptonicaDetected 25 diacritics
เราจะได้ textfile.txt ขึ้นมา 1 file
cat textfile.txt ✔ 1166 10:27:42เติมเงินสําเร็จ10 ก.ุค. 64 15:20 น. |<+นาย คมกฤษณ์ธ.กสิกรไทย2๐<-%-%8982-%ง/(6เลเง?7ลบ ฟิลแนล! 9อเพลเลสู่ แห |<3ลท0925905444 เมกน202107100047879เลขที่รายการ:ว วร รรลจํานวน:: ก 0ทค่าธรรมเนียม: :0.00 บาท ลทพ์กิลส อบ 1<+
เป็นอันเรียบร้อย แต่ดูเหมือนว่ามันจะมีปัญหากับภาษาไทยอยู่
งั้นเรามาลองทดสอบใหม่กับภาษา อังกฤษดูกันก่อน
tesseract 04.png textfile -l eng --dpi 380Tesseract Open Source OCR Engine v4.1.1 with Leptonica
cat textfile.txt ✔ 1168 10:31:47&Y WelcomeAn online API documentation with examples so you can start building web apps with Fiber right away!Fiber is an Express inspired web framework built on top of Fasthttp, the fastest HTTP engine for Go.Designed to ease things up for fast development with zero memory allocation and performance inmind.
เรียบร้อย ทำงานได้ถูกต้อง แต่พอเป็น Slip ภาษาไทย มันจะเพี้ยน งั้นเราจะมาลองเขียน เป็น python เพื่อจัดการไฟล์ต้นฉบับกันสักนิดนึงก่อนทำการแปลง เป็น text กันครับ
import cv2import pytesseractimg = cv2.imread('IMG_7979.JPG')custom_config = r'-l tha --oem 3 --psm 6 -c language_model_ngram_space_delimited_language=1'print(pytesseract.image_to_string(img, config=custom_config))
output
เตมเงนสาแรจ| 10 ก.ค. 64 15:20 1 |<+นาย คมกฤษณ์6 ธ.กสิกรไทย2๐๐-%-%8982-%ง/(6หลเว7ลบ ทปลและ ๐พลหลคด อบ (8ลท๐๑ 0925905444 |202107100047879 0('เลขที่รายการ: เน011191152049629525 [@ไวย์%[ข]จํานวน: 5 รันร200.00 บาท ซาร เลรคํารรรมณียบ: : 5 [๓] ซี ท วดูดผูวิท . ง๑หกอส่อบ«๓
จากนั้นเราจะทำการแก้ไข code เล่นนิดหน่อย ให้ opencv ทำการวาด box ให้กับ words ที่เราค้นหาเจอในภาพ
import cv2import pytesseractfrom pytesseract import Outputimg = cv2.imread('IMG_7719.JPG')custom_config = r'-l tha --oem 1 --psm 6 -c language_model_ngram_space_delimited_language=1'data = pytesseract.image_to_data(img,config=custom_config, output_type=Output.DICT)keys = list(data.keys())totalBox = len(data['text'])for i in range(totalBox):(x, y, w, h) = (data['left'][i], data['top'][i], data['width'][i], data['height'][i])img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)cv2.imshow('img', img)cv2.waitKey(0)print(''.join(data['text']))
เมื่อทดลอง run จะได้ผลลัพท์ดังนี้
|โอนเงินสําเร็จ1<+28มิย.6407:04น.นายคมกฤษณ์!เ6ธ.กสิกรไทย2๐๐-%-%8982-%ง/น.ส.กนกรัตน์หงษ์ขาว69ธ.กสิกรไทย2๐๐-%-%7776-%เลขที่รายการ:011179070444500539[๒][๒]จํานวน:แห18,000.00บาทพค่าธรรมเนียม:[๒]อ0.00บาทง๑ทพกิลดเวบ|<+
ต่อไปเราจะมาลองใช้รูปบัตรประชาชนดูบ้าง
https://www.rd-comp.com/product/tra301bt/
โดยผลลัพท์จาการดึงจะได้เป็น
ข้อมูลประจําตัวประชาชนโล!1ง๑น่อกล110ละสDataสรมซ้ตั05น,1234567890123jต|a==รื่อตัวและชื่อสกุลใยติวอย่างนามรองสาธตสกุล=NameMr,Sample=LastnameMiddleNameSatitsakul=เลิดวัจเซี่a=เกิดวันที30มี.ค.2508พง.180=DateofBirth30Mar.1965=กกSSfog1/11val11ตรอกปฐมซ.สุขุมวิท1ถ.สุขุมวิทaฒิ=แขวงคลองเตยเหนือเขตพระโขนงกรุงเทพมหานคร=315.0.25504เม.ย.256329มี.ค.2556150.150๒๒๒วันออกบัตร11:46:02น.วันบัตรหมดอายุoeอ--==31Dec.2007วันเวลาที่อ่านบัตร29Mar.2013งว=dateofIssuewwwad-comp.comDateofExpiry1284-56-78901234q\laiienkesiiauseanmsthemmiioslaeaha1.2.000:
ซึ่งมันอ่านไม่ค่อยออก ผมเลยจะทำการเปลี่ยนรูปเป็น gray scale ก่อน ด้วยการเพิ่ม func ลงไป
def get_grayscale(image):return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)gray = get_grayscale(img)img = gray
ข้อมูลประจําตัวประชาชนโล]งลนอกล110ละ๕ปล18สะตระบน,1234567890123กvo2==รื่อตัวและชื่อสกุลใยติวอย่างนามรองสาธตสกุล=NameMr,Sample=LastnameMiddleNameSatitsakul=เดิดวงเซี่a=เกิดวันที30มี.ค.250814180=>DateofBirth30Mar.1965=กกSSท่อยู่บ11หมู่ที่1ตรอกปฐมซ.สุขุมวิท1ถ.สุขุมวิทaฒิ=แขวงคลองเตยเหนือเขตพระโขนงกรุงเทพมหานคร”=315.0,25504ie,256329dia.2556150.L1505วันออกบัตร114602นวันบัตรหมดอยุ77>==31Dec.2007วันเวลาที่อ่านบัตร29Mar.2013«=dateofIssuewww.rd-comp.comDateofExpiry1234-56-78901234ไม่ใช่บัตรประจําตัวประชาชนสร้างภาพบัตรโดยภเริฒล01.2.000
ต่อไปจะลองปรับ thresholding มันคืออะไร ตามไปอ่านที่นี่ http://56cjgj.blogspot.com/2017/02/thresholding.html
ด้วยการเพิ่ม func อีกตัว
def thresholding(image):return cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]gray = get_grayscale(img)thresh = thresholding(gray)img = thresh
เฉพตตน,1234567890123jน.voa==รื่อตัวและชื่อสอุลนยติวอย่างนามรองสาธตสกุล=NameMr,Sample=LastnameMiddleNameSatitsakul—_aea=เกิดวันที3031.A,2508180.19=>DateofBirth30Mar.1985=am05ห่อยู่บ11หมู่ที่1ตรลกปฐมซ.สุขุมวิท1ถ.สุขุมวิทa‘a=แขวงคลองเตยเหนือเขตพรืะโขนงกรุงเทพมหานครต5ว15.ค25504BLY.256329มี.ค.2556150.[1505วันจะกบัตร114602นวันบัตรหมดยยุ7-เอมSS31Dec.2007วันเวลาที่อ่านบัตร29Mar.2013;FSdateoftesuswwrw.rd-compcomDateofExpiry1234-56-78901234ไม่ใช่มัตรประจําตัวประชาชนสร้างภาพบัตรโดย47ข๓เฮ01.2.000
เท่าที่ลองดึงดู ภาษาอังกฤษ จะได้ words มาค่อนค่างแม่นยำ แต่พอเป็น non english อย่างเช่นภาษาไทย จะแยกคำออกมาเป็น ตัวอักษรละ คำเลย
['', '', '', '', 'เฉ', '', 'พ', 'ต', 'ต', 'น,', '1', '2345', '67890', '12', '3', '', 'j', 'น.', 'vo', 'a', '', '==', 'ร', 'ื', '่', 'อ', 'ต', 'ั', 'ว', 'แล', 'ะ', 'ชื', '่', 'อ', 'ส', 'อุ', 'ล', 'น', 'ย', 'ต', 'ิ', 'ว', 'อ', 'ย', '่', 'า', 'ง', 'น', 'า', 'ม', 'ร', 'อ', 'ง', 'ส', 'า', 'ธ', 'ต', 'ส', 'ก', 'ุ', 'ล', '', '=', 'Name', 'Mr,', 'Sample', '', '=', 'Last', 'name', 'MiddleName', 'Satitsakul', '', '—_', 'ae', 'a', '', '=', 'เก', 'ิ', 'ด', 'ว', 'ั', 'น', 'ท', 'ี', '30', '31.A,', '2508', '180.', '19', '', '=>', 'Date', 'of', 'Birth', '30', 'Mar.', '1985', '', '=', 'a', 'm0', '', '5', 'ห่', 'อ', 'ย', 'ู', '่', 'บ', '11', 'ห', 'ม', 'ู', '่', 'ท', 'ี', '่', '1', 'ต', 'ร', 'ล', 'ก', 'ป', 'ฐ', 'ม', 'ซ', '.', 'ส', 'ุ', 'ขุ', 'ม', 'ว', 'ิ', 'ท', '1', 'ถ', '.', 'ส', 'ุ', 'ขุ', 'ม', 'ว', 'ิ', 'ท', 'a', '‘a', '', '=', 'แข', 'ว', 'ง', 'ค', 'ล', 'อ', 'ง', 'เต', 'ย', 'เห', 'น', 'ื', 'อ', 'เข', 'ต', 'พ', 'ร', 'ื', 'ะ', 'โข', 'น', 'ง', 'ก', 'ร', 'ุ', 'ง', 'เท', 'พ', 'ม', 'ห', 'า', 'น', 'ค', 'ร', 'ต', '', '5', 'ว', '15.', 'ค', '2550', '4', 'BLY.', '2563', '29', 'ม', 'ี', '.', 'ค', '.', '2556', '150.', '[', '150', '', '5', 'ว', 'ั', 'น', 'จ', 'ะ', 'ก', 'บ', 'ั', 'ต', 'ร', '114602', 'น', 'ว', 'ั', 'น', 'บ', 'ั', 'ต', 'ร', 'ห', 'ม', 'ด', 'ย', 'ย', 'ุ', '7', '-', 'เอ', 'ม', '', 'SS', '31', 'Dec.', '2007', 'ว', 'ั', 'น', 'เว', 'ล', 'า', 'ท', 'ี', '่', 'อ', '่', 'า', 'น', 'บ', 'ั', 'ต', 'ร', '29', 'Mar.', '2013', ';', '', 'FS', 'date', 'of', 'tesus', 'wwrw.rd-compcom', 'Date', 'of', 'Expiry', '1234-56-78901234', '', 'ไม', '่', 'ใช', '่', 'มั', 'ต', 'ร', 'ป', 'ร', 'ะ', 'จ', 'ํ', 'า', 'ต', 'ั', 'ว', 'ป', 'ร', 'ะ', 'ชา', 'ชน', 'ส', 'ร', '้', 'า', 'ง', 'ภา', 'พ', 'บ', 'ั', 'ต', 'ร', 'โด', 'ย', '4', '7', 'ข', '๓', 'เฮ', '0', '1.2.000']
ถ้าจะทำมาใช้งานจริงจัง คงต้องค้นคว้าอีกเยอะ
Quick Links
Legal Stuff