
บทความนี้จะนำเสนอขั้นตอนการพัฒนาแอปพลิเคชันขนาดเล็กด้วยภาษา Python บน Google Colaboratory (Colab) เพื่อเรียกใช้บริการ License Plate Recognition (LPR) ของ AI for Thai ซึ่งเป็นแพลตฟอร์มปัญญาประดิษฐ์จากศูนย์เทคโนโลยีอิเล็กทรอนิกส์และคอมพิวเตอร์แห่งชาติ (NECTEC) แอปพลิเคชันนี้จะช่วยให้ผู้ใช้สามารถอัปโหลดภาพป้ายทะเบียนรถยนต์ และแสดงผลข้อความที่อ่านได้จากภาพนั้น
การทำงานเบื้องต้น: สมัครเอา API Key ของ https://aiforthai.in.th/

แอปพลิเคชันนี้ทำงานโดยมีขั้นตอนหลักดังนี้:
- การอัปโหลดภาพ: ผู้ใช้จะสามารถอัปโหลดไฟล์ภาพที่มีป้ายทะเบียนรถยนต์ผ่านอินเทอร์เฟซของ Colab
- การเรียกใช้ API ของ AI for Thai: เมื่ออัปโหลดภาพแล้ว โค้ด Python จะส่งภาพดังกล่าวไปยัง API บริการ LPR ของ AI for Thai พร้อมกับ API Key ที่ผู้ใช้ต้องระบุ
- การประมวลผลภาพ: ฝั่งเซิร์ฟเวอร์ของ AI for Thai จะทำการประมวลผลภาพเพื่อตรวจจับและอ่านข้อความบนป้ายทะเบียน
- การแสดงผลลัพธ์: ผลลัพธ์ที่ได้จาก API ซึ่งอยู่ในรูปแบบ JSON จะถูกนำมาประมวลผลและแสดงผลเป็นข้อความป้ายทะเบียนรถยนต์ใน Colab
เปิด Google Colab ขึ้นมาก่อน

