เขียน Python สร้าง API ง่าย ๆ ด้วย FastAPI ให้บริการ Face Recognition ทดลองด้วยภาพสาว ๆ Blackpink 😆
บทความนี้จะมาแนะนำการเขียน Python โดยใช้ FastAPI เพื่อให้บริการรู้จำใบหน้า (Face Recognition) กันนะครับ หรืออาจจะเรียกแบบคูล ๆ ได้ว่าเป็น Machine Learning as a Service (MLaas) เพียงแค่มีอินเทอร์เน็ตก็สามารถที่จะส่งรูปผ่าน URL ที่กำหนดเพื่อให้ได้ผลตอบกลับว่าในรูปที่ส่งมามีใบหน้าของใครอยู่บ้าง (แต่ได้เฉพาะที่มีใบหน้าและชื่อที่ลงทะเบียนไว้อยู่ก่อนหน้านั้นนะครับ 😅)
สามารถดู clip และทำตามได้เช่นเดียวกันนะครับ เนื้อหาจะเหมือนในบทความนี้ครับ
Code ทั้งหมดที่ใช้ในบทความนี้สามารถดาวน์โหลดได้จาก GitHub ของผมเลยครับ
ขอขอบคุณบทความของ Thannob ที่แนะนำเรื่อง FastAPI ด้วยนะครับ ใครอยากรู้วิธีการใช้งานเบื้องต้น ไปอ่านได้เลยนะครับ
Software Installation
สำหรับมือใหม่เลยนะครับ เริ่มต้นให้ติดตั้ง software ที่จำเป็นก่อนดังนี้ครับ
- Miniconda เครื่องมือในการจัดการ package ต่าง ๆ ของ Python โดยจะเหมาะสำหรับงานที่เกี่ยวกับวิทยาการข้อมูล (Data Scientist) ดาวน์โหลดและติดตั้งได้จาก https://docs.conda.io/en/latest/miniconda.html
*ระหว่างติดตั้ง Miniconda อย่าลืมเลือก Add Miniconda to my PATH enviornment vairable ด้วยนะครับ ตามรูปด้านล่าง จะได้เรียกคำสั่ง conda ผ่าน command prompt ได้
- สำหรับ Windows นะครับ ให้ติดตั้ง Desktop development with C++ ที่มีให้เลือกจากตัวติดตั้งของ Visual Studio นะครับ จาก https://visualstudio.microsoft.com/ นะครับ ดูตามรูปได้เลยครับ
- Visual Studio Code เครื่องมือสำหรับเขียน Python ครับ ใช้งานค่อนข้างง่าย และมีตัว plugin เสริมมากมาย ผู้เขียนแนะนำเลยครับ ดาวน์โหลดและติดตั้งได้จาก https://code.visualstudio.com/
สร้างสภาพแวดล้อมสำหรับ Python
เราสามารถใช้ conda ในการสร้างสภาพแวดล้อมสำหรับ Python ได้โดยใช้คำสั่งด้านล่างนะครับ โดยติดตั้ง package เพิ่มเติมๆหลัก ๆ คือ
- face_recognition แบบจำลองการเรียนรู้ของเครื่อง (Machine Learning Model) สำหรับใช้ในการทำ Face Recognition สามารถอ่านรายละเอียดเพิ่มเติมได้ที่ https://github.com/ageitgey/face_recognition
- fastapi สำหรับใช้ในการทำ API (https://fastapi.tiangolo.com/)
- uvicorn สำหรับใช้ทำ Web Server Gateway Interface (WSGI) ใช้ในการรัน fastapi ครับ ดูข้อมูลเพิ่มเติมได้ที่ https://www.uvicorn.org/
- pillow สำหรับใช้ในการประมวลผลภาพ https://pillow.readthedocs.io/
$ conda create -n face-api-venv
$ conda activate face-api-venv
$ conda install -c conda-forge face_recognition fastapi uvicorn python-multipart pillow
ลงทะเบียนชื่อและใบหน้าด้วย face_recognition
Code Python ด้านล่างใช้สำหรับการลงทะเบียนชื่อและภาพใบหน้าด้วย face_recognition โดยบรรทัดที่ 8–11 เป็นเชื่อและภาพที่ลงทะเบียนนะครับ โดยภาพตัวอย่างสามารถดาวน์โหลดได้จาก GitHub ของผมเลยครับ https://github.com/KarnYong/face-recognition-fastapi-docker
จากนั้นทำการ run code ด้านบน ได้ผลลัพธ์เป็นไฟล์ faces.p ที่จะเป็นข้อมูลชื่อและใบหน้าที่ลงทะเบียนไว้ สำหรับใช้ในการทำ Face Recognition ต่อไป
$ python face-model.py
ทดสอบการทำ Face Recognition จากข้อมูลที่ลงทะเบียน
Code Python ด้านล่างใช้สำหรับการนำรูปที่อ่านขึ้นมา (บรรทัดที่ 10) มาเปรียบเทียบกับใบหน้าที่ลงทะเบียนไว้ในไฟล์ faces.p และทำการเปรียบเทียบว่าในรูปที่อ่านขึ้นมามีใบหน้าที่ตรงกับข้อมูลที่ลงทะเบียนไว้หรือไม่ และทำการแสดงผลลัพธ์ออกมาเป็นทั้งข้อความและรูปภาพ
$ python face-test.py
['Jisoo', 'Jennie', 'Rose', 'Lisa']
สามารถลองทดสอบกับภาพอื่น ๆ ใน folder test ได้เลย มีทั้งภาพเดี่ยวและภาพหมู่ ผลลัพธ์ถูกต้องพอสมควร 😁
สร้าง API ด้วย FastAPI สำหรับทำ Face Recognition จากข้อมูลใบหน้าที่ลงทะเบียนไว้
Code Python ด้านล่างเป็นการสร้าง API ด้วย FastAPI สำหรับทำ Face Recognition จากข้อมูลใบหน้าที่ลงทะเบียนไว้ที่ไฟล์ faces.p
ใช้ request ในรูป POST สำหรับ path ของ URL /faces_recognition/ (บรรทัดที่ 19) โดยรับข้อมูลเป็นการอัพโหลดไฟล์ภาพ image_upload(บรรทัดที่ 20)
ทำการสั่ง start API ด้วยการใช้คำสั่ง uvicorn ด้านล่าง โดยกำหนด port เป็น 5000
$ conda activate face-api-venv
$ uvicorn face-api:app --port 5000 --reload
สามารถใช้ Terminal ใน Visual Studio Code ในการเรียกคำสั่งด้านบนได้ดังภาพ โดยผลลัพธ์ที่สำเร็จจะแสดงเป็น URL สำหรับเข้าเรียกใช้ API
สิ่งหนึ่งที่ FastAPI อำนวยความสะดวกให้ก็คือการทดสอบ API ผ่านหน้าเว็บ
เปิด Web Browser ใส่ URL http://127.0.0.1:5000/docs เพื่อทดลองใช้ API โดยกดปุ่ม POST ของ API URL /faces_recognition/
กดปุ่ม Try it out
ที่ image_upload ซึ่งเป็น parameter ที่กำหนดไว้ใน API เพื่อ upload file ให้กดปุ่ม Choose File
เลือกรูปของสาว Blackpink 😄 ที่ต้องการจากนั้นกดปุ่ม Execute
ผลลัพธ์ที่ได้จะเป็นชื่อที่เกิดจากการทำ Face Recognition ด้วยข้อมูลชื่อและรูปของสาว ๆ Blackpink ที่ลงทะเบียนไว้
หรือจะทดลองผ่าน POSTMAN ก็ได้ โดยใช้เป็น POST http://127.0.0.1:5000/faces_recognition โดยใน BODY ให้มี key เป็น image_upload และ browse เลือกรูปภาพที่อยู่ในเครื่อง ดังภาพด้านล่าง
จบแล้วครับ อาจจะไม่ได้อธิบายละเอียดมากนัก ถ้าใครถ้าใครติดปัญหาอะไรสามารถทักมาส่วนตัวได้นะครับ บทความหน้าจะมาพูดถึงการใช้ Docker ร่วมกับ FastAPI นะครับ ขอบคุณที่อ่านจนจบครับ 😃
ขอบคุณภาพสวย ๆ จาก Blackpink Official Facebook
บทความโดย อ.ดร.กานต์ ยงศิริวิทย์
วิทยาลัยนวัตกรรมดิจิทัลเทคโนโลยี มหาวิทยาลัยรังสิต