สารบัญ:

การตรวจจับใบหน้า+การจดจำใบหน้า: 8 ขั้นตอน (พร้อมรูปภาพ)
การตรวจจับใบหน้า+การจดจำใบหน้า: 8 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: การตรวจจับใบหน้า+การจดจำใบหน้า: 8 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: การตรวจจับใบหน้า+การจดจำใบหน้า: 8 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: สอน Python & OpenCV Image Processing เบื้องต้น 2024, พฤศจิกายน
Anonim
Image
Image
ตรวจจับใบหน้า+จดจำใบหน้า
ตรวจจับใบหน้า+จดจำใบหน้า

นี่เป็นตัวอย่างง่ายๆ ของการตรวจจับใบหน้าและการจดจำใบหน้าด้วย OpenCV จากกล้อง หมายเหตุ: ฉันทำโปรเจ็กต์นี้เพื่อประกวดเซ็นเซอร์ และฉันใช้กล้องเป็นเซ็นเซอร์เพื่อติดตามและจดจำใบหน้า ดังนั้นเป้าหมายของเราในเซสชั่นนี้ 1. ติดตั้งอนาคอนดา 2. ดาวน์โหลด Open CV Package 3. ตั้งค่าตัวแปรสิ่งแวดล้อม 4. ทดสอบเพื่อยืนยัน 5. ทำรหัสสำหรับการตรวจจับใบหน้า 6. สร้างรหัสเพื่อสร้างชุดข้อมูล 7. สร้างรหัสเพื่อฝึกการจดจำใบหน้า 8. สร้างรหัสเพื่อจดจำใบหน้า &ผลลัพธ์.

ขั้นตอนที่ 1: ติดตั้ง Anaconda

ติดตั้งอนาคอนด้า
ติดตั้งอนาคอนด้า

โดยพื้นฐานแล้ว Anaconda เป็น Python IDE ที่บรรจุอย่างสวยงามซึ่งมาพร้อมกับแพ็คเกจที่มีประโยชน์มากมาย เช่น NumPy, Pandas, IPython Notebook เป็นต้น ดูเหมือนว่าจะแนะนำทุกที่ในชุมชนวิทยาศาสตร์ ลองใช้ Anaconda เพื่อทำการติดตั้ง

ขั้นตอนที่ 2: ดาวน์โหลด Open CV Package

ดาวน์โหลด Open CV Package
ดาวน์โหลด Open CV Package

ขั้นแรก ไปที่เว็บไซต์ OpenCV อย่างเป็นทางการเพื่อดาวน์โหลดแพ็คเกจ OpenCV ที่สมบูรณ์ เลือกเวอร์ชันที่คุณชอบ (2.x หรือ 3.x) ฉันใช้ Python 2.x และ OpenCV 2.x - ส่วนใหญ่เป็นเพราะนี่คือวิธีการตั้งค่า / สอนบทเรียน OpenCV-Python

ในกรณีของฉัน ฉันได้แยกแพ็คเกจ (โดยพื้นฐานแล้วเป็นโฟลเดอร์) ไปยังไดรฟ์ F ของฉันโดยตรง (F:\opencv).

ขั้นตอนที่ 3: ตั้งค่าตัวแปรสิ่งแวดล้อม

กำหนดตัวแปรสิ่งแวดล้อม
กำหนดตัวแปรสิ่งแวดล้อม

คัดลอกและวางไฟล์ cv2.pyd

ไดเร็กทอรี Anaconda Site-packages (เช่น F:\Program Files\Anaconda2\Lib\site-packages ในกรณีของฉัน) มีแพ็คเกจ Python ที่คุณอาจนำเข้าได้ เป้าหมายของเราคือคัดลอกและวางไฟล์ cv2.pyd ลงในไดเร็กทอรีนี้ (เพื่อให้เราสามารถใช้การนำเข้า cv2 ในโค้ด Python ของเราได้)

เมื่อต้องการทำสิ่งนี้ ให้คัดลอกไฟล์ cv2.pyd…

จากไดเร็กทอรี OpenCV นี้ (ส่วนเริ่มต้นอาจแตกต่างกันเล็กน้อยในเครื่องของคุณ):

# Python 2.7 และเครื่อง 64 บิต: F:\opencv\build\python\2.7\x64# Python 2.7 และเครื่อง 32 บิต: F:\opencv\build\python\2.7\x84

ไปยังไดเร็กทอรี Anaconda นี้ (ส่วนเริ่มต้นอาจแตกต่างกันเล็กน้อยในเครื่องของคุณ):

F:\Program Files\Anaconda2\Lib\site-packages

หลังจากทำตามขั้นตอนนี้แล้ว เราจะสามารถใช้ import cv2 ในโค้ด Python ได้ แต่เรายังต้องทำงานอีกเล็กน้อยเพื่อให้ FFMPEG (ตัวแปลงสัญญาณวิดีโอ) ทำงานได้ (เพื่อให้เราทำสิ่งต่างๆ เช่น ประมวลผลวิดีโอได้)

คลิกขวาที่ "คอมพิวเตอร์ของฉัน" (หรือ "พีซีเครื่องนี้" บน Windows 8.1) -> คลิกซ้ายที่คุณสมบัติ -> คลิกซ้ายที่แท็บ "ขั้นสูง" -> คลิกซ้ายที่ปุ่ม "ตัวแปรสภาพแวดล้อม…" เพิ่มตัวแปรผู้ใช้ใหม่ เพื่อชี้ไปที่ OpenCV (ทั้ง x86 สำหรับระบบ 32 บิตหรือ x64 สำหรับระบบ 64 บิต) ขณะนี้ฉันใช้เครื่อง 64 บิต

OPENCV_DIRC 32 บิต:\opencv\build\x86\vc12

64-บิตOPENCV_DIRC:\opencv\build\x64\vc12

ผนวก %OPENCV_DIR%\bin ต่อท้ายตัวแปรผู้ใช้ PATH

ตัวอย่างเช่น ตัวแปรผู้ใช้ PATH ของฉันมีลักษณะดังนี้…

ก่อน:

F:\Users\Johnny\Anaconda;C:\Users\Johnny\Anaconda\Scripts

หลังจาก:

F:\Users\Johnny\Anaconda;C:\Users\Johnny\Anaconda\Scripts;%OPENCV_DIR%\bin

แค่นี้เราก็เสร็จแล้ว! FFMPEG พร้อมใช้งานแล้ว!

ขั้นตอนที่ 4: ทดสอบเพื่อยืนยัน

ทดสอบเพื่อยืนยัน
ทดสอบเพื่อยืนยัน
ทดสอบเพื่อยืนยัน
ทดสอบเพื่อยืนยัน

เราต้องทดสอบว่าเราสามารถทำได้ใน Anaconda หรือไม่ (ผ่าน Spyder IDE):

  • นำเข้าแพ็คเกจ OpenCV
  • ใช้ยูทิลิตี้ FFMPEG (เพื่ออ่าน/เขียน/ประมวลผลวิดีโอ)

การทดสอบที่ 1: เราสามารถนำเข้า OpenCV ได้หรือไม่

เพื่อยืนยันว่าขณะนี้ Anaconda สามารถนำเข้าแพ็คเกจ OpenCV-Python (คือ cv2)

ออกสิ่งเหล่านี้ในคอนโซล IPython:

นำเข้า cv2

พิมพ์ cv2._version_

หากนำเข้าแพ็คเกจ cv2 ได้โดยไม่มีข้อผิดพลาด และเวอร์ชัน cv2 ถูกพิมพ์ออกมา แสดงว่าเราทุกคนทำได้ดี!

การทดสอบ 2: เราสามารถใช้ตัวแปลงสัญญาณ FFMPEG ได้หรือไม่

วางตัวอย่าง

input_video.mp4

ไฟล์วิดีโอในไดเร็กทอรี เราต้องการทดสอบว่าเราสามารถ:

  • อ่านไฟล์วิดีโอ.mp4 นี้และ
  • เขียนไฟล์วิดีโอใหม่ (อาจเป็น.avi หรือ.mp4 เป็นต้น)

ในการดำเนินการนี้ เราจำเป็นต้องมีโค้ด python ทดสอบ เรียกว่า test.py วางไว้ในไดเร็กทอรีเดียวกันกับตัวอย่าง

input_video.mp4

ไฟล์.

นี่คืออะไร

test.py

อาจดูเหมือน (หมายเหตุ: ขอบคุณมากสำหรับคำแนะนำของ Pete และ Warren ในช่องความคิดเห็น - ฉันได้แทนที่รหัสทดสอบดั้งเดิมของฉันด้วยรหัสของเขาแล้ว - โปรดทดสอบด้วยตัวเองและแจ้งให้เราทราบหากวิธีนี้ใช้ได้ผลดีกว่า):

นำเข้า cv2

cap = cv2. VideoCapture("input_video.mp4") พิมพ์ cap.isOpened() # True = อ่านวิดีโอสำเร็จ เท็จ - ไม่สามารถอ่านวิดีโอได้ fourcc = cv2. VideoWriter_fourcc(*'XVID') out = cv2. VideoWriter("output_video.avi", fourcc, 20.0, (640, 360)) print out.isOpened() # True = เขียนวิดีโอสำเร็จ เท็จ - ไม่สามารถเขียนวิดีโอได้ cap.release() out.release() ออก

