<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://program.sonsuz.us/feed.xml" rel="self" type="application/atom+xml" /><link href="https://program.sonsuz.us/" rel="alternate" type="text/html" /><updated>2026-10-26T18:05:41+00:00</updated><id>https://program.sonsuz.us/feed.xml</id><title type="html">SonsuzUs</title><subtitle>Programlama ve Yazılım</subtitle><author><name>Sonsuz Us</name></author><entry><title type="html">Akıllı Tarımda Edge Computing: Tarlanın Kendi Beyni</title><link href="https://program.sonsuz.us/posts/akilli-tarimda-edge-computing-tarlanin-kendi-beyni/" rel="alternate" type="text/html" title="Akıllı Tarımda Edge Computing: Tarlanın Kendi Beyni" /><published>2026-10-26T00:00:00+00:00</published><updated>2026-10-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/akilli-tarimda-edge-computing-tarlanin-kendi-beyni</id><content type="html" xml:base="https://program.sonsuz.us/posts/akilli-tarimda-edge-computing-tarlanin-kendi-beyni/"><![CDATA[<p><img src="/img/akilli-tarimda-edge-45.svg" alt="akilli-tarimda-edge-45" /></p>

<p>Toprak nemini ölçen bir sensörün karar vermek için kilometrelerce uzaktaki bulut sunucusunu beklediğini düşünün. Bu sırada bağlantı kesilir, yanıt gecikir ve susuz kalan domatesler sessizce dram yaşar! Edge computing, sensör verisini doğrudan tarladaki ağ geçidi, mikrodenetleyici veya mini bilgisayar üzerinde işleyerek bu sorunu çözer. Böylece tarımsal sistemler daha hızlı, dayanıklı ve ekonomik hâle gelir.</p>

<p>``</p>

<h2 id="edge-computing-nedir">Edge computing nedir?</h2>

<p>Geleneksel IoT mimarisinde sensörlerden alınan ham veriler internete aktarılır, bulutta analiz edilir ve sonuç tekrar sahadaki cihaza gönderilir. Edge computing yaklaşımında ise hesaplama, verinin üretildiği noktaya mümkün olduğunca yaklaştırılır. Bir Raspberry Pi, endüstriyel ağ geçidi veya yapay zekâ destekli kamera bu “kenar” görevini üstlenebilir.</p>

<p>Bir sulama kararının toplam gecikmesini basitçe şöyle gösterebiliriz:</p>

\[T_{toplam} = T_{iletim} + T_{işleme} + T_{yanıt}\]

<p>Bulut tabanlı yapıda iletim ve yanıt süreleri internet kalitesine bağlıdır. Edge cihazında ise veri yerel işlendiği için $T_{iletim}$ büyük ölçüde azalır. Milisaniyelerin kritik olduğu don, yangın veya hayvan hareketi tespiti gibi senaryolarda bu fark oldukça önemlidir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Bulut bilişim</th>
      <th>Edge computing</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Gecikme</td>
      <td>İnternet bağlantısına bağlı</td>
      <td>Genellikle çok düşük</td>
    </tr>
    <tr>
      <td>Bant genişliği</td>
      <td>Ham veri nedeniyle yüksek</td>
      <td>Özet veriyle düşük</td>
    </tr>
    <tr>
      <td>Çevrimdışı çalışma</td>
      <td>Sınırlı</td>
      <td>Büyük ölçüde mümkün</td>
    </tr>
    <tr>
      <td>Veri mahremiyeti</td>
      <td>Veri dış sunucuya gider</td>
      <td>Veri sahada tutulabilir</td>
    </tr>
    <tr>
      <td>İşlem kapasitesi</td>
      <td>Çok yüksek</td>
      <td>Donanıma göre sınırlı</td>
    </tr>
  </tbody>
</table>

<h2 id="tarlada-veri-nasıl-işlenir">Tarlada veri nasıl işlenir?</h2>

<p>Bir akıllı sulama sisteminde nem, sıcaklık ve yağış sensörleri belirli aralıklarla ölçüm yapar. Edge cihazı önce hatalı okumaları filtreler, ardından eşik veya makine öğrenmesi modeline göre karar verir. Yalnızca günlük ortalamalar, uyarılar ve cihaz sağlık bilgileri buluta gönderilir.</p>

<p>Örneğin, nem sensöründeki ani sıçramaları yumuşatmak için hareketli ortalama kullanılabilir:</p>

\[\bar{x}_t = \frac{1}{n}\sum_{i=0}^{n-1}x_{t-i}\]

<p>Burada $n$, dikkate alınan son ölçüm sayısıdır. Bu yöntem, tek bir hatalı değerin sulama pompasını gereksiz yere çalıştırmasını önler.</p>

<p>Aşağıdaki Python kodu, beş nem ölçümünün ortalamasını hesaplayıp yerel bir sulama kararı üretir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">statistics</span> <span class="kn">import</span> <span class="n">mean</span>

<span class="n">NEM_ESIGI</span> <span class="o">=</span> <span class="mi">35</span>


<span class="k">def</span> <span class="nf">sulama_karari</span><span class="p">(</span><span class="n">olcumler</span><span class="p">,</span> <span class="n">yagmur_bekleniyor</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
    <span class="n">filtrelenmis_nem</span> <span class="o">=</span> <span class="nf">mean</span><span class="p">(</span><span class="n">olcumler</span><span class="p">[</span><span class="o">-</span><span class="mi">5</span><span class="p">:])</span>

    <span class="k">if</span> <span class="n">filtrelenmis_nem</span> <span class="o">&lt;</span> <span class="n">NEM_ESIGI</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">yagmur_bekleniyor</span><span class="p">:</span>
        <span class="k">return</span> <span class="sh">"</span><span class="s">Pompayı çalıştır</span><span class="sh">"</span>
    <span class="k">return</span> <span class="sh">"</span><span class="s">Sulama gerekmiyor</span><span class="sh">"</span>

<span class="n">nem_verileri</span> <span class="o">=</span> <span class="p">[</span><span class="mi">37</span><span class="p">,</span> <span class="mi">34</span><span class="p">,</span> <span class="mi">33</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="mi">31</span><span class="p">]</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">sulama_karari</span><span class="p">(</span><span class="n">nem_verileri</span><span class="p">))</span>
</code></pre></div></div>

<p>Kod, son beş değeri kullanarak sensör gürültüsünün etkisini azaltır. Gerçek sistemde sonuç bir röle üzerinden pompayı kontrol edebilir. Yağış tahmini önceden edge cihazına aktarılmışsa gereksiz sulama da engellenir.</p>

<h2 id="yapay-zekâ-tarlanın-kenarına-taşınırsa">Yapay zekâ tarlanın kenarına taşınırsa</h2>

<p>Edge cihazları yalnızca eşik kontrolü yapmaz. Sıkıştırılmış görüntü sınıflandırma modelleriyle yaprak hastalıkları, yabancı otlar veya zararlılar kameradan tespit edilebilir. Kamera görüntüsünün tamamını buluta göndermek yerine yalnızca “üç bitkide hastalık şüphesi var” sonucu iletilir. Bu yaklaşım hem bant genişliğini hem de depolama maliyetini düşürür.</p>

<p>Ancak edge donanımının enerji, bellek ve işlem gücü sınırlıdır. Model küçültme, niceleme ve uyku modları bu nedenle önem kazanır. Güneş paneliyle çalışan bir cihazda doğruluk kadar enerji tüketimi de başarı ölçütüdür:</p>

\[Verim = \frac{Doğru\ karar\ sayısı}{Tüketilen\ enerji}\]

<h2 id="hibrit-yaklaşım-en-güçlü-seçenek">Hibrit yaklaşım en güçlü seçenek</h2>

<p>Edge computing bulutun rakibi değil, tamamlayıcısıdır. Anlık sulama ve alarm kararları sahada alınırken uzun dönemli verim analizi, model eğitimi ve filo yönetimi bulutta gerçekleştirilebilir. Sonuçta çiftçi bağlantı kesilse bile çalışan, kritik veriye hızlı tepki veren ve internet faturasını kabartmayan bir sisteme sahip olur. Kısacası tarla yalnızca ürün değil, karar da üretmeye başlar.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="akıllı tarım" /><category term="edge computing" /><category term="nesnelerin interneti" /><category term="sensörler" /><category term="yapay zeka" /><category term="iot" /><summary type="html"><![CDATA[Toprak nemini ölçen bir sensörün karar vermek için kilometrelerce uzaktaki bulut sunucusunu beklediğini düşünün. Bu sırada bağlantı kesilir, yanıt gecikir ve susuz kalan domatesler sessizce dram yaşar! Edge computing, sensör verisini doğrudan tarladaki ağ geçidi, mikrodenetleyici veya mini bilgisayar üzerinde işleyerek bu sorunu çözer. Böylece tarımsal sistemler daha hızlı, dayanıklı ve ekonomik hâle gelir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/akilli-tarimda-edge-45.png" /><media:content medium="image" url="https://program.sonsuz.us/img/akilli-tarimda-edge-45.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Bilgisayarlı Tomografinin Matematiği: Vücudun İçini Kesit Kesit Yeniden Oluşturmak</title><link href="https://program.sonsuz.us/posts/bilgisayarli-tomografinin-matematigi-vucudun-icini-kesit-kesit-yeniden-olusturmak/" rel="alternate" type="text/html" title="Bilgisayarlı Tomografinin Matematiği: Vücudun İçini Kesit Kesit Yeniden Oluşturmak" /><published>2026-10-26T00:00:00+00:00</published><updated>2026-10-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/bilgisayarli-tomografinin-matematigi-vucudun-icini-kesit-kesit-yeniden-olusturmak</id><content type="html" xml:base="https://program.sonsuz.us/posts/bilgisayarli-tomografinin-matematigi-vucudun-icini-kesit-kesit-yeniden-olusturmak/"><![CDATA[<p>Bir bilgisayarlı tomografi cihazı, vücudun içine yerleştirilmiş görünmez bir fotoğraf makinesi değildir. Aslında farklı açılardan çok sayıda X-ışını ölçümü yapar ve bu ölçümlerin arkasındaki matematiksel bulmacayı çözerek kesit görüntüleri üretir. Başka bir deyişle cihaz, doğrudan görüntü çekmek yerine gölgelerden üç boyutlu bir hikâye yazar.</p>

<p>``</p>

<h2 id="x-ışınları-bize-ne-söyler">X-ışınları bize ne söyler?</h2>

<p>X-ışını demeti vücuttan geçerken kemik, kas, yağ ve hava tarafından farklı oranlarda soğurulur. Bu davranış yaklaşık olarak Beer–Lambert yasasıyla açıklanır:</p>

\[I = I_0 e^{-\int_L \mu(x,y)\,ds}\]

<p>Burada $I_0$ başlangıçtaki, $I$ dedektöre ulaşan ışın şiddetidir. $\mu(x,y)$ ise dokunun X-ışınını ne kadar zayıflattığını gösteren doğrusal soğurma katsayısıdır. İntegral, ışının izlediği $L$ yolu boyunca karşılaştığı bütün dokuların etkisini toplar.</p>

<p>Denklemin logaritmasını aldığımızda daha kullanışlı bir ölçüm elde ederiz:</p>

\[p = -\ln\left(\frac{I}{I_0}\right)=\int_L \mu(x,y)\,ds\]

<p>Yani dedektör, ışının geçtiği çizgi üzerindeki piksel değerlerinin toplamına benzer bir bilgi sağlar. Ancak tek bir toplamla hangi dokunun nerede olduğunu bilemeyiz. Bir alışveriş fişinin yalnızca toplam tutarını görüp sepetteki ürünleri tahmin etmeye çalışmak gibi!</p>

<h2 id="radon-dönüşümü-gölgelerin-kataloğu">Radon dönüşümü: Gölgelerin kataloğu</h2>

<p>Cihaz, X-ışını tüpünü hastanın çevresinde döndürerek farklı açılardan ölçümler toplar. Bir nesnenin belirli açılardaki çizgisel integrallerini hesaplayan matematiksel işleme <strong>Radon dönüşümü</strong> denir:</p>

\[R(\theta,s)=\int\!\!\int \mu(x,y)\,\delta(s-x\cos\theta-y\sin\theta)\,dx\,dy\]

<p>Burada $\theta$ tarama açısını, $s$ ise ışının merkezden uzaklığını belirtir. Bütün açılardan gelen ölçümler yan yana dizildiğinde <strong>sinogram</strong> adı verilen dalgalı bir görüntü oluşur. Noktasal bir nesne sinogramda sinüs eğrisi çizdiği için bu isim oldukça yerindedir.</p>

<table>
  <thead>
    <tr>
      <th>Kavram</th>
      <th>Girdi</th>
      <th>Çıktı</th>
      <th>Benzetme</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Radon dönüşümü</td>
      <td>Kesit görüntüsü</td>
      <td>Projeksiyonlar</td>
      <td>Nesneden gölge üretmek</td>
    </tr>
    <tr>
      <td>Ters Radon dönüşümü</td>
      <td>Projeksiyonlar</td>
      <td>Kesit görüntüsü</td>
      <td>Gölgelerden nesneyi bulmak</td>
    </tr>
    <tr>
      <td>Sinogram</td>
      <td>Tüm açısal ölçümler</td>
      <td>Ham veri haritası</td>
      <td>Gölgelerin kataloğu</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/bilgisayarli-tomografinin-matematigi-82.svg" alt="bilgisayarli-tomografinin-matematigi-82" /></p>

<h2 id="geri-projeksiyon-neden-tek-başına-yetmez">Geri projeksiyon neden tek başına yetmez?</h2>

<p>Basit geri projeksiyonda her ölçüm, geldiği doğrultu boyunca görüntüye geri yayılır. Çok sayıda açı birleştirildiğinde nesne ortaya çıkar; fakat sonuç bulanıktır. Çünkü tek bir ölçüm, ait olduğu çizginin tamamına eşit biçimde dağıtılmıştır.</p>

<p><strong>Filtrelenmiş geri projeksiyon</strong> bu sorunu azaltır. Önce projeksiyonlara yüksek frekansları güçlendiren bir rampa filtresi uygulanır, ardından veriler görüntü düzlemine geri taşınır:</p>

\[\mu(x,y)=\int_0^\pi \widetilde{p}_\theta(x\cos\theta+y\sin\theta)\,d\theta\]

<p>Buradaki $\widetilde{p}_\theta$, filtrelenmiş projeksiyondur. Filtre keskinliği artırırken gürültüyü de büyütebilir; dolayısıyla görüntü kalitesi ile radyasyon dozu arasında dikkatli bir denge kurulur.</p>

<h2 id="küçük-bir-python-deneyi">Küçük bir Python deneyi</h2>

<p>Aşağıdaki örnek, yapay bir kesitin projeksiyonlarını üretir ve filtrelenmiş geri projeksiyonla görüntüyü yeniden oluşturur:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">skimage.data</span> <span class="kn">import</span> <span class="n">shepp_logan_phantom</span>
<span class="kn">from</span> <span class="n">skimage.transform</span> <span class="kn">import</span> <span class="n">radon</span><span class="p">,</span> <span class="n">iradon</span><span class="p">,</span> <span class="n">resize</span>
<span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>

<span class="c1"># İnsan başına benzeyen standart test kesiti
</span><span class="n">kesit</span> <span class="o">=</span> <span class="nf">resize</span><span class="p">(</span><span class="nf">shepp_logan_phantom</span><span class="p">(),</span> <span class="p">(</span><span class="mi">256</span><span class="p">,</span> <span class="mi">256</span><span class="p">))</span>

<span class="c1"># Cihazın çevrede dolaştığı açıları temsil eder
</span><span class="n">acilar</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">180</span><span class="p">,</span> <span class="mi">256</span><span class="p">,</span> <span class="n">endpoint</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="n">sinogram</span> <span class="o">=</span> <span class="nf">radon</span><span class="p">(</span><span class="n">kesit</span><span class="p">,</span> <span class="n">theta</span><span class="o">=</span><span class="n">acilar</span><span class="p">)</span>

<span class="c1"># Ölçümlerden kesiti yeniden oluşturur
</span><span class="n">sonuc</span> <span class="o">=</span> <span class="nf">iradon</span><span class="p">(</span><span class="n">sinogram</span><span class="p">,</span> <span class="n">theta</span><span class="o">=</span><span class="n">acilar</span><span class="p">,</span> <span class="n">filter_name</span><span class="o">=</span><span class="sh">"</span><span class="s">ramp</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu kodda <code class="language-plaintext highlighter-rouge">radon</code> ileri ölçüm sürecini, <code class="language-plaintext highlighter-rouge">iradon</code> ise rekonstrüksiyonu taklit eder. Açı sayısını azaltmak görüntüde çizgisel artefaktlar oluşturur; gerçek cihazlarda da yetersiz veri benzer sorunlara yol açar.</p>

<h2 id="piksel-değerlerinden-doku-bilgisine">Piksel değerlerinden doku bilgisine</h2>

<p>Rekonstrüksiyon sonunda elde edilen soğurma katsayıları genellikle Hounsfield birimine dönüştürülür:</p>

\[HU = 1000\frac{\mu-\mu_{su}}{\mu_{su}}\]

<p>Su yaklaşık $0$ HU, hava $-1000$ HU, yoğun kemik ise yüzlerce veya binlerce HU değerine sahiptir. Böylece matematiksel bir yoğunluk haritası, doktorun yorumlayabileceği anatomik bir kesite dönüşür. Modern sistemler ayrıca iteratif yöntemler ve yapay zekâ kullanarak ölçüm ile tahmin arasındaki hatayı tekrar tekrar azaltır. Sonuçta tomografi, dönen bir X-ışını kaynağıyla başlayan ve ters problem çözümüyle tamamlanan etkileyici bir matematik mühendisliğidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="bilgisayarlı tomografi" /><category term="matematik" /><category term="radon dönüşümü" /><category term="görüntü işleme" /><category term="python" /><category term="tıbbi görüntüleme" /><summary type="html"><![CDATA[Bir bilgisayarlı tomografi cihazı, vücudun içine yerleştirilmiş görünmez bir fotoğraf makinesi değildir. Aslında farklı açılardan çok sayıda X-ışını ölçümü yapar ve bu ölçümlerin arkasındaki matematiksel bulmacayı çözerek kesit görüntüleri üretir. Başka bir deyişle cihaz, doğrudan görüntü çekmek yerine gölgelerden üç boyutlu bir hikâye yazar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/bilgisayarli-tomografinin-matematigi-82.png" /><media:content medium="image" url="https://program.sonsuz.us/img/bilgisayarli-tomografinin-matematigi-82.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C Dilinde Yapılar ve Birlikler: struct ile union Arasındaki Farklar</title><link href="https://program.sonsuz.us/posts/c-dilinde-yapilar-ve-birlikler-struct-ile-union-arasindaki-farklar/" rel="alternate" type="text/html" title="C Dilinde Yapılar ve Birlikler: struct ile union Arasındaki Farklar" /><published>2026-10-26T00:00:00+00:00</published><updated>2026-10-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-dilinde-yapilar-ve-birlikler-struct-ile-union-arasindaki-farklar</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-dilinde-yapilar-ve-birlikler-struct-ile-union-arasindaki-farklar/"><![CDATA[<p>C dilinde bir öğrencinin adı, numarası ve notu gibi birbiriyle ilişkili fakat farklı türlerdeki verileri yönetmek istediğimizi düşünelim. Ayrı ayrı değişkenler kullanabiliriz; ancak veri sayısı arttıkça kodumuz kısa sürede dağınık bir çekmeceye dönüşür. <code class="language-plaintext highlighter-rouge">struct</code> ve <code class="language-plaintext highlighter-rouge">union</code>, farklı veri türlerini tek bir isim altında toplayarak bu karmaşayı düzenleyen iki güçlü C aracıdır.</p>

<p>``</p>

<h2 id="yapı-struct-nedir">Yapı (<code class="language-plaintext highlighter-rouge">struct</code>) nedir?</h2>

<p>Bir yapı, birbiriyle ilişkili değişkenleri tek bir veri modeli içinde saklar. Yapının her üyesi bellekte kendisine ait bir alana sahiptir. Dolayısıyla bütün üyeler aynı anda geçerli değerler taşıyabilir.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span>
<span class="k">struct</span> <span class="n">Ogrenci</span> <span class="p">{</span>
    <span class="kt">char</span> <span class="n">ad</span><span class="p">[</span><span class="mi">30</span><span class="p">];</span>
    <span class="kt">int</span> <span class="n">numara</span><span class="p">;</span>
    <span class="kt">float</span> <span class="n">notOrtalamasi</span><span class="p">;</span>
<span class="p">};</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">struct</span> <span class="n">Ogrenci</span> <span class="n">ogrenci</span><span class="p">;</span>

    <span class="n">strcpy</span><span class="p">(</span><span class="n">ogrenci</span><span class="p">.</span><span class="n">ad</span><span class="p">,</span> <span class="s">"Ada"</span><span class="p">);</span>
    <span class="n">ogrenci</span><span class="p">.</span><span class="n">numara</span> <span class="o">=</span> <span class="mi">1024</span><span class="p">;</span>
    <span class="n">ogrenci</span><span class="p">.</span><span class="n">notOrtalamasi</span> <span class="o">=</span> <span class="mi">91</span><span class="p">.</span><span class="mi">5</span><span class="n">f</span><span class="p">;</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"%s - %d - %.1f</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span>
           <span class="n">ogrenci</span><span class="p">.</span><span class="n">ad</span><span class="p">,</span>
           <span class="n">ogrenci</span><span class="p">.</span><span class="n">numara</span><span class="p">,</span>
           <span class="n">ogrenci</span><span class="p">.</span><span class="n">notOrtalamasi</span><span class="p">);</span>

    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">ogrenci</code> tek bir değişkendir; fakat <code class="language-plaintext highlighter-rouge">.</code> operatörüyle erişilen üç farklı üyeyi taşır. Bir yapı işaretçisi kullanıldığında ise üyelere <code class="language-plaintext highlighter-rouge">-&gt;</code> operatörüyle erişilir: <code class="language-plaintext highlighter-rouge">ogrenciPtr-&gt;numara</code>.</p>

<h2 id="birlik-union-nedir">Birlik (<code class="language-plaintext highlighter-rouge">union</code>) nedir?</h2>

<p>Birlik de farklı türleri aynı referans altında toplar, ancak üyelerin tamamı <strong>aynı bellek alanını paylaşır</strong>. Bir üyeye yeni değer yazıldığında diğer üyenin eski değeri güvenilirliğini kaybeder. Yani birlik, “hepsini aynı anda sakla” değil, “bunlardan birini sakla” yaklaşımıdır.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="k">union</span> <span class="n">Deger</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">tamSayi</span><span class="p">;</span>
    <span class="kt">float</span> <span class="n">ondalik</span><span class="p">;</span>
    <span class="kt">char</span> <span class="n">karakter</span><span class="p">;</span>
<span class="p">};</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">union</span> <span class="n">Deger</span> <span class="n">veri</span><span class="p">;</span>

    <span class="n">veri</span><span class="p">.</span><span class="n">tamSayi</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"Tam sayı: %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">veri</span><span class="p">.</span><span class="n">tamSayi</span><span class="p">);</span>

    <span class="n">veri</span><span class="p">.</span><span class="n">ondalik</span> <span class="o">=</span> <span class="mi">3</span><span class="p">.</span><span class="mi">14</span><span class="n">f</span><span class="p">;</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"Ondalık: %.2f</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">veri</span><span class="p">.</span><span class="n">ondalik</span><span class="p">);</span>

    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>İkinci atamadan sonra <code class="language-plaintext highlighter-rouge">tamSayi</code> üyesini okumak anlamlı değildir; çünkü aynı bitler artık <code class="language-plaintext highlighter-rouge">float</code> biçiminde yorumlanmaktadır.</p>

<h2 id="bellek-hesabı">Bellek hesabı</h2>

<p>Bir yapının teorik boyutu üyelerin boyutları toplamına yakındır:</p>

\[S_{struct} \geq \sum_{i=1}^{n} S_i\]

<p>Eşitsizliğin nedeni <strong>padding</strong> adı verilen hizalama boşluklarıdır. Derleyici, işlemcinin verilere daha verimli erişebilmesi için üyeler arasına kullanılmayan baytlar ekleyebilir.</p>

<p>Bir birlik için temel ilişki şöyledir:</p>

\[S_{union} \geq \max(S_1, S_2, \ldots, S_n)\]

<p>Birliğin boyutu genellikle en büyük üyenin boyutudur; hizalama gereksinimleri sonucu küçük farklılıklar görülebilir. Kesin sonucu öğrenmenin doğru yolu <code class="language-plaintext highlighter-rouge">sizeof</code> kullanmaktır.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th><code class="language-plaintext highlighter-rouge">struct</code></th>
      <th><code class="language-plaintext highlighter-rouge">union</code></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Bellek kullanımı</td>
      <td>Üyelerin toplamına yakındır</td>
      <td>En büyük üyeye yakındır</td>
    </tr>
    <tr>
      <td>Aynı anda geçerli üye</td>
      <td>Tüm üyeler</td>
      <td>Genellikle yalnızca biri</td>
    </tr>
    <tr>
      <td>Veri koruma</td>
      <td>Bir üyeyi değiştirmek diğerlerini bozmaz</td>
      <td>Yeni yazma eski üyeyi ezer</td>
    </tr>
    <tr>
      <td>Tipik kullanım</td>
      <td>Kayıt ve nesne modelleme</td>
      <td>Değişken türde veri, donanım ve protokoller</td>
    </tr>
  </tbody>
</table>

<h2 id="güvenli-birlik-kullanımı-etiketli-birlik">Güvenli birlik kullanımı: etiketli birlik</h2>

<p>Birliğin hangi üyesinin geçerli olduğunu kendiliğinden bilmesi mümkün değildir. Bu nedenle bir <code class="language-plaintext highlighter-rouge">enum</code> etiketiyle birlik kullanımını güvenli hâle getirebiliriz:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">enum</span> <span class="n">DegerTuru</span> <span class="p">{</span>
    <span class="n">TAM_SAYI</span><span class="p">,</span>
    <span class="n">ONDALIK</span>
<span class="p">};</span>

<span class="k">struct</span> <span class="n">EtiketliDeger</span> <span class="p">{</span>
    <span class="k">enum</span> <span class="n">DegerTuru</span> <span class="n">tur</span><span class="p">;</span>
    <span class="k">union</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">tamSayi</span><span class="p">;</span>
        <span class="kt">float</span> <span class="n">ondalik</span><span class="p">;</span>
    <span class="p">}</span> <span class="n">veri</span><span class="p">;</span>
<span class="p">};</span>

<span class="kt">void</span> <span class="nf">yazdir</span><span class="p">(</span><span class="k">struct</span> <span class="n">EtiketliDeger</span> <span class="n">deger</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">deger</span><span class="p">.</span><span class="n">tur</span> <span class="o">==</span> <span class="n">TAM_SAYI</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"%d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">deger</span><span class="p">.</span><span class="n">veri</span><span class="p">.</span><span class="n">tamSayi</span><span class="p">);</span>
    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"%.2f</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">deger</span><span class="p">.</span><span class="n">veri</span><span class="p">.</span><span class="n">ondalik</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu desen, modern dillerdeki variant veya sum type yapılarına benzer. <code class="language-plaintext highlighter-rouge">tur</code> alanı hangi üyenin okunacağını söyler; <code class="language-plaintext highlighter-rouge">union</code> ise gereksiz bellek tüketimini azaltır.</p>

<p>Kısacası, bir varlığın bütün özelliklerine aynı anda ihtiyacınız varsa <code class="language-plaintext highlighter-rouge">struct</code>; seçeneklerden yalnızca biri tutulacaksa <code class="language-plaintext highlighter-rouge">union</code> uygundur. İkisini birlikte kullanmak ise hem düzenli hem de bellek açısından ekonomik veri modelleri kurmanın etkili bir yoludur.</p>

<p><img src="/img/c-dilinde-yapilar-86.svg" alt="c-dilinde-yapilar-86" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c" /><category term="struct" /><category term="union" /><category term="veri yapıları" /><category term="bellek yönetimi" /><category term="programlama" /><summary type="html"><![CDATA[C dilinde bir öğrencinin adı, numarası ve notu gibi birbiriyle ilişkili fakat farklı türlerdeki verileri yönetmek istediğimizi düşünelim. Ayrı ayrı değişkenler kullanabiliriz; ancak veri sayısı arttıkça kodumuz kısa sürede dağınık bir çekmeceye dönüşür. struct ve union, farklı veri türlerini tek bir isim altında toplayarak bu karmaşayı düzenleyen iki güçlü C aracıdır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-dilinde-yapilar-86.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-dilinde-yapilar-86.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Derin Öğrenme ile Kanser Tespiti: CNN’ler Radyologlara Karşı mı, Yanlarında mı?</title><link href="https://program.sonsuz.us/posts/derin-ogrenme-ile-kanser-tespiti-cnnler-radyologlara-karsi-mi-yanlarinda-mi/" rel="alternate" type="text/html" title="Derin Öğrenme ile Kanser Tespiti: CNN’ler Radyologlara Karşı mı, Yanlarında mı?" /><published>2026-10-26T00:00:00+00:00</published><updated>2026-10-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/derin-ogrenme-ile-kanser-tespiti-cnnler-radyologlara-karsi-mi-yanlarinda-mi</id><content type="html" xml:base="https://program.sonsuz.us/posts/derin-ogrenme-ile-kanser-tespiti-cnnler-radyologlara-karsi-mi-yanlarinda-mi/"><![CDATA[<p>Bir akciğer tomografisindeki birkaç milimetrelik nodülü veya mamografideki belirsiz bir dokuyu fark etmek, radyologlar için dikkat ve deneyim gerektiren bir süreçtir. Derin öğrenme modelleri ise binlerce görüntüden örüntü öğrenerek bu sürece ikinci bir göz olarak katılabilir. Peki evrişimli sinir ağları gerçekten insan uzmanlardan daha başarılı mı, yoksa mesele insan-makine iş birliği mi?</p>

<p><img src="/img/derin-ogrenme-ile-38.svg" alt="derin-ogrenme-ile-38" /></p>

<p>``</p>

<h2 id="evrişimli-sinir-ağı-neyi-öğrenir">Evrişimli sinir ağı neyi öğrenir?</h2>

<p>Evrişimli sinir ağları, yani <strong>CNN’ler</strong>, görüntülerdeki uzamsal ilişkileri öğrenmek için geliştirilmiştir. İlk katmanlar kenar, köşe ve doku gibi basit özellikleri yakalarken daha derin katmanlar kitle biçimi, düzensiz sınır veya doku yoğunluğu gibi karmaşık örüntülere odaklanır.</p>

<p>Bir evrişim işlemi kabaca şöyle ifade edilir:</p>

\[y_{i,j} = \sum_m \sum_n x_{i+m,j+n} w_{m,n} + b\]

<p>Burada $x$ giriş görüntüsünü, $w$ öğrenilebilir filtreyi, $b$ sapma değerini ve $y$ üretilen özellik haritasını temsil eder. Filtre görüntü üzerinde dolaşır; önemli bölgelerde yüksek aktivasyonlar oluşturur. Model, eğitim sırasında hatasını azaltacak filtreleri kendisi öğrenir.</p>

<p>Kanser tespitinde süreç genellikle görüntü sınıflandırma, tümör konumlandırma veya piksel düzeyinde segmentasyon biçiminde tasarlanır. Örneğin bir model yalnızca “şüpheli” sonucunu verebilirken başka bir model kitlenin sınırlarını da işaretleyebilir.</p>

<h2 id="i̇nsan-ve-cnn-karşılaştırması">İnsan ve CNN karşılaştırması</h2>

<p>Bir sistemi yalnızca doğruluk oranıyla değerlendirmek yanıltıcıdır. Tıbbi taramalarda <strong>duyarlılık</strong> ve <strong>özgüllük</strong> özellikle önemlidir:</p>

\[\text{Duyarlılık} = \frac{TP}{TP + FN}\]

\[\text{Özgüllük} = \frac{TN}{TN + FP}\]

<p>Duyarlılığın düşük olması gerçek kanserlerin kaçırılması, özgüllüğün düşük olması ise çok sayıda sağlıklı hastanın gereksiz incelemeye yönlendirilmesi anlamına gelebilir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>CNN modeli</th>
      <th>İnsan uzman</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Hız</td>
      <td>Binlerce görüntüyü hızlı tarayabilir</td>
      <td>İnceleme süresi vakaya bağlıdır</td>
    </tr>
    <tr>
      <td>Tutarlılık</td>
      <td>Aynı girdiye genellikle aynı sonucu verir</td>
      <td>Yorgunluk ve dikkat etkili olabilir</td>
    </tr>
    <tr>
      <td>Bağlam</td>
      <td>Klinik geçmişi sınırlı yorumlar</td>
      <td>Belirti, öykü ve diğer testleri birleştirir</td>
    </tr>
    <tr>
      <td>Açıklanabilirlik</td>
      <td>Karar süreci çoğu zaman opaktır</td>
      <td>Gerekçesini tıbbi dille açıklayabilir</td>
    </tr>
    <tr>
      <td>Nadir vakalar</td>
      <td>Eğitim verisi azsa zorlanabilir</td>
      <td>Deneyim ve literatürden yararlanabilir</td>
    </tr>
  </tbody>
</table>

<p>Araştırmalarda bazı CNN’ler belirli veri kümelerinde uzmanlarla benzer, hatta daha yüksek sonuçlar elde edebilir. Ancak bu, modelin her hastanede aynı başarıyı göstereceği anlamına gelmez. Cihaz markası, çekim protokolü, hasta popülasyonu ve görüntü kalitesi değiştiğinde <strong>veri dağılımı kayması</strong> ortaya çıkabilir.</p>

<h2 id="basitleştirilmiş-bir-cnn-örneği">Basitleştirilmiş bir CNN örneği</h2>

<p>Aşağıdaki TensorFlow modeli, görüntüleri iki sınıfa ayırabilecek temel bir mimari gösterir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">tensorflow</span> <span class="k">as</span> <span class="n">tf</span>

<span class="n">model</span> <span class="o">=</span> <span class="n">tf</span><span class="p">.</span><span class="n">keras</span><span class="p">.</span><span class="nc">Sequential</span><span class="p">([</span>
    <span class="n">tf</span><span class="p">.</span><span class="n">keras</span><span class="p">.</span><span class="n">layers</span><span class="p">.</span><span class="nc">Input</span><span class="p">(</span><span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="mi">224</span><span class="p">,</span> <span class="mi">224</span><span class="p">,</span> <span class="mi">3</span><span class="p">)),</span>
    <span class="n">tf</span><span class="p">.</span><span class="n">keras</span><span class="p">.</span><span class="n">layers</span><span class="p">.</span><span class="nc">Conv2D</span><span class="p">(</span><span class="mi">32</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">activation</span><span class="o">=</span><span class="sh">'</span><span class="s">relu</span><span class="sh">'</span><span class="p">),</span>
    <span class="n">tf</span><span class="p">.</span><span class="n">keras</span><span class="p">.</span><span class="n">layers</span><span class="p">.</span><span class="nc">MaxPooling2D</span><span class="p">(),</span>
    <span class="n">tf</span><span class="p">.</span><span class="n">keras</span><span class="p">.</span><span class="n">layers</span><span class="p">.</span><span class="nc">Conv2D</span><span class="p">(</span><span class="mi">64</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">activation</span><span class="o">=</span><span class="sh">'</span><span class="s">relu</span><span class="sh">'</span><span class="p">),</span>
    <span class="n">tf</span><span class="p">.</span><span class="n">keras</span><span class="p">.</span><span class="n">layers</span><span class="p">.</span><span class="nc">MaxPooling2D</span><span class="p">(),</span>
    <span class="n">tf</span><span class="p">.</span><span class="n">keras</span><span class="p">.</span><span class="n">layers</span><span class="p">.</span><span class="nc">GlobalAveragePooling2D</span><span class="p">(),</span>
    <span class="n">tf</span><span class="p">.</span><span class="n">keras</span><span class="p">.</span><span class="n">layers</span><span class="p">.</span><span class="nc">Dense</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">activation</span><span class="o">=</span><span class="sh">'</span><span class="s">sigmoid</span><span class="sh">'</span><span class="p">)</span>
<span class="p">])</span>

<span class="n">model</span><span class="p">.</span><span class="nf">compile</span><span class="p">(</span>
    <span class="n">optimizer</span><span class="o">=</span><span class="sh">'</span><span class="s">adam</span><span class="sh">'</span><span class="p">,</span>
    <span class="n">loss</span><span class="o">=</span><span class="sh">'</span><span class="s">binary_crossentropy</span><span class="sh">'</span><span class="p">,</span>
    <span class="n">metrics</span><span class="o">=</span><span class="p">[</span><span class="sh">'</span><span class="s">accuracy</span><span class="sh">'</span><span class="p">]</span>
<span class="p">)</span>
</code></pre></div></div>

<p>Evrişim katmanları görüntü özelliklerini çıkarır, havuzlama katmanları boyutu küçültür, sigmoid çıkışı ise görüntünün şüpheli sınıfa ait olma olasılığını üretir. Gerçek bir klinik sistemde veri artırma, hasta bazlı veri ayrımı, harici doğrulama ve kalibrasyon gibi ek adımlar zorunludur.</p>

<h2 id="rakip-değil-ekip-arkadaşı">Rakip değil, ekip arkadaşı</h2>

<p>CNN’lerin en güçlü kullanım biçimi radyologların yerini almak değil, önceliklendirme ve karar desteği sağlamaktır. Model şüpheli görüntüleri sıranın başına taşıyabilir, gözden kaçabilecek bölgeleri işaretleyebilir ve ikinci okuma sunabilir. Buna karşılık nihai karar; biyopsi, hasta geçmişi ve diğer klinik bulgularla birlikte uzman tarafından verilmelidir.</p>

<p>Ayrıca eğitim verilerindeki demografik dengesizlikler adaletsiz sonuçlara yol açabilir. Bu nedenle başarı ölçümleri yaş, cinsiyet, cihaz ve merkez gibi alt gruplarda ayrı ayrı incelenmelidir. Güvenli gelecek, “yapay zekâ mı insan mı?” sorusundan çok, <strong>ikisini nasıl denetimli ve şeffaf biçimde birleştiririz?</strong> sorusuna bağlıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="derin öğrenme" /><category term="yapay zeka" /><category term="kanser tespiti" /><category term="cnn" /><category term="radyoloji" /><category term="tıbbi görüntüleme" /><summary type="html"><![CDATA[Bir akciğer tomografisindeki birkaç milimetrelik nodülü veya mamografideki belirsiz bir dokuyu fark etmek, radyologlar için dikkat ve deneyim gerektiren bir süreçtir. Derin öğrenme modelleri ise binlerce görüntüden örüntü öğrenerek bu sürece ikinci bir göz olarak katılabilir. Peki evrişimli sinir ağları gerçekten insan uzmanlardan daha başarılı mı, yoksa mesele insan-makine iş birliği mi?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/derin-ogrenme-ile-38.png" /><media:content medium="image" url="https://program.sonsuz.us/img/derin-ogrenme-ile-38.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Doğal Dil İşleme ile Klinik Notlardan Yapılandırılmış Tıbbi Veri Çıkarma</title><link href="https://program.sonsuz.us/posts/dogal-dil-isleme-ile-klinik-notlardan-yapilandirilmis-tibbi-veri-cikarma/" rel="alternate" type="text/html" title="Doğal Dil İşleme ile Klinik Notlardan Yapılandırılmış Tıbbi Veri Çıkarma" /><published>2026-10-26T00:00:00+00:00</published><updated>2026-10-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/dogal-dil-isleme-ile-klinik-notlardan-yapilandirilmis-tibbi-veri-cikarma</id><content type="html" xml:base="https://program.sonsuz.us/posts/dogal-dil-isleme-ile-klinik-notlardan-yapilandirilmis-tibbi-veri-cikarma/"><![CDATA[<p>Doktor notları klinik açıdan son derece değerlidir; ancak “üç gündür artan göğüs ağrısı, diyabet öyküsü var, ateş yok” gibi serbest metinler bilgisayarların doğrudan analiz edebileceği satır ve sütunlara benzemez. Klinik Doğal Dil İşleme, bu dağınık anlatımı tanılar, belirtiler, ilaçlar, ölçümler ve zaman bilgileri gibi yapılandırılmış verilere dönüştürür. Böylece araştırma, karar desteği ve hastane operasyonlarında kullanılabilecek güvenilir veri üretilir.</p>

<p><img src="/img/dogal-dil-isleme-37.svg" alt="dogal-dil-isleme-37" /></p>

<p>``</p>
<h2 id="klinik-notları-anlamak-neden-zordur">Klinik notları anlamak neden zordur?</h2>

<p>Gündelik NLP uygulamalarında bir kelimenin olumlu veya olumsuz duygu taşıması önemli olabilir. Klinik alandaysa tek bir olumsuzluk eki hastanın durumunu tamamen değiştirir: “pnömoni var” ile “pnömoni saptanmadı” aynı kavramı içerir ama zıt sonuçlar bildirir.</p>

<p>Notlarda kısaltmalar, yazım hataları, özel terminoloji ve bağlama bağlı ifadeler de bulunur. “MI” miyokart enfarktüsü anlamına gelebilirken farklı bir bölümde başka bir kısaltmayı temsil edebilir. Türkçenin eklemeli yapısı da “hipertansiyonu”, “hipertansiyondan” ve “hipertansiyonsuz” biçimlerinin aynı kökle ilişkilendirilmesini gerektirir.</p>

<table>
  <thead>
    <tr>
      <th>Görev</th>
      <th>Girdi örneği</th>
      <th>Yapılandırılmış sonuç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Varlık tanıma</td>
      <td>“Metformin 500 mg kullanıyor”</td>
      <td>İlaç: Metformin, doz: 500 mg</td>
    </tr>
    <tr>
      <td>Olumsuzluk analizi</td>
      <td>“Ateş gözlenmedi”</td>
      <td>Ateş: yok</td>
    </tr>
    <tr>
      <td>Zaman çıkarımı</td>
      <td>“İki yıl önce ameliyat oldu”</td>
      <td>İşlem zamanı: geçmiş</td>
    </tr>
    <tr>
      <td>Kavram eşleme</td>
      <td>“Yüksek tansiyon”</td>
      <td>SNOMED CT: hipertansiyon</td>
    </tr>
    <tr>
      <td>İlişki çıkarımı</td>
      <td>“Baş ağrısı için parasetamol”</td>
      <td>İlaç-belirti ilişkisi</td>
    </tr>
  </tbody>
</table>

<h2 id="tipik-bilgi-çıkarım-hattı">Tipik bilgi çıkarım hattı</h2>

<p>Sistem önce metni cümlelere ve sözcüklere ayırır. Ardından normalizasyon yaparak yazım çeşitlerini azaltır. Adlandırılmış Varlık Tanıma modeli hastalık, ilaç, anatomik bölge ve laboratuvar değeri gibi ifadeleri etiketler. Sonraki aşamada olumsuzluk, belirsizlik, deneyimleyen kişi ve zaman belirlenir.</p>

<p>Örneğin “Hastanın annesinde meme kanseri vardı” cümlesinde hastalık gerçektir; fakat deneyimleyen kişi hasta değildir. Bu ayrım yapılmazsa hastaya yanlış tanı atanabilir. Son aşamada bulunan ifadeler ICD-10, LOINC veya SNOMED CT gibi kontrollü terminolojilerle eşleştirilir.</p>

<p>Modern sistemler BERT benzeri dönüştürücü modeller kullanır. Bir ifadenin bağlamsal gösterimi kabaca şöyle düşünülebilir:</p>

\[h_i = \operatorname{Transformer}(x_1, x_2, \ldots, x_n)_i\]

<p>Burada $x_i$ sözcük veya alt sözcük birimini, $h_i$ ise çevresindeki kelimeleri dikkate alan bağlamsal temsili gösterir. Sınıflandırıcı bu temsilden “ilaç”, “belirti” veya “varlık değil” gibi bir etiket üretir.</p>

<h2 id="basitleştirilmiş-python-örneği">Basitleştirilmiş Python örneği</h2>

<p>Aşağıdaki örnek, eğitilmiş bir spaCy modelinin klinik varlıkları nasıl çıkarabileceğini gösterir. Gerçek kullanımda genel amaçlı model yerine kuruma ve dile uygun klinik veriyle eğitilmiş bir model gerekir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">spacy</span>

<span class="n">nlp</span> <span class="o">=</span> <span class="n">spacy</span><span class="p">.</span><span class="nf">load</span><span class="p">(</span><span class="sh">"</span><span class="s">tr_clinical_ner_model</span><span class="sh">"</span><span class="p">)</span>
<span class="n">text</span> <span class="o">=</span> <span class="sh">"</span><span class="s">Hasta metformin 500 mg kullanıyor, ateş gözlenmedi.</span><span class="sh">"</span>
<span class="n">doc</span> <span class="o">=</span> <span class="nf">nlp</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>

<span class="n">records</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">entity</span> <span class="ow">in</span> <span class="n">doc</span><span class="p">.</span><span class="n">ents</span><span class="p">:</span>
    <span class="n">records</span><span class="p">.</span><span class="nf">append</span><span class="p">({</span>
        <span class="sh">"</span><span class="s">text</span><span class="sh">"</span><span class="p">:</span> <span class="n">entity</span><span class="p">.</span><span class="n">text</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">type</span><span class="sh">"</span><span class="p">:</span> <span class="n">entity</span><span class="p">.</span><span class="n">label_</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">start</span><span class="sh">"</span><span class="p">:</span> <span class="n">entity</span><span class="p">.</span><span class="n">start_char</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">end</span><span class="sh">"</span><span class="p">:</span> <span class="n">entity</span><span class="p">.</span><span class="n">end_char</span>
    <span class="p">})</span>

<span class="nf">print</span><span class="p">(</span><span class="n">records</span><span class="p">)</span>
</code></pre></div></div>

<p>Kod, metni modele gönderir ve tespit edilen ifadeleri türleriyle birlikte sözlük listesine dönüştürür. Ancak “gözlenmedi” bilgisinin ateşi olumsuzladığını anlamak için ayrıca kural tabanlı veya öğrenilmiş bir olumsuzluk modülü kullanılmalıdır.</p>

<h2 id="başarı-nasıl-ölçülür">Başarı nasıl ölçülür?</h2>

<p>Klinik sistemlerde yalnızca doğruluk oranına bakmak yanıltıcıdır. Kesinlik ve duyarlılık daha açıklayıcıdır:</p>

\[\text{Kesinlik}=\frac{TP}{TP+FP}, \qquad \text{Duyarlılık}=\frac{TP}{TP+FN}\]

<p>Yüksek kesinlik, üretilen kayıtların çoğunun doğru olduğunu; yüksek duyarlılık ise gerçek klinik ifadelerin çok azının kaçırıldığını gösterir. Dengeli değerlendirme için $F_1$ skoru kullanılır.</p>

<h2 id="güvenlik-ve-insan-denetimi">Güvenlik ve insan denetimi</h2>

<p>Klinik notlar son derece hassas kişisel veriler içerir. Bu nedenle kimliksizleştirme, erişim kontrolü, şifreleme ve ayrıntılı denetim kayıtları zorunludur. Model çıktıları doğrudan tanı yerine geçmemeli; doktor onayına sunulan yardımcı öneriler olarak değerlendirilmelidir. Kısacası başarılı klinik NLP, yalnızca iyi bir model değil, güvenilir veri, tıbbi terminoloji, mahremiyet ve insan denetiminin birlikte çalıştığı bir sistemdir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="doğal dil işleme" /><category term="klinik nlp" /><category term="yapay zeka" /><category term="sağlık bilişimi" /><category term="bilgi çıkarımı" /><category term="python" /><summary type="html"><![CDATA[Doktor notları klinik açıdan son derece değerlidir; ancak “üç gündür artan göğüs ağrısı, diyabet öyküsü var, ateş yok” gibi serbest metinler bilgisayarların doğrudan analiz edebileceği satır ve sütunlara benzemez. Klinik Doğal Dil İşleme, bu dağınık anlatımı tanılar, belirtiler, ilaçlar, ölçümler ve zaman bilgileri gibi yapılandırılmış verilere dönüştürür. Böylece araştırma, karar desteği ve hastane operasyonlarında kullanılabilecek güvenilir veri üretilir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/dogal-dil-isleme-37.png" /><media:content medium="image" url="https://program.sonsuz.us/img/dogal-dil-isleme-37.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Fizik Motorları ve Ragdoll Simülasyonu: Dijital Bedenler Nasıl Çöküp Sekiyor?</title><link href="https://program.sonsuz.us/posts/fizik-motorlari-ve-ragdoll-simulasyonu-dijital-bedenler-nasil-cokup-sekiyor/" rel="alternate" type="text/html" title="Fizik Motorları ve Ragdoll Simülasyonu: Dijital Bedenler Nasıl Çöküp Sekiyor?" /><published>2026-10-26T00:00:00+00:00</published><updated>2026-10-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/fizik-motorlari-ve-ragdoll-simulasyonu-dijital-bedenler-nasil-cokup-sekiyor</id><content type="html" xml:base="https://program.sonsuz.us/posts/fizik-motorlari-ve-ragdoll-simulasyonu-dijital-bedenler-nasil-cokup-sekiyor/"><![CDATA[<p>Bir oyun karakteri merdivenden düştüğünde neden tahta gibi devrilmek yerine kıvrılır, basamaklara çarpar ve sonunda doğal görünen bir pozda durur? Bu küçük dijital dramın arkasında fizik motorları, eklemler, çarpışma şekilleri ve bol miktarda matematik vardır. Ragdoll simülasyonu, önceden hazırlanmış bir animasyonu oynatmak yerine karakter bedenini fizik kurallarına teslim ederek her düşüşü benzersiz hâle getirir.</p>

<p>``</p>

<h2 id="fizik-motoru-neyi-hesaplar">Fizik motoru neyi hesaplar?</h2>

<p>Fizik motoru, sanal dünyadaki nesnelerin kuvvetler karşısında nasıl hareket edeceğini belirleyen sistemdir. Her fizik adımında nesnelerin konumları, hızları ve çarpışmaları yeniden hesaplanır. Temel doğrusal hareket Newton’un ikinci yasasına dayanır:</p>

\[F = m \cdot a\]

<p>Burada $F$ toplam kuvveti, $m$ kütleyi ve $a$ ivmeyi temsil eder. Yerçekimi altında duran bir beden parçasına yaklaşık olarak $F_g = m \cdot g$ kuvveti uygulanır. Motor, bu ivmeyi küçük zaman aralıklarıyla hıza ve konuma dönüştürür:</p>

\[v_{yeni} = v_{eski} + a\Delta t\]

\[x_{yeni} = x_{eski} + v_{yeni}\Delta t\]

<p>$\Delta t$ küçüldükçe simülasyon genellikle daha kararlı olur; ancak işlemci yükü artar. Yani gerçekçilik menüsünde ücretsiz öğle yemeği yoktur.</p>

<h2 id="ragdoll-bedeninin-anatomisi">Ragdoll bedeninin anatomisi</h2>

<p>Ragdoll, tek parça karmaşık bir model olarak değil, birbirine eklemlerle bağlanan katı cisimler olarak ele alınır. Baş, gövde, üst kol, ön kol, uyluk ve baldır gibi parçaların her biri kendi kütlesine ve çarpışma hacmine sahiptir.</p>

<table>
  <thead>
    <tr>
      <th>Bileşen</th>
      <th>Görevi</th>
      <th>Yaygın tercih</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Katı cisim</td>
      <td>Kütle, hız ve dönüşü taşır</td>
      <td>Rigidbody</td>
    </tr>
    <tr>
      <td>Çarpıştırıcı</td>
      <td>Temas yüzeyini yaklaşıklar</td>
      <td>Kapsül, kutu, küre</td>
    </tr>
    <tr>
      <td>Eklem</td>
      <td>Parçaları birbirine bağlar</td>
      <td>Configurable Joint</td>
    </tr>
    <tr>
      <td>Sönümleme</td>
      <td>Sonsuz sallanmayı azaltır</td>
      <td>Linear/Angular Drag</td>
    </tr>
    <tr>
      <td>Açı sınırı</td>
      <td>Anatomik olmayan dönüşleri engeller</td>
      <td>Joint Limits</td>
    </tr>
  </tbody>
</table>

<p>Karakterin görsel ağı çok ayrıntılı olabilir; fakat fizik hesaplarında basit kapsüller kullanılır. Çünkü binlerce üçgenle çarpışma aramak yerine birkaç geometrik şekli test etmek çok daha hızlıdır.</p>

<h2 id="çökme-çarpışma-ve-sekme">Çökme, çarpışma ve sekme</h2>

<p>İki cisim temas ettiğinde fizik motoru iç içe geçmeyi önlemek için bir çarpışma normali belirler ve karşı yönde itki uygular. Sekme miktarı, esneklik katsayısı $e$ ile özetlenebilir:</p>

\[v_{sonra} = -e \cdot v_{önce}\]

<p>$e=0$ olduğunda parça zemine yapışmaya yakın davranır; $e=1$ ise enerjiyi büyük ölçüde koruyarak seker. İnsan bedeni benzeri bir ragdoll için düşük esneklik ve orta-yüksek sürtünme daha inandırıcıdır. Aksi hâlde karakter, trajik bir düşüşten çok lastik top seçmelerine katılmış gibi görünür.</p>

<table>
  <thead>
    <tr>
      <th>Ayar</th>
      <th>Çok düşükse</th>
      <th>Çok yüksekse</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sürtünme</td>
      <td>Beden kayar</td>
      <td>Parçalar zemine takılır</td>
    </tr>
    <tr>
      <td>Esneklik</td>
      <td>Darbe cansız görünür</td>
      <td>Karakter zıplar</td>
    </tr>
    <tr>
      <td>Eklem sertliği</td>
      <td>Beden pelteleşir</td>
      <td>Hareket robotikleşir</td>
    </tr>
    <tr>
      <td>Sönümleme</td>
      <td>Titreme sürer</td>
      <td>Hareket aniden ölür</td>
    </tr>
  </tbody>
</table>

<h2 id="unityde-basit-etkinleştirme">Unity’de basit etkinleştirme</h2>

<p>Aşağıdaki C# örneği, animasyon sistemini kapatıp çocuk nesnelerdeki fizik bileşenlerini etkinleştirir. Böylece karakter kontrollü animasyondan fizik tabanlı ragdoll durumuna geçer:</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">using</span> <span class="nn">UnityEngine</span><span class="p">;</span>

<span class="k">public</span> <span class="k">class</span> <span class="nc">RagdollController</span> <span class="p">:</span> <span class="n">MonoBehaviour</span>
<span class="p">{</span>
    <span class="p">[</span><span class="n">SerializeField</span><span class="p">]</span> <span class="k">private</span> <span class="n">Animator</span> <span class="n">animator</span><span class="p">;</span>
    <span class="k">private</span> <span class="n">Rigidbody</span><span class="p">[]</span> <span class="n">bodyParts</span><span class="p">;</span>

    <span class="k">void</span> <span class="nf">Awake</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="n">bodyParts</span> <span class="p">=</span> <span class="n">GetComponentsInChildren</span><span class="p">&lt;</span><span class="n">Rigidbody</span><span class="p">&gt;();</span>
        <span class="nf">SetRagdoll</span><span class="p">(</span><span class="k">false</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">void</span> <span class="nf">SetRagdoll</span><span class="p">(</span><span class="kt">bool</span> <span class="n">enabled</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">animator</span><span class="p">.</span><span class="n">enabled</span> <span class="p">=</span> <span class="p">!</span><span class="n">enabled</span><span class="p">;</span>

        <span class="k">foreach</span> <span class="p">(</span><span class="n">Rigidbody</span> <span class="n">part</span> <span class="k">in</span> <span class="n">bodyParts</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="n">part</span><span class="p">.</span><span class="n">isKinematic</span> <span class="p">=</span> <span class="p">!</span><span class="n">enabled</span><span class="p">;</span>
            <span class="n">part</span><span class="p">.</span><span class="n">detectCollisions</span> <span class="p">=</span> <span class="n">enabled</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">isKinematic</code> açıkken parçaları fizik değil animasyon yönetir. Ragdoll etkinleştirildiğinde bu özellik kapanır ve yerçekimi, darbeler ile eklem kısıtları kontrolü devralır. Geçiş sırasında karakterin mevcut hızını beden parçalarına aktarmak, özellikle koşarken vurulan karakterlerde sürekliliği güçlendirir.</p>

<h2 id="gerçekçilik-ile-kararlılık-arasındaki-denge">Gerçekçilik ile kararlılık arasındaki denge</h2>

<p>İyi bir ragdoll yalnızca doğru denklemlerden oluşmaz. Kütle dağılımı, eklem limitleri, sabit fizik zaman adımı ve çözücü yineleme sayısı birlikte ayarlanmalıdır. Gövde genellikle uzuvlardan ağır tutulmalı, komşu parçaların çarpıştırıcıları gereksiz yere birbirine çarpmamalıdır. Ayrıca yüksek hızlarda tünelleme yaşanmaması için sürekli çarpışma algılama kullanılabilir.</p>

<p>Sonuçta gerçekçi çökme hareketi; kuvvetlerin, itkinin, sürtünmenin ve anatomik kısıtların ortak ürünüdür. Başarılı bir ragdoll, oyuncuya matematiği göstermez; yalnızca düşüşün ağırlığını hissettirir.</p>

<p><img src="/img/fizik-motorlari-ve-66.svg" alt="fizik-motorlari-ve-66" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="fizik motoru" /><category term="ragdoll" /><category term="oyun geliştirme" /><category term="unity" /><category term="simülasyon" /><category term="karakter animasyonu" /><summary type="html"><![CDATA[Bir oyun karakteri merdivenden düştüğünde neden tahta gibi devrilmek yerine kıvrılır, basamaklara çarpar ve sonunda doğal görünen bir pozda durur? Bu küçük dijital dramın arkasında fizik motorları, eklemler, çarpışma şekilleri ve bol miktarda matematik vardır. Ragdoll simülasyonu, önceden hazırlanmış bir animasyonu oynatmak yerine karakter bedenini fizik kurallarına teslim ederek her düşüşü benzersiz hâle getirir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/fizik-motorlari-ve-66.png" /><media:content medium="image" url="https://program.sonsuz.us/img/fizik-motorlari-ve-66.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">HFT Sistemlerinin Mimarisi: Mikrosaniyelik Hız Yarışı</title><link href="https://program.sonsuz.us/posts/hft-sistemlerinin-mimarisi-mikrosaniyelik-hiz-yarisi/" rel="alternate" type="text/html" title="HFT Sistemlerinin Mimarisi: Mikrosaniyelik Hız Yarışı" /><published>2026-10-26T00:00:00+00:00</published><updated>2026-10-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/hft-sistemlerinin-mimarisi-mikrosaniyelik-hiz-yarisi</id><content type="html" xml:base="https://program.sonsuz.us/posts/hft-sistemlerinin-mimarisi-mikrosaniyelik-hiz-yarisi/"><![CDATA[<p>Bir göz kırpma yaklaşık 100–300 milisaniye sürer. Yüksek frekanslı işlem (HFT) sistemlerinde ise bu süre, binlerce karar vermek için yeterince uzundur. Fiyat değişikliklerini herkesten önce değerlendirmeye çalışan bu sistemlerde hız yalnızca güçlü bir işlemci meselesi değildir; ağ kartından veri yapısına kadar bütün mimari, mikrosaniyeleri koruyacak şekilde tasarlanır.</p>

<p><img src="/img/hft-sistemlerinin-mimarisi-21.svg" alt="hft-sistemlerinin-mimarisi-21" /></p>

<p>``</p>

<h2 id="hft-tam-olarak-ne-yapar">HFT tam olarak ne yapar?</h2>

<p>HFT sistemleri piyasa verilerini gerçek zamanlı olarak alır, algoritmik stratejilerle değerlendirir ve saniyenin çok küçük bir bölümünde emir üretir. Piyasa yapıcılığı, farklı platformlar arasındaki fiyat uyuşmazlıklarını izleme ve portföy riskini dengeleme yaygın kullanım alanlarıdır.</p>

<p>Bir işlemin basitleştirilmiş beklenen değeri şöyle ifade edilebilir:</p>

\[E[P] = p_f \cdot G - (1-p_f) \cdot Z - C\]

<p>Burada $p_f$ emrin istenen koşullarda gerçekleşme olasılığı, $G$ beklenen kazanç, $Z$ olumsuz fiyat hareketinden doğan zarar ve $C$ komisyon ile altyapı maliyetidir. Gecikme arttığında emir sırasındaki konum kötüleşebilir; dolayısıyla $p_f$ düşerken zarar ihtimali büyüyebilir.</p>

<h2 id="temel-mimari-katmanları">Temel mimari katmanları</h2>

<p>Tipik bir HFT hattı aşağıdaki bileşenlerden oluşur:</p>

<ol>
  <li><strong>Piyasa veri alıcısı:</strong> Borsanın gönderdiği ham paketleri yakalar.</li>
  <li><strong>Feed handler:</strong> Paketleri çözer ve dahili fiyat defteri modelini günceller.</li>
  <li><strong>Strateji motoru:</strong> Fiyat, hacim ve risk sinyallerinden işlem kararı üretir.</li>
  <li><strong>Risk katmanı:</strong> Pozisyon, emir büyüklüğü ve kayıp limitlerini denetler.</li>
  <li><strong>Emir geçidi:</strong> Kararı borsanın protokolüne çevirerek iletir.</li>
  <li><strong>Telemetri sistemi:</strong> Gecikme dağılımlarını ve hataları kaydeder.</li>
</ol>

<p>Bu yolun toplam gecikmesi kabaca</p>

\[L_{toplam}=L_{ağ}+L_{çözümleme}+L_{strateji}+L_{risk}+L_{emir}\]

<p>şeklindedir. Her katmanda kazanılan birkaç mikrosaniye, toplamda ciddi bir avantaj oluşturabilir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Geleneksel sistem</th>
      <th>HFT sistemi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ağ erişimi</td>
      <td>Standart TCP/IP yığını</td>
      <td>Kernel bypass, optimize UDP</td>
    </tr>
    <tr>
      <td>Bellek</td>
      <td>Dinamik tahsis yaygın</td>
      <td>Önceden ayrılmış bellek</td>
    </tr>
    <tr>
      <td>Veri yapısı</td>
      <td>Esnek koleksiyonlar</td>
      <td>Cache dostu sabit diziler</td>
    </tr>
    <tr>
      <td>İş parçacıkları</td>
      <td>Genel amaçlı zamanlama</td>
      <td>CPU çekirdeğine sabitleme</td>
    </tr>
    <tr>
      <td>Performans ölçümü</td>
      <td>Ortalama gecikme</td>
      <td>Kuyruk yüzdelikleri ve jitter</td>
    </tr>
  </tbody>
</table>

<h2 id="mikrosaniyeler-neden-önemlidir">Mikrosaniyeler neden önemlidir?</h2>

<p>Borsalarda aynı fiyat seviyesindeki emirler çoğunlukla zaman önceliğine göre sıralanır. İki şirket aynı alış emrini gönderirse birkaç mikrosaniye önce ulaşan emir kuyruğun önüne geçebilir. Bu nedenle gecikme yalnızca kararın hızını değil, gerçekleşme olasılığını da etkiler.</p>

<p>Ayrıca ortalama gecikme tek başına yeterli değildir. Sistem çoğu zaman 10 mikrosaniyede yanıt verip nadiren 2 milisaniyeye sıçrıyorsa kritik anlarda geride kalabilir. Bu değişkenliğe <strong>jitter</strong> denir. HFT ekipleri ortalama yerine $p99$, $p99.9$ ve maksimum gecikme değerlerini özellikle takip eder.</p>

<h2 id="sıcak-yol-üzerinde-kod-tasarımı">Sıcak yol üzerinde kod tasarımı</h2>

<p>Aşağıdaki C++ örneği, alış ve satış fiyatından orta noktayı hesaplayan küçük bir sıcak yol fonksiyonudur:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">struct</span> <span class="nc">Quote</span> <span class="p">{</span>
    <span class="kt">double</span> <span class="n">bid</span><span class="p">;</span>
    <span class="kt">double</span> <span class="n">ask</span><span class="p">;</span>
<span class="p">};</span>

<span class="kr">inline</span> <span class="kt">double</span> <span class="n">midpoint</span><span class="p">(</span><span class="k">const</span> <span class="n">Quote</span><span class="o">&amp;</span> <span class="n">quote</span><span class="p">)</span> <span class="k">noexcept</span> <span class="p">{</span>
    <span class="k">return</span> <span class="p">(</span><span class="n">quote</span><span class="p">.</span><span class="n">bid</span> <span class="o">+</span> <span class="n">quote</span><span class="p">.</span><span class="n">ask</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.5</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">bool</span> <span class="n">shouldBuy</span><span class="p">(</span><span class="k">const</span> <span class="n">Quote</span><span class="o">&amp;</span> <span class="n">quote</span><span class="p">,</span> <span class="kt">double</span> <span class="n">reference</span><span class="p">)</span> <span class="k">noexcept</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">midpoint</span><span class="p">(</span><span class="n">quote</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">reference</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">const</code> referans gereksiz kopyayı önler, <code class="language-plaintext highlighter-rouge">noexcept</code> fonksiyonun istisna üretmeyeceğini bildirir ve <code class="language-plaintext highlighter-rouge">inline</code> çağrı maliyetinin azaltılmasına yardımcı olabilir. Gerçek sistemlerde kayan nokta yerine sabit noktalı tamsayılar tercih edilebilir; böylece fiyatlar örneğin kuruş cinsinden kesin biçimde saklanır.</p>

<h2 id="donanım-da-mimarinin-parçasıdır">Donanım da mimarinin parçasıdır</h2>

<p>Borsaya fiziksel olarak yakın veri merkezlerinde sunucu barındırmak, fiber üzerindeki yayılma süresini azaltır. Optimize ağ kartları, FPGA’ler, yüksek saat hızlı CPU’lar ve NUMA farkındalığı da gecikme bütçesine katkıda bulunur. Ancak hız uğruna risk kontrollerini kaldırmak doğru değildir. İyi bir mimari, kontrolleri atlamak yerine onları tahmin edilebilir ve düşük gecikmeli hâle getirir.</p>

<p>Sonuç olarak HFT, yalnızca hızlı kod yazma sanatı değildir. Ağ, işletim sistemi, işlemci önbelleği, algoritma, risk yönetimi ve fiziksel mesafenin birlikte optimize edildiği uçtan uca bir mühendislik disiplinidir. Mikrosaniyeler önemlidir; çünkü elektronik piyasalarda küçük bir zaman farkı, kuyrukta ilk veya son olmak arasındaki fark olabilir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="hft" /><category term="düşük gecikme" /><category term="algoritmik işlem" /><category term="finansal teknolojiler" /><category term="c++" /><category term="sistem mimarisi" /><summary type="html"><![CDATA[Bir göz kırpma yaklaşık 100–300 milisaniye sürer. Yüksek frekanslı işlem (HFT) sistemlerinde ise bu süre, binlerce karar vermek için yeterince uzundur. Fiyat değişikliklerini herkesten önce değerlendirmeye çalışan bu sistemlerde hız yalnızca güçlü bir işlemci meselesi değildir; ağ kartından veri yapısına kadar bütün mimari, mikrosaniyeleri koruyacak şekilde tasarlanır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/hft-sistemlerinin-mimarisi-21.png" /><media:content medium="image" url="https://program.sonsuz.us/img/hft-sistemlerinin-mimarisi-21.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Kas Sinyalinden Kavramaya: EMG ile Protez El Kontrolü</title><link href="https://program.sonsuz.us/posts/kas-sinyalinden-kavramaya-emg-ile-protez-el-kontrolu/" rel="alternate" type="text/html" title="Kas Sinyalinden Kavramaya: EMG ile Protez El Kontrolü" /><published>2026-10-26T00:00:00+00:00</published><updated>2026-10-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/kas-sinyalinden-kavramaya-emg-ile-protez-el-kontrolu</id><content type="html" xml:base="https://program.sonsuz.us/posts/kas-sinyalinden-kavramaya-emg-ile-protez-el-kontrolu/"><![CDATA[<p>Bir bardağı kavramak bize son derece doğal görünür; fakat bu hareketin arkasında sinir sistemi, kaslar ve beynin birlikte yönettiği karmaşık bir iletişim ağı bulunur. EMG kontrollü protez eller, kaslarda oluşan elektriksel etkinliği dinleyerek kullanıcının hareket niyetini tahmin eder. Başka bir deyişle protez, kasların fısıltısını mekanik parmakların anlayabileceği komutlara çevirir.</p>

<p>``</p>

<h2 id="emg-sinyali-nedir">EMG sinyali nedir?</h2>

<p>Elektromiyografi, kas lifleri etkinleştiğinde oluşan elektriksel potansiyellerin ölçülmesidir. Yüzey EMG sistemlerinde elektrotlar deri üzerine yerleştirilir. Kullanıcı elini kapatmayı düşündüğünde ön koldaki ilgili kaslar kasılır ve elektrotlarda mikrovolt ile milivolt seviyeleri arasında değişen bir sinyal oluşur.</p>

<p>Ham EMG genellikle düzensiz, çift yönlü ve gürültülüdür. Bu nedenle sinyal doğrudan motora gönderilemez. Ölçülen veri basitleştirilmiş biçimde</p>

\[x(t)=s(t)+n(t)\]

<p>olarak düşünülebilir. Burada $s(t)$ istenen kas etkinliği, $n(t)$ ise hareket artefaktı, elektronik gürültü ve şebeke paraziti gibi istenmeyen bileşenlerdir.</p>

<h2 id="sinyal-işleme-hattı">Sinyal işleme hattı</h2>

<p>Tipik bir protez kontrol sistemi aşağıdaki aşamalardan oluşur:</p>

<table>
  <thead>
    <tr>
      <th>Aşama</th>
      <th>Amaç</th>
      <th>Yaygın yöntem</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ölçüm</td>
      <td>Kas etkinliğini toplamak</td>
      <td>Yüzey elektrotları</td>
    </tr>
    <tr>
      <td>Filtreleme</td>
      <td>Gürültüyü azaltmak</td>
      <td>Bant geçiren ve çentik filtre</td>
    </tr>
    <tr>
      <td>Pencereleme</td>
      <td>Veriyi kısa bölümlere ayırmak</td>
      <td>150–300 ms kayan pencere</td>
    </tr>
    <tr>
      <td>Özellik çıkarımı</td>
      <td>Sinyali sayısal olarak özetlemek</td>
      <td>RMS, MAV, sıfır geçişi</td>
    </tr>
    <tr>
      <td>Sınıflandırma</td>
      <td>Hareket niyetini belirlemek</td>
      <td>LDA, SVM, sinir ağı</td>
    </tr>
    <tr>
      <td>Motor kontrolü</td>
      <td>Kararı fiziksel harekete çevirmek</td>
      <td>PWM ve geri besleme</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/kas-sinyalinden-kavramaya-79.svg" alt="kas-sinyalinden-kavramaya-79" /></p>

<p>EMG enerjisinin önemli bölümü yaklaşık 20–450 Hz aralığındadır. Bant geçiren filtre bu aralığın dışındaki bileşenleri bastırırken, 50 Hz veya 60 Hz çentik filtresi elektrik şebekesinden gelen uğultuyu azaltır.</p>

<h2 id="kasılmayı-sayıya-dönüştürmek">Kasılmayı sayıya dönüştürmek</h2>

<p>Filtrelenmiş sinyal kısa zaman pencerelerine ayrılır. Her pencere için hesaplanan RMS değeri kasılma şiddetini özetleyebilir:</p>

\[RMS=\sqrt{\frac{1}{N}\sum_{i=1}^{N}x_i^2}\]

<p>Benzer şekilde ortalama mutlak değer, yani MAV,</p>

\[MAV=\frac{1}{N}\sum_{i=1}^{N}\vert x_i\vert\]

<p>ile hesaplanır. RMS büyükse güçlü, küçükse zayıf kasılma olduğu yorumlanabilir. Ancak farklı hareketler benzer enerji üretebildiği için birden fazla elektrot kanalı ve özellik birlikte kullanılır.</p>

<p>Aşağıdaki Python örneği, örnek bir EMG dizisini filtreler ve pencerelerden RMS özellikleri çıkarır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">from</span> <span class="n">scipy.signal</span> <span class="kn">import</span> <span class="n">butter</span><span class="p">,</span> <span class="n">filtfilt</span>

<span class="k">def</span> <span class="nf">bandpass_emg</span><span class="p">(</span><span class="n">signal</span><span class="p">,</span> <span class="n">fs</span><span class="o">=</span><span class="mi">1000</span><span class="p">):</span>
    <span class="c1"># 20-450 Hz arasındaki kas etkinliğini korur.
</span>    <span class="n">b</span><span class="p">,</span> <span class="n">a</span> <span class="o">=</span> <span class="nf">butter</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="p">[</span><span class="mi">20</span><span class="p">,</span> <span class="mi">450</span><span class="p">],</span> <span class="n">btype</span><span class="o">=</span><span class="sh">"</span><span class="s">bandpass</span><span class="sh">"</span><span class="p">,</span> <span class="n">fs</span><span class="o">=</span><span class="n">fs</span><span class="p">)</span>
    <span class="k">return</span> <span class="nf">filtfilt</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">signal</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">rms_features</span><span class="p">(</span><span class="n">signal</span><span class="p">,</span> <span class="n">window_size</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span> <span class="n">step</span><span class="o">=</span><span class="mi">100</span><span class="p">):</span>
    <span class="n">features</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="k">for</span> <span class="n">start</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nf">len</span><span class="p">(</span><span class="n">signal</span><span class="p">)</span> <span class="o">-</span> <span class="n">window_size</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">step</span><span class="p">):</span>
        <span class="n">window</span> <span class="o">=</span> <span class="n">signal</span><span class="p">[</span><span class="n">start</span><span class="p">:</span><span class="n">start</span> <span class="o">+</span> <span class="n">window_size</span><span class="p">]</span>
        <span class="n">features</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">sqrt</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">mean</span><span class="p">(</span><span class="n">window</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)))</span>
    <span class="k">return</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">(</span><span class="n">features</span><span class="p">)</span>

<span class="n">filtered</span> <span class="o">=</span> <span class="nf">bandpass_emg</span><span class="p">(</span><span class="n">raw_emg</span><span class="p">)</span>
<span class="n">rms_values</span> <span class="o">=</span> <span class="nf">rms_features</span><span class="p">(</span><span class="n">filtered</span><span class="p">)</span>
</code></pre></div></div>

<p>Buradaki 200 örneklik pencere, 1000 Hz örnekleme hızında 200 ms sürer. Pencerelerin örtüşmesi daha sık karar üretilmesini sağlar; ancak çok küçük pencereler kararsız tahminlere, çok büyük pencereler ise hissedilir gecikmeye yol açabilir.</p>

<h2 id="karardan-harekete">Karardan harekete</h2>

<p>Basit bir sistem RMS eşiğini aşınca eli kapatabilir. Daha gelişmiş sistemlerde farklı hareketlerden toplanmış özelliklerle bir sınıflandırıcı eğitilir. Model; eli açma, kapatma, işaret etme veya bileği döndürme sınıflarından birini seçer. Tahmin güveni düşükse protezin hareket etmemesi güvenli bir seçenek olabilir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Dezavantaj</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Eşik tabanlı</td>
      <td>Hızlı ve anlaşılır</td>
      <td>Az sayıda hareket</td>
    </tr>
    <tr>
      <td>Klasik makine öğrenmesi</td>
      <td>Küçük veriyle çalışabilir</td>
      <td>Özellik tasarımı gerekir</td>
    </tr>
    <tr>
      <td>Derin öğrenme</td>
      <td>Karmaşık örüntüleri öğrenir</td>
      <td>Daha çok veri ve işlem gücü ister</td>
    </tr>
  </tbody>
</table>

<p>Son aşamada sınıf etiketi motor sürücüsüne gönderilir. Kuvvet sensörleri de bardağın ezilmesini veya elden kaymasını önleyen geri besleme sağlar. Böylece sistem yalnızca “kapat” demez; ne kadar hızlı ve güçlü kapanacağını da ayarlayabilir.</p>

<p>Başarılı bir protez kontrolünde doğruluk tek hedef değildir. Gecikme, enerji tüketimi, kullanıcı konforu ve elektrotların terleme nedeniyle değişen teması da önemlidir. En iyi sistem, laboratuvarda en yüksek skoru alan değil, günlük yaşamda kullanıcının niyetini hızlı, güvenli ve doğal biçimde harekete dönüştürendir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="emg" /><category term="sinyal işleme" /><category term="protez" /><category term="makine öğrenmesi" /><category term="biyomedikal" /><category term="python" /><summary type="html"><![CDATA[Bir bardağı kavramak bize son derece doğal görünür; fakat bu hareketin arkasında sinir sistemi, kaslar ve beynin birlikte yönettiği karmaşık bir iletişim ağı bulunur. EMG kontrollü protez eller, kaslarda oluşan elektriksel etkinliği dinleyerek kullanıcının hareket niyetini tahmin eder. Başka bir deyişle protez, kasların fısıltısını mekanik parmakların anlayabileceği komutlara çevirir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/kas-sinyalinden-kavramaya-79.png" /><media:content medium="image" url="https://program.sonsuz.us/img/kas-sinyalinden-kavramaya-79.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Oyun Endüstrisinde Crunch Kültürü: Piksel Piksel Tükenmek</title><link href="https://program.sonsuz.us/posts/oyun-endustrisinde-crunch-kulturu-piksel-piksel-tukenmek/" rel="alternate" type="text/html" title="Oyun Endüstrisinde Crunch Kültürü: Piksel Piksel Tükenmek" /><published>2026-10-26T00:00:00+00:00</published><updated>2026-10-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/oyun-endustrisinde-crunch-kulturu-piksel-piksel-tukenmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/oyun-endustrisinde-crunch-kulturu-piksel-piksel-tukenmek/"><![CDATA[<p>Bir oyunun çıkış tarihi yaklaşırken ofiste sönen son ışık genellikle bir yazılımcının masasındadır. “Son bir hata kaldı” diye başlayan gece; yeni hatalar, soğumuş kahve ve sabah toplantısıyla bitebilir. Oyun endüstrisinde <strong>crunch</strong>, çalışanların haftalarca hatta aylarca yoğun fazla mesai yapmasıdır. Dışarıdan tutku ve kahramanlık gibi görünse de sosyolojik açıdan bu durum, bireysel tercihten çok örgüt kültürü ve güç ilişkileriyle ilgilidir.
``</p>

<h2 id="crunch-neden-ortaya-çıkıyor">Crunch neden ortaya çıkıyor?</h2>

<p>Oyun geliştirmek; yazılım, sanat, müzik, hikâye ve pazarlama gibi birçok alanın birbirine bağımlı olduğu karmaşık bir üretim sürecidir. Bir bölüm tasarımındaki gecikme test ekibini, motor değişikliği ise neredeyse herkesi etkileyebilir. Buna rağmen çıkış tarihleri yatırımcı toplantıları, tatil sezonları veya reklam anlaşmaları nedeniyle erkenden sabitlenir.</p>

<p>Basitçe proje baskısını şöyle düşünebiliriz:</p>

\[B = (K + D + Y) / Z\]

<p>Burada $K$ kapsamı, $D$ teknik belirsizliği, $Y$ yönetim kaynaklı değişiklikleri, $Z$ ise kullanılabilir zamanı temsil eder. Zaman azalırken kapsam aynı kalırsa baskı hızla büyür. Fakat bu matematiksel görüntünün arkasında sosyal bir seçim vardır: Takvim korunurken bedeli kim ödeyecektir?</p>

<h2 id="tutku-mu-görünmez-zorunluluk-mu">Tutku mu, görünmez zorunluluk mu?</h2>

<p>Crunch her zaman açık bir emirle başlamaz. “Biz burada bir aileyiz”, “Oyuncuları hayal kırıklığına uğratamayız” veya “Herkes elini taşın altına koyuyor” gibi söylemler fazla mesaiyi ahlaki göreve dönüştürebilir. Çalışan resmen özgürdür; ancak erken ayrıldığında takımını yarı yolda bıraktığını hisseder. Sosyolojide bu, normların davranışı doğrudan cezadan daha sessiz biçimde düzenlemesine örnektir.</p>

<table>
  <thead>
    <tr>
      <th>Sağlıklı üretim kültürü</th>
      <th>Crunch kültürü</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Gerçekçi kapsam planlanır</td>
      <td>Değişmeyen teslim tarihi kutsallaştırılır</td>
    </tr>
    <tr>
      <td>Hatalar süreç problemi sayılır</td>
      <td>Hatalar kişisel yetersizlik gibi görülür</td>
    </tr>
    <tr>
      <td>Dinlenme işin parçasıdır</td>
      <td>Uykusuzluk bağlılık göstergesidir</td>
    </tr>
    <tr>
      <td>Fazla mesai istisnadır</td>
      <td>Fazla mesai görünmez standarttır</td>
    </tr>
    <tr>
      <td>Çalışan itiraz edebilir</td>
      <td>İtiraz eden “tutkusuz” damgası yer</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/oyun-endustrisinde-crunch-36.svg" alt="oyun-endustrisinde-crunch-36" /></p>

<h2 id="ruh-sağlığına-yazılan-teknik-borç">Ruh sağlığına yazılan teknik borç</h2>

<p>Uzun çalışma saatleri uyku düzenini bozabilir; kaygı, depresif belirtiler, öfke ve tükenmişlik riskini artırabilir. Üstelik bilişsel performans düştüğünde daha çok hata üretilir. Bu da yeni mesai ihtiyacı doğurarak bir geri besleme döngüsü yaratır:</p>

\[Yorgunluk \rightarrow Hata \rightarrow Yeniden\ İş \rightarrow Fazla\ Mesai \rightarrow Yorgunluk\]

<p>Aşağıdaki küçük Python örneği, haftalık çalışma koşullarına göre basit bir risk göstergesi üretir. Bu bir tıbbi teşhis aracı değil, ekip içi değerlendirmeyi görünür kılan öğretici bir modeldir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">crunch_riski</span><span class="p">(</span><span class="n">saat</span><span class="p">,</span> <span class="n">ardisik_hafta</span><span class="p">,</span> <span class="n">gece_mesaisi</span><span class="p">):</span>
    <span class="n">normal_fazlasi</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">saat</span> <span class="o">-</span> <span class="mi">40</span><span class="p">)</span>
    <span class="n">risk</span> <span class="o">=</span> <span class="n">normal_fazlasi</span> <span class="o">*</span> <span class="mf">0.08</span>
    <span class="n">risk</span> <span class="o">+=</span> <span class="n">ardisik_hafta</span> <span class="o">*</span> <span class="mf">0.6</span>

    <span class="k">if</span> <span class="n">gece_mesaisi</span><span class="p">:</span>
        <span class="n">risk</span> <span class="o">*=</span> <span class="mf">1.25</span>

    <span class="k">return</span> <span class="nf">round</span><span class="p">(</span><span class="nf">min</span><span class="p">(</span><span class="n">risk</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span> <span class="mi">1</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">crunch_riski</span><span class="p">(</span><span class="mi">65</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="bp">True</span><span class="p">))</span>  <span class="c1"># 5.8
</span></code></pre></div></div>

<p>Kod, çalışma süresi ile crunch’ın devamlılığını ayrı değerlendirir. Çünkü tek bir yoğun hafta ile aylar süren sistematik baskı aynı değildir. Gerçek hayatta rol güvencesi, bakım sorumlulukları ve yönetici desteği gibi değişkenler de hesaba katılmalıdır.</p>

<h2 id="döngü-nasıl-kırılır">Döngü nasıl kırılır?</h2>

<p>Çözüm, çalışanlara yalnızca meditasyon uygulaması üyeliği vermek değildir. Kapsam küçültme, ücretli fazla mesai, telafi izni, anonim geri bildirim, psikolojik destek ve gerçekçi kilometre taşları kurumsal düzeyde uygulanmalıdır. Yöneticiler “Kim fedakârlık yapacak?” yerine “Hangi özelliği sonraki sürüme taşıyabiliriz?” diye sormalıdır.</p>

<p>Sendikalaşma ve çalışan dayanışması da güç dengesini değiştirebilir. Çünkü bireysel olarak “hayır” demek kariyer riski yaratırken kolektif sınırlar daha koruyucudur. İyi oyunlar tükenmiş insanlardan çıkmak zorunda değildir. Sürdürülebilir geliştirme, yalnızca etik bir tercih değil; daha az hata, daha düşük personel kaybı ve daha güçlü kurumsal hafıza sağlayan teknik bir stratejidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="oyun geliştirme" /><category term="crunch" /><category term="yazılım" /><category term="ruh sağlığı" /><category term="sosyoloji" /><category term="çalışma kültürü" /><summary type="html"><![CDATA[Bir oyunun çıkış tarihi yaklaşırken ofiste sönen son ışık genellikle bir yazılımcının masasındadır. “Son bir hata kaldı” diye başlayan gece; yeni hatalar, soğumuş kahve ve sabah toplantısıyla bitebilir. Oyun endüstrisinde crunch, çalışanların haftalarca hatta aylarca yoğun fazla mesai yapmasıdır. Dışarıdan tutku ve kahramanlık gibi görünse de sosyolojik açıdan bu durum, bireysel tercihten çok örgüt kültürü ve güç ilişkileriyle ilgilidir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/oyun-endustrisinde-crunch-36.png" /><media:content medium="image" url="https://program.sonsuz.us/img/oyun-endustrisinde-crunch-36.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Robotik Hasat Sistemlerinde Nesne Tanıma ve Meyve Olgunluğu Analizi</title><link href="https://program.sonsuz.us/posts/robotik-hasat-sistemlerinde-nesne-tanima-ve-meyve-olgunlugu-analizi/" rel="alternate" type="text/html" title="Robotik Hasat Sistemlerinde Nesne Tanıma ve Meyve Olgunluğu Analizi" /><published>2026-10-26T00:00:00+00:00</published><updated>2026-10-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/robotik-hasat-sistemlerinde-nesne-tanima-ve-meyve-olgunlugu-analizi</id><content type="html" xml:base="https://program.sonsuz.us/posts/robotik-hasat-sistemlerinde-nesne-tanima-ve-meyve-olgunlugu-analizi/"><![CDATA[<p>Bir meyve toplama robotu için ağaca bakmak, insanın manav tezgâhına bakmasından çok daha karmaşıktır. Robot; yaprakların arkasındaki meyveleri bulmalı, hangilerinin olgun olduğunu anlamalı ve ezmeden toplayabileceği bir hareket planlamalıdır. Bu süreçte kameralar robotun gözü, görüntü işleme algoritmaları ise deneyimli bir çiftçinin sezgileri gibi çalışır.</p>

<p><img src="/img/robotik-hasat-sistemlerinde-46.svg" alt="robotik-hasat-sistemlerinde-46" /></p>

<p>``</p>

<h2 id="robot-meyveyi-nasıl-görür">Robot meyveyi nasıl görür?</h2>

<p>Sistem genellikle RGB, derinlik veya multispektral kamera kullanır. RGB kamera renk ve doku bilgisi sağlarken derinlik kamerası meyvenin robota uzaklığını ölçer. Multispektral kameralar ise insan gözünün göremediği yakın kızılötesi bantları inceleyerek meyvenin kimyasal yapısı hakkında ipuçları yakalayabilir.</p>

<p>İlk aşama <strong>nesne tespiti</strong>dir. Görüntü içindeki elma, domates veya çilek gibi hedefler sınırlayıcı kutu ya da piksel maskesiyle belirlenir. YOLO gibi tek aşamalı modeller hızlı çalıştıkları için hareketli robotlarda sık kullanılır. Mask R-CNN gibi bölütleme modelleri ise meyvenin sınırlarını daha hassas çıkarır; ancak daha fazla hesaplama gücü ister.</p>

<table>
  <thead>
    <tr>
      <th>Yöntem</th>
      <th>Avantajı</th>
      <th>Dezavantajı</th>
      <th>Uygun kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Renk eşikleme</td>
      <td>Hızlı ve ucuzdur</td>
      <td>Işıktan kolay etkilenir</td>
      <td>Kontrollü seralar</td>
    </tr>
    <tr>
      <td>YOLO</td>
      <td>Gerçek zamanlı tespit yapar</td>
      <td>Eğitim verisi gerektirir</td>
      <td>Hareketli hasat robotları</td>
    </tr>
    <tr>
      <td>Mask R-CNN</td>
      <td>Hassas meyve maskesi üretir</td>
      <td>Hesaplama maliyeti yüksektir</td>
      <td>Karmaşık ve örtüşen sahneler</td>
    </tr>
    <tr>
      <td>Multispektral analiz</td>
      <td>İç kaliteyi tahmin edebilir</td>
      <td>Kamera maliyeti yüksektir</td>
      <td>Hassas olgunluk ölçümü</td>
    </tr>
  </tbody>
</table>

<h2 id="olgunluk-yalnızca-renk-değildir">Olgunluk yalnızca renk değildir</h2>

<p>Kırmızı bir elmanın olgun olduğu düşünülebilir; fakat güneş ışığı, kamera pozlaması ve meyvenin çeşidi bu varsayımı bozabilir. Bu nedenle sistemler renk, doku, boyut ve spektral yansıma gibi birden fazla özelliği birlikte değerlendirir.</p>

<p>RGB yerine HSV renk uzayı kullanıldığında renk tonu, parlaklıktan kısmen ayrılır. Burada <strong>H</strong> renk tonunu, <strong>S</strong> doygunluğu, <strong>V</strong> ise parlaklığı temsil eder. Basit bir olgunluk skoru şöyle tanımlanabilir:</p>

\[M = w_h H + w_s S + w_t T + w_d D\]

<p>Bu denklemde $T$ doku özelliğini, $D$ tahmin edilen çapı, $w$ değerleri ise her özelliğin önem katsayısını gösterir. Makine öğrenmesi kullanıldığında bu ağırlıklar elle seçilmek yerine veriden öğrenilir. İkili sınıflandırmada modelin olgunluk olasılığı lojistik fonksiyonla hesaplanabilir:</p>

\[P(olgun) = \frac{1}{1 + e^{-z}}\]

<p>Olasılık belirlenen eşiği, örneğin $0.80$ değerini aşarsa robot toplama kararı verir.</p>

<h2 id="basit-bir-renk-analizi">Basit bir renk analizi</h2>

<p>Aşağıdaki Python kodu, görüntüdeki kırmızı bölgeleri HSV eşikleme ile ayırır. Bu yaklaşım tek başına endüstriyel çözüm değildir; ancak olgun domates adaylarını hızlıca belirleyen faydalı bir ön işleme adımıdır.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">cv2</span>
<span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>

<span class="n">image</span> <span class="o">=</span> <span class="n">cv2</span><span class="p">.</span><span class="nf">imread</span><span class="p">(</span><span class="sh">'</span><span class="s">domatesler.jpg</span><span class="sh">'</span><span class="p">)</span>
<span class="n">hsv</span> <span class="o">=</span> <span class="n">cv2</span><span class="p">.</span><span class="nf">cvtColor</span><span class="p">(</span><span class="n">image</span><span class="p">,</span> <span class="n">cv2</span><span class="p">.</span><span class="n">COLOR_BGR2HSV</span><span class="p">)</span>

<span class="c1"># Kırmızı, HSV çemberinin iki ucunda bulunduğu için iki aralık kullanılır.
</span><span class="n">mask1</span> <span class="o">=</span> <span class="n">cv2</span><span class="p">.</span><span class="nf">inRange</span><span class="p">(</span><span class="n">hsv</span><span class="p">,</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="mi">90</span><span class="p">,</span> <span class="mi">70</span><span class="p">]),</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="mi">10</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">]))</span>
<span class="n">mask2</span> <span class="o">=</span> <span class="n">cv2</span><span class="p">.</span><span class="nf">inRange</span><span class="p">(</span><span class="n">hsv</span><span class="p">,</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="mi">170</span><span class="p">,</span> <span class="mi">90</span><span class="p">,</span> <span class="mi">70</span><span class="p">]),</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="mi">180</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">]))</span>
<span class="n">mask</span> <span class="o">=</span> <span class="n">cv2</span><span class="p">.</span><span class="nf">bitwise_or</span><span class="p">(</span><span class="n">mask1</span><span class="p">,</span> <span class="n">mask2</span><span class="p">)</span>

<span class="c1"># Küçük gürültüleri temizleyerek daha kararlı bölgeler oluştururuz.
</span><span class="n">kernel</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">ones</span><span class="p">((</span><span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span> <span class="n">np</span><span class="p">.</span><span class="n">uint8</span><span class="p">)</span>
<span class="n">mask</span> <span class="o">=</span> <span class="n">cv2</span><span class="p">.</span><span class="nf">morphologyEx</span><span class="p">(</span><span class="n">mask</span><span class="p">,</span> <span class="n">cv2</span><span class="p">.</span><span class="n">MORPH_OPEN</span><span class="p">,</span> <span class="n">kernel</span><span class="p">)</span>

<span class="n">ratio</span> <span class="o">=</span> <span class="n">cv2</span><span class="p">.</span><span class="nf">countNonZero</span><span class="p">(</span><span class="n">mask</span><span class="p">)</span> <span class="o">/</span> <span class="n">mask</span><span class="p">.</span><span class="n">size</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">'</span><span class="s">Kırmızı piksel oranı: </span><span class="si">{</span><span class="n">ratio</span><span class="si">:</span><span class="p">.</span><span class="mi">2</span><span class="o">%</span><span class="si">}</span><span class="sh">'</span><span class="p">)</span>
</code></pre></div></div>

<p>Kod, kırmızı piksel oranını verir; fakat yaprak, gölge veya kırmızı bir ekipman yanlış pozitif üretebilir. Bu nedenle pratik sistemlerde sonuç, eğitilmiş bir sinir ağı ve derinlik ölçümüyle doğrulanır.</p>

<h2 id="tarladaki-gerçek-zorluklar">Tarladaki gerçek zorluklar</h2>

<p>Değişken güneş ışığı, üst üste gelen meyveler, rüzgârla sallanan dallar ve kamera üzerindeki toz model başarımını düşürür. Eğitim veri kümesinde farklı saatler, hava koşulları, çeşitler ve olgunluk seviyeleri bulunmalıdır. Döndürme, parlaklık değiştirme ve yapay gölge ekleme gibi veri artırma teknikleri de modeli dayanıklı hâle getirir.</p>

<p>Son aşamada meyvenin 3B konumu robot koluna aktarılır. Kol, yaklaşma açısını hesaplar; kuvvet sensörüyle sıkma basıncını sınırlar ve meyveyi nazikçe koparır. Böylece nesne tanıma yalnızca “Bu bir meyve mi?” sorusunu değil, “Olgun mu, nerede ve güvenle toplanabilir mi?” sorularını da yanıtlayan bütüncül bir karar mekanizmasına dönüşür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="robotik" /><category term="görüntü işleme" /><category term="nesne tanıma" /><category term="yapay zeka" /><category term="tarım teknolojileri" /><category term="python" /><summary type="html"><![CDATA[Bir meyve toplama robotu için ağaca bakmak, insanın manav tezgâhına bakmasından çok daha karmaşıktır. Robot; yaprakların arkasındaki meyveleri bulmalı, hangilerinin olgun olduğunu anlamalı ve ezmeden toplayabileceği bir hareket planlamalıdır. Bu süreçte kameralar robotun gözü, görüntü işleme algoritmaları ise deneyimli bir çiftçinin sezgileri gibi çalışır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/robotik-hasat-sistemlerinde-46.png" /><media:content medium="image" url="https://program.sonsuz.us/img/robotik-hasat-sistemlerinde-46.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>