[iOS/Swift 4] OCR Menggunakan Tesseract

Pada tutorial kali ini kita akan mencoba menggunakan teknik Optical Character Recognition (OCR) untuk mendeteksi kata-kata dari suatu teks yang diberikan di dalam sebuah gambar. Gambar ini dapat diperoleh dari gambar yang memang diberikan oleh kita sebagai pengembang atau pun kamera perangkat smartphone, namun dalam kehidupan nyata dapat dipastikan hampir keseluruhan gambar diperoleh dari kamera perangkat smartphone. Kita akan mencoba mendapatkan gambar dengan kedua cara tersebut pada tutorial kali ini.

Kita akan menggunakan library Tesseract yang dikelola oleh Google untuk melakukan pemindaian OCR. Ini adalah library gratis dan yang paling umum digunakan. Library ini memiliki beberapa keterbatasan, yaitu kecepatan pemindaian OCR yang tidak begitu cepat dan jika gambar tidak terlalu kontras hasil pemindaian akan berantakan. Sebenarnya banyak library OCR lainnya yang lebih powerful baik gratis atau pun berbayar, tetapi untuk permulaan belajar tentang OCR, library ini sudah cukup.

Dengan menggunakan data gambar yang diberikan langsung:

1. Buat proyek Xcode baru dengan pilihan template aplikasi "Single View Application".

2. Tutup file .xcodeproj, kemudian pasang Cocoapod seperti yang ditunjukkan pada tutorial [IOS/Swift 3] Cara Memasang Dan Menggunakan Cocoapod

3. Pasang tesseract pod versi terbaru (saat tutorial ini ditulis versi terbarunya adalah 4.0.0)


pod ‘TesseractOCRiOS’, ‘4.0.0’

4. Buka file .xcworkspace yang dihasilkan dari proses pemasangan Cocoapod.

5. Buka file Main.storyboard, pada View Controller yang telah tersedia tambahkan sebuah objek TextView. Atur Autoresizing-nya untuk memiliki nilai flexibleWidth, marginRight, marginLeft dan marginTop.

6. Buat @IBOutlet dari TextView pada langkah 4 ke file ViewController.swift.

class ViewController: UIViewController, G8TesseractDelegate {
@IBOutlet weak var textView: UITextView!
    
...
}

7. Pada file ViewController.swift, import modul TesseractOCR

import TesseractOCR

8. Pada class ViewController tambahkan protokol G8TesseractDelegate.

class ViewController: UIViewController, G8TesseractDelegate {
...
}

9. Ambil data bahasa yang ingin Anda gunakan dari halaman web tessdata-Tesseract.

10. Simpan semua file bahasa yang telah Anda unduh (yang berekstensi .traineddata) ke dalam sebuah folder yang harus Anda beri nama "tessdata", dan sebaiknya Anda simpang di dalam direktori proyek ini.

11. Masukkan folder "tessdata" ke dalam Xcode dengan pengaturan sebagai berikut ini.

12. Inisialiasi objek Tesseract dengan inisialisasi dengan sebuah bahasa menggunakan optional binding. Kenapa menggunakan optional binding? Karena ada kemungkinan file bahasa yang di-load pada saat inisialisasi tidak bekerja atau rusak. Jika hal tersebut terjadi, maka objek Tesseract akan bernilai nil. Gunakan nama bahasa yang telah Anda unduh sebelumnya, contohnya "eng" untuk bahasa inggris. Anda dapat melakukan inisialisasi dengan menggunakan lebih dari 1 bahasa. Misalnya jika sebelumnya Anda mengunduh bahasa inggris dan indonesia,
dan Anda ingin menggunakan keduanya, maka tulis "eng+ind".

class ViewController: UIViewController, G8TesseractDelegate {
@IBOutlet weak var textView: UITextView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if let tesseract = G8Tesseract(language: "eng") {
            
        }
    }
...
}

13. Terapkan metode delegate Tesseract ke class ViewController.

class ViewController: UIViewController, G8TesseractDelegate {
@IBOutlet weak var textView: UITextView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if let tesseract = G8Tesseract(language: "eng") {
            tesseract.delegate = self
        }
    }
