OpenCV ile Yüz Tanıma Bölüm 2
Bu bölümde 3 ayrı betik kullanıyoruz:
1- veri toplama: 01_face_dataset.py
2- eğitim: 02_face_training.py
3- uygulama: 03_face_recognition.py
Orijinal kodlara https://www.hackster.io/mjrobot/real-time-face-recognition-an-end-to-end-project-a10826 adresinden ulaşabilirsiniz.
Ben veri kümesini yeniden oluşturdum. Türkçe karakterlerin görüntülenebilmesi için gerekli düzenlemeyi yaptım ve bazı mesajları Türkçeleştirdim.
İlk betikte input() komutunu # ile devre dışı bıraktım. Yeni bir yüz tanıtırken face_id sayısını doğrudan tanımladım. Örneğimizde 4 yüz tanımlı. Her yüz için 30 kare dataset klasörüne kaydedildi. Siz de kendi verilerinizi kaydetmeli ve eğitmelisiniz.
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 |
# 01_face_dataset.py import 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('Cascades/haarcascade_frontalface_default.xml') # For each person, enter one numeric face id # face_id = input('\n enter user id end press <return> ==> ') face_id = 1 print("\n [INFO] Initializing face capture. Look at the camera and wait ...") # Initialize individual sampling face count count = 0 while(True): ret, img = cam.read() # img = cv2.flip(img, -1) # flip video image vertically gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_detector.detectMultiScale(gray, 1.3, 5) for (x,y,w,h) in faces: cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2) count += 1 # Save the captured image into the datasets folder cv2.imwrite("dataset/User." + str(face_id) + '.' + str(count) + ".jpg", gray[y:y+h,x:x+w]) cv2.imshow('image', img) k = cv2.waitKey(100) & 0xff # Press 'ESC' for exiting video if k == 27: break elif count >= 30: # Take 30 face sample and stop video break # Do a bit of cleanup print("\n [INFO] Exiting Program and cleanup stuff") cam.release() cv2.destroyAllWindows() |
İlk betiğimizde cv2 ve os kütüphanelerini kullanıyoruz.
Görüntüleri webcam üzerinden elde edeceğiz. Görüntülerimizin eni 640, yüksekliği 480 piksel olarak tanımlandı (satır 5 ve 6).
7 nolu satırda cepheden yüz sınıflandırıcısını tanımlıyoruz.
face_id yüz görüntülerini eğiteceğimiz kullanıcı numarasını belirtiyoruz. Eğer input() satırını kullanmak isterseniz 9.satırın başındaki # işaretini silip, 10. satırın başına # eklemelisiniz.
count değişkenini görüntü sayısını takip etmek için kullanacağız.
Kayıt işlemlerimiz 15. satırdaki sonsuz while döngüsüyle başlıyor.
16. satırda kamera görüntüsünü alıyoruz. ret değişkeni işlevsizdir. Bu değişken video dosyasından okuma yaparken işimize yarıyor.
Görüntü karesini griye çevirip içindeki yüzleri saptıyoruz. (Satır 18 ve 19.)
Aslında her karede sadece 1 kişiye ait tek bir yüz bulunmalı. Yine de burada bir döngü kullanıyoruz. Aslında döngüdeki enbüyük dikdörtgeni seçsek daha doğru olurdu. Ama kodu gereksiz yere uzatmamak için bu tür ayrıntılara girmiyoruz.
Yakalanan her yüz için count değerini 1 arttırıyor (satır 22) ve yüz görüntüsünü dataset klasörüne kaydediyoruz. Kaydedilen görüntünün boyutları yüzün boyutları ile aynı. Yani webcam tarafından yakalanan görüntünün tümünü kullanmıyoruz. (Satır 24)
25.satırda kamera görüntüsünü (tamamını) ekrana yansıtıyoruz.
k değişkeni ile 100 milisaniye içinde bir tuşa basılıp basılmadığını kontrol ediyoruz.
Eğer ‘Esc’ tuşuna basıldıysa (sayısal karşılığı 27 olan tuş) döngüyü kırıyor, basılmadıysa bu kez count değerinin 30’u aşıp aşmadığını denetliyoruz. Sayı 30’u aştıysa döngüyü yine kırıyoruz. Çünkü her kişi için 30 görüntü kaydediyoruz.
Son iki satırda kamerayı serbest bırakıyor ve belleği temizliyoruz.
“dataset” klasörünün içine bakarsanız, verdiğiniz kullanıcı numarasına karşılık gelen 30 adet resim göreceksiniz.
Kullanıcı sayısını (yüz görüntülerini kaydedeceğiniz kişi sayısını) istediğiniz kadar arttırabilirsiniz. (Elbette en az bir kişi olmalı!)
Verilerimizi tamamladığımızda işimiz bitmiyor. Şimdi bu veri kümesini eğitmemiz lazım. İkinci betiğimizin işlevi bu!
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 |
import cv2 import numpy as np from PIL import Image import os # Path for face image database path = 'dataset' recognizer = cv2.face.LBPHFaceRecognizer_create() detector = cv2.CascadeClassifier("Cascades/haarcascade_frontalface_default.xml"); # function to get the images and label data def getImagesAndLabels(path): imagePaths = [os.path.join(path,f) for f in os.listdir(path)] faceSamples=[] ids = [] for imagePath in imagePaths: PIL_img = Image.open(imagePath).convert('L') # convert it to grayscale img_numpy = np.array(PIL_img,'uint8') id = int(os.path.split(imagePath)[-1].split(".")[1]) faces = detector.detectMultiScale(img_numpy) for (x,y,w,h) in faces: faceSamples.append(img_numpy[y:y+h,x:x+w]) ids.append(id) return faceSamples,ids print ("\n [INFO] Training faces. It will take a few seconds. Wait ...") faces,ids = getImagesAndLabels(path) recognizer.train(faces, np.array(ids)) # Save the model into trainer/trainer.yml recognizer.write('trainer/trainer.yml') # recognizer.save() worked on Mac, but not on Pi # Print the numer of faces trained and end program print("\n [INFO] {0} faces trained. Exiting Program".format(len(np.unique(ids)))) |
İkinci -eğitim- betiğimizde opencv ve os yanısıra numpy ve pillow kütüphanelerini kullanıyoruz.
Veri klasörümüzün adı ‘dataset’. Bu bilgiyi path değişkeninde tutuyoruz.
Veri kümemizin eğitimini cv2.face.LBPHFaceRecognizer_create() komutuyla oluşturduğumuz recognizer (satır 7) üzerinden yapacağız.
Görüntülerdeki yüz alanlarını ayırmak için yine ‘haarcascade_frontalface_default.xml’ filtresinden yararlanacağız. Filtre değişkenimizin adı: detector. (satır 8)
Görüntü etiketlerimizi almak için getImagesAndLabels() fonksiyonunu kullanıyoruz.
ImagePaths listesi, path klasörü içinde yer alan dosyaların listesidir.
faceSamples listesi yüz görüntülerini, ids listesi ise her bir görüntünün etiketini tutacak.
imagePaths listesindeki her bir elemanı (dosya adını) kullanarak ilgili resmi okuyup griye dönüştürüyor ve PIL_img değişkenine atıyoruz (satır 15). Sonra bu görüntüleri 8 bitlik pozitif tamsayılardan oluşan bir numpy dizisi (array) haline dönüştürüyoruz (satır 16).
17 numaralı satırda, dosya adından kişi numarasını ayırıp, bir tam sayı olarak id değişkenine atıyoruz.
img_numpy görüntü numpy dizisinde bulunan yüz alanlarını bulup faces listesine atıyoruz. Yüzleri içeren listeyi döngüye sokup her bir görüntüyü faceSamples, ona karşılık gelen etiketi ise ids listesine ekliyoruz.
Fonksiyonumuz faceSamples ve ids listelerini döndürüyor.
24 numaralı satırda faces ve ids listeleri oluşturuluyor.
25 nolu satırda ise veri kümemizi eğitiyoruz.
Eğitilmiş veriseti bilgileri 27. satırda trainer klasörü içindeki trainer.yml dosyasına kaydediliyor. Bu dosyayı son betiğimizdeki görüntüleri sınıflandırırken kullanacağız.
Son betiğimiz şöyle:
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 67 68 69 |
# 03_face_recognition.py import cv2 import numpy as np from PIL import Image, ImageDraw, ImageFont # UTF-8 string printing enabled def print_utf8_text(image, xy, text, color): # utf-8 characters fontName = 'FreeSerif.ttf' # 'FreeSansBold.ttf' # 'FreeMono.ttf' 'FreeSerifBold.ttf' font = ImageFont.truetype(fontName, 24) # select font img_pil = Image.fromarray(image) # convert image to pillow mode draw = ImageDraw.Draw(img_pil) # prepare image 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) # convert image to cv2 mode (numpy.array()) return image recognizer = cv2.face.LBPHFaceRecognizer_create() recognizer.read('trainer/trainer.yml') cascadePath = "Cascades/haarcascade_frontalface_default.xml" faceCascade = cv2.CascadeClassifier(cascadePath); font = cv2.FONT_HERSHEY_SIMPLEX # initiate id counter id = 0 # names related to ids: example ==> Marcelo: id=1, etc # names = ['None', 'Marcelo', 'Paula', 'Ilza', 'Z', 'W'] names = ['None', 'Ahmet','Toygar','Nilden','Nilüfer'] # Initialize and start realtime video capture cam = cv2.VideoCapture(0) cam.set(3, 1000) # set video widht cam.set(4, 800) # set video height # Define min window size to be recognized as a face minW = 0.1 * cam.get(3) minH = 0.1 * cam.get(4) while True: ret, img = cam.read() # img = cv2.flip(img, -1) # Flip vertically gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = faceCascade.detectMultiScale( gray, scaleFactor=1.2, minNeighbors=5, minSize=(int(minW), int(minH)), ) for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) id, confidence = recognizer.predict(gray[y:y + h, x:x + w]) # Check if confidence is less them 100 ==> "0" is perfect match if (confidence < 100): id = names[id] confidence = " {0}%".format(round(100 - confidence)) else: id = "bilinmiyor" confidence = " {0}%".format(round(100 - confidence)) color = (255,255,255) img=print_utf8_text(img,(x + 5, y - 25),str(id),color) # 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), font, 1, (255, 255, 0), 1) cv2.imshow('camera', img) k = cv2.waitKey(10) & 0xff # Press 'ESC' for exiting video if k == 27 or k==ord('q'): break # Do a bit of cleanup print("\n [INFO] Programdan çıkıyor ve ortalığı temizliyorum") cam.release() cv2.destroyAllWindows() |
Kamera görüntülerindeki yüzleri yakalayıp kime ait olduklarını belirten betiğimiz bu. Kullanacağımız kütüphaneler opencv, numpy ve pillow.
print_utf8_text() fonksiyonunu bir önceki yazımda anlatmıştım. Türkçe karakterleri bu fonksiyon aracılığıyla bastırıyoruz.
Yüz tanıma nesnemiz recognizer‘a trainer.yml dosyası aracılığıyla eğitilmiş verisetimizi yüklüyoruz (satır 18 ve 19).
Canlı kamera görüntülerindeki yüzleri de yine haarcascade_frontalface_default.xml filtresi aracılığıyla yakalayacağız. Filtre değişkenimiz faceCascade (satır 20 ve 21).
22 nolu satırda orijinal betikte kullanılan font tanımlanıyor. Biz bu fontu da kullanacağız.
Kişi numaraları id değikeninde tutulacak. (Satır 24)
Etiketleri (isimleri) ise names listesiyle tanımlıyoruz.
Web kamerasının görüntüsünü cam değişkenine aktarıyoruz ve görüntü boyutlarını 1000 ve 800 piksel olarak ayarlıyoruz. (Bu değerleri 640 ve 480 olarak da bırakabilirdik.)
minW ve minH değişkenleri yakalanan yüz dikdörtgenlerinin boyutu için alt sınır değerleridir (satır 33 ve 34). Bu değerleri kendi ortamınıza göre değiştirebilirsiniz.
35 nolu satırda sonsuz döngümüz başlıyor.
36. satırda kamera görüntüsünü okuyor, 38. satırda bu görüntüyü grileştiriyoruz.
40 nolu satırda görüntü karesindeki tüm yüzleri yakalıyor; 46. satırda ise bu yüz dikdörtgenlerini bir döngü içinde işleme sokuyoruz.
recognizer.predict() metodu id ve confidence değerlerini döndürüyor. id kişi numarası; confidence ise yapılan saptamanın tahmini doğruluk oranıdır (satır 48).
id ve confidence değişkenlerini print için uygun hale getiriyoruz (satır 50-55).
58 nolu satırda kişi ismini UTF-8 kullanarak (Türkçe karakterleri doğru şekilde yansıtarak), 60 nolu satırda ise belirtilen kişinin tahmini doğruluk oranını standart font ile görüntüye işliyoruz.
Görüntünün ekrana yansıtılması 62 nolu satırda.
Döngümüz yine Esc veya q tuşlarından birine basıldığında kırılıyor.
Döngü kırıldığında web kamerayı sonlandıyor ve belleği temizliyoruz (satır 68-69).
Bu betiğin çalışmasını gösteren örnek video aşağıda.
Bu yazı, açıklamaları olabildiğince kısa tutsam da biraz uzunca oldu. Umarım yeterince açıklayıcıdır. Sorularınız için yorum alanını kullanabilirsiniz.
Bir sonraki yazımda yine yüz tanıma olacak. Ancak veri kümemizi oluşturmak ve eğitmek için farklı yöntemler kullanacağız.
Beni izlemeye devam edin.
Ahmet Aksoy
Öncelikle güzel bilgileriniz için teşekkür ederim. Ben denedim 2 kişinin yüzü için. Ama 2 kişinin yüzünü alırken 2 kişinin yüzü toplam 30 tane resim oluyor. Sebebi ne olabilir acaba? Bu bilgilerden yararlanarak proje olarak öğrencilerin günlük yüzlerindeki duygu hislerini alıp veri tabanına atmak istiyorum. İnşallah yaparım.
Teşekkür ederim.
30 resim sınırı betiğin içinde tanımlı. İsterseniz bu sayıyı değiştirebilirsiniz.
Yüz ifadelerini veritabanına atmak için onları önceden klasifiye etmeniz lazım: gülüyor, ağlıyor, üzgün, kızgın, vb. Bu sınıflandırmayı tek tek resimlere uygulamanız lazım. Bu nedenle betiğin resim üretme yöntemi işinize pek fazla yaramayabilir.
Bu konu için “sentiment analysis”-“duygu analizi” konusunu araştırmanızda yarar var.
Bide kodda eğitirken kişileri tek tek mi alacağız acaba?
Hayır. Eğitim sırasında çalışma klasörünüzün altında açtığınız dataset isimli klasörün içinde yer alan tüm kullanıcı görüntüleri birlikte eğitilir.
Her kullanıcıyı tanıtırken ayrı bir numara vermeniz lazım.
dataset klasörü içindeki dosya sayısı (resim) kullanıcı sayısı * 30 kadar olmalı.
2 kullanıcı içi 60, 3 kullanıcı için 90 vb.
Sadece 60 dosya varsa, tek bir kullanıcı tanıtmışsınız demektir.
Eğitme kodunda aşağıdaki hatayı alıyorum acaba ne olabilir ki?
C:\ProgramData\Anaconda3\python.exe C:/Users/……../PycharmProjects/udemyegitim/yuz3.py
[INFO] Training faces. It will take a few seconds. Wait …
Traceback (most recent call last):
File “C:/Users/resul-melike/PycharmProjects/udemyegitim/yuz3.py”, line 25, in
faces,ids = getImagesAndLabels(path)
File “C:/Users/resul-melike/PycharmProjects/udemyegitim/yuz3.py”, line 16, in getImagesAndLabels
PIL_img = Image.open(imagePath).convert(‘L’) # convert it to grayscale
File “C:\ProgramData\Anaconda3\lib\site-packages\PIL\Image.py”, line 2609, in open
fp = builtins.open(filename, “rb”)
PermissionError: [Errno 13] Permission denied: ‘dataset\\User’
Process finished with exit code 1
Windows dataset klasörüne erişim hakkınız olmadığını söylüyor.
1- dataset klasörünü çalışma klasörünüzün içinde açmanız lazım
2- dataset klasörü doğru yerdeyse ve hala yetki sorununuz varsa, programı “super user” olarak kullanmayı deneyin.
videodaki % li ifadeler nedir acaba ?
Tahmini doğruluk oranları.
bağışlayın anlıyamadım doğruluk derken neyi kastediyorsunuz ?
48. satırda iki değer geri döndürülüyor:
id, confidence = recognizer.predict(gray[y:y + h, x:x + w])
id: tahmini olarak bulunan kişiye ait kimlik no
confidence: Güvenilirlik oranı.
Eğer bu oran %100 ise, hesaplara göre yanılma payı yok demektir. Ama %100 oranı tercih edilmez. Öğrenme değil, ezberleme olarak kabul edilir. Ezberleme durumunda, farklı veriyi değerlendirirken yanılma payı çok daha büyük olur.
%95 üzerinde olan ama %100’den küçük olan doğruluk oranları tercih edilir.
Diyelim ki kendine ve arkadaşlarına ait görüntülerle sistemini eğittin.
Veri setinde yer almayan bir başka resmi verip kime ait olduğunu sorguladığında, %80 yanıtı aldıysan, sonuç %80 ihtimalle adı verilen kişiye aittir anlamı taşır.
Traceback (most recent call last):
File “C:/Users/asus/PycharmProjects/untitled/proje.py”, line 18, in
faces = face_detector.detectMultiScale(gray, 1.3, 5)
cv2.error: OpenCV(3.4.4) C:\projects\opencv-python\opencv\modules\objdetect\src\cascadedetect.cpp:1698: error: (-215:Assertion failed) !empty() in function ‘cv::CascadeClassifier::detectMultiScale’
[ WARN:0] terminating async callback
Böyle bir sorunla karşılaştım neden olabilir
“Cascades/haarcascade_frontalface_default.xml” dosyasına ulaşılamıyor. Bu dosyaları github üzerinden indirip bilgisayarınıza kopyalamış olmalısınız. İlgili linkler yazının ilk bölümünün sonunda yer almaktadır.
Son kısımda kodu çalıştırdığımda kamera açılıyor,bir şey görmediğinde kamera açık kalmaya devam ediyor ama kendi yüzümü ya da herhangi birinin yüzünü gösterdiğimde ;
Traceback (most recent call last):
File “C:/Users/asus/PycharmProjects/untitled/iremovic.py”, line 56, in
img=print_utf8_text(img,(x + 5, y – 25),str(id),color)
File “C:/Users/asus/PycharmProjects/untitled/iremovic.py”, line 8, in print_utf8_text
font = ImageFont.truetype(fontName, 24) # select font
File “C:\Users\asus\Anaconda3\lib\site-packages\PIL\ImageFont.py”, line 260, in truetype
return FreeTypeFont(font, size, index, encoding, layout_engine)
File “C:\Users\asus\Anaconda3\lib\site-packages\PIL\ImageFont.py”, line 143, in __init__
self.font = core.getfont(font, size, index, encoding, layout_engine=layout_engine)
OSError: cannot open resource
Process finished with exit code 1
hatası verip kamera direkt kapanıyor,ne yapabilirim
def print_utf8_text(image, xy, text, color): # utf-8 characters
fontName = ‘FreeSerif.ttf’ # ‘FreeSansBold.ttf’ # ‘FreeMono.ttf’ ‘FreeSerifBold.ttf’
….
Windows altında çalıştığınız için ‘FreeSerif.ttf’ dosyasını bulamıyor.
Onun yerine Tahoma.ttf, Verdana.ttf, Times.ttf gibi Windows’a özgü dosyaları deneyebilirsiniz.
Öncelikle bu paylaşım ve cevaplarınız için çok teşekkür ederim.
Şöyle bir sorunla karşılaştım,datasette fotoğrafı bulunan kişilere %50 oranında tahminlerde bulunuyor ancak datasette olmayan kişilere bilinmiyor demiyor onlara da tahminlerde bulunuyor.
Datasete daha çok fotoğraf ekleyerek bunun önüne geçebilir miyim,ya da başka ne yapabilirim?
Merhaba İrem hanım,
Tanıttığınız kişilere ait fotoğraf sayısını olabildiğince çoğaltıp, gerekirse parametrelerle de oynayarak tanıma oranlarını %90’lara çektikten sonra, düşük tanıma oranlarını “bilinmiyor” şeklinde etiketlemek mümkün olabilir.
Örnekte kişilere ait sadece 30’ar görüntü kullandık. Bu sayı olağanüstü derecede küçük. Bu sayıların en azından binlerle ifade edilebilmesi ve “augmentation” kullanılarak çoğullanması gerekir.
Elbette verisetini büyüterek yapılan eğitimden sonraki sorgulamalar da daha fazla işlem gücü gerektirecektir. Bunun da farkında olmak gerekir.
Merhaba,bu projeye ardunio eklemek istiyorum.
Eğer kameranın gördüğü kişi datasette olan biri ise yeşil ışık,datasette olmayan biri ise kırmızı ışık yanan bir proje yapmak istiyorum. Bu mümkün mü acaba? mümkünse nasıl yapabilirim,şimdiden teşekkürler..
Hocam ;
Öncelikle yaptığınız güzel çalışmalardan ötürü sizlere teşekkürü borç bilirim.
Daha önce de yapılan yorumları da okudum diğer web sitelerinde de araştırdım işin içinden çıkamadım yardımlarınızı bekliyorum.
Traceback (most recent call last):
[INFO] Training faces. It will take a few seconds. Wait …
File “C:/Users/kaanmelt/PycharmProjects/d11/yuz_tanima/egitim.py”, line 25, in
recognizer.train(faces,np.array(ids))
cv2.error: OpenCV(3.4.2) C:\Miniconda3\conda-bld\opencv-suite_1534379934306\work\opencv_contrib-3.4.2\modules\face\src\lbph_faces.cpp:362: error: (-210:Unsupported format or combination of formats) Empty training data was given. You’ll need more than one sample to learn a model. in function ‘cv::face::LBPH::train’
Process finished with exit code 1
Data adresinde bir sorun olması ihtimal dahilinde. “Empty training data was given.” mesajı bunu çağrıştırıyor.
Hocam iyi günler.Ben projemde yüz tanıma yapmaya çalışıyorum ve bir kaç sorun var.Bu konuda size danışmak istedim.
Öncelikle tanıma oranını artırmak için görüntü sayısını artırdım fakat oran istenilen seviyelere gelmedi.Şu an 500 görüntü aldım ve 53-54 seviyelerinde tanınma oranı.Açıkçası bunu daha fazla nasıl artırabilirim bunu merak ettim.
İkinci olarak ta eşleştirmeyi video üzerinden değil de fotoğraf çekip fotoğraf üzerinden yapmak istiyorum.Burda ne yapmam lazım.Yardımcı olabilirseniz çok sevinirim.
Merhaba,
Bu tür çalışmalar deneyseldir. Bu nedenle tanıma oranını arttırmanın net bir formülü yok. Örnek sayısını arttırmak bunlardan biridir. Örnek görsellerin içeriği de önemli bir faktör.
Fotoğraf kullanmak istiyorsanız “while True: ” döngüsüne ve onun altındaki “ret,img = cam.read()” satırına ihtiyacınız yok.
Kamera yerine görüntü dosyasını tanımlayın ve onu okutun.
Kolay gelsin.
hocam çok saolun öncelikle bu uğraş adına teşekkür az kalır benim sorun 3 kişi için ilk eğitilen fotoğrafın tahminini tüm fotolar için yapıyor yani sayıyı 80 lere çektim yine değişen bişi olmadı siz bunu nasıl önlediniz ilk tanıttığım kişinin ismini diğer örnekler üzerindede göstermesi sadece tek örneği eğitip diğerlerini pas geçtiği hissi uyandırıyor bunun önüne nasıl geçebiliriz
Merhaba,
Kullanıcı tanımlama işlemleri ekran karşısında yapılıyor ve her kullanıcı için maksimum 30 görüntü alınıp saklanıyor.
Burada önemli olan nokta her yeni kullanıcı için face_id değerinin farklı olması.
Sanırım siz bu değeri sabit bıraktınız. O yüzden en son kullanıcı aktif duruma geçti.
01_face_dataset.py dosyasını her kullanıcı için face_id değerini 1 arttırarak tekrar deneyin.
Sisteminiz çalışacaktır.
Kolay gelsin.
Merhaba Hocam,
Bir proje için haartraining nasıl yapılır ararken sizin yazınızı buldum internette bu konu ile ilgili kaynak bulmakta zorlanıyorum çoğu c/c++ ile yapılmış. Pythonda Haartraining işlemi nasıl yapılır bu konuda bir yazınız var mıdır? Yada önerebileceğiniz kaynak yardımcı olursanız çok sevinirim.
Merhaba Can,
github.com üzerinde haartraining ile ilgili kodlar bulabilirsin. Bu ay yayınlanacak OpenCV kitabımda da bu konuda birkaç örnek veriyorum.
Eğer amacın hazır olanlar yerine yeni bir haartraining veriseti eğitmekse işin biraz daha zor.
Eğer github.com üzerinde işine yarar kodlara ulaşamazsan tekrar haberleşelim.
İyi bayramlar.
Not: Aramalarda haarcascade anahtar kelimesi işine daha çok yarayabilir.
Traceback (most recent call last):
File “c:/Users/hp/Desktop/python/face_sync/face_recognition.py”, line 56, in
img=print_utf8_text(img,(x + 5, y – 25),str(id),color)
File “c:/Users/hp/Desktop/python/face_sync/face_recognition.py”, line 9, in print_utf8_text
font = ImageFont.truetype(fontName, 24) # select font
File “C:\Users\hp\AppData\Local\Programs\Python\Python37-32\lib\site-packages\PIL\ImageFont.py”, line 546, in truetype
return freetype(font)
File “C:\Users\hp\AppData\Local\Programs\Python\Python37-32\lib\site-packages\PIL\ImageFont.py”, line 543, in freetype
return FreeTypeFont(font, size, index, encoding, layout_engine)
File “C:\Users\hp\AppData\Local\Programs\Python\Python37-32\lib\site-packages\PIL\ImageFont.py”, line 161, in __init__
font, size, index, encoding, layout_engine=layout_engine
OSError: cannot open resource
[ WARN:1] terminating async callback
Merhabalar Hocam;
Bu hatayı alıyorum fontu değiştirmeyi denedim ama her seferinde aynı hatayı almaya devam ediyorum.Sizce neden?
Hocam çözüldü
nasıl çözdün ben de aynı hatayı aldım
Her kodu denediğimde aynı problem ortaya çıkıyor:
[ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (674) SourceReaderCB::~SourceReaderCB terminating async callback
Sebebi ve Çözümü nedir?
Hangi kodun hangi satırında bu hatayı alıyorsunuz? Ayrıca belirttiğiniz satır bir uyarı satırı gibi görünüyor: WARNing. Kodların çalışmasını etkilemiyor olabilir.
Merhaba hocam projeyi tamamladım fakat yüz algılama kısmını nasıl geliştirebilirim daha iyi sonuç almak için ilk örnekteki gibi göz sayısı ,burun,ağız şartlarınıda ekledim fakat pek işe yaramadı.Ne yapabilirim..Şimdiden çok teşekkür ederim cevabınız için..
sir i need your help the second code can’t run in my sysytem it shows this
intentation is correct
OSError Traceback (most recent call last)
in
29
30 print (“\n [INFO] Training faces. It will take a few seconds. Wait …”)
—> 31 faces,ids = getImagesAndLabels(path)
32 recognizer.train(faces, np.array(ids))
33
in getImagesAndLabels(path)
15 for imagePath in imagePaths:
16
—> 17 PIL_img = Image.open(imagePath).convert(‘L’) # convert it to grayscale
18 img_numpy = np.array(PIL_img,’uint8′)
19
C:\ProgramData\Anaconda3\lib\site-packages\PIL\Image.py in open(fp, mode)
2816 for message in accept_warnings:
2817 warnings.warn(message)
-> 2818 raise IOError(“cannot identify image file %r” % (filename if filename else fp))
2819
2820
OSError: cannot identify image file ‘dataset\\Thumbs.db’
Hi,
Please try to remove “Thumbs.db” file in dataset directory. There should be only image files in that directory.
Traceback (most recent call last):
File “C:/Users/Resul BÜTÜNER/Desktop/tez/python/yuz/egitim.py”, line 8, in
recognizer = cv2.face.LBPHFaceRecognizer_create()
AttributeError: module ‘cv2.cv2’ has no attribute ‘face’
Merhaba pycharm ve python 3.7 sürümü anaconda kullanıyorum. yukarıdaki hatayı egitim kısmında alıyorum. yardımcı olursanız sevinirim.
çözebildiniz mi?
merhaba hocam bu projeyi bizimle paylaştığınız için öncelikle çok teşekkür ederim.Bu projeyi uzaktan bağlantı ile bilgisayarımdan nasıl takip edip kamera görüntüsünü alabilirim.Aldığım görüntüye göre kapı kilidini açmam kapatmam gerekiyor.Yardımcı olabilirseniz çok sevinirim