1 Tổng quan

Cloud Vision API là bộ API được Google cung cấp giúp các lập trình viên dễ dàng sử dụng để detect ảnh chỉ bằng một request đơn giản. Bạn không cần phải biết Machine Learning cũng có thể nhanh chóng tạo được ứng dụng detect ảnh bằng cách sử dụng Cloud Vision API.

"Bạn cứ việc phát triển ứng dụng, detect image cứ để Cloud Vision API lo!!!"

1.1 Mục đích

Bài viết sẽ giúp bạn biết các sử dụng Cloud Vision API để nhận dạng ảnh với các chức năng: nhận dạng nội dung của bức ảnh, nhận dạng khuôn mặt người, nhận dạng công trình nổi tiếng, nhận dạng chữ viết,...
Mình sẽ hướng dẫn các bạn sử dụng theo 2 cách:

  • Cách 1: Sử dụng curl để tạo request tới Cloud Vision API trên terminal
  • Cách 2: Sử dụng Postman để tạo request tới Cloud Vision API
    Cuối bài viết mình sẽ demo một app Android sử dụng Cloud Vision API để nhận diện nội dung bức ảnh.

1.2 Công cụ cần thiết

  • Project Google Cloud Platform: Bạn cần có tài khoản Google Cloud đã được thêm thông tin thanh toán (thẻ VISA). Nếu bạn chưa có thì có thể tham gia Qwiklabs để nhận tài khoản sử dụng trong 45 phút (https://qwiklabs.com/focuses/1841?parent=catalog)
  • Trình duyệt Chrome hoặc Firefox

2 Cài đặt chung

Đầu tiên, bạn mở project của bạn. Nếu bạn chưa có thì hay tạo một project mới nhé.
Giao diện project sẽ như sau:

2.1 Terminal

Để mở terminal, bạn nhấn vào biểu tượng dưới đây trên thanh navigation:

Sau đó bạn chọn START CLOUD SHELL để mở terminal và vui lòng đợi một chút để trình duyệt của bạn kết nối với server của Google.

Mình sẽ giới thiệu qua một chút về terminal này. Terminal này thực chất giống như terminal (CMD, Windows Power Shell) trên máy bạn. Trên đó đã được Google cài đặt sẵn các môi trường để bạn sử dụng. Bạn có thể sử dụng tất cả các lệnh trên ubuntu như trên máy thật của bạn.

Bạn cũng có thể sử dụng trực tiếp Terminal thật trên máy của bạn để thực hành. Nhưng bạn cần phải cài 1 số công cụ cho nó nếu chưa có như curl, trình chỉnh sửa văn bản (nano, vim,...)

2.2 API Key

Để sử dụng bất kỳ dịch vụ nào của Google, bạn cũng đều cần phải có API Key.
Để tạo API Key, bạn vào menu chọn APIs & Services rồi chọn Credentials như hình dưới đây:

Sau đó bạn click Create credentials:

Trong menu xổ xuống, bạn chọn API key:

Một hộp thoại hiện ra, bạn chọn RESTRICT KEY để lưu lại.
Tiếp theo bạn cần tạo biến môi trường API_KEY để sau này bạn gọi đến Cloud API thì chỉ cần gọi biến đó ra thôi không cần vào copy đoạn key dài dài này nữa.
Để tạo biến môi trường API_KEY, trên terminal, bạn gõ: export API_KEY=xxx
(Trong đó xxx là key mà bạn vừa tạo)
Bạn có thể check xem biến đó đã được tạo đúng chưa bằng lệnh sau: echo $API_KEY
Như vậy đã xong, chúng ta chuyển sang bước tiếp theo.

2.3 Tạo file request.json

File request.json này sẽ là body của request tới Cloud API ở bước tiếp theo.
Để tạo file này, trên terminal các bạn gõ touch request.json
Để chỉnh sửa các bạn có thể dùng lệnh: nano request.json
File này sẽ có dạng json như sau:

Mình sẽ giải thích một số trường trong file này:

  • requests: là một mảng. Như vậy Cloud API cho phép bạn cùng lúc detect nhiều ảnh trong 1 request.
  • image: là ảnh của bạn. Bạn có thể sử dụng 3 cách:
  • Cách 1: Dùng ảnh base64:
    Bạn có thể vào các trang giúp mã hóa ảnh của bạn dưới dạng base64, sau đó bạn copy đoạn text kết quả đó vào phần value của content như hình sau:

    Nếu đoạn text mà có data:image/jpeg;base64, ở đầu thì bạn nhớ bỏ đi nhé!
  • Cách 2: Dùng Google Cloud Storage:
    Phần này khá phức tạp nên bạn có thể tham khảo tại link sau: https://cloud.google.com/vision/docs
  • Cách 3: Dùng trực tiếp đường link ảnh
  • features: là một mảng các thuộc tính. Ví dụ type là kiểu detect, maxResults là số kết quả tối đa trả về,…
  • type là kiểu mà bạn muốn Google detect. Hiện tại, Google hỗ trợ các kiểu sau:
  • TEXT_DETECTION: nhận dạng text, có hỗ trợ dịch sang ngôn ngữ khác
  • DOCUMENT_TEXT_DETECTION: nhận dạng đoạn text
  • LABEL_DETECTION: nhận dạng nội dung của bức ảnh
  • CROP_HINTS: crop bức ảnh tập trung vào vật trọng tâm hay khuôn mặt
  • FACE_DETECTION: nhận dạng khuôn mặt
  • IMAGE_PROPERTIES: các thuộc tính của bức ảnh như RGB, pixcel,...
  • LANDMARK_DETECTION: nhận dạng công trình nổi tiếng
  • LOGO_DETECTION: nhận dạng logo, sản phẩm nổi tiếng
  • SAFE_SEARCH_DETECTION: nhận dạng xem bức ảnh có nội dung an toàn hay không
  • WEB_DETECTION: phần này giống như search google bằng hình ảnh
    Chi tiết về các trường, các kiểu detect và cách sử dụng các bạn có thể đọc trong tài liệu Cloud VisionAPI: https://cloud.google.com/vision/docs

2.4 Tạo request tới Cloud API bằng curl

Đến phần thú vị nhất của Cloud API rồi.
Sau khi đã tạo xong file request.json, trên cửa sổ terminal, bạn thực hiện lệnh:
curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}
Ví dụ mình sẽ thử detect ảnh sau xem nội dung nhận được là gì nhé!

Nội dung file request.json của mình sẽ là:

{
  "requests":[
    {
      "image":{
        "source":{
          "imageUri":
            "https://znews-photo-td.zadn.vn/w1024/Uploaded/ohunuai/2018_07_19/NGUYEN_BA_NGOC1166_Zing.jpg"
        }
      },
      "features":[
        {
          "type":"LABEL_DETECTION",
          "maxResults":10
        }
      ]
    }
  ]
}

Và kết quả trả về:

{
  "responses": [
    {
      "labelAnnotations": [
        {
          "mid": "/m/088fh",
          "description": "yellow",
          "score": 0.951962,
          "topicality": 0.951962
        },
        {
          "mid": "/m/06z04",
          "description": "skin",
          "score": 0.9510442,
          "topicality": 0.9510442
        },
        {
          "mid": "/m/01k74n",
          "description": "facial expression",
          "score": 0.9331107,
          "topicality": 0.9331107
        },
        {
          "mid": "/m/01f43",
          "description": "beauty",
          "score": 0.91344154,
          "topicality": 0.91344154
        },
        {
          "mid": "/m/05r655",
          "description": "girl",
          "score": 0.8986084,
          "topicality": 0.8986084
        },
        {
          "mid": "/m/02pkb8",
          "description": "lady",
          "score": 0.8730116,
          "topicality": 0.8730116
        },
        {
          "mid": "/m/019nj4",
          "description": "smile",
          "score": 0.84830636,
          "topicality": 0.84830636
        },
        {
          "mid": "/m/06pg22",
          "description": "snapshot",
          "score": 0.8176745,
          "topicality": 0.8176745
        },
        {
          "mid": "/m/015c4z",
          "description": "sitting",
          "score": 0.81240934,
          "topicality": 0.81240934
        },
        {
          "mid": "/m/05wkw",
          "description": "photography",
          "score": 0.7999211,
          "topicality": 0.7999211
        }
      ]
    }
  ]
}

Danh sách kết quả trả về được sắp xếp theo score giảm dần. Mình thấy Google nhận dạng khá chính xác.

2.5 Tạo request tới Cloud API bằng Postman

Tiếp theo mình sẽ hướng dẫn các bạn sử dụng Postman để tạo request detect ảnh.
Cloud Vision API là một REST API với method là POST. Body chính là nội dung của file request.json ở trên.

(Trên URL các bạn thay xxx bằng API Key tạo ở trên nhé)
Sau đó bạn nhấn nút Send và kết quả bạn nhận được:

Google Cloud Vision API là một API nên bạn hoàn toàn có thể sử dụng để detect ảnh ở trong app của mình. Ở phần tiếp theo mình sẽ demo một app android sử dụng Google Cloud Vision API để nhận dạng các vật thể trên camera một cách real-time.

3 App demo


Trong app này, cứ 5 giây mình lại chụp ảnh rồi encode ảnh đó sang base64 rồi dùng Google Vision API với request ảnh ở dạng base64 để lấy về kết quả.
Source code: https://github.com/quanghd96/GoogleCloudVision

4 Tổng kết

Vậy là mình đã hướng dẫn xong các bạn cách sử dụng Google Cloud Vision API để detect ảnh. Hy vọng sẽ giúp ích cho các bạn phần nào trong việc học tập, phát triển sản phẩm,… Cảm ơn các bạn đã theo dõi bài viết của mình!
Tài liệu tham khảo: