Genetik Algoritma İle Fotoğraf İçerisinde Nesne Bulma

Python ve genetik algoritma kullanarak fotoğraf içerisindeki nesneyi bulabiliriz. Güzel bir manzaradaki uydu antenini de bulabiliriz. Bu yazımızda genetik algoritma örnekleri üzerinden giderek bir fotoğraf içerisindeki nesne nasıl bulunur genetik algoritma soru çözümü üzerinden gideceğiz ve bulduğumuz çözümlerde genetik algoritma optimizasyonu yapacağız. Son olarak genetik algoritma elitizm konusuna değinerek genetik algoritma mediumu fotoğrafı kullanarak makaleyi sonlandıracağız.
Örnekteki fotoğrafta dikkatli bakarsak görebileceğimiz göze çarpan uyduyu genetik algoritma kullanarak bulmaya çalışalım:

GENETİK ALGORİTMA KULLANARAK PYTHON İLE FOTOĞRAF İÇERİSİNDE NESNE BULMA
Genetik algoritmalar canlılarda bulunan DNA yapısındaki Mutasyon’lardan yola çıkarak geliştirişmiş bir problem çözme yaklaşımıdır. Örneğin elimizde bir fotoğraf olduğunu düşünelim ve bu fotoğrafın içerisinde daha önceden belirlediğimiz bir nesne aradığımızı düşünelim.
Bu nesnenin rengi boyutu ve koordinatı standart olmayacaktır. Bu nesneyi bulma fonksiyonunu şöyle düşünebiliriz:
X (X Ekseni koordinatı) Y (Y Ekseni Koordinatı) W (Nesne Piksel Genişliği) H (Nesne Piksel Yüksekliği).
Yani fonksiyon f(X,Y,W,H) gibi 4 boyutlu bir uzayda aranacaktır. İterasyon tek tek arttırılarak yapılırsa problem çözümü çok uzun sürecektir. Bunun yerine genetik algoritma mantığıyla problem daha kolay ve daha hızlı çözülebilir.
Genetik Algoritma Michigan Universitesinde John Holland tarafından 1975 yılında ortaya atılmıştır. Bu algoritmalarda tek bir çözüm üretilmez, farklı çözümlerden oluşan bir vektör kümesi üretilir. Çözüm kümeleri birbirinden bağımsızdır.
Genetik algoritmalarda Evrim mantığı vardır. Çözüm kümeleri Popülasyonlardan oluşur. Popülasyonlar ise kromozom denilen sayı dizileri kümelerinden oluşur. Her birey bir gen’dir.
Genetik fonksiyonlarda mutosyanlarla farklı bireyler yaratılır ve o bireyin problemi çözüp çözmediğine bakılır. Fitnes fonksiyonu yani uygunluk fonksiyonu denilen bu çözüp çözmedi kontrolünün doğru yapılması algoritmanın en önemli adımıdır. Gen’ler random (rasgele) oluşturulmaz. Anne ve Baba gegenlerden çaprazlanmasıyla ve mutasyonlarla ufak değişiklikler yapılarak çocuklar oluşturulur.
Problem çözümüne uzak olan çocuklar evlendirilmezler. İyi çocuklardan yeni genler oluşturulur.
Önce trafikteki mavi arabayı bularak başlayalım:
Genetik Algoritma Örnek Fotoğraf
Genetik Algoritma Örnek Problem
Genetik algoritmada aşağıdaki fotoğraftaki mavi arabayı bulmak isteyelim:

Genetik Algoritma Örnek Nesne
Bulmak isteddğimiz fotoğraf aşağıdaki mavi araba olsun:

Aşağıdaki şekilde görüleceği üzere bu fotoğrafta onlarca araba var. Fakat bizim aradığımız mavi renk ile gösterilmiş olan 1 numaralı araba.

Şimdi bu arabayı Phyton’da genetik algoritma ile bulmaya çalışalım:
Genetik Algoritma Pygad ve GARI
Genetik Algoritma olarak Mısır’lı akedemisyen Ahmed Fawzy ‘nin geliştirilmesinde faydası bulunduğu pygad kütüphanesndeki GARI fonksiyonu referans alınmıştır.
Kütüphan linki:
ahmedfgad/GARI: GARI (Genetic Algorithm for Reproducing Images) reproduces a single image using Genetic Algorithm (GA) by evolving pixel values. (github.com)
Ahmed Fawzy

Şimdi algoritmayı çalıştırmak için gerekli kütüphaneleri çağıralım:
Genetik Algoritma Python GerekliKütüphaneler
Python’da kullanmak için gerekli Kütüphaneleri çağıralım
# Kütüphaneleri çağır
#Bütün arreyler numpy
import numpy
#Genetik algoritma
import pygad
#Vektörleri 1 boyuta düşürmek için
import functools
#Vektörleri 1 boyuta düşürmek için
import operator
#PIL image kütüphanesi gösterirken ve çerçeve oluştururken kullanıldı
from PIL import Image, ImageDraw
Genetik Algoritma Python FotoğrafKırpma ve Kromozom Oluşturma
# Kırp şeklinde fotoğraf kırma fonksiyonu tanımlayalım, x ve y kırpılacak başlangıç koordinatlarıdır, foto foroğraftır
def kirp(foto,x,y):
sonuc = foto.crop((x,y,x+hedef_foto.width,y+hedef_foto.height))
return sonuc
# Resmi 1 boyutlu vektör haline getirmek için kromozom oluşturma fonksiyonu yazalım operator.mul kütüphane içerisinde açıklandı
def kromozom(foto):
kromozom = numpy.asarray(foto, dtype=numpy.float64)
kromozom = numpy.reshape(a=kromozom/255, newshape=(functools.reduce(operator.mul, kromozom.shape)))
return kromozom
Genetik Algoritma Python FotoğrafTanımlama ve Kromozoma Dönüştürme
# Büyük fotoğrafı tanımlayalım
buyuk_foto = Image.open('buyuk_foto.jpg')
# Hedef fotoğrafı genetik algoritma ile bulunacak kromozoma dönüştürelim
hedef_foto=Image.open('hedef_foto.jpg')
hedef_kromozom = kromozom(hedef_foto)
Genetik Algoritma Python Genetik Algoritma
#Genetik Algoritmaya başlayalım:
#Fitness fonksiyonunu tanımlayalım:
def fitness_fun(solution, solution_idx):
output = kirp(buyuk_foto, solution[0], solution[1])
output = kromozom(output)
#İki vektör arasındaki farka bakalım, Fitness fonksiyonunun yükselen değer olmasını istiyoruz
fitness = numpy.sum(numpy.abs(hedef_kromozom-output))
fitness = numpy.sum(hedef_kromozom) - fitness
return fitness
Genetik Algoritma Python Genetik Algoritma Her AdımdaSonucaBakalım
#Her adımda sonucu yazdıralım ki algoritma nasıl çalışıyor görelim:
def callback(ga_instance):
solution, solution_fitness, solution_idx = ga_instance.best_solution()
print("Nesil = ", ga_instance.generations_completed)
print("Uygunluk = ", solution_fitness)
print("En iyi çözüm : ", "Çözüm X Koordinatı:", solution[0], "Çözüm Y Koordinatı:",solution[1])
Genetik Algoritma Python Genetik Algoritma Çalıştırma
#Pygad parametrelerini tanımlayalım generation
ga_instance = pygad.GA(num_generations=400, #Nesil sayısı
sol_per_pop=20, #Populasyon sayısı
num_parents_mating=10, # Eşleşen abeveyn sayısı
num_genes=2, # Gen sayısı
gene_space = [{'low': 0, 'high': buyuk_foto.width - hedef_foto.width}, {'low': 0, 'high': buyuk_foto.height - hedef_foto.height}], #X ve Y için fotoğraf sınırlarının piksel olarak tanımlanması
fitness_func=fitness_fun, #Özel tanımlanmış fitness fonksiyonu
on_generation=callback, #Sonuyçları yazdırmak için
mutation_type = "random", #Mutasyon türü
parent_selection_type="sss") #TBD
#Genetik algoritmayı çalıştıralım
ga_instance.run()
Genetik Algoritma Python Genetik Algoritma Bulunan Sonucu Yazdırma
#Genetik algoritma çalıştıktan sonra değerleri alıyor (Fotoğraf konum çizmek için)
solution, solution_fitness, solution_idx = ga_instance.best_solution()
#Bulduğumuz en iyi sonucu ekrana yansıtalım
x = int(solution[0])
y = int(solution[1])
start_point = (x, y)
end_point = (x + hedef_foto.width, y + hedef_foto.height)
cizim = ImageDraw.Draw(buyuk_foto)
cizim.rectangle([start_point, end_point], fill=None, outline="red", width=1)
buyuk_foto.show()
Genetik Algoritma Python Genetik Algoritma Final Kodlar
import numpy
import pygad
import functools
import operator
from PIL import Image, ImageDraw
def kirp(foto,x,y):
sonuc = foto.crop((x,y,x+hedef_foto.width,y+hedef_foto.height))
return sonuc
def kromozom(foto):
kromozom = numpy.asarray(foto, dtype=numpy.float64)
kromozom = numpy.reshape(a=kromozom/255, newshape=(functools.reduce(operator.mul, kromozom.shape)))
return kromozom
buyuk_foto = Image.open('buyuk_foto.jpg')
hedef_foto=Image.open('hedef_foto.jpg')
hedef_kromozom = kromozom(hedef_foto)
def fitness_fun(solution, solution_idx):
output = kirp(buyuk_foto, solution[0], solution[1])
output = kromozom(output)
fitness = numpy.sum(numpy.abs(hedef_kromozom-output))
fitness = numpy.sum(hedef_kromozom) - fitness
return fitness
def callback(ga_instance):
solution, solution_fitness, solution_idx = ga_instance.best_solution()
print("Nesil = ", ga_instance.generations_completed)
print("Uygunluk = ", solution_fitness)
print("En iyi çözüm : ", "Çözüm X Koordinatı:", solution[0], "Çözüm Y Koordinatı:",solution[1])
ga_instance = pygad.GA(num_generations=400,
sol_per_pop=20,
num_parents_mating=10,
num_genes=2, # Gen sayısı
gene_space = [{'low': 0, 'high': buyuk_foto.width - hedef_foto.width}, {'low': 0, 'high': buyuk_foto.height - hedef_foto.height}], #X ve Y için fotoğraf sınırlarının piksel olarak tanımlanması
fitness_func=fitness_fun,
on_generation=callback,
mutation_type = "random",
parent_selection_type="sss")
ga_instance.run()
solution, solution_fitness, solution_idx = ga_instance.best_solution()
x = int(solution[0])
y = int(solution[1])
start_point = (x, y)
end_point = (x + hedef_foto.width, y + hedef_foto.height)
cizim = ImageDraw.Draw(buyuk_foto)
cizim.rectangle([start_point, end_point], fill=None, outline="red", width=1)
buyuk_foto.show()
Genetik Algoritma Python Genetik Algoritma Sonuç

Genetik Algoritma Python Genetik Algoritma Farklı Deneme
Fotoğraf içerisindeki tanımladığımız uyduyu bulalım:

Fotoğraf içerisindeki tanımladığımız uyduyu bulalım:

Resmi değiştirerek aynı kodları kullanalım:
import numpy
import pygad
import functools
import operator
from PIL import Image, ImageDraw
def kirp(foto,x,y):
sonuc = foto.crop((x,y,x+hedef_foto.width,y+hedef_foto.height))
return sonuc
def kromozom(foto):
kromozom = numpy.asarray(foto, dtype=numpy.float64)
kromozom = numpy.reshape(a=kromozom/255, newshape=(functools.reduce(operator.mul, kromozom.shape)))
return kromozom
buyuk_foto = Image.open('buyuk_foto.jpg')
hedef_foto=Image.open('hedef_foto.jpg')
hedef_kromozom = kromozom(hedef_foto)
def fitness_fun(solution, solution_idx):
output = kirp(buyuk_foto, solution[0], solution[1])
output = kromozom(output)
fitness = numpy.sum(numpy.abs(hedef_kromozom-output))
fitness = numpy.sum(hedef_kromozom) - fitness
return fitness
def callback(ga_instance):
solution, solution_fitness, solution_idx = ga_instance.best_solution()
print("Nesil = ", ga_instance.generations_completed)
print("Uygunluk = ", solution_fitness)
print("En iyi çözüm : ", "Çözüm X Koordinatı:", solution[0], "Çözüm Y Koordinatı:",solution[1])
ga_instance = pygad.GA(num_generations=400,
sol_per_pop=20,
num_parents_mating=10,
num_genes=2, # Gen sayısı
gene_space = [{'low': 0, 'high': buyuk_foto.width - hedef_foto.width}, {'low': 0, 'high': buyuk_foto.height - hedef_foto.height}], #X ve Y için fotoğraf sınırlarının piksel olarak tanımlanması
fitness_func=fitness_fun,
on_generation=callback,
mutation_type = "random",
parent_selection_type="sss")
ga_instance.run()
solution, solution_fitness, solution_idx = ga_instance.best_solution()
x = int(solution[0])
y = int(solution[1])
start_point = (x, y)
end_point = (x + hedef_foto.width, y + hedef_foto.height)
cizim = ImageDraw.Draw(buyuk_foto)
cizim.rectangle([start_point, end_point], fill=None, outline="red", width=1)
buyuk_foto.show()
Genetik Algoritma Python Kodları Çalışıyor:

•5 Genetic Algorithm Applications Using PyGAD | Paperspace Blog
Algoritmayla ilgili uzun süre çalıştım ve devam ediyorum. Genetik algoritmayla ilgili soru yorum ve görüşleriniz için üye olabilir veya aşağıya yorum yazabilirsiniz: