15 minute read

Beberapa hari ini, beberapa rekan saya sedang ramai-ramainya membahas terkait Optical Character Recognition (OCR). Untuk melakukan OCR secara mandiri dan otomatis di R, setidaknya ada dua cara. Yakni:

  1. Membuat model recognition sendiri.
  2. Menggunakan model yang sudah ada. Ini juga ada dua macam:
    1. Menggunakan library(tesseract) yang sudah tersedia secara gratis.
    2. Menggunakan cloud service berbayar semacam Google Vision dan Azure Cognitive (Vision).

Mungkin dari kalian ada yang bertanya-tanya, kenapa harus pakai R?

Karena untuk melakukan OCR seperti yang saya infokan di atas memang harus ngoding. Apalagi jika kita punya banyak images. Automation adalah kuncinya.

Kalau dipikir-pikir sudah lama juga saya menuliskan aplikasi OCR di market riset. Tampaknya kini ada pembaruan algoritma di sana-sini. Jadi kali ini saya akan membuat review singkat OCR mana yang lebih akurat. Saya akan membandingkan 3 kondisi images, yakni:

  1. Handwriting.
  2. Screenshot.
  3. Mixed text, gabungan tulisan tangan dengan huruf cetak.

Terhadap 3 cara OCR, yakni:

  1. tesseract
  2. Google Vision.
  3. Azure Vision.

Ronde I: Handwriting

Ronde pertama akan saya mulai dengan seberapa akurat OCR ini membaca tulisan tangan saya berikut:

## Tulisan tangan saya yang bagus

tesseract

Berikut adalah hasil pembacaan dari tesseract:

tess_handwrite
##      word confidence             bbox
## 1  Semoga   87.72462    34,41,460,194
## 2   wadah   51.40224   531,12,836,160
## 3     imi   52.25067   62,269,184,381
## 4   Seger    0.00000  267,276,565,393
## 5 erakhic    0.00000 619,193,1004,387
## 6   amit,    0.00000  105,507,483,647
## 7     15.   45.32839   75,779,203,902
## 8 Jonvari   46.56918  278,747,641,891
## 9    202!   79.32968  712,730,935,842
paste(tess_handwrite$word,collapse = " ")
## [1] "Semoga wadah imi Seger erakhic amit, 15. Jonvari 202!"

Lumayan lah yah hasilnya.

Azure Vision

Berikut adalah hasil pembacaan dari Azure Vision:

azure_handwrite
## [[1]]
## [1] "b-)ØOS"

Hasilnya sangat mengecewakan!. Walaupun Azure bisa membaca konteks dari images tapi dia gagal membaca tulisan tangan.

Google Vision

Berikut adalah hasil pembacaan dari Google Vision:

vision_handwrite
##    locale                                                   description
## 1      id Semoga wabah\nini segera berakhir.\nAamin.\n15 Januari 2021\n
## 2    <NA>                                                        Semoga
## 3    <NA>                                                         wabah
## 4    <NA>                                                           ini
## 5    <NA>                                                        segera
## 6    <NA>                                                     berakhir.
## 7    <NA>                                                        Aamin.
## 8    <NA>                                                            15
## 9    <NA>                                                       Januari
## 10   <NA>                                                          2021
##                                    vertices
## 1        32, 1044, 1044, 32, 4, 4, 902, 902
## 2        32, 450, 462, 44, 50, 18, 174, 206
## 3       524, 842, 852, 534, 29, 5, 132, 157
## 4      46, 287, 305, 64, 297, 266, 405, 437
## 5    289, 569, 587, 307, 265, 229, 369, 406
## 6  612, 1027, 1044, 629, 227, 173, 300, 354
## 7      57, 469, 485, 73, 518, 471, 609, 656
## 8      73, 203, 212, 82, 787, 777, 891, 902
## 9    272, 638, 647, 282, 774, 745, 864, 894
## 10   708, 930, 938, 716, 748, 730, 825, 843
cat(vision_handwrite$description[1])
## Semoga wabah
## ini segera berakhir.
## Aamin.
## 15 Januari 2021

Wah, luar biasa! Hasilnya sempurna!

We got the winner!


Ronde II: Screeshot: Tulisan Cetak

Ronde berikutnya saya akan menggunakan image hasil screenshot dari tablet saya sebagai berikut:

tesseract

Berikut hasil pembacaan dari tesseract:

paste(tess_screen$word,collapse = " ")
## [1] "London - Total kematian akibat infeksi virus Corona di dunia terus bertambah. Kini kasus kematian di dunia menembus 2 juta kasus per Jumat (15/1). Dilansir AFP, total keseluruhan ada 2.000.066 orang telah meninggal dunia sejak virus Corona muncul di China akhir tahun 2019. Ada 93.321.070 kasus positif Corona sejak dimulainya pandemi. Dari catatan AFP, negara yang memiliki jumlah kematian tertinggi adalah Amerika Serikat (389.581), Brasil (207.095), India (151.918), Meksiko (137.916), Inggris (87.295) dan Italia (81.325). Jika dijumlah, angka kematian keenam negara ini mencapai lebih dari setengah jumlah kematian global. Baca juga: 1 Juta Warga Italia Sudah Divaksin Corona Jumlah 1 juta kematian di dunia tembus pada 28 September lalu. 4 bulan berselang, jumlah kematian bertambah 1 juta, sehingga menjadi 2 juta kasus kematian. Minggu lalu, secara global, setiap negara mengalami dampak terparah. Rata-rata ada 13.600 kematian setiap hari di seluruh dunia. Angka ini meningkat 20 persen dari minggu sebelumnya."

