Yüz Tanıma Sistemi ve Görüntü İşleme nasıl yapılır? Rasperry pi, OpenCV

Yazar:

GenelGörüntü İşleme

ÖZET

Bu çalışmada Raspberry Pi ve Pi kamera modülü ile eş zamanlı olarak görüntü alımı, alınan görüntü üzerinde OpenCv kütüphanesi yardımıyla veri tabanına kaydedilmiş bir yüzün kamera ile tespiti ele alınmıştır.  Güvenlik ve diğer alanlarda kullanımı oldukça yaygın olan insan yüzünün tespiti ile tespit edilen bu yüzlerin sonrasında veri tabanına kayıtlı olan kişi ya da kişileri tanımlayabilir ve bunun akabinde işlem yaptırabiliriz. Bu çalışmada istersek Pi kamera modülünü kullanarak veri tabanına kayıt yaptırabilir ya da güncelleyebiliriz.  Veri tabanında kayıtlı olan bu kişi ya da kişileri kamera ile tespit edip güvenlik birimlerine haber verme, kapı açma, personel kontrolü, güvenlik sistemleri tasarımı vb. bir çok alanda kullanılabilir.

Görüntü İşleme Nasıl Yapılır?

Görüntü işleme, bir görüntüyü elde etmek ya da elimizde bulunan görüntüden  yararlı bilgiler çıkarmak için çeşitli algoritmalar kullanarak görüntü üzerinde bazı işlemlerin gerçekleştirilme yöntemidir. Görüntü işlemelerinin temel adımları şunlardır:

  1. Görüntünün çalışma ortamına aktarılması
  2. Alınan görüntünün işlenerek analiz edilmesi ve görüntülenmesi
  3. Analiz sonucu görüntü raporunun ortaya çıkması

Görüntü işleme aslında matrisler üzerinde yapılan işlemler bütünü diyebiliriz. Genellikle resimlere baktığımızda çeşitli renklerin bir araya geldiği kareden ibaret olduğunu düşünebiliriz. Halbuki resimi en küçük parçalara böldüğümüzde bizi çok boyutlu matrisler karşılıyor. Bu matrislerin her bir elemanına iyi bildiğimiz bir kelime olan piksel  adını veriyoruz. Ve biz görüntü işleme yöntemlerinde pikseli oluşturan matris hücrelerinin üzerinden işlemler yapıyoruz. Aşağıda gördüğünüz görsel yukarıdaki paragrafın vücut bulmuş hali diyebiliriz.

Görüntü İşlemede Görselin Matrise Dönüşmüş Hali

Her bir matris hücresinde gördüğünüz sayılar aslında RGB ( Red [kırmızı], Green [yeşil], Blue [mavi] ) renk uzayının 0 ile 255 arasında olan birer sayısal değerdir. Mesela matrisin ilk satır ve ilk sütunda olan 157 değerimizi incelediğimizde rgb renk değerlerinin ağırlığını RedGreenBlue (157,157,157) olarak yazabiliriz. 3 ana renge bu değeri verdiğiniz zaman resimdeki ilk satır ve ilk sütunda olan rengin ortaya çıktığını görebilirsiniz.

Girilen RGB Değerlerine Göre Ortaya Çıkan Piksel Rengi

Görüntü İşleme Ne İşe Yarar?

Günümüz teknolojilerinde oldukça sık kullanılan görüntü işleme yöntem ve teknolojileri vardır. Görüntü işleme yapmanın temel amaçları aşağıdaki gibidir.

Bunlar:

  1. Yüz Tanıma
  2. Görüntü üzerinde tespiti zor olan objeleri gözlemleyebilme
  3. Gürültü temizleme, keskinleştirme ve görüntü restorasyonu (temizleme) yapma
  4. Yüksek çözünürlükte görüntüler elde etme
  5. Nesne tanıma
  6. Görüntü tanıma ve nesne ayırt etme

olarak sıralayabiliriz.

Görüntü İşlemenin Kullanıldığı Alanlar

Görüntü işleme yöntem ve teknikleri günümüzde bir çok alanda kullanılır. Görüntü işleme çok geniş bir konsepttir. Sağlık alanında insan hastalıklarını tespitine kadar kullanılmaktadır.

Ayrıca,

  • Robot teknolojileri
  • Savunma sanayisi
  • İnsansız hava araçları
  • Montaj Hatları (Örneğin, otomobil üretim hattında çalışan otomasyon robotları)
  • Snapchat, Instagram’da kullanılan gerçek zamanlı filtreler
  • Yüz kilidi teknolojisi
  • Google harita teknolojisi

ve daha bir çok alanda görüntü işleme teknolojisi mevcuttur. 

Projede Kullanılan Kütüphaneler:

OpenCV (Open Source Computer Vision)

OpenCV  Intel Corporation , Willow Garage , Itseez tarafından geliştirilen gerçek zamanlı görüntü işlemede kullanılan programlama fonksiyonlarını içeren açık kaynak kodlu bir kütüphanedir. Google, Nvidia, AMD gibi büyük şirketler  ve bir çok toplulukların destekleri ile OpenCV kütüphanesinin geliştirme süreci devam etmektedir. OpenCV kütüphanesinin içerisinde görüntü işleme ve makine öğrenmesine yönelik 2500’den fazla algoritma bulunmaktadır. Bu algoritmalar ile yüz tanıma, hareket tespiti, OCR (Optical Character Recognition) metin tanıma, plaka tanıma, nesneleri ayırt etme gibi işlemler kolaylıkla yapılabilmektedir.

OPENCV DETAYLI ANLATIMI: http://mesutpiskin.com/blog/wp-content/uploads/2017/01/OpenCV%20Kitap.pdf

Hangi Dilleri Destekliyor?

  1. Python
  2. C / C++
  3. Java
  4. Matlab

NumPy

NumPy Python’da bilimsel hesaplamalar için kullanılan bir pakettir. Çok boyutlu diziler ve çeşitli türetilmiş nesneler (matrisler gibi) üzerinde hızlı işlemler yapabilmek için kullanılır. Ayrıca matematiksel, mantıksal, sıralama, seçme, giriş/çıkış dahil olmak üzere çeşitli yordamlar sağlayan Python kütüphanesidir.[1]

Rasperry pi Kamera Modülü Çalışma Prensibi:

5MP çözünürlüğe sahip kamera modülü 1080p video ve fotoğraf çekebilmektedir. Üzerinde bulunan ribbon kablo ile doğrudan Raspberry CSI (Camera Serial Interface) portuna bağlanır. Kameranın üzerinde bulunduğu kartın boyutları 25x20mm olup, kamera dahil derinliği 9mm’dir ve ağırlığı yalnızca 3gr’dır. Hafif ve ufak olması bir çok noktada bize avantaj sağlamaktadır.

Modülün üzerinde 5MP çözünürlüklü kamera sahip olup sabit odaklı bir lens bulunmaktadır. 2592 x 1944 piksel statik resim çözünürlüğü sunan kamera, video çekimlerinde ise 1080p30, 720p60 ve 640x480p60/90 çözünürlüğünü desteklemektedir. Kamera modülü ses kayıdı yapmamaktadır.


Proje Tasarımı:

Projemizde kullanılan Pi Kamera Modülünün bağlantı şekli aşağıda ki gibidir. Raspberry Pi model B üzerinde bulunan sokete kameramızı takıyoruz.

Raspberry Pi model B kullanarak yaptığımız bu projede OpenCv kütüphanesini kuracağımız için ilk olarak Python sürümünün Python 3.7 olması gereklidir. Çünkü Python 3 altı sürümler  OpenCv kütüphanesini desteklememektedir.

Raspberry Pi’nin Python sürümünü Python 3.7 yapmak için kullanılan komutlar aşağıda ki gibidir;

Gerekli Python Sürümü Kurulumu:

Kütüphaneleri Güncellemek için aşağıda ki kodları kullanabiliriz.

sudo apt-get update -y

sudo apt-get install build-essential tk-dev libncurses5-dev libncursesw5-dev libreadline6-dev libdb5.3-dev libgdbm-dev libsqlite3-dev libssl-dev libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev libffi-dev –y

Python 3.7 yi kaynağında indirin ve yükleyin [2]

wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tar.xz

tar xf Python-3.7.2.tar.xz

cd Python-3.7.2

./configure

make -j 4

sudo make altinstall 

Python sürümünü yükledikten sonra bu komudu kullanarak Python 2.7 olan çekirdek sürümünü Python 3.7 olarak varsayılan yapıyoruz.

alias python=’/usr/bin/python3.7′

Projede Kullanılan Kütüphanelerin Kurulumu:

Python da yüz tanıma, yüz simgeleri, korelasyon izleme vb. işlemleri yapabilmek için dlib kütüphanesini yüklüyoruz.

