Pazartesi, Temmuz 30, 2007

KGDD lerde Nodul sayısı tespiti


Eveet yeni bir Yapay zeka projesiyle karşınızdayız...
KGDD de ne demek derseniz kısa bir malzeme dersi yapalım :
KGDD Kürsel Grafitli Dökme Demirin kısaltmasıdır. Ductile cast iron yada nodular cast iron diye bilinir yabancı alemlerde. Her Malzeme için olduğu gibi KGDD içinde mikro yapı çok önemlidir. Mikro yapı tespiti için metallografik numunesi hazırlanır ve mikroskop altında incelenir. KGDD nin tespit edilmesi gereken mikro yapı parametrelerinden birde Nodül sayısıdır. Mikroskopla elde edilen görüntüyü standart görüntülerle karşılaştırarak Nodül sayısı tespit edilir. Yada el alemin yaptığı paket programlar kullanılır. Her ne ise işin detayını malzeme derslerine bırakıp basit bir nodül sayısı tespit programı yazıyoruz.

Görüntü işleme için OpenCv, kullanıcı arabirimi için FLTK ve YSA için fann kütüphaneleri kullanıldı. Ne elimde detaylı örnek resimler vardı nede benim detaylı bir proje için vaktim vardı. Malzeme ve Metalografi ile uğraşanaların programa bu nazarla bakmalarını rica ederiz. Standart resimlerin değişik kısımlarından aldığım 480x480 lik resimleri kullandım. YSA nın eğitimi için kullandığım resimler Trainin dizininde Test için kullanabileceğiniz resimler Test dizininde. Resim dosyalarının isimleri aynı zamanda Nodül sayısını da içeriyor. Yapılan işlemlerin safhalarını Bakan Bilgisayar - Gören Bilgisayar yazımızda görebilirsiniz.
Program kod olarak platform bağımsız. fakat linux versiyonunu bu aralar yayınlamam mümkün değil henüz OpenCv'yi Linux üzerine kuramadım. Programı çalıştırmak için OpenCv yi kuramanız lazım yada en azından Dll lerini bulup programın yanına bulundurmanız lazım
İndirmek için burdan buyrunuz Nodul

Pek zannetmiyorum ama eğer soracaklarınız olursa biz buradayız biliğimiz kadarıyla yardımcı olmaya çalışırız...



Perşembe, Temmuz 19, 2007

İlim Çindede olsa IV

Epeydir bu serimize devam etmiyorduk
Buyrun Yapay Zeka ile ilgili tonla kitap neler yok ki

  • Algorithmic Learning Theory
  • An Introduction to Genetic Algorithms
  • Applications of Artificial Intelligence in Finance and Economics
  • Artificial Intelligence and Expert Systems for Engineers
  • Artificial Intelligence Applications and Innovations
  • Computer-Aided Intelligent Recognition Techniques and Applications
  • Developments in Speech Synthesis
  • Fundamentals of Speech Recognition
  • Fuzzy Models and Algorithms for Pattern Recognition and Image Processing
  • Genetic Programming
  • Introduction to Pattern Recognition : Statistical, Structural, Neural and Fuzzy Logic Approaches
  • Multiagent Systems: A Modern Approach to Distributed Artificial Intelligence

özellikle gerçek uygulamlardan bahseden
Computer-Aided Intelligent Recognition Techniques and Applications
kitabını tavsiye ederim inceleyin.

Cumartesi, Temmuz 14, 2007

Üç ayların gölgesi üstümüze düştü

Yavrusunu arayan bir anne, Efendimiz Aleyhisselâm'ın gözüne ilişir. Kadın, bulduğu her çocuğu bağrına basar, yavrusu olmadığını anlayınca, bir diğerine koşar. Nihayet kendi çocuğunu bulunca kalbine sokarcasına davranışlarda bulunur. Efendimiz Aleyhisselâm çevresindekilere:
"Şu kadını görüyor musunuz, ne dersiniz o çocuğunu ateşe atar mı?" buyurur.
"Hayır, yâ Resûlâllah." derler.
"Allah o kadından daha çok merhametlidir."
buyurur.
Merhametlilerin en merhametlisinin rahmet vesilerinden üç aylar giriyor. Hatırlatıyor, Efendimizin dilinden dua ediyor
Allâhümme bârik lenâ fî Recebe ve Şaban ve belliğnâ Ramazan
ve dualarınız bekliyoruz..

Salı, Temmuz 10, 2007

Kırılamayacak Program olurmu ? 3

