Ö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:
- Görüntünün çalışma ortamına aktarılması
- Alınan görüntünün işlenerek analiz edilmesi ve görüntülenmesi
- 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.
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.
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:
- Yüz Tanıma
- Görüntü üzerinde tespiti zor olan objeleri gözlemleyebilme
- Gürültü temizleme, keskinleştirme ve görüntü restorasyonu (temizleme) yapma
- Yüksek çözünürlükte görüntüler elde etme
- Nesne tanıma
- 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?
- Python
- C / C++
- Java
- 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:
- [1] https://www.mobilhanem.com/python-ile-goruntu-isleme-giris/
- [2] https://github.com/instabot-py/instabot.py/wiki/Installing-Python-3.7-on-Raspberry-Pi
- [3] https://www.pyimagesearch.com/2015/02/02/just-open-sourced-personal-imutils-package-series-opencv-convenience-functions/
- [4] https://ertugruldeniz.com/haar-cascade-nedir-opencvhaar-cascade-ile-yuz-tanima-142