นำเข้าไลบรารี requests ซึ่งเป็นไลบรารีมาตรฐานของ Python สำหรับการส่งคำขอ HTTP ไปยังเซิร์ฟเวอร์ API นำเข้าไลบรารี json เพื่อใช้ในการจัดการข้อมูลในรูปแบบ JSON ที่ API ของ AI for Thai ส่งกลับมา from google.colab และ นำเข้าโมดูล files จากไลบรารี google.colab ซึ่งมีฟังก์ชันสำหรับการจัดการไฟล์ในสภาพแวดล้อม Colab เช่น การอัปโหลดไฟล์
import requests
import json
from google.colab import files
ฟังก์ชัน files.upload() จะแสดงปุ่มสำหรับอัปโหลดไฟล์ในเซลล์โค้ดของ Colab เมื่อผู้ใช้อัปโหลดไฟล์แล้ว ข้อมูลของไฟล์จะถูกเก็บไว้ในตัวแปร uploaded ซึ่งเป็น dictionary โดยมีชื่อไฟล์เป็น key และเนื้อหาของไฟล์เป็น value if not uploaded:: ตรวจสอบว่าไม่มีไฟล์ถูกอัปโหลด หากเป็นจริง จะแสดงข้อความ “No file uploaded.” else:: หากมีการอัปโหลดไฟล์
ฟังก์ชัน image_path = list(uploaded.keys())[0]: ดึงชื่อไฟล์ที่ถูกอัปโหลดออกมาจาก keys ของ dictionary uploaded (สมมติว่ามีการอัปโหลดเพียงไฟล์เดียว) และเก็บไว้ในตัวแปร image_path
แสดงชื่อไฟล์ที่ถูกอัปโหลด ด้วย print(f"Uploaded file: {image_path}"):
# Upload the image file
uploaded = files.upload()
if not uploaded:
print("No file uploaded.")
else:
image_path = list(uploaded.keys())[0]
print(f"Uploaded file: {image_path}")
หนด URL ของ API บริการ LPR ของ AI for Thai
url = “https://api.aiforthai.in.th/lpr-v2”
กำหนด payload หรือข้อมูลที่จะส่งไปพร้อมกับคำขอ API ในที่นี้ crop และ rotate เป็นพารามิเตอร์ที่ระบุให้ API ทำการครอปและหมุนภาพ (หากจำเป็น) ก่อนการประมวลผล
payload = {'crop': '1', 'rotate': '1'}
กำหนด headers สำหรับคำขอ HTTP ซึ่งรวมถึง Apikey ที่จำเป็นสำหรับการยืนยันตัวตนในการใช้งาน API ของ AI for Thai ผู้ใช้ต้องแทนที่ “YOUR_AIFORTHAI_API_KEY” ด้วย API Key ที่ได้รับจากแพลตฟอร์ม AI for Thai
url = "https://api.aiforthai.in.th/lpr-v2"
payload = {'crop': '1', 'rotate': '1'}
headers = {
'Apikey': "YOUR_AIFORTHAI_API_KEY", # Replace with your actual API key
}
เขียน Code อีกรอบ
try:
with open(image_path, 'rb') as img_file:
files = {'image': img_file}
response = requests.post(url, files=files, data=payload, headers=headers)
response.raise_for_status() # Raise an exception for bad status codes
print("\nRaw Response:")
print(response.text)
json_response = response.json()
if isinstance(json_response, list) and len(json_response) > 0 and 'lpr' in json_response[0]:
license_plate = json_response[0]['lpr']
print("\nExtracted License Plate:")
print(license_plate)
else:
print("\nError: Could not find 'lpr' in the JSON response.")
except requests.exceptions.RequestException as e:
print(f"Request Error: {e}")
except json.JSONDecodeError as e:
print(f"Error decoding JSON: {e}")
except FileNotFoundError:
print(f"Error: File not found at {image_path}")
บล็อก try...except... ถูกใช้เพื่อจัดการข้อผิดพลาดที่อาจเกิดขึ้นระหว่างการเรียกใช้ API โดยภายในบล็อก try จะมีการเปิดไฟล์ภาพที่อัปโหลดในโหมดอ่านไบนารี ('rb')
ผ่านคำสั่ง
with open(image_path, 'rb') as img_file:
ซึ่งจะกำหนดตัวแปร img_file สำหรับอ้างอิงไฟล์ และการใช้ with ช่วยให้มั่นใจว่าไฟล์จะถูกปิดโดยอัตโนมัติเมื่อสิ้นสุดบล็อก จากนั้นจะสร้าง dictionary files เพื่อส่งไฟล์ภาพในคำขอ POST โดยมี 'image' เป็น key และอ็อบเจกต์ไฟล์เป็น value คำขอ POST จะถูกส่งไปยัง URL ของ API (url) พร้อมกับไฟล์ภาพ (files), payload (data=payload), และ headers (headers)
ข้อมูลการตอบกลับจาก API จะถูกเก็บไว้ในตัวแปร response คำสั่ง response.raise_for_status() จะตรวจสอบสถานะ HTTP ของการตอบกลับ หากมีข้อผิดพลาด (เช่น รหัสสถานะ 4xx หรือ 5xx) จะเกิด exception ขึ้น ต่อมาจะมีการแสดงผลการตอบกลับดิบจาก API ในรูปแบบข้อความผ่าน print("\nRaw Response:") และ print(response.text)
จากนั้นเนื้อหาการตอบกลับจะถูกแปลงจากรูปแบบ JSON เป็นโครงสร้างข้อมูล Python (ส่วนใหญ่เป็น list หรือ dictionary) ด้วยคำสั่ง
json_response = response.json() เงื่อนไข if isinstance(json_response, list) and len(json_response) > 0 and 'lpr' in json_response[0]:
จะตรวจสอบว่า json_response เป็น list ที่ไม่ว่าง และมี key ชื่อ 'lpr' อยู่ใน dictionary แรกของ list (ซึ่งเป็นรูปแบบการตอบกลับปกติของ API LPR) หากเงื่อนไขเป็นจริง จะดึงค่าของ key 'lpr' ซึ่งเป็นข้อความป้ายทะเบียนรถยนต์ที่อ่านได้ด้วย license_plate = json_response[0]['lpr'] และแสดงผลข้อความระบุว่าเป็นป้ายทะเบียนที่อ่านได้ (print("\nExtracted License Plate:") และ print(license_plate))
หากโครงสร้าง JSON ไม่เป็นไปตามที่คาดไว้ จะแสดงข้อความระบุว่าไม่พบข้อมูลป้ายทะเบียน (else: print("\nError: Could not find 'lpr' in the JSON response.")) บล็อก except ต่างๆ จะดักจับข้อผิดพลาดที่อาจเกิดขึ้น: except requests.exceptions.RequestException as e: ดักจับข้อผิดพลาดที่เกี่ยวข้องกับการส่งคำขอ HTTP (เช่น ปัญหาเครือข่าย) และแสดงข้อความผิดพลาด, except json.JSONDecodeError as e: ดักจับข้อผิดพลาดที่เกิดขึ้นระหว่างการพยายามแปลงการตอบกลับเป็น JSON (เช่น การตอบกลับไม่ได้อยู่ในรูปแบบ JSON ที่ถูกต้อง) และแสดงข้อความผิดพลาด, และ except FileNotFoundError: ดักจับข้อผิดพลาดกรณีที่ไม่พบไฟล์ภาพที่ระบุ และแสดงข้อความผิดพลาด
การทำงานเมื่อ Run Cell

จะมีช่องให้ upload ภาพขึ้นไป

สังเกตว่ามันจะ Return ป้ายทะเบียนรถมาแล้ว (ขออนุญาต)
ภาพรวมไฟล์คือ https://colab.research.google.com/drive/1C73HU1SH3–4vgRQQty2aj68dWUTPeUd?usp=sharing