Serinin 3. ve de sonuncusu olmasını umduğum bu yazı gecikti kusura bakmayın. Aslında yazıyı taslak olarak hazırlamıştım. Fakat bir türlü fırsat bulup düzenleyemedim. Serimizin başlangıç sorusuna dönelim.
Kırılmıyacak program olur mu?
Programı kaynak koduyla dağıttığınızı düşünün Nasıl ki o dili bilen biri gereken yerleri değiştirip Ne şekilde olursa olsun korumayı kolayca kaldırabilir. İşte aynı şekilde Assembly bilen biri için programınızın koduna ulaşabiliyorsa korumayı da kaldırabilir. Yani
Teorik olarak Program çalışıyorsa kırılabilir.

Peki Kırılmasını nasıl zorlaştırabiliriz ?
  • Bir tanımla başlayalım, Programın kırılması ; "Koddaki kontrol kısımlarının devre dışı bırakılması -crack- yada kontrol kıstaslarının programın içinde tespit edilip haricen kullanılmasıyla-keygen- kontrol kısmının atlatılması" demektir. Tanımdan da anlayabileceğiniz gibi korumanın özü koda ulaşılmasını engellemektir.
  • Pek tabi ki bütün kodu didik didik incelemek çok zahmetli iştir o yüzden kodun kritik kısımlarına ulaşılmasını zorlaştırmak yeterli sayılabilir
  • Koda ulaşılmasını engellemenin en kolay ve ucuz yolu packer dediğimiz prograları kullanmaktan geçiyor. Bu programlar sizin programınızı sıkıştırıp bir kendi kendine hafızada açılıp hafızada çalışan bir program haline getirir. Unpacker denen programlarla programlarınızı eski haline çevrilebilsede, Programın kendisini kontrol ettirterek ve packerların en son versiyonlarının kullanımıyla Epey bir insanı programınızla uğraşmasını englleyebilirsiniz.
  • Program kendisini nasıl kontrol edebilir ? Programda değişiklik yapılıp yapılmadığını checksum'la yada CRC benzeri metodla kontrol edin. Eğer değişiklik yapılmışsa uyarı vermeyin programı saçma bir hatayla kırılmasını sağlayın.
  • Programıcı olarak kullanıcıyı yönlendirmek için mesaj vermek zorunda kalırız . mesela "Hatalı Kayıt No !.." gibi Bu da kodun kritik yerlerine ulaşılmasını çoook kolaylaştırır. Peki ne yapıla bilir mesela Hata mesajı vermeyip kullanıcı ister doğru ister yanlış kayıt no girsin programı kapatın. Program yeniden çalıştırıldığında kontrol edip ona göre deneme ya da kayıtlı olarak çalıştırın, Kayıt durumunu da mesela Programın versiyon bilgisinin verildiği hakkında -About- kısmında yazabilirsiniz.
  • Hiç mi mesaj veremeyeceğiz tabii ki hayır ; mesaj verecekseniz mesaj metnini şifreli olarak programın içinde tutun kullanacağınız zaman şifresini açıp kullanın.
  • Sahte kontrol kısımları hazırlayıp, şaşırtmacada yapabilirsiniz
  • Kritik kısımlarda kullandığınız dialog pencerelerini tamamen çalışma anında oluşturmanında büyük faydası olur.
  • Kontrol kısmının da bir timer'ın içinde yapılması debug edilmesini güçleştirir.
  • Birden fazla yerde kontrol edin Kontrol işlemini string karşılaştırma olarak kesinlikle yapmayın.
  • Reverse Engineering için epey gelişmiş programlar var. Bu tür progralarla kodunuza müdaheleyi engellemek için de epey karmaşık metod var. çok aşırıya kaçmamak kaydıyla şu yazıdan feyz alabilirsiniz.
  • Bu yazılardan da faydalanabilirsiniz 1, 2, 3, 4
  • Benim programım kıymetli kardeşim diyorsanız. Programınızın değerine ve de kesenize göre çeşitli ticari çözümler var; bakınız çeşitli Koruyucular -Protector-
  • Daha da olmadı Biraz tuzlu olmakla beraber Kırma işini donanım olarak korumaya yardım eden Dongle seçeneğinizde var

Cumartesi, Temmuz 07, 2007

Kırılamayacak Program olurmu ? 2

Bir önceki yazıda verdiğimiz Programı indirin ve inceleyin. Temel olarak kayıt işlemi yapması için gereken her şeye basit de olsa sahip.

Daha önce yazdığımız Anti-Crack yazısını da gözden geçirin

Derlenmiş program makina kodu olarak dosyada İşletim sisteminin belirlediği formatta tutulurlar.

Makina kodunun bire bir eşleniği Assembly programlama dilidir.

Biraz Assembly bilen biri bazı programları kullanarak programınıza müdahele edebilir

Debugger denen programlar Programınızı assembly olarak görmenize ve çalıştırabilmenizi sağlar

Önce Alet edavat toplayalım Bu basit program için sadece OllyDbg yeterli. Tabii pek çok alternatif program var. Mesela IDA için şu resme bir bakınız. Assembly koddan akış diyagramı bile çıkarıyor...

