สารบัญ:

การจดจำใบหน้าแบบเรียลไทม์: โปรเจ็กต์แบบครบวงจร: 8 ขั้นตอน (พร้อมรูปภาพ)
การจดจำใบหน้าแบบเรียลไทม์: โปรเจ็กต์แบบครบวงจร: 8 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: การจดจำใบหน้าแบบเรียลไทม์: โปรเจ็กต์แบบครบวงจร: 8 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: การจดจำใบหน้าแบบเรียลไทม์: โปรเจ็กต์แบบครบวงจร: 8 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: I LIKE U SUMMER: CHAPTER 1 [Part1] โปรเจกต์เล็ก ที่ไม่เล็ก! เส้นทางสู่การทำเพลงเองครั้งแรกในชีวิต! 2024, กรกฎาคม
Anonim
การจดจำใบหน้าแบบเรียลไทม์: โปรเจ็กต์แบบครบวงจร
การจดจำใบหน้าแบบเรียลไทม์: โปรเจ็กต์แบบครบวงจร

ในบทช่วยสอนล่าสุดของฉันที่สำรวจ OpenCV เราได้เรียนรู้การติดตามวัตถุด้วยการมองเห็นอัตโนมัติ ตอนนี้เราจะใช้ PiCam เพื่อจดจำใบหน้าแบบเรียลไทม์ ดังที่คุณเห็นด้านล่าง:

ภาพ
ภาพ

โครงการนี้เสร็จสิ้นด้วย "Open Source Computer Vision Library" ซึ่งเป็น OpenCV ในบทช่วยสอนนี้ เราจะเน้นที่ Raspberry Pi (ดังนั้น Raspbian เป็น OS) และ Python แต่ฉันยังทดสอบโค้ดบน My Mac และมันก็ใช้ได้ดีเช่นกัน OpenCV ได้รับการออกแบบมาเพื่อประสิทธิภาพในการคำนวณและเน้นการใช้งานแบบเรียลไทม์ ดังนั้นจึงเหมาะอย่างยิ่งสำหรับการจดจำใบหน้าแบบเรียลไทม์โดยใช้กล้อง

ในการสร้างโปรเจ็กต์ที่สมบูรณ์บน Face Recognition เราต้องทำงานใน 3 ขั้นตอนที่แตกต่างกันมาก:

  1. การตรวจจับใบหน้าและการรวบรวมข้อมูล
  2. ฝึกผู้รู้จำ
  3. การจดจำใบหน้า

บล็อกไดอะแกรมด้านล่างดำเนินการต่อขั้นตอนเหล่านั้น:

ภาพ
ภาพ

ขั้นตอนที่ 1: BoM - บิลวัสดุ

ส่วนหลัก:

  1. Raspberry Pi V3 - 32.00 เหรียญสหรัฐ
  2. 5 ล้านพิกเซล 1080p เซนเซอร์ OV5647 Mini กล้อง โมดูลวิดีโอ - US$13.00

ขั้นตอนที่ 2: การติดตั้งแพ็คเกจ OpenCV 3

การติดตั้งแพ็คเกจ OpenCV 3
การติดตั้งแพ็คเกจ OpenCV 3

ฉันใช้ Raspberry Pi V3 ที่อัปเดตเป็นเวอร์ชันล่าสุดของ Raspbian (Stretch) ดังนั้นวิธีที่ดีที่สุดในการติดตั้ง OpenCV คือทำตามบทช่วยสอนที่ยอดเยี่ยมที่พัฒนาโดย Adrian Rosebrock: Raspbian Stretch: ติดตั้ง OpenCV 3 + Python บน Raspberry Pi ของคุณ.

ฉันลองใช้คำแนะนำต่าง ๆ เพื่อติดตั้ง OpenCV บน Pi ของฉัน บทช่วยสอนของ Adrian นั้นดีที่สุด ฉันแนะนำให้คุณทำเช่นเดียวกันโดยทำตามคำแนะนำทีละขั้นตอน

เมื่อคุณเสร็จสิ้นการกวดวิชาของ Adrian คุณควรมีสภาพแวดล้อมเสมือน OpenCV พร้อมที่จะทำการทดลองของเรากับ Pi ของคุณ

ไปที่สภาพแวดล้อมเสมือนของเราและยืนยันว่าติดตั้ง OpenCV 3 อย่างถูกต้อง

Adrian แนะนำให้รันคำสั่ง "source" ทุกครั้งที่คุณเปิดเทอร์มินัลใหม่เพื่อให้แน่ใจว่าตัวแปรระบบของคุณได้รับการตั้งค่าอย่างถูกต้อง

ที่มา ~/.profile

ต่อไป เข้าสู่สภาพแวดล้อมเสมือนของเรา:

งาน cv

หากคุณเห็นข้อความ (cv) นำหน้าข้อความแจ้ง แสดงว่าคุณอยู่ในสภาพแวดล้อมเสมือน cv:

(cv) pi@raspberry:~$Adrian เรียกร้องความสนใจว่าสภาพแวดล้อมเสมือน cv Python นั้นมีความเป็นอิสระทั้งหมดและแยกจากเวอร์ชัน Python เริ่มต้นที่รวมอยู่ในการดาวน์โหลด Raspbian Stretch ดังนั้น แพ็คเกจ Python ใดๆ ในไดเร็กทอรี global site-packages จะไม่สามารถใช้ได้กับสภาพแวดล้อมเสมือน cv ในทำนองเดียวกัน แพ็คเกจ Python ใดๆ ที่ติดตั้งในแพ็คเกจไซต์ของ cv จะไม่สามารถใช้ได้กับการติดตั้งทั่วโลกของ Python

ตอนนี้ป้อนล่าม Python ของคุณ:

หลาม

และยืนยันว่าคุณใช้เวอร์ชัน 3.5 (หรือสูงกว่า)

ภายในล่าม (">>>" จะปรากฏขึ้น) นำเข้าไลบรารี OpenCV:

นำเข้า cv2

หากไม่มีข้อความแสดงข้อผิดพลาดปรากฏขึ้น แสดงว่า OpenCV ได้รับการติดตั้งอย่างถูกต้องบน PYTHON VIRTUAL ENVIRONMENT ของคุณ

คุณสามารถตรวจสอบเวอร์ชัน OpenCV ที่ติดตั้งได้:

cv2._version_

3.3.0 ควรปรากฏขึ้น (หรือเวอร์ชันที่เหนือกว่าที่สามารถเผยแพร่ได้ในอนาคต) Terminal PrintScreen ด้านบนแสดงขั้นตอนก่อนหน้า

ขั้นตอนที่ 3: ทดสอบกล้องของคุณ

ทดสอบกล้องของคุณ
ทดสอบกล้องของคุณ

เมื่อคุณติดตั้ง OpenCV ใน RPi แล้ว ให้ทดสอบเพื่อยืนยันว่ากล้องของคุณทำงานอย่างถูกต้อง

ฉันสมมติว่าคุณมี PiCam ติดตั้งอยู่บน Raspberry Pi ของคุณแล้ว

ป้อนรหัส Python ด้านล่างบน IDE ของคุณ:

นำเข้า numpy เป็น np

นำเข้า cv2 cap = cv2. VideoCapture(0) cap.set(3, 640) # set Width cap.set (4, 480) # set Height while (True): ret, frame = cap.read() frame = cv2 พลิก (เฟรม -1) # พลิกกล้องในแนวตั้งสีเทา = cv2.cvtColor (เฟรม cv2. COLOR_BGR2GRAY) cv2.imshow ('เฟรม' เฟรม) cv2.imshow ('สีเทา' สีเทา) k = cv2.waitKey (30) & 0xff ถ้า k == 27: # กด 'ESC' เพื่อออกจากตัวแบ่ง cap.release() cv2.destroyAllWindows()

โค้ดด้านบนจะจับภาพสตรีมวิดีโอที่จะสร้างโดย PiCam ของคุณ โดยจะแสดงทั้งในโหมดสี BGR และโหมดสีเทา

โปรดทราบว่าฉันหมุนกล้องในแนวตั้งเนื่องจากวิธีการประกอบ หากไม่ใช่กรณีของคุณ ให้แสดงความคิดเห็นหรือลบบรรทัดคำสั่ง "พลิก"

คุณสามารถดาวน์โหลดรหัสจาก GitHub ของฉัน: simpleCamTest.py

ในการดำเนินการให้ป้อนคำสั่ง:

หลาม simpleCamTest.py

หากต้องการสิ้นสุดโปรแกรม คุณต้องกดปุ่ม [ESC] บนแป้นพิมพ์

คลิกเมาส์บนหน้าต่างวิดีโอ ก่อนกด [ESC]

ภาพด้านบนแสดงผล