การทดสอบนี้สำคัญมาก หากคุณต้องการประมวลผลไฟล์วิดีโอ คุณต้องแน่ใจว่า Anaconda / Spyder IDE สามารถใช้ FFMPEG (ตัวแปลงสัญญาณวิดีโอ) ฉันต้องใช้เวลาหลายวันกว่าจะใช้งานได้ แต่ฉันหวังว่ามันจะทำให้คุณใช้เวลาน้อยลงมาก!:)หมายเหตุ: อีกหนึ่งเคล็ดลับที่สำคัญมากเมื่อใช้ Anaconda Spyder IDE ตรวจสอบให้แน่ใจว่าคุณได้ตรวจสอบไดเรกทอรีการทำงานปัจจุบัน (CWD) !!!

ขั้นตอนที่ 5: สร้างรหัสสำหรับการตรวจจับใบหน้า

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

เป้าหมาย

ในเซสชั่นนี้

  • เราจะเห็นพื้นฐานของการตรวจจับใบหน้าโดยใช้ตัวแยกประเภท Cascade ที่ใช้ฟีเจอร์ของ Haar
  • เราจะขยายเช่นเดียวกันสำหรับการตรวจจับดวงตา ฯลฯ

การตรวจจับ Haar-cascade ใน OpenCV

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

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

นำเข้า cv2 face_cascade = cv2. CascadeClassifier ('F:/Program Files/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') eye_cascade = cv2. CascadeClassifier('F:/Program Files/opencv/sources/data/haarcascades/haarcascades/haar.xml') cap = cv2. VideoCapture(0) while 1: ret, img = cap.read() grey = cv2.cvtColor(img, cv2. COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.5, 5) สำหรับ (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] eyes = eye_cascade.detectMultiScale(roi_gray) สำหรับ (เช่น ey ew eh) ในสายตา: cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2) พิมพ์ "found " +str(len(faces)) +" face(s)" cv2.imshow ('img', img) k = cv2.waitKey(30) & 0xff if k == 27: break cap.release() cv2.destroyAllWindows()

ขั้นตอนที่ 6: สร้างรหัสเพื่อสร้างชุดข้อมูล

สร้างรหัสเพื่อสร้างชุดข้อมูล
สร้างรหัสเพื่อสร้างชุดข้อมูล
สร้างรหัสเพื่อสร้างชุดข้อมูล
สร้างรหัสเพื่อสร้างชุดข้อมูล

เรากำลังดำเนินการจดจำใบหน้า คุณจึงจำเป็นต้องมีรูปภาพใบหน้า! คุณสามารถสร้างชุดข้อมูลของคุณเองหรือเริ่มต้นด้วยฐานข้อมูลใบหน้าที่มีอยู่ https://face-rec.org/databases/ จะให้ภาพรวมที่เป็นปัจจุบันแก่คุณ ฐานข้อมูลที่น่าสนใจสามแห่งคือ (ส่วนหนึ่งของคำอธิบายอ้างอิงจาก

  • AT&T Facedatabase
  • Yale Facedatabase A
  • ฐานข้อมูล Facedatabase ของ Yale แบบขยาย B

ที่นี่ ฉันใช้ชุดข้อมูลของตัวเอง….ด้วยความช่วยเหลือของรหัสที่ให้ไว้ด้านล่าง:

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

นำเข้า cv2 face_cascade = cv2. CascadeClassifier ('F:/Program Files/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') cap = cv2. VideoCapture(0) id = raw_input('ป้อนรหัสผู้ใช้') sampleN=0; ในขณะที่ 1: ret, img = cap.read() grey = cv2.cvtColor(img, cv2. COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.3, 5) สำหรับ (x, y, w, h) ในใบหน้า: sampleN =ตัวอย่างN+1; cv2.imwrite("F:/Program Files/projects/face_rec/facesData/User"+str(id)+ "." +str(sampleN)+ ".jpg", สีเทา[y:y+h, x: x+w]) cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) cv2.waitKey(100) cv2.imshow('img', img) cv2.waitKey(1) ถ้า sampleN > 20: break cap.release() cv2.destroyAllWindows()

ขั้นตอนที่ 7: สร้างรหัสเพื่อฝึกผู้จดจำ

สร้างรหัสเพื่อฝึกผู้รู้จำ
สร้างรหัสเพื่อฝึกผู้รู้จำ

สร้างฟังก์ชั่นเตรียมชุดฝึก

ตอนนี้เราจะกำหนดฟังก์ชั่น

getImagesWithID (เส้นทาง)

