You are on page 1of 75

T.

C
NAMIK KEMAL ÜNİVERSİTESİ
ÇORLU MÜHENDİSLİK FAKÜLTESİ
ELEKTRONİK VE HABERLEŞME
MÜHENDİSLİĞİ BÖLÜMÜ

LİSANS BİTİRME ÇALIŞMASI ADI


OTONOM ARAÇ UYGULAMASI

HAZIRLAYAN

BERKAN SOFU
1140605605

DANIŞMAN
Yrd.Doç.Dr. Hasan DEMİR

Haziran 20
i
i
ONAY

Berkan SOFU tarafından hazırlanan “OTONOM ARAÇ


UYGULAMASI” adlı tez çalışması Namık Kemal
Üniversitesi Çorlu Mühendislik Fakültesi Elektronik Ve
Haberleşme Mühendisliği Bölümünde Lisans Bitirme
Çalışması olarak kabul edilmiştir.

....../....../2021

Adı Soyadı İmza

Danışman : Yrd.Doç.Dr HASAN DEMİR

i
ETİK BEYAN

Namık Kemal Üniversitesi Çorlu Mühendislik Fakültesi


Elektronik Ve Haberleşme Mühendisliği Bölümünde
Lisans Bitirme Çalışması Yazım Kurallarına uygun olarak
hazırladığım bu tez çalışmasında;

Lisans Bitirme Çalışmamda sunduğum bilgi ve


dokümanları akademik kurallar etik çerçevesinde elde
ettiğimi,
Tüm bilgi, belge, değerlendirme ve sonuçları
bilimsel etik ve ahlak kurallarına uygun olarak sunduğumu,
Lisan Bitirme Çalışmamda özgün verilerim
dışında kalan ve tezde yararlanılan eserlerin tümüne uygun
atıfta bulunarak kaynak gösterdiğimi,
Kullanılan verilerde herhangi bir değişiklik
yapmadığımı,
Lisans Bitirme Çalışmasında sunduğum
çalışmanın özgün olduğunu ve başka bir yerde
sunmadığımı,
Lisans Bitirme Çalışmasında sunduğum
çalışmanın herhangi bir bölümünü bu üniversite veya başka
bir üniversitede Lisans Bitirme Çalışması olarak
sunmadığımı,
Lisans Bitirme Çalışması ve yazımı sırasında
patent ve telif haklarını ihlal edici bir davranışımın
olmadığını
Beyan ederim.

Berkan SOFU
27.06.2021

ii
ÖZET
Bu tez çalışmasında, RC (Radio Control) otonom bir araç üzerine yerleştirilen kamera modülü ile
Yapay Sinir Ağları algoritmaları kullanılarak, aracın yollar arasında kalabilmesi
amaçlanmıştır.480 x 320 çözünürlüklü görüntü verileri elde edilerek, Python programlama dili ve
çevresel kütüphaneler üzerinde, çok katmanlı algılayıcı öğrenim metoduyla belirleyip geri
besleme(back prop) yöntemi kullanılıp Otonom aracın görüntü işleme teknikleri kullanılıp
uygulaması yapılmıştır.

Anahtar kelime: Otonom Araç, Python, Raspberry Pi, Arduino, Yapay Sinir Ağları

iii
ABSTRACT
In this thesis, by using Artificial Neural Networks algorithms with the camera modüle placed on
an RC autonomous vehicle it is aimed to keep the vehicle between the lanes. By obtaining 480x320
resolution image data with Artificial Neural Networks, a microcomputer, The image processing
techniques of the autonomous vehicle were used and applied on the Python programming language
and environmental libraries using the feedback method determined by the multi-layered perceptron
learning method.

Keywords: Autonomous vehicles, Python, Raspberry Pi, Arduino, Artificial Neural Networks

iv
ÖNSÖZ
Otonom araç bitirme çalışmam da bana desteklerinden dolayı danışmanım
Yrd.Doç.Dr. Hasan Demir’e teşekkür ederim.

v
İÇİNDEKİLER
ONAY.................................................................................................................................................................... İ
ETİK BEYAN ...................................................................................................................................................... İİ
ÖZET .................................................................................................................................................................. İİİ
ABSTRACT ........................................................................................................................................................ İV
ÖNSÖZ ................................................................................................................................................................ V
İÇİNDEKİLER ..................................................................................................................................................... İ
ŞEKİL LİSTESİ ................................................................................................................................................. İİİ
1. GİRİŞ ........................................................................................................................................................... 1
2. MATERYAL VE METHOD ....................................................................................................................... 2
3. OTONOM ARAÇ TARİHÇESİ .................................................................................................................. 3

3.1. OTONOM ARAÇ NEDİR ..................................................................................................... 3


3.2. OTONOM ARACIN AVANTAJLARI .................................................................................... 4
3.3. OTONOM ARACIN DEZAVANTAJLARI .............................................................................. 5
3.4. OTONOM ARAÇ ÇALIŞMA PRENSİBİ ................................................................................ 6
4. ARDUİNO NEDİR ...................................................................................................................................... 8

4.1. ARDUİNO ÇALIŞMA PRENSİBİ .......................................................................................... 8


4.2. ARDUİNO İLE KUMANDA DEVRESİ ................................................................................ 14
4.3. RASPBERRY Pİ ................................................................................................................ 15
4.4. RP KURULUMU ............................................................................................................... 17
4.5. KAMERA MODÜLÜ .......................................................................................................... 23
5. YAPAY SİNİR AĞLARI İLE TAHMİN ...................................................................................................24

5.1. YAPAY ZEKA İLE TAHMİN ............................................................................................. 25


5.1.1. Yapay Zeka Nedir ............................................................................................................................. 26
5.2. YAPAY SİNİR AĞI ........................................................................................................... 27
5.2.1. Geri Dönüşümlü Ağlar ve Diğer Yapay Sinir Ağları ...................................................................... 28
5.2.2. Yapay Sinir Ağlarının Donanımı..................................................................................................... 29
5.2.3. Yapay Sinir Ağlarının Genel Özellikleri ......................................................................................... 30
6. RC OTONOM ARACIN YAZILIM TASARIMI ......................................................................................31

6.1. PYTHON .......................................................................................................................... 31


6.1.2. PYCHARM ....................................................................................................................... 32
6.1.3. LİNUX(RASPBİAN) ........................................................................................................... 32
6.1.4. ANACONDA 3 .................................................................................................................. 33
6.1.5. TENSORFLOW ................................................................................................................ 33
6.1.7. OPENCV ......................................................................................................................... 34
6.1.8. NUMPY ........................................................................................................................... 36
6.1.9. PYGAME .......................................................................................................................... 37
6.2.0. PİLLOW-PYTHON IMAGE IMAGES ................................................................................. 37
6.2.1. PİCAMERA ...................................................................................................................... 37
7. MLP(AUTO)TRAİNİNG ...........................................................................................................................37

i
7.1. OTOPİLOT EĞİTİM ......................................................................................................... 39
7.2. KASKAT SINIFLANDIRICI ............................................................................................... 41
EKLER ...............................................................................................................................................................46
ÖZGEÇMİŞ ........................................................................................................................................................64

ii
ŞEKİL LİSTESİ
1.1 Otonom Aracın Genel Çalışma Prensibi
3.1 Otonom Aracın Teknolojileri
4.1 Arduino Kumanda Kodu
4.2 Arduino Kumanda Kodlarının Devamı
4.3 Arduino Kumanda Kodlarının Devamı
4.4 Arduino Kumanda Devresi Kodu
4.5 Arduino Kumanda Devresi Kodu Devamı
4.6 Arduino Kumanda Devresi Kodu Devamı
4.7 Arduino Yardımıyla Kumanda Devresinin Kontrolü
4.8 Raspberry Pi 3
4.9 Rpi 3 Pinleri
4.10 Raspbian İşletim Sistemi Çeşitleri
4.11 Giriş Bilgileri
4.12 Wireless Network Watcher Giriş Sayfası
4.13 Giriş Sayfası
4.14 Rp Komut Ekranı
4.15 Rp Ayarlar Ekranı
4.16 Rpi Çerve Birimleri Ayarlama Ekranı
4.17 Winscp Bağlantı Ekranı
4.18 Rp Uyumlu Kamera Modülü
5.1 Tahminleme Yöntemleri
5.2 Tek Gizli Katmana Sahip Birçok Katmanlı Algılayıcı Modeli
6.1 Yıllara Göre Opencv
7.1 Mlp Training
7.2 Npz Dosyası
7.3 Dosyaların Kayıt Edildiği Yer
7.4 Eğitim Aşaması
7.5 Otonom Sürüşte Eğitilen Yapay Zekanın Arduino Komut Göndermesi
7.6 Kaskat Sınıflandırıcı Kodu

iii
1. GİRİŞ

Gündelik hayatın birçok alanında hızla yer edinen akıllı sistemler, otomotiv sektörünün
yüzyılı aşan tarihinde son yılların en çok ilgi çeken araştırma konularından birisi olmuştur. Bu
sistemlerin ışığında geliştirilen akıllı park etme, hız ve şerit kontrolü, acil fren sistemi gibi
teknolojiler taşıtlarda yerini almıştır[10]

Bu gelişmelerin son noktası olan sürücüsüz (otonom) araçlar pek çok kuruluş tarafından
incelenmekte ve hızla kullanmak mümkündür hale gelmektedir. İstenilen iki nokta arasındaki
yolculuğu insan müdahalesi olmadan gerçekleştiren sürücüsüz araçlar güvenlik, konfor ve enerji
tasarrufu gibi konularda pek çok katkıda bulunmaktadır.

Otomotiv mühendisleri topluluğu (Society of Automotive Engineering - SAE) taşıt


otomasyonunu 6 seviyede değerlendirmekte olup, ilk seviye 0 tamamen sürücü idaresinde olan
araçlar olarak, seviye 5 ise tamamen bilgisayar idaresinde hareket eden otonom araçlar olarak ifade
edilmektedir[12]

Günümüzde son kullanıcı tarafından kullanılacak olan taşıtlar azami 2. ya


da 3. düzeyde olarak sınıflandırılmaktadır. Sürücüsüz araçların çalışma döngüsü iç ve dış
sensörlerden bilgi alınması ile başlamaktadır. Savrulma oranı ve tekerlek hız sensörü gibi iç
sensörler aracın iç algısı (propriosepsiyon) hakkında bilgi verirken, radar, lidar, GPS gibi dış
sensörler ise aracın dış algısını (eksterospsiyon) karar mekanizmasına iletmektedir. [13]

İç sensörler aracın yönelimini (savrulma, sapma vb.) hız ve ivmelenmesini belirlerken,


dış sensörler ise dış çevreye göre lokalizasyonunu belirler. Sensörlerden gelen işlenmemiş veri,
algılama safhasında yorumlanır ve aracın, yolun ve mevcut engellerin konumu hakkında anlamlı
bilgiler oluşturulur[14,15]

Hareket planlaması aşaması literatürde global, lokal ve davranışsal olmak üzere üç sınıfta
incelenmektedir [16,17].

Global planlama aracın izleyeceği yolu rota ve görev planlaması açısından inceler,
başlangıç ve bitiş noktaları arasındaki en iyi yolu bulmaya odaklanır. Lokal planlama dönemeçler
ve engellerden kaçınma gibi daha küçük çaplı görevleri üstlenir. Son senelerde bilgi işleme hızının
da gelişmesi ile beraber üzerine daha çok çalışma yapılabilen davranışsal planlama ise anlık
oluşan durumlarda araca manevra beceriyi gibi yetenekler kazandırmayı amaçlamaktadır. Çalışma
döngüsündeki son aşama olan kontrol ve tahrik aşamasında ise aracın planlanan şekilde hareket

1
etmesi için gerekli olan şekilde tahrik edilmesi sağlanır. Bütün bu çalışma döngüsü Şekil 1.1’de
görselleştirilmiştir.18]

Şekil 1.1:Otonom aracın genel çalışma prensibi [11]

2. MATERYAL VE METHOD

Kullanılan teknolojiler ve kütüphaneler:

1.Raspberry pi 3

2.Raspberry pi 3 ve 4 uyumlu kamera modülü

3.Raspberry pi 4 alüminyum soğutucu kasa

4.Arduino uno r3

5.Pyhton

6.Pycharm

7.Linux(raspbian)

8.Anaconda 3

9.OpenCV

10.NumPy

11.Pygame

12.Struct

13.Socket

2
14.Pyserial

15.VNC

3. OTONOM ARAÇ TARİHÇESİ

“Otonomi” kelimesi Yunanca kendiliğinden (auto) ve kural (nomos) kelimelerinin


birleşmesinden oluşan bir sözcüktür. Türkçemizde “muhtariyet” ve “Otonomlik” gibi karşılıkları
olsa da global etkileşimi yüksek günümüz dünyasında otonom kelimesi dilimizde kullanım alanı
edinmiştir. Kural olarak kendi kendisini yöneten her sistem otonomdur. Elbette kendi kendini
yönetmenin değişik seviyeleri (yalnızca verilen emri uygulama, kendiliğinden karar verme gibi)
olabilir. Araçlarda otonom sistemlerin mazisi mekanik sistemlerde 1478 yılına, elektronik ve
yazılım içeren sistemlerde 1920 senesine kadar gitmektedir. Alttaki Şekilde görülen çizim
1478 senesinde Leonardo Da Vinci tarafından tasarlanan ilk araç kontrol sistemine aittir. Saat
yayları ve çarklardan oluşan sistem, programlandığında üzerine monte edilen herhangi bir aracı
yaklaşık 40 metre boyunca sabit rotada tutabilmekteydi.

Teknolojik gelişmeler ışığında sürücüsüz araçların 2017 senesinden başlayarak farklı


kullanım senaryolarıyla (sürücü destekli vb.) yaşantımıza girecekleri, 2020 yılı
itibarıyla bütünüyle sürücüsüz modellerin yollarda olacağı görülmektedir.
2025 senesinde sürücüsüz araç pazarının yaklaşık 42 milyar dolar, otomotiv pazarının ise yaklaşık
500 milyar dolar olacağı tahmin edilmektedir. Eylül 2017’de Amerika’de 1500
kişi üstünde yapılan bir tüketici anketinin sonuçlarına göre katılımcıların yarısı 5 sene içinde
sürücü destekli yarı otonom bir araca sahip olmak istediğini belirtirken, % 44’ü de tam otonom
sürücüsüz bir araç almak istediğini belirtmektedir. Bütün bu veriler otonom araçların önümüzdeki
yıllara damga vuracak teknolojiler arasında yer alacağını göstermektedir. Bu araçların
kullanılmaya başlamasının getireceği sosyal ve ekonomik etkilerin, kültür, yaşam kalitesi, GDP
seviyesi vb. Unsurlar dikkate alındığında ülkeden ülkeye farklılıklar göstereceği açıktır.
Türkiye’de sürücüsüz araçların kullanılmaya başlamasının toplumumuzun gündelik hayatına etki
edecek yenilikler getireceği ve ülkedeki hukuk sisteminden, işsizlik rakamlarına ve terör
eylemlerinin gerçekleştirilme yöntemlerine kadar pek çok alanda zincirleme reaksiyonlara yol
açacağı değerlendirilmektedir.[1]

3.1. Otonom Araç Nedir

Otonom araç, diğer adıyla bilinen sürücüsüz araç bir noktadan başlayıp diğer noktaya
insan müdahalesi olmadan güvenli bir biçimde verilen komutları harfiyen yerine getiren yapıdır.

3
Otonom hareketli sistemi; dış dünyayı sisteme dâhil etmeyi sağlamakta olan algılayıcı
ediciler, edinilen bilgiler yönünde eyleme karar veren bir mikro sorgulayıcı devresi ve Otonom
hareket eylemini yönlendiren hakimiyet yazılımından oluşmaktadır. İnsansız vasıta sistemi;
seyrüsefer sistemi, mâni algılayıcı etme sistemi, görme sistemi, hakem sistemi ve vasıta
hakimiyet sistemi gibi sistemlerden oluşabilmektedir. İnsansız kara araçları, son yıllarda yaşanan
teknolojik büyümelerin ışığında, popülerliği giderek çoğalan bir akademik çalışma ve
mühendislik uygulama alanı haline gelmiştir.
3.2.Otonom Aracın Avantajları
Otonom araçlar klasik araçlardan farklı olarak birçok ayrı teknolojinin birleşmesi ile
hayat bulacak yeni bir uygulama olarak karşımıza çıkmaktadır. Otomotiv üretici ana üretici
olmakla birlikte otonom araçların elektronik donanımlarındaki yoğunluğun artması ve otonom
araçtaki bilişim sistemlerinin haberleşme açısından dış dünya ile entegrasyon kurma ihtiyacı ile
birlikte; bilgisayar ve yan donanımlarını, yazılımları, bu yazılımların topladığı verileri
depolayacak olan bulut bilişim sistemlerini, veri akışı için gerekli olan kablosuz yada uydu internet
erişimlerini üreten, kuran, hizmete hazır hale getiren sektörlerle ve yine bu sistemlerin bağlantı
kuracakları alt yapıları ve tesisleri kuran şirketlerin koordineli çalışmaları gerekecektir. Bu
durumda da özellikle standartların sağlanması açısından otonom araçlar yeni birçok işkolunun
oluşmasına zemin hazırlayacak, ekonomik anlamda piyasaya canlılık gelecektir. Daha da ilerleyen
aşamalarda akıllı araçların kaza riskini tamamen ortadan kaldırmak amacıyla akıllı şehirlerin
kurulması hedeflenmektedir.[2]
Bu aşamada da yine otonom araçların sağlamış olduğu katkı ile gelişecek olan yeni iş
kolları olacaktır. Otonom araçlarda standartların sağlanması klasik araçlardaki standartlardan daha
da önemlidir. Temel nedeni ise otonom aracın kullanacağı yazılım, donanım ve altyapının
dünyanın her yerinde aynı standartta ve uyumda olması zorunluluğudur. Aksi takdirde otonom
araçların hayata geçmesi mümkün olmayacaktır. Bu zorunluluktan dolayı da
ülkelerin bütününde trafik sinyalizasyon sistemlerinde, trafik denetleme, kamera ve trafikle ilgili
her alanda standartlar sağlanmış olacak, yine temel haklardan sayılmaya başlanan internete
erişimde de standartlar sağlanmış olacaktır. Bu durumda da tüm dünya aynı anda aynı standartları
kullanmak mecburiyetinde kalacağından insan yaşam kalitesi artacaktır. Otonom araçlar daha az
hata yapmaktadır. Bu nedenle insan yaşamının korunmasından önemli rol üstleneceklerdir. Akıllı
sürüş yöntemleri ve daha az araç ihtiyacı olacağından daha az yakıt tüketilecektir. Araçların
birbirleri ile haberleşebildikleri V2V and V2X sistemler vasıtasıyla daha az trafik oluşacaktır.
Trafik kazaların meydana gelmesinde önemli bir role sahip olan kör nokta sorunu, akıllı sistemlerle
ortadan kaldırılacaktır. Otonom araç teknolojisiyle beraber aynı aracı paylaşabilecek kişilerin

4
ortak noktaları artacak, ihtiyaç olan araç sayısında da azalma oluşacaktır. Azalan araç sayısı
ile beraber havaya salınan zararlı gazlarda da azalacaktır. [3]
Sürücüsüz araçların yaygınlaşması ile tüketici davranışlarında olumlu ve köklü
değişimler meydana gelecektir. Gelişen bu sistemleri, askeri birimler güvenlik amacıyla
kullanmak suretiyle ülke güvenliğinin sağlanması ya da terörle mücadele anlamında daha verimli
bir şekilde kullanabileceklerdir.[4]
3.3.Otonom Aracın Dezavantajları

Her yeni teknolojide olduğu gibi otonom araçların kullanıma sokulmasıyla da bir kısım
istenmeyen sonuçlar oluşacaktır. Hiç şüphesiz ki bunların başında, üretim ve
servis fiyatlarıne bağlı şekilde, araç fiyatlarındaki ciddi artışlar olacaktır. Bunun temel nedeni ise
meydana gelecek olası trafik kazalarında, araç sürücülerinin kusurları ortadan kalkacağından ve
araç üreticisi şirketler kusursuz sorumluluk ilkesi kapsamında tazminat davaları ile karşı karşıya
kalacaklarından bu riskleri de fiyatlara girdi olarak yansıtmaları olacaktır. Ayrıca bu araçlara
yüklenecek olası yazılım ve ilave donanımlar klasik araçlardakilerden çok daha
ileri düzeyde olacağından bu durum da fiyatları ayrıca artıran bir faktördür. Otonom
araçların minimum çalışma standartları çok yüksek olduğundan az gelişmiş bölgeler de ve gelişen
teknolojiyi teknolojiyi ülkelerde yaygınlaşması çok uzun bir zaman gerektirecektir. Bu ülkeler çok
büyük kaynaklar ayırarak altyapılarını otonom araçların kullanımına hazır hale getirmeleri
gerekecektir. Çok uzun zaman alacak olan bu işlem, gelişmiş olan ülkelerle diğer ülkeler
arasındaki, teknoloji kullanımı açısından, uçurumu daha da artıracaktır. Otonom araç üreten firma
sayısının azlığı, donanımla beraber yazılım teknolojisinin de ileri düzeyde bu araçlarda
kullanılması ve bu hususta yeterli ülke sayısının sınırlı olması göz önüne alındığında, araç
üretiminde ileriye yönelik olarak tekelleşmenin meydana geleceği, orta ölçekli olan otomotiv
üreticilerinin rekabet şanslarının ortadan kalkacağı ve bu ülkelerin ürettikleri ürünlerin, tekel
meydana gelmesi ile, diğer ülkelerde de kullanılacak olması haksız rekabeti artıracaktır.
Otonom araçlar sayesinde ilgili bu yeni gelişmeler sonucunda, her teknolojik gelişmede olduğu
gibi, başta araç sürücüleri olmak üzer bir kısım insanlar işlerini kaybedecek, bir bölümü ise
meslek veya çalışma alanı değiştirmek mecburiyetinde kalacaktır. [5]

Her ne kadar yapılan denemelerde otonom araçlar başarılı gibi gözükse de hava şartlarının
trafiğe elverişli olmadığı zaman dilimlerinde, özellikle kar ve tipinin olduğu ve internet erişimin
olmadığı zamanlarda ulaşımda bir kısım sorunlar yaşanabilecektir. Belki de ilerleyen zamanlarda
nasıl ki günümüzde at arabaları araçların kullandığı otobanlara ve yolları kullanamıyorsa, klasik
araçların da trafikten men edilmesi söz konusu olabilecektir. Bu durumda da kara ulaşımında tek

5
alternatif otonom araçlar olacaktır. Otonom araçların çözüm üretemediği zamanlarda bir kısmı
sıkıntılar yaşanabilecektir. Otonom araçlarda sürprizlere yer olmadığından klasik araç
kullanmaktan zevk alan kişilerin bu alışkanlıklarını değiştirmeleridir.[6] Bu kısım heyecanlarını
yaşayamamaları söz konusu olacaktır. Otonom araçların geliştirilmesinde, mevcut durumda, en iyi
teknolojiye sahip olan Google firması her ne kadar bu araçların yazılımlarının siber saldırıya
uğraması, ele geçirilmesi ya da kötü amaçlarla kullanmasının çok zor olduğunu iddia etseler de
geliştirilen bu akıllı araçların yollarda bir trafik canavarına dönüşmesi ya da otonomluk ve mobillik
özellikleri kullanılarak uzaktan herhangi bir hedefe bomba yüklü bir şekilde saldırıda bulunması
ya da daha ileri ki bir aşamada araç içerisinde herhangi bir sürücü olmaksızın araca montajı yapılan
ve uzaktan kumanda edilebilen silahların patlatılmasıyla suikastların işlenmesi ya da toplumsal
katliamların yapılması riski her zaman için var olacaktır. ABD Federal Soruşturma Bürosu (FBI)
da bu konudaki endişelerini dile getirmiştir.[7]

Otonom araçlar üretim tiplerine göre bütünüyle otonom olup klasik anlamda sürücü
müdahalesine yer vermeyen araçlar ve daima klasik stilde de sürülebilen araçlar olarak iki sınıfa
ayrılacaktır. Klasik stilde sürülebilen araçlarda her ne kadar kullanıcı şoför koltuğunda aracı
kullanıyor olsa da araçtaki elektronik sistemler, otonom aracın diğer araçlarla daha sağlıklı bir
biçimde iletişime geçebilmesi/ haberleşebilmesi, daha sağlıklı veri üretebilmesi ve rotasında
gidebilmesi için aracı kullanan sürücüyü sürekli surette bazı hareketleri
yapmaya veya yapmamaya zorlayacaktır.[8]

Bu zorunluluk hem teknolojik anlamda hem de yasal anlamda bir zorunluluk olarak sürücünün
karşısına çıkacaktır. Sürücü, araç kullanırken, çağımızda yapmış olduğu gibi cep telefonuyla
konuşma, SMS gönderme veya elektronik postasını kontrol etme gibi işlemleri yerine
getiremeyeceği gibi araç direksiyondaki hâkimiyetini sabit tutarak,
araç içindeki kamera sistemleri ile göz temasını yitirmeden dikkatli bir biçimde aracı
kullanmak mecburiyetinde kalacaktır. Bu durumda yine araç kullanmaktan zevk alan kişiler
açısından dezavantajlı bir durum oluşturacaktır.[4]

3.4. Otonom Araç Çalışma Prensibi

Otonom vasıtalarda taşıtın seyir hakimiyeti insanda değil Otonom sistemde diğer
bir deyişle bir cins otomatik kaptandadır. Bu hakimiyet taşıtın şerit içinde yakalanmasından
gidilecek yere göre dönüş manevralarının reelleştirilmesine, öndeki vasıtayı takip mesafesinin
ayarlanmasından trafik kaidelerine uyulmasına kadar oldukça işlevi kapsamaktadır.
İnsan sürücülerin sahip oldukları maharetlerin Otonom hakimiyete aktarılabilmesi, Otonom

6
sürücünün insan sürücüde olan hünerlere sahip olabilmesi için en az onun kadar görüşe sahip
olması, diğer bir deyişle trafikte çevresinde büyüyen hadiseleri en az insan sürücü gibi algılayıcı
edebilmesi gerekir.

Günümüzde mevcut farklı algılayıcı teknolojilerinin avantaj ve dezavantajları vardır. Bu


nedenden değişik algılayıcı ediciler kullanılmakta, böylece seyir bilgisayarı bunlardan gelen
bilgileri bütünleştirerek sensor fusion seyir hakimiyet işlevini icra edebilmektedir. Sürücüsüz
vasıtalarda kullanılan algılayıcılar mevcuttur. Otomatik sürüş, çok çeşitli teknolojileri ve
altyapıları, yetenekleri ve bağlamları, kullanım senaryolarını ve iş vakalarını ve ürün ve hizmetleri
kapsar. Bu gelişmeler için tek bir zaman çizelgesi yoktur: Bazıları bugün burada, bazıları uzak
olabilir ve bazıları belirli teknik yeniliklere veya belirli politika seçimlerine bağlı olacaktır. Daha
da önemlisi, araç otomasyonu otomasyon ve bağlantıda çok daha büyük devrimlerin bir parçasıdır.
Bu devrimlerin son zamanlardaki ayırt edici özellikleri - kişisel bilgisayarlar, cep telefonları ve
İnternet - birbirleriyle yakınlaştı ve şimdi fiziksel çevreyi algılayan ve işleyen makinelerle
harmanlanıyor. Bu makineler sadece otomatik motorlu taşıtları değil, aynı zamanda dronları,
kişisel bakım robotlarını, 3D yazıcıları, gözetim cihazlarını ve daha fazlasını içerir. İnsan gibi
otomatik bir araç bilgi toplamalı, bu bilgilere dayanarak bir karar vermeli ve bu kararı
uygulamalıdır. Bilgiler, araç ekipmanı, fiziksel altyapı, fiziksel-dijital altyapı ve dijital altyapıdan
gelir; bunlardan herhangi biri herkese açık veya özel olabilir. Bu teknolojilerin birçoğu bugün
mevcuttur ve araçlara rehberlik edebilir ve bazı durumlarda test durumlarında ve çeşitli sürüş
ortamlarında sürücü girişi minimum veya hiç olmayan araçlar kullanır.[9]

7
Şekil 3.1:Otonom araç teknolojileri.

Birçok şirket, gelişmiş sensör işleme teknolojileri, uyarlanabilir algoritmalar, yüksek tanımlı
haritalama ve bazı durumlarda araçların konuşlandırılması sebebiyle kapasiteleri hızla gelişen
yüksek otomasyonlu araç prototiplerinin denemelerini yaptı ya da devamlı yol testine girdi. Birçok
şirket, gelişmiş sensör işleme teknolojileri, uyarlanabilir algoritmalar, yüksek tanımlı
haritalama sebebiyle kapasiteleri hızla gelişen yüksek otomasyonlu araç prototiplerinin
denemelerini yapmıştır ya da devamlı yolda testler yapmaktadır. Otomatik araçlar, ABD Birleşik
Devletleri'ni nerdeyse sadece kendiliğinden sürüş modunda geçti. [9]

4. ARDUİNO NEDİR

Arduino, projeleri geliştirmek için dizayn edilmiştir ve elektronik donanım ve yazılımı


geliştirmek için bir platform üstünde girdileri ve çıktıları olan bir elektronik alettir. Arduino
programlama dili ile kaleme alınır ve Arduino da geliştirmiş olduğumuz yazılım dilini Arduino
IDE yolu ile karta aktarılır.

4.1.Arduino Çalışma Prensibi

Arduino'nun analog ve dijital pinleri vardır ve hem analog hem de dijital pinleri
işleyebilir. Arduino'ya bağlı sensörler sayesinde ortamda etkileşime giren giriş sinyallerini elde
etmek ve bu sinyalleri kontrol etmek ve çıkış sinyalleri üretmek için algoritmalar oluşturmak
kolaydır.

8
Aşağıda otonom araba’da kullandığımız kodlar şekil 4.1 de görülmektedir.

Şekil4.1: Arduino Kumanda kodu

9
Şekil 4.2: Arduino Kumanda Kodlarının devamı

10
Şekil 4.3: Arduino Kumanda Kodları Devamı

11
Şekil 4.4: Arduino Kumanda Devresi Kodu

12
Şekil 4.5: Arduino Kumanda Devresi Kodu Devamı

13
Şekil 4.6: Arduino Kumanda Devresi Kodu Devamı

4.2.Arduino İle Kumanda Devresi

Arduino ile kumanda devrei arasındaki ilişkiyi anlatıcak olursak bilgisayardan aracı
kontrol edebilmek için kumandanın yön komutlarına karşılık gelen bağlantı noktalarına yani GPIO
pinlerine karşılık gelen pinlere bağlayıp 5V ve 0V göndererek kontrolünü Şekil 4.2.1’deki gibi
sağlamaktadır. (İlgili kodlar EK1.’dedir.)

Şekil4.7: Arduino yardımıyla kumanda devresinin kontrolü


14
4.3. Raspberry Pi

Raspberry Pi eğitim ve hobi amaçlı kullanımlar için tasarlanmış, kredi kartı


büyüklüğünde, düşük maliyetli ve genellikle Linux işletim sistemi ile kullanılan mini bir bilgisayar
olup Şekil 4.8’de gösterilmiştir. Raspberry Pi bir bilgisayar olmasının yanında aynı zamanda
fiziksel dünyayı algılayan ve kontrol edebilmek için kullanabileceğimiz basit bir
mikroişlemcidir.[18]

Şekil4.8: Raspberry Pi 3[18]

Raspberry Pi üzerinde bulunan 40 adet pin sayesinde birçok kontrol uygulaması aynı
anda yürütülebilmektedir. Bluetooth ve wifi ile iletişim basit, hızlı ve etkilidir. Dokunmatik
ekran ve kamera modül portu yardımı ile kontrol edilecek sistemin kodlaması ve müdahalesi
kolaylıkla tamamlanabilir. Raspberry Pi, sıcaklık ve nem kontrolü, motor kontrolü, ev
otomasyonu gibi birçok kontrol uygulamasını gerçekleştirebilir.19]

Projemizde kullanılan RPİ, Mart 2016’da satışa sunulmuş olan RPİ 3 model B olanıdır.
RPİ mikrobilgisayarı kullanmamızda ki önemli etkenler, küçük boyutlarda, yüksek işlemci hızına
sahip olması ve Python programlama dilini desteklemesidir.[22]

Dahili Wi-Fi ve Bluetooth fonksiyonları sayesinde araca uzaktan erişim sağlar.


Sistemde 1.2 Ghz, 4 çekirdekli 64 bit ARM Cortex-A53 işlemci birimi ve Broadcom BCM2837
mikroişlemci bulunur. 1 GB bellek kapasitesine ve 2 çekirdekli Videocore IV GPU grafik işlem
birimine sahiptir. 4 USB 2.0 bağlantı noktası, 10/100 Mbit/s'yi destekleyen Ethernet bağlantı
noktaları ve HDMI çıkışı vardır. RPI kartı Şekil 4.9'daki pin girişini göstermektedir.

15
Şekil 4.9: RPİ 3 Pinleri

Raspberry Pi 3 Özellikleri:

• 64-bit quad-core ARMV 8 işlemci


• 1.2 GHz
• 1 GB RAM
• Dahili Wifi-BCM43143
• Bluetooth 4.1 (Bluetooth Low Energy-BLE)
• 40 Adet GPIO
• 4 Adet USB 2
• • 4 uçlu Stereo çıkışı ve Composite video çıkışı
• Full HDMI
• RPİ Kamera bağlantısı için CSI kamera portu
• RPİ 7” dokunmatik ekran için DSI ekran portu
• Micro SD soketi
• Güncellenmiş güç katı (2,5 A’ekadar destekleniyor)

16
• Güç ve aktivasyon ledi.
4.4.RP kurulumu

RPi bir mikrobilgisayar olduğu için işletim sistemini kurmak için kendi altyapısına
ihtiyaç duyar. RPi'nin ilk kurulumu için minimum 4 GB kapasiteli önceden yüklenmiş bir Micro
SD (Secure Digital) kart gereklidir. Gerekli Raspbian işletim sistemi sunucumuza RPI Vakfı
resmi web sitesinin "https://www.raspberrypi.org/downloads/raspbian/" sayfasından indirilir.
Raspbian Stretch ve Raspbian Stretch Lite olmak üzere iki farklı dosya olacak. Lite versiyonunda
grafik ekran arayüzü olmadığı için Raspberry Pi 3'ün HDMI çıkışını göremiyoruz. Bu sürüm
ileri düzey kullanıcılar içindir, RPi'yi komut satırından (terminal) kullanabilirsiniz. Lite sürümü,
projemizde ekran görüntülerine ihtiyaç duymadığımız ve işlemlerin daha hızlı yapılabilmesi için
tercih edilmektedir.

Şekil4.10: Raspbian İşletim Sistemi Çeşitleri

İndirdiğimiz Lite imaj dosyasını .zip formatından çıkartıyoruz. Daha önce hosttan indirdiğimiz
win32diskImager programını açıyoruz ki işletim sistemini SD karta yazdırabilelim. Belirlenen
konumdan imaj dosyamızı seçiyoruz. SD kartımızın bilgisayara takıldığından emin olduktan
sonra cihaz kısmında görebiliriz. Ardından Write butonuna tıklayıp yazma işlemini başlatıyoruz.
Yazma işlemi yaklaşık 2-3 dakika sürer. işleme. Yazma işlemini tamamlayın, "yazma başarısı".
Gönderinizi görene kadar bekleyin. RPi'nin ilk başlatıldığında wi-fi'ye giriş yapabilmesi için
kullanılacak özel bir dosya oluşturabiliriz. Windows'ta, SD kartı taktıktan sonra, diskte iki
sürücü ve iki bölüm vardır. Biçimlendirmek için ortak FAT türünü ilk kullanan, işaretin
önyüklenebilir olmasını sağlar. Bu sürücü ilk açılışta wi-fi'mizi bulup açmamıza yardım
edecek bazı dosyaları düzenleyeceğimiz yerdir. Windows’ta bir metin editörü olan Not Defteri’ni
açarak aşağıda paylaştığımız kodları, wi-fi’mize uygun biçimde yapıştırıp düzenlemeliyiz. Şekil
4.11 de gösterildiği üzere ;

17
Şekil 4.11: Giriş Bilgileri

Bağlanacağımız ağın kimliği bu bölüme yazılmalıdır. Bu alana "HW-4G-MobileWIFI-


9C1C" projesinde kullanılan Huawei mobil modemin logosu yazılır. Bu alan modemimizin
şifresi ile değiştirilmelidir. Değişiklik tamamlandıktan sonra dosya adı "wpa_supplicant.conf"
olur. Adı ile değiştirilerek kaydedilmelidir. Bu dosya SD karttaki
"/etc/wpa_supplicant/wpa_supplicant.conf" klasörüne taşınmalıdır. Yukarıda bahsettiğimiz
talimatları uyguladıktan sonra artık RPi wi-fi ağımıza bağlanmıştır, SD kartımızı hosttan çıkarıp
RPi işlemimizin micro SD giriş kısmına takarak başlayabiliriz. RPI çalışmamız, USB kablosu
ile mobil güç adaptörü bağlanarak çalıştırılmaktadır. Şimdi SSH üzerinden bağlantı kurabilmek
için RPi'nin IP adresini bulmanız gerekiyor. Bu bağlantıların yapılabilmesi için Windows
üzerinde çeşitli programların çalıştırılması gerekmektedir. Öncelikle IP adresinin bulunabilmesi
için host ve RPi'nin aynı modem üzerinde bağlantı kurması gerekir. RPi'nin IP kimliği, host
üzerinde "Wireless Network Observer" programı çalıştırılarak öğrenilir. Aynı modeme bağlı
farklı ağların IP tanımlamaları Şekil 4.12'de gösterilmiştir.

Şekil 4.12: Wireless Network Watcher Giriş Sayfası

18
Program çalıştıktan sonra ekrana "192.168.8.110" RPI IP adresi gelir. Bu adres farklı giriş
saatlerinde değişecektir. IP adresini öğrendikten sonra RPi ile SSH bağlantısı sağlamak için
Putty programı tercih edilir. Windows üzerinde Putty programını çalıştırdıktan sonra karşınıza
Şekil 4.13'deki gibi hoş geldiniz arayüzü çıkacaktır.

Şekil 4.13: Giriş Sayfası

Putty login arayüzü göründükten sonra "Host Name" kısmına Raspberry Pi'nin IP adresini giriniz
ardından SSH alanı seçilecektir. bağlantı türü olarak. "Aç" düğmesine tıklanarak RPi komut
terminaline erişim sağlanacaktır. Giriş komutu ekranı Şekil 4.14'te gösterilmiştir.

19
Şekil 4.14:RP Komut Ekranı

RPi kişisel bir mini bilgisayar olduğu için ilk giriş ekranında "Login as:" kullanıcı adı ve
"password:" şifresini soracaktır. Raspbian işletim sistemi ilk kurulduğunda "Login ID: pi" ve
"Password: ahududu" bilgileri hazırlanır. RPi'ye eriştikten sonra yapılacak ilk şey şifre
bölümünü değiştirip ayarlar bölümüne gidip projede kullandığımız GPIO giriş ve çıkış pinleri, I
2C bağlantı girişi ve Pi kamera seçeneklerini aktif hale getirmektir. Komut satırından "sudo
raspi-config" ifadesinin girilmesi, ayarlar giriş ekranına erişim sağlayacaktır. Şekil 4.15 de RPI
ayarı giriş ekranını gösteriyor.

20
Şekil 4.15:RP Ayarlar Ekranı

• Change User Password: RPİ’nin kullanıcı adı ve şifresinin değiştirildiği bölümdür.


• Hostname: RPİ’nin ağ taramasında bulunacağı ismin değiştirildiği bölümdür.
• Boot Options: Raspbian işletim sistemine sahip RPİ’nin farklı açılış modlarının seçilebildiği
bölümdür.
• Localisation Options: RPİ’nin dil ve bölge yerleşimi değişikliklerinin ayarlandığı bölümdür.
• Interfacing Options: RPİ’ ye dışarıdan bağlanacak çevre donanımlarının aktif veya pasif
yapılandırmasını sağlayan ayardır.
• Overclock: RPİ’nin çalışma performansını artırmak için kullanılan ayardır.
• Advanced Options: Gelişmiş seçeneklerin yapılandırıldığı ayarlardır.
• Uptade: RPİ’yi güncelleştirmemizi sağlayan ayarlardır.
• About raspi-config: Kullandığımız yapılandırma sistemi hakkında bilgi verir.

RPI ayar kısmından "Arayüz Seçenekleri" kısmına girerek kullanacağımız gerekli donanımı
aktif etmemiz gerekiyor. Şekil 4.16 da, çevresel aygıt ayar ekranını gösterir.

21
Şekil 4.16: RPİ Çevre Birimleri Ayarlama Ekranı

• Kamera: RPİ ana kartı üzerinde bulunan CSI konektörüne bağlı kameranın aktif edildiği alandır
• SSH: Farklı sistemler ile ağ üzerinden RPİ’nin iletişim kurabilmesi için gerekli SSH bağlantının
aktif edildiği bölümdür.
• VNC: Raspian işletim sistemiyle birlikte gelen VNC uzaktan erişim programın aktif edildiği
bölümdür.
• SPI: SPI bağlantıyla çalışan diğer donanımların, RPİ üzerinde çalışabilmesi için gerekli giriş-çıkış
pinlerinin aktif edildiği alandır.
• I2C: I 2C bağlantıya sahip cihazlarla RPİ iletişim kurabilmesi için gerekli giriş çıkış pinlerinin
aktif edildiği alandır
• Serial: Uzaktan bağlantı sağlayarak komut satırına ulaşabilmek için, GPIO pinleri içerisinde yer
alan UART pinlerinin aktif edildiği bölümdür
• 1-Wire: Donanımsal olarak 1-wire protokülüyle çalışan sensörlerin RPİ ile iletişim kurabilmesi
için gerekli bağlantıların aktif edildiği bölümdür.
• Remote GPIO: Rpi.GPIO isimli servis sayesinde ağ bağlantısı üzerinden RPİ’nin giriş-çıkış
pinlerini kontrol eder.

22
Şekil 4.17: WinSCP Bağlantı Ekran

RPi üzerinde tüm ayarlamalar yapıldıktan sonra SSH bağlantısı üzerinden dosya paylaşımını
sağlayan "WinSCP" programı kullanılarak host üzerinde bulunan gelişmiş metin editör programı
"notepade++" üzerine yazılan kodun RPi home klasörüne daha hızlı aktarılması sağlanır. Şekil
4.17, WinSCP bağlantı ekranını göstermektedir. Host üzerinde oluşturduğumuz "manage.py" ve
"config.py" Python uzantı kod dosyalarını RPi ana klasörü WinSCP programında /home/pi/ alt
başlığı altında yeni oluşturduğumuz "d2" klasörüne aktarıyoruz. Detaylı kod ekte
verilmiştir.Bütün bu işlemler tamamlandıktan sonra işlem gücü düşük olduğundan RC sürücüsüz
araba ile ana bilgisayarda kullanacağımız görüntü veri dosyalarının işlenmesi için bir Python
ortamının oluşturulması gerekmektedir. RPi üzerinde tüm ayarlamaları yaptıktan sonra host
üzerinde bulunan "notepade++" gelişmiş metin düzenleyici programı üzerine yazdığımız kod,
daha hızlı Miniconda Python 3.6 64-bit sürümünün RPi home klasörü ve https sitesinden
Windows kurulum dosyaları :/ /conda.io/miniconda.html Kurulum tamamlandı. Başlat
menüsünden Anaconda terminal satırı açılarak Python Anaconda ortamı için aşağıdaki komutlar
girilmelidir. Anaconda terminalini kapatıp tekrar açtığımızda, Python kütüphanesi ile
eşleştirmeyi yeniden etkinleştirmek için "aktif eşeği etkinleştir" komutunu yazmamız gerekiyor.

4.5.Kamera modülü
Otonom aracın, otomatik eğitimi aşamasında görüntülerin alınabilmesi için şerit çizgilerin yolların
araç üzerinden canlı olarak ana bilgisayara video aktarımını ve fotoğraf aktarımı yapılabilmesi için
23
RP modeli ile uyumlu ve yüksek çözünürlüğe sahip RP için dizayn edilmiştir. (İlgili kodlar
EK.2‘dedir)

Kamera modülünün özellikleri şunlardır:

• Sensör tipi: Omni Vision OV6547 Color CMOS QSXGA (5 Megapixel)


• Sensör Boyutu: 3.67 x 2.74 (mm) (1 / 4” format)
• Pixel Sayısı: 2592 x 1944
• Pixel Boyutu: 1.4 x 1.4 (um)
• Lens: f=3.6, f/2.9 (mm)
• Atış :1/4 5M
• Diyafram: 2.9
• Odak uzaklığı: 3.29
• FOV:65 derece
• Sabit Odak: 1 m- Sonsuz
• Görüş Açısı: 54 x 41 açılı
• Görüş Alanı: 2m’de 2.0 x 1.33m
• Tam çerçeve SLR lens eşdeğeri: 35mm
• Stream: 1080p x 30fps, 720p x 60fps, 480p x 60fps II 90fps
• Çalışma sıcaklığı: -30°C ~ 70°C

Şekil 4.18:RP uyumlu kamera modülü

5. YAPAY SİNİR AĞLARI İLE TAHMİN

24
Tahmin, TDK sözlüğünde geçen Arapça bir etimoloji olup, akıl, sezgi veya belirli verilere
dayanarak meydana gelebilecek bir şeyi veya olayı tahmin etmek olarak tanımlanır. Tahmin,
teknik alanlarda ve günlük hayatta kullanılan önemli bir süreçtir. Yaya olarak karşıdan karşıya
geçerken beynimiz sol ve sağ araçların hızlarını ve aramızdaki mesafeyi hızlı bir şekilde
algılayacaktır. Yoldan geçmek veya tehlike olmadığına dair bir sinyal beklemek de bir tahmin
işlemidir. Burada geçmişte öğrenilen ve uygulanan bilgilere dayalı olarak anlık bir tahmin
yapılır. Ticari işlemler, doktorların hastalıkları, finans kurumlarının parite durumu ve hava
mühendislerinin hava durumu tahminleri, süreç içinde teknik olarak benzer olan tahminlere
örnektir.

Yapılan tahminlerin eksiksiz ve kusursuz biçimde gerçekleşmesi hiçbir zaman beklenmez. Tahmin
başarı oranı eldeki veri miktarına ve sonuca etki eden faktörlerin belirlemesine bağlıdır. Tanımda
da bahsedildiği üzere tahmin istenilen sonuca göre sezgi ya da veriye dayanır. Tahmin, nitel
(kalitatif) ve nicel (kantitatif) yöntem olmak üzere iki farklı biçimde gerçekleştirilir. Nitel tahmin
yöntemleri sezgisel olup önyargı içerebilir ve tümevarımı amaçlamaktadır. Uzman görüşü
alınması, delphi tekniği, anket yöntemi, senaryo yazımı ve pazar araştırması nitel tahmin
yöntemlerine örnek olarak gösterilebilir. Nicel tahmin yöntemleri ise geçmişteki tercihlerin ve
sonuçların gelecekte de benzeri olarak devam edeceğini öngörüp verilerin matematiksel olarak
değerlendirildiği, tümdengelimi amaçlayan objektif tahmin yöntemidir. Bazı kaynaklarda nicel
yöntemler zaman serisine dayalı yöntemler ve sebep sonuç ilişkisine dayalı yöntemler olmak üzere
iki ana başlıkta incelense de günümüzde teknolojik ilerleme ile yapay zekâ alt başlıktan üçüncü
ana başlık haline gelmiştir. Yapay zekâ ile tahmin bir sonraki başlıkta incelenecektir.[20]

5.1.Yapay Zeka ile Tahmin

Bugün sıkça bahsedilen yapay zeka teknolojisi, önümüzdeki birkaç yıl içinde günlük
hayatımızda da rol oynayacak. Yapay zekanın arkasındaki gerçek, uzak veya yakın gelecekte
neler olabileceğini tahmin etmek için geçmiş veya şimdiki verileri kullanabilmesidir. Yapay
zeka tahmini; yapay sinir ağları, bulanık mantık ve genetik algoritmalar olmak üzere üç farklı
şekilde üretilebilir. Nicel tahmin yöntemleri Şekil 5.1.'de görsel olarak başlıklarına göre
sınıflandırılmıştır.

25
Şekil 5.1: Tahminleme yöntemleri [20]

5.1.1. Yapay Zeka Nedir

Yapay zekanın nihai amacı, insan gibi düşünen ve hareket eden makineler geliştirmektir. Yapay
zekanın tanımını daha iyi anlamak için önce zekanın ne olduğunu tanımlamamız gerekiyor.
Hikmet, dilimize Arapça'dan girmiştir, sözlük anlamına bakarsak; TDK, insanın düşünme, akıl
yürütme, nesnel gerçekleri algılama, yargılama ve sonuç çıkarma yeteneğinin tümü olarak
tanımlamaktadır. İngilizce ve Fransızca'da Intelligence, Latince'den türetilen ve "anlayış"
anlamına gelen "zeka" kelimesine karşılık gelir. Yapay zekanın 16 alanındaki kurucu bilim
adamlarından biri olan Nils J. Nilsson'a göre, "Varlıkların çevrelerinde normal ve öngörülebilir
şekilde çalışmasını sağlayan kalitedir" (Nilsson 2010). Shane Legg ve Marcus Hutter'ın "Smart
Definition Collection" adlı makalesinde, farklı bilim dallarından 71 farklı akıllı tanım yer
almaktadır

Algoritma, girdiyi çıktıya dönüştürmek için yürütülecek bir dizi komuttur. Ancak bazı işler için
bilinen bir algoritma yoktur. Makine öğrenimi, bir bilgisayarı standartlara göre performansını
artırmak için programlamak için örnek verilerin veya geçmiş deneyimlerin kullanılmasıdır.

26
Yapay öğrenme yalnızca bir veri tabanı uygulaması değil, yapay zekânın da bir parçasıdır. Değişen
bir ortamdaki etmenin zeki olarak nitelendirilebilmesi için deneyimlerinden öğrenebilmesi
gerekir.” (Alpaydın 2012). Tüm bu bilgiler ışığında yapay zekâyı daha iyi tanımlayabilir ve
amacını daha iyi anlayabiliriz.[20]

5.2. Yapay Sinir Ağı

Yapay Sinir Ağları (Yapay Sinir Ağları) veya kısaca Sinir Ağları (YSA), ağırlıklı bağlantılarla
birbirine bağlanan işlem elemanlarından oluşan, insan beyninden ilham alan paralel dağıtılmış
bilgi işleme yapılarıdır. En önemli özelliği ise yaşayarak öğrenebilmesidir. Yapay sinir ağları
geliştirmenin amacı, insan beyninin öğrenme yoluyla yeni bilgi edinme, yeni bilgi oluşturma ve
keşfetme gibi yeteneklerini herhangi bir yardım almadan otomatik olarak gerçekleştirmesidir.
Sinir ağları, bilgi ve öğrenme arasında bir ilişki kurma yeteneğine sahiptir. Yapay sinir ağlarının
temel işlevleri şu şekilde belirtilebilir:

• Öngörü (Prediction) veya tahminleme : İleriki satışlar, hava tahminleri, at yarışları,


çevresel risk, …
• Sınıflandırma (Classification) ve Kümeleme (Clustering) : Müşteri profilleri, tıbbi teşhis, ses ve
şekil tanıma, hücre tipleri …
• Kontrol (Control) : Erken uyarı için uçaklarda ses ve titreşim düzeyleri, …

Veri ilişkilendirme, veri kavramsallaştırma ve veri filtreleme için de kullanılabilir. Endüstriyel


uygulamalar, finansal uygulamalar, askeri ve savunma uygulamaları, tıp ve sağlık uygulamaları,
mühendislik uygulamaları, robotik, görüntü işleme, örüntü tanıma, yapay sinir ağlarının yanı
sıra iletişim endüstrisi ve eğlence tahmini gibi özel uygulama alanları da bulunmaktadır. Yapay
sinir ağı birimi temel olarak girdi, ağırlık, toplam fonksiyon ve çıktıdan oluşmaktadır.

Şekil 5.2: Tek gizli katmana sahip birçok katmanlı algılayıcı modeli.[21]

27
İnternet üzerinde yapay sinir ağları için birçok yazılım kütüphanesi ve simülasyon ortamı
bulunabilmektedir. Bunların bazıları sadece kütüphane kısmından oluşurken bazıları yapay sinir
ağı tasarlamayı sağlayan araçları da içerir. Bu tür araçlar özellikle konuyu ileri düzeyde
bilmeyenler için yazılımlara yapay sinir ağı eklemeyi kolaylaştırır.[21]

5.2.1. Geri Dönüşümlü Ağlar ve Diğer Yapay Sinir Ağları

Daha önce tartışılan ağların en temel özelliklerinden biri, ileri beslemeli ağlar olmalarıdır. Yani
bu ağlardaki süreç elemanları çıktılarını bir sonraki katmana veya dış dünyaya gönderir. Bu
elemanların çıktısı geri dönüştürülemez. Çıktısı, süreç elemanına girdi olarak kullanılmaz. Bu
bölümde öncelikle geri dönüştürülebilir ağı tanıtın ve Elman ağını ayrıntılı olarak açıklayın.
Daha sonra yapay sinir ağlarının yaygın olarak kullanılan diğer modelleri kısaca açıklanacaktır.

Tersinir bir ağda, süreç elemanının çıktısı sadece ileriye değil, geriye de gönderilir. Genel olarak
konuşursak, tamamen tersine çevrilebilir ve kısmen tersine çevrilebilir ağlardan bahsedilebilir.
Elman file parçası geri dönüşümlü filenin en güzel örneğidir. Elman ağının tasarımı bilinen CCA
ağına benzer ve genelleştirilmiş Delta kuralına göre eğitilir.

Bu ağlarda MCA ağlarından farklı olarak çıkarım elemanları adı verilen süreç elemanları
bulunmaktadır. Bu elemanların görevi, ara katman elemanının çıktısını girdi olarak ağa geri
göndermektir. Ağ çıkışını hesaplama formülü bu bölümde verilmiştir. Ara katman öğesi ile
içerik öğesini birleştiren bağlantının ağırlığı sabittir ve 1'e eşittir. Bu nedenle, ağın eğitim
sürecinde, ağa beklenen çıktı ile gerçek çıktı arasındaki hata yayılımında bu bağlantılar dikkate
alınmaz, dolayısıyla ÇKA ağının öğrenmesi burada da uygulanabilir. Günümüzde yaygın olarak
kullanılan diğer ağlara örnekler:

• Hopfield ağı
• Conterpropogation ağı
• Cognition ve Neocognition
• SOM ağı

Hopfield ağının en temel özelliği, tüm süreç elemanlarının birbirine bağlı olmasıdır. Ağ
bağlantısı değeri bir enerji fonksiyonu olarak kaydedilir. İki tür model vardır. Ayrık ve sürekli
Hopfield ağı. Bu ağlar özellikle geleneksel yöntemlerle çözülmesi zor olan optimizasyon
problemlerinin çözümü için uygundur.

28
Yayılma önleyici ağ ise Kohonen ve Grosberg'in öğrenme kurallarının birleştirilmesiyle
oluşturulmuş bir ağdır. Her iki öğrenme kuralının da kendi avantajları vardır. Bu ağlar özellikle
şekil tanıma problemlerinde başarıyla kullanılabilir.

Öte yandan, bilişsel makine ve yeni bilişsel makine ağı, insan beyninin görsel sisteminde
görevleri üstlenmek için geliştirilmiş ağlardır. Bu ağlar iki katmandan oluşmaktadır. Birinci
katman bağlantı alanlarına, ikinci katman ise rekabet alanlarına bölünmüştür. Bu ağlarda iki tür
süreç öğesi vardır: uyarıcı ve engelleme. Bileşenin çıkışı, kendisine ulaşan uyarı ve yasaklama
sinyallerine göre belirlenir. Bu ağlar esas olarak sorunları belirlemek için kullanılır.

SOM ağı, öğretmen olmadan öğrenilebilen ve sınıflandırma problemlerine başarıyla uygulanmış


bir ağdır. Ağın bir girdi katmanı ve bir çıktı katmanı vardır. Çıktı katmanındaki süreç elemanları
birbiriyle rekabet eder ve kazanan eleman girdinin kategorisini gösterir. Ağın çıktı katmanı bir
düzlem olarak ele alınır ve her kazanan süreç öğesinin komşularını göstermek için bir komşuluk
alanı oluşturulur. Mahalledeki tüm unsurlar kazanan unsurla birlikte değerlendirilir.

Son olarak, bu bölüm hibrit ve yakınsanmış ağlara odaklanacaktır. Burada, sorunu birlikte
çözmek için birden fazla ağ sağlanır. Bir sonraki bölümde kompozit ağların nasıl tasarlanacağını
ve problemlere nasıl çözümler ürettiklerini göstereceğiz.

5.2.2. Yapay Sinir Ağlarının Donanımı

Günümüzde çoğu yapay sinir ağı uygulaması yazılım teknolojileri olarak kabul edilmektedir.
Belirli bir yazılım modelini uyguladı ve sorunu seri bir bilgisayarda çalıştırarak çözmesini istedi.
Paralellik gibi yapay sinir ağlarının bazı özelliklerini göstermek için özel donanım teknolojisine
ihtiyaç vardır. Yapay sinir ekipmanı ticari olarak aşağıdaki alanlarda kendini gösterir:

• Optik karakter tanıma


• Ses tanıma
• Trafik izleme
• Veri madenciliği ve filtreleme

Yapay Sinir ağları için özel donanım geliştirmenin birçok faydası vardır. Bunları arasında şunlar
sayılabilir.

• Hız: Birçok uygulamada sistemin karar verme hızı çok önemlidir. Günümüzün en hızlı seri
işlemcileri bile, özellikle çok sayıda giriş parametresi gerektiğinde ve ağ ölçeği çok büyük
olduğunda gerçek zamanlı kullanım ve öğrenme için uygun değildir. Sistemi gerçek zamanlı

29
olarak kullanabilmek için sistemin hızını artıracak özel donanımların kullanılması gerekebilir.
Örneğin paralel bağlanan işlemciler yardımıyla uygulamaların hızı artırılabilir.
• Güvenilirlik: Özel donanım sayesinde sistemin güvenilirliği artırılabilir. Özellikle donanım
hataları kontrol altına alınacağı için sisteme olan güven artacaktır.
• Özel çalışma koşulları: Özellikle sistemin boyutu ve ağırlığı açısından en uygun durumun
seçilmesini sağlamak için donanımı soruna göre tasarlayın.

Yapay sinir ağlarının araştırılması ve bu kitapta anlatılan modeller genellikle yazılım olarak
geliştirilir ve seri makinelerde çalıştırılır. Bu ağların başarılı bir şekilde uygulanması ve paralel
çalışması özel donanım gerektirir. Bu konuda derinlemesine araştırmalar yapılıyor ve ticari bir
sistem oluşturuluyor. Bu cihazlar kontrol edildiğinde genel olarak 3 tip cihaz olduğu
görülmektedir. Bunlar:

• Dijital yapay sinir ağı donanımları


• Analog yapay sinir ağı donanımları
• Karma donanımlar

Bunların her birinin kendi avantajları ve dezavantajları vardır.Tasarımcılar zamana, maliyete ve


sorunun doğasına göre kendileri için en uygun donanımı seçebilirler.

5.2.3. Yapay Sinir Ağlarının Genel Özellikleri

Bu bölümde yapay sinir ağlarının uygulamaları anlatılmaktadır. Genel olarak aşağıdaki alanlarda
uygulamalara rastlandığı ifade edilmiştir.

• Endüstriyel uygulamalar
• Finansal uygulamalar
• Askeri ve savunma uygulamaları
• Sağlık uygulamaları

Bu alanlarda teşhis, sınıflandırma, tahmin, kontrol, veri ilişkilendirme, veri filtreleme,


yorumlama gibi alanlarda yapay sinir ağları kullanılmaktadır. Hangi şebekenin hangi problem
için daha uygun olduğunu belirlemek için ağın öznitelikleri ile problemin özniteliklerini
karşılaştırmak gerekir. Her ağın çok iyi olduğu bazı işlevleri vardır. Örneğin, CKA ağlarının
tahmin problemlerinde çok iyi sonuçlar üretebildiği iyi bilinmektedir. Bu özelliklerden yola
çıkarak probleme uygun ağ belirlenebilir. Yapay sinir ağlarının bazı avantajları ve dezavantajları
vardır. Bunlar bölümde listelenmiştir.

30
Yapay sinir ağlarından yararlanmak için araştırmalar yapmak ve dezavantajlarını önleyecek
sistemler oluşturmak gerekmektedir. Diğer sistemlerle karşılaştırıldığında yapay sinir ağlarının
geliştirilmesi çok kolaydır. Piyasada ticari olarak temin edilebilen simülatörler bulunmaktadır.
Bu sistemlere sadece örnekler verilmiş ve ağın topolojisi belirlenmiştir. Simülatörün kendisi
çalışmamı tamamladı. Bu simülatörlerin test fonksiyonları da vardır. Öğrenci ayrıca ağın
performansını da belirleyebilir.

6. RC OTONOM ARACIN YAZILIM TASARIMI

Otonom aracın manevra ve hareket kabiliyetlerinin sağlanması için gerekli yazılım, kütüphane
ve kalibrasyon ayarları kontrol edilmiştir.Anlık görüntüler kaydedilerek görüntü veri dosyaları
oluşturulmakta, bu dosyalar ana bilgisayarda işlenmekte ve otonom sürüş eğitimi
gerçekleştirilmektedir. . Ayrıntılı kod için eke bakın. Kullandığımız mikrobilgisayar türü RPI
olduğu için açık kaynaklı Python programlama dilini kullanıyoruz. MatLAB, Visual Studio,
Opencv gibi görüntü işleme teknolojisinde kullanılan birçok programlama dili ve kitaplık
bulunmaktadır. Kendi kendine sürüş eğitimi aşamasında, Google mühendisleri tarafından
geliştirilen Python programlama dili ile uyumlu TensorFlow, Keras, Tornado ve birçok temel
kütüphane ile kullanıldı.

Sinir ağı sistemi, besleme için TensorFlow ve Keras'ı kullanır. Sistemin eğitim aşaması, sistem
pistte defalarca manuel olarak kullanılarak ve ardından kendi başına kullanmasına izin verilerek
çalışılmıştır. Kendi kendine giden arabalarımızı farklı yol ve koşullarda eğitmek için pygame
oyun platformu üzerine kurulan simülasyon programı üzerinde deneyler yapılmıştır.

6.1.Python
Python, Guido Van Rossum adlı Hollandalı bir programcı tarafından yazılmış bir programlama
dilidir. 1990 yılında gelişimi başlayan Python; C ve C++ gibi programlama dilleri ile
karşılaştırırsak aşağıdaki sonuçları alabiliriz.
• Daha kolay öğrenilir
• Program geliştirme sürecini kısaltır daha hızlı yazılabilmesine imkân sağlar
• C ve C++ programlama dillerinin aksine ayrı bir derleyiciye ihtiyaç duyulmaz.
• Daha okunaklı, daha düzenli kod ve söz dizilimine sahiptir.

Python, işlemleri hızlı bir şekilde gerçekleştirmenizi, sisteminize entegre olmanızı ve etkili
olmanızı sağlayan bir programlama dilidir. Windows, Linux/Unix ve MacOS işletim
sistemlerinde çalışmasının yanı sıra Java ve .NET sanal makinelerine de taşınabilir. Python, açık

31
kaynak kodlu, özgür lisanslı ve özgür bir yazılım olduğu için birçok geliştirici tarafından her
zaman tercih edilmiştir. Nesne yönelimli programlama, işlevsel veya yapısal programlama gibi
çoklu programlama paradigmalarını destekler.

Python dilini öne çıkaran unsurlardan bir diğeri ise bilimsel araştırmalarda tercih edilmesi ve hızlı
bir yapısına sahip olmasıdır. Bir başka yönden incelediğimizde RPİ ve Arduino benzeri
programlanabilir elektronik kartlar ile uyumlu bir alt yapıya sahip olmasıdır.[25]

Bilimsel araştırmalarda yaygın olarak kullanılan Python için çeşitli bilim dallarında kullanıma
hazır özel kütüphaneler bulunmaktadır. Python kütüphanesinden ne kastettiğimizi açıklamak
için önceden yazılmış ve sık kullanılan program parçaları arşivlenir ve daha sonra kullanılmak
üzere dosyalarda saklanır. Özellikle bu programlama dilini bilgisayarımıza yüklediğinizde
kullandığınız dosyalar kurulum dosyaları ile birlikte bilgisayarımıza yüklenir. İhtiyacımız
olduğunda kod penceremize gerekli yönlendirme tanımlarını girerek ve komutları çağırarak bu
kod parçacıklarını kullanabiliriz, bu sayede işlemlerimiz daha hızlı olacaktır. Bu kütüphaneler
profesyonel bir yazılım ekibi tarafından hazırlanır ve kapsamlı testlerden sonra açık kaynak
oldukları için değişiklik yapma amacımıza uyum sağlayabilirler. Ve geliştirilebilir.

6.1.2. Pycharm

PyCharm, en popüler Python IDE'lerinden biridir. PyCharm, platformlar arası bir uygulama
olarak sağlanır ve Linux, macOS ve Windows platformlarıyla uyumludur. Bugün en yaygın
kullanılan Python IDE'lerinden biridir.

6.1.3. Linux(raspbian)
Linux (telaffuz: Lin-uks); bir bilgisayar işletim sisteminin en temel çekirdek
yazılımlarından biridir. GNU General Public License sürüm 2 altında yayınlanan ve Linux
Foundation koruması altında geliştirilen ücretsiz bir yazılım projesidir. Linux adı, 1991 yılında
ilk geliştiricisi Linus Torvalds tarafından seçildi. Günümüzde süper bilgisayar işletim
sistemlerinde kullanılan ekipmanlarda, akıllı cihazlarda ve internet altyapısında yaygın olarak
kullanılmaktadır. En popüler olanlardan biri Google tarafından geliştirilen Android işletim
sistemidir.
Ayrıca Linux adı, bu çekirdek ile oluşturulan işletim sistemlerini genel anlamda
tanımlamak için genel bir kısaltma olarak da kullanılır. Örneğin, Linux çekirdeği ve GNU
araçları birleştirildiğinde ve eksiksiz bir işletim sistemi olarak sunulduğunda, buna GNU/Linux
dağıtımı denir, ancak sıradan terimlerle basitçe Linux olarak adlandırılır.

32
Linux teriminin bu iki farklı kullanımından kaynaklanan karışıklığı önlemek için, Linux
çekirdeği makalesinde çekirdek yazılımı hakkında teknik bilgiler ve Linux dağıtım makalesinde
dağıtım hakkında bilgi verilmiştir.
6.1.4. Anaconda 3

Python; Python, Anaconda organizasyonu tarafından R programlama dili, veri bilimi ve


bilimsel araştırma ile uğraşan kişiler için geliştirilmiş bir önyükleyicidir. Geliştirilen on
yükleyici, kullanıcının işini büyük ölçüde kolaylaştırır. Kurulumdan sonra, veri işleme ve
raporlama dahil olmak üzere bu süreçlerle ilgili 100'den fazla kütüphaneye otomatik olarak
erişebilirsiniz.

Aynı zamanda, conda yükleyicisi sayesinde 600'den fazla kitaplık kolayca kurulabilir.
6 milyondan fazla kullanıcısı olan açık kaynaklı Anaconda dağıtımı, Python veri bilimi ve
makine öğrenimi yapmanın en kolay yoludur. Windows, Linux ve MacOS için 250'den fazla
popüler veri bilimi kitaplığı ve sanal ortam yöneticisi içerir. Conda, Scikit-learn, TensorFlow ve
SciPy gibi karmaşık veri bilimi ve makine öğrenimi ortamlarını hızlı ve kolay bir şekilde
kurabilir, çalıştırabilir ve yükseltebilir. Anaconda (Python) bootloader'ı ana bilgisayarımızda
kullanmayı tercih ediyoruz çünkü ihtiyacımız olan kütüphaneleri Python programlama dilinde
tek tek yüklemekle zaman kaybediyor.

6.1.5. TensorFlow

TensorFlow, Google tarafından 2015 yılında piyasaya sürülen ve geliştiricilerin derin


öğrenme modelleri tasarlamasını, üretmesini ve eğitmesini kolaylaştırmayı amaçlayan açık
kaynaklı bir yazılım kitaplığıdır. TensorFlow, Google geliştiricileri tarafından dahili modeller
oluşturmak için kullanılan dahili bir kitaplıktan kaynaklanmıştır ve bir açık kaynak sürümü
vardır. TensorFlow, geliştiricilere sunulan çeşitli seçeneklerden yalnızca biri olmasına rağmen,
düşünceli tasarımı ve kullanım kolaylığı nedeniyle tercih edilmektedir.

TensorFlow, kullanıcıların rastgele hesaplamaları veri akışı grafikleri olarak ifade


etmelerini sağlayan üst düzey bir Python kitaplığıdır. Grafikteki düğümler matematiksel
işlemleri temsil eder ve kenarlar bir düğümden diğerine iletilen verileri temsil eder.
TensorFlow'daki veriler, çok boyutlu bir dizi olan bir tensör olarak temsil edilir. Bu bilgi işlem
çerçevesi birçok farklı alanda değerli olsa da, TensorFlow esas olarak uygulama ve
araştırmalarda derin öğrenme için kullanılır. Geliştirme için TensorFlow'u kullanmak için
Python sürümümüzün 3.5.x veya üstü olması gerekir. Kurulumu pip install komutu ile yapılır.

33
Hepimizin bildiği gibi bu kütüphaneler GPU için de uygundur, NVIDIA marka GPU
kullanıyorsanız GPU sürümünü yüklemeniz gerekir. Kurulum komutu aşağıda gösterilmiştir.

CPU Sürümü için;

pip3 install --upgrade tensorflow

GPU Sürümü;

pip3 install --upgrade tensorflow-gpu

TensorFlow, doğrudan Linux, MACOS ve Windows üzerine kurulabilir. TensorFlow'un


en temel özelliği, büyük veri kümelerinde YSA'nın hızlı iletimini gerçekleştirebilen çok
katmanlı bir düğüm sistemidir. Bu sayede Google'ın ses, nesne tanıma ve daha birçok işlevi
güçlendirilmiştir. Alternatifleri Caffe, Torch, Keras, Theano, deeplearning4j vb.'dir.
Kütüphanedir.

6.1.7. OpenCV

OpenCV (Open Source Computer Vision), açık kaynaklı bir görüntü işleme kitaplığıdır.
1999 yılında Intel tarafından geliştirildi ve daha sonra Itseez, Willow, Nvidia, AMD, Google
gibi şirket ve toplulukların desteğiyle geliştirme süreci devam ediyor. İlk sürüm olan OpenCV
alpha 2000 yılında piyasaya sürüldü.

İlk başta C dilinde geliştirildi ve daha sonra C++ dilinde birçok algoritma geliştirildi.
BSD lisansı altında geliştirilmiş açık kaynak kodlu bir kütüphanedir. BSD lisansına sahip olmak,
bu kütüphaneyi istediğiniz herhangi bir projede ücretsiz olarak kullanabileceğiniz anlamına
gelir. OpenCV, platformdan bağımsız bir kütüphanedir, bu nedenle Windows, Linux, FreeBSD,
Android, Mac OS ve iOS platformlarında çalışabilir. OpenCV uygulamaları, C++, C, Python,
Java, Matlab, EmguCV kütüphaneleri, Visual Basic.Net, C# ve Visual C++ dilleri ve topluluk
tarafından geliştirilen farklı sarmalayıcılar aracılığıyla Perl ve Ruby programlama dilleri
kullanılarak kolaylıkla geliştirilebilir.

34
Şekil 6.1:Yıllara Göre OpenCV

Alternatif Görüntü İşleme Kütüphaneleri: Görüntü işleme projesinde kullanılacak


kütüphaneyi amacınıza göre seçmeniz çok önemlidir. Bu seçimi yaparken ne yapmak
istediğinize karar vermelisiniz.Örneğin bir kameradan (usb,ip vb.) görüntü almak için projenize
OpenCV entegre etmenize gerek olmayabilir. Bu durum ve OpenCV'nin neden iyi olduğunu
anlamak için alternatif olarak bir görüntü işleme kitaplığına bakalım.

MATLAB: Matlab'ı bir görüntü işleme kütüphanesi olarak adlandırmak yanlıştır, ancak görüntü
işlemenin temel algoritmalarını içerir ve dördüncü nesil çok amaçlı bir programlama dilidir.
Akademik araştırmanızda, performansın önemli olmadığı durumlarda, temel görüntü işleme için
seçebilir veya Matlab'ı kullanarak uygulamaları geliştirmek için OpenCV kitaplığı ile etkileşim
kurulur.

Halcon: Çeşitli programlama dillerinin (C, C++, VS C++, C#, VB.NET) kütüphaneleri ve kendi
geliştirme ortamı ile makine vizyonuna yönelik endüstriyel projeler için tercih edilen ticari
yazılımdır. Uygulamaların hızlı bir şekilde geliştirilebilmesi için birçok hazır fonksiyon içerir.
OpenCV, bilgisayar vizyonuna odaklanan açık kaynaklı, ücretsiz bir kütüphanedir. Halcon'dan
bu açılardan farklıdır.

OpenFrameworks:Açık kaynak kitaplık olarak geliştirilen bu proje, C++ programlama dili için
geliştirilmiş olup OS X, Linux, Embedded Linux (ARM), iOS ve Android platformlarında
çalışabilmektedir. OpenCV kütüphanesinin birçok algoritmasını kullanır ve temel amacı,
uygulamaları kolay ve hızlı bir şekilde geliştirmektir. Örneğin OpenCV kullanarak 1t'lik bir işi
2t'de tamamlayabilirsiniz.Temel nedeni, birçok işlevi (nesne algılama, takip renk belirleme,
karşılaştırma vb.) sayesinde standartlaştırılmış işleri tek bir satırda gerçekleştirebilmesidir.

CIMG: Açık kaynaklı bir görüntü işleme kütüphanesidir. Windows, Linux ve OS X platformları
için uygundur. Yalnızca C++ dilini destekler, ancak bir sarmalayıcı yazarak, uygulamalar

35
geliştirmek için Java ve Python'u da kullanabilirsiniz. Birçok algoritma içerir ancak OpenCV'nin
performansına ve kapsamlı algoritma altyapısına sahip değildir.

Fiji: Java platformu için geliştirilmiş açık kaynak kodlu GPL lisanslı görüntü işleme kitaplığıdır.
Windows, Linux ve MAC OSX Intel 32-bit veya 64-bit üzerinde çalışır. Bilimsel görüntü analizi
için geliştirilmiştir. Genetik, hücre biyolojisi, sinirbilim ve diğer alanlar için özelleştirilmiş
algoritmalar mevcuttur.

OpenCV İçin Platform Ve Geliştirme Ortamı Seçimi

Birçok OpenCV türü, doğrudan grafik kartı sürücülerini kullanır. Grafik sürücüsü
platforma göre değişir. Örneğin OpenCV 3.x sürümü, Windows işletim sisteminde Nvidia
ekran kartı kullanan bazı sistemlerde mavi ekran denen bir hataya neden olacaktır. Bu hata,
grafik kartını kullanan sınıfın belirli işlevleri çalıştırıldığında ortaya çıkıyor.OpenCV Soru-
Cevap web sitesinde birçok kişinin bu sorundan şikayet ettiğini görebilirsiniz. Şu ana kadar
Linux ve Mac platformlarında böyle bir hata oluşmadı.

Gömülü sistemler arasında Raspberry Pi, OrangePi, Beaglebone, Banana Pi vb.


bulunur. Karttaki işletim sistemini seçme konusunda daha önceki tecrübelerime dayanarak
Debian Linux fork işletim sisteminin daha verimli olduğu söylenir.

Bu kitaptaki uygulamalar Java programlama dilinin koruması altında Eclipse,


Netbeans ve Android Studio kullanılarak geliştirilmiştir. Java öğrenmeye yeni başlıyorsanız,
bu öneriler tam size göre. Grafik kullanıcı arayüzü (GUI) ile etkileşimli uygulamalar
geliştirmek istiyorsanız Netbeans IDE kullanabilirsiniz. Hızlı kod geliştirme ve grafiksel
olmayan uygulamalar için Eclipse IDE'yi tercih edebilirsiniz. Acemi iseniz, Eclipse IDE ve
Netbeans'i kullanabilirsiniz. Bu kitaptaki mobil Android uygulama örnekleri Android Studio
kullanılarak geliştirilmiştir. OpenCV'nin nasıl kurulacağını ve tüm geliştirme ortamları için
nasıl kurulacağını açıklayacaktır.

6.1.8. NumPy
Bilimsel temelli hesaplamalar yapmak için Python'u kullanabilen bir kütüphanedir.
NumPy'yi kullanarak diziler ve matrisler üzerindeki işlemleri kolayca tamamlamak için Python
dilini kullanabilirsiniz. Ayrıca kütüphanenin bir özelliği olarak, kütüphanenin kendisine özgü
fonksiyonlar (Fourier dönüşümü, lineer cebir işlemleri, tek tip rasgele sayı dağılımı, düzgün
olmayan sayı dağılımı vb.) dahil olmak üzere N boyutlu dizi nesneleri üzerinde çalışabilir, ve
C/C++ ve Fortran kod entegrasyonu, çalışabilen bir kütüphanedir.

36
6.1.9. Pygame

RPI kullanıcıları tarafından bağlı oldukları bilgisayardaki klavyeye erişmek için


kullanılır ve otonom araçların pistte eğitimleri sırasında klavye üzerinden manuel kullanıma
olanak tanır.

6.2.0. Pillow-Python Image Images


Python'da fotoğraf dosyalarını oynatmak için tercih edilen modüldür. Kullanımı son
derece basittir, belgelerinin anlaşılması diğerlerinden daha kolaydır ve topluluk olarak daha
büyük bir topluluğa sahiptir.
6.2.1. Picamera

CSI aracılığıyla PiCamera'nın kontrolünü sağlayın. Bu kütüphane sayesinde RPi


üzerinde kullandığımız kamera ayarlarına erişim ve değiştirme imkanı sağlamaktadır.

7. MLP(AUTO)TRAİNİNG

Uygulama aşamamızda RPi ve host bilgisayara gerekli programlar yüklenip kodu


iletildikten sonra direksiyon dönüş açısı ve gaz tepkisi kalibre ve ayarı yapılır, otopilot için
yörünge bilgisi eğitimi, manuel otomatik sürüş eğitimi ve eğitim dosyası iletim Ana bilgisayara
aktarılan ve Python üzerinde Tensorflow kullanılarak veri dosyasının görüntü işleme süreci,
eğitimli otopilot görüntü dosyası RPi'ye aktarılır ve parkuru kontrol etmek için RC sürücüsüz
arabanın Python üzerindeki davranışı şekil 7.1 de görüldüğü gibidir.

37
Şekil 7.1:MLP training

(İlgili kodlar EK3.’dedir)

38
Şekil7.2: Npz dosyası

7.1. Otopilot Eğitim

İlk önce araca komut göndermek için arduino bağlantımız olan, kamera yayını (stream) yapan ve
her yön tuşlarına bastığımda kameranın görüntüsünde bastığımız tuşu eşleştiren ve eğitim boyunca
yaklaşık 70 fotoğraf çeken bir program kullanılmıştır. Bu programın çıktısı olan komut başı
fotoğraflardan oluşan .npz uzantılı dosyalarını yapay zekayı beslemekte kullanıldı. (İlgili kod
EK4.’dedir.)

Oluşturduğumuz dosyaların isimlerini belirtmek için aşağıda belirtildiği üzere şekil 7.1’de
gösterilmiştir

39
Şekil7.3: Dosyaların kayıt edildiği yer

Oluşturduğumuz .xml dosyasını test etmek için sürüş programına atadıktan sonra eğitilmiş
dosyasını arduino ve raspberry pi vasıtasıyla aracımızı iki çizgi arasında kalmasını sağlanmıştır.

Düz yolda ileri, virajlarda sağa ileri ve sola ileri olmak üzere 3 komut ile yolu ortalamaya
çalışacak. Yoldan çıkması durumunda kamera açısında ise tekrar iki çizgi arasına girecektir.

Şekil7.4: Eğitim Aşaması

40
Şekil7.5: Otonom sürüşte eğitilen yapay zekanın arduino komut göndermesi

7.2. Kaskat Sınıflandırıcı


Haarcascade sınıflandırıcıyı opencv kütüphanesinde bulabilirsiniz; bu sorunu çözmek
için Paul Viola ve Michael Jones tarafından oluşturulmuştur. Ayrıca Viola ve Jones nesne
algılama çerçevesi olarak da bilinir. En temel anlamda, önce belirli bir algoritmaya göre
bulmak istediğiniz nesneyi bilgisayara tanıtın ve ardından nesneyi bulmaya çalışmak için
benzer şekillere sahip resim veya video karelerinin içi taranır.

41
Şekil 7.6. kaskat sınıflandırıcı kodu

42
KAYNAKÇA
1) Gürtaş, S. (2020). Otonom araç sürüş destek sistemleri ve yapay zeka uygulamaları.
Yayınlanmamış yüksek lisans tezi. Bursa Uludağ Üniversitesi Fen Bilimleri Enstitüsü.

2)Hobday, Simon., (20.09.2015), Driverless cars: applying existing laws to innovative

technologies won’t work,

3)Thierer, Adam., Hagemann, Ryan., (20.09.2015), Removing Roadblocks to Intelligent

Vehicles and Driverless Cars,

4)Dr.YETİM S. , (27.11.2015) , Sürücüsüz Araçlar Ve Getirdiği / Getireceği Hukuki Sorunlar

5)Godsmark, Paul., Sniman, Gabriel., (20.09.2015), Driving The Market,

Mission Critical, Volume:3, No:2, May 2013 p.20

6)Gillmor, Dan., (20.09.2015), Google’s Driverless Cars Are A Boon For Safety And

Climate, But Not For Privacy

7)Harris, Mark., (20.09.2015), FBI Warns Driverless Cars Could Be Used As

‘Lethal Weapons’

8)Winfield, Alan., (20.09.2015), The Next Big Thing(s) In Robotics, p.41

9)GÜRTAŞ S., (28.01.2020) , OTONOM ARAÇ SÜRÜŞ DESTEK SİSTEMLERİ VE YAPAY


ZEKA UYGULAMALARI p.3

10) Gökaşar, I., & Dündar, S. Sürücüsüz taşıtların trafik akım hızına etkisinin yapay sinir ağları
ile incelenmesi. Akıllı Ulaşım Sistemleri ve Uygulamaları Dergisi, 1(2), 59-75.

11)González, D., Pérez, J., Milanés, V., & Nashashibi, F. (2016). A Review of Motion Planning

Techniques for Automated Vehicles. IEEE Trans. Intelligent Transportation Systems, 17(4),

1135-1145.

12)Chung, S.-Y., & Huang, H.-P. (2011). Robot motion planning in dynamic uncertain

environments. Advanced Robotics, 25(6-7), 849-870.

13)Du Toit, N. E., & Burdick, J. W. (2012). Robot motion planning in dynamic, uncertain

43
environments. IEEE Transactions on Robotics, 28(1), 101-115.

14)Shladover, S. E., Desoer, C. A., Hedrick, J. K., Tomizuka, M., Walrand, J., Zhang, W.-B.,

McKeown, N. (1991). Automated vehicle control developments in the PATH program. IEEE

Transactions on vehicular technology, 40(1), 114-130.

15)Behringer, R., & Muller, N. (1998). Autonomous road vehicle guidance from autobahnen to

narrow curves. IEEE Transactions on Robotics and Automation, 14(5), 810-815.

16)Noto, M., & Sato, H. (2000). A method for the shortest path search by extended Dijkstra

algorithm. IEEE International Conference on Systems, Man, and Cybernetics, 2000.

17)Anderson, S. J., Karumanchi, S. B., & Iagnemma, K. (2012). Constraint-based planning and

control for safe, semi-autonomous operation of vehicles. Intelligent Vehicles Symposium

(IV), IEEE.

18)Berber, E., (2008), “Mikrodenetleyicili Endüstriyel Otomatik Sıcaklık

Ölçüm ve Kontrol Sistemi”, Yüksek Lisans Tezi, Yıldız Teknik Üniversitesi, Fen Bilimleri
Enstitüsü, İstanbul.

19)ÖZCAN F.Ö, YÜCE A. , TAN N. , (24.08.2018), LabVIEW ve Raspberry Pi 3 Kullanarak


Gerçek Zamanlı Sıcaklık

Ölçüm Sistemi İnöünü Üniversitesi, Mühendislik Fakültesi, Elektrik-Elektronik Mühendisliği


Bölümü, Malatya, Türkiye

20)KIYICI İ., (09.01.2020), AKILLI, OTONOM VE KORUMALI PRİZ , T.C. PAMUKKALE


ÜNİVERSİTESİ FEN BİLİMLERİ ENSTİTÜSÜ ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ
ANABİLİM DALI

21)Yrd.Doç.Dr. Aybars Uğur, Kınacı A. , (23.12.2006) , Yapay Zeka Teknikleri ve Yapay Sinir
Ağları Kullanılarak Web Sayfalarının Sınıflandırılması TOBB Ekonomi ve Teknoloji
Üniversitesi, Ankara

22) . Bilgin, S., (2008) “Kalp Hızı Değişkenliğinin Dalgacık Dönüşümü ve Yapay Sinir Ağları
Kullanılarak Analizi”, Doktara Tezi, Sakarya Üniversitesi Fen Bilimleri Enstitüsü, Sakarya.

44
23) Kohonen T., (1987), ‘State Of The Art In Neural Computing’, IEEE First International
Conference on Neural Networks, 1, 79-90.
24) Gülbağ, A., (2006). “Yapay Sinir Ağı ve Bulanık Mantık Tabanlı Algoritmalar ile Uçucu
Organik Bileşiklerin Miktarsal Tayini”, Doktora Tezi, Sakarya Üniversitesi Fen Bilimleri
Enstitüsü, Sakarya.
25)ÖZDEN O.B. Özel Amaçlı Elektrikli Bir Kara Aracının Tasarımı ve Prototipinin Geliştirilmesi,
Afyon Kocatepe Üniversitesi Fen Bilimleri Enstitüsü, 2018

45
EKLER
EK1.
int forward_pin = 6;
int reverse_pin = 7;
int left_pin = 8;
int right_pin = 9;

// Initial command
int command = 0;

// PPWM Durations (in ms)


int on_time = 30;
int off_time = 70;

void setup() {
// Set pins to OUTPUT mode
pinMode(forward_pin, OUTPUT);
pinMode(reverse_pin, OUTPUT);
pinMode(left_pin, OUTPUT);
pinMode(right_pin, OUTPUT);

Serial.begin(115200);
}

void loop() {
if (Serial.available() > 0)
{
command = Serial.read();
}
else
{
reset();
}

46
drive(command);
}

void reset()
{
digitalWrite(forward_pin, HIGH);
digitalWrite(reverse_pin, HIGH);
digitalWrite(left_pin, HIGH);
digitalWrite(right_pin, HIGH);
}

// alternatively try 40/60, 250/500


void forward(int complex)
{
if(complex == 0)
{
digitalWrite(reverse_pin, HIGH);
digitalWrite(left_pin, HIGH);
digitalWrite(right_pin, HIGH);
}

digitalWrite(forward_pin, LOW);
delay(on_time);
}

// alternatively try: 50/50


void reverse(int complex)
{
if(complex == 0)
{
digitalWrite(forward_pin, HIGH);
digitalWrite(left_pin, HIGH);
digitalWrite(right_pin, HIGH);

47
}

digitalWrite(reverse_pin, LOW);
delay(on_time);
}

void left()
{
digitalWrite(forward_pin, HIGH);
digitalWrite(reverse_pin, HIGH);
digitalWrite(left_pin, LOW);
digitalWrite(right_pin, HIGH);
delay(on_time);
}

void right()
{
digitalWrite(forward_pin, HIGH);
digitalWrite(reverse_pin, HIGH);
digitalWrite(left_pin, HIGH);
digitalWrite(right_pin, LOW);
delay(on_time);
}

void forward_right()
{
digitalWrite(reverse_pin, HIGH);
digitalWrite(left_pin, HIGH);
digitalWrite(right_pin, LOW);
forward(1);
}

void forward_left()

48
{
digitalWrite(reverse_pin, HIGH);
digitalWrite(left_pin, LOW);
digitalWrite(right_pin, HIGH);
forward(1);
}

void reverse_right()
{
digitalWrite(reverse_pin, HIGH);
digitalWrite(left_pin, HIGH);
digitalWrite(right_pin, LOW);
reverse(1);
}

void reverse_left()
{
digitalWrite(reverse_pin, HIGH);
digitalWrite(left_pin, LOW);
digitalWrite(right_pin, HIGH);
reverse(1);
}

void drive(int command)


{
switch(command)
{
case 48: reset(); break;
case 49: forward(0); break;
case 50: reverse(0); break;
case 51: right(); break;
case 52: left(); break;
case 53: forward_right(); break;
case 54: forward_left(); break;

49
case 55: reverse_right(); break;
case 56: reverse_left(); break;
default: break;
}
}

EK2.

# termination criteria
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30,
0.001)

# 6x9 chess board, prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
object_point = np.zeros((6*9, 3), np.float32)
object_point[:, :2] = np.mgrid[0:9, 0:6].T.reshape(-1, 2)

# 3d point in real world space


object_points = []
# 2d points in image plane
image_points = []
h, w = 0, 0

images = glob.glob('chess_board/*.jpg')

for file_name in images:


image = cv2.imread(file_name)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
h, w = gray.shape[:2]

# find chess board corners


ret, corners = cv2.findChessboardCorners(gray, (9, 6), None)

# add object points, image points


if ret:
object_points.append(object_point)
cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
image_points.append(corners)

# draw and display the corners


cv2.drawChessboardCorners(image, (9, 6), corners, ret)
cv2.imshow('image', image)
cv2.waitKey(500)

# calibration

50
retval, cameraMatrix, distCoeffs, rvecs, tvecs = cv2.calibrateCamera(object_points,
image_points, (w, h), None, None)

print("camera matrix:\n", cameraMatrix)

# pi camera intrinsic parameters


ay = cameraMatrix[1, 1]
u0 = cameraMatrix[0, 2]
v0 = cameraMatrix[1, 2]
print("Ay:", ay)
print("u0:", u0)
print("v0:", v0)

cv2.destroyAllWindows()
EK3.

import cv2
import glob
import numpy as np
from sklearn.model_selection import train_test_split
import sys
import time

def retrieve_data_set():

start_time = cv2.getTickCount()

print("Veri seti yükleniyor..")

image_array = np.zeros((1, 38400), 'float')


label_array = np.zeros((1, 4), 'float')

# veri çekme
data_set = glob.glob("data_set/*.npz")

if not data_set:
print("Yeterince eğitim verisi yok!!")
sys.exit()

for single_npz in data_set:


with np.load(single_npz) as data:
temp_images = data["images"]
temp_labels = data["labels"]

51
image_array = np.vstack((image_array, temp_images))
label_array = np.vstack((label_array, temp_labels))

X = np.float32(image_array[1:, :])
Y = np.float32(label_array[1:, :])
print("Görüntü dizisi: {0}".format(X.shape))
print("Görüntü biçimi: {0}".format(Y.shape))

end_time = cv2.getTickCount()
print("Veri seti süresi: {0}"
.format((end_time - start_time) // cv2.getTickFrequency()))

return X, Y

if __name__ == '__main__':
X, Y = retrieve_data_set()

train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.2)

# MLP modeli oluşturma ve trainleme


start_time = cv2.getTickCount()

layer_sizes = np.int32([38400, 32, 4])


model = cv2.ml.ANN_MLP_create()
model.setLayerSizes(layer_sizes)
model.setTrainMethod(cv2.ml.ANN_MLP_BACKPROP)
model.setBackpropMomentumScale(0.0)
model.setBackpropWeightScale(0.001)
model.setTermCriteria((cv2.TERM_CRITERIA_COUNT |
cv2.TERM_CRITERIA_EPS, 500, 0.0001))
model.setActivationFunction(cv2.ml.ANN_MLP_SIGMOID_SYM, 2, 1)

print("MLP eğitiliyor")
model.train(train_X, cv2.ml.ROW_SAMPLE, train_Y)

end_time = cv2.getTickCount()
duration = (end_time - start_time) // cv2.getTickFrequency()
print("Eğitim süresi: {0}".format(duration))

# Eğitim hata payı


ret_train, resp_train = model.predict(train_X)
train_mean_sq_error = ((resp_train - train_Y) * (resp_train - train_Y)).mean()
print("Eğitim hata payı: {0:.2f}".format(train_mean_sq_error * 100))

# Hata payları
52
ret_test, resp_test = model.predict(test_X)
test_mean_sq_error = ((resp_test - test_Y) * (resp_test - test_Y)).mean()
print("Veri toplama hata payı: {0:.2f}".format(test_mean_sq_error * 100))

model.save("mlp_xml/mlp_{0}.xml".format(str(int(time.time()))))

import cv2
import numpy as np
import socket
import struct
import pygame
from pygame.locals import *
from Bitirme.Test.utils import server_address
import time
import os
import sys
import serial

class CollectData(object):
def __init__(self):
# Arudino komutlarını alıcak soket port açmamız gerekiyor
self.sock = socket.socket()
self.sock.bind(server_address)
self.sock.listen(1)

self.connection = self.sock.accept()[0].makefile('rb')

# Connect to the serial port


try:
self.ser = serial.Serial('COM3', 115200, timeout=1 )
except IOError as e:
print(e)
sys.exit()

self.ser.flush()
self.send_instr = True

self.k = np.zeros((4,4), 'float')


for i in range(4):
self.k[i,i] = 1

53
# Girdilerin algılanacağı pygame ekranı
pygame.init()
pygame.display.set_mode((400, 300))

self.collect_images()

def collect_images(self):
saved_frames = 0
total_frames = 0
start_time = cv2.getTickCount()

print('Veri toplanıyor..')
image_array = np.zeros((1, 38400), 'float')
label_array = np.zeros((1, 4), 'float')

# Fotoğraf çekme
try:
frame = 1
complex_cmd = False

while self.send_instr:
# Get frame
image_len = struct.unpack('<L', self.connection.read(struct.calcsize('<L')))[0]
if not image_len:
break

recv_bytes = b''
recv_bytes += self.connection.read(image_len)
image = cv2.imdecode(np.frombuffer(recv_bytes, dtype=np.uint8),
cv2.IMREAD_GRAYSCALE)

# save image
# cv2.imwrite('collected_images/frame{:>05}.jpg'.format(frame), image)

# Show the frame


cv2.imshow('Video', image)

# get ROI- lower half of the image (height, width, channel= no channel for
greyscale)

roi = image[120:240, :]
cv2.imshow('Video', roi)

# Fotoğraflar tek bir sütun olacak şekilde ayarlanır


temp_array = roi.reshape(1, 38400).astype(np.float32)

frame += 1
54
total_frames += 1

# Get driver input


for event in pygame.event.get():
if event.type == KEYDOWN or complex_cmd:
key = pygame.key.get_pressed()
complex_cmd = False
# only save the images where there is user action
cv2.imwrite('collected_images/frame{:>05}.jpg'.format(frame), image)

if key[pygame.K_UP] and key[pygame.K_RIGHT]:


print("Forward Right")
complex_cmd = True
self.ser.write(b'5')
image_array = np.vstack((image_array, temp_array))
label_array = np.vstack((label_array, self.k[1]))
saved_frames += 1

elif key[pygame.K_UP] and key[pygame.K_LEFT]:


print("Forward Left")
complex_cmd = True
self.ser.write(b'6')
image_array = np.vstack((image_array, temp_array))
label_array = np.vstack((label_array, self.k[0]))
saved_frames += 1

elif key[pygame.K_DOWN] and key[pygame.K_RIGHT]:


print("Reverse Right")
complex_cmd = True
self.ser.write(b'7')

elif key[pygame.K_DOWN] and key[pygame.K_LEFT]:


print("Reverse Left")
complex_cmd = True
self.ser.write(b'8')

elif key[pygame.K_UP]:
print("Forward")
# self.ser.write(b'0')
self.ser.write(b'1')
image_array = np.vstack((image_array, temp_array))
label_array = np.vstack((label_array, self.k[2]))
saved_frames += 1

elif key[pygame.K_DOWN]:
print("Reverse")
# self.ser.write(b'0')
55
self.ser.write(b'2')
image_array = np.vstack((image_array, temp_array))
label_array = np.vstack((label_array, self.k[3]))
saved_frames += 1
print("Reverse")

elif key[pygame.K_RIGHT]:
print("Right")
# self.ser.write(b'0')
self.ser.write(b'3')
image_array = np.vstack((image_array, temp_array))
label_array = np.vstack((label_array, self.k[1]))
saved_frames += 1

elif key[pygame.K_LEFT]:
print("Left")
# self.ser.write(b'0')
self.ser.write(b'4')
image_array = np.vstack((image_array, temp_array))
label_array = np.vstack((label_array, self.k[0]))
saved_frames += 1

elif key[pygame.K_x] or key[pygame.K_q]:


print("Exit")
self.ser.write(b'0')
self.send_instr = False
break

else:
self.ser.write(b'0')

elif event.type == KEYUP:


complex_cmd = False
self.ser.write(b'0')

# Save images and labels


image_array = image_array[1:, :]
label_array = label_array[1:, :]

file_name = str(int(time.time()))
directory = "data_set"
if not os.path.exists(directory):
os.makedirs(directory)

try:
np.savez(directory + '/' + file_name + '.npz', images=image_array,
labels=label_array)
56
except IOError as e:
print(e)

# Print meta data


end_time = cv2.getTickCount()
duration = end_time - start_time // cv2.getTickFrequency()
print("Streaming duration: {0}".format(duration))
print(image_array.shape)
print(label_array.shape)
print("Total frames: {0}".format(total_frames))
print("Saved frames: {0}".format(saved_frames))
print("Dropped frames: {0}".format(total_frames - saved_frames))

finally:
self.connection.close()
self.sock.close()

if __name__ == '__main__':
CollectData()

EK4.

import cv2
import math
import numpy as np
import threading
import socketserver

import serial
import struct

# Mesafe sensörü
sensor_data = None

class SensorStreamHandler(socketserver.BaseRequestHandler):
data = " "

def handle(self):
global sensor_data
try:
while self.data:
self.data = self.request.recv(1024)
sensor_data = round(float(self.data), 1)
print(f"Dist: {sensor_data}")
finally:
57
print("Connection closed on sensor server thread!")

class NeuralNetwork():
def __init__(self):
self.model = cv2.ml.ANN_MLP_load('mlp_xml/mlp_1611963015.xml')

def predict(self, samples):


ret, resp = self.model.predict(samples)
return resp.argmax(-1)

class RCControl(object):
def __init__(self):
self.ser = serial.Serial('COM3', 115200, timeout=1)

def steer(self, prediction):


if prediction == 0:
self.ser.write(b'6')
print("Sol ileri")

elif prediction == 1:
self.ser.write(b'5')
print("Sağ ileri")

elif prediction == 2:
self.ser.write(b'1')
print("İleri")

else:
self.stop()

def stop(self):
self.ser.write(b'0')

class ObjectDetection(object):
def __init__(self):
self.red_light = False
self.green_light = False

def detect(self, classifier, image, gray):


# Kameradan mesafe algılama için gerekli parametreler

v=0

# Işık yoğunluğu değerleri ve Trafik ışığı algılama


58
threshold = 150

# Cisim algılama
objects = classifier.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5,
minSize=(30, 30))

# Cisimlerin etrafını çizme


for (x, y, w, h) in objects:
cv2.rectangle(image, (x + 5, y + 5), (x + w - 5, y + h - 5), (255, 255, 255), 2)
v=y+h-5

#print(f"width/height is: {w/h}")


# Stop sign
if w / h == 1:
cv2.putText(image, 'DUR TABELASI', (x, y - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)

# Trafik ışığı
else:
roi = gray[y + 10: y + h - 10, x + 10: x + w - 10]

# Işık yoğunluğunu algılamak için Gauss filtresi uygulama

mask = cv2.GaussianBlur(roi, (25, 25), 0)


(minVal, maxVal, minLoc, maxLoc) = cv2.minMaxLoc(mask)

# Işık yoğunluğuna bakarak trafik ışığını algılama


if maxVal - minVal > threshold:
cv2.circle(roi, maxLoc, 5, (255, 0, 0), 2)

# Kırmızı ışık
if 1.0 / 8 * (h - 30) < maxLoc[1] < 4.0 / 8 * (h - 30):
cv2.putText(image, 'Kırmızı', (x + 5, y + 5),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 255), 2)
self.red_light = True

# Yeşil ışık
if 5.5 / 8 * (h - 30) < maxLoc[1] < h - 30:
cv2.putText(image, 'Yeşil', (x + 5, y + 5),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 255), 2)
self.green_light = True

return v

class DistanceToCamera(object):
59
def __init__(self):
# Kamera kalibrasyon parametreleri (picamcalib)
self.alpha = 8.0 * math.pi / 180
self.v0 = 119.907788
self.ay = 332.213306

def calculate(self, v, h, x_shift, image):


"""Pi kamerasından cizmin yüksekliğini ve uzaklığını hesaplayan parametreler """
d = h / math.tan(self.alpha + math.atan((v - self.v0) / self.ay))

if d > 0:
cv2.putText(image, f"{d:.1f}cm", (image.shape[1] - x_shift, image.shape[0] - 20),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 255, 255), 2)
#cv2.imshow('video', image)
return d

class VideoStreamHandler(socketserver.StreamRequestHandler):
# Cisim tanımak için gerekli Cascade Classifiers (haar cascade filters)
stop_classifier = cv2.CascadeClassifier('cascade_classifiers/stop.xml')
light_classifier = cv2.CascadeClassifier('cascade_classifiers/traffic_light.xml')

# Cisim tanıma örneği


obj_detection = ObjectDetection()

# Cisimlerin kameraya tahmini uzaklığı


dist_to_camera = DistanceToCamera()
h_stop = 4.5 # cm
h_light = 4.5 # cm
d_stop = 35
d_light = 35
stop_start = 0
stop_finish = 0
stop_time = 0

# Yapay sinir ağı oluşturma


model = NeuralNetwork()
drive_time_after_stop = 0
car = RCControl()

def handle(self):
global sensor_data
stop_sign_active = True
stop_flag = False

# drive_time_after_stop = 0

60
# Elde edilen video kareleri harekete karar vermesi için incelenir
try:
while True:
image_len = struct.unpack('<L', self.rfile.read(struct.calcsize('<L')))[0]
if not image_len:
break

recv_bytes = b''
recv_bytes += self.rfile.read(image_len)

gray = cv2.imdecode(np.frombuffer(recv_bytes, dtype=np.uint8),


cv2.IMREAD_GRAYSCALE)
image = cv2.imdecode(np.frombuffer(recv_bytes, dtype=np.uint8),
cv2.IMREAD_COLOR)

# Kameranın saadece yol kısmını görmesi için istediğimiz alanı roı değerleri ile
ayarlarız
roi = gray[120:240, :]
cv2.imshow('Video', roi)
# Reshape ROI
image_array = roi.reshape(1, 38400).astype(np.float32)

# Cisim algılama
v_stop = self.obj_detection.detect(self.stop_classifier, image, gray)
v_light = self.obj_detection.detect(self.light_classifier, image, gray)

# Mesafe hesabı
if v_stop > 0.0 or v_light > 0.0:
d_stop = self.dist_to_camera.calculate(v_stop, self.h_stop, 300, image)
d_light = self.dist_to_camera.calculate(v_light, self.h_light, 100, image)
self.d_stop = d_stop
self.d_light = d_light

# Yapay zekanın tahmin yapması için fonksiyon


prediction = self.model.predict(image_array)

# Durma ve çarpışma hesabı


if sensor_data and int(sensor_data) < 30.0:

self.car.stop()
print("Engel algiland,. Mesafe: {0:.1f}cm".format(sensor_data))

elif 0.0 < self.d_stop < 35 and stop_sign_active:


print('Dur tabelası algılandı, 5 saniye bekleniyor')
self.car.stop()

# 5 saniye dur
61
if stop_flag is False:
stop_start = cv2.getTickCount()
stop_flag = True

stop_finish = cv2.getTickCount()
stop_time = (stop_finish - stop_start) / cv2.getTickFrequency()
print(f"Bekleme süresi: {stop_time}")

# 5 saniye sonra harekete geçme


if stop_time > 5:
stop_flag = False
stop_sign_active = False
print("Kalkış")

elif 0.0 < self.d_light < 35.0:


if self.obj_detection.red_light:
print("Kırmızı Işık")
self.car.stop()
elif self.obj_detection.green_light:
print("Green light")
pass

self.obj_detection.red_light = False
self.obj_detection.green_light = False
self.d_light = 35.0

else:
self.car.steer(prediction)
self.d_stop = 35.0
stop_start = cv2.getTickCount()

if stop_sign_active is False:
drive_time_after_stop = (stop_start - stop_finish) /
cv2.getTickFrequency()
if drive_time_after_stop > 5:
stop_sign_active = True
cv2.imshow('video', image)

if (cv2.waitKey(5) & 0xFF) == ord('q'):


cv2.destroyAllWindows()
break

finally:
self.car.stop()
print("Eyvah!! bir şeyler ters gitti adamım!!!!")

62
class ThreadServer():
def server_video_thread(host, port):
server = socketserver.TCPServer((host, port), VideoStreamHandler)
server.serve_forever()

def ultrasonic_server_thread(self, port):


server = socketserver.TCPServer((self, port), SensorStreamHandler)
server.serve_forever()

ultrasonic_sensor_thread = threading.Thread(target=ultrasonic_server_thread,
args=('192.168.1.25', 8050))
#ultrasonic_sensor_thread.daemon = True
ultrasonic_sensor_thread.start()

video_thread = threading.Thread(target=server_video_thread, args=('192.168.1.25',


8000))
video_thread.start()

if __name__ == '__main__':
ThreadServer()

63
ÖZGEÇMİŞ
18 Haziran 1996 Yılında İstanbul/Avcılar da doğdum. İlkokul ve ortaokulu Abdulkadir Öztürk
İlk Öğretim Okulunda okudum. Liseyi Avcılar Teknik ve Endüstri Meslek Lisesinde okudum. Şu
an Namık Kemal Üniversitesi Çorlu Mühendislik Fakültesi Elektronik ve Haberleşme
Mühendisliği bölümünde devam etmekteyim.

64

You might also like