使用 Python 进行人脸识别(第2部分)
我们继续用 Python 编写人脸识别程序,在本节中,我们现在将进入代码部分。你可以先阅读第 1 部分
首先,让我们编写添加新用户的代码。
在这里,我们从相机中拍摄了 30 张照片,并保存在我们的文件夹中。我们将使用这些图像来训练我们的模型。我们正在创建一个小数据集。
# gerekli kütüphaneleri import ediyoruz
import
import
import
import
#dosya yolunu ekliyoruz
#Kameradan fotoğraf çekeceğiz, kamera için ayarlama yapıyoruz
#İnput olarak ad/soyad sorulacak,kullanıcı adı kayıtlıysa yeni klasör oluşturmaz,
#kayıtlı değilse kullanıcı adının yazdığı bir klasör oluşturur.
ifnot
else
whileTrue
if
break
for
if
break
import
cv2
import
numpy
as np
import
os
import
sys
path = os.path.dirname(os.path.abspath(__file__))
detector=cv2.CascadeClassifier(path+
r'/home/pi/Desktop/y2tube/haarcascade_frontalface_default.xml')
#cascade classifierı kaydettiğimiz#dosya yolunu ekliyoruz
#Kameradan fotoğraf çekeceğiz, kamera için ayarlama yapıyoruz
camera = cv2.VideoCapture(
0)
camera.set(
3,
640)
camera.set(
4,
480)
minW =
0.1*camera.get(
3)
minH =
0.1*camera.get(
4)
faceCascade = cv2.CascadeClassifier(
"/home/pi/Desktop/y2tube/haarcascade_frontalface_default.xml")
#İnput olarak ad/soyad sorulacak,kullanıcı adı kayıtlıysa yeni klasör oluşturmaz,
#kayıtlı değilse kullanıcı adının yazdığı bir klasör oluşturur.
name = input(
"AD/SOYAD? ")
dirName =
"/home/pi/Desktop/y2tube/dataset" + name
print(dirName)
ifnot
os.path.exists(dirName):
os.makedirs(dirName)
print(
"Klasör oluştruldu")
else
:
print(
"İsim önceden kullanılmış")
sys.exit()
count =
1whileTrue
:
if
count >
30:
#30 adet fotoğrafı çekip oluşturulan klasöre kaydedecekbreak
ret, im =camera.read()
gray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(gray, scaleFactor =
1.5, minNeighbors =
5)
for
(x, y, w, h)
in faces:
roiGray = gray[y:y+h, x:x+w]
fileName = dirName +
"/" + name + str(count) +
".jpg" cv2.imwrite(fileName, roiGray)
#cv2.imwrite() ile görüntüyü klasöre kaydediyoruz cv2.imshow(
"face", roiGray)
#cv2.imshow() ile görüntü pencereye eklenir,pencere görüntü boyutuna göre ayarlanır cv2.rectangle(im, (x, y), (x+w, y+h), (
0,
255,
0),
2)
#görüntüye yeşil çerçeve ekliyoruz count +=
1 cv2.imshow(
'im', im)
key = cv2.waitKey(
10)
#10 sn bekleif
key ==
27:
#ESC ye basıldığında kapatbreak
cv2.destroyAllWindows()
让我们训练模型。
#kütüphaneleri import edelim
import
import
from
import
import
# OpenCV paketinde bulunan LBPH (YEREL İKİLİ PATTERNS HISTOGRAMS) yüz tanıyıcı kullanıyoruz.
# Geçerli çalışma dizininin yolunu alınır ve images dizinine gidilir.
#Her görüntü için dizine gider ve görüntüleri arar.
#Görüntü mevcutsa, NumPy dizisine dönüştürüyoruz
for
for
if
ifnot
#Doğru görüntülere sahip olduğumuzdan emin olmak için yüz algılamayı tekrar gerçekleştiriyoruz.
#Ve sonra kıyaslama verilerini hazırlıyoruz
for
# Dizin adlarını ve etiket kimliklerini içeren sözlüğü saklıyoruz.
with
# Verileri eğiterek ve dosyayı kaydediyoruz.
import
os
import
numpy
as np
from
PIL
import Image
import
cv2
import
pickle
faceCascade = cv2.CascadeClassifier(
"/home/pi/Desktop/y2tube/haarcascade_frontalface_default.xml")
# OpenCV paketinde bulunan LBPH (YEREL İKİLİ PATTERNS HISTOGRAMS) yüz tanıyıcı kullanıyoruz.
recognizer = cv2.face.LBPHFaceRecognizer_create()
# Geçerli çalışma dizininin yolunu alınır ve images dizinine gidilir.
baseDir = os.path.dirname(os.path.abspath(__file__))
imageDir = os.path.join(baseDir,
"datasetyagmurkahya")
currentId =
1label_ids={}
y_labels=[]
x_train=[]
#Her görüntü için dizine gider ve görüntüleri arar.
#Görüntü mevcutsa, NumPy dizisine dönüştürüyoruz
for
root, dirs, files
in os.walk(imageDir):
print(root, dirs, files)
for
file
in files:
print(file)
if
file.endswith(
"png")
or file.endswith(
"jpg"):
path = os.path.join(root, file)
label = os.path.basename(root)
print(label)
ifnot
label
in label_ids:
label_ids[label] = currentId
print(label_ids)
currentId +=
1#Doğru görüntülere sahip olduğumuzdan emin olmak için yüz algılamayı tekrar gerçekleştiriyoruz.
#Ve sonra kıyaslama verilerini hazırlıyoruz
id_ = label_ids[label]
pilImage = Image.open(path).convert(
"L")
imageArray = np.array(pilImage,
"uint8")
faces = faceCascade.detectMultiScale(imageArray, scaleFactor=
1.1, minNeighbors=
5)
for
(x, y, w, h)
in faces:
roi = imageArray[y:y+h, x:x+w]
x_train.append(roi)
y_labels.append(id_)
# Dizin adlarını ve etiket kimliklerini içeren sözlüğü saklıyoruz.
with
open(
"labels",
"wb")
as f:
pickle.dump(label_ids, f)
f.close()
# Verileri eğiterek ve dosyayı kaydediyoruz.
recognizer.train(x_train,np.array(y_labels))
recognizer.save(
"/home/pi/Desktop/y2tube/trainner.yml")
print(label_ids)
现在我们将编写我们的解锁代码。
如果这个人是已知的,门将被解锁,如果不是,它不会被解锁。
import
import
import
import
import
from
from
import
with
whileTrue
for
# güven için 100'den küçük olup olmadığını kontrol et, 0 mükemmel eşleşme
if
# Ekrana kilidin açıldığı bilgisi verilir,kilit açılır 10 sn sonra tekrar kilitlenir
else
#bilinmeyen kullanıcı ise kilit açılmaz ve mail gönderilir
if
break
# Do a bit of cleanup
cv2,os
import
numpy
as np
import
pickle
import
RPi.GPIO
as GPIO
import
time
from
PIL
import Image
from
face_lock
import unlock,lock
import
smtpmail
as m
#smtp ile mail göndermek için yazdığımız kodu import ediyoruzid =
0names = [
'None',
'yagmurkahya']
with
open(
'labels',
'rb')
as f:
dicti = pickle.load(f)
f.close()
camera = cv2.VideoCapture(
0)
camera.set(
3,
640)
camera.set(
4,
480)
minW =
0.1*camera.get(
3)
minH =
0.1*camera.get(
4)
path = os.path.dirname(os.path.abspath(__file__))
faceCascade = cv2.CascadeClassifier(
"/home/pi/Desktop/y2tube/haarcascade_frontalface_default.xml")
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read(
"/home/pi/Desktop/y2tube/trainner.yml")
font = cv2.FONT_HERSHEY_SIMPLEX
prevTime =
0doorUnlock =
FalsewhileTrue
:
ret, im =camera.read()
gray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(gray, scaleFactor=
1.2, minNeighbors=
5, minSize=(
100,
100),flags=cv2.CASCADE_SCALE_IMAGE)
for
(x, y, w, h)
in faces:
cv2.rectangle(im, (x, y), (x + w, y + h), (
0,
255,
0),
2)
id, confidence = recognizer.predict(gray[y:y + h, x:x + w])
# güven için 100'den küçük olup olmadığını kontrol et, 0 mükemmel eşleşme
if
(confidence <
100):
id = names[id]
confidence =
" {0}%".format(round(
100 - confidence))
# Ekrana kilidin açıldığı bilgisi verilir,kilit açılır 10 sn sonra tekrar kilitlenir
print(
"Opening Lock")
unlock(
26)
time.sleep(
10)
lock(
26)
GPIO.cleanup(
26)
else
:
#bilinmeyen kullanıcı ise kilit açılmaz ve mail gönderilir
id =
"unknown" confidence =
" {0}%".format(round(
100 - confidence))
lock(
26)
m.mails()
cv2.putText(im, str(id), (x +
5, y -
5), font,
1, (
255,
255,
255),
2)
cv2.putText(im, str(confidence), (x +
5, y + h -
5), font,
1, (
255,
255,
0),
1)
cv2.imshow(
'camera', im)
k = cv2.waitKey(
10) &
0xff# Videodan çıkmak için 'ESC' tuşuna basınif
k ==
27:
break
# Do a bit of cleanup
print(
"\n [INFO] Exiting Program and cleanup stuff")
camera.release()
cv2.destroyAllWindows()
GPIO 引脚 电磁锁开关
import
import
defunlock(pin=26):#kilitleme fonksiyonu
deflock(pin=26):#kilit açma fonksiyonu
#GPIO.output(pin,False)
if
RPi.GPIO
as GPIO
import
time
defunlock(pin=26):#kilitleme fonksiyonu
GPIO.setmode(GPIO.BCM)
GPIO.setup(pin,GPIO.OUT)
GPIO.output(pin,
True)
deflock(pin=26):#kilit açma fonksiyonu
'''
Solenoid kilitli pininize taktığınız pin varsayılan olarak 26'dır.
'''
GPIO.setmode(GPIO.BCM)
GPIO.setup(pin,GPIO.OUT)
#GPIO.output(pin,False)
if
__name__ ==
'__main__':
unlock()
time.sleep(
10)
lock()
GPIO.cleanup(
26)
发送 SMTP 邮件
import
import
from
from
from
import
import
import
defmails():
smtplib
import
datetime
from
email.mime.multipart
import MIMEMultipart
from
email.mime.image
import MIMEImage
from
email.mime.text
import MIMEText
import
os
import
cv2
import
takepic
as t
now = datetime.datetime.now()
t.takepic()
defmails():
content=
"RAPOR" msg=MIMEMultipart()
k=
"someone tried to enter the house on time "+str(now.strftime(
"%Y-%m-%d %H:%M:%S"))
text = MIMEText(k)
msg.attach(text)
img_data = open(
"/home/pi/Desktop/y2tube/dataset1/NewPicture.jpg",
'rb').read()
image = MIMEImage(img_data, name=os.path.basename(
"/home/pi/Desktop/y2tube/dataset1/NewPicture.jpg"))
msg.attach(image)
mail=smtplib.SMTP(
"smtp.gmail.com",
587)
mail.ehlo()
mail.starttls()
mail.login(
"[email protected] mail adresiniz",
"******* sifreniz")
mail.sendmail(
"[email protected]",
"--------",msg.as_string())
mails()
发送 SMTP 邮件时的拍照功能
import
deftakepic():
while
cv2
deftakepic():
videoCaptureObject = cv2.VideoCapture(
0)
result =
Truewhile
(result):
ret,frame = videoCaptureObject.read()
cv2.imwrite(
"/home/pi/Desktop/y2tube/dataset1/NewPicture.jpg",frame)
result =
False videoCaptureObject.release()
cv2.destroyAllWindows()
takepic()
把人脸识别门锁项目的流程和代码分享给大家,希望对大家有用。
最新评论
推荐文章
作者最新文章
你可能感兴趣的文章
Copyright Disclaimer: The copyright of contents (including texts, images, videos and audios) posted above belong to the User who shared or the third-party website which the User shared from. If you found your copyright have been infringed, please send a DMCA takedown notice to [email protected]. For more detail of the source, please click on the button "Read Original Post" below. For other communications, please send to [email protected].
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。