Uzun boylu anlatacak yada anlata bilecek değilim OllyDbg ile programımızı açıyoruz

Programın içindeki bütün stringleri tespit ettiriyoruz

Kayıtlı kullanıcı oldunuz mesajından pogramın bu kısmına zıplıyoruz

Bu mesajı veren koda zıplanan yeri buluyoruz o kısım işte bizim if ile kayıt numarasını kontrol ettiğimiz yer. o kısma bir breakpoint koyuyoruz
programı çalıştırıyoruz Kayıt numarasına rastgele birşeyler yazıp kayıt ol diyoruz. Breakpoint ile program duruyor. aman Allahım o da ne Hesaplanan kayıt no aşikare görülüyor.

Breakpoint koyduğumuz if kısmı var ya orada koşulu tersine çeviriyoruz
yani JE -> JNE çeviriyoruz , Programda sadece 1 bytelık değeri değiştiriyoruz 74 -> 75 oluyur. Program artık rastgele girdiğimiz kayıt numarasını kabul ediyor.

Sonra daha da ileriye gidiyoruz Programın "Hatalı Kayıt No" mesajının adresi yerine Gerçek Kayıt No adresini veriyoruz

Programa artık girdiğiniz yanlış Kayıt No için hata mesajı yerine Gerçek Kayıt No'yu gösteriyor

Programı niçin Nasrettin Hocanın türbesine benzettiğimi ve Artık Anahtarı nerede kaybettiğimizi anladınız sanırım. Artık Anti-Crack yazısını tekrar okuyun. !
Eskiden yazdığım Bir Parçacık kırılması zorlaştırılmış şu programı da inceleyin belki size ilham verir. Keygenme
Bir parçacık deyince yabana atmayın Adamlar Koca muhasebe paketini öylesine ortaya bırakıyorlar bu kadarcık bile uğraşmıyorlar...

Kırılamayacak Program olurmu ? 1



Hoca Nasrettin evinin önünde bir şeyler arıyormuş Komşusu görmüş ve sormuş
- Hayırdır hoca ne arıyorsun ?
- Abahtarımı kaybettim de
Komşu da bir süreliğine hocayla birlikte aramaya başlamış. Bir süre sonra hocaya sormuş
- Hoca buralarda kaybettiğine eminmisin ?
- Yooo ben anahtarı samanlıkta düşürdüm.
- İyide hoca niye burada arıyorsun
- Burası daha aydınlıkta ! ondan
-...
Büyüüüüüüüük emekler sarfederek programımınız yazdık satmak istiyoruz, Müşteride hazır fakat programımızı nasıl muhafaza edeceğiz. Sadece müşterimizin bu programı kullandığından nasıl emin olacağız?

Başlıyoruz diğer programları incelemeye; Programlarda genel olarak yapılan şey Kullanıcıdan bir kayıt numarası isteniyor numara doğru ise program kayıtlı hale geliyor kısıtlamaları kalkıyor, falan filan,...

Büyük bir şevkle başlıyoruz işe bilgisayarın sabit bir bilgisini alıyoruz. Sabit bilgi üzerinde bir takım işlemler yapıp Güvenlik kodu diye bir numara türetiyoruz. Müşterimiz kaydolmak istediğinde kendisinde kullanıcı adı ve Güvenlik kodunu istiyoruz. Güvenlik kodundan müşteri bilgisayarının sabit bilgisini çıkarıyoruz. Kullanıcı adıyla harmanlayıp Kayıt No oluşturuyoruz.
Buyrun Basit Kayıt Programımız hazır : Protect
Artık Programımız satılmaya hazır !... mı Acaba ?

Programlama forumlarında belli aralıklarla
... ile kopyalama koruması nasıl olabilir?
.. Lisans İşlemleri nasıl olacak
... Kırılamayacak program Nasıl olur ?

ve benzeri konular açılır ve başlanır havanda su dövülmeye Hard diskin Fabrika seri numarasını okuyalım, yok bilgisyarın mac adresini okuyalım, gibi öneriler gelir. Başa dönersek Hoca Nasrettin bize diyor ki : Anahtarı nerede kaybettiyseniz orada aramak gerektiğini biliyorsanız, Programı korumanın, Nereden kırıldığını bilmekle başlıyacağını bilmeniz lazım. Gerçekten Programcıların çoğu için bu konu karanlıktır. O yüzden çözümü başka yerlerde ararlar. Farzı muhal programınız kullanıcının cebindeki kimlik nosu okuyabilsede kullanıcının
retinasından kimliğinide alsa yaptığınız şey aydınlık diye samanlıkta kaybettiğiniz anahtarı kapıda aramaktır.
Bilin ki Bu haliyle Programınız Hoca Nasrettin'in türbesi gibi kapısında kilidi ! vardır ve fakat duvarları yoktur...




