YAPAY ZEKAYI MİKRODENETLEYİCİYE SIĞDIRDIK! | STM32CUBE.AI — Transcript
Full transcript
- 0:00Bugüne kadar STM32 ile birçok farklı
- 0:02uygulama yaptık. Ama bu videoda
- 0:03alışılagelmiş projelerin dışına çıkıp
- 0:05sınırları biraz zorlayacağız. Genellikle
- 0:07yüksek işlem kapasitesine sahip
- 0:09sunucularda ya da ekran kartlarında
- 0:11çalıştırılan yapay zeka modelini
- 0:13STM32'nin kısıtlı RAM ve flash belleğine
- 0:15sığdırıp çalıştıracağız. Bunu ST
- 0:17firmasının STM32Cube AI uygulaması ile
- 0:19yapacağız. Ayrıca bir gömülü sistem
- 0:21mühendisi olarak yapay zekayı tüketen
- 0:23tarafta değil, onunla uçtan uca ürün
- 0:25geliştiren tarafta olmak beni gerçekten
- 0:27mutlu ediyor. Uzun zamandır aklımdaydı
- 0:29projeyi yapmak. Nihayet hayata
- 0:30geçiriyoruz. Hazırsanız başlayalım.
- 0:34>> [müzik]
- 0:37>> Bu videoda STM32 ve dokunmatik TFT ekran
- 0:40kullanarak tam anlamıyla bir uç birim
- 0:42yapay zeka, yani Edge AI uygulaması
- 0:45geliştireceğiz.
- 0:45>> [müzik]
- 0:45>> CNN tabanlı bir görüntü işleme modelini
- 0:48sadece 128 KB RAM ve 512 KB flash
- 0:52belleğe sahip STM32 üzerinde tamamen
- 0:54lokal olarak çalıştıracağız. Çalışmamız
- 0:56bir önceki projemizin devam niteliğinde.
- 0:58Hatırlarsanız önceki videoda STM32 ile
- 1:01TFT ekran kullanımını detaylıca ele
- 1:03almıştık. Şimdi ise bu sistemin üzerine
- 1:05yapay zeka katmanını ekleyeceğiz.
- 1:06İşlenen verileri harici bir sunucuya ya
- 1:09da güçlü bir bilgisayara
- 1:10göndermeyeceğiz. Tüm tahminleme süreci
- 1:12doğrudan STM32'nin kendi [müzik] kısıtlı
- 1:14kaynaklarıyla mikro denetleyicinin
- 1:16içinde gerçekleşecek. Uygulamamızın
- 1:18konsepti ise şöyle: Ekrana elimizle bir
- 1:20sayı çizeceğiz ve STM32'ye entegre
- 1:22ettiğimiz yapay zekanın bu sayıyı doğru
- 1:24tahmin etmesini isteyeceğiz. Tabii bu
- 1:26çalışma için öncelikle eğitilmiş bir
- 1:28yapay zeka modeline ihtiyacımız var.
- 1:30İşin bu kısmını alanında uzman yapay
- 1:32zeka mühendisi Ali anlatacak. Sözü
- 1:34Ali'ye bırakıyorum.
- 1:35>> Selamlar, ben Ali. Sektörde yapay zeka
- 1:37mühendisi olarak çalışıyorum. Bugün
- 1:38sizlere projemizin yapmış olduğum yapay
- 1:40zeka modülünden bahsedeceğim. Hemen
- 1:42başlayalım. Öncelikle kısaca yapay zeka
- 1:44nedir, nasıl çalışır anlatayım. Yapay
- 1:46zeka dediğimiz şey bilgisayarın insan
- 1:48gibi bilinç kazanması değil. Daha çok
- 1:49veriden anlamlı örüntüler çıkararak
- 1:51karar verebilmesidir. Yani bir sisteme
- 1:52yeterince örnek gösteriyoruz. Sistem bu
- 1:54örnekler arasındaki benzerlikleri
- 1:56öğreniyor ve daha önce görmediği yeni
- 1:57bir veri geldiğinde tahmin yapabiliyor.
- 1:59Klasik programlamada biz bilgisayarlara
- 2:01kuralları tek tek yazarız. Örneğin if
- 2:03else yapıları ile eğer şu olursa bunu
- 2:05yap deriz. Ama yapay zekada durum biraz
- 2:07farklı. Biz kuralları doğrudan yazmak
- 2:08yerine modele örnekleri veriyoruz. Model
- 2:10bu örneklerden kendi içerisinde bir
- 2:12ilişki kuruyor. Gördüğü örnekler
- 2:14sayesinde seçilen algoritmaya
- 2:15güncelleyerek en optimum haline
- 2:17ulaştırıyor. Örneğin binlerce el yazısı
- 2:18ile yazılmış rakamlar gösterdiğimizde
- 2:20model zamanla 3 rakamı genelde böyle
- 2:22kıvrılır, 1 rakamı genelde dik bir
- 2:24çizgidir gibi özellikleri öğrenmeye
- 2:25başlıyor. Yani [müzik] ona kural
- 2:27tanımlamıyoruz. Bu iş böyle yapılır, bu
- 2:29işe göre kuralları kendin yaz diyoruz.
- 2:30Başka bir [müzik] deyişle de balık
- 2:32vermiyor, balık tutmayı öğretiyoruz.
- 2:33Yapay zekanın geçmişi aslında oldukça
- 2:35eski. 1950'lerde Alan Turing'in
- 2:37makineler düşünebilir mi sorusuyla
- 2:39başlayan tartışmalar 1956'da Dartmouth
- 2:41konferansı ile yapay zekanın ayrı bir
- 2:43alan olarak ortaya çıkmasına kadar
- 2:45gidiyor. İlk dönemlerde sistem daha çok
- 2:46insanın yazdığı kurallarla çalışıyordu.
- 2:48Fakat zamanla kontrol etmemiz gereken
- 2:50durumların miktarı arttı. Milyonlarca
- 2:52durum içerisindeki milyarlarca vakanın
- 2:54her biri için if else yazamayız değil
- 2:55mi? Bu gelişmeleri takiben de veri
- 2:57miktarı arttı. Bilgisayarlar güçlendi.
- 2:59Özellikle GPU'lar ve büyük veri setleri
- 3:01sayesinde derin öğrenme dediğimiz
- 3:02yaklaşım çok daha başarılı hale geldi.
- 3:04Kısa tarihçeden sonra yapay zekanın
- 3:06nasıl geliştiğine de çok kısaca bakalım.
- 3:08İlk dönemlerde yapay zeka daha çok kural
- 3:09tabanlı sistemlerden oluşuyordu. Yani
- 3:11insan uzmanlar kuralları yazıyordu,
- 3:13sistem de bu kurallara göre kararları
- 3:15veriyordu. Mesela eğer sıcaklık şu
- 3:17derecenin üstündeyse alarm ver gibi.
- 3:18Daha sonra makine öğrenmesi yaklaşımı
- 3:20öne çıktı. Burada artık kuralları tek
- 3:21tek yazmak yerine modele veri setini
- 3:23veriyoruz ve model bu veriler arasındaki
- 3:25ilişkiyi öğreniyordu. En basit
- 3:27örneklerden biri klasik bir makine
- 3:28öğrenmesi algoritması olan lineer
- 3:30regresyon. Lineer regresyonda model
- 3:32veriler arasındaki ilişkiyi temsil eden
- 3:33en uygun doğruyu bulmaya çalışır.
- 3:35Grafikte bunu şöyle düşünebiliriz.
- 3:36Elimizde birçok nokta var ve model bu
- 3:38noktaların genel gidişatını en iyi
- 3:40temsil eden çizgiyi çizmeye çalışıyor.
- 3:42Yani mevcut durumlara göre kendi
- 3:43kurallarını kendi inşa ediyor. Amaç
- 3:45noktalarla doğru arasındaki hatanın
- 3:46mümkün olduğunca küçük olmasıdır. Mesela
- 3:48evin metrekaresi arttıkça fiyat nasıl
- 3:50değişiyor gibi sayısal tahminler bu
- 3:52algoritmayla yapılabilir. Classification
- 3:54yani sınıflandırma problemlerinde ise
- 3:55logistic regression, decision tree,
- 3:58random forest, SVM gibi yöntemler
- 3:59kullanıldı. Bunlar görüntü, metin veya
- 4:02tablo verisinden belirli özellikleri
- 4:03çıkarıp karar vermeye çalışıyordu. Bu
- 4:05özellik çıkarma sürecine feature
- 4:07extraction denir. Ama burada önemli bir
- 4:09problem vardı. Özellikleri çoğu zaman
- 4:10insanın kendisi belirlemesi gerekiyordu.
- 4:12Özellikleri insanın belirlemesinden
- 4:14kastım şu: Örneğin akciğer grafisinde
- 4:16anormallik tespit eden bir model yapmak
- 4:18istiyorsunuz. Modeli eğitmek için
- 4:19binlerce, [müzik] milyonlarca akciğer
- 4:21grafisi toplamanız gerekiyor. Eğer
- 4:22supervised learning yani etiketli
- 4:24öğrenme yapıyorsanız bu görüntülerin
- 4:26normal mi, anormal mi olduğunu
- 4:27doktorlara etiketletmeniz gerekiyor.
- 4:29Bunun yanında klasik makine öğrenmesi
- 4:31tarafında görüntüdeki lekenin boyutu,
- 4:33parlaklık yoğunluğu, kenar yapısı veya
- 4:35doku değişimi gibi özellikleri de çoğu
- 4:36zaman bizim belirleyip modele vermemiz
- 4:38gerekiyordu. İşte bu yüzden manuel
- 4:40özellik çıkarma süreci klasik makine
- 4:42öğrenmesi yöntemlerinin en büyük
- 4:43zorluklarından biriydi. Bir diğer
- 4:45problemi ise makine öğrenmesi
- 4:46algoritmalarına ne kadar veri verirseniz
- 4:48o kadar iyi olmuyordu modeller. Bir yere
- 4:50kadar iyi oluyorlardı fakat bir yerden
- 4:52sonra iyileşmeleri duruyordu. Çünkü
- 4:53kapasiteleri sınırlıydı. Bu sorunlara
- 4:55çözüm olarak deep learning konsepti daha
- 4:57güçlü hale geldi. Derin öğrenmede model
- 4:59sadece son kararı vermiyor. Aynı zamanda
- 5:01verinin içindeki önemli özellikleri de
- 5:02katmanları sayesinde kendi öğreniyor.
- 5:04Hani az önce akciğer grafisindeki
- 5:06lekenin boyutu, kenar yapısı, parlaklık
- 5:08yoğunluğu gibi özellikleri bizim
- 5:09çıkarmamız gerekebiliyordu demiştim.
- 5:11Deep learning tarafında bu özellikleri
- 5:13tek tek bizim tanımlamamız gerekmez.
- 5:14Model eğitim sırasında görüntülere
- 5:16bakarak hangi çizgilerin, dokuların,
- 5:18yoğunlukların veya şekillerin karar
- 5:20vermede önemli olduğunu kendi
- 5:21ağırlıkları üzerinden öğrenir. Tabii
- 5:22supervised learning yapıyorsak yine
- 5:24doğru etiketlenmiş verilere ihtiyaç
- 5:26duyarız. Yani modelin bu görüntü normal
- 5:28mi yoksa anormal mi gibi örnekleri
- 5:30görmesi gerekir. Ama görüntünün içindeki
- 5:31anlamlı özellikleri çıkarmanın büyük
- 5:33kısmını artık model kendisi yapıyor. Bir
- 5:35diğer kavramımız ise artificial neural
- 5:37network'ler yani yapay sinir ağları. Bu
- 5:39yapılar insan beyninden esinlenen
- 5:41katmanlı modellerdir. Her katmanda
- 5:42veriler bazı ağırlıklardan geçer,
- 5:44dönüştürülür ve bir sonraki katmana
- 5:46aktarılır. Model eğitim sırasında
- 5:47hatasına bakarak bu ağırlıkları
- 5:49günceller. Böylece zamanla daha doğru
- 5:51tahmin yapmayı öğrenir. Görüntü
- 5:52problemlerinde ise özel olarak CNN
- 5:54mimarisi çok başarılı oldu. Çünkü
- 5:56görüntülerde piksel komşulukları
- 5:57önemlidir. CNN görüntünün üzerinde
- 5:59[müzik] küçük filtreler gezdirerek
- 6:01kenar, çizgi, kıvrım ve şekil gibi
- 6:02özellikleri yakalar. Bizim projemizde de
- 6:04el yazısı ile yazılmış rakamları tanımak
- 6:06için CNN kullanıyoruz. Daha sonra
- 6:08görüntü, ses ve diğer konularda değil de
- 6:10asıl devrim insan dili tarafında
- 6:11gerçekleşti. [müzik]
- 6:12Özellikle dil ve sıralı veri
- 6:14problemlerinde RNN, LSTM gibi yapılar
- 6:16kullanıldı. Fakat bunlardaki uzun
- 6:17dönemli hafızayı tutamama problemleri ve
- 6:19diğer problemler [müzik] sebebiyle
- 6:21günümüzdeki Transformer mimarisine
- 6:23geçildi. ChatGPT gibi büyük dil
- 6:24modellerinin temelinde Transformer
- 6:26mimarisi vardır. GPT, yani Generative
- 6:29Pre-trained Transformer. Transformer
- 6:31verideki parçaların birbirleriyle
- 6:32ilişkisini Attention [müzik]
- 6:33mekanizmasıyla öğrenir. Bir de
- 6:35Generative AI tarafı var, yani üretken
- 6:37yapay zeka. Bu modeller sadece
- 6:38sınıflandırma [müzik] yapmaz, yeni
- 6:40içerik üretebilir. Metin, görsel, ses
- 6:42veya video oluşturabilir. Görsel üretim
- 6:44tarafında Diffusion modelleri çok
- 6:45yaygınlaştı. Diffusion modelleri basitçe
- 6:48gürültülü bir görüntüden adım adım
- 6:49anlamlı bir görüntü üretmeyi öğrenir.
- 6:51Ama bizim bu projemizdeki problemimiz
- 6:53üretim değil, Classification, yani
- 6:54sınıflandırma problemi. Yani modelden
- 6:56yeni bir görüntü üretmesini istemiyoruz.
- 6:58[müzik] Ekrana yazılan rakamın hangi
- 7:00sınıfa ait olduğunu bulmasını istiyoruz.
- 7:02Bu yüzden burada en uygun mimarilerden
- 7:03birisi CNN oluyor. Şimdi CNN mimarisini
- 7:06ve içerisindeki katmanların neler
- 7:07yaptığını öğrenelim. Mimari resminde
- 7:09görebileceğiniz üzere en önce resmimiz
- 7:11mimarimize, modelimize uygun formatta
- 7:12gelir. Örneğin MNIST veri setiyle
- 7:14eğiteceğimiz modelimiz 28 x 28 x 1 girdi
- 7:17bekler. Dolayısıyla modelimize uygun 28
- 7:20x 28 formatında input resim gelir.
- 7:22Burada gördüğünüz mimari aslında iki
- 7:24kısma ayrılıyor. Convolution ve Pooling
- 7:26layer'larında Feature Extraction, yani
- 7:28özellik çıkarma işlemi yapılır. Fully
- 7:29Connected diye belirtilen kısım
- 7:31içerisinde ise Classification, yani
- 7:33sınıflandırma işlemlerinin yapıldığı
- 7:35Artificial Neural Network katmanları
- 7:36vardır. Convolution katmanının amacı
- 7:39resimde hangi desenin nerede olduğunu
- 7:40bulmaktır. Pooling katmanlarının amacı
- 7:42ise bulunan bu sonucu küçültüp
- 7:44özetlemektir. Yani özetle Convolution
- 7:46layer'ları resimde ne var sorusunu
- 7:48cevaplar. Pooling katmanları ise önemli
- 7:50olanı tut, gerisini at der. Şimdi tek
- 7:52tek katmanların içerisine göz atalım.
- 7:54İlk Feature Extraction yapan katmanımız
- 7:56hangi desenin nerede olduğunu tespit
- 7:57etmeye yarayan Convolution
- 7:58layer'ımızdır. Bu layer [müzik] özellik
- 8:00çıkarma için Convolution Kernel, diğer
- 8:02adıyla filtre kullanılır. Input olarak
- 8:04gelen resmimizin bu piksellerden
- 8:06oluştuğunu düşünelim. Bu piksellerin
- 8:08oluşturduğu yapı nihai olarak resmimizin
- 8:10neresinde, hangi renkte, ne deseni var
- 8:12bilgisini taşır. Bu aşamada bu
- 8:13özellikleri öğrenmek için daha önce de
- 8:15belirttiğim convolution kernelleri, yani
- 8:17filtrelerimiz devreye girer. Her bir
- 8:19filtrenin, yani kernelin kendine ait bir
- 8:21görevi vardır. Örneğin kernel 1 tüm
- 8:23resmi gezer ve yatay çizgi nerede
- 8:25haritasını çıkarır. Kernel 2 tüm resmi
- 8:27gezer ve dikey çizgi nerede haritasını
- 8:29çıkarır. Son kernele kadar bu böyle
- 8:31devam eder. Buradan anlayabileceğiniz
- 8:33üzere bu filtrenin sayısı bir adet
- 8:34değildir. Elimizdeki mevcut veri setine
- 8:36göre sayılar belirlenir. Veri setinin
- 8:38barındırdığı resimlerin karmaşıklıkları
- 8:40ve detayları arttıkça filtrelerimizin
- 8:42sayısı da artmalıdır. Üzerinde
- 8:43çalışabileceğimiz el yazısı veri seti
- 8:45çok karmaşık veri seti olmadığı için
- 8:47genelde 32, 64 gibi filtre sayısı
- 8:49belirlenebilir. Örneğin orta
- 8:51karmaşıklıkta resimler için CIFAR-10
- 8:53veri setinde 64, 128 gibi değerler
- 8:55belirlenebilirken tamamen karmaşık
- 8:57resimlerden oluşan ImageNet seviyesinde
- 8:59128, 512 gibi filtre sayısı
- 9:01belirlenebilir. Veri setindeki
- 9:03resimlerden öğrenilmesi gereken detay
- 9:05sayısı arttıkça bu detayları tespit
- 9:07etmeye yarayan filtrelerin sayısı da
- 9:08doğal olarak artmalıdır. Burada
- 9:10belirlediğiniz sayı eğittiğiniz modelin
- 9:12kalitesinden de anlaşılacaktır. Örneğin
- 9:14eğittiğiniz model eğer yeni örneklerde
- 9:16desenleri yakalayamıyorsa bu dikkat
- 9:18etmeniz gereken parametrelerden birinin
- 9:20kernel sayısının düşüklüğü olduğunu
- 9:21işaret olabilir. Peki kernel resmin
- 9:23üzerinde ne yapıyor? Kernel resmin sol
- 9:25üst köşesine yerleştirilir. Kernelin
- 9:27içerisindeki rastgele oluşturulmuş
- 9:29piksellerle eleman eleman çarpılır ve
- 9:31sonuçlar toplanır. Bu toplam yeni
- 9:33matrisin bir pikseli olur. Ardından
- 9:35kernel bir adım kayar ve işlem resmin
- 9:37tamamı gezilene kadar tekrarlanır.
- 9:39Ortaya çıkan yeni matrise feature map
- 9:41diyoruz. Feature mapteki yüksek değerler
- 9:43bu kernelin aradığı desenin o bölgede
- 9:45bulunduğunu gösterir. Kernel boyutuna
- 9:47gelirsek genelde 3 x 3 kullanılır.
- 9:49Burada stride diye bir kavramdan
- 9:50bahsetmek istiyorum. Stride kernelin her
- 9:53adımda orijinal resim üzerinde kaç
- 9:54piksel kayacağını belirler. Stride
- 9:56değeri 1 ise kernel her piksele uğrar.
- 9:59Stride 2'de birer atlayarak ilerler ve
- 10:01feature map yarı boyutuna iner. Peki
- 10:02hangisini seçmeliyiz? Convolution
- 10:04katmanlarında varsayılan tercih stride
- 10:061'dir. Çünkü amacımız detay yakalamak.
- 10:08Piksel atlamak ise detay kaybetmek
- 10:10demektir. Stride 2'yi daha çok büyük
- 10:12resimlerle çalışırken hesaplama yükünü
- 10:14azaltmak için ilk katmanlarda
- 10:15görürsünüz. Günümüz mimarilerinin bir
- 10:17kısmında pooling katmanı devre dışı
- 10:19bırakılıp stride 2'li convolution
- 10:21kullanılıyor. Yani küçültme için ayrı
- 10:22bir katman yerine convolution'ın kendisi
- 10:24yapar. Ama MNIST gibi zaten küçük olan
- 10:2628 x 28'lik [müzik] resimlerde stride 2
- 10:29kullanmak bence gereksiz bir risk. O
- 10:31kadar az pikselde atladığınız her
- 10:32pikselin önemi olabilir. Burada stride 1
- 10:34kullanıp küçültmeyi pooling'e bırakmak
- 10:36[müzik] en mantıklısı olacaktır. Gelelim
- 10:38padding'e. 5 x 5'lik bir matrise 3 x 3
- 10:41kernel uyguladığınızda sonuç 3 x 3
- 10:43çıkıyor. Yani her convolution'da matris
- 10:45küçülüyor. Bunun yanında kenar
- 10:46pikselleri daha az hesaba katılıyor.
- 10:48Convolution kernel'i orijinal resim
- 10:50üzerinde işlem yaparken köşedeki
- 10:52pikseller yalnızca bir kez hesaplamaya
- 10:54girerken ortadaki pikseller dört kez
- 10:56giriyor. Padding matrisin çevresine
- 10:58sıfırlardan bir çerçeve ekleyerek
- 11:00köşedeki piksellerin daha az
- 11:01hesaplanmaya girmesini engeller. Onları
- 11:03da orta pikseller haline getirmiş olur.
- 11:05Padding isteğe bağlı bir özelliktir. Bu
- 11:07da elinizdeki setinin türüne göre
- 11:09değişir. Eğer köşelerinde fazla
- 11:11özellikler barındıran resimler içeren
- 11:13bir veri setiyle çalışıyorsanız
- 11:14padding'i aktif hale getirmeniz daha iyi
- 11:16olacaktır. Kernellerin içindeki
- 11:18değerleri ise biz belirlemiyoruz.
- 11:19Eğitimin başında rastgele atanırlar ve
- 11:21model her hatasından sonra bu değerleri
- 11:23günceller. Yani CNN'deki weight'ler,
- 11:25yani modelin neye ne kadar önem
- 11:27vereceğini belirleyen model ağırlıkları
- 11:28tam olarak kernellerin içindeki bu
- 11:30değerlerdir. Mimarideki ikinci [müzik]
- 11:31convolution layer ise doğrudan resme
- 11:33değil, ilk katmanın output olarak
- 11:35verdiği feature map'lere bakar. İlk
- 11:37katman çizgi, kenar gibi basit desenleri
- 11:39bulurken ikinci katman bunları
- 11:41birleştirerek köşe ve kıvrım gibi daha
- 11:43karmaşık yapıları yakalar. Derinlere
- 11:45indikçe model resmi daha anlamlı
- 11:47parçalar halinde görmeye başlar.
- 11:48Convolution layer'lardan çıktığımızda
- 11:50elimizde çok sayıda feature map vardır.
- 11:52Ancak bunlar hala büyük ve gereksiz
- 11:54detaylar barındırıyor. Bir sonraki
- 11:55katmanımız olan pooling layer, diğer
- 11:57adıyla downsampling layer, bu bilgiyi
- 11:59küçültüp özetleme görevini üstleniyor.
- 12:01Pooling layer'ın iki amacı vardır.
- 12:03Birincisi, milyonlarca boyutlardan
- 12:05oluşan milyarlarca veri barındıran bir
- 12:07veri setindeki boyutları yarısına kadar
- 12:09indirebilir. Bu sayede model hem daha
- 12:11hızlı eğitilir hem de daha az hafıza
- 12:13kullanır. İkincisi overfitting riskini
- 12:15azaltmak. Overfitting ne diye soracak
- 12:16olursanız, model eğitiminde sık
- 12:18karşılaşılan bilen bir durumdur. Modelin
- 12:20eğitildiği veri setini aşırı öğrenmesi,
- 12:22yani ezberlemesi, [müzik]
- 12:23ancak karşısına çıkan yeni örneklerde
- 12:25doğruluğunun çok düşük olması durumudur.
- 12:27Yani bu aslında günümüzdeki eğitim
- 12:29sistemini özetleyen bir durumdur.
- 12:30Okullarda sınavları geçmek için sınav
- 12:32odaklı çalışırız. [müzik] Fakat hem
- 12:34konuyu öğrenmeyiz, hem de gerçek hayat
- 12:35için bir çıkarım yapamayız. Model de
- 12:37buradaki hataya düşer. Eğitim veri
- 12:39setinde başarısı çok iyidir. Fakat
- 12:40karşısına çıkan yeni örneklerde
- 12:42çuvallar. Çünkü ezberlemiştir,
- 12:44öğrenmemiştir. Pooling de burada bu
- 12:46durumun oluşmamasına yardımcı oluyor
- 12:47aslında. Feature map'ler küçültülerek
- 12:49sonraki katman olan fully connected
- 12:51layer'a daha küçük bir veri grubu gider.
- 12:53Bu da o katmandaki parametre sayısını
- 12:55ciddi şekilde azaltır. Parametre
- 12:57azaldıkça modelin eğitim verisini
- 12:58ezberleme kapasitesi de azalır. Yani
- 13:00model resimleri ezberlemek yerine genel
- 13:02desenleri öğrenmeye yönelir. Nasıl
- 13:04yapılacağına gelecek olursak,
- 13:06convolution'ın çıktısı olan feature
- 13:07map'in üzerinde küçük bir pencere
- 13:09gezdirilir. Ve her pencereden tek bir
- 13:11değer alınır. Bu arada buranın CNN'in
- 13:13neyine kadar ağırlık vereceğini belirten
- 13:15weight'lere doğrudan bir katkısı yoktur.
- 13:17Burada herhangi bir şey öğrenilmez.
- 13:18Buradaki işlemler sabittir. Buradaki
- 13:20penceremizin standart boyutu 2 x 2'dir
- 13:23ve stride 2 olarak kullanılır. Pooling
- 13:25penceresinin boyutu ile stride sayısının
- 13:27birbirine eşit olduğu her zaman her
- 13:28piksel bir kez işleme girer. Birden
- 13:30fazla adette pooling türü vardır. Burada
- 13:32dört farklı pooling türünden
- 13:33bahsedebilirim. Max pooling, average
- 13:35pooling, min pooling ve modern
- 13:37mimarilerde kullanılan pooling'i
- 13:39kaldıralım. Convolution'ın stride 2
- 13:41olarak kullanım yaklaşımı. Daha farklı
- 13:43ileri seviye pooling yöntemleri de var.
- 13:45Fakat biz konuyu uzatmamak adına burada
- 13:46bunlardan bahsetmeyeceğiz. Max pooling,
- 13:49pooling çerçevesinin girdiği matristeki
- 13:51en yüksek değeri alır. CNN katmanlarında
- 13:53varsayılan tercih budur. Feature map'te
- 13:55yüksek değer desen burada var anlamına
- 13:57geldiği için en güçlü sinyali tutmak
- 13:59mantıklı. Average pooling, pooling
- 14:01çerçevesinin girdiği matristeki
- 14:02değerlerin ortalamasını alır. Bölgedeki
- 14:04tüm değerlerin daha yumuşak bir özet
- 14:06çıkarır. Güçlü bir sinyal zayıf
- 14:08değerlerle ortalandığında sönükleşir. Bu
- 14:10yüzden ara katmanlarda max'e göre daha
- 14:12az kullanılır. Min pooling, pooling
- 14:14çerçevesinin girdiği matristeki en küçük
- 14:16değeri alır. Convolution katmanlarından
- 14:18çıkan feature map'lerde çok sayıda sıfır
- 14:20değeri olabileceğinden, bu pooling
- 14:22yöntemi de onları seçebileceğinden
- 14:23dolayı aslında teorik de olup pratikte
- 14:25neredeyse hiç kullanılmayan bir pooling
- 14:27yöntemidir. Convolution ve pooling
- 14:29layer'larından sonra artificial neural
- 14:30network, yani yapay sinir ağları diye
- 14:32adlandırdığımız fully connected
- 14:34layer'lardan hemen önce flattening
- 14:35işlemi yapılır. Flatten, çok boyutlu
- 14:37veriyi tek boyutlu bir vektöre çevirir.
- 14:392 x 2'lik matris dört elemanlı bir
- 14:41listeye dönüşür. Ya da 7 x 7 x 64'lük
- 14:45veri 7 x 7 x 64, yani 3136 elemanlı tek
- 14:49bir vektör olur. Bunları yaparken hiçbir
- 14:51hesaplama yapmaz. Parametresi de yoktur.
- 14:53Değerler aynen korunur. Sadece
- 14:55dizilişleri değişir. Matris satır satır
- 14:57okunur ve arka arkaya dizilir. Kısaca
- 14:59bilgi kaybolmaz, sadece şekil
- 15:00değiştirir. Özetle flatten işlemi
- 15:02şöyledir. Örneğin 2, 3, 4, 1 şeklinde
- 15:05bir matrisimiz olduğunu varsayalım. Bu
- 15:06matrisin flatten işleminden sonra şöyle
- 15:08olacağını düşünebiliriz. Veriler sıralı
- 15:10ve ardışık olarak art arda konulduğunda
- 15:122, 3, 4 ve 1 rakamları bu şekilde
- 15:15dizilir. Yani veri düzleştirilmiş olur.
- 15:17Bu gereklidir çünkü fully connected
- 15:18katmanlar yalnızca tek boyutlu girdi
- 15:20kabul eder. Her nöron gelen her değere
- 15:22ayrı bir weight ile bağlanır. Matris
- 15:24satır, sütun ve kanal gibi kavramları
- 15:26bilmez. Önüne bir sayı listesi gelmesini
- 15:28bekler. Flattening'den gelen
- 15:29düzleştirilmiş veri klasik yapay sinir
- 15:31ağlarının bulunduğu fully connected
- 15:33layer'larına gider. Buraya fully
- 15:34connected denmesinin sebebi tüm
- 15:36nöronlarının kendinden önceki ve sonraki
- 15:38katmanlarda bulunan tüm nöronlara bağlı
- 15:40olmasıdır. Ariyeten partialy connected,
- 15:42localy connected ve three connected gibi
- 15:45diğer alternatifleri de vardır. Fakat
- 15:47CNN'de fully connected layer'lar
- 15:48kullanılır. Burada her zaman bir tane
- 15:50input layer, bir tane output layer ve
- 15:52sayısını bizim ihtiyaca göre
- 15:53belirlediğimiz hidden layer'larımız,
- 15:55yani gizli katmanlarımız vardır. Bir
- 15:57nöron tam olarak ne yapar? Her nöron
- 15:59aynı üç işlemi yapar. Gelen her değeri
- 16:01kendi weight'leriyle çarpar. Sonuçları
- 16:03ve bir bias ekler. Toplamı bir
- 16:05aktivasyon fonksiyonundan geçirir. Örnek
- 16:07olarak üç girdili bir nöron düşünelim.
- 16:09Bir nöron için gelen input'un 2, 3 ve 1
- 16:12olduğunu düşünelim. Nöronun
- 16:14weight'lerine ise 0.5, -1 ve 2 diyelim.
- 16:17Bias'a da 1 diyelim. Hesaplama şöyle
- 16:18olmuş oluyor. 2 x 0.5 + 3 x -1 + 1 x 2
- 16:23ve artı bayas olan 1'i eklediğimizde 1
- 16:26sonucunu elde ederiz. Eşitliğin
- 16:27karşısındaki bu 1, bu işlemi yapan
- 16:29nöronun çıktısıdır. Yani aslında
- 16:31convolution'daki işlemin aynısını burada
- 16:33yapmış oluyoruz. Input layer'ların ne
- 16:34yaptığını biliyoruz. Yaptıkları tek şey
- 16:36önceki katmanlardan gelen flatten
- 16:38edilmiş veriyi tutmak. Peki hidden
- 16:39layer'la output layer'larının
- 16:41birbirlerinden farkı ne? İkisi de az
- 16:42önceki hesabı yapar. Farkları
- 16:44kullandıkları aktivasyon fonksiyonu ve
- 16:46rolleri dir. Hidden layer'lar Relu
- 16:47aktivasyon fonksiyonunu kullanır. Asıl
- 16:49classification yapmanın öğrenildiği yer
- 16:51burasıdır. Flatten'den gelen özellikleri
- 16:53birleştirip ara sonuçlar üretir. Örneğin
- 16:55bir nöron üstte yatay çizgi var ve altta
- 16:57kıvrım var kombinasyonuna duyarlı hale
- 17:00gelir. Nöronların tek bir anlamı yoktur.
- 17:02Neye ne kadar duyarlı olacaklarına
- 17:03eğitim karar verir. Örneğin bu nöronun
- 17:05mu 3'ün köşesindeki kıvrımlarından
- 17:07sorumlu olacağı yoksa bu nöronun mu
- 17:09olacağına eğitim esnasında karar
- 17:11verilir. Burada rastgelelik söz
- 17:12konusudur. Output layer ise softmax
- 17:15aktivasyon fonksiyonunu kullanır. Basit
- 17:17deyişle buranın 3'ün mü aradığımız rakam
- 17:19olduğunu yoksa 5'in mi aradığımız rakam
- 17:21olduğunu söyleyen katmandır. 0 ile 1
- 17:23arasında olasılıksal değerle yön
- 17:25gösterir. Örneğin 1 için 0.11, 5 için
- 17:280.87 dediyse aralarındaki en yüksek
- 17:31değer olan 5 öne çıkar ve sonuç olarak
- 17:33bu rakam %87 olasılıkla 5'tir denmiş
- 17:35olur. Bizim örneğimizde buradaki nöron
- 17:37sayıları şöyledir. Bildiğiniz üzere
- 17:39bizim resmimiz 28 x 28 x 1 boyutunda
- 17:42geldi. Convolution katmanında 32 adet
- 17:44convolution filter'ı kullandığımızı
- 17:46varsayarsak bu boyut 28 x 28 x 32 oldu.
- 17:50Ardından pooling layer'ında 2 x 2
- 17:52pencere kullanarak bu boyutu 14 x
- 17:54[müzik] 14 x 32 seviyesine getirdik.
- 17:56Sonra ikinci convolution katmanında 64
- 17:58tane kernel kullandık ve boyut [müzik]
- 18:0014 x 14 x 60 oldu. Ardından tekrar bir
- 18:03max pooling yaptık ve boyut 7 x 7 x 64
- 18:06oldu. En sonunda flatten ile bunları
- 18:08düzleştirdik ve 7 x 7 x 64'ten sayı 3136
- 18:12oldu. Dolayısıyla input layer'ımızda
- 18:143136 nöron vardır diyebiliriz. Hidden
- 18:16layer'larımızda da 128 adet nöron
- 18:18kullandığımızı varsayalım. Genelde MNIST
- 18:20için kullanılan alışılagelmiş nöron
- 18:22sayısı budur. Output katmanında 0'dan
- 18:249'a 10 adet sınıflandırma seçeneğimiz
- 18:26olduğundan dolayı 10 nöron kullandık.
- 18:28Bir de mimaride gözünüze çarpmış
- 18:29olabilecek olan dropout layer'ımız var.
- 18:31Dropout layer'ın amacı overfitting'i
- 18:33engellemektir. Rastgele bazı nöronları
- 18:35kapatarak aşırı öğrenmeyi, modelin
- 18:37eğitim veri setini ezberlemesini
- 18:38engeller. Dropout olmadan bazı nöronlar
- 18:41birbirlerine aşırı bağımlı hale gelir ve
- 18:43belirli örnekleri ezberleyen dar
- 18:44kombinasyonlar oluşur. Hangi nöronun
- 18:46kapanacağı belli olmadığında hiçbir
- 18:48nöron diğerine güvenemez. Her biri tek
- 18:50başına işe yarayan bir özellik öğrenmek
- 18:51zorunda kalır. Mimarideki yeri ise
- 18:54hidden layer'lar ile output
- 18:55layer'larının arasıdır. Fakat hidden
- 18:57layer'ların kendi arasında bir yerde
- 18:58konabilir. Örneğin kod kısmında dropout
- 19:000.5 dediğinizde bu hidden layer'lardaki
- 19:03128 nöronun her birini %50 ihtimalle
- 19:06kapat demektir. Son olarak bahsetmediğim
- 19:07forward propagation ve backward
- 19:09propagation konularından bahsetmek
- 19:11istiyorum. Buraya kadar öğrenimin
- 19:12modelin weight'lerini güncelleyerek,
- 19:14yani ağırlıklarını güncelleyerek
- 19:15olduğunu söyledik. Peki ya bu nasıl
- 19:17oluyor? Buradaki iki kavram forward ve
- 19:19backward propagation. Forward
- 19:21propagation başından beri anlattığımız
- 19:22normal mimaridir. Model lineer şekilde
- 19:25mimarimizde ilerleyerek tahminlerini
- 19:26yapar. Backward propagation gerçek değer
- 19:29ile modelin tahmin ettiği değer
- 19:30arasındaki farktan hata miktarının
- 19:32hesaplanması ve bu hatanın azaltılması
- 19:34amacıyla ağırlıkların, yani weight'lerin
- 19:36güncellenmesini sağlayan süreçtir. Model
- 19:39tahmin ettiği değerler ile gerçek
- 19:40değerleri kıyaslar. Bir loss, yani kayıp
- 19:42fonksiyonu aracılığıyla hatasını çıkarır
- 19:45ve gerçek değerlere daha yakınlaştıracak
- 19:47düzenlemeyi yaparak weight'leri
- 19:48günceller. Bu işlem weight'lerin
- 19:49bulunduğu iki yerde olur. Fully
- 19:51connected layer ve convolution layer.
- 19:53Diğer katmanlarda weight'ler
- 19:54olmadığından dolayı oralarda olmaz.
- 19:56Şimdi projemizde çalıştırdığımız CNN
- 19:58modelinin kodlarını ve detaylarını
- 20:00GitHub sayfamızdan kontrol edelim.
- 20:02Projemizde kullanılan modelin kaynak
- 20:03kodlarının bulunduğu repomuz bu şekilde.
- 20:05Burada asıl olarak iki dosyaya
- 20:07bakacağız. Çünkü ana işlemlerimizi
- 20:08bunların içerisinde yaptık. [müzik]
- 20:10Diğer kısımlar şu anki projemizle
- 20:11alakasız kaçıyor. Bu sebeple buralara
- 20:13değinmiyorum. Ana dosyamız olan
- 20:15model_train, yani modelimizi eğittiğimiz
- 20:17ve CNN katmanlarını kurduğumuz dosyaya
- 20:19bakalım. Gördüğünüz üzere 50 satırlık
- 20:20kısa bir kod dosyası bizleri karşılıyor.
- 20:22En baştan hızlı bir bakış atalım. Gerçek
- 20:24bir ürünü geliştirirken yapay zeka
- 20:26projelerinde özellikle model eğitimi,
- 20:28derin öğrenme ve makine öğrenmesi
- 20:30uygulamaları gibi görevlerde genellikle
- 20:32iki ana [müzik] kütüphane öne çıkar.
- 20:33Birincisi PyTorch. Eski adıyla Facebook,
- 20:36günümüz adıyla Meta tarafından
- 20:37geliştirilen PyTorch bu alanda en yaygın
- 20:39kullanılan kütüphanelerden birincisidir.
- 20:41İkincisi ise TensorFlow. Google
- 20:43tarafından geliştirilen TensorFlow
- 20:45makine öğrenmesi ve derin öğrenme
- 20:46uygulamalarında kullanılan bir diğer
- 20:48önemli kütüphanedir. Biz bu projede
- 20:50TensorFlow kullandık. TensorFlow'un
- 20:52içerisinde yer alan yüksek seviyeli bir
- 20:53API olan Keras'tan yararlandık. Keras'ın
- 20:56TensorFlow'dan temel farkı modellerimizi
- 20:58daha kısa, sade ve okunaklı bir şekilde
- 21:00tanımlamamıza olanak sağlamasıdır.
- 21:02Burada eğitim amaçlı bir içerik
- 21:03ürettiğimiz için [müzik] modelin nasıl
- 21:05oluştuğunu ve eğitildiğini daha
- 21:06anlaşılır bir şekilde göstermek adına
- 21:08Keras bizim için uygun bir tercih oldu.
- 21:09Ancak burada önemli bir noktayı
- 21:11belirtmek gerekiyor. Keras'ı kullanırken
- 21:13arka planda hesaplama ve model
- 21:14çalıştırma işlemleri TensorFlow
- 21:16tarafından gerçekleştiriliyor. Yani biz
- 21:18modeli Keras'ın daha sade ve kullanıcı
- 21:19dostu API'yi üzerinden tanımlarken
- 21:22işlemlerin büyük bir kısmı arka planda
- 21:23TensorFlow tarafından yürütülüyor. İlk
- 21:25satırda gözümüze çarpan kütüphane
- 21:27Sequential. [müzik] Bu CNN katmanlarını
- 21:29üst üste ardışık olarak dizmemizi
- 21:31sağlayan bir TensorFlow model yapısıdır.
- 21:33İkinci satırda [müzik] CNN katmanları
- 21:34olan Convolution, Pooling, Flatten ve
- 21:36Fully Connected Layer'larını import
- 21:38ettik. Üçüncü satırda to_categorical'ı
- 21:40import ettik. Bunu birazdan etiketleri
- 21:42modelin anlayacağı forma çevirirken
- 21:44kullanacağız. Dördüncü satırda MNIST
- 21:45veri setini, yani el yazısı rakamları
- 21:47import ettik. Keras bu veri setini hazır
- 21:49olarak sunuyor. Tek satırda indirip
- 21:51kullanabiliyoruz. NumPy çok meşhur bir
- 21:53kütüphanedir. Açılımı Numerical
- 21:55Python'dır. Data Science, yani veri
- 21:56bilimi alanında çok sık kullanılır. Biz
- 21:58ise burada resimler gibi büyük [müzik]
- 22:00sayı tablolarıyla hızlıca hesap yapmak
- 22:01için import ettik. Warning importları
- 22:03ise çıktı logları kirlenmesin diye
- 22:05uyarıları kapatmaya yarıyor. Normalde
- 22:07modelleri eğitirken dataseti ikiye
- 22:09böleriz. Train dataseti ve test dataseti
- 22:11diye. Örneğin bir datasetimiz [müzik]
- 22:13varsa bu datasetinin %70'ini modelin
- 22:15eğitimi için kullanır, kalan %30'unu ise
- 22:17eğitim bittikten [müzik] sonra modelin
- 22:18test edilmesi için kullanırız. Burada
- 22:20bunu yapıyoruz. X_train ve Y_train
- 22:22kısımlarında modelin eğitim için
- 22:24kullanacağı verileri kaydediyor, X test
- 22:26ve Y test kısımlarında ise modelin
- 22:28eğitim sonrası test edilmesi için
- 22:29ayrılmış veri seti parçalarını
- 22:31bulunduruyoruz. X'ler resimlerin
- 22:33kendilerine, Y'ler ise o resimlerde
- 22:34hangi rakamın yazıldığını, yani doğru
- 22:36cevapları barındırıyor. Train kısmı
- 22:38modeli eğitmek için kullanacağımız
- 22:4060.000 resim, test kısmı ise modelin
- 22:42eğitim sırasında [müzik] hiç görmediği
- 22:4310.000 resmi barındırıyor. Model
- 22:45eğitildikten sonra daha önce görmediği
- 22:47resimlerde ne kadar başarılı olduğunu
- 22:49bununla ölçebiliriz. Bu kısımda ise
- 22:50normalizasyon işlemi yapıyoruz.
- 22:52Bilgisayar için her piksel 0 ile 255
- 22:55arasında bir sayıdır. 0 siyah, 255
- 22:57beyaz, aradaki değerler grinin
- 22:59tonlarıdır. Biz bu sayıları 255'e
- 23:01bölerek hepsini 0 ile 1 arasına
- 23:03getiriyoruz. Yani normalize ediyoruz.
- 23:04[müzik] 255'e bölme işlemi yapıldıktan
- 23:07sonra örneğin 255 olan piksel 1, 0 olan
- 23:10piksel yine 0 oluyor. Yani pikseller 0
- 23:12ile 1 değeri arasında float değerleri
- 23:14olarak temsil ediliyor. Resim aynı
- 23:16görünmeye devam ediyor. Sadece sayılar
- 23:18küçülüyor. Bunu yapıyoruz çünkü model
- 23:19küçük sayılarla çok daha rahat ve hızlı
- 23:21öğreniyor. Büyük sayıları ise eğitimi
- 23:23zorlaştırıyor. Dimension fixing kısmında
- 23:25boyut düzenleme işlemi yapıyoruz.
- 23:26Convolution katmanı her resmi üç [müzik]
- 23:28bilgiyle bekler. Yükseklik, genişlik ve
- 23:30kanal sayısı. Kanal sayısı resmin renk
- 23:32bilgisidir. Renkli resimlerde üç kanal
- 23:35vardır. Kırmızı, yeşil ve mavi. Siyah
- 23:37beyaz resimlerde ise tek kanal vardır.
- 23:39MNIST veri [müzik] seti içerisinde
- 23:40bulunan el yazısı rakamları siyah beyaz
- 23:43olduğu için burada kanal sayısını 1
- 23:44olarak ayarladık. Bu satır onu ekliyor.
- 23:46[müzik] 28 x 28 olan resimlerimizi 28 x
- 23:4928 x 1, yani 28 x 28 boyutlu siyah beyaz
- 23:53resimler demek oluyor. Başındaki 60.000
- 23:55sayısı yukarıda da bahsettiğimiz
- 23:57eğitimde [müzik] kullanılacak olan
- 23:58resimlerin sayısını belirtiyor. Buradaki
- 24:00işlemimiz one hot encoding isimli bir
- 24:02işlem. [müzik] Modelimizin çıktısında 10
- 24:04tane kutu olduğunu düşünelim. Her kutu
- 24:06bir rakamı temsil ediyor. Model her
- 24:08rakam için bir olasılık tahmin ediyor.
- 24:10Örneğin modelimizin tahmini böyle olsun.
- 24:11Burada model 1 [müzik] için %10, 3 için
- 24:14%20, 5 için %60, 8 için %10 olasılık
- 24:17vermiş. En yüksek olasılık %60 ile 5
- 24:19rakamında [müzik] olduğu için modelin
- 24:21tahmini 5 oluyor. Şimdi model tahminini
- 24:23gerçek cevapla karşılaştırmamız
- 24:24gerekiyor. Bunun için Y train [müzik] ve
- 24:26Y test içerisindeki gerçek cevapları da
- 24:28aynı formata getiriyoruz. Burada
- 24:30yaptığımız işlemde tam olarak bu. Y
- 24:32train içerisindeki rakamları one hot
- 24:33formatına dönüştürüyoruz. Normalde Y
- 24:35train içerisinde cevaplar doğrudan rakam
- 24:37olarak bulunuyor. Örneğin bu resmin
- 24:39gerçek cevabı 8 ise Y train eşittir 8
- 24:42şeklinde bir formatta [müzik] bulunuyor.
- 24:43Biz bu değeri one hot encoding ile 10
- 24:45elemanlı bir diziye dönüştürüyoruz ve
- 24:47tablo böyle olmuş oluyor. Burada 10 tane
- 24:49değer var ve her değer bir rakamı temsil
- 24:51ediyor. Gerçek cevap 8 olduğu [müzik]
- 24:52için 8'in bulunduğu yer 1 değerini
- 24:54alıyor. Diğer bütün rakamların bulunduğu
- 24:56yerler ise 0 oluyor. Yani Y train
- 24:58içerisindeki her rakam için bu işlem
- 25:00tekrar ediliyor. Gerçek cevap 3 ise 3'ün
- 25:02bulunduğu yer 1, diğerleri 0 oluyor.
- 25:04Gerçek cevap 5 ise 5'in bulunduğu yer 1,
- 25:07diğerleri 0 oluyor. Böylece elimizde iki
- 25:09farklı cevap oluyor. Gerçek cevabın
- 25:11bulunduğu one hot formatı ve modelin
- 25:13tahmini. Burada 5 demiş ama gerçek cevap
- 25:158. Yani modelimiz yanılmış. Bu iki
- 25:17diziyi karşılaştırarak modelin ne kadar
- 25:19hata yaptığını hesaplayabiliyoruz. Daha
- 25:20sonra model bu hatayı azaltmaya
- 25:22çalışarak kendi weight'lerini
- 25:23güncelliyor ve zamanla daha da doğru
- 25:25tahminler yapmayı öğreniyor. Peki bunu
- 25:27her zaman yapmak zorunda mıyız? Cevabı
- 25:29hayır. Gerçek cevapları one hot
- 25:30formatına dönüştürmemiz kullanacağımız
- 25:32hata fonksiyonuna, yani loss function'a
- 25:34bağlı. Birazdan kullanacağımız
- 25:36categorical cross entropy hata [müzik]
- 25:37fonksiyonu gerçek cevapların bu
- 25:39formatta, yani one hot formatında
- 25:41olmasını beklediği için burada one hot
- 25:43encoding işlemi yapıyoruz. Asıl modeli
- 25:45kurduğumuz, katmanlarını belirlediğimiz,
- 25:47neye benzeyeceğini tanımladığımız kısma
- 25:49[müzik] geldik. Burada teoride
- 25:50anlattığımız katmanları sırasıyla
- 25:52diziyoruz. İlk satır convolution [müzik]
- 25:53katmanını tanımlıyor. 32 tane 3 x 3'lük
- 25:56filtre kullanılacağını, çıktıya ReLU
- 25:58aktivasyon fonksiyonu uygulanacağını
- 26:00tanımlıyor. Input shape ise modele
- 26:01gelecek resmin boyutunu tanımlıyor. Yani
- 26:0428 x [müzik] 28 x 1. İkinci satır 2 x 2
- 26:07pencere ile max pooling yapıyor. Üçüncü
- 26:09satır flatten ile veriyi düzleştiriyor.
- 26:11Dördüncü satır 128 nöronlu hidden
- 26:13layer'ımız. Son satırda 10 nöronlu
- 26:15output layer'ımız. Softmax [müzik] ile
- 26:17her rakam için bir olasılık veriyor.
- 26:19Fark etmiş olabileceğiniz üzere bu model
- 26:21diyagramdaki mimariden daha sade. Tek
- 26:23convolution ve tek pooling katmanı var.
- 26:25Dropout yok. Bunun sebebi MNIST basit
- 26:27bir veri seti olduğu için bu yalın
- 26:29katman dizilimi bize yetiyor. Daha
- 26:30karmaşık veri setlerinde diyagramdaki
- 26:32gibi daha fazla katman kullanmamız
- 26:34gerekir. Compile kısmında modele nasıl
- 26:36öğreneceğini söylüyoruz. Optimizer
- 26:37[müzik]
- 26:38modelin hata yaptıktan sonra
- 26:39weight'lerini nasıl güncelleyeceğini
- 26:41belirleyen yöntem. Adam en yaygın
- 26:43kullanılan optimizer. Çünkü ekstra ayar
- 26:45yapmadan çoğu problemde iyi çalışıyor.
- 26:47Loss modelin ne kadar hata yaptığını
- 26:48ölçen fonksiyon. Categorical
- 26:50crossentropy birden fazla sınıf arasında
- 26:52seçim yapılan problemlerde kullanılan
- 26:54standart hata ölçüsü. Model doğru rakama
- 26:56yüksek olasılık verirse ceza düşük,
- 26:58düşük olasılık verirse ceza büyük
- 27:00oluyor. Metrics ise sadece bizim
- 27:01notlardan takip etmemiz için var.
- 27:03Accuracy yani doğruluk metriği modelin
- 27:06yüzde kaç doğru tahmin yaptığını
- 27:07gösteriyor. Tüm metriklerin tamamlanması
- 27:09ve parametrelerin ayarlanması sonrasında
- 27:11modelin eğitimini başlatan satır burası.
- 27:14Meşhur fit fonksiyonuyla model training
- 27:15başlar. Eğitim için kullanılan X_train
- 27:18ve Y_train veri set parçalarını modele
- 27:20veriyoruz. Epoch modelin veri setini kaç
- 27:22kere göreceğini belirler. Burada üç
- 27:23seçmişiz. Model bu X_train ve Y_train'i
- 27:26üç kere tekrar tekrar görüp
- 27:27weight'lerini yani ağırlıklarını
- 27:29güncelleyecek demektir. Batch size 32
- 27:31demek [müzik] modelin resimleri 32'şerli
- 27:33gruplar halinde göreceği ve her 32
- 27:35resimden sonra weight'lerini
- 27:36güncelleyeceği anlamına geliyor.
- 27:38Validation split eşittir 0.2 ise eğitim
- 27:41verisinin yüzde 20'sini yani 12.000
- 27:43resmi kenara ayırıyor. Model bu
- 27:44resimlerle eğitilmiyor. Her epoch
- 27:46sonunda bu resimlerle sınanıyor ve biz
- 27:48modelin gerçekten öğrenip öğrenmediğini
- 27:50yoksa ezberleyip ezberlemediğini buradan
- 27:52takip ediyoruz. En sonda modelimizin
- 27:54performansını [müzik] beğendiysek daha
- 27:55sonra tekrar tekrar etmek zorunda
- 27:57kalmadan bu ağırlıkla kullanabilmek için
- 27:59kaydediyoruz. Machine learning
- 28:00modellerini kaydederken genelde .pkl,
- 28:03deep learning modellerini kaydederken
- 28:04ise .h5 dosyaları oluşur. Bizim
- 28:07dosyamızın adı da mnist_model.h5'tir.
- 28:09Bu modelin kayıtlı olduğu dosyayı aynı
- 28:11repo içerisinde bulabilirsiniz. [müzik]
- 28:13Bu dosyayı STM32CubeAI programı
- 28:15içerisinde kullandık. .h5 dosyası
- 28:17compile edilerek C koduna çevriliyor ki
- 28:19donanımımız içerisinde bu modeli
- 28:21çalıştırabilelim. Evet, CNN teorik
- 28:23anlatımını yaptık. Donanımımızda
- 28:24kullandığımız modelin kod yapısını
- 28:26inceledik. Son olarak bu repoyu genel
- 28:27olarak deneyimlemek [müzik] talimatları
- 28:30takip edebilirsiniz. El yazısı resmini
- 28:32yüklemenizi sağlayan bir front-end
- 28:33arayüzü ve kısa back-end kodları diğer
- 28:35dosyalarda bulunuyor. Tüm bu reponun
- 28:37linkini açıklamalardaki bağlantılardan
- 28:38bulabilirsiniz. Bugünlük benden bu
- 28:40kadar. Diğer yapay zeka donanım
- 28:42entegrasyonu videolarında görüşmek
- 28:43üzere. Kendinize iyi bakın. Söz
- 28:45Muhammed'de.
- 28:45>> Artık elimizde bir yapay zeka modeli
- 28:47var. Fakat uygulama kısmına geçmeden
- 28:49önce ufak bir güncelleme yapacağız.
- 28:51Biliyorsunuz bundan önceki videolarda
- 28:52tüm çalışmalarımızı STM32 Cube IDE
- 28:55içerisinde [müzik] yapıyorduk. Ancak ST
- 28:56firması STM32 Cube IDE 2.0 versiyonundan
- 28:59sonra CubeMX ve CubeIDE yapılarını
- 29:01birbirinden ayırdı. Aslında bu çok yeni
- 29:03bir durum değil. Bayağıdır bu şekilde
- 29:05ilerliyordu. Biz de bu videodan itibaren
- 29:07bunları ayrı bir program olarak
- 29:09kullanacağız. Ayrıca Python dilinde
- 29:10yazılmış bir yapay zeka modelini nasıl
- 29:13STM32'ye entegre edeceğimize bakalım.
- 29:15[müzik] Bunun için STM32 Cube IDE
- 29:17içerisinde bir Cube AI eklentisi var.
- 29:19Oradan yapılabiliyordu ve teknik olarak
- 29:21hala yapılabiliyor. Fakat ST bu kısmı
- 29:23artık güncellemeyeciğini ve yoluna STM32
- 29:25Cube AI yazılımı üzerinden devam
- 29:27edeceğini duyurdu. Ben de sistemime tüm
- 29:29bu programların en güncel sürümlerini
- 29:30kurdum. Bundan sonraki süreçte güncel
- 29:32versiyonlarla ilerleyeceğiz. Siz de
- 29:34CubeIDE, CubeMX ve CubeAI programlarını
- 29:36ST'nin resmi web sitesinden
- 29:38indirebilirsiniz. Gerekli linkleri
- 29:39açıklama kısmına bırakacağım. Bu
- 29:41uygulamada doğrudan kullanmayacağız ama
- 29:43işinize yarayacak STM32 Programmer ve
- 29:45CubeMX 2 yazılımlarını indirmenizi
- 29:47tavsiye ederim. Son olarak şunu da
- 29:48belirteyim. Daha önce birlikte
- 29:50yaptığımız tüm projeleri bu güncel
- 29:51versiyonlarda da sorunsuz bir şekilde
- 29:53çalıştırabiliyoruz. O zaman hadi
- 29:55başlayalım. STM32 Cube AI programımızı
- 29:57açıyoruz. Program açıldığında bizi böyle
- 29:59bir arayüz karşılıyor. Sol tarafta
- 30:01Settings ayarlar kısmı var. Öncelikle
- 30:03buraya göz atalım. Bu sayfada yapay zeka
- 30:05uygulamaları geliştirmek için gerekli
- 30:07olan yazılımlar ve bunların dosya
- 30:08yolları yer alıyor. Sırasıyla göz atacak
- 30:10olursak ST Edge AI Core. Arka planda
- 30:12çalışan derleme ve optimizasyon [müzik]
- 30:14katmanı. STM32 Cube AI kurarken
- 30:16sistemimize otomatik yüklenen kısım.
- 30:18STM32 Cube Programmer. Bu araç hem
- 30:20harici bir yazılım olarak
- 30:21kullanılabiliyor hem de STM32 Cube IDE
- 30:23içerisinde entegre olarak geliyor. Eğer
- 30:25harici olarak kurmazsanız sistem
- 30:27otomatik olarak CubeIDE içindeki sürüme
- 30:28bağlanabilir. STM32 CubeMX ve CubeMX 2
- 30:31olmak üzere iki farklı yapılandırma
- 30:33aracı seçeneğimiz var. Projelerimizde
- 30:34CubeMX'i kullanıyoruz. CubeMX 2'yi aktif
- 30:37olarak kullanmasak da önümüzdeki dönemde
- 30:38kademeli olarak CubeMX 2'ye geçileceğini
- 30:40düşünüyorum. Bu yüzden indirip aşina
- 30:42olmakta fayda var. Son olarak
- 30:43kodlarımızı yazacağımız IDE
- 30:44seçeneklerimiz [müzik] var.
- 30:45STM32CubeIDE, Keil ve IAR Embedded
- 30:48Workbench. STM32CubeIDE bizim de
- 30:50kullandığımız, ST'nin sunduğu tamamen
- 30:52ücretsiz IDE. [müzik] Keil ARM'ın resmi
- 30:54geliştirme ortamı. Sadece STM32 değil,
- 30:56Renesas, NXP gibi tüm ARM mimarilerini
- 30:59programlayabiliyor. Ancak ücretli bir
- 31:00yazılım. IAR Embedded Workbench sadece
- 31:03ARM değil, birçok mimarayı kapsayan
- 31:04yüksek kod optimizasyonuna ve
- 31:06uluslararası güvenlik sertifikalarına
- 31:08sahip endüstri standardı bir platform.
- 31:10Ancak bu da ücretli bir IDE. Biz
- 31:12projemizde STM32CubeIDE üzerinden devam
- 31:14edeceğiz. Ayarlar kısmı bu kadardı.
- 31:16Şimdi proje ekranına geri dönelim. Proje
- 31:18oluştura tıklıyorum. Açılan pencerede
- 31:20projemizin ismini giriyorum. Adı rakam
- 31:22olsun. Devam ediyorum. Target sayfası
- 31:23açılıyor. Burada kullandığımız
- 31:25Nucleo-F446RE
- 31:26kartını seçiyoruz. Kart ekranda belirdi.
- 31:29128 KB RAM ve 512 KB Flash olduğu burada
- 31:33belirtilmiş. [müzik] Bu bilgiler
- 31:34projemiz için önemli. Devam ediyorum.
- 31:36Burada C diline dönüştürülen yapay zeka
- 31:38kodlarımızın hangi yazılım programında
- 31:39çalışacağını seçiyoruz. STM32CubeIDE
- 31:42programını seçiyorum. Projemiz
- 31:43oluşturuldu. Yapay zeka modelimiz olan
- 31:45mnist_model.h5 dosyasını model file
- 31:48kısmına tıklayarak ekliyoruz. Yapay zeka
- 31:50modelimiz eklendi. Hemen altında [müzik]
- 31:52optimizasyon kısmı var. Burada
- 31:53seçenekler hafıza öncelikli mi yoksa
- 31:55zaman öncelikli mi olması, [müzik] bir
- 31:57de balans dengeli seçeneği var. Bu
- 31:58uygulamada balans seçeneğini
- 31:59kullanacağız. Devamında target kısmı
- 32:01var. İçerisinde memory pool yani bellek
- 32:03havuzu, RAM yerleşimi ve boyutunun
- 32:05[müzik] ayarlandığı kısım. Yanındaki
- 32:06ayar simgesine tıkladığımızda karşımıza
- 32:08böyle sayfa çıkıyor. Modelin
- 32:10ağırlıklarının ve aktivasyon
- 32:11tamponlarının mikrodenetleyicinin hangi
- 32:13RAM bölgesine yerleştirileceğini burada
- 32:14belirliyoruz. STM32F446RE
- 32:17için SRAM başlangıç adresi yazıyor.
- 32:19Harici bir RAM kullanmayacağımız için
- 32:21burada herhangi bir işlem yapmayıp
- 32:22kapatıyoruz. Validation kısmı Cube
- 32:24AI'dan çıktı almadan önce yapay zeka
- 32:26modelimizi bizim burada ayarladığımız
- 32:28parametrelere uygun olacak şekilde test
- 32:30ediyor. Alttaki mod kısmında cihazda mı
- 32:32yoksa bilgisayarda mı test edileceği
- 32:34soruluyor. Benim tercihim cihazda test
- 32:36edilmesi, ama dikkat bunu seçip teste
- 32:38başlatırsanız içindeki [müzik] kodları
- 32:39silecektir. O da aklınızda bulunsun. Bir
- 32:41de advanced setting kısmı var. Burada
- 32:43generate edilen C modelinin adını
- 32:45soruyor. Herhangi bir şey yazmazsak
- 32:47network olarak kalacak. Ben böyle
- 32:48bırakıyorum. Hemen altında STM32Cube AI
- 32:51uygulamasının önemli bir kısmı olan
- 32:53sıkıştırma seviyesi bölümü. Python'da
- 32:54hazırladığımız yapay zeka modelinin
- 32:56çıktısı [müzik] en direkt STM32'de zaten
- 32:58çalışmaz. Bunu C koduna dönüştüreceğiz.
- 33:00Ama C koduna dönüştürsek bile çoğu zaman
- 33:03hafıza sıkıntısı çekeceğiz. Örneğin bu
- 33:05uygulamada sıkıştırma olmazsa veya az
- 33:07olursa hafıza yetersizliğinden dolayı
- 33:09proje hata verecek. Bundan ötürü [müzik]
- 33:10sıkıştırmayı yüksek seçiyorum. Devamında
- 33:12farklı ayar parametreleri var. Bunları
- 33:14şimdilik olduğu gibi bırakıyoruz.
- 33:15İlerleyen projelerde kısım kısım
- 33:17değiniriz. Kaydet deyip bu pencereyi
- 33:18kapatıyorum. Projemiz test etmeye hazır.
- 33:20[müzik] Kartımız bilgisayara bağlı. Run
- 33:22butonuna basıyorum ve karşımıza bir
- 33:23uyarı ekranı çıkıyor. Cube MX programı
- 33:25arka planda çalışacak, onunla etkileşime
- 33:27girmeyin diyor. Tabii efendim deyip
- 33:28kapatıyoruz. Bu kısım biraz zaman
- 33:29alıyor. Bu süre zarfında programa ve
- 33:31karta ellemiyoruz. Test kısmı başarıyla
- 33:33tamamlandı. Şimdi çıktıyı inceleyelim.
- 33:35Context kısmında kullandığımız kartı,
- 33:37yapay zeka modelinin giriş ve çıkış
- 33:39parametrelerini, yaptığımız
- 33:40optimizasyonları ve ayarları
- 33:41görebilirsiniz. [müzik]
- 33:42Bunları zaten biz belirledik. Asıl
- 33:44önemli olan nokta ise çıktı kısmı.
- 33:46Sonuçlara baktığımızda yapay zeka
- 33:48modelimiz [müzik] flash bellekte 345 KB,
- 33:50RAM'de ise 88 KB yer kaplıyor. Bunu
- 33:53grafikler üzerinden de net bir şekilde
- 33:54görebilirsiniz. Modelimizin [müzik] bir
- 33:56veriyi tahmin etmesi yaklaşık 63 ms
- 33:58sürüyor ve saniyede 15 ila 16 tahmin
- 34:00gerçekleştirebiliyor. Burada da modelin
- 34:02sistemle olan uyumluluk oranı
- 34:03belirtilmiş. Validation yani doğrulama
- 34:05kısmına baktığımızda tahmin başarısı ve
- 34:07doğruluk oranı %90 olarak verilmiş. Bu
- 34:09değer uygulamamız için oldukça yeterli.
- 34:11[müzik] Memory pools kısmında RAM
- 34:13adresinin nerede başlayacağı gösterilmiş
- 34:15ve tekrar kullanılan RAM miktarı
- 34:17belirtilmiş. Şimdi C kodumuzu
- 34:18oluşturalım. Generate code butonuna
- 34:20bastığımızda karşımıza bu uyarı
- 34:21penceresi çıkıyor. Burada proje seçeneği
- 34:23olarak uygulamanın gerçek bir proje için
- 34:26mi yoksa doğrulama testi için mi
- 34:27olduğunu soruyor. Application uygulama
- 34:29seçeneği işaretli olarak kalacak.
- 34:31Devamında ise kod üretim tipini soruyor.
- 34:33Sadece C kodu mu üretilsin yoksa
- 34:35sıfırdan yeni bir proje mi oluştursun?
- 34:37Bizim halihazırda bir projemiz olduğu
- 34:38için sadece C kodu üretme seçeneğini
- 34:40[müzik] işaretli bırakıyoruz. Generate
- 34:41butonuna basıyorum ve kod üretimi
- 34:43başlıyor. İşlem tamamlandı. Kodu
- 34:45masaüstüne [müzik] indiriyoruz. Kaydet
- 34:46butonuna basarak indirme işlemini
- 34:48tamamlıyorum. STM32CubeAI ile işimiz
- 34:50bitti. Artık bu programı kapatabiliriz.
- 34:52Gördüğünüz gibi ürettiğimiz kod
- 34:54masaüstüne sıkıştırılmış bir zip dosyası
- 34:56olarak geldi. Şimdi bir önceki SPI TFT
- 34:58uygulamasında yaptığımız projemizi yeni
- 35:00versiyon CubeMX programında açalım.
- 35:02CubeMX açıldıktan sonra file kısmından
- 35:04var olan bir projeyi açacağımız için
- 35:06load project diyoruz. Açılan pencereden
- 35:08projemizi .ioc dosyasını seçip open
- 35:11butonuna basıyoruz ve projemizin CubeMX
- 35:13arayüzü açılıyor. Gördüğünüz gibi eski
- 35:15versiyona nasıl ayarladıysak burada da
- 35:16aynı şekilde geldi. Eğer sıfırdan bir
- 35:18proje oluşturuyor olsaydık project
- 35:19manager kısmından projemizin dosya
- 35:21yolunu ve hangi IDE'de çalıştırılacağını
- 35:23seçerek oluşturabilirdik. Fakat var olan
- 35:25bir proje üzerinden ilerlediğimiz için
- 35:27bu kısımda herhangi bir değişiklik
- 35:28[müzik] yapmıyorum. Generate code
- 35:29butonuna basıyorum ve CubeMX'te
- 35:31yaptığımız son güncellemeleri kod
- 35:33kısmına aktarıyor. Biz herhangi bir
- 35:34değişiklik yapmadık ama olsun. Bu
- 35:35aşamaları da birlikte görmüş olalım.
- 35:37İşlem tamamlanınca karşımıza çıkan ekran
- 35:39da open project dersek STM32CubeIDE'yi
- 35:40[müzik]
- 35:41açar. Dosya yolunu kontrol ediyoruz.
- 35:42Doğruysa launch butonuna tıklayıp
- 35:44programımızı açıyoruz. Programımız
- 35:45açıldı. Gördüğünüz gibi kodlarımız eski
- 35:47projemizde olduğu gibi geldi. İsterseniz
- 35:49CubeMX ve CubeIDE'yi kapatıp direkt
- 35:51STM32CubeIDE üzerinden [müzik] de
- 35:53açabiliriz. Gördüğünüz gibi eski
- 35:54projemiz programın yeni versiyonunda da
- 35:56problemsiz bir şekilde çalışıyor. Şimdi
- 35:58ekranı küçültüp yapay zeka
- 35:59kütüphanelerimizi [müzik] projemize
- 36:01ekleyelim. Yapay zeka kodlarımızı
- 36:02sıkıştırılmış dosyanın içerisinden
- 36:04çıkartıyoruz. Dosyayı açtığımızda
- 36:06önümüze üç tane klasör çıkıyor. Bu üç
- 36:08dosyayı da sürükleyip kendi projemize
- 36:10atıyoruz. Çıkan uyarı ekranında dosya ve
- 36:12klasörleri kopyalama seçeneği işaretli
- 36:14olacak şekilde kalsın. Ok butonuna
- 36:16basıyoruz ve dosyalarımız kopyalandı.
- 36:18Kopyalanan dosyalar içerisinde AI, AI
- 36:20generated network ve middlewares
- 36:22klasörleri yer alıyor. Bu klasörlerin
- 36:24işlevleri [müzik] kısaca şunlardır. AI
- 36:26yapay zeka modelinin çalışması için
- 36:28gereken temel çalışma zamanı runtime
- 36:30kütüphanelerini ve çekirdek
- 36:31fonksiyonlarını barındırır. AI generated
- 36:33network STM32CubeAI tarafından
- 36:35modelimizin katılımı ile otomatik olarak
- 36:37üretilen yapay zeka ağının mimarisini
- 36:40>> [müzik]
- 36:40>> ve ağırlık verilerini içeren kaynak
- 36:41kodları barındırır. Middlewares STM32
- 36:45donanım ve yazılım katmanları arasında
- 36:46köprü görevi gören ara katılım
- 36:48kütüphanelerini içerir. Şimdi bu
- 36:50kopyaladığımız dosyaların yollarını
- 36:51projemize tanıtalım. İçerisindeki .c ve
- 36:54.h uzantılı dosyaları ayrı ayrı
- 36:56tanıtmamız gerekiyor. Projenin üstüne
- 36:58gelip sağ tık yapıyoruz ve properties
- 37:00seçeneğine basıyoruz. Açılan pencerenin
- 37:01sol tarafında C/C++ General altındaki
- 37:04Path and Symbols seçeneğine tıklıyorum.
- 37:06Source Location kısmından .c uzantılı
- 37:09dosyalarımızı ekleyeceğiz. Dosya ekleme
- 37:11butonuna basarak .c uzantılı
- 37:13dosyalarımızı tek tek ekliyorum.
- 37:17.c uzantılı dosyalar tamam. Şimdi .h
- 37:19uzantılı dosyalar için Includes kısmına
- 37:21geçiyorum. Benzer şekilde ekle butonuna
- 37:23basıyorum. Çıkan ekranda Workspace
- 37:25butonuna [müzik] tıklıyorum. Burada
- 37:26açılan pencerede projemizi de
- 37:27görebiliyoruz. .h uzantılı dosyalarımızı
- 37:30bulup ekliyoruz. Ok butonuna bastıktan
- 37:32sonra tüm kutucukları işaretliyoruz.
- 37:34Ardından tekrar ok butonuna basarak
- 37:35ekleme işlemimizi tamamlıyoruz. Diğer .h
- 37:38uzantılı dosyaların bulunduğu klasörleri
- 37:39de aynı şekilde ekliyoruz.
- 37:44.c ve .h dosyaları dışında lib klasörü
- 37:48içerisinde yer alan .a uzantılı
- 37:50dosyamızı da tanıtmamız gerekiyor. Bunun
- 37:51için de sol tarafta C/C++ Build kısmına
- 37:54tıklıyoruz. Açılan seçeneklerden
- 37:56Settings kısmına tıklıyoruz. Önümüze
- 37:58gelen yeni seçeneklerden alttaki
- 37:59Libraries kısmına tıklıyorum. Sağ
- 38:01tarafta iki bölme beliriyor. Alttaki
- 38:02kısımda dosya ekleme butonuna basıyorum
- 38:04ve karşıma .a uzantılı dosyanın yolu
- 38:06geliyor. Herhangi bir değişiklik
- 38:08yapmadan ok butonuna basıp ekliyorum.
- 38:10Benzer şekilde üstteki bölmenin dosya
- 38:12ekleme butonuna basıyorum ve açılan
- 38:13pencerede çıkan uzantıyı silip başına
- 38:15iki nokta koyup dosyanın adını
- 38:17yazıyorum.
- 38:18Sonra ok butonuna basarak dosyayı
- 38:19ekliyorum. Son olarak Apply and Close
- 38:21butonuna basarak işlemi tamamlıyoruz.
- 38:23Kodumuzu derleyip kontrol edelim, eksik
- 38:25bir nokta var mı diye.
- 38:26Kodumuz derlendi. Hata yok. Sadece iki
- 38:28tane uyarı var. Yani projemiz problemsiz
- 38:30bir şekilde derleniyor. Şimdi kod
- 38:31kısmına geçebiliriz. Kod kısmına önceki
- 38:34projeden kalan kodları silerek
- 38:35başlıyorum.
- 38:36Main.c içerisinde yazdıklarımızın
- 38:38tamamını siliyoruz. AI klasörü içindeki
- 38:41app klasöründe uygulamayı kolaylıkla
- 38:43yapabilmemiz için hazır üretilmiş bir
- 38:45uygulama şablonu mevcut. Bunu
- 38:46kullanacağız. Bu dosyalar appx cube ai.c
- 38:49ve appx cube ai.h dosyaları. Şimdi
- 38:52bunları açalım. Bu projemiz için gereken
- 38:54kodları tek tek yazmak aşırı zaman
- 38:56alacağından ötürü ben bunları önceden
- 38:57yazdım. Şimdi parça parça kopyalayalım
- 38:59ve üzerinde konuşalım. appx cube ai.c
- 39:02içerisine kütüphanelerimizi ekliyoruz.
- 39:04Bu kütüphaneler dokunmatik TFT ekranı
- 39:06kontrol ettiğimiz kütüphanelerdir.
- 39:08Burada fark ettiyseniz testimg.h örnek
- 39:10resim kütüphanesini eklemedim. Çünkü
- 39:12hafızada çok yer kaplıyor ve projemiz
- 39:14için gerekli değil. Devam ediyorum
- 39:15aşağıya doğru. Entry points yazan kısmın
- 39:17altına global değişkenlerimizi
- 39:19kopyalıyorum. Yanlarına açıklamalarını
- 39:20yazdım. AI input buffer yapay zekanın 28
- 39:23x 28'lik girdi matrisi. [müzik] Hemen
- 39:25altındaki değişken bulunan sonucun
- 39:27doğruluk oranı. AI run flag bunu kontrol
- 39:29amaçlı koydum. Bu bayrak ile yapay zeka
- 39:31kodlarını çalıştıracağız. Son olarak
- 39:33tahmin edilen rakamın değişkeni.
- 39:34Değişkenlerin altına fonksiyonlarımızın
- 39:36gövdelerini kopyalıyorum. Burada
- 39:37kafamızda kalem kağıt üzerinde hayali
- 39:39bir çalışma sayfası oluşturalım. Bu
- 39:41sayfada ekranda gördüğünüz gibi bir
- 39:42çalışma sayfası çizdim. Şimdi bunu
- 39:44kodlarla ekrana uygulayalım. Bizim
- 39:45ekranımızda içi boş kutular olacak. Onu
- 39:47çizmek için yardımcı bir fonksiyon
- 39:49yazdım. Bunu kopyalıyorum. Butonlar için
- 39:51içi dolu kutular olacak. Bunun için
- 39:52yardımcı fonksiyonu kopyalıyorum. Ekrana
- 39:54çizdiğimiz rakamın yapay zekaya
- 39:56gönderilen 28 x 28 piksel haline ekrana
- 39:59çizen fonksiyonu kopyalıyorum. Devamında
- 40:00ekranı bölümlere ayıran, butonları
- 40:02ekleyen ana arayüz fonksiyonunu
- 40:04kopyalıyorum. Burada sırasıyla ekranı
- 40:06ikiye bölen çizgi, üst bölümde rakamı
- 40:08yazacağımız bölüm ve tahmin işlemi
- 40:09başlasın komutunu göndereceğimiz AI
- 40:11butonu, alt bölümde 28 x 28 piksele
- 40:14çevrilmiş rakamın yazılacağı kısım ve
- 40:16yanında AI tahmin sonucunun yazacağı
- 40:18kısım. En altta da sayfayı yenileyecek
- 40:20yenile butonu olacak. Fonksiyonları
- 40:22kopyalamaya devam ediyorum. Çizdiğimiz
- 40:23rakamı yapay zekanın daha doğru tahmin
- 40:26etmesi için merkezleyen fonksiyon.
- 40:29Devamında tahmin edilen sonucu ekranda
- 40:31belirlediğimiz bölgeye yazan fonksiyon.
- 40:33Alt tarafında da tahmin edilen sonucun
- 40:35doğruluk oranını yazdıran fonksiyon.
- 40:36Devamında TFT ekranı başlatan, ardından
- 40:39ekranın taslağını çizen init [müzik]
- 40:40fonksiyonunu ekliyoruz. Devamında ekrana
- 40:43rakamı çizerken dokunduğumuz noktayı
- 40:45algılayıp ekranın o noktasının pikselini
- 40:47değiştirecek fonksiyonu ekliyoruz. Bizim
- 40:49ekleyeceğimiz fonksiyonlar bu kadardı.
- 40:50Şimdi halihazırda var olan
- 40:52fonksiyonların içerisine eklemeler ve
- 40:54değişiklikler yapacağız. Aşağıya doğru
- 40:56indiğimizde AI run fonksiyonu var. Bunun
- 40:58sonunda 5 saniye gecikme koymuşlar.
- 41:00Akışı yavaşlattığı için bunu
- 41:01kapatıyorum. Hemen altında AI kısmını
- 41:03girdi fonksiyonu var. Bu kısmın
- 41:05içerisine elimizdeki rakam matris
- 41:06tablosunu vereceğiz. Bunu direkt
- 41:08kopyalayıp değiştiriyorum. Hemen
- 41:10altındaki de çıktı fonksiyonu. Buradan
- 41:11da yapay zekadan gelen çıktıyı alacağız.
- 41:13Yapay zeka modelinin en yüksek [müzik]
- 41:15skora sahip çıktısını bulup alıyor ve
- 41:17TFT ekrana yazdırıyoruz. Bu fonksiyonu
- 41:19da kopyalayıp değiştiriyorum. Kodda
- 41:21aşağıya doğru devam ettiğimizde main
- 41:23loop fonksiyonu var. Bunu da kendi
- 41:24kullanacağımız senaryoya göre
- 41:25değiştiriyorum. Önce bizim rakam yazma
- 41:27fonksiyonumuz çalışıyor. Sonra AI
- 41:29butonuna basarsam yapay zeka kısmı işin
- 41:31içine giriyor ve çizdiğimiz rakamı
- 41:32tahmin ediyor. Aşağıya doğru devam
- 41:34ettiğimde yapay zeka kodlarının init
- 41:36[müzik] fonksiyonu var. Bunu zaten
- 41:37çağıracağız. Onun için kendi TFT ekran
- 41:39init fonksiyonumu da bunun içine
- 41:41ekliyorum. Bu sayfada işimiz bitti.
- 41:43Şimdi fonksiyon prototiplerimizi eklemek
- 41:45için [müzik] appxai.h
- 41:47sayfasına geçip fonksiyonun
- 41:49prototiplerini kopyalıyorum. Bu
- 41:50sayfadaki işimiz de bu kadardı. Şimdi
- 41:52ana sayfa olan main.c [müzik] sayfasına
- 41:54geçelim. Burada yapay zeka kütüphanemiz
- 41:56olan appxai.h
- 41:58kütüphanesini ekleyelim. Sonra int main
- 42:00içerisinde while döngüsüne girmeden önce
- 42:02[müzik] AI init fonksiyonumuzu
- 42:04çağırıyoruz. While içerisine de STM32
- 42:07Cube AI Studio AI [müzik] process
- 42:08fonksiyonumuzu kopyalıyorum. Şimdi
- 42:10kodumuzu bu haliyle derlediğimizde hata
- 42:12verecek. UART'ın tanımlanması ile ilgili
- 42:14olarak AI kütüphanesi [müzik] ile main.c
- 42:16içerisindeki tanım çakışıyor. Bunu
- 42:18düzeltmemiz gerekecek. Bu da middlewares
- 42:20klasörünün altındaki SD klasörünün
- 42:22altındaki AI klasörünün altındaki misc
- 42:24[müzik] klasörünün altındaki inch
- 42:26klasörünün içinde AI device adapter.h
- 42:29sayfası var. Onu açalım. Aşağıya doğru
- 42:31indiğimizde 655. [müzik]
- 42:32satırda extern ile tanımlanmış satırı
- 42:34yoruma alıp bizimki ile uyumlu olacak
- 42:36şekilde yeniden tanımlıyorum. Bu
- 42:37değişikliği de [müzik] yaptıktan sonra
- 42:39artık derleyebiliriz. Ve gördüğünüz gibi
- 42:42hata kalmadı. Şimdi kodumuzu karta
- 42:43yükleyebiliriz. [müzik]
- 42:46Kodumuz başarıyla yüklendi. Şimdi şov
- 42:48zamanı. Ekranımız açılıyor. Kod kısmında
- 42:50oluşturduğumuz ana şablon karşımıza
- 42:51geldi. Şimdi rakamları yazalım. 9
- 42:54yazdım. Mavi AI butonuna basıyorum ve
- 42:56%96 güven skoruyla doğru tahmin etti.
- 42:59Kırmızı clear butonuna basınca ekranı
- 43:01yeniliyor ve yeni rakam giriyorum. Şimdi
- 43:02rakamları karışık şekilde yazıyorum.
- 43:074 rakamını farklılık olsun dijital saat
- 43:09[müzik] şeklinde çiziyorum. Onu da doğru
- 43:10tahmin etti.
- 43:16Rakamları rastgele ve farklı stillerde
- 43:18yazmama rağmen model hepsini doğru
- 43:19bildi. Uygulama testimizi de başarılı
- 43:22tamamlamış olduk. Evet arkadaşlar
- 43:24böylece bir yapay zeka uygulamasının
- 43:25sonuna gelmiş olduk. Bu uygulama
- 43:27hakkındaki düşüncelerinizi gerçekten
- 43:29merak ediyorum. Eksik veya fazla
- 43:30olduğunu düşündüğünüz bir kısım ya da
- 43:32eklemek istediğiniz bir fikir [müzik]
- 43:33varsa yorum kısmında mutlaka yazın.
- 43:35Hepinize iyi çalışmalar dilerim.
- 43:41>> [müzik]
About this transcript
This page contains the full transcript of YAPAY ZEKAYI MİKRODENETLEYİCİYE SIĞDIRDIK! | STM32CUBE.AI by Mühendislik Projeleri, generated from the public captions YouTube serves with the video. The transcript has 6,792 words across 1,396 segments, with the original timestamps preserved so you can click any line to jump to that moment in the embedded player.
What you can do with it
Use the transcript to take notes, quote the speaker, build a study guide, generate a summary with ChatGPT or Claude via the YouTube Summary tool, or export it as a timed subtitle file with YouTube to SRT. You can also re-open it in the transcriber to choose a caption track available on the video.
Free YouTube transcript tool
YouTube2Text is a free YouTube transcript generator — no signup, no daily limit. Paste any YouTube link and get the full transcript instantly, with timestamps, click-to-jump, caption language selection, AI prompts for ChatGPT, Claude, and Gemini, and exports to TXT, SRT, VTT, or Markdown.