Gerçek zamanlı yüz noktalama, bilgisayar görüşünün en heyecan verici alanlarından biri. Peki, YOLOv9 ve MediaPipe’ı birleştirerek saniyede 140 kare hızında (FPS) ultra hızlı bir uygulama nasıl geliştirilir? Bu rehberde, sıfırdan başlayarak bu etkileyici performansa ulaşmanın tüm sırlarını ve püf noktalarını adım adım öğreneceksiniz. Modern yapay zeka tekniklerini kullanarak yüksek performanslı uygulamalar geliştirmek isteyen herkes için bu makale, pratik bilgilerle dolu bir yol haritası sunuyor.
Yüz noktalama teknolojisi, insan-bilgisayar etkileşiminden güvenliğe, eğlenceden sağlığa kadar pek çok alanda devrim niteliğinde değişimler yaratıyor. Temel olarak, bir yüzdeki belirli, ayırt edici noktaları (göz köşeleri, burun ucu, ağız kenarları vb.) tespit etme sürecidir. Bu teknoloji, sadece bir yüzün nerede olduğunu söylemekle kalmaz, aynı zamanda o yüzün ifadesi, duruşu ve hatta duygusal durumu hakkında derinlemesine bilgiler edinmemizi sağlar. Örneğin, bir sanal gerçeklik (VR) uygulamasında kullanıcıların avatarının yüz ifadelerini gerçek zamanlı olarak yansıtmak, yüz noktalama sayesinde mümkün olur. Güvenlik sistemlerinde, şüpheli kişilerin yüz hareketlerini analiz ederek potansiyel tehditleri belirleme potansiyeli taşır. Ayrıca, tıp alanında, belirli nörolojik rahatsızlıkları olan hastaların yüz kaslarındaki asimetrileri veya hareket kısıtlılıklarını izlemek için de kullanılabilir.
Günümüzde akıllı telefonlarımızdaki filtreler, sosyal medya uygulamalarındaki eğlenceli AR (Artırılmış Gerçeklik) efektleri ve hatta sürücü yorgunluk tespiti gibi sistemler, bu teknolojinin doğrudan veya dolaylı uygulamalarıdır. Ancak, bu uygulamaların gerçek potansiyelini ortaya koymak için yüksek performans, yani çok hızlı ve doğru bir şekilde çalışabilmeleri kritik öneme sahiptir. Düşük FPS (saniyedeki kare sayısı) ile çalışan bir yüz noktalama sistemi, kullanıcı deneyimini olumsuz etkiler ve çoğu gerçek zamanlı senaryo için kullanılamaz hale gelir. İşte bu yüzden, bizim hedeflediğimiz 140 FPS gibi hızlar, sadece teknik bir başarı değil, aynı zamanda bu teknolojinin yeni uygulama alanlarına kapı aralamasını sağlayan bir zorunluluktur. Bu yüksek performans, özellikle otonom sürüş sistemleri, robotik ve canlı yayın analizi gibi anlık tepki gerektiren alanlarda vazgeçilmezdir. Bu makalede ele alacağımız YOLOv9 ve MediaPipe entegrasyonu, bu tür yüksek performans gereksinimlerini karşılamak için tasarlanmış güçlü bir çözümdür.
YOLOv9 ve MediaPipe: Bu İki Teknoloji Temel Olarak Ne İş Yapar?
Uygulamamızın kalbinde yer alan YOLOv9 ve MediaPipe, her biri kendi alanında çığır açmış iki farklı ancak birbirini tamamlayan teknolojidir. Bu ikilinin ne olduğunu ve neden bir arada bu kadar güçlü olduklarını anlamak, projemizin temelini kavramak anlamına gelir.
YOLOv9 (You Only Look Once v9): YOLO serisi, gerçek zamanlı nesne tespiti konusunda uzun süredir lider konumdadır. “You Only Look Once” felsefesiyle adlandırılan bu modeller, bir görüntüyü tek bir geçişte analiz ederek, içindeki birden fazla nesneyi aynı anda hem sınıflandırır hem de konumlarını belirler. Geleneksel nesne tespit yöntemleri, önce aday bölgeleri belirleyip sonra her bölgeyi ayrı ayrı sınıflandırırken, YOLO bu iki adımı birleştirerek müthiş bir hız avantajı sağlar. YOLOv9, serinin en yeni üyelerinden biridir ve önceki versiyonlara göre önemli iyileştirmeler sunar. Özellikle, Genel Bilgi Ağı (Generalized ELAN – GELAN) ve Ölçek Tabanlı Ters Dönüşüm Ağı (Programmable Gradient Information – PGI) gibi yenilikçi mimari tasarımlar sayesinde, daha az parametre ile daha yüksek doğruluk ve daha iyi çıkarım hızı elde eder. Bu, özellikle bizim gibi yüksek FPS hedefleyen uygulamalar için kritik bir avantajdır. YOLOv9, bir görüntüdeki insan yüzlerini hızlı ve doğru bir şekilde tespit etmek için kullanılacak ilk katmanımız olacak. Bir yüzü bir “nesne” olarak görüp, o yüzün sınırlarını (bounding box) bize çok hızlı bir şekilde verecek.
MediaPipe: Google tarafından geliştirilen MediaPipe, çeşitli makine öğrenimi görevleri için platformlar arası, özelleştirilebilir bir çerçevedir. El takibi, vücut poz tahmini, saç segmentasyonu gibi birçok farklı görevi gerçek zamanlı olarak gerçekleştirebilen hazır ML çözümleri sunar. Bizim uygulamamızda ise, özellikle MediaPipe Face Landmarker modülünü kullanacağız. Bu modül, bir yüzün 468 (veya daha fazla) kritik noktasını (landmark) milisaniyeler içinde tespit edebilir. MediaPipe’ın gücü, karmaşık ML modellerini optimize edilmiş bir şekilde sunması ve CPU/GPU üzerinde sorunsuz çalışabilmesidir. Ayrıca, çeşitli programlama dilleri ve platformlar (Python, C++, JavaScript, Android, iOS) için API’ler sunarak geliştiricilere büyük esneklik sağlar. YOLOv9’un tespit ettiği yüz kutularının içine girerek, bu kutular içindeki yüzlerin çok daha detaylı noktalama bilgisini sağlamak MediaPipe’ın görevi olacak. Bu iki teknolojinin birleşimi, bir yandan YOLOv9’un genel yüz tespiti hızından faydalanırken, diğer yandan MediaPipe’ın yüzdeki ince detayları hassas bir şekilde yakalama yeteneğini kullanmamızı sağlıyor.
YOLOv9 ile Yüz Tespiti Süreci Nasıl İşler ve Neden Bu Kadar Etkilidir?
YOLOv9’un yüz tespiti yeteneği, uygulamamızın temelini oluşturan kritik bir adımdır. Bir video akışından gelen her karede, birden fazla yüz olsa bile, bu yüzleri hızla ve doğru bir şekilde konumlandırmak gerekir. YOLOv9 bu görevi, “tek bir bakışta” felsefesiyle mükemmel bir şekilde yerine getirir. Peki, bu süreç tam olarak nasıl işler ve YOLOv9’u bu kadar etkili kılan nedir?
Öncelikle, YOLOv9, büyük veri kümeleri üzerinde (örneğin WIDER FACE gibi yüz tespiti için özel olarak etiketlenmiş veri setleri üzerinde) eğitilmiş bir derin öğrenme modelidir. Bu eğitim sürecinde, model, farklı açılardan, farklı aydınlatma koşullarında ve farklı yüz ifadeleriyle çekilmiş binlerce yüz görüntüsünü ve bu yüzlerin sınırlayıcı kutularını (bounding box) öğrenir. Modelin temel mimarisi, giriş görüntüsünü küçük hücrelere böler ve her hücre, o hücrenin içinde bir nesne (bizim durumumuzda bir yüz) olup olmadığını, varsa hangi sınıfa ait olduğunu (sadece ‘yüz’ sınıfımız var) ve sınırlayıcı kutusunun koordinatlarını tahmin eder.
YOLOv9’un önceki versiyonlara göre öne çıkan bazı özellikleri vardır. Programmable Gradient Information (PGI), modelin derinlik arttıkça kaybolan gradient bilgisini daha iyi korumasını sağlar. Bu, modelin daha derin katmanlara ulaşmasına rağmen detaylı özellik bilgilerini kaybetmemesine yardımcı olur ve özellikle küçük nesnelerin (uzaktaki yüzler gibi) tespitinde performansı artırır. Ayrıca, Generalized ELAN (GELAN) yapısı, hesaplama verimliliğini artırırken modelin öğrenme kapasitesini korur. Bu mimari yenilikler sayesinde YOLOv9, daha az hesaplama kaynağı kullanarak daha iyi doğruluk ve daha yüksek çıkarım hızı sunar. Yani, aynı donanım üzerinde daha fazla kareyi daha kısa sürede işleyebiliriz, bu da doğrudan hedeflediğimiz 140 FPS performansına ulaşmamıza katkıda bulunur.
Yüz tespiti sırasında, YOLOv9 bir kareyi analiz eder ve tespit ettiği her yüz için bir sınırlayıcı kutu (x, y koordinatları, genişlik, yükseklik) ve bir güven skoru üretir. Güven skoru, modelin o kutunun gerçekten bir yüz içerdiğine ne kadar inandığını gösterir. Yüksek güven skoruna sahip kutular filtrelenir ve üst üste binen kutuları elemek için Non-Maximum Suppression (NMS) algoritması uygulanır. NMS, aynı yüzü birden fazla kez tespit eden kutulardan en yüksek güven skoruna sahip olanı korurken diğerlerini atar. Bu temizleme işleminden sonra, elimizde her karedeki yüzler için doğru ve tekil sınırlayıcı kutular kalır. Bu kutular, bir sonraki aşamada MediaPipe’a girdi olarak verilecek ve yüz noktalama için kullanılacaktır. YOLOv9’un bu hız ve doğruluk kombinasyonu, uygulamamızın gerçek zamanlı ve yüksek performanslı çalışmasının anahtarıdır.
Uzman İpucu: YOLOv9 modelini kullanırken, modelin boyutunu (örneğin yolov9-c.pt veya yolov9-e.pt) donanımınızın kapasitesine göre seçmek performansı doğrudan etkileyecektir. Daha küçük modeller daha hızlı olabilir ancak doğruluktan biraz ödün verebilir.
MediaPipe ile Hassas Yüz Noktalama Nasıl Yapılır ve Hangi Detayları Sağlarız?
YOLOv9 ile yüzleri başarıyla tespit ettikten sonra, sıra bu yüzlerin üzerine detaylı noktalama bilgilerini eklemeye geliyor. İşte burada MediaPipe Face Landmarker devreye giriyor. MediaPipe, yüzdeki 468 (veya hatta 522 farklı versiyonunda) anatomik noktayı (landmark) tespit ederek, yüz ifadesi analizi, 3D yüz modelleme, artırılmış gerçeklik filtreleri ve çok daha fazlası için zengin bir veri seti sağlar. Peki, MediaPipe bu hassas tespiti nasıl gerçekleştiriyor ve bize hangi verileri sunuyor?
MediaPipe Face Landmarker, bir derin öğrenme tabanlı yaklaşım kullanır. Genellikle, önce bir yüz algılayıcı (Face Detector) modeli, görüntüdeki yüzlerin genel konumlarını belirler. Ardından, tespit edilen her yüz kutusu içindeki piksel verisi, daha karmaşık bir yüz noktalama modeline (Face Landmark Model) beslenir. Bu noktalama modeli, yüzdeki her bir anahtar nokta için (gözler, kaşlar, burun, dudaklar, çene hattı vb.) X, Y koordinatlarını (ve bazen Z koordinatını da, 3D yüz noktalama için) tahmin eder. Bu iki aşamalı yaklaşım, hem hız hem de doğruluk açısından optimize edilmiştir. MediaPipe'ın bu süreçteki en büyük avantajı, tüm bu karmaşık işleyişi tek ve kullanımı kolay bir API altında sunmasıdır. Geliştiricilerin model eğitimi, optimizasyonu veya donanım hızlandırma gibi detaylarla uğraşmasına gerek kalmaz; sadece modelin girişine bir görüntü verip çıktıları alırlar.
MediaPipe'ın sağladığı her bir landmark, yüzün belirli bir anatomik noktasına karşılık gelir. Örneğin, göz bebeklerinin merkezi, burun ucunun ve burun kanatlarının noktaları, dudakların köşeleri ve ortası, çene hattındaki çeşitli noktalar bu 468 noktanın bir kısmını oluşturur. Bu noktaların her birinin benzersiz bir indeksi vardır, bu sayede belirli bir noktayı kolayca referans alabiliriz. Noktaların koordinatları genellikle görüntü genişliği ve yüksekliğine göre normalize edilmiş olarak (0 ile 1 arasında) verilir, bu da uygulamanın farklı çözünürlükteki görüntülerle çalışmasını kolaylaştırır.
# MediaPipe Face Landmarker kullanımı (Basitleştirilmiş örnek)
import cv2
import mediapipe as mp
mp_face_landmarker = mp.solutions.face_landmarker
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
# Modeli yükleme
with mp_face_landmarker.FaceLandmarker(
model_path='face_landmarker_heavy.task', # Veya lite.task
running_mode=mp_face_landmarker.RunningMode.IMAGE,
num_faces=1) as landmarker:
# Görüntüyü işle
image = cv2.imread("ornek_yuz.jpg")
results = landmarker.detect(mp.Image(image_format=mp.ImageFormat.SRGB, data=image))
# Sonuçları çizme
annotated_image = image.copy()
if results.face_landmarks:
for face_landmarks in results.face_landmarks:
mp_drawing.draw_landmarks(
image=annotated_image,
landmark_list=face_landmarks,
connections=mp_face_landmarker.FACE_LANDMARKS_TESSELATION,
landmark_drawing_spec=None,
connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_tesselation_style())
cv2.imshow("Annotated Face", annotated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Yukarıdaki kod bloğu, MediaPipe Face Landmarker'ın temel kullanımını göstermektedir. Görüntüyü mp.Image formatına dönüştürüp detect metoduna vererek, modelden results alırız. Bu sonuçlar içinde face_landmarks listesi, her tespit edilen yüz için bir dizi nokta içerir. Bu noktaları mp_drawing.draw_landmarks fonksiyonu ile kolayca görüntü üzerine çizebiliriz. MediaPipe'ın bu kapsamlı ve optimize edilmiş yapısı, yüz noktalama aşamasında hem doğruluk hem de performans açısından bize büyük avantajlar sağlar. YOLOv9'un hızlı yüz kutusu tespiti ile birleştiğinde, her iki teknolojinin de en iyi yönlerini kullanarak ultra hızlı ve detaylı bir yüz noktalama uygulaması oluşturmanın kapılarını aralamış oluruz.
Uygulama Mimarisi: YOLOv9 ve MediaPipe Entegrasyonu Nasıl Gerçekleştirilir?
Yüksek performanslı bir gerçek zamanlı yüz noktalama uygulaması geliştirmek için YOLOv9 ve MediaPipe'ı entegre etmek, akıllı bir mimari tasarım gerektirir. Bu iki güçlü aracı en verimli şekilde birleştirmek, 140 FPS hedefine ulaşmamızı sağlayan anahtar unsurdur. İşte bu entegrasyonun temel adımları ve mimarinin işleyişi:
1. Veri Akışı ve Ön İşleme:
Uygulamamız bir kamera veya video dosyasından sürekli görüntü akışı alacaktır. Her kare alındığında, bu kare önce bazı temel ön işleme adımlarından geçebilir (örneğin, yeniden boyutlandırma veya renk formatı dönüşümü). Ancak, her iki model de genellikle RGB veya BGR formatında çalışabildiği için, minimum düzeyde ön işleme gereklidir.
2. YOLOv9 ile Yüz Tespiti:
İlk ve en önemli adım, gelen görüntü karesi üzerinde YOLOv9 modelini çalıştırarak yüzleri tespit etmektir. YOLOv9, karayı girdi olarak alır ve tespit ettiği her yüz için bir sınırlayıcı kutu (bounding box) ve bir güven skoru çıktısı verir. Bu aşama, tüm yüzlerin genel konumlarını hızlıca belirler.
# YOLOv9 ile yüz tespiti (psödo-kod)
from ultralytics import YOLO
import cv2
# YOLOv9 modelini yükle
yolo_model = YOLO('yolov9c.pt') # veya başka bir YOLOv9 modeli
yolo_model.fuse() # Model optimizasyonu için
def detect_faces_with_yolo(frame):
results = yolo_model(frame, classes=[0], conf=0.5, iou=0.7) # classes=[0] varsayılan olarak 'person' sınıfıdır, modele göre ayarlanmalı.
face_boxes = []
for r in results:
boxes = r.boxes.xyxy.cpu().numpy() # [x1, y1, x2, y2] formatında kutular
confidences = r.boxes.conf.cpu().numpy()
for i in range(len(boxes)):
x1, y1, x2, y2 = map(int, boxes[i])
confidence = confidences[i]
# Sadece belirli bir güven skorunun üzerindeki tespitleri al
if confidence > 0.6:
face_boxes.append((x1, y1, x2, y2))
return face_boxes
3. MediaPipe İçin Yüz Kutu Kırpma ve Ön İşleme:
YOLOv9'dan elde edilen her bir yüz kutusu, MediaPipe Face Landmarker modeline ayrı ayrı gönderilmek üzere kırpılır. Kırpma işlemi, MediaPipe'ın sadece ilgili yüz bölgesine odaklanmasını sağlar ve hem hesaplama yükünü azaltır hem de doğruluğu artırır. Bazen, yüz kutusunu biraz genişletmek (padding eklemek), MediaPipe'ın yüzü daha iyi algılamasına yardımcı olabilir.
4. MediaPipe ile Yüz Noktalama:
Kırpılan her yüz görüntüsü, MediaPipe Face Landmarker modeline beslenir. MediaPipe, bu kırpılmış görüntü üzerinde çalışır ve yüzdeki 468 (veya daha fazla) noktayı tespit eder. Bu noktalar, kırpılmış görüntünün koordinat sistemine göre verilir.
# MediaPipe ile yüz noktalama (psödo-kod)
import mediapipe as mp
mp_face_landmarker = mp.solutions.face_landmarker
landmarker = mp_face_landmarker.FaceLandmarker(
model_path='face_landmarker_heavy.task',
running_mode=mp_face_landmarker.RunningMode.IMAGE,
num_faces=1 # Her kutuda tek yüz beklendiği için 1
)
def get_landmarks_with_mediapipe(cropped_face_image):
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=cropped_face_image)
landmarker_result = landmarker.detect(mp_image)
if landmarker_result.face_landmarks:
# Normalize edilmiş koordinatları piksel koordinatlarına çevir
landmarks = []
for landmark in landmarker_result.face_landmarks[0]:
landmarks.append((int(landmark.x * cropped_face_image.shape[1]),
int(landmark.y * cropped_face_image.shape[0])))
return landmarks
return None
5. Koordinat Dönüşümü ve Çizim:
MediaPipe'tan alınan yüz noktalama koordinatları, kırpılmış yüz görüntüsünün koordinat sistemindedir. Bunları orijinal video karesinin koordinat sistemine geri dönüştürmek gereklidir. Bu, basit bir ofset ekleme işlemiyle yapılır. Dönüştürülen koordinatlar, daha sonra orijinal kare üzerine çizilerek kullanıcıya gösterilir.
6. Paralelleştirme ve Optimizasyon:
140 FPS gibi yüksek bir hedefe ulaşmak için, bu adımların mümkün olduğunca verimli ve paralel çalışması önemlidir. Örneğin, YOLOv9 GPU üzerinde çalışırken, MediaPipe da aynı anda veya sırayla başka bir GPU çekirdeğinde veya CPU'da çalışabilir. Her iki modelin de çıkarım sürelerini minimuma indirmek için model optimizasyonu ( quantization, ONNX dışa aktarma vb.) ve donanım hızlandırmasından (CUDA, TensorRT) faydalanmak kritik olacaktır. Python'daki concurrent.futures veya multiprocessing modülleri ile bazı işlemleri paralel hale getirmek de performans artışı sağlayabilir. Bu katmanlı yaklaşım, her bir teknolojinin kendi uzmanlık alanında en iyisini yapmasını sağlayarak, toplamda çok daha güçlü ve hızlı bir sistem elde etmemizi sağlar.
Önemli Not: MediaPipe'ın varsayılan yüz algılayıcısı da oldukça hızlıdır. Ancak YOLOv9, genel nesne tespiti konusunda daha esnek bir yapı sunar ve başka nesnelerin tespiti gibi ek görevler için de ölçeklendirilebilir. Bu entegrasyonda YOLOv9'u öne çıkarmamızın temel sebebi, genelleştirilebilirliği ve modern ML yaklaşımlarının gücünü sergilemektir. Eğer sadece yüz noktalama yapıyorsanız, MediaPipe'ın kendi Face Detector'ı da iyi bir başlangıç noktası olabilir.
Adım Adım Uygulama Geliştirme: Kodu Baştan Sona Yazalım
Şimdiye kadar teorik altyapıyı ve mimariyi anladık. Artık bu bilgileri pratik bir uygulamaya dönüştürme zamanı. İşte adım adım, 140 FPS gerçek zamanlı yüz noktalama uygulamasını oluşturmak için yazacağımız Python kodu. Bu örnek, konsepti basitleştirmek ve temel akışı göstermek amacıyla tasarlanmıştır.
1. Gerekli Kütüphaneleri Kurun:
Başlamadan önce, gerekli tüm kütüphaneleri yüklediğinizden emin olun:
pip install opencv-python mediapipe ultralytics
YOLOv9 modelini indirmek için Ultralytics'in resmi deposunu ziyaret edebilir veya doğrudan yolo_model = YOLO('yolov9c.pt') satırı çalıştırıldığında ilk kullanımda otomatik indirilmesini bekleyebilirsiniz. MediaPipe için face_landmarker_heavy.task dosyasını Google'ın MediaPipe örneklerinden indirmeniz gerekecektir.
2. Temel Yapıyı Oluşturun:
Bir Python dosyası oluşturun (örneğin, face_landmarker_app.py) ve temel import işlemlerini ekleyin.
import cv2
import mediapipe as mp
from ultralytics import YOLO
import time
# MediaPipe çizim yardımcıları
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_face_landmarker = mp.solutions.face_landmarker
# YOLOv9 modelini yükle
# Not: 'person' sınıfı için eğitilmiş bir YOLOv9 modeli kullanıyoruz.
# Eğer sadece yüz tespiti için özel bir modeliniz varsa onu kullanın.
yolo_model = YOLO('yolov9c.pt')
yolo_model.fuse() # Optimizasyon için
# MediaPipe Face Landmarker'ı yükle
# Modeli indirdiğiniz yolu belirtin: 'face_landmarker_heavy.task'
# https://developers.google.com/mediapipe/solutions/vision/face_landmarker adresinden indirebilirsiniz.
landmarker = mp_face_landmarker.FaceLandmarker(
model_path='face_landmarker_heavy.task',
running_mode=mp_face_landmarker.RunningMode.IMAGE, # Her kareyi bağımsız olarak işle
num_faces=5 # Aynı anda en fazla 5 yüzü işleyebilir
)
3. Ana Uygulama Döngüsü:
Kamera akışını işleyecek ana döngüyü yazalım.
def run_face_landmark_app():
cap = cv2.VideoCapture(0) # 0, varsayılan webcam'i temsil eder
if not cap.isOpened():
print("Kamera açılamadı.")
return
prev_frame_time = 0
new_frame_time = 0
while True:
ret, frame = cap.read()
if not ret:
break
# YOLOv9 ile yüz tespiti
# YOLOv9 genellikle BGR formatında görüntü bekler, OpenCV de varsayılan olarak BGR verir.
yolo_results = yolo_model(frame, classes=[0], conf=0.5, iou=0.7, verbose=False) # 'person' sınıfı (sınıf 0)
face_boxes = []
for r in yolo_results:
boxes = r.boxes.xyxy.cpu().numpy()
confidences = r.boxes.conf.cpu().numpy()
for i in range(len(boxes)):
x1, y1, x2, y2 = map(int, boxes[i])
confidence = confidences[i]
if confidence > 0.6 and (y2-y1) > 50 and (x2-x1) > 50: # Minimum boyut kontrolü
face_boxes.append((x1, y1, x2, y2))
# MediaPipe ile yüz noktalama
annotated_frame = frame.copy()
for (x1, y1, x2, y2) in face_boxes:
# YOLO kutusunu biraz genişletelim ki MediaPipe yüzü daha iyi algılasın
padding = 0.1 # %10 padding
w, h = x2 - x1, y2 - y1
x1_padded = max(0, int(x1 - w * padding))
y1_padded = max(0, int(y1 - h * padding))
x2_padded = min(frame.shape[1], int(x2 + w * padding))
y2_padded = min(frame.shape[0], int(y2 + h * padding))
cropped_face = frame[y1_padded:y2_padded, x1_padded:x2_padded]
if cropped_face.shape[0] == 0 or cropped_face.shape[1] == 0:
continue
# MediaPipe'a işlemek için görüntüyü RGB'ye çevir
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=cv2.cvtColor(cropped_face, cv2.COLOR_BGR2RGB))
landmarker_result = landmarker.detect(mp_image)
if landmarker_result.face_landmarks:
for face_landmarks in landmarker_result.face_landmarks:
# Noktaları orijinal çerçeve koordinatlarına dönüştür ve çiz
for landmark in face_landmarks:
# Normalize edilmiş koordinatları piksel koordinatlarına çevir
# ve padding'i de hesaba kat
lx = int(landmark.x * cropped_face.shape[1]) + x1_padded
ly = int(landmark.y * cropped_face.shape[0]) + y1_padded
cv2.circle(annotated_frame, (lx, ly), 1, (0, 255, 0), -1) # Yeşil noktalar
# İsteğe bağlı olarak MediaPipe'ın kendi çizimlerini kullanabiliriz
# Ancak performans için sadece noktaları çizmek daha hızlı olabilir.
# mp_drawing.draw_landmarks(
# image=annotated_frame,
# landmark_list=face_landmarks,
# connections=mp_face_landmarker.FACE_LANDMARKS_TESSELATION,
# landmark_drawing_spec=mp_drawing_styles.get_default_face_mesh_tesselation_style(),
# connection_drawing_spec=None)
# FPS hesaplama ve gösterme
new_frame_time = time.time()
fps = 1 / (new_frame_time - prev_frame_time)
prev_frame_time = new_frame_time
fps_text = f"FPS: {int(fps)}"
cv2.putText(annotated_frame, fps_text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2, cv2.LINE_AA)
cv2.imshow('YOLOv9 + MediaPipe Face Landmarks', annotated_frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
landmarker.close() # Kaynakları serbest bırak
if __name__ == '__main__':
run_face_landmark_app()
Bu kod, her video karesini alır, YOLOv9 ile yüzleri tespit eder, tespit edilen her yüzü kırpar ve MediaPipe ile bu kırpılmış yüz üzerinde noktalama yapar. Son olarak, noktaları orijinal kareye geri çizer ve FPS'i görüntüler. yolo_model(frame, classes=[0], ...) kısmında classes=[0] ifadesi, YOLO'nun COCO veri kümesinde 'person' (insan) sınıfını temsil eder. Varsayılan olarak insanları algılamasını sağlarız, çünkü yüzler genellikle bir insan bedeninin parçasıdır. Ancak daha optimize bir yaklaşım için, sadece yüzler üzerinde eğitilmiş bir YOLO modeli kullanmak daha verimli olacaktır. 140 FPS hedefine ulaşmak için donanımınızın gücü (özellikle GPU) ve kodunuzdaki ince optimizasyonlar kritik rol oynayacaktır.
Performans Optimizasyonu ve 140 FPS Hedefine Ulaşma Yolları Nelerdir?
140 FPS gibi iddialı bir hedefe ulaşmak, sadece doğru modelleri seçmekle değil, aynı zamanda sistemin her katmanında akıllı optimizasyonlar yapmakla mümkündür. İşte bu yüksek performansı elde etmek için uygulayabileceğiniz stratejiler:
1. Donanım Hızlandırma (GPU Kullanımı):
Bu performans seviyesine ulaşmanın en kritik yolu GPU (Grafik İşlem Birimi) kullanmaktır. Hem YOLOv9 hem de MediaPipe, GPU hızlandırması için tasarlanmıştır.
* CUDA ve cuDNN: NVIDIA GPU'ları kullanıyorsanız, CUDA ve cuDNN'in doğru bir şekilde yüklendiğinden emin olun. Bu, derin öğrenme modellerinin GPU üzerinde çok daha hızlı çalışmasını sağlar.
* TensorRT: NVIDIA'nın TensorRT kütüphanesi, derin öğrenme modellerini çıkarım (inference) için optimize eder. YOLOv9 modelinizi TensorRT formatına dönüştürmek, çıkarım süresini önemli ölçüde azaltabilir. MediaPipe da TensorRT ile entegre çalışabilir.
* Diğer GPU'lar: AMD veya Intel GPU'ları için de OpenVINO (Intel) veya ROCm (AMD) gibi karşılık gelen hızlandırma kütüphaneleri mevcuttur.
2. Model Optimizasyonu:
* Model Seçimi: YOLOv9'un farklı boyutlarda (nano, small, medium, large, huge) önceden eğitilmiş modelleri vardır. Daha küçük modeller, genellikle daha az doğrulukla daha yüksek hız sunar. Performans ve doğruluk arasında en iyi dengeyi bulmak için farklı modelleri deneyin (yolov9c.pt yerine yolov9s.pt gibi). MediaPipe için de face_landmarker_lite.task gibi daha hafif modeller mevcuttur.
* Kuantizasyon (Quantization): Derin öğrenme modellerinin ağırlıklarını ve aktivasyonlarını daha düşük hassasiyetli veri tiplerine (örn. 32-bit float yerine 8-bit integer) dönüştürmek, model boyutunu küçültür ve çıkarım süresini hızlandırır. Bu, özellikle kenar cihazlarda (edge devices) önemlidir.
* Model Budama (Pruning): Modeldeki daha az önemli ağırlıkları veya katmanları eleyerek modelin boyutunu ve hesaplama ihtiyacını azaltma yöntemidir.
3. İşlem Hattı Optimizasyonu:
* Veri Akışı Yönetimi: Kamera veya video akışından gelen karelerin işlenmesi sırasında, arabellek (buffer) yönetimini iyi yapmak gecikmeyi azaltır.
* Çoklu İş Parçacığı/İşlem (Multithreading/Multiprocessing): YOLOv9 ve MediaPipe işlemlerini ayrı iş parçacıklarında veya işlemlerde çalıştırmak, bazı adımların paralel olarak yürütülmesini sağlayabilir. Örneğin, bir iş parçacığı bir önceki kareyi işlerken, diğer iş parçacığı yeni kareyi kameradan okuyabilir. Python'ın concurrent.futures modülü bunun için uygun olabilir.
* Minimum Ön İşleme: Görüntü boyutlandırma, renk alanı dönüşümü gibi ön işleme adımlarını sadece gerekli olduğunda ve minimum düzeyde uygulayın. Her ekstra işlem, değerli milisaniyeler demektir.
* Gereksiz Çizimleri Kaldırma: Görüntü üzerine çizilen her piksel, performans maliyeti getirir. Sadece en gerekli bilgileri (örn. sadece noktalar, tüm tessellation değil) veya sadece FPS sayacını çizin.
4. Kamera ve Görüntü Ayarları:
* Kamera Çözünürlüğü: Daha düşük çözünürlüklü bir kamera görüntüsü işlemek, genellikle daha hızlıdır. Çözünürlüğü, uygulamanızın ihtiyaç duyduğu en düşük seviyeye ayarlayın.
* Kare Hızı (Capture FPS): Kameranın sağladığı maksimum kare hızının farkında olun. Eğer kamera 30 FPS veriyorsa, yazılımsal olarak 140 FPS'e ulaşamazsınız. Yüksek hızlı bir kamera kullanmak gerekebilir.
Gerçek Zamanlı İpuçları: Python GIL (Global Interpreter Lock) nedeniyle, tam CPU paralelleştirmesi için multiprocessing modülünü kullanmak, threading'den daha etkili olabilir. Ancak GPU işlemleri GIL'den etkilenmez, bu yüzden GPU'yu yoğun kullanmak performans açısından çok daha önemlidir.
Bu optimizasyon stratejilerini birleştirerek ve donanımınızın potansiyelini sonuna kadar kullanarak, 140 FPS gibi etkileyici bir gerçek zamanlı yüz noktalama performansı elde etmek mümkün hale gelecektir.
Gerçek Dünya Senaryoları: Bu Uygulama Nerelerde Kullanılabilir?
Yüksek FPS'te çalışan gerçek zamanlı bir yüz noktalama uygulaması, hayata geçirdiğimiz teknolojiyle sınırlı kalmayıp, birçok farklı endüstri ve kullanım alanında çığır açıcı potansiyele sahiptir. İşte bu tür bir uygulamanın kullanılabileceği bazı gerçek dünya senaryoları:
1. Artırılmış Gerçeklik (AR) ve Sanal Gerçeklik (VR) Deneyimleri:
* Sosyal Medya Filtreleri: Kullanıcıların yüzlerine anlık olarak uygulanan şapkalar, gözlükler, makyaj veya karakter maskeleri gibi AR filtreleri, 140 FPS sayesinde neredeyse hiç gecikme olmadan, ultra gerçekçi ve akıcı bir şekilde çalışabilir. Bu, kullanıcı deneyimini önemli ölçüde artırır.
* Sanal Deneme Odaları: E-ticaret siteleri, müşterilerin gözlük, şapka veya kozmetik ürünlerini sanal olarak denemelerine olanak tanıyabilir. Yüksek doğruluk ve hız, ürünlerin yüze mükemmel oturmasını sağlar.
* Oyun ve Eğlence: Oyunlarda, oyuncunun yüz ifadelerini doğrudan oyun içi karakterlere yansıtmak (face tracking for avatars) veya yüz hareketleriyle oyun içi komutlar vermek mümkün olur.
2. Güvenlik ve Gözetim Sistemleri:
* Sürücü Yorgunluk/Dikkat Dağınıklığı Tespiti: Araç içi kameralar, sürücünün göz kapaklarının açılıp kapanma oranını, esneme sıklığını veya baş hareketlerini analiz ederek yorgunluk veya dikkat dağınıklığı belirtilerini gerçek zamanlı olarak algılayabilir. 140 FPS, bu kritik durumlarda anında uyarılar verilmesini sağlar.
* Erişim Kontrol ve Biyometrik Doğrulama: Yüz tanıma sistemlerinde, yüz noktalama, daha sağlam ve spoofing'e (sahtekarlık) karşı dayanıklı bir doğrulama katmanı sağlayabilir. Canlılık tespiti (liveness detection) için yüzdeki mikro hareketlerin analizi yapılabilir.
* Davranış Analizi: Kalabalık alanlarda, belirli yüz ifadeleri veya baş hareketleri üzerinden potansiyel tehlikeler veya anormal davranışlar tespit edilebilir.
3. Sağlık ve Tıp Uygulamaları:
* Tele Tıp ve Teletıbbi Muayene: Uzaktan yapılan muayenelerde, doktorlar hastaların yüz ifadelerindeki asimetrileri veya belirli hareket bozukluklarını (örneğin Parkinson hastalarında) yüksek hassasiyetle izleyebilirler.
* Fizyoterapi ve Rehabilitasyon: Yüz felci geçiren hastaların rehabilitasyon süreçlerinde, egzersizlerin doğruluğunu ve ilerlemeyi gerçek zamanlı olarak izlemek için kullanılabilir.
* Duygu Analizi: Otizm spektrumundaki bireylerin sosyal ipuçlarını anlamalarına yardımcı olmak için veya psikolojik araştırmalarda katılımcıların tepkilerini objektif olarak kaydetmek için kullanılabilir.
4. Perakende ve Pazarlama:
* Müşteri Deneyim Analizi: Mağazalardaki kameralar, müşterilerin belirli ürünlere veya reklamlara verdiği tepkileri (şaşkınlık, ilgi, memnuniyetsizlik vb.) yüz ifadeleri üzerinden analiz ederek pazarlama stratejilerini optimize edebilir.
* Kişiselleştirilmiş Reklamlar: Dinamik reklam panoları, görüntüleyen kişinin demografik özelliklerine veya o anki ruh haline göre içeriği kişiselleştirebilir.
5. Eğitim ve Uzaktan Öğrenme:
* Öğrenci Katılım Takibi: Uzaktan eğitim sırasında öğrencilerin derse olan dikkat seviyelerini veya anlama güçlüklerini yüz ifadeleri üzerinden tahmin etmek, öğretmenlere geri bildirim sağlayabilir.
* Sanal Öğretmenler: Yapay zeka tabanlı sanal öğretmenler, öğrencinin tepkilerine göre dersin hızını veya içeriğini ayarlayabilir.
Bu senaryolar, YOLOv9 ve MediaPipe ile oluşturduğumuz bu uygulamanın sadece birkaç potansiyel kullanım alanını temsil ediyor. Yüksek hız ve doğruluk kombinasyonu, bu tür teknolojilerin günlük hayatımıza daha derinlemesine entegre olmasının önünü açarak, daha akıllı ve etkileşimli deneyimler sunma potansiyeli taşıyor.
Sonuç ve Gelecek Perspektifleri
Bu teknik makalede, YOLOv9 ve MediaPipe'ı bir araya getirerek 140 FPS hızında çalışan gerçek zamanlı bir yüz noktalama uygulamasının nasıl geliştirilebileceğini ayrıntılı bir şekilde inceledik. Modern yapay zeka ve bilgisayar görüşü tekniklerinin gücünü, performans optimizasyon stratejileriyle birleştirerek, bu iddialı hedefe ulaşmanın yol haritasını çizdik. Başlangıçta temel kavramları ele alarak, YOLOv9'un hızlı yüz tespitindeki rolünü ve MediaPipe'ın hassas yüz noktalama yeteneklerini ayrı ayrı inceledik. Ardından, bu iki teknolojiyi entegre eden mimariyi tasarladık ve pratik bir kod örneğiyle uygulama geliştirme sürecini adım adım gösterdik. Son olarak, bu performansı sağlamak için gerekli olan donanım hızlandırma, model optimizasyonu ve işlem hattı yönetimi gibi kritik optimizasyon tekniklerini tartıştık ve uygulamanın çeşitli gerçek dünya senaryolarındaki potansiyelini gözler önüne serdik.
Geliştirdiğimiz bu uygulama, sadece teknik bir başarı değil, aynı zamanda yapay zeka alanındaki sürekli ilerlemenin bir göstergesidir. Yüksek FPS oranları, uygulamaların daha duyarlı, daha doğal ve daha etkileşimli olmasını sağlayarak kullanıcı deneyimini kökten değiştirebilir. Gelecekte, bu tür teknolojilerin daha da optimize edilmesi ve yeni donanım platformlarına adapte edilmesiyle, çok daha yüksek performans seviyelerine ulaşmak mümkün olacaktır. Örneğin, daha entegre ve özel AI yongaları, bu tür görevleri daha enerji verimli ve daha hızlı bir şekilde gerçekleştirebilir. Ayrıca, bu teknolojilerin mobil cihazlara ve gömülü sistemlere daha derinlemesine entegrasyonu, günlük yaşamımızın her alanında akıllı yüz analizi yeteneklerinin yaygınlaşmasına olanak tanıyacaktır. Duygu tanıma, sağlık izleme ve kişiselleştirilmiş insan-bilgisayar etkileşimi gibi alanlarda yeni kapılar açılacağı kesindir. Bu rehber, yüksek performanslı bilgisayar görüşü uygulamaları geliştirmek isteyenler için sağlam bir temel oluşturmaktadır ve gelecekteki yeniliklere ilham vermesini umuyoruz.
Sıkça Sorulan Sorular
1. YOLOv9 yerine başka bir YOLO versiyonu kullanabilir miyim?
Evet, prensip olarak başka YOLO versiyonlarını da kullanabilirsiniz. Ancak YOLOv9, hem doğruluk hem de hız açısından önemli iyileştirmeler sunan en yeni modellerden biridir. Daha eski versiyonlar (örn. YOLOv5, YOLOv8) da işinizi görebilir, ancak 140 FPS hedefine ulaşmak için daha fazla optimizasyon veya daha güçlü donanım gerekebilir. Seçiminiz, projenizin spesifik performans ve doğruluk gereksinimlerine bağlıdır.
2. MediaPipe Face Landmarker modelini nereden indirebilirim?
MediaPipe Face Landmarker model dosyalarını (örn. face_landmarker_heavy.task veya face_landmarker_lite.task), Google'ın resmi MediaPipe örneklerinden ve dokümantasyonundan indirebilirsiniz. Genellikle MediaPipe'ın GitHub deposunda veya developers.google.com/mediapipe/solutions/vision/face_landmarker adresinde ilgili bağlantıları bulabilirsiniz.
3. Uygulama neden 140 FPS'e ulaşmıyor? Ne yapmalıyım?
Uygulamanızın 140 FPS'e ulaşmamasının birkaç nedeni olabilir:
* Donanım Sınırlamaları: Özellikle güçlü bir NVIDIA GPU'nuz yoksa bu performansa ulaşmak zor olabilir. CPU üzerinde çalışmak çok daha yavaş olacaktır.
* Model Seçimi: yolov9c.pt yerine daha hafif bir YOLOv9 modeli (örn. yolov9s.pt) veya face_landmarker_heavy.task yerine face_landmarker_lite.task kullanmayı deneyin.
* Optimizasyon Eksikliği: CUDA, TensorRT gibi hızlandırmaları doğru kurduğunuzdan ve kullandığınızdan emin olun. Python'daki GIL nedeniyle, çoklu iş parçacığı yerine çoklu işlem (multiprocessing) denemek gerekebilir.
* Kamera Sınırlaması: Kameranızın kendisi saniyede 140 kareden daha az kare yakalıyor olabilir. Daha yüksek FPS destekleyen bir kamera kullanmanız gerekebilir.
* Görüntü Çözünürlüğü: İşlenen karelerin çözünürlüğünü düşürmek de performansı artırabilir.
4. Bu uygulama mobil cihazlarda çalışır mı?
Temelde evet, MediaPipe platformlar arası bir çerçeve olduğu için mobil cihazlar (Android/iOS) için de destek sunar. YOLO modellerinin mobil versiyonları (örn. YOLO-NCNN, YOLO-TFLite) da mevcuttur. Ancak, Python tabanlı bu örnek kodu doğrudan mobil cihazlarda çalıştıramazsınız. Mobil için C++ veya Java/Kotlin (Android), Swift/Objective-C (iOS) gibi dillerde MediaPipe'ın yerel API'lerini ve optimize edilmiş YOLO modellerini entegre etmeniz gerekir. Mobil cihazlarda 140 FPS elde etmek, genellikle özel AI çipleri olan üst düzey cihazlarda mümkün olacaktır.
5. Yüz noktalama verilerini ne için kullanabilirim?
Yüz noktalama verileri çok çeşitli uygulamalar için kullanılabilir:
* Yüz İfadesi Tanıma: Noktalar arasındaki mesafeler veya açı değişiklikleri, sevinç, üzüntü, şaşkınlık gibi duyguları tespit etmek için kullanılabilir.
* 3D Yüz Modelleme: 2D noktalardan 3D yüz ağları oluşturmak mümkündür.
* AR Filtreleri: Sanal gözlük, maske veya makyaj gibi artırılmış gerçeklik efektlerini yüz üzerine sabitlemek için.
* Baş Pozu Tahmini: Başın uzaydaki yönünü (yaw, pitch, roll) tahmin etmek için.
* Göz Takibi: Gözlerin hareketini izleyerek bakış yönünü veya dikkat odağını belirlemek için.
