Face Detection Connect To SQLite3

ผู้เขียนบทความ : นายวรวุฒิ ลิ้มสุวรรณสังข์ COE #12

1.ความเป็นมา

ระบบการรู้จำใบหน้า หรือ ระบบการจดจำใบหน้า (อังกฤษ: facial recognition system) คือระบบการตรวจหาใบหน้าของมนุษย์และปรับภาพใบหน้าโดยอัตโนมัติ กรอบจะปรากฏขึ้นบนใบหน้าที่ถูกตรวจจับ และโฟกัส สี และค่าการวัดแสงจะถูกปรับโดยอัตโนมัติ นอกจากนั้นเมื่อบันทึกด้วยคุณภาพแบบ HD เทคโนโลยีการบีบอัดจะจัดสรรความจุของข้อมูลให้ลดลง แต่ได้ข้อมูลที่เป็นประโยชน์มากขึ้นเพื่อปรับคุณภาพของภาพ ข้อมูลที่ได้จะถูกนำไปเปรียบเทียบกับข้อมูลตัวอย่างที่เก็บบันทึกไว้ อาจจะทั้งใบหน้า หรือเพียงบางส่วน ขึ้นกับชนิดของวิธีแยกเอกลักษณ์ใบหน้า ระบบการรู้จำใบหน้าเป็นส่วนหนึ่งของ เทคโนโลยีปัญญาประดิษฐ์ในส่วนเนื้อหาของเรื่อง การรับรู้ของเครื่อง (Machine perception)

2. วัตถุประสงค์

เพื่อศึกษาและนำไปพัฒนาต่อยอด เพราะ เนื่องจากในตอนนี้มีอุตสาหกรรมหลายๆ แห่งได้เริ่มมีการนำเทคโนโลยี Face Detection และระบบสแกนใบหน้า มาพัฒนานวัตกรรมใหม่ให้แก่ตนเอง อย่างบริษัทแห่งหนึ่งที่พัฒนาเทคโนโลยีให้สามารถคาดเดาอารมณ์ของมนุษย์ ว่าสีหน้าของเขาตอนนี้กำลังรู้สึกอย่างไร หรือการพัฒนาประสิทธิภาพให้จดจำใบหน้าได้แม้จะปิดบังหน้าเพื่อค้นหาผู้สูญหายหรืออาชญกร ไม่แน่ว่าในอนาคตเราอาจจะได้เห็นนวัตกรรมใหม่ๆ ที่นำเอาเทคโนโลยี Face Detection มาประยุกต์ใช้มากขึ้นอีกก็เป็นได้

3.ขอบเขต

1.ไม่สามารถตรวจสอบและแสดงข้อมูลของผู้ที่ไม่มีข้อมูลของได้

2.ต้องทำการ Train ใบหน้าสำหรับผู้ใช้ใหม่เสมอ

3.ต้องทำการเพิ่มข้อมูลในฐานข้อมูลของผู้ใช้ใหม่เสมอ

4.ความแม่นยำของการตรวจจับใบหน้ายังมีความไม่เสถียรเท่าไหร่นัก

4. ประโยชน์ที่คาดว่าจะได้รับ

ระบบที่นำเทคโนโลยี Face Detection มาใช้มากที่สุดคือระบบรักษาความปลอดภัย อย่างระบบ Access Control ที่ใช้อุปกรณ์สแกนใบหน้าควบคุมการเปิดปิดประตู และนอกจากนี้ ยังสามารถนำไปใช้งานร่วมกับระบบลงเวลาได้ด้วย อย่างโรงเรียนแห่งหนึ่งที่ใช้ระบบสแกนใบหน้าในการลงเวลาเข้าออกโรงเรียนของนักเรียน แทนการสแกนบัตรหรือเช็คชื่อแบบปกติ เพื่ออำนวยความสะดวกสบาย และ ห่างไกลจากการสัมผัส Covid-19 ได้อีกด้วย

5. ความรู้ที่เกี่ยวข้อง

Python