ผู้ผลิตบางรายพบปัญหาเมื่อพยายามเปิดกล้อง (ข้อความแสดงข้อผิดพลาด "การยืนยันล้มเหลว") ซึ่งอาจเกิดขึ้นได้หากไม่ได้เปิดใช้งานกล้องระหว่างการติดตั้ง OpenCv ดังนั้น ไดรเวอร์กล้องจึงไม่ได้ติดตั้งอย่างถูกต้อง หากต้องการแก้ไข ให้ใช้คำสั่ง:

sudo modprobe bcm2835-v4l2

คุณยังสามารถเพิ่ม bcm2835-v4l2 ลงในบรรทัดสุดท้ายของไฟล์ /etc/modules เพื่อให้ไดรเวอร์โหลดขณะบู๊ตได้

หากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับ OpenCV คุณสามารถทำตามบทช่วยสอน: loading -video-python-opencv-tutorial

ขั้นตอนที่ 4: การตรวจจับใบหน้า

การตรวจจับใบหน้า
การตรวจจับใบหน้า
การตรวจจับใบหน้า
การตรวจจับใบหน้า

งานพื้นฐานที่สุดในการจดจำใบหน้าคือ "การตรวจจับใบหน้า" ก่อนอื่นต้อง "จับ" ใบหน้า (เฟส 1) ก่อน ถึงจะจำได้ เทียบกับหน้าใหม่ที่ถ่ายในอนาคต (ระยะที่ 3)

วิธีที่พบบ่อยที่สุดในการตรวจจับใบหน้า (หรือวัตถุใดๆ) คือการใช้ "ตัวแยกประเภท Haar Cascade"

การตรวจจับวัตถุโดยใช้ตัวแยกประเภทการเรียงซ้อนตามฟีเจอร์ของ Haar เป็นวิธีการตรวจจับวัตถุที่มีประสิทธิภาพซึ่งเสนอโดย Paul Viola และ Michael Jones ในบทความเรื่อง "การตรวจจับวัตถุอย่างรวดเร็วโดยใช้ Boosted Cascade of Simple Features" ในปี 2544 ซึ่งเป็นแนวทางการเรียนรู้ด้วยเครื่องที่ ฟังก์ชันคาสเคดได้รับการฝึกฝนจากภาพบวกและลบจำนวนมาก จากนั้นจะใช้เพื่อตรวจจับวัตถุในภาพอื่นๆ

ที่นี่เราจะทำงานกับการตรวจจับใบหน้า ในขั้นต้น อัลกอริทึมต้องการรูปภาพเชิงบวกจำนวนมาก (รูปภาพใบหน้า) และรูปภาพเชิงลบ (รูปภาพที่ไม่มีใบหน้า) จำนวนมากเพื่อฝึกตัวแยกประเภท จากนั้นเราต้องแยกคุณสมบัติออกจากมัน ข่าวดีก็คือ OpenCV มาพร้อมกับเทรนเนอร์และตัวตรวจจับ หากคุณต้องการฝึกตัวแยกประเภทของคุณเองสำหรับวัตถุใดๆ เช่น รถยนต์ เครื่องบิน ฯลฯ คุณสามารถใช้ OpenCV เพื่อสร้างมันขึ้นมาได้ รายละเอียดทั้งหมดอยู่ที่นี่: การฝึกอบรม Cascade Classifier

หากคุณไม่ต้องการสร้างตัวแยกประเภทของคุณเอง OpenCV มีตัวแยกประเภทที่ได้รับการฝึกมาล่วงหน้าจำนวนมากสำหรับใบหน้า ดวงตา รอยยิ้ม ฯลฯ ไฟล์ XML เหล่านั้นสามารถดาวน์โหลดได้จากไดเร็กทอรี haarcascades

ทฤษฎีเพียงพอ มาสร้างเครื่องตรวจจับใบหน้าด้วย OpenCV กันเถอะ!

ดาวน์โหลดไฟล์: faceDetection.py จาก GitHub ของฉัน

นำเข้า numpy เป็น np

นำเข้า cv2 faceCascade = cv2. CascadeClassifier('Cascades/haarcascade_frontalface_default.xml') cap = cv2. VideoCapture(0) cap.set(3, 640) # set Width cap.set (4, 480) # set Height while True: ret, img = cap.read() img = cv2.flip(img, -1) grey = cv2.cvtColor(img, cv2. COLOR_BGR2GRAY) faces = faceCascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5, minSize=(20, 20)) สำหรับ (x, y, w, h) ในหน้า: cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) roi_gray = สีเทา[y:y+h, x:x+w] roi_color = img[y:y+h, x:x+w] cv2.imshow('วิดีโอ', img) k = cv2.waitKey(30) & 0xff ถ้า k == 27: # กด 'ESC' เพื่อออกจากตัวแบ่ง cap.release() cv2.destroyAllWindows()

เชื่อหรือไม่ โค้ดสองสามบรรทัดข้างต้นเป็นเพียงทั้งหมดที่คุณต้องใช้ในการตรวจจับใบหน้า โดยใช้ Python และ OpenCV

เมื่อเปรียบเทียบกับรหัสสุดท้ายที่ใช้ทดสอบกล้อง คุณจะพบว่ามีการเพิ่มบางส่วนเข้าไป หมายเหตุบรรทัดด้านล่าง:

faceCascade = cv2. CascadeClassifier ('Cascades/haarcascade_frontalface_default.xml')

นี่คือบรรทัดที่โหลด "ตัวแยกประเภท" (ต้องอยู่ในไดเร็กทอรีชื่อ "Cascades/" ใต้ไดเร็กทอรีโครงการของคุณ)

จากนั้นเราจะตั้งค่ากล้องและภายในลูป โหลดวิดีโออินพุตของเราในโหมดสีเทา (แบบที่เราเห็นก่อนหน้านี้)

ตอนนี้ เราต้องเรียกใช้ฟังก์ชันตัวแยกประเภทของเรา โดยส่งพารามิเตอร์ที่สำคัญบางอย่างไป เช่น ตัวประกอบมาตราส่วน จำนวนเพื่อนบ้าน และขนาดต่ำสุดของใบหน้าที่ตรวจพบ

ใบหน้า = faceCascade.detectMultiScale (สีเทา scaleFactor=1.2 minNeighbors=5 minSize=(20, 20))

ที่ไหน,

  • สีเทาคือภาพระดับสีเทาอินพุต
  • scaleFactor คือพารามิเตอร์ที่ระบุขนาดภาพที่ลดลงในแต่ละขนาดภาพ ใช้สำหรับสร้างปิรามิดมาตราส่วน
  • minNeighbors เป็นพารามิเตอร์ที่ระบุจำนวนเพื่อนบ้านในแต่ละสี่เหลี่ยมผืนผ้าที่เป็นตัวเลือก เพื่อรักษาไว้ จำนวนที่สูงกว่าจะให้ผลบวกลวงที่ต่ำกว่า
  • minSize คือขนาดสี่เหลี่ยมผืนผ้าขั้นต่ำที่ถือเป็นใบหน้า

ฟังก์ชั่นจะตรวจจับใบหน้าบนภาพ ต่อไป เราต้อง "ทำเครื่องหมาย" ใบหน้าในภาพ เช่น สี่เหลี่ยมผืนผ้าสีน้ำเงิน สิ่งนี้เสร็จสิ้นด้วยรหัสส่วนนี้:

สำหรับ (x, y, w, h) ในหน้า:

cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) roi_gray = grey[y:y+h, x:x+w] roi_color = img[y:y+h, x:x+w]

หากพบใบหน้า ระบบจะส่งกลับตำแหน่งของใบหน้าที่ตรวจพบเป็นรูปสี่เหลี่ยมผืนผ้าที่มีมุมซ้ายบน (x, y) และมี "w" เป็นความกว้าง และ "h" เป็นความสูง ==> (x, y, w, ชม). โปรดดูภาพด้านบน

เมื่อได้ตำแหน่งเหล่านี้แล้ว เราก็สามารถสร้าง "ROI" (สี่เหลี่ยมผืนผ้าที่วาด) สำหรับใบหน้าและนำเสนอผลลัพธ์ด้วยฟังก์ชัน imshow()

เรียกใช้สคริปต์ python ด้านบนในสภาพแวดล้อมของ python โดยใช้ Rpi Terminal:

หลาม faceDetection.py

ผลลัพธ์:

ภาพ
ภาพ

คุณยังสามารถรวมตัวแยกประเภทสำหรับ "การตรวจจับดวงตา" หรือแม้แต่ "การตรวจจับรอยยิ้ม" ในกรณีเหล่านี้ คุณจะรวมฟังก์ชันตัวแยกประเภทและรูปสี่เหลี่ยมผืนผ้าที่วาดไว้ในวงแหวนใบหน้า เพราะจะไม่มีเหตุผลที่จะตรวจจับดวงตาหรือรอยยิ้มภายนอกใบหน้า

โปรดทราบว่าใน Pi การมีตัวแยกประเภทหลายตัวในรหัสเดียวกันจะทำให้การประมวลผลช้าลง เมื่อวิธีการตรวจจับนี้ (HaarCascades) ใช้พลังงานในการคำนวณจำนวนมาก บนเดสก์ท็อป จะเรียกใช้งานได้ง่ายขึ้น

ใน GitHub ของฉัน คุณจะพบตัวอย่างอื่นๆ:

faceEyeDetection.py

faceSmileDetection.py

faceSmileEyeDetection.py

และในภาพด้านบน คุณจะเห็นผลลัพธ์

คุณสามารถทำตามบทช่วยสอนด้านล่างเพื่อทำความเข้าใจการตรวจจับใบหน้าได้ดีขึ้น:

Haar Cascade Object Detection Face & Eye OpenCV Python Tutorial

ขั้นตอนที่ 5: การรวบรวมข้อมูล

การรวบรวมข้อมูล
การรวบรวมข้อมูล
การรวบรวมข้อมูล
การรวบรวมข้อมูล

ก่อนอื่น ผมต้องขอขอบคุณ Ramiz Raja สำหรับงานที่ยอดเยี่ยมของเขาในการจดจำใบหน้าบนภาพถ่าย:

การจดจำใบหน้าโดยใช้ OPENCV และ PYTHON: คู่มือสำหรับผู้เริ่มต้นใช้งาน

และ Anirban Kar ที่พัฒนาบทช่วยสอนที่ครอบคลุมมากโดยใช้วิดีโอ:

การจดจำใบหน้า - 3 ส่วน

ฉันแนะนำให้คุณดูบทช่วยสอนทั้งสอง

พูดอย่างนั้นเรามาเริ่มเฟสแรกของโครงการกันเถอะ สิ่งที่เราจะทำในที่นี้คือเริ่มจากขั้นตอนสุดท้าย (Face Detecting) เราจะสร้างชุดข้อมูลขึ้นมา โดยเราจะเก็บแต่ละ id ซึ่งเป็นกลุ่มของภาพถ่ายสีเทาที่มีส่วนที่ใช้ในการตรวจจับใบหน้า

ขั้นแรก สร้างไดเร็กทอรีที่คุณพัฒนาโครงการของคุณ ตัวอย่างเช่น FacialRecognitionProject:

mkdir FacialRecognitionProject

ในไดเร็กทอรีนี้ นอกจากสคริปต์หลาม 3 ตัวที่เราจะสร้างสำหรับโปรเจ็กต์ของเราแล้ว เราต้องบันทึกตัวแยกประเภทใบหน้าไว้ด้วย คุณสามารถดาวน์โหลดได้จาก GitHub ของฉัน: haarcascade_frontalface_default.xml

ต่อไป สร้างไดเร็กทอรีย่อยที่เราจะเก็บตัวอย่างใบหน้าของเราและตั้งชื่อเป็น "ชุดข้อมูล":

ชุดข้อมูล mkdir

และดาวน์โหลดรหัสจาก GitHub ของฉัน: 01_face_dataset.py

นำเข้า cv2

import os cam = cv2. VideoCapture(0) cam.set(3, 640) # set video width cam.set (4, 480) # set video height face_detector = cv2. CascadeClassifier('haarcascade_frontalface_default.xml') # สำหรับแต่ละคน, ป้อนรหัสใบหน้าที่เป็นตัวเลขหนึ่งตัว face_id = input('\n enter user id end press ==> ') print("\n [INFO] กำลังเริ่มต้นการจับภาพใบหน้า มองกล้องแล้วรอ …") # เริ่มต้นการสุ่มตัวอย่างการนับใบหน้า = 0 ในขณะที่ (จริง): ret, img = cam.read () img = cv2.flip (img, -1) # พลิกภาพวิดีโอในแนวตั้งสีเทา = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) ใบหน้า = face_detector.detectMultiScale (สีเทา 1.3, 5) สำหรับ (x, y, w, h) ในหน้า: cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) นับ += 1 # บันทึกภาพที่ถ่ายลงในโฟลเดอร์ชุดข้อมูล cv2.imwrite("dataset/User" + str(face_id) + '.' + str(count) + ".jpg", สีเทา[y:y+ h, x:x+w]) cv2.imshow('image', img) k = cv2.waitKey(100) & 0xff # กด 'ESC' เพื่อออกจากวิดีโอถ้า k == 27: ทำลายจำนวน elif >= 30: # ถ่าย 30 ตัวอย่างใบหน้าแล้วหยุดวิดีโอพัก # Do ab เป็นการพิมพ์ล้าง ("\n [INFO] การออกจากโปรแกรมและการล้างข้อมูล") cam.release() cv2.destroyAllWindows()

รหัสนี้คล้ายกับรหัสที่เราเห็นในการตรวจจับใบหน้ามาก สิ่งที่เราเพิ่มเข้าไปคือ "คำสั่งอินพุต" เพื่อดักจับ ID ผู้ใช้ ซึ่งควรเป็นตัวเลขจำนวนเต็ม (1, 2, 3 ฯลฯ)

face_id = อินพุต ('\n ป้อน ID ผู้ใช้ กด ==> ')

และสำหรับแต่ละเฟรมที่จับภาพ เราควรบันทึกเป็นไฟล์ในไดเร็กทอรี "ชุดข้อมูล":

cv2.imwrite("dataset/User." + str(face_id) + '.' + str(count) + ".jpg", สีเทา[y:y+h, x:x+w])

โปรดทราบว่าในการบันทึกไฟล์ด้านบน คุณต้องนำเข้าไลบรารี "os" ชื่อไฟล์แต่ละไฟล์จะเป็นไปตามโครงสร้าง:

User.face_id.count.jpg

ตัวอย่างเช่น สำหรับผู้ใช้ที่มี face_id = 1 ไฟล์ตัวอย่างที่ 4 บน dataset/ ไดเร็กทอรีจะเป็นดังนี้:

User.1.4.jpg

ดังแสดงในภาพด้านบนจาก Pi ของฉัน ในรหัสของฉัน ฉันกำลังเก็บตัวอย่าง 30 ตัวอย่างจากแต่ละรหัส คุณสามารถเปลี่ยนได้ใน "elif" สุดท้าย จำนวนตัวอย่างถูกใช้เพื่อทำลายวงจรที่ดักจับตัวอย่างใบหน้า

เรียกใช้สคริปต์ Python และบันทึกรหัสสองสามตัว คุณต้องเรียกใช้สคริปต์ในแต่ละครั้งที่คุณต้องการรวมผู้ใช้ใหม่ (หรือเพื่อเปลี่ยนรูปถ่ายสำหรับผู้ใช้ที่มีอยู่แล้ว)

ขั้นตอนที่ 6: ผู้ฝึกสอน

เทรนเนอร์
เทรนเนอร์

ในระยะที่สองนี้ เราต้องนำข้อมูลผู้ใช้ทั้งหมดจากชุดข้อมูลของเราและ "ผู้ฝึกสอน" ตัวจำแนก OpenCV ทำได้โดยตรงโดยฟังก์ชัน OpenCV เฉพาะ ผลลัพธ์จะเป็นไฟล์.yml ที่จะบันทึกไว้ในไดเร็กทอรี "trainer/"

มาเริ่มสร้างไดเร็กทอรีย่อยที่เราจะเก็บข้อมูลที่ได้รับการฝึกอบรม:

mkdir trainer

ดาวน์โหลดจาก GitHub สคริปต์หลามตัวที่สอง: 02_face_training.py

นำเข้า cv2

นำเข้า numpy เป็น np จาก PIL นำเข้าอิมเมจ ระบบปฏิบัติการ # เส้นทางสำหรับเส้นทางฐานข้อมูลภาพใบหน้า = 'ชุดข้อมูล' ตัวจำแนกลายมือ = cv2.face. LBPHFaceRecognizer_create() ตัวตรวจจับ = cv2. CascadeClassifier("haarcascade_frontalface_default.xml"); # ฟังก์ชันเพื่อรับรูปภาพและข้อมูลป้ายกำกับ def getImagesAndLabels(path): imagePaths = [os.path.join(path, f) สำหรับ f ใน os.listdir(path)] faceSamples= ids = สำหรับ imagePath ใน imagePaths: PIL_img = Image.open(imagePath).convert('L') # แปลงเป็นระดับสีเทา img_numpy = np.array(PIL_img, 'uint8') id = int(os.path.split(imagePath)[-1] split(".")[1]) faces = detector.detectMultiScale(img_numpy) สำหรับ (x, y, w, h) ในใบหน้า: faceSamples.append(img_numpy[y:y+h, x:x+w]) ids.append(id) ส่งคืน faceSamples, ids print ("\n [INFO] Training faces. จะใช้เวลาสักครู่ รอ …") ใบหน้า ids = getImagesAndLabels(path) recognitionr.train(faces, np.array(id)) # บันทึกโมเดลลงใน trainer/trainer.yml recognitionr.write('trainer/trainer.yml') # recognitionr.save() ทำงานบน Mac แต่ไม่ใช่ใน Pi # พิมพ์จำนวนใบหน้าที่ฝึกแล้วและสิ้นสุดการพิมพ์โปรแกรม ("\n [INFO] {0} ใบหน้าได้รับการฝึกฝน กำลังออกจากโปรแกรม".format(len(np.unique(ids))))

ยืนยันว่าคุณมีไลบรารี PIL ติดตั้งอยู่ใน Rpi ของคุณหรือไม่ ถ้าไม่ ให้รันคำสั่งด้านล่างใน Terminal:

pip ติดตั้งหมอน

เราจะใช้เป็นเครื่องจดจำใบหน้า LBPH (LOCAL BINARY PATTERN HISTOGRAMS) Face Recognizer ซึ่งรวมอยู่ในแพ็คเกจ OpenCV เราทำสิ่งนี้ในบรรทัดต่อไปนี้:

ตัวจำแนกลายมือ = cv2.face. LBPHFaceRecognizer_create()

ฟังก์ชัน "getImagesAndLabels (เส้นทาง)" จะถ่ายภาพทั้งหมดในไดเรกทอรี: "dataset/" ส่งคืน 2 อาร์เรย์: "Ids" และ "faces" ด้วยอาร์เรย์เหล่านี้เป็นอินพุต เราจะ "ฝึกการจำแนกของเรา":

ตัวจำแนกลายมือ.train (ใบหน้า, รหัส)

ด้วยเหตุนี้ ไฟล์ชื่อ "trainer.yml" จะถูกบันทึกไว้ในไดเร็กทอรี trainer ที่เราสร้างขึ้นก่อนหน้านี้

แค่นั้นแหละ! ฉันได้รวมข้อความสั่งพิมพ์ล่าสุดที่ฉันแสดงเพื่อยืนยัน จำนวนใบหน้าของผู้ใช้ที่เราฝึก

ทุกครั้งที่ทำ Phase 1, Phase 2 จะต้องรันด้วย

ขั้นตอนที่ 7: ตัวรับรู้

ตัวรับรู้
ตัวรับรู้
ตัวรับรู้
ตัวรับรู้

ตอนนี้เรามาถึงขั้นตอนสุดท้ายของโครงการแล้ว ในที่นี้ เราจะจับภาพใบหน้าที่สดใสด้วยกล้องของเรา และหากบุคคลนี้เคยบันทึกใบหน้าและฝึกฝนมาก่อน ตัวจำแนกลายมือของเราจะทำการ "คาดคะเน" ส่งคืนรหัสและดัชนี แสดงให้เห็นว่าตัวจำแนกใบหน้ามีความมั่นใจเพียงใดกับการจับคู่นี้

มาดาวน์โหลดสคริปต์ python เฟสที่ 3 จาก GitHub ของฉัน: 03_face_recognition.py

นำเข้า cv2

นำเข้า numpy เป็น np นำเข้า os จดจำ = cv2.face. LBPHFaceRecognizer_create() recognitionr.read('trainer/trainer.yml') cascadePath = "haarcascade_frontalface_default.xml" faceCascade = cv2. CascadeClassifier (cascadePath); font = cv2. FONT_HERSHEY_SIMPLEX #iniciate id ตัวนับ id = 0 # ชื่อที่เกี่ยวข้องกับรหัส: ตัวอย่าง ==> Marcelo: id=1 ชื่ออื่นๆ = ['None', 'Marcelo', 'Paula', 'Ilza', 'Z ', 'W'] # เริ่มต้นและเริ่มต้นกล้องจับภาพวิดีโอแบบเรียลไทม์ = cv2. VideoCapture (0) cam.set (3, 640) # ตั้งค่าวิดีโอ widht cam.set (4, 480) # ตั้งค่าความสูงของวิดีโอ # กำหนดขนาดหน้าต่างขั้นต่ำ จะถูกจดจำเป็นใบหน้า minW = 0.1*cam.get(3) minH = 0.1*cam.get(4) ในขณะที่ True: ret, img =cam.read() img = cv2.flip(img, -1) # พลิกแนวตั้งสีเทา = cv2.cvtColor(img, cv2. COLOR_BGR2GRAY) ใบหน้า = faceCascade.detectMultiScale(สีเทา, scaleFactor = 1.2, minNeighbors = 5, minSize = (int(minW), int(minH)),) for(x, y, w, h) ในใบหน้า: cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) id, friendship = trust.predict(gray[y:y+h, x:x+w]) # ตรวจสอบว่าความมั่นใจน้อยกว่าพวกเขาหรือไม่ 100 ==> "0" เป็นการจับคู่ที่สมบูรณ์แบบถ้า (ความมั่นใจ < 100): id = ชื่อ[id] ความมั่นใจ = " {0}% ".format(รอบ(100 - ความมั่นใจ)) อื่น: id = "ไม่ทราบ" ความมั่นใจ = " {0}%".format(รอบ (100 - conf) idence)) cv2.putText(img, str(id), (x+5, y-5), font, 1, (255, 255, 255), 2) cv2.putText(img, str(confidence), (x+5, y+h-5), แบบอักษร, 1, (255, 255, 0), 1) cv2.imshow('camera', img) k = cv2.waitKey(10) & 0xff # กด 'ESC' สำหรับการออกจากวิดีโอถ้า k == 27: แตก # ทำการพิมพ์ล้างเล็กน้อย ("\n [INFO] การออกจากโปรแกรมและการล้างข้อมูล") cam.release() cv2.destroyAllWindows()

เรากำลังรวมอาร์เรย์ใหม่ไว้ที่นี่ ดังนั้นเราจะแสดง "ชื่อ" แทนรหัสที่เป็นตัวเลข:

ชื่อ = ['ไม่มี', 'Marcelo', 'Paula', 'Ilza', 'Z', 'W']

ตัวอย่างเช่น: Marcelo จะให้ผู้ใช้ที่มี id = 1; พอลล่า: id=2 เป็นต้น

ต่อไป เราจะตรวจจับใบหน้า เช่นเดียวกับที่เราเคยทำกับตัวแยกประเภท haasCascade การมีใบหน้าที่ตรวจพบ เราสามารถเรียกใช้ฟังก์ชันที่สำคัญที่สุดในโค้ดด้านบนได้:

id, ความมั่นใจ = recommander.predict (ส่วนสีเทาของใบหน้า)

Recognition.predict () จะใช้เป็นพารามิเตอร์ส่วนหนึ่งของใบหน้าเพื่อวิเคราะห์และจะส่งคืนเจ้าของที่น่าจะเป็นไปได้ โดยระบุ ID ของมันและความมั่นใจที่ผู้จดจำมีความสัมพันธ์กับการจับคู่นี้

โปรดทราบว่าดัชนีความเชื่อมั่นจะคืนค่าเป็น "ศูนย์" หากจะมีการจับคู่ที่สมบูรณ์แบบ

และสุดท้าย หากตัวจำแนกลายมือสามารถคาดเดาใบหน้าได้ เราจะใส่ข้อความบนภาพด้วยรหัสที่น่าจะเป็น และ "ความน่าจะเป็น" เป็น % ที่การจับคู่นั้นถูกต้องเป็นเท่าใด ("ความน่าจะเป็น" = 100 - ดัชนีความเชื่อมั่น) ถ้าไม่เช่นนั้น จะติดป้าย "ไม่รู้" ไว้บนใบหน้า

ด้านล่าง-g.webp

ภาพ
ภาพ

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

ขั้นตอนที่ 8: สรุป

บทสรุป
บทสรุป

และเช่นเคย ฉันหวังว่าโครงการนี้จะช่วยให้ผู้อื่นค้นพบหนทางสู่โลกที่น่าตื่นเต้นของอิเล็กทรอนิกส์!

สำหรับรายละเอียดและรหัสสุดท้าย โปรดไปที่ศูนย์ฝาก GitHub ของฉัน: OpenCV-Face-Recognition

สำหรับโครงการเพิ่มเติม โปรดเยี่ยมชมบล็อกของฉัน: MJRoBot.org

ด้านล่างของบทช่วยสอนในอนาคต เราจะสำรวจ "การติดตามใบหน้าอัตโนมัติและวิธีการอื่นๆ สำหรับการตรวจจับใบหน้า":

ภาพ
ภาพ

Saludos จากทางใต้ของโลก!

พบกันใหม่ในคำสั่งต่อไปของฉัน!

ขอขอบคุณ, มาร์เซโล

แนะนำ: