การเรียกใช้ Google Vision (OCR) โดยไม่ต้องพึ่ง Composer สำหรับ PHP

Google Vision คือ ระบบที่สามารถประมวลผลรูปภาพหรือเอกสาร PDF ได้ เช่น การแตกตัวอักษรออกมาจากภาพ Optical character recognition (OCR), การตรวจจับวัตถุ, และอื่นๆ. ในบทความนี้จะเป็นตัวอย่างสำหรับ OCR เท่านั้น แต่ผู้อ่านสามารถทำความเข้าใจ, เปิดเอกสารอ้างอิงของ Google Vision แล้วทำการปรับเปลี่ยนโค้ดได้ไม่ยากนัก.

ในเอกสารอ้างอิงไลบรารี่ของ Google Vision ในส่วนที่เกี่ยวกับภาษา PHP นั้น ทาง Google จะแนะนำให้ติดตั้งแพ็คเกจของ Composer ที่ชื่อ google/apiclient. แพ็คเกจดังกล่าวเมื่อติดตั้งแล้วเสร็จ จะมีขนาดมหึมาอย่างมาก มีจำนวนไฟล์มากกว่า 20000 ไฟล์และขนาดมากกว่า 25 เมกะไบต์ ทำให้การอัปโหลดเป็นไปอย่างล่าช้า ถึงแม้การใช้ zip แล้วอัปโหลดแล้วสั่งแตกไฟล์จะเร็วกว่าก็ตาม แต่ก็ยังกินพื้นที่มากมายนัก.

(สำหรับ JavaScript นั้น สามารถคลิกอ่านได้ที่นี่.)

ความจริงแล้วถ้าหากเปิดดูเอกสารของ Google Vision ในรูปแบบ REST นั้น จะพบว่าการเรียกใช้มันไม่ได้ยุ่งยากซับซ้อนมากมายนัก เพียงแต่เราจะต้องเลือกวิธีที่จะใช้ และเรียกใช้ปลายทางให้ถูกต้อง รวมทั้งกำหนดค่า request body ให้ถูกเท่านั้น.

API key

ในบทความนี้จะแนะนำให้ใช้การตรวจสอบในรูปแบบ API key แทนแบบ Application Default Credentials (ADC) ตามที่ Google แนะนำ เนื่องจากวิธีนี้จะรองรับการใช้งานบน Shared hosting ในขณะที่ ADC จะไม่สามารถใช้ได้. ดังนั้นในขั้นตอนตั้งค่าหรือรับ API key ขอให้อ้างอิงจากเอกสารการตั้งค่า API key ของ Google.

เตรียมพร้อมไฟล์

จากนี้จะเป็นการสร้างโค้ดตัวอย่างขึ้นมาทดลองการทำงาน ดังนั้นผู้อ่านจะต้องเตรียมไฟล์ต่างๆต่อไปนี้ให้พร้อม.

  1. ไฟล์รูป แนะนำให้ใช้ jpg สำหรับการทดลองนี้ ให้ตั้งชื่อที่ง่ายๆ เช่น image.jpg และทุกไฟล์ในข้อด้านล่างนี้จะอยู่ในระดับเดียวกันกับไฟล์รูปนี้.
  2. ไฟล์ config.php โดยข้างในให้กำหนดโค้ดต่อไปนี้
    if (!defined('API_KEY')) {
        define('API_KEY', 'API Key ที่คุณได้มาจากขั้นตอนด้านบน');
    }
  3. ไฟล์ test.php สำหรับทดสอบเรียกใช้.

ทำความเข้าใจ REST API

ก่อนที่จะไปขั้นตอนถัดไปนั้น ขอให้ทำความเข้าใจจากเอกสารของ Google Vision ในรูปแบบ RESTเสียก่อน. ตัวอย่างนี้เราจะแตกตัวอักษรออกมาจากภาพ และตัวอักษรในภาพไม่แน่นหนามาก ดังนั้นเราจะใช้เมธอด images.annotate. ให้คลิกอ่านที่ v1 (ซึ่งคือรุ่นล่าสุด ณ ตอนเขียนบทความนี้) > images > annotate. จะพบว่า HTTP request หรือ URL และเมธอดที่จะเรียกไปยังปลายทางนั้นจะเป็นเมธอด POST และ URL จะเป็น https://vision.googleapis.com/v1/images:annotate.

