OCR và bài toán nhận diện chữ viết

Mobile Aug 24, 2021

Giới thiệu

Nhận dạng chữ viết là 1 bài toán khá hay và có tính ứng dụng thực tiễn với đầu vào là một ảnh và đầu ra là những text trong ảnh đó. Hiện nay trên thế giới có rất nhiều công cụ hỗ trợ cho việc này có thể kể đến như google vision api, microsoft ocr,..

Trong bài viết hôm nay mình sẽ giới thiệu cho mọi người cách sử dụng google vision api áp dụng trên nền tảng Android để nhận dạng chữ viết trong ảnh.

Các bước chuẩn bị

  • API key : Truy cập ​​https://console.cloud.google.com/freetrial và làm theo các bước để đăng ký key.
  • Bài toán chúng ta cần làm là Text Detection.( Trong ảnh dưới là giá đi kèm với việc sử dụng key).

Triển khai trên Android

Trong bài viết này mình sử dụng thư viện retrofit để thực hiện call api

Đầu tiên tạo các class thực hiện request

data class ImageContentRequest(@SerializedName("content") var content: String)

data class TypeRequest(@SerializedName("type") var type: String = "TEXT_DETECTION")

data class ImageContext(@SerializedName("languageHints") var languageHints: List<String> )

data class ObjectRequest(
   @SerializedName("image") var image: ImageContentRequest,
   @SerializedName("features") var features: List<TypeRequest>,
   @SerializedName("imageContext") var imageContext: ImageContext?
) {
   constructor(image: ImageContentRequest, features: List<TypeRequest>) : this(image, features, null)
}

data class OCRRequest(@SerializedName("requests") var requests: List<ObjectRequest>)

trong đó ImageContentRequest là ảnh được convert sang dạng base64.

TypeRequest : TEXT_DETECTION là type thực hiện request trong ảnh trên (chúng ta có thể thay đổi nó với DOCUMENT_DETECTION để nhận diện chữ viêt tay)

Tạo class retrofit

object RetrofitInstance {
   var ocrRetrofit: Retrofit = Retrofit.Builder().client(OkHttpClient.Builder().connectTimeout(20, TimeUnit.SECONDS).readTimeout(20, TimeUnit.SECONDS).build())
       .baseUrl("https://vision.googleapis.com").addConverterFactory(GsonConverterFactory.create()).build()
}

interface ApiService {
   @POST("v1/images:annotate?key=YOUR_API_KEY")
   fun objectCharacterRecognize(@Body ocrRequest: OCRRequest?): Call<String>
}

Để thực hiện detect ảnh.

Bước 1: convert ảnh sang base64

suspend fun bitmapToBase64(bitmap: Bitmap): String = withContext(Dispatchers.IO) {
   val bs = ByteArrayOutputStream()
   bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bs)
   Base64.encodeToString(bs.toByteArray(), Base64.DEFAULT)
}

val objectRequests = ObjectRequest(ImageConntenRequest(bitmapToBase64())

Bước 2: Thực hiện call API

val ocrRequest = OCRRequest(objectRequests)
val ocrService = RetrofitInstance.ocrRetrofit.create(ApiService::class.java)
val ocrResponseCall = ocrService.objectCharacterRecognize(ocrRequest = ocrRequest)

Ví dụ : Mình sẽ thử quét thử 1 ảnh và xem kết quả nhận được là gì nhé?

Đây là 1 đoạn kết quả JSON sau khi thực hiện call api mà Google API trả về

Ngoài ra trong response trả về có cả toạ độ đi kèm với mỗi text tìm được.

Ta có thể vẽ canvas từ toạ độ lên bức ảnh.

Trên đây là mình giới thiệu về OCR, công cụ để có thể nhận diện chữ viết . Nếu có bất kỳ thắc mắc nào, các bạn có thể comment  bên dưới nhé.
Cảm ơn các bạn đã đọc và hẹn mọi người vào những bài tiếp theo nhé.

Tác giả: Phí Văn Tuấn



Tags

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.