pip3 install dlib 

Python’dan veya komut satırından yüzleri tanıma ve değiştirme işlemleri yapabilmek için bu kütühaneyi yüklüyoruz.

pip3 install face_recognation

OpenCV’de bir görüntüyü çevirmek için , (t x , t y ) olarak gösterilen (x, y) -hiftini,  çeviri matrisini M oluşturmak için sağlamanız gerekir :

Pythonda görüntüyü sayısal veriye yani matrise çevirmek için kullandığımız İmults kütüphanesini kurmak için kullanılan kod.[3]

pip3 install imutils

Raspberry Pi de görüntü işlemek için kullanılan OpenCv kütüphanesinin en son sürümü uyumluluk göstermediği için daha eski bir sürümünü yüklemek için aşağıda ki kod satırını kullanıyoruz.

pip3 install opencv-python==3.4.6.27

Python kodumuzun çalışabilmesi için gerekli olan diğer kütüphaneleri Raspberry Pi’ye aşağıda ki sırayla yüklemeliyiz.

sudo apt-get install libatlas-base-dev

sudo apt-get install libjasper-dev

sudo apt-get install libqtgui4

sudo apt-get install python3-pyqt5

sudo apt-get install libqt4-test

Raspberry Pi’ye takmış olduğumuz kamera modülünü kullanmak için komut satırına altta ki kodu yazıp açılan pencereden bu yolu takip edip kamerayı kullanılabilir (enable) yapıyoruz.

sudo raspi-config

–Interfacing Options

–Camera enabled

vcgencmd get_camera # kamerayı denemek için

USB Webcam kullanmak istersek aşağıda ki komutu kullanarak yükleme yapmamız gereklidir.

sudo apt install fswebcam

Yüz Algılama Dosyasının(xml) Kurulumu:

haarcascade_frontalface_default.xml Dosyasını Oluşturma

Python ve  OpenCV de yüz, göz yada nesne algılamak için kullanılan Haar Cascades  denilen bir xml dosyası oluşturmak durumundayız. Bu projede yüz algılama yapmak için hazır bulunan bu xml dosyası indirip projemize ekliyoruz.

Görüntü üzerinde nesne bulmak için uygulanan bir yöntemdir. Bu yönteme haar-like özellikleri denilir. Özellikleri kısaca açıklayalım.

Kenar özelliği:  Görüntü üzerinde belirli bir alan koyu alandan oluşuyor ve belirli bir alan açık renklerden oluşuyor ise kenar özelliği olduğunu belirtmektedir.

Çizgi özelliği: Görüntü üzerinde sırasıyla açık, kapalı, açık  renklerden oluşuyor ise çizgi özelliği vardır.

Dört-Kare Özelliği: Çaprazlama olarak kare şeklinde koyu ve açık tonlar çapraz bir şekilde bulunuyor ise dört kare özelliğini belirtmektedir.

Aşağıda arama özelliklerinin görüntüsü gösterilmiştir.

Bu özellikleri kullanarak görüntü üzerinde çizgi, kenar, yüz, göz, araç vb… birçok nesneyi tespit edebiliriz. Aşağıda bulunan bir insan yüzü görseli üzerinde haar-cascade uygulanmıştır. Haar-cascade metodu önceden birçok kez eğitilerek yüz şeklinin nasıl bir yapıda olduğunu bilmektedir. Bir çiçek tanıma veya plaka tanıma işlemi yaparken önceden plakayı birçok kez tanıtarak nasıl bir yapıda olduğunu tanıtıyoruz. Örneğin bir yüz arayan bir sistem ilk olarak iki gözü aramaktadır. Göz var ise burun var mı diye bakar. Burun  var ise kaş var mı diye kontrol ederek istenen sonuçları veren  yapıdır.

Haar-cascade ile kendiniz bir öğeyi tanıtıp görüntü üzerinde nesne arama işlemlerini gerçekleştirebilirsiniz. [4]

Github üzerinden yüklemek için bu bağlantıyı kullanabiliriz.

https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml

Python Kodları:

Kurulumları bitirdikten sonra Python kodlarına ve klasör yapısını oluşturalım;

Resim Hazırlamak İçin Kullanılan encode_faces.py   dosyasının kodları:

# KULLANIM

# Dizüstü bilgisayar, masaüstü veya GPU’da kodlama yaparken (daha yavaş, daha doğru):

# python encode_faces.py – veri kümesi veri kümesi – kodlama kodlamaları.pickle –detection-method cnn

# Raspberry Pi’de kodlama yaparken (daha hızlı, daha doğru):

# python encode_faces.py – veri kümesi veri kümesi – kodlama kodlamaları.pickle –detection-method hog

# gerekli paketleri içe aktarınfrom imutils import paths

import face_recognition

import argparse

import pickle

import cv2

import os

# argüman ayrıştırıcısını oluşturma ve argümanları ayrıştırma

ap = argparse.ArgumentParser()

ap.add_argument(“-i”, “–dataset”, required=True,

    help=”path to input directory of faces + images”)

ap.add_argument(“-e”, “–encodings”, required=True,

    help=”path to serialized db of facial encodings”)

ap.add_argument(“-d”, “–detection-method”, type=str, default=”hog”,

    help=”face detection model to use: either `hog` or `cnn`”)

args = vars(ap.parse_args())

# veri setimizdeki giriş resimlerine giden yolları yakalaprint(“[INFO] quantifying faces…”)

imagePaths = list(paths.list_images(args[“dataset”]))

# bilinen kodlamaların ve bilinen adların listesini başlat

knownEncodings = []

knownNames = []

# görüntü yolları üzerinde döngü

for (i, imagePath) in enumerate(imagePaths):

    # kişi yolunu görüntü yolundan çıkarın

    print(“[INFO] processing image {}/{}”.format(i + 1,

                len(imagePaths)))

    name = imagePath.split(os.path.sep)[-2]

    # giriş görüntüsünü yükleyin ve RGB’den dönüştürün (OpenCV siparişi)

# – dlib sıralaması (RGB)

    image = cv2.imread(imagePath)

    rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# sınırlayıcı kutuların (x, y) koordinatlarını algıla

# giriş resmindeki her bir yüze karşılık gelir

    boxes = face_recognition.face_locations(rgb,

                model=args[“detection_method”])

# yüz için yüzün gömülmesini hesapla

    encodings = face_recognition.face_encodings(rgb, boxes)

    # kodlamalar üzerinde döngü

    for encoding in encodings:

                # her kodlama + adını bilinen adlar grubumuza ekleyin ve

                # kodlama

                knownEncodings.append(encoding)

                knownNames.append(name)

# yüz kodlamalarını + isimleri diske dök

print(“[INFO] serializing encodings…”)

data = {“encodings”: knownEncodings, “names”: knownNames}

f = open(args[“encodings”], “wb”)

f.write(pickle.dumps(data))

f.close()

pi_face_recognition.py  dosyasının kodları:

# KULLANIM

# python pi_face_recognition.py –cascade haarcascade_frontalface_default.xml –encodings encodings.pickle

# gerekli paketleri içe aktarın

from imutils.video import VideoStream

from imutils.video import FPS

import face_recognition

import argparse

import imutils

import pickle

import time

import cv2

# argüman ayrıştırıcısını oluşturma ve argümanları ayrıştırma

ap = argparse.ArgumentParser()

ap.add_argument(“-c”, “–cascade”, required=True,

    help = “path to where the face cascade resides”)

ap.add_argument(“-e”, “–encodings”, required=True,

    help=”path to serialized db of facial encodings”)

args = vars(ap.parse_args())

# OpenCV’nin Haar’ıyla birlikte bilinen yüzleri ve düğünleri yükle

# yüz tanıma için kaskad

print(“[INFO] loading encodings + face detector…”)

data = pickle.loads(open(args[“encodings”], “rb”).read())

detector = cv2.CascadeClassifier(args[“cascade”])

# video akışını başlat ve kamera sensörünün ısınmasına izin ver

print(“[INFO] starting video stream…”)

vs = VideoStream(src=0).start()

# vs = VideoStream(usePiCamera=True).start()

time.sleep(2.0)

# FPS sayacını başlat

fps = FPS().start()

# döngü video dosyası akışından kareler üzerinde

while True:

# çerçeveli video akışından yakala ve yeniden boyutlandır

# ila 500 piksel (işlemeyi hızlandırmak için))

    frame = vs.read()

    frame = imutils.resize(frame, width=500)

# giriş çerçevesini (1) BGR’den gri tonlamaya dönüştürür (yüz için

# algılama) ve (2) BGR’den RGB’ye (yüz tanıma için)

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

# gri tonlamalı çerçevedeki yüzleri algıla

    rects = detector.detectMultiScale(gray, scaleFactor=1.1,

                minNeighbors=5, minSize=(30, 30),

                flags=cv2.CASCADE_SCALE_IMAGE)

# OpenCV sınırlayıcı kutu koordinatlarını (x, y, w, h) sırayla döndürür

# ama onlara (üst, sağ, alt, sol) sırada ihtiyacımız var, bu yüzden

# biraz yeniden sıralama yapmanız gerekiyor

    boxes = [(y, x + w, y + h, x) for (x, y, w, h) in rects]

# her yüz sınırlayıcı kutu için yüz düğün hesaplamak

    encodings = face_recognition.face_encodings(rgb, boxes)

    names = []

# yüz düğünleri üzerinde döngü

    for encoding in encodings:

                # giriş resmindeki her yüzü bilinenlerimizle eşleştirmeye çalışıyor

                           matches = face_recognition.compare_faces(data[“encodings”],

                           encoding)

                name = “Unknown”

                # bir eşleşme bulup bulmadığımızı kontrol edin

                if True in matches:

# eşleşen tüm yüzlerin dizinlerini bulun ve ardından

# sözlük her yüzün toplam sayısını saymak için

# eşleşti

                           matchedIdxs = [i for (i, b) in enumerate(matches) if b]

                           counts = {}

# ile eşleşen dizinler arasında geçiş yapın ve tanınan her yüz yüzü

                           for i in matchedIdxs:

                                       name = data[“names”][i]

                                       counts[name] = counts.get(name, 0) + 1

                           # tanınan yüzü en büyük sayıyla belirle

                            #oy sayısı (beklenmedik bir durumda) sözlükteki ilk girişi seçer                         

                           name = max(counts, key=counts.get)

                # isim listesini güncelleyin

                names.append(name)

    # Tanınan yüzler üzerinde döngü

    for ((top, right, bottom, left), name) in zip(boxes, names):

                # görüntüye tahmini yüz adını çizin

                cv2.rectangle(frame, (left, top), (right, bottom),

                           (0, 255, 0), 2)

                y = top – 15 if top – 15 > 15 else top + 15

                cv2.putText(frame, name, (left, y), cv2.FONT_HERSHEY_SIMPLEX,

                           0.75, (0, 255, 0), 2)

    # resmi ekranımıza göster

    cv2.imshow(“Frame”, frame)

    key = cv2.waitKey(1) & 0xFF

    # q tuşuna basıldıysa, döngüden çıkın

    if key == ord(“q”):

                break

    # FPS sayacını güncelleyin

    fps.update()

# zamanlayıcıyı durdurur ve FPS bilgilerini görüntüler

fps.stop()

print(“[INFO] elasped time: {:.2f}”.format(fps.elapsed()))

print(“[INFO] approx. FPS: {:.2f}”.format(fps.fps()))

# biraz temizlik yap

vs.stop()

Klasör Yapısı:

Klasör Yapısı Aşağıda ki gibi olmalıdır;

Veritabanını Oluşturma:

dataset dosyası aşağıda ki gibi olmalıdır;

Veri Tabanını Güncelleme Ve Yüz Tanıma Komutları:

Kurulum ve dosya işlemleri bittikten sonra mevcut veri tabanını güncellemek için;

cd Desktop/pi-face-recognition/  #dosyanın bulunduğu yolu göstermemiz gerekli

Resim hazırlamak için kullandığımız kod;

python3 encode_faces.py –dataset dataset –encodings encodings.pickle –detection-method hog

Yüz Tanıma yapmak için kullanılan kod;

python3 pi_face_recognition.py –cascade haarcascade_frontalface_default.xml –encodings encodings.pickle

SONUÇ:

Bu projeyle Raspberry Pi ve Pi Kamera Modülü kullanarak görüntü almak ve onun üzerinden  görüntü işleme yapmak amaçlanmıştır. Kameradan aldığımız görüntüyü ve oluşturduğumuz veri tabanı üzerinden yüz tanıma yapıp bu sistemin kullanıldığı alanlar da bu projeyi rahatlıkla kullanabiliriz.  Görüntü işleme, görüntüyle veri tabanının güncelleme,    yüz tanıma , nesne tespiti ve takibi, güvenlik ve gündelik hayatta çeşitli amaçlı projelerde  kullanılabilir.

Yararlanılan Kaynaklar:

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir