<?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-26T12:05:40+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">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">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">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><entry><title type="html">Simülasyondan Gerçek Robota: Sim-to-Real Uçurumunu Aşmak</title><link href="https://program.sonsuz.us/posts/simulasyondan-gercek-robota-sim-to-real-ucurumunu-asmak/" rel="alternate" type="text/html" title="Simülasyondan Gerçek Robota: Sim-to-Real Uçurumunu Aşmak" /><published>2026-10-26T00:00:00+00:00</published><updated>2026-10-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/simulasyondan-gercek-robota-sim-to-real-ucurumunu-asmak</id><content type="html" xml:base="https://program.sonsuz.us/posts/simulasyondan-gercek-robota-sim-to-real-ucurumunu-asmak/"><![CDATA[<p>Bir robotun simülasyonda kusursuzca yürümesi, gerçek dünyaya çıktığında aynı zarafetle hareket edeceği anlamına gelmez. Sanal ortamda şampiyon olan kontrol politikası; gerçek motordaki gecikme, zemindeki sürtünme veya sensördeki küçücük bir gürültü yüzünden kendisini yerde bulabilir. Simülasyon ile fiziksel dünya arasındaki bu uyumsuzluğa <strong>sim-to-real gap</strong>, yani simülasyondan gerçeğe aktarım uçurumu denir.</p>

<p><img src="/img/simulasyondan-gercek-robota-35.svg" alt="simulasyondan-gercek-robota-35" /></p>

<p>``</p>

<h2 id="kontrol-politikası-ne-öğrenir">Kontrol politikası ne öğrenir?</h2>

<p>Takviyeli öğrenmede robot, bulunduğu durumdan hangi eyleme geçeceğini belirleyen bir politika öğrenir. Bu ilişki genel olarak</p>

\[a_t \sim \pi_\theta(a_t \mid s_t)\]

<p>biçiminde gösterilir. Burada $s_t$ robotun eklem açıları, hızları ve sensör ölçümleri gibi durum bilgisini; $a_t$ motorlara gönderilecek komutları; $\theta$ ise öğrenilen parametreleri temsil eder.</p>

<p>Amaç, zaman boyunca elde edilen indirimli ödülü büyütmektir:</p>

\[J(\theta)=\mathbb{E}\left[\sum_{t=0}^{T}\gamma^t r_t\right]\]

<p>Robot dengede kalmak, hedefe ilerlemek veya enerji tüketimini azaltmak gibi davranışları ödül fonksiyonu üzerinden keşfeder. Simülasyon bu süreç için idealdir; robot binlerce kez düşebilir, duvara çarpabilir ve yeniden başlatılabilir. Ne teknisyen üzülür ne de pahalı bir dişli kutusu kırılır.</p>

<h2 id="uçurum-neden-oluşur">Uçurum neden oluşur?</h2>

<p>Simülatörler gerçekliğin eksiksiz kopyası değil, hesaplanabilir modelleridir. Gerçek dünyadaki temas dinamikleri, kablo esnekliği, motor sıcaklığı ve kamera ışığı gibi ayrıntıların tamamını modellemek zordur.</p>

<table>
  <thead>
    <tr>
      <th>Etken</th>
      <th>Simülasyonda</th>
      <th>Gerçek dünyada</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sürtünme</td>
      <td>Sabit veya basitleştirilmiş</td>
      <td>Yüzeye ve aşınmaya göre değişken</td>
    </tr>
    <tr>
      <td>Sensörler</td>
      <td>Temiz ve düzenli veri</td>
      <td>Gürültü, sapma ve veri kaybı</td>
    </tr>
    <tr>
      <td>Motorlar</td>
      <td>Komuta anında yanıt</td>
      <td>Gecikme, doygunluk ve ısınma</td>
    </tr>
    <tr>
      <td>Temas</td>
      <td>Matematiksel yaklaşım</td>
      <td>Darbe, titreşim ve deformasyon</td>
    </tr>
    <tr>
      <td>Görüntü</td>
      <td>Kontrollü ışık</td>
      <td>Gölge, yansıma ve hareket bulanıklığı</td>
    </tr>
  </tbody>
</table>

<p>Politika simülatörün kusurlarını kullanmayı da öğrenebilir. Örneğin gerçek dışı bir temas modelinden yararlanarak yürüyen robot, fiziksel zeminde aynı numarayı yapamaz. Bu durum, adeta sınav sorularını ezberleyip konuyu öğrenmemeye benzer.</p>

<h2 id="domain-randomization-gerçekliği-tahmin-etmek-yerine-çeşitlendirmek">Domain randomization: Gerçekliği tahmin etmek yerine çeşitlendirmek</h2>

<p>En yaygın çözüm, eğitim sırasında fiziksel parametreleri rastgele değiştiren <strong>domain randomization</strong> yaklaşımıdır. Robot her bölümde farklı sürtünme, kütle, gecikme ve sensör gürültüsü görür. Böylece tek bir sanal dünyaya ezber yapmak yerine dayanıklı bir strateji geliştirir.</p>

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

<span class="c1"># Her eğitim bölümünde yeni fiziksel koşullar üretir.
</span><span class="k">def</span> <span class="nf">randomize_environment</span><span class="p">(</span><span class="n">sim</span><span class="p">):</span>
    <span class="n">sim</span><span class="p">.</span><span class="n">friction</span> <span class="o">=</span> <span class="n">random</span><span class="p">.</span><span class="nf">uniform</span><span class="p">(</span><span class="mf">0.4</span><span class="p">,</span> <span class="mf">1.2</span><span class="p">)</span>
    <span class="n">sim</span><span class="p">.</span><span class="n">motor_strength</span> <span class="o">=</span> <span class="n">random</span><span class="p">.</span><span class="nf">uniform</span><span class="p">(</span><span class="mf">0.85</span><span class="p">,</span> <span class="mf">1.15</span><span class="p">)</span>
    <span class="n">sim</span><span class="p">.</span><span class="n">sensor_noise</span> <span class="o">=</span> <span class="n">random</span><span class="p">.</span><span class="nf">uniform</span><span class="p">(</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.03</span><span class="p">)</span>
    <span class="n">sim</span><span class="p">.</span><span class="n">control_delay</span> <span class="o">=</span> <span class="n">random</span><span class="p">.</span><span class="nf">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>

<span class="k">for</span> <span class="n">episode</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">10_000</span><span class="p">):</span>
    <span class="nf">randomize_environment</span><span class="p">(</span><span class="n">sim</span><span class="p">)</span>
    <span class="n">observation</span> <span class="o">=</span> <span class="n">sim</span><span class="p">.</span><span class="nf">reset</span><span class="p">()</span>
    <span class="nf">train_policy</span><span class="p">(</span><span class="n">observation</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu kod, politikanın belirli bir sürtünme katsayısına güvenmesini engeller. Ancak aralıklar aşırı geniş seçilirse öğrenme gereksiz yere zorlaşır; dar seçilirse gerçek dünya aralığın dışında kalabilir.</p>

<h2 id="diğer-köprü-kurma-yöntemleri">Diğer köprü kurma yöntemleri</h2>

<p><strong>Sistem tanımlama</strong>, gerçek robot üzerinde ölçümler yaparak kütle, motor tepkisi ve sürtünme gibi parametreleri tahmin eder. <strong>Domain adaptation</strong>, özellikle kamera görüntülerindeki sanal-gerçek farkını azaltır. <strong>Gerçek dünyada ince ayar</strong> ise simülasyonda öğrenilen politikayı az miktarda fiziksel deneyimle günceller.</p>

<table>
  <thead>
    <tr>
      <th>Yöntem</th>
      <th>Güçlü yanı</th>
      <th>Temel riski</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Domain randomization</td>
      <td>Sağlam ve genellenebilir politika</td>
      <td>Eğitim zorlaşabilir</td>
    </tr>
    <tr>
      <td>Sistem tanımlama</td>
      <td>Daha gerçekçi simülatör</td>
      <td>Parametreler zamanla değişebilir</td>
    </tr>
    <tr>
      <td>Domain adaptation</td>
      <td>Görsel farkları azaltır</td>
      <td>Ek veri ve model gerekir</td>
    </tr>
    <tr>
      <td>Gerçek ince ayar</td>
      <td>Doğrudan uyum sağlar</td>
      <td>Donanım hasarı riski taşır</td>
    </tr>
  </tbody>
</table>

<p>Pratikte en iyi sonuç genellikle bu tekniklerin birleşiminden gelir. Önce geniş bir simülasyon dağılımında eğitim yapılır, ardından güvenlik sınırlarıyla gerçek robot üzerinde dikkatli ince ayar uygulanır. Kısacası hedef, mükemmel bir simülatör yapmak değil; kusurlu simülasyona rağmen doğru karar verebilen bir robot yetiştirmektir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="robotik" /><category term="takviyeli öğrenme" /><category term="sim-to-real" /><category term="yapay zeka" /><category term="robot kontrolü" /><category term="domain randomization" /><summary type="html"><![CDATA[Bir robotun simülasyonda kusursuzca yürümesi, gerçek dünyaya çıktığında aynı zarafetle hareket edeceği anlamına gelmez. Sanal ortamda şampiyon olan kontrol politikası; gerçek motordaki gecikme, zemindeki sürtünme veya sensördeki küçücük bir gürültü yüzünden kendisini yerde bulabilir. Simülasyon ile fiziksel dünya arasındaki bu uyumsuzluğa sim-to-real gap, yani simülasyondan gerçeğe aktarım uçurumu denir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/simulasyondan-gercek-robota-35.png" /><media:content medium="image" url="https://program.sonsuz.us/img/simulasyondan-gercek-robota-35.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Tarladan Algoritmaya: Tarımsal Verilerle Pazar Fiyatı Tahmini</title><link href="https://program.sonsuz.us/posts/tarladan-algoritmaya-tarimsal-verilerle-pazar-fiyati-tahmini/" rel="alternate" type="text/html" title="Tarladan Algoritmaya: Tarımsal Verilerle Pazar Fiyatı Tahmini" /><published>2026-10-26T00:00:00+00:00</published><updated>2026-10-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/tarladan-algoritmaya-tarimsal-verilerle-pazar-fiyati-tahmini</id><content type="html" xml:base="https://program.sonsuz.us/posts/tarladan-algoritmaya-tarimsal-verilerle-pazar-fiyati-tahmini/"><![CDATA[<p><img src="/img/tarladan-algoritmaya-tarimsal-17.svg" alt="tarladan-algoritmaya-tarimsal-17" /></p>

<p>Domatesin gelecek ay kaç liraya satılacağını bilmek, yalnızca pazarcıların değil; çiftçilerin, kooperatiflerin ve gıda şirketlerinin de hayalidir. Kesin bir cevap vermek mümkün olmasa da geçmiş hasat miktarı, talep, hava koşulları ve fiyat hareketleri kullanılarak geleceğe yönelik güçlü tahminler üretilebilir. Üstelik bu iş için kristal küre yerine veri bilimi yeterlidir.
``</p>

<h2 id="fiyatı-hangi-değişkenler-belirler">Fiyatı hangi değişkenler belirler?</h2>

<p>Tarımsal ürün fiyatı, arz ve talebin kesiştiği noktada oluşur. Basitleştirilmiş biçimde arz artıp talep sabit kaldığında fiyat düşer; talep artıp arz sabit kaldığında ise fiyat yükselir. Ancak gerçek dünyada mazot maliyeti, döviz kuru, depolama kapasitesi, ithalat kararları ve mevsim etkisi de oyuna katılır.</p>

<p>Bir ürünün $t+1$ dönemindeki fiyatını şu fonksiyonla düşünebiliriz:</p>

\[P_{t+1}=f(P_t,H_t,D_t,W_t,C_t,S_t)+e\]

<p>Burada $P_t$ geçmiş fiyatı, $H_t$ hasat miktarını, $D_t$ talebi, $W_t$ hava koşullarını, $C_t$ üretim maliyetini ve $S_t$ mevsim bilgisini temsil eder. $e$ ise modelin açıklayamadığı beklenmedik olaylardır. Ani ihracat yasakları veya don felaketi gibi sürprizler bu terime saklanabilir.</p>

<table>
  <thead>
    <tr>
      <th>Veri</th>
      <th>Fiyata olası etkisi</th>
      <th>Örnek özellik</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Hasat miktarı</td>
      <td>Yüksek arz fiyatı düşürebilir</td>
      <td>Aylık üretim tonu</td>
    </tr>
    <tr>
      <td>Talep</td>
      <td>Artış fiyatı yükseltebilir</td>
      <td>Satış veya sipariş miktarı</td>
    </tr>
    <tr>
      <td>Hava durumu</td>
      <td>Verimi ve lojistiği etkiler</td>
      <td>Yağış, sıcaklık, don günü</td>
    </tr>
    <tr>
      <td>Maliyet</td>
      <td>Taban fiyatı yukarı itebilir</td>
      <td>Gübre, yakıt, işçilik</td>
    </tr>
    <tr>
      <td>Mevsim</td>
      <td>Düzenli dalgalanmaları açıklar</td>
      <td>Ay, hafta, hasat dönemi</td>
    </tr>
  </tbody>
</table>

<h2 id="geçmiş-veri-nasıl-hazırlanır">Geçmiş veri nasıl hazırlanır?</h2>

<p>Ham kayıtları doğrudan modele vermek genellikle iyi sonuç üretmez. Eksik değerler tamamlanmalı, farklı kaynaklardaki tarihler eşleştirilmeli ve aşırı uçlar incelenmelidir. Örneğin kilogram ve ton değerlerinin aynı sütunda karışması, algoritmaya küçük çaplı bir matematik şakası yaptırır; fakat kimse gülmez.</p>

<p>Zaman serilerinde gecikmeli özellikler özellikle değerlidir. Geçen ayın fiyatı $P_{t-1}$, üç aylık ortalama ve geçen yılın aynı ayındaki fiyat modele eklenebilir. Ayrıca arz-talep oranı gibi türetilmiş bir değişken oluşturulabilir:</p>

\[R_t=H_t/D_t\]

<p>$R_t$ yükseldikçe piyasada ürün bolluğu bulunduğu düşünülebilir. Bununla birlikte bu ilişkinin her ürün için doğrusal olması beklenmemelidir.</p>

<h2 id="hangi-algoritma-seçilmeli">Hangi algoritma seçilmeli?</h2>

<table>
  <thead>
    <tr>
      <th>Algoritma</th>
      <th>Güçlü yanı</th>
      <th>Sınırlaması</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Doğrusal regresyon</td>
      <td>Açıklanabilir ve hızlıdır</td>
      <td>Karmaşık ilişkileri kaçırabilir</td>
    </tr>
    <tr>
      <td>ARIMA</td>
      <td>Zaman bağımlılığını modeller</td>
      <td>Dış değişkenleri yönetmek zorlaşabilir</td>
    </tr>
    <tr>
      <td>Random Forest</td>
      <td>Doğrusal olmayan ilişkileri öğrenir</td>
      <td>Zaman sırasını kendiliğinden anlamaz</td>
    </tr>
    <tr>
      <td>XGBoost</td>
      <td>Tablosal veride yüksek başarı sağlar</td>
      <td>Ayar ve özellik mühendisliği ister</td>
    </tr>
    <tr>
      <td>LSTM</td>
      <td>Uzun dönem örüntülerini öğrenebilir</td>
      <td>Çok veri ve hesaplama gücü gerektirir</td>
    </tr>
  </tbody>
</table>

<p>Başlangıç için doğrusal regresyon iyi bir referans modelidir. Ardından Random Forest veya XGBoost ile performans karşılaştırılabilir. Aşağıdaki Python örneği, gecikmeli fiyatlarla birlikte hasat ve talep verisini kullanır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">pandas</span> <span class="k">as</span> <span class="n">pd</span>
<span class="kn">from</span> <span class="n">sklearn.ensemble</span> <span class="kn">import</span> <span class="n">RandomForestRegressor</span>
<span class="kn">from</span> <span class="n">sklearn.metrics</span> <span class="kn">import</span> <span class="n">mean_absolute_error</span>

<span class="n">veri</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nf">read_csv</span><span class="p">(</span><span class="sh">'</span><span class="s">tarim_fiyatlari.csv</span><span class="sh">'</span><span class="p">,</span> <span class="n">parse_dates</span><span class="o">=</span><span class="p">[</span><span class="sh">'</span><span class="s">tarih</span><span class="sh">'</span><span class="p">])</span>
<span class="n">veri</span> <span class="o">=</span> <span class="n">veri</span><span class="p">.</span><span class="nf">sort_values</span><span class="p">(</span><span class="sh">'</span><span class="s">tarih</span><span class="sh">'</span><span class="p">)</span>

<span class="c1"># Geçmiş fiyatlardan tahmin edici özellikler oluşturur.
</span><span class="n">veri</span><span class="p">[</span><span class="sh">'</span><span class="s">fiyat_1_ay</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">veri</span><span class="p">[</span><span class="sh">'</span><span class="s">fiyat</span><span class="sh">'</span><span class="p">].</span><span class="nf">shift</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">veri</span><span class="p">[</span><span class="sh">'</span><span class="s">fiyat_3_ay_ortalama</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">veri</span><span class="p">[</span><span class="sh">'</span><span class="s">fiyat</span><span class="sh">'</span><span class="p">].</span><span class="nf">shift</span><span class="p">(</span><span class="mi">1</span><span class="p">).</span><span class="nf">rolling</span><span class="p">(</span><span class="mi">3</span><span class="p">).</span><span class="nf">mean</span><span class="p">()</span>
<span class="n">veri</span><span class="p">[</span><span class="sh">'</span><span class="s">arz_talep_orani</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">veri</span><span class="p">[</span><span class="sh">'</span><span class="s">hasat</span><span class="sh">'</span><span class="p">]</span> <span class="o">/</span> <span class="n">veri</span><span class="p">[</span><span class="sh">'</span><span class="s">talep</span><span class="sh">'</span><span class="p">]</span>
<span class="n">veri</span> <span class="o">=</span> <span class="n">veri</span><span class="p">.</span><span class="nf">dropna</span><span class="p">()</span>

<span class="n">ozellikler</span> <span class="o">=</span> <span class="p">[</span><span class="sh">'</span><span class="s">hasat</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">talep</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">fiyat_1_ay</span><span class="sh">'</span><span class="p">,</span>
              <span class="sh">'</span><span class="s">fiyat_3_ay_ortalama</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">arz_talep_orani</span><span class="sh">'</span><span class="p">]</span>

<span class="c1"># Zaman sırasını koruyarak geçmişi eğitim, son dönemi test yapar.
</span><span class="n">sinir</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">veri</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.8</span><span class="p">)</span>
<span class="n">egitim</span><span class="p">,</span> <span class="n">test</span> <span class="o">=</span> <span class="n">veri</span><span class="p">.</span><span class="n">iloc</span><span class="p">[:</span><span class="n">sinir</span><span class="p">],</span> <span class="n">veri</span><span class="p">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">sinir</span><span class="p">:]</span>

<span class="n">model</span> <span class="o">=</span> <span class="nc">RandomForestRegressor</span><span class="p">(</span><span class="n">n_estimators</span><span class="o">=</span><span class="mi">300</span><span class="p">,</span> <span class="n">random_state</span><span class="o">=</span><span class="mi">42</span><span class="p">)</span>
<span class="n">model</span><span class="p">.</span><span class="nf">fit</span><span class="p">(</span><span class="n">egitim</span><span class="p">[</span><span class="n">ozellikler</span><span class="p">],</span> <span class="n">egitim</span><span class="p">[</span><span class="sh">'</span><span class="s">fiyat</span><span class="sh">'</span><span class="p">])</span>
<span class="n">tahmin</span> <span class="o">=</span> <span class="n">model</span><span class="p">.</span><span class="nf">predict</span><span class="p">(</span><span class="n">test</span><span class="p">[</span><span class="n">ozellikler</span><span class="p">])</span>

<span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">MAE:</span><span class="sh">'</span><span class="p">,</span> <span class="nf">mean_absolute_error</span><span class="p">(</span><span class="n">test</span><span class="p">[</span><span class="sh">'</span><span class="s">fiyat</span><span class="sh">'</span><span class="p">],</span> <span class="n">tahmin</span><span class="p">))</span>
</code></pre></div></div>

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

<p>Ortalama mutlak hata, tahminlerin gerçek fiyattan ortalama sapmasını gösterir:</p>

\[MAE=(1/n)\sum_{i=1}^{n}\vert y_i-p_i\vert\]

<p>Zaman serilerinde veriyi rastgele karıştırmak geleceğin bilgisini geçmişe sızdırabilir. Bu nedenle test kümesi daima daha yeni tarihlerden seçilmelidir. Model yalnızca tek sayı üretmek yerine güven aralığı da sunmalıdır. Sonuçta fiyat tahmini kesin kehanet değil, belirsizlik altında karar desteğidir. Doğru kurulan bir sistem çiftçiye ekim planı, depolama zamanı ve satış stratejisi konusunda önemli bir pusula sağlayabilir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="tarım" /><category term="makine öğrenmesi" /><category term="fiyat tahmini" /><category term="zaman serisi" /><category term="veri bilimi" /><category term="python" /><summary type="html"><![CDATA[Domatesin gelecek ay kaç liraya satılacağını bilmek, yalnızca pazarcıların değil; çiftçilerin, kooperatiflerin ve gıda şirketlerinin de hayalidir. Kesin bir cevap vermek mümkün olmasa da geçmiş hasat miktarı, talep, hava koşulları ve fiyat hareketleri kullanılarak geleceğe yönelik güçlü tahminler üretilebilir. Üstelik bu iş için kristal küre yerine veri bilimi yeterlidir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/tarladan-algoritmaya-tarimsal-17.png" /><media:content medium="image" url="https://program.sonsuz.us/img/tarladan-algoritmaya-tarimsal-17.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Tool-Assisted Speedrun: Kusursuz Oyun Koşularının Bilimi</title><link href="https://program.sonsuz.us/posts/tool-assisted-speedrun-kusursuz-oyun-kosularinin-bilimi/" rel="alternate" type="text/html" title="Tool-Assisted Speedrun: Kusursuz Oyun Koşularının Bilimi" /><published>2026-10-26T00:00:00+00:00</published><updated>2026-10-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/tool-assisted-speedrun-kusursuz-oyun-kosularinin-bilimi</id><content type="html" xml:base="https://program.sonsuz.us/posts/tool-assisted-speedrun-kusursuz-oyun-kosularinin-bilimi/"><![CDATA[<p>Bir karakterin aynı karede hem mermiden kaçıp hem duvardan sekerek bölüm sonu canavarını saniyeler içinde yenmesi insanüstü görünebilir. Tool-Assisted Speedrun, kısaca TAS, tam olarak bu tür koşuları üretmek için emülatörlerin, kare kare giriş düzenlemenin ve yazılım araçlarının kullanıldığı teknik bir oyun optimizasyonu disiplinidir.
``
TAS’ın amacı genellikle oyunu gerçek zamanlı oynamak değil, teorik olarak mümkün olan en hızlı veya en etkileyici giriş dizisini oluşturmaktır. Oyuncu reflekslerinin yerini dikkatli analiz alır; ancak ortaya çıkan hareketlerin tamamı oyunun kabul ettiği kontrol girdilerinden oluşur. Başka bir deyişle araç, oyunun kurallarını değiştirmez; doğru tuşa doğru karede basmayı kolaylaştırır.</p>

<h2 id="bir-tas-nasıl-çalışır">Bir TAS nasıl çalışır?</h2>

<p>Dijital oyunlar zamanı çoğunlukla karelerle ölçer. Saniyede 60 kare çalışan bir oyunda tek karenin süresi yaklaşık olarak</p>

\[t_f = \frac{1}{60} \approx 0{,}0167\text{ saniye}\]

<p>olur. İnsanların görsel uyarılara tepki süresi yaklaşık 150–250 milisaniyeyken TAS üreticisi girdiyi tek kare, yani yaklaşık 16,7 milisaniye hassasiyetle yerleştirebilir. Üstelik gerekirse oyunu yavaşlatabilir veya tamamen durdurabilir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Gerçek zamanlı speedrun</th>
      <th>TAS koşusu</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Girdi yöntemi</td>
      <td>Fiziksel kontrolcü</td>
      <td>Kare tabanlı giriş dosyası</td>
    </tr>
    <tr>
      <td>Hata düzeltme</td>
      <td>Koşuyu yeniden başlatma</td>
      <td>Save state’e geri dönme</td>
    </tr>
    <tr>
      <td>Hassasiyet</td>
      <td>İnsan refleksiyle sınırlı</td>
      <td>Tek kare düzeyi</td>
    </tr>
    <tr>
      <td>Rastgelelik</td>
      <td>Anlık yönetilir</td>
      <td>Analiz edilip yönlendirilebilir</td>
    </tr>
    <tr>
      <td>Temel hedef</td>
      <td>İnsan performansı</td>
      <td>Teorik optimizasyon</td>
    </tr>
  </tbody>
</table>

<h3 id="temel-araçlar">Temel araçlar</h3>

<p><strong>Frame advance</strong>, oyunu her komutta yalnızca bir kare ilerletir. <strong>Save state</strong>, belirli bir ana dönerek farklı girdilerin denenmesini sağlar. <strong>Input recording</strong> ise kullanılan tuşları video yerine küçük bir veri dosyasında saklar. Emülatör aynı başlangıç durumunda aynı girdileri aldığında aynı sonucu üretir; buna determinizm denir.</p>

<p>Basitleştirilmiş biçimde oyun durumu şöyle modellenebilir:</p>

\[S_{n+1} = F(S_n, I_n)\]

<p>Burada $S_n$ mevcut oyun durumunu, $I_n$ ilgili karedeki kontrol girdisini, $F$ ise oyunun güncelleme kurallarını temsil eder. TAS dosyası aslında $I_0, I_1, \ldots, I_k$ dizisidir. Video yalnızca bu dizinin çalıştırılmasıyla elde edilen sonuçtur.</p>

<h2 id="yazılım-en-iyi-girdiyi-nasıl-arar">Yazılım en iyi girdiyi nasıl arar?</h2>

<p>Kısa bölümlerde olası girdiler programla taranabilir. Aşağıdaki Python örneği, sağa gitme ve zıplama seçeneklerinin dört karelik bütün kombinasyonlarını üretir:</p>

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

<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="sh">"</span><span class="s">bekle</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">sağ</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">zıpla</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">sağ+zıpla</span><span class="sh">"</span><span class="p">]</span>

<span class="k">def</span> <span class="nf">skor</span><span class="p">(</span><span class="n">sequence</span><span class="p">):</span>
    <span class="c1"># Gerçekte burada emülatörden konum ve süre okunabilir.
</span>    <span class="k">return</span> <span class="nf">sum</span><span class="p">(</span><span class="mi">2</span> <span class="k">if</span> <span class="sh">"</span><span class="s">sağ</span><span class="sh">"</span> <span class="ow">in</span> <span class="n">action</span> <span class="k">else</span> <span class="mi">0</span> <span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="n">sequence</span><span class="p">)</span>

<span class="n">candidates</span> <span class="o">=</span> <span class="nf">product</span><span class="p">(</span><span class="n">inputs</span><span class="p">,</span> <span class="n">repeat</span><span class="o">=</span><span class="mi">4</span><span class="p">)</span>
<span class="n">best</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="n">candidates</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">skor</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">best</span><span class="p">,</span> <span class="nf">skor</span><span class="p">(</span><span class="n">best</span><span class="p">))</span>
</code></pre></div></div>

<p>Bu kod oyuncunun yerine doğrudan oyun oynamaz; olası giriş dizilerini üretip tanımlanan skora göre karşılaştırır. Gerçek projelerde arama uzayı çok hızlı büyür. Her karede dört seçenek varsa $n$ kare için kombinasyon sayısı $4^n$ olur. Bu nedenle brute force yerine sezgisel arama, dalları budama, bellek izleme ve oyun fiziğine özel botlar kullanılır.</p>

<h2 id="rng-manipülasyonu-ve-küçük-tuhaflıklar">RNG manipülasyonu ve küçük tuhaflıklar</h2>

<p>Rastgele sayı üreteçleri çoğu eski oyunda gerçekten rastgele değildir. Bir başlangıç tohumu ve önceki durum üzerinden hesaplanırlar. Oyuncu bir kare bekleyerek, farklı yöne bakarak veya menüyü açarak sonraki düşman davranışını değiştirebilir. Böylece istenen eşyanın düşmesi ya da bir saldırının gerçekleşmemesi sağlanabilir.</p>

<p>TAS üreticileri ayrıca hız taşması, duvar kırpma, yanlış warp ve gecikme azaltma gibi teknikleri inceler. Bazen daha az nesnenin ekranda kalmasını sağlamak, oyun motorunun daha az yavaşlamasına ve toplam sürenin düşmesine yardım eder.</p>

<p>TAS bir hile gösterisinden çok deneysel bir laboratuvardır: fizik kuralları ölçülür, rotalar karşılaştırılır ve her kare optimize edilir. Sonuçta ortaya yalnızca hızlı bir video değil, oyunun sınırlarını belgeleyen yeniden üretilebilir bir yazılım eseri çıkar.</p>

<p><img src="/img/tool-assisted-speedrun-24.svg" alt="tool-assisted-speedrun-24" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="tas" /><category term="speedrun" /><category term="oyun geliştirme" /><category term="emülasyon" /><category term="algoritma" /><category term="optimizasyon" /><summary type="html"><![CDATA[Bir karakterin aynı karede hem mermiden kaçıp hem duvardan sekerek bölüm sonu canavarını saniyeler içinde yenmesi insanüstü görünebilir. Tool-Assisted Speedrun, kısaca TAS, tam olarak bu tür koşuları üretmek için emülatörlerin, kare kare giriş düzenlemenin ve yazılım araçlarının kullanıldığı teknik bir oyun optimizasyonu disiplinidir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/tool-assisted-speedrun-24.png" /><media:content medium="image" url="https://program.sonsuz.us/img/tool-assisted-speedrun-24.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Toplu Taşıma Rota Optimizasyonu: Şehrin Görünmez Matematiği</title><link href="https://program.sonsuz.us/posts/toplu-tasima-rota-optimizasyonu-sehrin-gorunmez-matematigi/" rel="alternate" type="text/html" title="Toplu Taşıma Rota Optimizasyonu: Şehrin Görünmez Matematiği" /><published>2026-10-26T00:00:00+00:00</published><updated>2026-10-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/toplu-tasima-rota-optimizasyonu-sehrin-gorunmez-matematigi</id><content type="html" xml:base="https://program.sonsuz.us/posts/toplu-tasima-rota-optimizasyonu-sehrin-gorunmez-matematigi/"><![CDATA[<p>Sabah işe giderken otobüsün tıklım tıklım, karşı yönden gelen aracın ise neredeyse boş olduğunu gördünüz mü? Bu dengesizlik yalnızca kötü şans değildir; yolcu talebi, araç kapasitesi ve sefer sıklığı arasındaki optimizasyon probleminin görünür sonucudur. Toplu taşıma planlaması, milyonlarca olası rota arasından hem yolcuyu hem işletmeciyi memnun edecek bir denge bulmaya çalışır.</p>

<p><img src="/img/toplu-tasima-rota-48.svg" alt="toplu-tasima-rota-48" /></p>

<p>``
Bir toplu taşıma ağı, <strong>çizge teorisi</strong> kullanılarak modellenebilir. Duraklar düğüm, duraklar arasındaki bağlantılar ise kenar olarak düşünülür. Her kenara seyahat süresi, mesafe, maliyet ve beklenen yoğunluk gibi ağırlıklar atanır. Böylece şehir haritası, algoritmaların üzerinde çalışabileceği matematiksel bir ağa dönüşür.</p>

<p>Yolcu talebi genellikle bir <strong>başlangıç-varış matrisi</strong> ile ifade edilir. $D_{ij}$ değeri, belirli bir zaman aralığında $i$ bölgesinden $j$ bölgesine gitmek isteyen yolcu sayısını gösterir. Sabah ve akşam değerleri farklı olacağından tek bir sabit matris yeterli değildir. Akıllı kart kayıtları, GPS verileri, mobil uygulama sorguları ve nüfus bilgileri kullanılarak saatlik talep tahminleri oluşturulur.</p>

<table>
  <thead>
    <tr>
      <th>Veri kaynağı</th>
      <th>Sağladığı bilgi</th>
      <th>Temel sınırlama</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Akıllı kart</td>
      <td>Biniş zamanı ve durağı</td>
      <td>İniş noktası her zaman bilinmez</td>
    </tr>
    <tr>
      <td>GPS</td>
      <td>Araç konumu ve gecikme</td>
      <td>Yolcu amacı hakkında bilgi vermez</td>
    </tr>
    <tr>
      <td>Mobil uygulama</td>
      <td>Aranan başlangıç ve varış</td>
      <td>Her yolcuyu temsil etmez</td>
    </tr>
    <tr>
      <td>Anket</td>
      <td>Tercih ve memnuniyet</td>
      <td>Pahalıdır ve çabuk eskiyebilir</td>
    </tr>
  </tbody>
</table>

<p>Optimizasyonun amaç fonksiyonu çoğunlukla yolcuların toplam seyahat ve bekleme süresini azaltırken işletme maliyetini kontrol altında tutar. Basitleştirilmiş bir model şöyle yazılabilir:</p>

\[\min Z = \alpha \sum_p T_p + \beta \sum_p W_p + \gamma \sum_r C_r x_r\]

<p>Burada $T_p$ yolcu $p$ için araç içindeki süreyi, $W_p$ bekleme süresini, $C_r$ ise $r$ rotasının işletme maliyetini gösterir. $x_r$, rotanın kullanılıp kullanılmadığını veya kaç araçla işletileceğini temsil eder. $\alpha$, $\beta$ ve $\gamma$ katsayıları hedeflerin önemini belirler. Beklemek psikolojik olarak daha yorucu algılandığı için çoğu modelde $\beta$, $\alpha$ değerinden büyük seçilebilir.</p>

<p>Elbette matematiğin keyfini kaçırmayı seven kısıtlar da vardır! Araç kapasitesi aşılmamalı, sürücü çalışma sürelerine uyulmalı, filo sayısı geçilmemeli ve her bölge asgari hizmet almalıdır:</p>

\[q_{r,t} \leq K_r \cdot f_{r,t}\]

<p>Bu eşitsizlikte $q_{r,t}$ ilgili rota ve saatteki talebi, $K_r$ araç kapasitesini, $f_{r,t}$ ise sefer sayısını belirtir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Güçlü yönü</th>
      <th>Uygun olduğu durum</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Dijkstra</td>
      <td>En kısa yolu hızlı bulur</td>
      <td>Tek yolcunun rota seçimi</td>
    </tr>
    <tr>
      <td>Doğrusal programlama</td>
      <td>Açıklanabilir ve ölçülebilir sonuç üretir</td>
      <td>Sefer sıklığı ve filo dağıtımı</td>
    </tr>
    <tr>
      <td>Genetik algoritma</td>
      <td>Büyük arama uzaylarını keşfeder</td>
      <td>Yeni hat tasarımı</td>
    </tr>
    <tr>
      <td>Pekiştirmeli öğrenme</td>
      <td>Değişen koşullara uyum sağlar</td>
      <td>Gerçek zamanlı araç yönetimi</td>
    </tr>
  </tbody>
</table>

<p>Aşağıdaki Python örneği, talebe göre basit bir saatlik sefer sayısı hesaplar:</p>

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

<span class="k">def</span> <span class="nf">gerekli_sefer</span><span class="p">(</span><span class="n">talep</span><span class="p">,</span> <span class="n">kapasite</span><span class="p">,</span> <span class="n">hedef_doluluk</span><span class="o">=</span><span class="mf">0.85</span><span class="p">):</span>
    <span class="n">etkin_kapasite</span> <span class="o">=</span> <span class="n">kapasite</span> <span class="o">*</span> <span class="n">hedef_doluluk</span>
    <span class="k">return</span> <span class="n">math</span><span class="p">.</span><span class="nf">ceil</span><span class="p">(</span><span class="n">talep</span> <span class="o">/</span> <span class="n">etkin_kapasite</span><span class="p">)</span>

<span class="n">saatlik_talep</span> <span class="o">=</span> <span class="mi">720</span>
<span class="n">sefer</span> <span class="o">=</span> <span class="nf">gerekli_sefer</span><span class="p">(</span><span class="n">saatlik_talep</span><span class="p">,</span> <span class="n">kapasite</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Saatte en az </span><span class="si">{</span><span class="n">sefer</span><span class="si">}</span><span class="s"> sefer planlanmalı.</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Buradaki hedef doluluk oranı, aracın tamamen doldurulmasını önleyerek konfor ve ani talep artışları için pay bırakır. Ancak gerçek sistemlerde aktarmalar, trafik, engelli erişimi, gecikme olasılığı ve bölgesel adalet de hesaba katılır.</p>

<p>Başarılı rota optimizasyonu yalnızca en kısa veya en ucuz ağı kurmak değildir. Amaç; erişilebilir, dayanıklı ve adil bir sistem tasarlamaktır. Kısacası iyi planlanmış bir metro hattı, yolcunun fark etmediği binlerce veri noktası ve matematiksel karar sayesinde “tam zamanında” gelir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="rota optimizasyonu" /><category term="toplu taşıma" /><category term="çizge teorisi" /><category term="doğrusal programlama" /><category term="veri bilimi" /><category term="akıllı şehirler" /><summary type="html"><![CDATA[Sabah işe giderken otobüsün tıklım tıklım, karşı yönden gelen aracın ise neredeyse boş olduğunu gördünüz mü? Bu dengesizlik yalnızca kötü şans değildir; yolcu talebi, araç kapasitesi ve sefer sıklığı arasındaki optimizasyon probleminin görünür sonucudur. Toplu taşıma planlaması, milyonlarca olası rota arasından hem yolcuyu hem işletmeciyi memnun edecek bir denge bulmaya çalışır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/toplu-tasima-rota-48.png" /><media:content medium="image" url="https://program.sonsuz.us/img/toplu-tasima-rota-48.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Yapay Zekâ Röntgen ve MR Görüntülerini Nasıl Yorumlar?</title><link href="https://program.sonsuz.us/posts/yapay-zeka-rontgen-ve-mr-goruntulerini-nasil-yorumlar/" rel="alternate" type="text/html" title="Yapay Zekâ Röntgen ve MR Görüntülerini Nasıl Yorumlar?" /><published>2026-10-26T00:00:00+00:00</published><updated>2026-10-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/yapay-zeka-rontgen-ve-mr-goruntulerini-nasil-yorumlar</id><content type="html" xml:base="https://program.sonsuz.us/posts/yapay-zeka-rontgen-ve-mr-goruntulerini-nasil-yorumlar/"><![CDATA[<p><img src="/img/yapay-zeka-rontgen-97.svg" alt="yapay-zeka-rontgen-97" /></p>

<p>Bir radyolog röntgene baktığında kenarları, yoğunluk farklılıklarını ve anatomik ilişkileri değerlendirir. Bilgisayar ise görüntüyü önce sayılardan oluşan dev bir tablo olarak görür. Yapay zekânın başarısı, bu sayısal desenlerle kırık, tümör veya doku bozukluğu gibi klinik bulgular arasındaki ilişkiyi öğrenmesinden gelir. Yine de bu teknoloji “dijital doktor” değil; hekimin kararını destekleyen güçlü bir araçtır.
``</p>

<h2 id="görüntü-bilgisayar-için-ne-anlama-gelir">Görüntü bilgisayar için ne anlama gelir?</h2>

<p>Gri tonlu bir tıbbi görüntü, her hücresinde parlaklık değeri bulunan bir matristir. Basitleştirilmiş biçimde görüntüyü $I(x,y)$ ile gösterebiliriz. Buradaki $x$ ve $y$ pikselin konumunu, $I$ ise yoğunluğunu ifade eder.</p>

<p>Röntgende yoğun dokular ışını daha fazla soğurduğu için kemikler genellikle parlak görünür. MR ise hidrojen çekirdeklerinin manyetik alandaki davranışını ölçer. Bu nedenle aynı anatomik bölge, kullanılan MR sekansına göre farklı görünebilir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Röntgen</th>
      <th>MR</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Temel fizik</td>
      <td>X-ışını soğurulması</td>
      <td>Manyetik alan ve radyo dalgaları</td>
    </tr>
    <tr>
      <td>Güçlü olduğu alan</td>
      <td>Kemik, akciğer, hızlı tarama</td>
      <td>Beyin, kas, bağ ve yumuşak doku</td>
    </tr>
    <tr>
      <td>Görüntü yapısı</td>
      <td>Çoğunlukla 2B</td>
      <td>Genellikle çok kesitli 3B hacim</td>
    </tr>
    <tr>
      <td>Yapay zekâ görevi</td>
      <td>Sınıflandırma, kırık bulma</td>
      <td>Segmentasyon, hacim ve lezyon analizi</td>
    </tr>
  </tbody>
</table>

<h2 id="model-nasıl-öğrenir">Model nasıl öğrenir?</h2>

<p>Önce uzmanlar tarafından etiketlenmiş çok sayıda görüntü hazırlanır. “Normal”, “zatürre şüphesi” veya lezyon sınırları gibi etiketler, modelin öğrenme hedefidir. Evrişimli sinir ağları (CNN), küçük filtreleri görüntü üzerinde gezdirerek kenar, doku ve şekil gibi özellikleri çıkarır.</p>

<p>Bir evrişim işlemi kabaca şöyle yazılır:</p>

\[F(i,j)=\sum_m\sum_n I(i+m,j+n)K(m,n)\]

<p>Burada $K$, belirli bir görsel deseni arayan filtredir. İlk katmanlar çizgileri öğrenirken daha derin katmanlar nodül veya anatomik yapı gibi karmaşık örüntülere duyarlı hâle gelir. Vision Transformer modelleri ise görüntüyü küçük parçalara ayırıp uzak bölgeler arasındaki ilişkileri “dikkat” mekanizmasıyla inceler.</p>

<p>Eğitim sırasında tahmin ile gerçek etiket arasındaki hata hesaplanır. İkili sınıflandırmada sık kullanılan kayıp fonksiyonu şöyledir:</p>

\[L=-[y\log(p)+(1-y)\log(1-p)]\]

<p>Model, bu değeri küçültecek şekilde milyonlarca parametresini günceller.</p>

<h2 id="tipik-analiz-hattı">Tipik analiz hattı</h2>

<p>Aşağıdaki örnek, eğitilmiş bir modelle görüntü sınıflandırma sürecinin sadeleştirilmiş hâlidir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">PIL</span> <span class="kn">import</span> <span class="n">Image</span>
<span class="kn">from</span> <span class="n">torchvision</span> <span class="kn">import</span> <span class="n">transforms</span>

<span class="n">pipeline</span> <span class="o">=</span> <span class="n">transforms</span><span class="p">.</span><span class="nc">Compose</span><span class="p">([</span>
    <span class="n">transforms</span><span class="p">.</span><span class="nc">Resize</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="n">transforms</span><span class="p">.</span><span class="nc">Grayscale</span><span class="p">(</span><span class="n">num_output_channels</span><span class="o">=</span><span class="mi">3</span><span class="p">),</span>
    <span class="n">transforms</span><span class="p">.</span><span class="nc">ToTensor</span><span class="p">(),</span>
    <span class="n">transforms</span><span class="p">.</span><span class="nc">Normalize</span><span class="p">([</span><span class="mf">0.5</span><span class="p">]</span> <span class="o">*</span> <span class="mi">3</span><span class="p">,</span> <span class="p">[</span><span class="mf">0.5</span><span class="p">]</span> <span class="o">*</span> <span class="mi">3</span><span class="p">)</span>
<span class="p">])</span>

<span class="n">image</span> <span class="o">=</span> <span class="n">Image</span><span class="p">.</span><span class="nf">open</span><span class="p">(</span><span class="sh">"</span><span class="s">rontgen.png</span><span class="sh">"</span><span class="p">)</span>
<span class="n">tensor</span> <span class="o">=</span> <span class="nf">pipeline</span><span class="p">(</span><span class="n">image</span><span class="p">).</span><span class="nf">unsqueeze</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="n">probability</span> <span class="o">=</span> <span class="nf">model</span><span class="p">(</span><span class="n">tensor</span><span class="p">).</span><span class="nf">sigmoid</span><span class="p">().</span><span class="nf">item</span><span class="p">()</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Şüpheli bulgu olasılığı: </span><span class="si">{</span><span class="n">probability</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 görüntüyü standart boyuta getirir, sayısal tensöre dönüştürür ve modele verir. Çıkan olasılık kesin tanı değildir; yalnızca modelin öğrendiği verilere göre ürettiği bir skordur.</p>

<h2 id="sınıflandırmadan-segmentasyona">Sınıflandırmadan segmentasyona</h2>

<p>Sınıflandırma, görüntünün tamamına bir etiket verir. Nesne tespiti şüpheli bölgeyi kutuyla işaretler. Segmentasyon ise her pikseli ayrı ayrı değerlendirerek tümörün sınırlarını çizebilir. MR analizinde U-Net gibi mimariler bu yüzden oldukça popülerdir.</p>

<table>
  <thead>
    <tr>
      <th>Görev</th>
      <th>Çıktı</th>
      <th>Örnek kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sınıflandırma</td>
      <td>Etiket veya olasılık</td>
      <td>Normal/anormal ayrımı</td>
    </tr>
    <tr>
      <td>Tespit</td>
      <td>Sınırlayıcı kutu</td>
      <td>Akciğer nodülü bulma</td>
    </tr>
    <tr>
      <td>Segmentasyon</td>
      <td>Piksel maskesi</td>
      <td>Beyin tümörü hacmini ölçme</td>
    </tr>
  </tbody>
</table>

<h2 id="neden-insan-denetimi-şart">Neden insan denetimi şart?</h2>

<p>Farklı hastanelerin cihazları, çekim protokolleri ve hasta grupları değişebilir. Model yalnızca belirli cihazlarda eğitildiyse başka bir merkezde başarısı düşebilir. Ayrıca veri dengesizliği, yanlış etiketler ve açıklanabilirlik sorunları hatalı sonuçlara yol açabilir.</p>

<p>Bu nedenle modeller bağımsız veri kümelerinde test edilir; duyarlılık, özgüllük ve ROC-AUC gibi ölçütlerle değerlendirilir. Isı haritaları modelin hangi bölgelere baktığını gösterebilse de klinik gerekçe yerine geçmez. En güvenli yaklaşım, yapay zekânın yorulmadan tarama yaptığı, radyoloğun ise bağlamı, hasta öyküsünü ve belirsizliği yönettiği insan-makine iş birliğidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="yapay zekâ" /><category term="tıbbi görüntüleme" /><category term="derin öğrenme" /><category term="röntgen" /><category term="manyetik rezonans" /><category term="bilgisayarlı görü" /><summary type="html"><![CDATA[Bir radyolog röntgene baktığında kenarları, yoğunluk farklılıklarını ve anatomik ilişkileri değerlendirir. Bilgisayar ise görüntüyü önce sayılardan oluşan dev bir tablo olarak görür. Yapay zekânın başarısı, bu sayısal desenlerle kırık, tümör veya doku bozukluğu gibi klinik bulgular arasındaki ilişkiyi öğrenmesinden gelir. Yine de bu teknoloji “dijital doktor” değil; hekimin kararını destekleyen güçlü bir araçtır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/yapay-zeka-rontgen-97.png" /><media:content medium="image" url="https://program.sonsuz.us/img/yapay-zeka-rontgen-97.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>