Mar 232020
10.667 kez okundu
PYTHON VE OPENCV İLE YÜZ TANIMA
Aşağıdaki kodların orijinal halini https://www.hackster.io/mjrobot/real-time-face-recognition-an-end-to-end-project-a10826 adresinde bulabilirsiniz.
Mevcut kodları ve açıklamalarını kısmen Türkçeleştirdim.
Ortam bilgileri
İşletim sistemi: Ubuntu 18.04
Python 3.7
OpenCV: 4.0
Numpy: 1.17.2
PIL (Pillow): 6.2.1
1- Verilerin elde edilmesi : 01_yuz_veriseti.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# Original code from https://www.hackster.io/mjrobot/real-time-face-recognition-an-end-to-end-project-a10826 import cv2 kamera = cv2.VideoCapture(0) kamera.set(3, 640) # video genişliğini belirle kamera.set(4, 480) # video yüksekliğini belirle face_detector = cv2.CascadeClassifier('Cascades/haarcascade_frontalface_default.xml') # Her farklı kişi için farklı bir yüz tamsayısı ata # face_id = input('\n enter user id end press <return> ==> ') MAXFOTOSAY = 50 # Her bir yüz için kullanılacak imaj sayısı face_id = 1 print("\n [INFO] Kayıtlar başlıyor. Kameraya bak ve bekle ...") say = 0 while(True): ret, img = kamera.read() # img = cv2.flip(img, -1) # gerekiyorsa kullan gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) yuzler = face_detector.detectMultiScale(gray, 1.3, 5) for (x,y,w,h) in yuzler: cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2) say += 1 # Yakalanan imajı veriseti klasörüne kaydet cv2.imwrite("veriseti/" + str(face_id) + '.' + str(say) + ".jpg", gray[y:y+h,x:x+w]) cv2.imshow('imaj', img) print("Kayıt no: ",say) k = cv2.waitKey(100) & 0xff if k == 27: break elif say >= MAXFOTOSAY: break # Belleği temizle print("\n [INFO] Program sonlanıyor ve bellek temizleniyor.") kamera.release() cv2.destroyAllWindows() |
2- Veritabanının Eğitilmesi: 02_yuz_egitimi.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# Original code from https://www.hackster.io/mjrobot/real-time-face-recognition-an-end-to-end-project-a10826 import cv2 import numpy as np from PIL import Image import os # Verilerin yolu path = 'veriseti' recognizer = cv2.face.LBPHFaceRecognizer_create() detector = cv2.CascadeClassifier("Cascades/haarcascade_frontalface_default.xml") # imajların alınması ve etiketlenmesi için fonksiyon def getImagesAndLabels(path): imagePaths = [os.path.join(path,f) for f in os.listdir(path)] ornekler=[] ids = [] for imagePath in imagePaths: PIL_img = Image.open(imagePath).convert('L') # gri img_numpy = np.array(PIL_img,'uint8') id = int(os.path.split(imagePath)[-1].split(".")[0]) # print("id= ",id) yuzler = detector.detectMultiScale(img_numpy) for (x,y,w,h) in yuzler: ornekler.append(img_numpy[y:y+h,x:x+w]) ids.append(id) return ornekler,ids print ("\n [INFO] yuzler eğitiliyor. Birkaç saniye bekleyin ...") yuzler,ids = getImagesAndLabels(path) recognizer.train(yuzler, np.array(ids)) # Modeli egitim/egitim.yml dosyasına kaydet recognizer.write('egitim/egitim.yml') # Dikkat! recognizer.save() Raspberry Pi üzerinde çalışmıyor # Eğitilen yüz sayısını göster ve kodu sonlandır print(f"\n [INFO] {len(np.unique(ids))} yüz eğitildi. Betik sonlandırılıyor.") # print(yuzler) |
3- Yüz tanıma işlemleri: 03-yuz_tanima.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# Original code from https://www.hackster.io/mjrobot/real-time-face-recognition-an-end-to-end-project-a10826 import cv2 import numpy as np from PIL import Image, ImageDraw, ImageFont def print_utf8_text(image, xy, text, color): # utf-8 karakterleri fontName = 'FreeSerif.ttf' # 'FreeSansBold.ttf' # 'FreeMono.ttf' 'FreeSerifBold.ttf' font = ImageFont.truetype(fontName, 24) # font seçimi img_pil = Image.fromarray(image) # imajı pillow moduna dönüştür draw = ImageDraw.Draw(img_pil) # imajı hazırla draw.text((xy[0],xy[1]), text, font=font, fill=(color[0], color[1], color[2], 0)) # b,g,r,a image = np.array(img_pil) # imajı cv2 moduna çevir (numpy.array()) return image recognizer = cv2.face.LBPHFaceRecognizer_create() recognizer.read('egitim/egitim.yml') cascadePath = "Cascades/haarcascade_frontalface_default.xml" faceCascade = cv2.CascadeClassifier(cascadePath); font = cv2.FONT_HERSHEY_SIMPLEX # id sayacını başlat id = 0 names = ['None', 'Ahmet','Toygar'] # Canlı video yakalamayı başlat kamera = cv2.VideoCapture(0) kamera.set(3, 1000) # video genişliğini belirle kamera.set(4, 800) # video yüksekliğini belirle # minimum pencere boyutunu belirle minW = 0.1 * kamera.get(3) # genişlik minH = 0.1 * kamera.get(4) # yükseklik while True: ret, img = kamera.read() gri = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) yuzler = faceCascade.detectMultiScale( gri, scaleFactor=1.2, minNeighbors=5, minSize=(int(minW), int(minH)), ) for (x, y, w, h) in yuzler: cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) id, uyum = recognizer.predict(gri[y:y + h, x:x + w]) if (uyum < 100): id = names[id] uyum = f"Uyum= {round(uyum,0)}%" else: id = "bilinmiyor" uyum = f"Uyum= {round(uyum,0)}%" color = (255,255,255) img=print_utf8_text(img,(x + 5, y - 25),str(id),color) # Türkçe karakterler # cv2.putText(img, str(id), (x + 5, y - 5), font, 1, (255, 255, 255), 2) cv2.putText(img, str(uyum), (x + 5, y + h + 25), font, 1, (255, 255, 0), 1) cv2.imshow('kamera', img) k = cv2.waitKey(10) & 0xff # Çıkış için Esc veya q tuşu if k == 27 or k==ord('q'): break # Belleği temizle print("\n [INFO] Programdan çıkıyor ve ortalığı temizliyorum") kamera.release() cv2.destroyAllWindows() |
Kamera ve görüntü kontrolü – simpleCamTest.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# https://www.hackster.io/mjrobot/real-time-face-recognition-an-end-to-end-project-a10826 import numpy as np import cv2 cap = cv2.VideoCapture(1) cv2.namedWindow('frame') cv2.moveWindow('frame',10,10) cv2.namedWindow('gray') cv2.moveWindow('gray',690,10) cap.set(3, 640) # set Width cap.set(4, 480) # set Height while (True): ret, frame = cap.read() # frame = cv2.flip(frame, -1) # Flip camera vertically gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.imshow('frame', frame) cv2.imshow('gray', gray) k = cv2.waitKey(30) & 0xff if k == 27 or k==ord('q'): # press 'ESC' or 'q' to quit break cap.release() cv2.destroyAllWindows() |
Soru ve önerilerinizi lütfen yorum alanından paylaşın.
Ahmet Aksoy
1. program 21. satırda hata veriyor.. Neden yapıyor olabilir?
Desteğiniz için teşekkürler…
[INFO] Kayıtlar başlıyor. Kameraya bak ve bekle …
Traceback (most recent call last):
File “C:/Users/ERMENER/Yüz seti tanımlama/01_yuz_veriseti.py”, line 22, in
yuzler = face_detector.detectMultiScale(
cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\objdetect\src\cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function ‘cv::CascadeClassifier::detectMultiScale’
[ WARN:1] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (674) SourceReaderCB::~SourceReaderCB terminating async callback
Process finished with exit code 1
Hatası veriyor.
cv2.CascadeClassifier(cv2.data.haarcascades + ‘haarcascade_frontalface_default.xml’)
bu şekilde kullanmanız daha doğru olacaktır path i bulabilmesi için
Uyarınız için teşekkür ediyorum.
Bu özellik yeni OpenCV kütüphanelerinde yer alıyor. Ama, cascade dosyalarının yapısını da görmek isterseniz, ilgili xml dosyalarını indirmek daha yararlı olabilir.
id = names[id]
IndexError: list index out of range
bu error veriyor sizce neden olabilir
names[] listesi doğru tanımlanmamış olabilir. Lütfen kontrol edin.