สำหรับความสามารถที่จะต้องกำหนดให้นั้น ให้คลิกอ่านเริ่มจาก requests[] > features[] > type. ประเภทสำหรับการแตกตัวอักษรจากภาพ แบบไม่แน่นหนามาก ทาง Google จะแนะนำให้ใช้ TEXT_DETECTION ส่วนกรณีที่มีตัวอักษรแน่นหนา เขาจะแนะนำให้ใช้ DOCUMENT_TEXT_DETECTION.

โค้ดตัวอย่างสำหรับไฟล์ test.php

$imageFile = 'image.jpg';

$ch = curl_init('https://vision.googleapis.com/v1/images:annotate');

// setup current URL as referrer.
$currentURL = (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) === 'on' ? 'https://' : 'http://');
$currentURL .= ($_SERVER['HTTP_HOST'] ?? 'localhost');
$currentURL .= ($_SERVER['REQUEST_URI'] ?? '');

// setup request headers.
$requestHeaders = [
    'Content-type: application/json; charset=utf-8',
    'X-goog-api-key: ' . API_KEY,
];

// setup request body. --------------
$fileContents = base64_encode(file_get_contents($imageFile));
$fileContents = preg_replace('/^data:.+;base64,/i', '', $fileContents);

$requestBody = new \stdClass();
$requests = new \stdClass();

$requests->image = new \stdClass();
$requests->image->content = $fileContents;

$features = new \stdClass();
$features->type = 'TEXT_DETECTION';
$requests->features = [$features];
$requests->imageContext = new \stdClass();
$requests->imageContext->languageHints = [];

$requestBody->requests = [
    $requests,
];
unset($features, $fileContents, $requests);
// end setup request body. ----------


// start cURL call REST endpoint. -----
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_REFERER, $currentURL);
curl_setopt($ch, CURLOPT_HTTPHEADER, $requestHeaders);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($requestBody));

$response = curl_exec($ch);
$curlErrorNo = curl_errno($ch);
$curlError = curl_error($ch);
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);

curl_close($ch);
unset($ch);
// end cURL call REST endpoint. ------


if ($curlErrorNo !== 0) {
    echo '<h1>Error!</h1>';
    echo $curlError;
    exit();
}

$headers = mb_substr($response, 0, $headerSize);
$body = mb_substr($response, $headerSize);
$body = json_decode($body);
unset($response, $headerSize);

echo '<h3>Headers</h3>';
echo '<pre>' . print_r($headers, true) . '</pre>';
echo '<h3>Body</h3>';
echo '<pre>' . print_r($body, true) . '</pre>';

จากโค้ดด้านบนนี้ เมื่อทดลองเรียกทำงานก็จะได้ผลลัพธ์คล้ายๆอย่างนี้ อาจแตกต่างกันตามแต่ตัวอักษรในแต่ละภาพ.

ภาพตัวอย่างผลลัพธ์ที่ได้จาก Google Vision API
ภาพตัวอย่างผลลัพธ์ที่ได้จาก Google Vision API

ผู้อ่านสามารถนำตัวแปร $body ไปใช้งานต่อไปได้เลย. สำหรับการเรียกใช้เมธอด images.annotate ทาง Google จะคืนค่ากลับมาเป็น BatchAnnotateImagesResponse ซึ่งคุณผู้อ่านสามารถคลิกอ่านเอกสารอ้างอิงได้จากลิ้งค์ และในค่าที่คืนกลับมาจะมี property ที่ชื่อ responses ซึ่งพร้อมจะใช้งานต่อไปได้จากตัวแปรดังนี้ $body->responses.

จากโค้ดทั้งหมด จะพบว่ามีจำนวนไม่มากอะไร แต่สามารถทำงานได้ครบตามความสามารถของมัน และรองรับการทำงานบน Shared hosting ทั่วไปอีกด้วย.

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

คุณอาจใช้แท็กHTMLและแอททริบิวต์เหล่านี้: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>