เรามาใช้ Services: AI for Thai ของ Nectec กันหน่อยทำงานร่วมกับ Python เพื่อตรวจหาตำแหน่งของบุคคลในภาพถ่ายด้วยระบบ Person Detection
หลายเดือนก่อนผมกับนักศึกษามีโอกาสไปช่วยงานโครงการแพลตฟอร์มบริการเทคโนโลยีปัญญาประดิษฐ์
ภายใต้แนวคิด “AI สัญชาติไทย” เพื่อตอบโจทย์ความต้องการใช้งานในประเทศไทย ร่วมกับ Nectec ก็มีเอาแพลตฟอร์มมาเล่นบ้างช่วยปรับบ้างตามภาษา พอดีช่วงนี้ก็วิ่งเข้าไปช่วยงาน NECTEC อยู่เยอะพอประมาณ ก็เลยขอรีวิวทำ Tutorial ของเจ้า Services ของเค้าหน่อยอย่าง AI for Thai ประเดิมคือระบบ Person Detection ที่ตรวจจับว่า Person หรือบุคคลที่ปรากฏในภาพถ่ายนั้นอยู่ตำแหน่งไหนของรูปภาพ
ก่อนจะใช้งานจำเป็นต้องลงทะเบียนผู้ใช้งานผ่านเว็บไซต์ https://aiforthai.in.th/index.php#home
เมื่อเข้าระบบเสร็จแล้วเราจะเห็นหน้า Dashboard ให้เราไปที่เมนู Developer
ส่วนที่เราจะใช้งานคือ Person & Activity นั่นเอง ไปดูที่: https://aiforthai.in.th/aiplatform/#/person
Document ของเค้าจะบอกเราชัดเจนอยู่แล้วว่าการใช้งานนั้นทำยังไง (หลักๆ ผมจะไปที่ Python ก่อน) ซึ่งเจ้า Person Detection นั้นคือ ระบบระบุตำแหน่งบุคคลในภาพ โดยอาจเป็นภาพของบุคคลเพียงคนเดียวหรือภาพของกลุ่มบุคคลก็ได้ ตัวอย่างก็ตามภาพข้างล่าง:
ระบบ Ai for Thai จะมี API Key ให้เรา Request Protocol เพื่อเรียกใช้งานซึ่งการ Response และ Request จะมี Policy ที่จำกัดอยู่ให้ศึกษาข้อมูลในเว็บไซต์ให้ดีก่อน
ส่วน Header / Parameter นั้นก็จะประกอบไปด้วย:
- src_img : ภาพที่จะใช้ค้นหาภาพบุคคลในรูปจะรองรับเฉพาะไฟล์สกุล Jpg, jpeg
- json_export : แสดงผลลัพธ์ในรูปแบบ JSON (true/false)
- img_export : URL สำหรับการดาวน์โหลดรูปภาพ (true/false)
งั้นเราลองเอาภาพตัวเองเช่นเดิมมาใช้ดู
ทำการสร้างไฟล์ humandetect_aiforthai.py ขึ้นมา หลังจากนั้นเอา Code ตัวอย่างขอเขามา run ดูเลย
import requests url = "https://api.aiforthai.in.th/person/human_detect/" files = {'src_img':open('banyapon.jpg', 'rb')} data = {'json_export':'true','img_export':'true'} headers = { 'Apikey': "n0Ju2NMISMrBk9F1jCaNAPuZXdxWfVOi" } response = requests.post(url, files=files, headers=headers, data=data) print(response.json())
ผลลัพธ์มันจะ Return มาดังนี้:
จะอยู่ในรูปแบบของ JSON Arrays ตามจำนวนคนที่พบในรูปภาพจะมีองค์ประกอบดังนี้
-
- json_data : ข้อมูลในรูปแบบ JSON (ถ้าเลือก)
- object: person (ชนิดของ object)
- x0: ตำแหน่งมุมซ้ายบนของกรอบสี่เหลี่ยมรอบตัวคน ในแนวแกน x
- y0: ตำแหน่งมุมซ้ายบนของกรอบสี่เหลี่ยมรอบตัวคน ในแนวแกน y
- x1: ตำแหน่งมุมขวาล่างของกรอบสี่เหลี่ยมรอบตัวคน ในแนวแกน x
- y1: ตำแหน่งมุมขวาล่างของกรอบสี่เหลี่ยมรอบตัวคน ในแนวแกน y
ทดสอบดูสิ
โอเคมัน Return เป็น JSON มาให้ตามที่บอก ดังนั้นเราเอา matplotlib และ numpy มาช่วยตีตารางดีกว่า:
ประกาศตัวแปรเพิ่มคือ:
import numpy as np import json import matplotlib.pyplot as plot import matplotlib.patches as patches
แทรกคำสั่งต่อไปนี้ในส่วนของการเรียก API จาก code ตัวอย่างของ NECTEC
from PIL import Image images = np.array(Image.open('banyapon.jpg'), dtype=np.uint8)
แก้ไขส่วนของ response ดึงค่ามา แสดง print ให้เป็นดังนี้:
response = requests.post(url, files=files, headers=headers, data=data) data = response.json() for item in data['json_data']: _object = (item['object']) left = (item['x0']) top = (item['y0']) right = (item['x1']) bottom = (item['y1']) figure, get_axis = plot.subplots(1) get_axis.imshow(images) rect = patches.Rectangle((left, top), right, bottom, linewidth=1,edgecolor='g', facecolor='none') get_axis.add_patch(rect) plot.show()
ตัวอย่างคือผมเอา JSON Parser ไปสนเอาค่าตัวแปรพิกัดของคนค่า x0,y0,x1,y1 มาเพื่อทำการวาดตารางด้วย matplotlib ในคำสั่ง:
figure, get_axis = plot.subplots(1) get_axis.imshow(images) rect = patches.Rectangle((left, top), right, bottom, linewidth=1,edgecolor='g', facecolor='none') get_axis.add_patch(rect) plot.show()
Code ไฟล์ Python ของเราจะเป็นดังนี้ครับ:
import requests import numpy as np import json import matplotlib.pyplot as plot import matplotlib.patches as patches from PIL import Image url = "https://api.aiforthai.in.th/person/human_detect/" images = np.array(Image.open('banyapon.jpg'), dtype=np.uint8) files = {'src_img': open('banyapon.jpg', 'rb')} data = {'json_export': 'true', 'img_export': 'true'} headers = { 'Apikey': "<<ไป Copy มาเองนะ>>" } response = requests.post(url, files=files, headers=headers, data=data) data = response.json() for item in data['json_data']: _object = (item['object']) left = (item['x0']) top = (item['y0']) right = (item['x1']) bottom = (item['y1']) figure, get_axis = plot.subplots(1) get_axis.imshow(images) rect = patches.Rectangle((left, top), right, bottom, linewidth=1,edgecolor='g', facecolor='none') get_axis.add_patch(rect) plot.show()
ทดสอบ Run ผ่าน Visual Studio Code ดูจะได้ผลลัพธ์ดังนี้:
ทดสอบจำนวนคนหลายๆ คนมันจะ วนลูป Detect ทีละคนนะ ขี้เกียจแก้ Code ดังนั้นก็ทดสอบกันดู
จะเห็นว่า Ai for Thai จะมีเรื่องเด่นอยู่คือ มันเร็ว แต่ส่วนของ Person Detection นั้นยังต้องหา อัลกอริทึมไปคำนวณประมวลผลให้เสถียรอีกนิด (ผิดเอง) แต่ถามว่าใช้ง่ายไหม ง่ายมากครับ แนะนำให้ลองไปใช้งานกันดู AI สำหรับคนไทย