import sys
import os
جهت دسترسی به دستورات لینوکس در محیط ادیتور پایتون است
import numpy as np
from face_recognition_system.videocamera import VideoCamera
from face_recognition_system.detectors import FaceDetector
import face_recognition_system.operations as op
import cv2
from cv2 import __version__
اضافه کردن کتابخانه های مورد نیاز که مستلزم نصب کتابخانه پردازش تصویراست
def get_images(frame, faces_coord, shape):
""" Perfrom transformation on original and face images.
This function draws the countour around the found face given by faces_coord
and also cuts the face from the original image. Returns both images.
"""
if shape == "rectangle":
faces_img = op.cut_face_rectangle(frame, faces_coord)
frame = op.draw_face_rectangle(frame, faces_coord)
faces_img = op.normalize_intensity(faces_img)
faces_img = op.resize(faces_img)
return (frame, faces_img)
این تابع کار دریافت اطلاعات تصویر و در نهایت دریافت خود تصویر راانجام میدهد.
def add_person(people_folder, shape):
""" Funtion to add pictures of a person
"""
person_name = input('What is the name of the new person: ').lower()
folder = people_folder + person_name
if not os.path.exists(folder):
input("I will now take 20 pictures. Press ENTER when ready.")
os.mkdir(folder)
video = VideoCamera()
detector = FaceDetector('face_recognition_system/frontal_face.xml')
counter = 1
timer = 0
cv2.namedWindow('Video Feed', cv2.WINDOW_AUTOSIZE)
cv2.namedWindow('Saved Face', cv2.WINDOW_NORMAL)
while counter < 21:
frame = video.get_frame()
face_coord = detector.detect(frame)
if len(face_coord):
frame, face_img = get_images(frame, face_coord, shape)
# save a face every second, we start from an offset '5' because
# the first frame of the camera gets very high intensity
# readings.
if timer % 100 == 5:
cv2.imwrite(folder + '/' + str(counter) + '.jpg',
face_img[0])
print ('Images Saved:' + str(counter))
counter += 1
cv2.imshow('Saved Face', face_img[0])
cv2.imshow('Video Feed', frame)
cv2.waitKey(50)
timer += 5
else:
print ("This name already exists.")
sys.exit()
این تابع کاراضافه کردن تصویر راانجام میدهد و نحوه عملکردآن اینگونه است که اگر برای
اولین باراین کارراانجام میدهید ایتدا یک اسم شخص و سپس 20 عکس از زوایای مختلف از شما میگیرد
و در مرحله بعد عکس به صورت خودکار به ادرس فولدری که در سیستم عامل تعیین کردیم ذخیره میشود.
def recognize_people(people_folder, shape):
""" Start recognizing people in a live stream with your webcam
"""
try:
people = [person for person in os.listdir(people_folder)]
except:
print ("Have you added at least one person to the system?")
sys.exit()
print ("This are the people in the Recognition System:")
for person in people:
print ("-" + person)
این تابع کار شناسایی تصویر رااز ادرس فولدری که تصاویر را درآن ذخیره کردیم برعهده دارد.
print (30 * '-')
print (" POSSIBLE RECOGNIZERS TO USE")
print (30 * '-')
print ("1. EigenFaces")
print ("2. FisherFaces")
print ("3. LBPHFaces")
print (30 * '-')
این قسمت استفاده از موتور های شناسایی است که همگی در همین کتابخانه است و انتخاب هر کدام از موتور ها به صورت
کاملا دلخواه است واینم بگم که هر کدوم کاربرد خاص خودشون رو دارند
(برای این پروژه از هر کدوم استفاده کردید خیلی فرقی نداره، هدف طرز استفاده و آشنایی با این موتور ها بوده)
choice = check_choice()
# detecting saved imgs
detector = FaceDetector('face_recognition_system/frontal_face.xml')
if choice == 1:
recognizer = cv2.face.createEigenFaceRecognizer())
threshold = 4000
elif choice == 2:
recognizer = cv2.face.createFisherFaceRecognizer()
threshold = 300
elif choice == 3:
recognizer = cv2.face.createLBPHFaceRecognizer()
threshold = 80
images = []
labels = []
labels_people = {}
for i, person in enumerate(people):
labels_people[i] = person
for image in os.listdir(people_folder + person):
images.append(cv2.imread(people_folder + person + '/' + image, 0))
labels.append(i)
try:
recognizer.train(images, np.array(labels))
except:
print ("\nOpenCV Error: Do you have at least two people in the database?\n")
sys.exit()
video = VideoCamera()
پس از اینکه موتور شناسایی را انتخاب کردیم دوربین برای شناسایی تصویر فعال میشود
while True:
frame = video.get_frame()
faces_coord = detector.detect(frame, False)
if len(faces_coord):
frame, faces_img = get_images(frame, faces_coord, shape)
for i, face_img in enumerate(faces_img):
if __version__ == "3.1.0":
collector = cv2.face.MinDistancePredictCollector()
recognizer.predict(face_img, collector)
conf = collector.getDist()
pred = collector.getLabel()
else:
pred, conf = recognizer.predict(face_img)
print ("Prediction: " + str(pred))
print ('Confidence: ' + str(round(conf)))
print ('Threshold: ' + str(threshold))
if conf < threshold:
cv2.putText(frame, labels_people[pred].capitalize(),
(faces_coord[i][0], faces_coord[i][1] - 2),
cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 1,
cv2.LINE_AA)
else:
cv2.putText(frame, "Unknown",
(faces_coord[i][0], faces_coord[i][1]),
cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 1,
cv2.LINE_AA)
cv2.putText(frame, "ESC to exit", (5, frame.shape[0] - 5),
cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255, 255), 1, cv2.LINE_AA)
cv2.imshow('Video', frame)
if cv2.waitKey(100) & 0xFF == 27:
sys.exit()
در این قسمت هم فریم ویدیو مورد برسی قرار میگیرد و در نهایت پس از اتمام کار خارج میگردد
def check_choice():
""" Check if choice is good
"""
is_valid = 0
while not is_valid:
try:
choice = int(input('Enter your choice [1-3] : '))
if choice in [1, 2, 3]:
is_valid = 1
else:
print ("'%d' is not an option.\n" % choice)
except ValueError:
print ("%s is not an option.\n" % str(error).split(": ")[1])
return choice
این قسمت دقیقا مثل یک منو عمل میکنه که کاربر میتونه گزینه مورد نظر خودش روانتخاب کنه.
if __name__ == '__main__':
print (30 * '-')
print (" POSSIBLE ACTIONS")
print (30 * '-')
print ("1. Add person to the recognizer system")
print ("2. Start recognizer")
print ("3. Exit")
print (30 * '-')
CHOICE = check_choice()
PEOPLE_FOLDER = "face_recognition_system/people/"
SHAPE = "rectangle"
if CHOICE == 1:
if not os.path.exists(PEOPLE_FOLDER):
os.makedirs(PEOPLE_FOLDER)
add_person(PEOPLE_FOLDER, SHAPE)
elif CHOICE == 2:
os.system("sudo modprobe bcm2835-v4l2") # Required for Raspi-Camera Module
recognize_people(PEOPLE_FOLDER, SHAPE)
elif CHOICE == 3:
sys.exit()
این قسمت هم رویداد های گزینه هایی رو که انتخاب کردیم اجرا میکنه
سلام ببخشید ماژول face_recognition_system رو با چه اسمی توی cmd نصب کنم
سلام فکر میکنم لینک زیر بتونه کمکتون کنه
سلام برای اینکه حضور وغیاب ثبت بشه باید به یک لب تاب وصل باشه یا کدی برای ارسال داده هست؟
لطفا بیشتر راهنمایی کنید.متشکرم
سلام غالبا یک سیستم عامل سبک مثل لینوکس روی سخت افزار نصب میکنید و برای همه این روالها کد مناسب میزنید
سلام وقت بخیر .قطعات مورد نیاز برای پروژه حضوروغیاب تصویری چی هست؟
سلام
احتمالا یه برد رزبری پای + یک دوربین (میتونه وبکم هم باشه) و شاید اگه بخواید چیزی رو نمایش بدید یه lcd 🙂
برای شروع خوبه ولی امنیت و دقت این پروژه ساده در عمل چقدر هست؟؟ ایا میشه واقعا باهاش در باز کن تصویری ساخت؟
سلام دوست عزیز
حرف شما درسته کاملا برای شروع مناسب است اما صرفا برای شروع نیست بلکه شما با رعایت یک سری آپشن های دیگر قادر خواهید بود که این کار را انجام دهید. و بسیار قدرتمند هم عمل میکند.
در سری های بعدی این آموزش، قدرت این کتابخانه را به همراه تلفیقی از کتابخانه های دیگر خواهید دید که با چه دقت و سرعتی عمل خواهد کرد.
موفق باشید.
مثل همیشه عالی خداقوت
ممنون دوست عزیز ان شالله در آموزش های بعدی پروژه های کاربردی که تلفیقی از هوش مصنوعی است را آموزش خواهیم داد.