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

Genetik Algoritma İle Fotoğraf İçerisinde Nesne Bulma
Yayınlama: 17.11.2022
82
A+
A-

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:

Genetik Algoritma Ile Fotograf Icerisinde Nesne Bulma
Genetik Algoritma İle Fotoğraf İçerisinde Nesne Bulma

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:

image 14
Fotoğraf içerisinde nesne bulma

Genetik Algoritma Örnek Nesne

Bulmak isteddğimiz fotoğraf aşağıdaki mavi araba olsun:

image 15
Bulunmak istenen fotoğraf

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.

image 21
Genetik Algoritma İle Fotoğraf İçerisinde Nesne Bulma 10

Ş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
image 16
Genetik algoritma kütüphanesi

Ş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ç

image 17
Genetik Algoritma Sonuç

Genetik Algoritma Python Genetik Algoritma Farklı Deneme

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

image 18
genetik algoritma bulunacak fotoğraf

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

image 19
Genetik Algoritma Deneme

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:

image 20
Genetik algoritma uydu bulundu

Kaynaklar:

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:

Ruzgar.com Aklınıza ne eserse!
    Bir Yorum Yazın

    Ziyaretçi Yorumları - 0 Yorum

    Henüz yorum yapılmamış.