Kurs
OpenCV, Python, C++ ve Java gibi programlama dillerini destekleyen bir bilgisayarlı görü kütüphanesidir. Paket ilk olarak 1999'da Intel tarafından oluşturuldu, daha sonra açık kaynak yapıldı ve kamuya sunuldu.
OpenCV, geliştiricilerin ve matematikçi olmayanların, sıfırdan kod yazmadan kolayca bilgisayarlı görü uygulamaları geliştirmesine olanak tanır. Kütüphane, yüz tanıma ve nesne tespiti gibi görevleri gerçekleştirmeyi sağlayan 2.500'den fazla algoritma içerir.
Google, Microsoft, IBM ve Intel gibi köklü kuruluşlardaki geliştiriciler ve veri uzmanları, halihazırda ticari kullanım için ücretsiz olan OpenCV kütüphanesinden geniş ölçüde yararlanmaktadır.
Bu yazıda, Python'da yüz tespiti gerçekleştirmek için OpenCV kullanacağız.
Bu eğitimin sonunda şunları nasıl yapacağınızı bileceksiniz:
- Python'da OpenCV ile görsellerde insan yüzlerini tespit etmek
- Bir web kamerasından canlı akışta gerçek zamanlı yüz tespiti yapmak
Yüz Tespiti Nedir?
Yüz tespiti, bir görüntüde veya videoda bir kişinin yüzünü tanımlamayı içerir. Bu, bir kişinin yüz özelliklerinin mevcut olup olmadığını belirlemek için görsel girdinin analiz edilmesiyle yapılır.
İnsan yüzleri çok çeşitlilik gösterdiğinden, yüz tespiti modellerinin doğru olabilmesi için genellikle büyük miktarda girdi verisiyle eğitilmeleri gerekir. Eğitim veri kümesi, farklı geçmişlerden, cinsiyetlerden ve kültürlerden gelen kişilerin yeterli temsilini içermelidir.
Bu algoritmaların ayrıca gerçek dünyadaki senaryolarda doğru tahminler yapabilmesi için farklı aydınlatma, açılar ve yönelimlerden oluşan çok sayıda eğitim örneğiyle beslenmesi gerekir.
Bu incelikler, yüz tespitini, saatlerce model eğitimi ve milyonlarca veri örneği gerektiren, önemsiz olmayan ve zaman alıcı bir görev haline getirir.
Neyse ki, OpenCV paketi yüz tespiti için önceden eğitilmiş modellerle birlikte gelir; bu da bir algoritmayı sıfırdan eğitmemize gerek olmadığı anlamına gelir. Daha spesifik olarak, kütüphane görsel verilerde nesneleri tanımlamak için Haar kaskadı adı verilen bir makine öğrenimi yaklaşımı kullanır.
Yüz Tespiti için OpenCV Eğitimi
Bu bölümde, OpenCV ve Python kullanarak yüz tespiti için Haar Kaskadı adı verilen popüler bir yaklaşımı uygulamayı öğreneceğiz.
Bu eğitimdeki kodu çevrimiçi olarak çalıştırın ve düzenleyin
Kodu çalıştırHaar Kaskadı Sınıflandırıcılara Giriş
Bu yöntem ilk olarak Paul Viola ve Michael Jones tarafından yazılan Basit Özelliklerin Güçlendirilmiş Kaskadı ile Hızlı Nesne Tespiti adlı makalede tanıtıldı.
Bu tekniğin arkasındaki fikir, bir görüntüdeki farklı özellikleri tespit etmek için bir kaskat sınıflandırıcı kullanmaktır. Bu sınıflandırıcılar daha sonra, insan yüzü içeren örneklerle içermeyenleri doğru şekilde ayırt edebilen güçlü bir sınıflandırıcıda birleştirilir.
OpenCV'ye yerleşik Haar Kaskadı sınıflandırıcısı, halihazırda geniş bir insan yüzü veri kümesi üzerinde eğitilmiştir; bu nedenle ek eğitim gerektirmez. Yalnızca sınıflandırıcıyı kütüphaneden yükleyip girdi görselinde yüz tespiti yapmak için kullanmamız yeterlidir.
Python için OpenCV'nin Kurulumu
OpenCV kütüphanesini kurmak için komut isteminizi veya terminal pencerenizi açın ve aşağıdaki komutu çalıştırın:
pip install opencv-python
Bu komut yalnızca cihazınızda pip yüklüyse çalışacaktır. Pip paket yöneticisi hakkında daha fazla bilgi edinmek isterseniz, PIP Python Eğitimi yazımızı okuyabilirsiniz.
Görsellerde OpenCV ile Yüz Tespiti
Unsplash'tan bir fotoğrafta insan yüzünü tanımlayacak bir dedektör oluşturacağız. Kodla birlikte ilerlemeden önce resmi çalışma dizininize kaydettiğinizden ve adını input_image olarak değiştirdiğinizden emin olun.
Adım 1: OpenCV Paketini İçe Aktarın
Şimdi OpenCV'yi içe aktaralım ve aşağıdaki kod satırlarıyla girdi görüntü yolunu girelim:
import cv2
imagePath = 'input_image.jpg'
Adım 2: Görseli Okuyun
Ardından, OpenCV'nin imread() işleviyle görseli okumamız gerekiyor:
img = cv2.imread(imagePath)
Bu, görseli belirtilen dosya yolundan yükleyecek ve bir Numpy dizisi biçiminde döndürecektir.
Bu dizinin boyutlarını yazdıralım:
img.shape
(4000, 2667, 3)
Bunun 3 boyutlu bir dizi olduğuna dikkat edin. Dizideki değerler sırasıyla resmin yüksekliğini, genişliğini ve kanallarını temsil eder. Bu bir renkli görsel olduğundan, onu betimlemek için üç kanal kullanılır: mavi, yeşil ve kırmızı (BGR).
Görselleri temsil etmek için kullanılan geleneksel sıralama RGB (Kırmızı, Yeşil, Mavi) olsa da, OpenCV kütüphanesi bunun ters yerleşimini (Mavi, Yeşil, Kırmızı) kullanır.
Adım 3: Görseli Gri Tonlamaya Dönüştürün
Hesaplama verimliliğini artırmak için, üzerinde yüz tespiti yapmadan önce bu görseli önce gri tonlamaya dönüştürmemiz gerekir:
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Şimdi bu gri tonlamalı görselin boyutlarını inceleyelim:
gray_image.shape
(4000, 2667)
Görsel gri tonlamalı olduğu ve artık üçüncü renk kanalına sahip olmadığı için bu dizinin yalnızca iki değeri olduğuna dikkat edin.
Adım 4: Sınıflandırıcıyı Yükleyin
OpenCV'ye yerleşik önceden eğitilmiş Haar Kaskadı sınıflandırıcısını yükleyelim:
face_classifier = cv2.CascadeClassifier(
cv2.data.haarcascades + "haarcascade_frontalface_default.xml"
)
haarcascade_frontalface_default.xml adlı bir dosya kullandığımıza dikkat edin. Bu sınıflandırıcı özellikle görsel girdilerde önden yüzleri tespit etmek üzere tasarlanmıştır.
OpenCV ayrıca bir görüntü içinde bir kişinin gözleri, gülümsemesi, üst gövdesi ve hatta bir aracın plaka numarası gibi farklı nesneleri tespit etmek için diğer önceden eğitilmiş modeller de sağlar. OpenCV'ye yerleşik farklı sınıflandırıcılar hakkında daha fazla bilgi edinmek için kütüphanenin GitHub deposunu inceleyebilirsiniz.
Adım 5: Yüz Tespitini Gerçekleştirin
Artık yüklediğimiz sınıflandırıcıyı kullanarak gri tonlamalı görsel üzerinde yüz tespiti yapabiliriz:
face = face_classifier.detectMultiScale(
gray_image, scaleFactor=1.1, minNeighbors=5, minSize=(40, 40)
)
Yukarıdaki koddaki yöntemleri ve parametreleri adım adım inceleyelim:
- detectMultiScale():
detectMultiScale() yöntemi, girdi görselindeki farklı boyutlardaki yüzleri tanımlamak için kullanılır.
grey_image:
Bu yöntemindeki ilk parametre grey_image olarak adlandırılır; bu, daha önce oluşturduğumuz gri tonlamalı görseldir.
scaleFactor:
Bu parametre, algoritmanın daha büyük yüzleri daha kolay tespit edebilmesi için girdi görselinin boyutunu küçültmekte kullanılır. Bu durumda, görsel boyutunu %10 azaltmak istediğimizi belirten 1,1'lik bir ölçek faktörü belirledik.
minNeighbors:
Kaskat sınıflandırıcı, görsel boyunca kayan bir pencere uygular ve içindeki yüzleri tespit eder. Bu pencereleri dikdörtgenler olarak düşünebilirsiniz.
Başlangıçta sınıflandırıcı çok sayıda yanlış pozitif yakalayacaktır. Bunlar, bir nesnenin geçerli bir tespit olarak kabul edilmesi için tanımlanması gereken komşu dikdörtgen sayısını belirleyen minNeighbors parametresi kullanılarak elenir.
Özetle, bu parametreye 0 veya 1 gibi küçük bir değer verilmesi çok sayıda yanlış pozitife yol açarken, büyük bir sayı çok sayıda doğru pozitifi kaçırmaya neden olabilir.
Buradaki püf nokta, hem yanlış pozitifleri elememizi hem de doğru pozitifleri isabetli biçimde tanımlamamızı sağlayan bir denge bulmaktır.
minSize:
Son olarak, minSize parametresi tespit edilecek nesnenin minimum boyutunu belirler. Model, belirtilen minimum boyuttan daha küçük yüzleri yok sayacaktır.
Adım 6: Sınırlayıcı Kutu Çizme
Artık model görsel içindeki yüzleri tespit ettiğine göre, bu yüzlerin etrafında bir sınırlayıcı kutu oluşturmak için aşağıdaki kod satırlarını çalıştıralım:
for (x, y, w, h) in face:
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 4)
face değişkeni dört değerden oluşan bir dizidir: yüzlerin tespit edildiği x ve y eksenleri ile genişlikleri ve yükseklikleri. Yukarıdaki kod, tanımlanan yüzler üzerinde yineleme yapar ve bu ölçümler boyunca uzanan bir sınırlayıcı kutu oluşturur.
0,255,0 parametresi sınırlayıcı kutunun rengini, yani yeşili; 4 ise kalınlığını temsil eder.
Adım 7: Görseli Görüntüleme
Tespit edilen yüzlerle birlikte görseli görüntülemek için önce görseli BGR biçiminden RGB'ye dönüştürmemiz gerekir:
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
Şimdi, görseli görüntülemek için Matplotlib kütüphanesini kullanalım:
import matplotlib.pyplot as plt
plt.figure(figsize=(20,10))
plt.imshow(img_rgb)
plt.axis('off')
Yukarıdaki kod şu çıktıyı üretmelidir:

Harika!
Model, bu görseldeki insan yüzünü başarıyla tespit etti ve etrafında bir sınırlayıcı kutu oluşturdu.
OpenCV ile Gerçek Zamanlı Yüz Tespiti
Artık OpenCV ile statik bir görsel üzerinde yüz tespitini başarıyla gerçekleştirdiğimize göre, aynı işlemi canlı bir video akışı üzerinde nasıl yapacağımıza bakalım.
Adım 1: Ön Koşullar
Öncelikle, bir önceki bölümde yaptığımız gibi OpenCV kütüphanesini içe aktaralım ve Haar Kaskadı modelini yükleyelim. Bunu daha önce çalıştırdıysanız bu kod bloğunu atlayabilirsiniz:
import cv2
face_classifier = cv2.CascadeClassifier(
cv2.data.haarcascades + "haarcascade_frontalface_default.xml"
)
Adım 2: Web Kamerasına Erişim
Şimdi, cihazımızın kamerasına erişerek canlı video verisi akışını okumamız gerekiyor. Bunu aşağıdaki kodla yapabilirsiniz:
video_capture = cv2.VideoCapture(0)
VideoCapture() işlevine 0 parametresini geçtiğimize dikkat edin. Bu, OpenCV'ye cihazımızdaki varsayılan kamerayı kullanmasını söyler. Cihazınıza birden fazla kamera bağlıysa, bu parametre değerini buna göre değiştirebilirsiniz.
Adım 3: Video Akışında Yüzleri Tanımlama
Şimdi, video akışındaki yüzleri tespit etmek ve etraflarına bir sınırlayıcı kutu çizmek için bir fonksiyon oluşturalım:
def detect_bounding_box(vid):
gray_image = cv2.cvtColor(vid, cv2.COLOR_BGR2GRAY)
faces = face_classifier.detectMultiScale(gray_image, 1.1, 5, minSize=(40, 40))
for (x, y, w, h) in faces:
cv2.rectangle(vid, (x, y), (x + w, y + h), (0, 255, 0), 4)
return faces
detect_bounding_box fonksiyonu, girdi olarak video karesini alır.
Bu fonksiyonda, yüz tespiti yapmadan önce, daha önce yaptığımız gibi kareyi gri tonlamaya dönüştürüyoruz.
Ardından, scaleFactor, minNeighbors ve minSize için öncekiyle aynı parametre değerlerini kullanarak bu görüntüdeki yüzleri tespit ediyoruz.
Son olarak, kare etrafında kalınlığı 4 olan yeşil bir sınırlayıcı kutu çiziyoruz.
Adım 4: Gerçek Zamanlı Yüz Tespiti için Döngü Oluşturma
Şimdi, web kameramızdan video karesini yakalayacak ve yüz tespiti fonksiyonunu buna uygulayacak belirsiz bir while döngüsü oluşturmamız gerekiyor:
while True:
result, video_frame = video_capture.read() # read frames from the video
if result is False:
break # terminate the loop if the frame is not read successfully
faces = detect_bounding_box(
video_frame
) # apply the function we created to the video frame
cv2.imshow(
"My Face Detection Project", video_frame
) # display the processed frame in a window named "My Face Detection Project"
if cv2.waitKey(1) & 0xFF == ord("q"):
break
video_capture.release()
cv2.destroyAllWindows()
Yukarıdaki kodu çalıştırdıktan sonra ekranda My Face Detection Project adlı bir pencere görmelisiniz:

Algoritma, çerçeve içinde nerede hareket ederseniz edin yüzünüzü takip etmeli ve etrafında yeşil bir sınırlayıcı kutu oluşturmalıdır.
Yukarıdaki karede, model hem yüzümü hem de kaldırdığım sürücü belgemdeki fotoğrafımı tanıyor.
Ayrıca, birden fazla fotoğraf tutarak veya kameranın arkasında farklı açılarda duran farklı kişilerle modelin etkinliğini test edebilirsiniz. Model, farklı arka planlarda veya aydınlatma ayarlarında tüm insan yüzlerini tanımlayabilmelidir.
Programdan çıkmak isterseniz, döngüden çıkmak için klavyenizdeki “q” tuşuna basabilirsiniz.
Sonuç
Sonuç olarak, OpenCV, yüz tespiti gibi karmaşık görevleri basitleştirmek için geniş bir önceden eğitilmiş model ve araç yelpazesi sunan, güçlü ve çok yönlü bir bilgisayarlı görü kütüphanesidir.
İster statik görüntüleri ister canlı video akışlarını işliyor olun, OpenCV geliştiricilere verimli ve ölçeklenebilir çözümler oluşturmak için erişilebilir bir başlangıç noktası sağlar.
Bu eğitimde ele alınan tekniklere hakim olarak, projelerinizde bilgisayarlı görünün daha gelişmiş uygulamalarını keşfetmeye iyi şekilde hazırlanmış olacaksınız.
Natassha , veri bilimi ile pazarlamanın kesişiminde çalışan bir veri danışmanıdır. Verilerin, akıllıca kullanıldığında, bireyler ve kurumlar için olağanüstü bir büyüme ilhamı olabileceğine inanır. Kendi kendini yetiştirmiş bir veri profesyoneli olarak Natassha , veri bilimi alanına girmek isteyenlere yardımcı olacak makaleler yazmayı sever. Kişisel blogundaki ve harici yayınlardaki makaleleri aylık ortalama 200 bin görüntülenme almaktadır.
SSS
OpenCV yüzler dışında diğer nesneleri tespit etmek için de kullanılabilir mi?
Evet, OpenCV, önceden eğitilmiş Haar Kaskadı sınıflandırıcılarını kullanarak göz, gülümseme, araçlar ve hatta plaka gibi çeşitli nesneler için nesne tespitini destekler. Ayrıca, daha sağlam ve doğru çoklu nesne tespiti için OpenCV, YOLO veya SSD gibi modern nesne tespit modelleriyle birleştirilebilir.
OpenCV ile tek bir görselde birden fazla yüzü nasıl ele alabilirim?
OpenCV’nin detectMultiScale() yöntemi, her yüz için sınırlayıcı kutular oluşturarak bir görüntüdeki tüm yüzleri otomatik olarak tespit eder. Döndürülen sınırlayıcı kutular üzerinde yineleme yaparak her tespit edilen yüzü ayrı ayrı işleyebilir veya etiketleyebilirsiniz. Örnek:
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 4) # Draw boxes for all detected facesOpenCV, yüz tespiti için derin öğrenme modelleriyle çalışabilir mi?
Evet, OpenCV, Caffe veya TensorFlow gibi önceden eğitilmiş DNN modelleri kullanarak yüz tespiti için derin öğrenme modellerini destekler. OpenCV’nin cv2.dnn modülü, Haar kaskatlarına kıyasla daha gelişmiş ve doğru yüz tespiti için bu modellerle entegrasyona olanak tanır. Örneğin, gerçek zamanlı yüz tespiti için MobileNet-SSD modelini kullanabilirsiniz:
net = cv2.dnn.readNetFromCaffe('deploy.prototxt', 'res10_300x300_ssd_iter_140000.caffemodel')