ภาษาโปรแกรม Python คืออะไร ?
โลกในยุคดิจิทัล (Digital age) ได้มีความก้าวหน้าในการพัฒนาเทคโนโลยีอย่างรวดเร็วแบบก้าวกระโดด ทำให้มีบทบาทสำคัญในการพัฒนาขับเคลื่อนธุรกิจ และอำนวยความสะดวกในชีวิตประจำวัน เช่น การทำธุรกรรมทางการเงินกับธนาคารแบบออนไลน์ การใช้ระบบสั่งการคอมพิวเตอร์ด้วยเสียง การตรวจสุขภาพเบื้องต้นด้วยแอปพลิเคชันบนมือถือ และระบบ Google Search ที่สามารถรู้ว่าคุณกำลังค้นหาข้อมูลอะไรก่อนที่เราจะพิมพ์จบประโยค เป็นต้น นอกจากนั้นยังมีนวัตกรรมเทคโนโลยีที่มีความล้ำหน้าต่าง ๆ โดยเฉพาะงานทางด้านปัญญาประดิษฐ์ (Artificial Intelligence) เช่น บริษัท DeepMind ได้พัฒนาระบบคอมพิวเตอร์ Alpha Go ที่สามารถแข่งขันเอาชนะเกมหมากล้อมเหนือแชมป์โลกได้ และยังมีระบบคอมพิวเตอร์ล่าสุดที่ชื่อว่า AlphaStar ที่สามารถเอาชนะทีมมนุษย์ในเกม StarCraft II ได้ รวมถึงรถยนต์ไร้คนขับที่สามารถเดินทางบนถนนได้จริง และหุ่นยนต์คอมพิวเตอร์ที่จะสามารถทำงานทดแทนมนุษย์ได้ในอนาคต

Module ที่ใช้

OpenCV2 pip install opencv-python

OpenCV (Open source Computer Vision) เป็นไลบรารีฟังก์ชันการเขียนโปรแกรม (Library of Programming Functions) โดยส่วนใหญ่จะมุ่งเป้าไปที่การแสดงผลด้วยคอมพิวเตอร์แบบเรียลไทม์ (Real-Time Computer Vision) เดิมทีแล้วถูกพัฒนาโดย Intel แต่ภายหลังได้รับการสนับสนุนโดย Willow Garage ตามมาด้วย Itseez (ซึ่งต่อมาถูกเข้าซื้อโดย Intel) OpenCV เป็นไลบรารีแบบข้ามแพลตฟอร์ม (Cross-Platform) และใช้งานได้ฟรีภายใต้ลิขสิทธิ์ของ BSD แบบโอเพ่นซอร์ส (Open-Source BSD License)
OpenCV ยังสนับสนุนเฟรมเวิร์กการเรียนรู้เชิงลึก (Deep Learning Frameworks) ได้แก่ TensorFlow, Torch/PyTorch และ Caffe
การใช้ประโยชน์
ตัวอย่างการประยุกต์ใช้งาน OpenCV มีดังนี้
ชุดเครื่องมือคุณลักษณะ 2 มิติและ 3 มิติ (2D and 3D feature toolkits)
การประมาณระยะในขณะเคลื่อนที่ (Egomotion Estimation)
ระบบรู้จำใบหน้า (Facial recognition system)
การจดจำท่าทาง (Gesture recognition)
ปฏิสัมพันธ์ระหว่างมนุษย์และคอมพิวเตอร์ (Human-Computer interaction; HCI)

sqlite3 pip install pysqlite3

SQLite เป็นโปรแกรมฐานข้อมูลที่มีขนาดเล็กมาก (ไม่ถึง 1MB) เก็บฐานข้อมูลเป็นไฟล์โดยไม่จำเป็นต้องมีเซิร์ฟเวอร์ ทำให้ถูกใช้ในหลายๆ โปรแกรมหรือถูกติดตั้งลงไปในอุปกรณ์พกพาหลายชนิดๆ เช่น iPhone, Android เพื่อใช้ในการเก็บข้อมูล

บอกตามตรงไม่เคยใช้เลย ใช้แต่ระบบฐานข้อมูล MySQL แต่เมื่อมีโอกาสทำโครงการเก็บข้อมูลลงในอุปกรณ์ที่มีขนาดเล็ก ฮาร์ดดิสก์และหน่วยความจำมีขนาดจำกัด เลยลองหัดใช้ SQLite ดู แล้วนำมาแชร์กัน เผื่อเป็นประโยชน์กับผู้อ่าน

ในบทความนี้ขอแสดงวิธีใช้ SQLite แบบรันเป็นคำสั่ง (command line) คือรันคำสั่ง sqlite3 เพื่อเข้าใช้งาน ส่วนอีกวิธีคือเรียกผ่าน library ผ่านการเขียนโปรแกรม PHP, Python ขอเป็นบทความต่อไป

หลายๆ OS เช่น Linux, MacOS จะติดตั้ง SQLite มาเป็นดีฟอลต์เลย เราสามารถรันคำสั่ง sqlite3 เพื่อใช้งานได้เลย

numpy pip install numpy

NumPy คืออะไร ?
NumPy เป็นชื่อของ library ที่ใช้ในการคำนวนทางคณิตศาสตร์ในภาษา Python ซึ่งภายในถูกเขียนด้วยภาษา C จึงทำงานได้เร็วและมีประสิทธิภาพ โดย NumPy มีความสามารถในการจัดการกับอาเรย์หลายมิติและข้อมูลแบบเมทริกซ์

Pickle

ปกติแล้วออบเจ็กต์หรือตัวแปรในไพธอนนั้นพอจบโปรแกรมก็จะถูกลบหายไป ไม่สามารถนำมาใช้ต่อได้ในโปรแกรมอื่น

เพื่อให้ออบเจ็กต์เดิมสามารถนำมาใช้ในโปรแกรมอื่นได้อาจต้องบันทึกข้อมูลในออบเจ็กต์ไว้แล้วดึงมาใช้ในโปรแกรมอื่น

สำหรับในไพธอนมีคำมอดูลที่เตรียมไว้สำหรับบันทึกข้อมูลออบเจ็กต์ลงเครื่องแล้วดึงมาใช้ใหม่ นั่นคือมอดูล pickle

pickle นั้นจริงๆมีความหมายว่าผักดอง ในที่นี้น่าจะหมายถึงว่าการเก็บออบเจ็กต์ในไพธอนไว้ในเครื่องก็เหมือนเป็นการเอาผักไปดองไว้เพื่อจะมากินภายหลัง

ออบเจ็กต์ที่จะบันทึกด้วย pickle นั้นจะเป็นออบเจ็กต์พื้นฐานในไพธอนเช่น list, tuple, dict หรือตัวแปรง่ายๆอย่างพวกจำนวนตัวเลขหรือสายอักขระก็ได้ นอกจากนี้ยังบันทึกออบเจ็กต์จากมอดูลเสริมหรือออบเจ็กต์ที่ผู้เขียนนิยามขึ้นมาเองได้ด้วย

6.ผลการดำเนินงาน

ทำการติดตั้งโปรแกรมทั้งหมดที่ต้องใช้

1.Python

2.sqlite3

3.Module

  • cv2
  • numpy
  • sqlite3

หลังจากที่เราทำการติดตั้งโปรแกรมที่ต้องใช้ทั้งหมดแล้ว ก็มาเริ่มทำการเขียนโปรแกรมกันเลย

1.ทำการเขียนโปรแกรมเพื่อตรวจจับบันทึกใบหน้าของผู้ใช้งาน

import cv2
import numpy as np
faceDetect=cv2.CascadeClassifier('haarcascade_frontalface_default.xml');
cam=cv2.VideoCapture(0);

sampleNum=0;

while True :
	ret,img=cam.read();
	gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
	faces=faceDetect.detectMultiScale(gray,1.3,5);
	for(x,y,w,h) in faces:
		sampleNum=sampleNum+1;
		cv2.imwrite("dataSet/User."+str(1) +'.'+str(sampleNum)+".jpg",gray[y:y+h,x:x+w]) //ตรงส่วนของ "str(1)" ตัวเลขคือUserIdของแต่ละบุคคล
		cv2.rectangle(img, (x,y) , (x+w,y+h) , (0,0,255),2)
		cv2.waitKey(100);
	cv2.imshow("Face",img);
	cv2.waitKey(1);
	if(cv2.waitKey(1)==ord('q')):  //กดปุ่ม Q เพื่อหยุดการทำงานโปรแกรม
    		break
cam.release()
cv2.destroyAllWindows()

2.ทำการ Trainner โฟลเดอร์รูปภาพของเราที่เก็บรูปภาพของผู้ใช้

import os
import cv2
import numpy as np
from PIL import Image

recognizer = cv2.face.LBPHFaceRecognizer_create()
path=('dataSet')

def getImagesWithID(path):
    imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
    faces=[]
    IDs=[]
    for imagePath in imagePaths:
        faceImg=Image.open(imagePath).convert('L');
        faceNp=np.array(faceImg,'uint8')
        ID=int(os.path.split(imagePath)[-1].split('.')[1])
        faces.append(faceNp)
        print (ID)
        IDs.append(ID)
        cv2.imshow("training",faceNp)
        cv2.waitKey(10)
    return IDs, faces

Ids,faces=getImagesWithID(path)
recognizer.train(faces,np.array(Ids))
recognizer.save('recognizer/trainingData.yml')
cv2.destroyAllWindows()

3.ทำการใส่ข้อมูลต่างๆของผู้ใช้ลงไปโดยในที่นี้จะกำหนดข้อมูลไว้ 3 อย่าง คือ ชื่อ,อายุ,เพศ

  • ขั้นตอนที่ 1 ทำการสร้าง database ขึ้นมา
  • ขั้นตอนที่ 2 ทำการใส่ชื่อ (ในที่นี้กำหนดไว้เป็น FaceBase)
  • ขั้นตอนที่ 3 ทำการเพิ่ม Column

หลังจากนั้นทำการตั้งค่าตามรูปภาพ

หลังจากเราสร้าง Column เสร็จให้ทำการไปใส่ข้อมูลของผู้ใช้คนนั้นๆได้เลยโดยการกดไปที่ Data ตามรูปภาพ

  • ขั้นตอนที่ 4 ทำการเขียน Code โปรแกรมหลักของเรากันเลย
import cv2,os
import numpy as np
from PIL import Image
import pickle
import sqlite3

faceDetect=cv2.CascadeClassifier('haarcascade_frontalface_default.xml');
cam=cv2.VideoCapture(0);
rec=cv2.face.LBPHFaceRecognizer_create();
rec.read("recognizer\\trainingData.yml")

def getProfile(id):
    conn=sqlite3.connect("FaceBase.db")
    cmd="SELECT * FROM People WHERE ID="+str(id)
    cursor=conn.execute(cmd)
    profile=None
    for row in cursor:
        profile=row
    conn.close()
    return profile

id=0
fontface=cv2.FONT_HERSHEY_COMPLEX_SMALL

while(True):
    ret,img=cam.read();
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    faces=faceDetect.detectMultiScale(gray,1.1,5);
    for(x,y,w,h) in faces:
        cv2.rectangle(img,(x,y),(x+w,y+h),(0,50,255),4)
        id,conf=rec.predict(gray[y:y+h,x:x+w])
        profile=getProfile(id)
        if(profile!=None):
            cv2.putText(img,str(profile[1]),(x,y+h+30),fontface,1.1,(255,0,0),2);
            cv2.putText(img,str(profile[2]),(x,y+h+60),fontface,1.1,(255,0,0),2);
            cv2.putText(img,str(profile[3]),(x,y+h+90),fontface,1.1,(255,0,0),2);
    cv2.imshow("God Camera",img);
    if(cv2.waitKey(1)==ord('q')):
        break;   
cam.release()
cv2.destroyAllWindows()

7.สรุปผลและข้อเสนอแนะ

โดยรวมของโปรแกรมถือว่าเป็นไปตามเป้าหมาย แต่อาจจะมีปัญหาติดขัดเล็กน้อย อย่างเช่น ตัว Code ในการใช้เขียน จะไม่เหมือนกันในแต่ละเวอร์ชั่นของ Python การลงโมดูล (Module) เนื่องจากตัว Python ในเวอร์ชั่นใหม่ๆ จะยังไม่รองรับโมดูล (Module) บางตัว

8.ข้อมูลอ้างอิง

ขั้นตอนที่ 1 สำรวจความต้องการของระบบ Face Detector ที่เชื่อมต่อกับฐานข้อมูล SQLite3 – YouTube

วิธีการแก้ปัญหาต่างๆ

Install OpenCV2 : https://stackoverflow.com/questions/60688395/installation-of-opencv-in-anaconda-not-showing-up-in-vs-code-in-windows-10
Install sqlite3 : https://stackoverflow.com/questions/19530974/how-can-i-add-the-sqlite3-module-to-python
Error Fix cv2.LBPHFacerecognizer : https://stackoverflow.com/questions/46873728/cv2-lbphfacerecognizer-has-no-attribute-load-predict

คลิป Video ต้นฉบับ

Video Youtube Tutorial Part 1 – 4
Program in python(tutorial) Part 1 : https://www.youtube.com/watch?v=4W5M-YaJtIA&t=7s
Program in python(tutorial) Part 2 : https://www.youtube.com/watch?v=T-yWORkWvNs
Program in python(tutorial) Part 3 : https://www.youtube.com/watch?v=oqMTdjcrAGk&t=675s
Program + Sqlite Database in python Part 4 : https://www.youtube.com/watch?v=6gWS2CdtZrs

Share

You may also like...

Leave a Reply