ที่นำพา ธ สัมบูรณ์ไปยังฐานข้อมูลภาพเป็นอาร์กิวเมนต์อินพุตและส่งคืน tuple ของ 2 รายการ อันหนึ่งมีใบหน้าที่ตรวจพบ และอีกอันมีป้ายกำกับที่สอดคล้องกันสำหรับใบหน้านั้น ตัวอย่างเช่น หากดัชนี ith ในรายการใบหน้าแสดงถึงบุคคลที่ 5 ในฐานข้อมูล ตำแหน่ง ith ที่สอดคล้องกันในรายการป้ายกำกับจะมีค่าเท่ากับ 5

ตอนนี้แปลงหน้าชุดข้อมูล (ซึ่งสร้างในขั้นตอนที่ 6) เป็นไฟล์.yml ด้วยความช่วยเหลือของโค้ดที่ให้ไว้ด้านล่าง:

นำเข้าระบบปฏิบัติการ

นำเข้า numpy เป็น np นำเข้า cv2 จากการนำเข้า PIL Image # สำหรับการจดจำใบหน้า เราจะรู้จัก LBPH Face Recognizer = cv2.createLBPHFaceRecognizer(); path="F:/Program Files/projects/face_rec/facesData" def getImagesWithID(path): imagePaths = [os.path.join(path, f) for f in os.listdir(path)] # print image_path #getImagesWithID() เส้นทาง) ใบหน้า = IDs = สำหรับ imagePath ใน imagePaths: # อ่านรูปภาพและแปลงเป็นระดับสีเทา facesImg = Image.open(imagePath).convert('L') faceNP = np.array(facesImg, 'uint8') # รับป้ายกำกับของภาพ ID= int(os.path.split(imagePath)[-1].split(".")[1]) # ตรวจจับใบหน้าในภาพ faces.append(faceNP) IDs.append (ID) cv2.imshow("การเพิ่มใบหน้าสำหรับการฝึก", faceNP) cv2.waitKey(10) ส่งคืน np.array (IDs), รหัสใบหน้า, ใบหน้า = getImagesWithID(เส้นทาง) recognitionr.train (ใบหน้า, Ids) recognitionr.save ("F:/Program Files/projects/face_rec/faceREC/trainingdata.yml") cv2.destroyAllWindows()

โดยใช้รหัสนี้ชุดข้อมูลใบหน้าทั้งหมดแปลงเป็นไฟล์.yml ไฟล์เดียว…..ตำแหน่งเส้นทางคือ ("F:/Program Files/projects/face_rec/faceREC/trainingdata.yml")

ขั้นตอนที่ 8: สร้างรหัสเพื่อจดจำใบหน้าและผลลัพธ์

Guyzz นี่เป็นขั้นตอนสุดท้ายที่เราสามารถสร้างโค้ดเพื่อจดจำใบหน้าได้โดยใช้เว็บแคมของคุณในขั้นตอนนี้มีการดำเนินการสองขั้นตอนที่จะดำเนินการ…. 1. จับภาพวิดีโอจากกล้อง 2. เปรียบเทียบกับไฟล์.yml ของคุณ

นำเข้า numpy เป็น npimport cv2 face_cascade = cv2. CascadeClassifier('F:/Program Files/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') cap = cv2. VideoCapture(0) rec = cv2.createLBPHFaceRecognizer(); rec.load("F:/Program Files/projects/face_rec/faceREC/trainingdata.yml") id=0 font=cv2.cv. InitFont(cv2.cv. CV_FONT_HERSHEY_COMPLEX_SMALL, 5, 1, 0, 4) ในขณะที่ 1: ret, img = cap.read() grey = cv2.cvtColor(img, cv2. COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.5, 5) สำหรับ (x, y, w, h) ในใบหน้า: cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) id, conf=rec.predict(gray[y:y+h, x:x+w]) if(id==2): id="alok" if id==1: id="alok" if id==3: id="anjali" if id==4: id="Gaurav" if id= =5: id='rahul' if id==6: id="akshay" cv2.cv. PutText(cv2.cv.fromarray(img), str(id), (x, y+h), font, 255) cv2.imshow('img', img) ถ้า cv2.waitKey(1) == ord('q'): break cap.release()

cv2.destroyAllWindows()

และในที่สุดผลลัพธ์ก็จะปรากฏต่อหน้าคุณ……คุณสามารถดาวน์โหลดไฟล์ zip จากลิงค์ด้านล่าง: คลิกที่นี่เพื่อดาวน์โหลดรหัสดังนั้นในคำแนะนำนี้เราได้ดำเนินการตรวจจับใบหน้า + การจดจำโดยใช้ OpenCV….. ถ้าคุณ ชอบคำแนะนำนี้….. ได้โปรดสมัครสมาชิกฉันและโหวตให้ฉัน…..ขอบคุณเพื่อน ๆ:)

แนะนำ: