Kamera verilerini işleme

Başlatan robikod, 11 Nisan 2022, 11:05:47

robikod

Merhabalar şu şekilde bir sistem kurmak istiyorum bu konuda bana tavsiye verebilecek varsa çok sevinirim.

Kameradan bir video kaydı alacağım ve bu kayıttaki videoya efekt yapacağım. Aynı zamanda bu sistemin arkasında yüz tanıma özelliği de işliyor olacak.Aklıma bu veriyi video streaming ile server bilgisayara aktarıp orada işlemek geldi fakat bu son tercih edeceğimm konu olacak.
Kameraya bağlı bir esp32 modül ile bu işlem yapılabilir mi ? Ya da bir server bilgisayardan bağımsız şekilde, aldığım video verisinde işlemci üzerinde görüntü işleme efekt gibi işlemler yapabilir miyim ?

Bu konuda bana nasıl bir yol izlememi önerirsiniz ?

muhendisbey

Gerçek manada yüz tanıma için ESP yetersiz kalır. ESP kendi başına görüntü alma ve gönderme konusunda dahi fps değerleri iyi değil. Düşük çözünürlük kullansan bu sefer de yüzün kime ait olduğu değil sadece yüz var tanımlaması yapılabilir. Gerçek anlamda bir yüz tanıması için raspberry pi bile yavaş kalabilir, ama bir yere kadar da imkansız değil. Kullanıcı sayısı, ne kadar güvenlikli bir algoritma kullanıldığı burada belirleyici olacaktır.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

power20

Cep telefonundaki yüz tanıma özelliği başarılı gibi. Sanırım kemik yapısına bakılıyor. Yüz ifadesi, saç şekli vb önemli olmuyor. Bu mantıkla iş kolaylaşabilir.

robikod

#3
Peki videodan kaydı alıp nasıl işlemeliyim ? Bunu illa bir bilgisayar mı yapmalı ? Python ile görüntü işlememi koşturmalıyım ?

kimlenbu

OpenCV benzeri bir kütüphane kullanabileceğiniz ve yeterli işlem gücüne sahip bir application processor kullanmanız gerekiyor. MCU ile çok zorlanırsınız, kaynaklar çok kısıtlı, harici ram kullansanız bu sefer kullanılan kütüphaneleri ekleyince bile kod alanına sığdırmak için iyice budamanız gerekecek.

Linux koşturan bir kart üzerinde hem kameradan rahatça veri alırsınız, hem depolama sıkıntınız olmaz, hem ram sıkıntınız olmaz. Nvidia jetson tarzı bir platform pahalı gelmezse tam aradığınız geliştirme ortamı.

robikod

Alıntı yapılan: kimlenbu - 11 Nisan 2022, 15:31:50OpenCV benzeri bir kütüphane kullanabileceğiniz ve yeterli işlem gücüne sahip bir application processor kullanmanız gerekiyor. MCU ile çok zorlanırsınız, kaynaklar çok kısıtlı, harici ram kullansanız bu sefer kullanılan kütüphaneleri ekleyince bile kod alanına sığdırmak için iyice budamanız gerekecek.

Linux koşturan bir kart üzerinde hem kameradan rahatça veri alırsınız, hem depolama sıkıntınız olmaz, hem ram sıkıntınız olmaz. Nvidia jetson tarzı bir platform pahalı gelmezse tam aradığınız geliştirme ortamı.

Peki mesela işlemleri uzak bir bilgisayarda yapmak istesem, kameraya bağlı bir esp32 modül ile görüntü verisini bu bilgisayara aktarıp opencv koştursam uygun olur mu ?

MC_Skywalker

#6
Bu iş için OpenCV + Tensorflow/Pytorch ve RasPi 4 veya Nvidia Jenson Nano ailesinden bir ürün kulanmanız gerekli. Bilgisayar ile yapmak için en az CUDA: 10.2.460  destekli GPU barındıran ekran kartı işinizi görür.

Tanınacak yüzler için DNN (Deep Nural Network) eğitimek bayağı bir hesaplama gücü istiyor. Kişisel tavsiyem Nvidia Jetson Nano 4Gb kartını kullanmanız. Hem USB üzerinde webcam (logitec C270 gibi) baylabilir hem V2.0 RasPi cam modülü bağlaya bilirsiniz. Jetson Nano 2Gb olan versionu piyasada yok.

Alıntı yapılan: robikod - 11 Nisan 2022, 15:47:47Peki mesela işlemleri uzak bir bilgisayarda yapmak istesem, kameraya bağlı bir esp32 modül ile görüntü verisini bu bilgisayara aktarıp opencv koştursam uygun olur mu ?