...
}

14. Tulis baris kode untuk menampung file gambar yang akan dipindai. Untuk melakukan image processing data gambar, Tesseract memiliki 2 metode, yaitu black&white (g8_blackAndWhite) dan grayscale (g8_grayScale). Proses pemindaian berjalan paling cepat dengan menggunakan metode black&white().

class ViewController: UIViewController, G8TesseractDelegate {
@IBOutlet weak var textView: UITextView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if let tesseract = G8Tesseract(language: "eng") {
            tesseract.delegate = self
            tesseract.image = UIImage(named: "")?.g8_blackAndWhite()
        }
    }
...
}

15. Untuk memulai proses pemindaian OCR, gunakan metode recognize().

class ViewController: UIViewController, G8TesseractDelegate {
@IBOutlet weak var textView: UITextView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if let tesseract = G8Tesseract(language: "eng") {
            tesseract.delegate = self
            tesseract.image = UIImage(named: "")?.g8_blackAndWhite()
            tesseract.recognize()
        }
    }
...
}

16. Teks hasil pemindaian OCR dapat diakses melalui variabel recognizedText. Kita dapat menampung nilai variabel ini pada textView yang telah kita buat sebelumnya.

class ViewController: UIViewController, G8TesseractDelegate {
@IBOutlet weak var textView: UITextView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if let tesseract = G8Tesseract(language: "eng") {
            tesseract.delegate = self
            tesseract.image = UIImage(named: "")?.g8_blackAndWhite()
            tesseract.recognize()

            textView.text = tesseract.recognizedText
        }
    }
...
}

17. Untuk melihat sejauh mana proses pemindaian OCR sedang perlangsung, kita dapat melalui fungsi delegate progressImageRecognition(for tesseract: G8Tesseract!). Kemudian akses variabel progress dari dalam fungsi tersebut untuk melihat proses pemindaian dalam persentase.

class ViewController: UIViewController, G8TesseractDelegate {
...

    //MARK: G8TesseractDelegate
    func progressImageRecognition(for tesseract: G8Tesseract!) {
        print("tesseract progress: \(tesseract.progress)%")
    }
}

18. Sejauh ini kita terlihat seperti telah siap untuk mencoba pemindaian OCR, tetapi tunggu dulu, ingat, kita belum punya file gambar yang akan digunakan untuk mencoba pemindaian OCR. Saya menggunakan ketiga gambar berikut ini untuk mencoba pemindaian OCR. Silahkan Anda gunakan gambar dari saya atau gunakan gambar milik Anda sendiri.

19. Masukkan gambar-gambar tester Anda ke dalam folder Asset.xcassets. Pindahkan masing-masing gambar ke dalam skala 2 agar dapat ditampilkan pada layar-layar besar iPhone.

20. Tulis nama file tester yang ingin digunakan pada baris berikut ini.

...
tesseract.image = UIImage(named: "")?.g8_blackAndWhite()
...

21. Jalankan proyek pada perangkat iPhone atau simulator iPhone Anda.
Hasil percobaan yang saya lakukan sebagai berikut ini.

22. Berikut ini adalah source code lengkap pada class ViewController.

import UIKit
import TesseractOCR

class ViewController: UIViewController, G8TesseractDelegate {
    @IBOutlet weak var textView: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()
         
        if let tesseract = G8Tesseract(language: "eng") {
            tesseract.delegate = self
            tesseract.image = UIImage(named: "")?.g8_blackAndWhite()
            tesseract.recognize()

            textView.text = tesseract.recognizedText
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    //MARK: G8TesseractDelegate
    func progressImageRecognition(for tesseract: G8Tesseract!) {
        print("tesseract progress: \(tesseract.progress)%")
    }
}

Dengan menggunakan data gambar dari kamera perangkat:

BERSAMBUNG...

Tingkat kesulitan: Pemula

Share this post to the world:
Facebooktwittergoogle_pluspinterestlinkedinFacebooktwittergoogle_pluspinterestlinkedin

Leave a Reply

Your email address will not be published. Required fields are marked *