Xây dựng ứng dụng OCR sử dụng Machine Learning

0
Bài này thuộc phần 6 của 7 phần trong series Học Firebase cơ bản

Bạn đã bao giờ nghe đến ứng dụng có thể convert ảnh sang text chưa? Tức là khi bạn chụp một biển quảng cáo, ứng dụng sẽ phát hiện các chữ và chuyển nó thành text cho bạn. Những ứng dụng như vậy gọi là ứng dụng OCR (Optical Character Recognition) hay nhận dạng ký tự quang học.

Tính năng OCR có rất nhiều ứng dụng trong thực tế như: Ứng dụng OCR để nhận diện biển số trong trông giữ xe máy, ôtô. Hay tự động nhận diện tên trên Card Visit…

Bài viết này mình sẽ hướng dẫn các bạn tạo ứng dụng OCR sử dụng Machine Learning (một trong những tính năng hot của Firebase) cho Android.

>>> Nên đọc: Firebase là gì? Dịch vụ tuyệt vời của Google

Bắt đầu nhé!

Xây dựng ứng dụng OCR sử dụng Machine Learing

#Giới thiệu ML Kit là gì?

Ngày nay, Machine Learning đã trở thành một phần không thể thiếu trong phát triển ứng dụng di động. Các công ty lớn như Uber, Facebook, Microsoft, vv… phụ thuộc rất nhiều vào việc sử dụng Machine Learning cho doanh nghiệp của họ.

Machine Learning giúp người dùng sử dụng ứng dụng  tốt hơn, cung cấp cho họ trải nghiệm tốt hơn.

Chính vì lẽ đó, Firebase ML Kit được ra đời. ML Kit được Google giới thiệu tại sự kiện Google I/O 2018. Đây là SDK mobile cho phép các nhà phát triển ứng dụng Android và iOS có khả năng sử dụng Machine Learning một cách dễ dàng.

>>> Có thể bạn quan tâm: Machine learning trong Game

Hiện tại ML Kit đang cung cấp 5 APIs cơ sở và custom model support:

  • Text recognition (nhân dạng văn bản)
  • Image labeling (ghi nhãn hình ảnh)
  • Barcode scanning (quét mã vạch)
  • Face detection (nhận diện khuôn mặt)
  • Landmark recognition (nhận diện mốc)
5 tính năng của ML Kit
5 tính năng của ML Kit

#Triển khai ứng dụng OCR sử dụng Machine Learning trên Android

Thực ra, các giải pháp OCR thì đã có nhiều rồi. Ví dụ, trước đây mình hay sử dụng thư viện tesseract, hay Mobile vision của Android…

Tuy nhiên, nhược điểm của các phương pháp trên là độ chính xác không cao, muốn cải thiện thì phải mất thời gian tạo data mẫu.

Giờ đây, khi Machine Learning đã phát triển, và được ứng dụng để tăng độ chính xác cho ứng dụng OCR thì thật là mới mẻ.

1. Ứng dụng OCR là gì?

Ngày nay, hầu hết mọi thứ đều là kỹ thuật số. Vì vậy, nếu bạn số hóa được những thực thể thì càng dễ xử lý. OCR chỉ là một khía cạnh của việc số hóa mà thôi.

Mình lấy ví dụ về một ứng dụng của OCR: Bạn đi nhậu với đám chiến hữu. Đến khi thanh toán hóa đơn và tất nhiên là mọi người muốn “cam pu chia” rồi. Nhưng ai và trả bao nhiêu cho pizza hay đồ uống?

Bây giờ, bạn có thể chụp ảnh hóa đơn và một ứng dụng trên điện thoại có thể phân chia chi phí cho bạn. Nó thậm chí có thể gửi lời nhắc về việc thanh toán cho bạn bè của bạn.

Một ví dụ khác: Bạn muốn tìm kiếm thông tin về một tuyến xe buýt? Chỉ bằng cách chụp ảnh số xe buýt hoặc tên của trạm xe buýt, bạn có thể nhận được thông tin về tuyến xe buýt bạn cần.

Bạn thấy đấy, với sự hỗ trợ của OCR, ứng dụng đã có thể làm được rất nhiều việc hay ho đúng không?

2. Ứng dụng OCR hoạt động như thế nào?

Mỗi bức ảnh chỉ là một ma trận các pixels,với thông tin cơ bản về màu sắc. Để giúp máy tính tìm thấy những gì bạn cần, chúng ta cần làm cho nó cách nhận biết các chữ cái.

Để dạy được máy tính, chúng ta cần một mô hình nhận dạng (pattern recognition). Mô hình nhận dạng có thể được sử dụng cho một văn bản có cùng phông chữ, kích thước và khoảng cách từ trên xuống dưới.

Nhưng nếu chúng ta có các phông chữ và kích cỡ khác nhau trong suốt văn bản thì sao?

Tính năng phát hiện hoặc nhận dạng ký tự thông minh (ICR) được sử dụng để khắc phục vấn đề đó.  Nó tìm kiếm các chữ cái đáp ứng các yêu cầu được chỉ định.

Ví dụ: nếu bạn thấy hai đường thẳng góc cạnh gặp nhau tại một điểm trên đỉnh và có một đường kẻ ngang nằm giữa chúng cách nhau một nửa, thì đó là chữ A.

Phần lớn phần mềm OCR hiện nay đều sử dụng tính năng phát hiện, thay vì nhận dạng mẫu, để tìm các chữ cái trên hình ảnh.

3.Cài đặt ML Kit trên Firebase

Giống như các bài trước mình đã hướng dẫn các bạn sử dụng firebase. Đầu tiên các bạn vào firebase và chọn nút Add project.

Khi các bạn tạo thành công sẽ có hình như sau và tải file google-service.json

Thêm dự án ML Kit trong firebase

Lúc nào hiện hình này là bạn đã cài đặt thành công firebase

ung-dung-ocr-su-dung-machine-learing-3

Các bạn hãy vào bảng điểu khiển và click vào ML KIT

Quản lý ML Kit trong Firebase

Và đây là các công cụ mà ML Kit firebase hỗ trợ.

các tính năng của ML Kit

Bài viết này, mình sẽ hướng dẫn sử dụng Text Recognition

4. Khởi tạo dự án OCR sử dụng Machine Learning trên Android Studio

Các bạn add thư viện ML Kit Android vào file build.gradle

dependencies {
  // ...

  implementation 'com.google.firebase:firebase-ml-vision:20.0.0'
}

Theo mặc định, các mô hình local của Firebase ML Kit chỉ được tự động tải xuống thiết bị của người dùng khi cần.

Nếu bạn muốn chúng được tải xuống ngay khi ứng dụng của bạn được cài đặt, hãy thêm code sau vào tệp AndroidManifest.xml:

<meta-data
    android:name="com.google.firebase.ml.vision.DEPENDENCIES"
    android:value="ocr" />

Thiết kế layout
Trong file activity_main.xml thiết kế gồm 1 ảnh và 1 button chọn text và text show dữ liệu.

Giao diện ứng dụng OCR

Trong file MainActivity.java, bước đầu tiên ánh xạ các View, rồi bắt đầu xử lý các sự kiện cho button.

>>> Có lẽ bạn cần: Xử lý sự kiện trong Android (Event Listeners) bằng Kotlin

Đầu tiên xử lý sự kiện ở button snap tới màn hình chụp ảnh và get ra ảnh set vào image

public void setChooseImage(){
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "Select Picture"), 1);
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (requestCode == 1) {
            Uri selectedImageUri = data.getData();
            Bitmap bitmap = null;
            try {
                bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImageUri);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (null != selectedImageUri) image.setImageURI(selectedImageUri);
            runTextRecognition(bitmap);
        }
    }
}

Và hàm quan trọng nhất ở đây là hàm runTextRecognition(bitmap);

Dưới đây là hàm detect ảnh và set dữ liệu vào trong textview.

private void runTextRecognition(Bitmap mSelectedImage) {
    FirebaseVisionImage image = FirebaseVisionImage.fromBitmap(mSelectedImage);
    FirebaseVisionTextDetector detector = FirebaseVision.getInstance().getVisionTextDetector();
    detector.detectInImage(image).addOnSuccessListener(
            new OnSuccessListener<FirebaseVisionText>() {
                @Override
                public void onSuccess(FirebaseVisionText texts) {
                    processTextRecognitionResult(texts);
                }
            });
}

@SuppressLint("SetTextI18n")
private void processTextRecognitionResult(FirebaseVisionText texts) {
    List<FirebaseVisionText.Block> blocks = texts.getBlocks();
    if (blocks.size() == 0) {
        text.setText("No text found!");
        return;
    }
    StringBuilder sb = new StringBuilder("");
    for (int i = 0; i < blocks.size(); i++) {
        List<FirebaseVisionText.Line> lines = blocks.get(i).getLines();
        for (int j = 0; j < lines.size(); j++) {
            List<FirebaseVisionText.Element> elements = lines.get(j).getElements();
            for (int k = 0; k < elements.size(); k++) sb.append(elements.get(k).getText()).append(" ");
            sb.append("\n");
        }
        sb.append("\n");
    }
    text.setText(sb.toString());
}

Và đây là kết quả sau khi chúng ta chạy chương trình.

Demo ứng dụng OCR với Machine learning
Demo ứng dụng OCR với ML Kit

#Tạm kết

Như vậy, chúng ta đã tạo xong tính năng ứng dụng OCR sử dụng Machine Learning của Firebase.

Với sự trợ giúp của ML Kit thì việc xây dựng tính năng OCR thực sự đơn giản hơn rất nhiều phải không?

Các bạn có thể download source code của bài viết tại đây:

Mình hi vọng bài viết này có ích cho bạn, đừng quên để lại bình luận cho mình có động lực nhé!

Xem tiếp các bài trong Series
Phần trước: Tạo Push Notification với Firebase trong ứng dụng AndroidPhần kế tiếp: Nhận diện khuôn mặt với Firebase MLKit trong Android

Bình luận. Đặt câu hỏi cũng là một cách học

avatar
  Theo dõi bình luận  
Thông báo