Selam Makerlar,
Bu projenin amacı, kullanıcının ruh halini anlamak ve o anki duygusuna uygun bir müzik çalmak. Mesela, mutluysanız enerjik ve keyifli bir melodi, üzgünseniz daha sakin ve duygusal bir şarkı sizi karşılayabilir.
Raspberry Pi, bu iş için mükemmel bir yardımcı! Hem görüntüleri analiz ediyor hem de duyguya göre müzik seçimini yapıp çalıyor. Küçük ama güçlü bu cihazla, hem eğlenceli hem de etkileyici bir sistem oluşturabilirsiniz.
Sırası ile proje adımları şu şekilde:
- Raspberry Pi Kurulumu
- Dışarıdan görüntü alma
- Duygu durumu tespiti
- Uygun Müzik Seçimi
- Müziği oynatma
Kullanılan Malzemeler
- 1 adet Raspberry Pi 5 – 8GB
- 1 adet Raspberry Pi Kamera Modülü
- Raspberry Pi Kamera Kablosu Standard – Mini – 200mm
- 1 adet Buzzer
- 1 adet SD Kart
- Raspberry Pi Güç Adaptörü
- Breadboard
- Dişi-Erkek Jumper kablolar
Kullanılan Kütüphaneler:
- OpenCV: OpenCV (Open Source Computer Vision) açık kaynak kodlu görüntü işleme kütüphanesidir
- Matplotlib: Matplotlib; veri görselleştirmesinde kullandığımız temel python kütüphanesidir. 2 ve 3 boyutlu çizimler yapmamızı sağlar.
- Keras: Theano, CNTK veya TensorFlow üzerinde çalıştırılabilen, Python’da yazılmış, açık kaynaklı ve üst düzey bir sinir ağı kitaplığıdır.
- Tensorflow: Derin öğrenme için açık kaynaklı bir kütüphanedir.
- Numpy: Çok boyutlu diziler ve matrislerle çalışmamızı sağlayan, bilimsel hesaplamaları hızlı bir şekilde yapmamızı sağlayan bir matematik kütüphanesidir.
Raspberry Pi için kurulum yapıyoruz. Dilerseniz kurulum videosuna buradan ulaşabilirsiniz. Bir yandan da buzzerı Raspberry Pi’nin GPiO 17 pinine bağlantısını yapıyoruz.
Öncelikle görüntü işleme yapacağımız için hazır bir model kullanıyoruz. Model aşağıdaki github linkinde bulunuyor. Oradaki FER_model.h5 isimli dosyayı indiriyoruz. Konsol ekranında proje için gerekli olan kütüphaneleri yüklüyoruz.
sudo pip install python-opencv
sudo pip install numpy==1.24.4
sudo pip install tensorflow
Bu komutları yazdığımızda aşağıdaki gibi bir sorun ile karşılaşırsak;
sudo rm /usr/lib/python3.x/EXTERNALLY-MANAGED
Komutu ile sorunu çözebiliriz.
Rapberry Pi’ de bulunan Thonny programında kütüphaneler import edildikten sonra aşağıdaki kodu alıyoruz. Kodun gerekli kısmına dosya yolunu vererek modelimizi yüklüyoruz.
Model Linki: https://github.com/SajalSinha/Facial-Emotion-Recognition/blob/main/FER_model.h5
Bu Python kodu, bir Raspberry Pi kullanarak gerçek zamanlı duygu tespiti ve uygun bir şarkının çalınmasını sağlar. Keras ile eğitilmiş bir yüz ifadesi tanıma modeli kullanılarak kamera görüntülerindeki yüz ifadeleri analiz edilir. Tespit edilen duygulara göre bir buzzer aracılığıyla uygun tonlarda müzik çalınır. Duygular değiştiğinde, yeni bir şarkı otomatik olarak oynatılır. Ayrıca OpenCV ile yüzler çerçeve içine alınarak tespit edilen duygu ekranda gösterilir. Kod, PiCamera2 ve GPIO kontrolü gibi Raspberry Pi özelliklerini içerir.
PYTHON KODU:
import cv2
import numpy as np
import tensorflow as tf
from keras.models import load_model
from picamera2 import Picamera2
import RPi.GPIO as GPIO
from time import sleep
# Buzzer ayarları
BUZZER_PIN = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(BUZZER_PIN, GPIO.OUT)
buzzer = GPIO.PWM(BUZZER_PIN, 1000) # 1 kHz PWM sinyali
# Notalar ve şarkılar
tones = {
"C4": 262, # Do
"D4": 294, # Re
"E4": 330, # Mi
"F4": 349, # Fa
"G4": 392, # Sol
"A4": 440, # La
"B4": 494, # Si
"C5": 523, # Do (yukarı oktav)
"P": 0 # Sessizlik
"E5": 659,
"G5":784,
"A5":880,
"B5":987,
}
songs = {
"Happy": ["E5", "G5", "A5", "P", "E5", "G5", "B5", "A5", "P"],
"Sad": ["F4", "F4", "E4", "E4", "D4", "D4", "C4", "P"],
"Angry": ["C4", "C4", "G4", "G4", "A4", "A4", "G4", "P"],
"Suprise":["F4", "F4", "E4", "E4", "D4", "D4", "C4" ]
}
# Yüz tanıma modeli ve sınıflandırıcı
model = load_model('/home/pi/FER_model.h5')
emotion_labels = ['Angry', 'Disgust', 'Fear', 'Happy', 'Sad', 'Surprise', 'Neutral']
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# Buzzer fonksiyonları
def playtone(frequency):
if frequency != 0:
buzzer.start(50)
buzzer.ChangeFrequency(frequency)
else:
buzzer.stop()
def bequiet():
buzzer.stop()
def playsong(mysong):
for note in mysong:
if note == "P":
bequiet()
else:
playtone(tones[note])
sleep(0.2)
bequiet()
# Duygu tespiti fonksiyonu
def get_emotion_from_image(image):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
if len(faces) == 0:
return image, "No face detected"
for (x, y, w, h) in faces:
face = gray[y:y+h, x:x+w]
face = cv2.resize(face, (48, 48))
face = face.astype('float32') / 255
face = np.expand_dims(face, axis=-1)
face = np.expand_dims(face, axis=0)
emotion_predictions = model.predict(face)
max_index = np.argmax(emotion_predictions[0])
predicted_emotion = emotion_labels[max_index]
# Çerçeve ve metin çizimi
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.putText(image, predicted_emotion, (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2, cv2.LINE_AA)
return image, predicted_emotion
return image, "No emotion detected"
# Kamera kurulumu
picam2 = Picamera2()
picam2.configure(picam2.create_preview_configuration())
picam2.start()
# Gerçek zamanlı görüntü işleme
last_emotion = None # Son algılanan duygu
try:
while True:
frame = picam2.capture_array()
image, predicted_emotion = get_emotion_from_image(frame)
# Yeni bir duygu algılandığında şarkıyı değiştir
if predicted_emotion != last_emotion:
print(f"Duygu değişti: {predicted_emotion}")
if predicted_emotion in songs:
playsong(songs[predicted_emotion])
else:
print("Tanımlı olmayan bir duygu algılandı.")
last_emotion = predicted_emotion # Yeni duyguyu kaydet
# Görüntüyü ekranda göster
cv2.imshow("Emotion Detection", image)
# Çıkış için 'q' tuşu
if cv2.waitKey(1) & 0xFF == ord('q'):
break
except KeyboardInterrupt:
print("Çıkış yapılıyor...")
finally:
# Kaynakları temizle
picam2.close()
buzzer.stop()
GPIO.cleanup()
cv2.destroyAllWindows()