RTMP ile stream edip daha son başk bir makinede videoyu işleyebilirsiniz. Ağ gecikmesini göz önüne almalısınız.

robikod

Alıntı yapılan: MC_Skywalker - 11 Nisan 2022, 15:53:18Bu iş için OpenCV + Tensorflow/Pytorch ve RasPi 4 veya Nvidia Jenson Nano ailesinden bir ürün kulanmanız gerekli. Bilgisayar ile yapmak için en az CUDA: 10.2.460  destekli GPU barındıran ekran kartı işinizi görür.

Tanınacak yüzler için DNN (Deep Nural Network) eğitimek bayağı bir hesaplama gücü istiyor. Kişisel tavsiyem Nvidia Jetson Nano 4Gb kartını kullanmanız. Hem USB üzerinde webcam (logitec C270 gibi) baylabilir hem V2.0 RasPi cam modülü bağlaya bilirsiniz. Jetson Nano 2Gb olan versionu piyasada yok.

RTMP ile stream edip daha son başk bir makinede videoyu işleyebilirsiniz. Ağ gecikmesini göz önüne almalısınız.

Teşekkür ederim bilgiler için, peki görüntü işleme aşamasını daha sonraya bıraksam görüntü aldığım videoyu başka bir noktaya göndermek için esp32 kullanabilir miyim ? Maliyeti düşük olduğu için şimdilik esp32 düşündüm.

MC_Skywalker

#8
saniyede 1920 x 1080 x 30 = 62208000 bit veriyi gecikmesiz iletmezi gerekli FD istiyorsanız HD için 1280 x 720 x 30 = 27648000 bit veriyi gecikmesiz iletmelisiniz.

Tensorflow lite desteği ESP32-EYE kartına gelmiş https://www.espressif.com/en/products/devkits/esp-eye/overview
Tensorflow'un web sitesinden detay öğrenebilirsiniz https://www.tensorflow.org/lite/microcontrollers

robikod

Alıntı yapılan: MC_Skywalker - 11 Nisan 2022, 16:37:59saniyede 1920 x 1080 x 30 = 62208000 bit veriyi gecikmesiz iletmezi gerekli FD istiyorsanız HD için 1280 x 720 x 30 = 27648000 bit veriyi gecikmesiz iletmelisiniz.

Tensorflow lite desteği ESP32-EYE kartına gelmiş https://www.espressif.com/en/products/devkits/esp-eye/overview
Tensorflow'un web sitesinden detay öğrenebilirsiniz https://www.tensorflow.org/lite/microcontrollers

Yani bu kart ile yüz tanıma yapabilir miyim ?

MC_Skywalker

Alıntı yapılan: robikod - 12 Nisan 2022, 16:20:41Yani bu kart ile yüz tanıma yapabilir miyim ?

Kişi veya yüz algılama yapabilirsiniz. Yüz tanıma işi çok yüksek işlem gücü gerektirir sinir ağının eğitilmesi için.

Şöyle söyleyeyim şu örneği https://www.tensorflow.org/tutorials/keras/classification RTX3070 Max Q ile eğittiğimde laptop fanları jet motoru gibi çalışıyor ve GPU sıcaklığ 79 dereceye çıkıyor.

Eğitimi dışarda güçlü bir makinada yapıpı düşük güçlü rpi gibi bir doanımda tanımayı yapabilirsiniz.

kasif

ESP32-cam de yüz tanıma özelliği var, ama ne kadar sağlıklı ve güvenilir emin değilim. Aktif edince fps baya düşüyor nerdeyse 1 oluyor.

Yani var ama  :du:

robikod

#12
Projemi maliyet açısında biraz değiştirdim, malum ekonomik problemler  ;)
Şu şekilde yapmayı düşünüyorum, bir kamera ile görüntü alıp bunu bir ekranda kullanıcıya göstermek. Bu görüntüyü bir web sitesi üzerinden kullanıcının indirmesini sağlamak.
Bunu minimum maliyetle nasıl yapabilirm ? Ne kullanabilrim bunun için ?
ESP cam'e baktım çözünürlüğü 2MP biraz daha yüksek bir çözüm arıyorum.

hasankara

esp32-s3-eye diye bir kit var araştırılabilir. Donanımsal olarak kamera ve lcd modülleri destekliyor. n8r8 de 8mbyte spi ram bulunuyor sanırım bir takım kütüphaneyi koşturmak için yeterli olabilir. https://www.youtube.com/watch?v=0ZkG02dX3ts&ab_channel=JoyWang

MC_Skywalker

#14
Alıntı yapılan: robikod - 14 Nisan 2022, 14:39:49ESP cam'e baktım çözünürlüğü 2MP biraz daha yüksek bir çözüm arıyorum.

ESP cam üzerindeki OV2640_DS çipi UXGA (1632x1232). Siz 1920 x 1080 ~= 2MP den yüksek çözünürlük isitiyorsunuz internetinizinde Fiber olması gerekli.

Raspberriy Pi zero ve V1.3 MP lik kamerası işinizi görür.

Görütüye bakacak bilgisayra Python 3 https://www.python.org/downloads/release/python-386/ adresinden kurduktan sonra

pip kulanıp aşağıdaki modülleri kurun
Alıntı Yapopencv
numpy
imutils
pillow
imageio
imageio-mpeg
face_recognition
dlib

daha sonra
haarcascade-frontalface-default.xml
dosyasını indirin videonuzun olduğu klasöre kopyalayın. aşağıdaki kodları py dosyası olarak kaydedip çalıştırın ve video içindeki yüzlerin bulunup işaretlenmesini bekleyin.

# Kütüphanelerimizi yükleyelim
import cv2 as cv
import imageio
# imageio kütüphanesini videoyu okumak ve video yazdırmak için kullanacağız
# Eğer imageio ve imageio-ffmpeg kütüphanesini yüklemediyseniz aşağıdaki terminal kodları ile yükleyebilirsiniz:
# pip install imageio
# pip install imageio-mpeg


# cv.CascadeClassifier fonksiyonu ile ön yüz cascade'imizi yüklüyoruz.
face_cascade = cv.CascadeClassifier('haarcascade-frontalface-default.xml')

# detect isminde bir fonksiyon oluşturalım. Burada frame adında bir parametre belirliyoruz. Bu fonksiyonu az sonra çağıracağız
def detect(frame):
    # Resmi gri renk şemasına dönüştürelim
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

    # detectMultiScale() fonksiyonu ile verilen görüntüde CascadeClassifier fonksiyonu ile aldığımız cascade filtresini uyguluyoruz
    faces = face_cascade.detectMultiScale(gray, 1.1, 5)
    # Buradaki 1.1 değeri, resmin ne kadar küçültüleceğinin oranıdır
    # 5 değeri ise objenin minimum komşu sayısıdır


    # Birden fazla yüz olabilir. Bundan dolayı tamamını bir döngü içerisine yazacağız
    for (x, y, w, h) in faces:
        # Tespit edilen resimdeki yüzleri daha öncesinde gördüğümüz rectangle fonksiyonu ile kırmızı dikdörtgenler içerisine alıyoruz.
        cv.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 5)

        # Burada gri renk şeması üzerinde yüzün koordinatlarını belirliyoruz
        # y+h -> dikdörtgenin alt konumunu belirler
        # x+w -> dikdörtgenin sağ konumunu belirler
        gray_face = gray[y:y + h, x:x + w]

        # Burada da renkli resim üzerindeki yüzün koordinatlarını belirliyoruz
        color_face = frame[y:y + h, x:x + w]
        # Bu değerleri farklı şekillerde de kullanabilirsiniz

    # Sonrasında frame'i döndürüp fonksiyonu tamamlayalım
    return frame

# imageio kütüphanesini kullanarak girdi videomuzu okuyoruz
reader = imageio.get_reader('video.mp4')

# Burada fps ifadesini görüyoruz.
# Videolar saniyede peşpeşe 25-35 arası resimden oluşur. fps ifadesi de bunu ifade etmektedir.
fps = reader.get_meta_data()['fps']

# Burada da imageio kütüphanesinin writer fonksiyonunu kullanarak fps ile aldığımız resimleri videoya yazdırıyoruz
writer = imageio.get_writer('output.mp4', fps=fps)

# Aşağıdaki satır ile her bir fps için detect fonksiyonunu çalıştıracağız
for i, frame in enumerate(reader):
    # Yukarıda yazdığımız detect fonksiyonunu uyguluyoruz
    frame = detect(frame)

    # Buradaki append_data fonksiyonu ile her bir frame'i output videosuna ekliyoruz
    writer.append_data(frame)

    #Bir de kaçıncı frame'in işlendiğine bakalım
    print(i)

# Son olarak yazdığımız videoyu kapatalım
writer.close()