Perşembe, Temmuz 05, 2007

FGA 1.3.3 çıktı

Bizim Fatih Presta FGA – Fast Genetic Algorithm'nın yeni versiyonunu çıkarmış
Epey bir yenilik ve bir kılavuz eklenmiş.
FGA da neymiş diyorsanız bakınız 1 2

Pazartesi, Temmuz 02, 2007

YSA ile Tic-Tac-Toe

Orjinal ismiyle Tic-Tac-Toe yada benim kullandığım adıyla OXO bilmeyeniniz yoktur herhalde
Bu oyunu oynayacak bir YSA program yazmaya çalıştık.

Rastgele Eğitimli
1) YSA Dizaynı : YSA mız girdi olarak Tahtanın durumunu alıp Çıktı olarakta Hamlesini yaptığı Tahtanın durumunu veriyor. Yani (3x3) 9 giriş ve 9 çıkış değeri var Bilgisayrın hamleleri 1 İnsanın hamleleri -1 olarak kaydediliyor. Boş hücreler 0 değeri içeriyor.

2) Eğitim verilerini hazırlamak : Bu iş için bir programcık yazdım . Bilgisayar ve insan adına sırayla boş hücrelere rastgele hamle yapılıyor. Bilgisayarın kazandığı oyundaki hamleler kaydediliyor. Bu kayıtlardanda eğitim verilerimizi oluşturuyoruz. - oxo.dat -

3) Eğitim : Allaha şükür FannTool'u yazmışım. Eğitim işini çeşitli seçeneklerle oradan yapıp oxo.net diye kaydediyoruz.

4) GUI : OXO oynamak için bir program yazıyoruz. pek tabii ki CodeBlocks IDE si kullanılarak ve FLTK GUI kütüphanesiyle.

Sonucu görmek için bir deneme yapıyoruz. Pek de memnun olamıyoruz. Acaba neden diye şöyle bir düşünüyoruz. ve çünkü eğitim için kullandığımız veriler zeka içermiyor ki programımız zeki davransın. Zekice oynan bir oyunların verileri olmalı ki YSA mız Zekice oynaya bilsin. Böyle bir veri oluşturmak epey bir vakit alacaktı bende vazgeçtim

Böl Öğren
1) Sonra insanın oyunu nasıl oynadığını düşündüm. Insan önce kuralları öğreniyor Nasıl yeneceğini ve nasıl yenilmeyeceğini öğrenip ona göre hamle yapıyor.
2) OXO oyununda nasıl yenersiniz ? Satırlar yada Sutunlar yada Çapraz kutularda 2 tane işaretiniz varsa boş kutuyu doldurup 3 sayısına ulaşarak yenersiniz
3) OXO oyununda nasıl yenilmezsiniz ? Satırlar yada Sutunlar yada Çapraz kutularda 2 tane rakip işareti varsa boş kutuyu doldurup 3 sayısına ulaşmasını engellersiniz
4) Olay Üçlü hücreler üzerinde olduğunu öğrendik. iki adet YSA ya ihtiyacımız var. ilki Hangi 3 lü gurup daha önemli olduğunu tespit ediyor -value - İkinci YSA nasıl Hamle yapacağına karar veriyor -hamle-

5) Hücreleri önem sırasının tespiti için 3 giriş 1 çıkış kullanır. çıkış değeri olarak bir değer biçiyoruz mesela
1 1 0 ...... 1
-1-10 ...... 0.8

gibi çok fazla alternatif olmadığından elle hazırlıyoruz eğitim versini -value.dat- yine FannTool kullanılarak eğitip kaydediyoruz YSA yı -value.net-

6) En önemli olan Hücre gurubunu aldık bu gurup üzerine hamle yapmak için 3 giriş ve hamla yapılmış haliyle 3 çıkış mesela
1 1 0 -> 1 1 1
-1-10 -> -1-11

gibi çok fazla alternatif olmadığından yine elle hazırlıyoruz eğitim versini -hamle.dat- yine FannTool kullanılarak eğitip kaydediyoruz YSA yı -hamle.net-

7) Daha önce yazdığımız arabirime ekleyiveriyoruz. İlk metoda göre oldukça başarılı olduğunu görüyoruz.

Sonuç :
  • Sonuca bakıp İlk metoda haksızlık etemeyin suç eğitim verilerinde yoksa ikinci metodun hamle kısmındada aynı metod kullanılıyor Temporal Difference Learning bakınız tavlay oynayan versiyonu TD-Gammon
  • Sadece Verileri değiştirip tekrar eğitip aynı isimle kaydederek de programı geliştire bilirsiniz
  • Indirmek için buradan buyurun : Download oxo_game
  • Her türlü fikir, öneri ve hata bildirimlerinizi memnuniyetle bekleriz