OCR captcha gambar dan teks: cara membaca captcha yang terdistorsi
Captcha gambar menampilkan sebuah string pendek berupa huruf atau angka sebagai gambar, kadang disertai noise, rotasi, dan garis bergelombang. Optical character recognition (OCR) bisa membaca versi sederhana dari captcha ini dengan mesin open-source seperti Tesseract. Akurasinya bergantung pada seberapa bersih gambarnya, jadi sebagian besar pekerjaannya ada di tahap preprocessing. Panduan ini menunjukkan setup Python yang berfungsi, menjelaskan di mana ia gagal, dan memperjelas satu hal: API Scarnox yang aktif memecahkan token widget PopularCaptcha, bukan captcha gambar-ke-teks. Rencanakan OCR sebagai kode Anda sendiri, bukan sebagai panggilan API.
Kapan OCR berhasil dan kapan tidak
OCR adalah percobaan pertama yang wajar ketika teksnya:
- berada dalam satu baris, dengan jarak antarhuruf yang merata;
- kontras tinggi, dengan huruf gelap di latar terang;
- bebas dari distorsi berat, huruf yang saling tumpang tindih, dan garis yang melintang.
OCR kesulitan dengan huruf yang diputar, huruf yang saling menyentuh, tekstur latar, dan garis yang melewati glyph. Setiap kasus itu membutuhkan langkah preprocessing yang spesifik, dan beberapa membutuhkan model yang sama sekali berbeda. Bersiaplah untuk mengukur akurasi alih-alih menganggapnya sudah benar.
Instal alatnya
Anda membutuhkan Python, binary Tesseract, dan dua paket Python:
pip install pillow pytesseract
Tesseract sendiri adalah instalasi terpisah. Di Windows, gunakan installer dari proyek Tesseract dan pastikan executable-nya ada di PATH, atau arahkan pytesseract.pytesseract.tesseract_cmd ke sana.
Preprocess, lalu baca
Sebagian besar akurasi berasal dari input yang bersih. Urutan di bawah ini mengubah ke grayscale, menaikkan kontras, menerapkan threshold keras, memperbesar gambar, dan membatasi output hanya pada karakter yang digunakan captcha:
from PIL import Image, ImageOps
import pytesseract
# Karakter yang bisa digunakan captcha. Hilangkan karakter yang mirip seperti 0/O dan 1/I
# jika captcha tidak pernah menggunakannya.
ALLOWED = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"
def read_text(path: str) -> str:
img = Image.open(path)
gray = ImageOps.grayscale(img)
gray = ImageOps.autocontrast(gray)
# Threshold keras: piksel yang lebih terang dari 140 menjadi putih, sisanya hitam.
bw = gray.point(lambda p: 255 if p > 140 else 0)
# Tesseract bekerja lebih baik dengan glyph yang lebih besar.
bw = bw.resize((bw.width * 3, bw.height * 3))
config = f"--psm 7 -c tessedit_char_whitelist={ALLOWED}" # psm 7: satu baris teks
return pytesseract.image_to_string(bw, config=config).strip()
if __name__ == "__main__":
print(read_text("sample_captcha.png"))
Nilai threshold 140 adalah titik awal. Cetak gambar yang sudah diproses, bandingkan dengan gambar asli, dan sesuaikan sampai hurufnya solid dan latarnya bersih.
Ukur akurasi sebelum Anda mengandalkannya
Satu pembacaan yang benar untuk satu gambar tidak membuktikan apa-apa. Simpan sekumpulan captcha dengan jawaban yang sudah diketahui, jalankan fungsi pada semuanya, dan hitung kecocokannya:
def accuracy(samples: dict[str, str]) -> float:
# samples memetakan path file ke teks yang benar
hits = sum(read_text(path) == truth for path, truth in samples.items())
return hits / len(samples)
labelled = {
"samples/0001.png": "K7PQ2",
"samples/0002.png": "M3XN9",
}
print(f"akurasi: {accuracy(labelled):.0%}")
Catat angka ini setiap kali Anda mengubah preprocessing. Jika angkanya tetap rendah setelah beberapa perubahan, OCR mungkin alat yang salah untuk gaya captcha tersebut, dan Anda sebaiknya mencari pendekatan lain.
Di mana ia gagal
- Noise dan garis. Hapus garis dengan operasi morfologi, atau terima tingkat keberhasilan yang lebih rendah.
- Rotasi. Perkirakan sudutnya dan putar gambar sebelum dibaca.
- Huruf yang saling menyentuh. Memisahkan karakter per kolom dan membaca tiap karakter secara terpisah sering kali lebih baik daripada membaca seluruh baris.
- Perubahan seiring waktu. Situs bisa mengubah gaya tampilannya tanpa pemberitahuan, yang bisa menurunkan akurasi dalam semalam. Simpan kumpulan berlabel dan jalankan ulang secara berkala.
Daftar periksa preprocessing
Ketika pembacaan gagal, kerjakan langkah-langkah ini secara berurutan. Ubah satu hal dalam satu waktu agar Anda bisa melihat langkah mana yang membantu:
- Periksa ukuran input. Captcha yang sangat kecil sering kali lebih mudah dibaca setelah diperbesar 3x.
- Ubah ke grayscale dan regangkan kontrasnya agar huruf lebih menonjol.
- Terapkan threshold, dan coba beberapa nilai sebelum menetapkan satu.
- Hapus noise bintik dengan median filter, lalu terapkan threshold ulang jika perlu.
- Potong gambar ke area teks agar latar tidak membingungkan mesin.
- Batasi himpunan karakter hanya pada yang digunakan captcha.
- Coba mode segmentasi halaman yang berbeda jika teksnya tersebar atau bertumpuk.
Simpan urutan dan pengaturannya di version control, bersama sampel berlabel Anda. Pipeline preprocessing adalah kode, dan ia harus ditinjau seperti kode.
OCR atau model yang Anda jalankan sendiri
OCR klasik cepat dan berjalan di laptop, tetapi rapuh ketika captcha berubah gaya. Model gambar yang dilatih dengan kumpulan berlabel milik Anda sendiri bisa menangani variasi yang lebih banyak, dengan konsekuensi harus mengumpulkan data dan menjalankan inferensi. Keduanya menjadi tanggung jawab Anda untuk dibangun dan dipelihara. Tidak ada yang berupa endpoint Scarnox yang di-hosting saat ini, jadi rencanakan infrastrukturnya sebelum Anda berkomitmen pada salah satu.
Apa yang dilakukan dan tidak dilakukan Scarnox di sini
API Scarnox yang aktif memecahkan token widget PopularCaptcha. Requestnya adalah POST https://api.scarnox.com/api/tasks/create dengan jenis tugas PopularCaptcha, sitekey, dan URL halaman, dan responsnya adalah token untuk field form. Itu adalah pekerjaan yang berbeda dari membaca teks dalam gambar, dan Scarnox saat ini tidak menyediakan endpoint image-to-text. Jika masalah Anda adalah captcha gambar, gunakan OCR atau model yang Anda jalankan sendiri, dan lihat panduan lain untuk mengetahui apa yang dicakup Scarnox. Anda bisa buat akun dan mulai dengan kredit uji coba gratis, tanpa kartu, untuk alur PopularCaptcha yang didukung. Harga saat ini ada di halaman harga.
Penggunaan yang sah
- Membaca teks dari dokumen hasil pindai, tangkapan layar, atau gambar uji milik Anda sendiri.
- Alat aksesibilitas yang mendeskripsikan atau membacakan captcha agar pengguna dengan gangguan penglihatan bisa memakai rute alternatif yang disediakan situs.
- Menguji desain captcha Anda sendiri untuk melihat seberapa mudah alat otomatis bisa membacanya, sehingga Anda bisa membuatnya lebih kuat.
Jangan menggunakan OCR untuk melewati captcha di situs yang tidak mengizinkan akses otomatis. Captcha gambar ada justru untuk memperlambat hal persis seperti itu.