บทเรียนนี้เรามาเขียนโปรแกรม Python ร่วมกับระบบ TLPR บริการระบบรู้จำป้ายทะเบียนรถยนต์สามารถตรวจหาอักษรภาษาไทยและตัวเลขอารบิกบนป้ายทะเบียนรถ ของ AI for Thai กัน
ภายใต้แนวคิด “AI สัญชาติไทย” เพื่อตอบโจทย์ความต้องการใช้งานในประเทศไทย ร่วมกับ Nectec ก็มีเอาแพลตฟอร์มมาเล่นบ้างช่วยปรับบ้างตามภาษา พอดีช่วงนี้ก็วิ่งเข้าไปช่วยงาน NECTEC อยู่เยอะพอประมาณ ก็เลยขอรีวิวทำ Tutorial ของเจ้า Services ของเค้าหน่อยอย่าง AI for Thai อีกตัวคือ Thai License Plate Recognition: T-LPR
ภาพที่เราจะใช้ก็คงเป็นภาพนี้ละกันขอป้ายทะเบียนรถแบบไทยๆ ขออภัยเจ้าของรถด้วยนะครับที่ยืมภาพระหว่างรถติดมาใช้
และอีกรูปคือ:
บทเรียนก่อนหน้าที่ควรศึกษา:
บทเรียนก่อนหน้านี้:
- การประมวลผลรู้จำใบหน้า Face Recognition ด้วย Python
- Face Recognition เปรียบเทียบข้อมูลใบหน้าแบบ Real-Time ด้วย Python และ OpenCV
- Python กับ OpenCV ดึงฐานข้อมูล Face Recognition ผ่านระบบ Firebase
- Review: บริการ AI for Thai มาทดสอบระบบการระบุตำแหน่งบุคคลในภาพ (Person Detection) ด้วย Python กัน
ตอนแรกจะใช้ Code Python ของ Ai for Thai ที่อยู่ในเว็บของเค้าเอง แต่ผมขอเล่นใหญ่ ใช้ matplotlib และ numpy มาช่วยในการเขียนภาพหน่อยละกัน ดังนั้นให้เราสร้างไฟล์ Python ขึ้นมาก่อนประกาศตัวแปร Header Library ดังนี้:
import numpy as np import json import matplotlib.pyplot as plot import matplotlib.patches as patches import requests
ไปเรียก API Keys และ URL ของ API จากเว็บ https://aiforthai.in.th/aiplatform/#/lpr มาใช้งานร่วมดังนี้:
url = "https://api.aiforthai.in.th/lpr-v2" payload = {'crop': '1', 'rotate': '1'} files = {'image':open('images/20200417_121020.jpg', 'rb')} headers = { 'Apikey': "<<ใส่ API Key เอานะ>>", }
ไฟล์ภาพของผมชื่อ “20200417_121020.jpg” อันที่จริงถ้า code ของ Nectec มันจะจบตรง Return ค่าเป็น JSON กลับมาให้เราเรียกใช้ ผมเลยเขียนโปรแกรม ดึงค่า JSON และเขียนข้อมูลทับในภาพเดิม โดยการใช้คำสั่งนี้:
from PIL import Image images = np.array(Image.open('images/20200417_121020.jpg'), dtype=np.uint8) response = requests.post( url, files=files, headers=headers) print(response.json())
ได้เวลาดึงค่ามา Plot บน matplotlib และ numpy กัน
data = response.json() for item in data: _object = (item['lpr']) xLeftTop = int(item['bbox']['xLeftTop']) yleftTop = int(item['bbox']['yLeftTop']) xRightBottom = int(item['bbox']['xRightBottom'])/3 yRightBottom = int(item['bbox']['yRightBottom'])/3 figure, get_axis = plot.subplots(1) get_axis.imshow(images) rect = patches.Rectangle((xLeftTop,yleftTop),xRightBottom,yRightBottom,linewidth=5,edgecolor='#7FFF00',facecolor='none') get_axis.add_patch(rect) plot.text(xLeftTop, yleftTop-50,_object,fontname='Tahoma',fontsize='20',color='#7FFF00') plot.show()
เอา Plot มารับค่า ตำแหน่งที่ต้อง Crop แล้วเขียนคำสั่งปรับระยะแบบบ้านๆ ใส่สี ใส่ Text เรียก Tahoma มาใส่ดังนั้น Code Python ทั้งหมดเป็นแบบนี้:
import numpy as np import json import matplotlib.pyplot as plot import matplotlib.patches as patches import requests url = "https://api.aiforthai.in.th/lpr-v2" payload = {'crop': '1', 'rotate': '1'} files = {'image':open('images/20200417_121020.jpg', 'rb')} headers = { 'Apikey': "<<ใส่ API KEY>>", } from PIL import Image images = np.array(Image.open('images/20200417_121020.jpg'), dtype=np.uint8) response = requests.post( url, files=files, headers=headers) print(response.json()) data = response.json() for item in data: _object = (item['lpr']) xLeftTop = int(item['bbox']['xLeftTop']) yleftTop = int(item['bbox']['yLeftTop']) xRightBottom = int(item['bbox']['xRightBottom'])/3 yRightBottom = int(item['bbox']['yRightBottom'])/3 figure, get_axis = plot.subplots(1) get_axis.imshow(images) rect = patches.Rectangle((xLeftTop,yleftTop),xRightBottom,yRightBottom,linewidth=5,edgecolor='#7FFF00',facecolor='none') get_axis.add_patch(rect) plot.text(xLeftTop, yleftTop-50,_object,fontname='Tahoma',fontsize='20',color='#7FFF00') plot.show()
ทดสอบรันโปรแกรมดูหน่อย
จับได้โอเคอยู่นะครับ ถามว่ามีอะไรที่ไม่แม่นไหมก็มีนะครับ อาจจะเป็นเรื่องของการเทรนโมเดลนั่นแหละอย่างภาพนี้เลย:
เลข 8 ตัวหลังมันจับไม่ติดเพราะอะไรก็ไม่รู้เหมือนกัน นี่ก็เป็นการรีวิวน่าสนใจอีกตัวนะครับ บริการจาก Ai For Thai ของ Nectec