Hasilnya sempurna untuk tulisan cetak.

Azure Vision

Berikut hasil pembacaan Azure Vision:

paste(azure_screen[[1]],collapse = " ")
## [1] "London - Total kematian akibat infeksi virus Corona di dunia terus bertambah. Kini kasus kematian di dunia menembus 2 juta kasus per Jumat (15/1). Dilansir AFP, total keseluruhan ada 2.000.066 orang telah meninggal dunia sejak virus Corona muncul di China akhir tahun 2019. Ada 93.321.070 kasus positif Corona sejak dimulainya pandemi. Dari catatan AFP, negara yang memiliki jumlah kematian tertinggi adalah Amerika Serikat (389.581), Brasil (207.095), India (1 51.918), Meksiko (137.916), Inggris (87.295) dan Italia (81.325). Jika dijumlah, angka kematian keenam negara ini mencapai lebih dari setengah jumlah kematian global. Baca juga: 1 Juta Warga Italia Sudah Divaksin Corona Jumlah 1 juta kematian di dunia tembus pada 28 September lalu. 4 bulan berselang, jumlah kematian bertambah 1 juta, sehingga menjadi 2 juta kasus kematian. Minggu lalu, secara global, setiap negara mengalami dampak terparah. Rata-rata ada 13.600 kematian setiap hari di seluruh dunia. Angka ini meningkat 20 persen dari minggu sebelumnya."

Hasil yang sempurna juga didapatkan.

Google Vision

Berikut hasil pembacaan Google Vision:

cat(vision_screen$description[1])
## London - Total kematian akibat infeksi virus Corona di dunia terus bertambah. Kini kasus kematian di dunia
## menembus 2 juta kasus per Jumat (15/1).
## Dilansir AFP, total keseluruhan ada 2.000.066 orang telah meninggal dunia sejak virus Corona muncul di
## China akhir tahun 2019. Ada 93.321.070 kasus positif Corona sejak dimulainya pandemi.
## Dari catatan AFP, negara yang memiliki jumlah kematian tertinggi adalah Amerika Serikat (389.581), Brasil
## (207.095), India (151.918), Meksiko (137.916), Inggris (87.295) dan Italia (81.325). Jika dijumlah, angka
## kematian keenam negara ini mencapai lebih dari setengah jumlah kematian global.
## |
## Baca juga:
## 1 Juta Warga Italia Sudah Divaksin Corona
## Jumlah 1 juta kematian di dunia tembus pada 28 September lalu. 4 bulan berselang, jumlah kematian
## bertambah 1 juta, sehingga menjadi 2 juta kasus kematian.
## Minggu lalu, secara global, setiap negara mengalami dampak terparah. Rata-rata ada 13.600 kematian
## setiap hari di seluruh dunia. Angka ini meningkat 20 persen dari minggu sebelumnya.

Hasilnya juga sempurna.

Untuk huruf cetak hasil screenshot, ketiga OCR memberikan hasil yang memuaskan.


Ronde Final: Mixed

Pada ronde final ini saya akan menggunakan gambar berikut:

tesseract

Berikut adalah hasil pembacaan dari tesseract:

paste(tess_mixed$word,collapse = " ")
## [1] "“ KWITANSI PEMBAYARAN Tenggale sci; Terima Dari: No: QOF Tanggal: LJen2t jumiah: «|: Terima Dari: fleang Fe ee ener renee ronrener momememmeesenmee | TOMD IAN Ss scscssscesicssusccscgee “Raa” jute” abiscesetaeseaeNeR Unk Pembayarsne” | Untuk Pembayaran: = Pllgadag WSte parnelenieininntis Tanda tangan Penerima Tanda tangan Penyetor"

Hasilnya ternyata buruk.

Azure Vision

Berikut adalah hasil pembacaan dari Azure Vision:

azure_mixed
## [[1]]
## [1] "Tanggal:"          "Terima Dari:"      "Jumlah:"          
## [4] "Untuk Pembayaran:"
## 
## [[2]]
## [1] "KWITANSI PEMBAYARAN" "l. 21"               "Tanggal: .."        
## [4] "Terima Dari: .."     "•Dc..qa"             "Terbilang: .."      
## [7] "Untuk Pembayaran:"  
## 
## [[3]]
## [1] "Tanda tangan Penerima"
## 
## [[4]]
## [1] "Tanda tangan Penyetor"

Ternyata Azure tidak mampu mendeteksi tulisan tangan saya. Hanya tulisan cetak saja yang bisa diambil.

GoogleVision

Berikut adalah pembacaan dari Google Vision:

cat(vision_mixed$description[1])
## KWITANSI PEMBAYARAN
## No:.
## Tanggal:
## No:..
## Tanggal: 1Jan 21
## Terima Dari:
## ......
## Ikang
## Jumlah:
## Terima Dari:
## Dua Juta
## Terbilang:
## Untuk Pembayaran: . Pulsa Jan listrik.
## Untuk Pembayaran:
## ...
## ....................
## RP. 2000 000
## ................
## Tanda tangan Penerima
## Tanda tangan Penyetor

Luar biasa! Google Vision mampu membaca semuanya.

We got the winner!


Summary

Google Vision menjadi layanan terbaik dalam hal OCR. Kemampuannya untuk membaca semua tipe tulisan bisa diandalkan.


if you find this article helpful, please support this blog by clicking the ads.