İnsanlık tarihinde son yüzyıla baktığımızda belki de en ivmeli değişikliklerin bu yüzyılda olduğunu hemen farkedeceksinizdir. Bilgisayarların, internetin, taşınabilir cihazların ve daha pek çok teknolojik ürünün hayatımıza girmesiyle toplumlar da bunlara kendini adapte etmiş ve yaşantılarını bunlara göre değiştirmiştir. Mesela bir yerden bir yere seyahat ederken gideceğimiz yolu önceden bilen birilerine sora sora bulurduk. Öyle ya "Sora sora Bağdat bulunur." atasözünün anlamı da buradan gelmektedir. Ama artık sanki "GPS’e baka baka Bağdat bulunur." gibi bir söz ortaya çıkıyor öyle değil mi?
Son yüzyılın belki de en önemli icatlarının bilgisayar ve internet olduğunu hepimiz kabul edebiliriz. Bu icatlarla beraber makinelerin hesap güçleri gün geçtikçe arttırılmış ve tek bir insanın yapabileceği işlemlerin çok ötesine geçilmiştir. Fakat insanlar düşünebilen varlıklardır. Sadece işlem yapma ile insanın yapabileceklerini aşma gibi bir durum söz konusu değildir. İnsanlar onlara verilen belli görevleri standart bir şekilde yerine getirmenin yanında, yeni şeyleri öğrenme yeteneğine de sahiptirler. İşte bu noktada "Makineler insanlar gibi düşünüp onlar gibi karar verebilirler mi?" sorusundan Yapay Zeka (Artifical Intelligence) kavramı ortaya çıkmıştır. Biz bu kavramı burada tartışmayacağız, bu başka bir yazının konusudur.
Peki bir insan yeni bir şeyler öğrenebilmek için, daha doğrusu öğreneceği verileri elde etmek için neye ihtiyaç duyar? Elbette 5 duyumuz olan işitme, görme, dokunma (hissetme), tatma ve koklama duyuları ile bunu başarabiliriz. Önce çevremizde gerçekleşen olayları bu duyular ile beynimize yollarız. Beynimiz bu olayları yorumladıktan sonra da ona göre karar verir ve bir eylemde bulunuruz. Peki yapay zekadan bahsediyorsak aynı şey bilgisayarlar için de geçerli değil midir? Bilgisayarlar da bu iş için çok çeşitli sensörleri kullanırlar. Örneğin biz gözümüzle görüyorsak onlar da kamera ile görüntü alırlar veya biz kulağımızla duyuyorsak onlar da mikrofon ile sesi alırlar. Yani sesnsör teknolojileri ile bilgisayarlar ham verileri elde etme kısmını başarıyla aşmış oluyorlar. Peki sırada ne var?
Dediğim gibi insanlarda duyu organlarından gelen veriler beyne giderek işlenir, yorumlanır ve sonuçlar üretilir. Peki burada beynin bilgisayardaki karşılığı nedir? Elbette bilgisayarda işlem yapan donanımlar olan mikroişlemcilerdir. Günümüzdeki mikroişlemcilerin muazzam hesap gücü ile yüksek miktardaki veriler alınıp işlenebilmektedir. Son olarak beynimizin karar verdiği şeyleri eyleme geçirebilmek için eller, ayaklar gibi pek çok organımız bulunmaktadır. Bilgisayarlarda ise Actuator (Eyleyici) adı verilen donanımlar bu işi görür. Bunlar basit bir hoparlörden tutun da bir robotun koluna kadar çok geniş yelpazede donanımlar olabilirler. Bütün bu veriyi alma, işleme ve karar verip eyleme geçirme sürecini şöyle bir görselle özetleyebiliriz:
Burada bizi ilgilendiren kısım aslında "görme" olayı olacaktır. Bilgisayarlarda görüntü almak için çok çeşitli kamera cihazlarının kullanıldığını zaten biliyorsunuz. Peki görüntü verisini aldıktan sonra ne yapıyoruz? Normalde bu görüntüyü bir yere aktarmak için veya üzerinde çeşitli değişiklikler yaparak başka bir görüntüye dönüştürmek için kullanıyoruz. İşte bilgisayar dünyasında bir görüntünün alınıp başka bir görüntünün elde edilmesi olayına Görüntü İşleme (Image Processing) adı verilmektedir. Bu kavram özünde bu kadar basit bir açıklamaya sahip olsa da uygulama alanı ve uygulamaları bilgisayar dünyasında oldukça geniş bir yer kaplamaktadır.
Şimdi de bu kavram ile oldukça karıştırılan bilgisayarlı görme konusuna bakalım. Bilgisayarlı Görme (Computer Vision) dediğimiz olay bir görüntünün alınıp başka bir görüntünün elde edilmesinden ziyade, görüntüden çeşitli anlamlar çıkarılıp sonuçlar elde edilmesi işlemidir. Örneğin elimizde bir doğa fotoğrafı olsun. Bu fotoğraf çok net çekilmemiş olsun. Bu fotoğrafı alıp daha net bir şekilde görebileceğimiz bir görüntüyü elde etmek görüntü işlemenin konusudur. Fakat bu fotoğraftaki doğa unsurlarının (ağaç, dağ, çimen vb.) fotoğrafın hangi konumunda olduğunu bulmak bilgisayarlı görmenin konusudur. Çok farklı disiplinler olarak algılamayın. Aslında bu iki alan da birbiriyle oldukça ilişkilidir. Bilgisayarlı görme, aslında pek çok disiplinin bir araya gelmesiyle oluşmuştur. Kesin bir hiyerarşisi olmasa da genel olarak şu şekilde özetleyebiliriz:
Burada başta bahsettiğim Yapay Zeka (Artifical Intelligence) ve Makine Öğrenimi (Machine Learning) alanlarını gördüğünüze hiç şaşırmayın. Çünkü bilgisayarlı görmede yoğun bir şekilde yapay zeka ile ilgili algoritmalar ve modeller kullanılmaktadır. Bunun yanında başta bahsettiğim Sensör Teknolojileri (Sensor Technologies) alanının da bu konuyla ilişkili olduğunu bu figürden anlayabilirsiniz. Görüntü işleme alanı bilgisayarlı görme ile doğrudan ilişkili olsa da aynı anlamı taşımazlar. Bilgisayarlı görme ile görüntü işleme arasındaki farkı daha iyi anlayabilmeniz için şöyle bir görseli örnek olarak verebilirim:
Yukarıdaki figürde yer alan ilk resimde bulanıklık giderilerek yeni ve netliği daha iyi olan bir resim elde edilmiştir. İkinci resimde ise ağaçtaki kedinin konumu gösterilmiştir. İşte görüntü işlemede genellikle bir görüntüden başka görüntüler elde edilirken, bilgisayarlı görmede ise bir görüntüden çeşitli anlamlar çıkarılmaktadır. Bilgisayarlı görmenin pek çok uygulama alanı bulunmaktadır. Bunlardan bazılarını özet olarak ve örneklerle şu şekilde inceleyebiliriz:
| Uygulama Alanı | Açıklama | Örnek Video |
|---|---|---|
| Perakende Satış | Özellikle internet üzerinden satış yapan firmalarda, kullanıcının ürünü daha almadan deneyimleyebilmesi için bilgisayarlı görmeye dayalı çeşitli uygulamalar kullanılmaktadır. | Nike Fit |
| Üretim | Üretim bandındaki defolu ürünlerin anında tespiti, insan eline ihtiyaç duymadan banttaki ürünlerin ayrıştırılıp düzenlenmesi ve üretim optimizasyonlarının analizi gibi pek çok konuda bilgisayarlı görme algoritmalarına ihtiyaç duyulmaktadır. | ZDT |
| Otomotiv | Özellikle son yıllarda “Sürücüsüz Otomobil” kavramının ortaya çıkması, bu alanda bilgisayarlı görme algoritmalarının kullanımını zorunlu hale getirmiştir. Trafik durumunu gözetleme ve buna göre karar verme gibi aşamalarda bu algoritmaların kullanılması elbette kaçınılmazdır. | Tesla Model S P90D |
| Sağlık | Artık ameliyat masalarında bile robotların kullanımı gün geçtikçe artmaktadır. İnsanlardan çok daha hızlı veri alıp karar verebilen robotlar sayesinde, cerrahi operasyonlarda meydana gelebilecek hataların minimuma indirgenmesi hedeflenmektedir. Elbette böyle bir alanda bilgisayarlı görmeden yararlanmak yine kaçınılmazdır. | Gauss Surgial |
| Tarım | Tarımda makineleşme zaten uzun yıllardır konuşulan bir konudur. Fakat günümüze kadar olan gelişmelerde, genellikle ürünlerin toplanması ve depolanması konularında çalışmalar yapılmaktaydı. Bilgisayarlı görme ile artık yetiştirme aşaması da dahil olmak üzere pek çok konuya makineler el atmaktadır. Hastalıklı ürünlerin yetiştirme aşamasında Drone gibi araçlarla tespiti buna örnek olarak verilebilir. | SlantView |
Bunların dışında da pek çok uygulama alanı bulunsa da burada çok fazla ayrıntıya girmeden yolumuza devam edelim. Yavaş yavaş işin yazılım arkaplanına baktığımızda bizi 3 adet programlama dili karşılar: C++, Python ve MATLAB. MATLAB genellikle akademik dünyada kullanılan bir dildir. Bu dil ile bir şeyler yazıp denemek oldukça kolaydır. Fakat yazdığınız şeyi bir ürün haline getirmek ve çeşitli veritabanları ile etkileştirmek oldukça zordur. Bu nedenle genellikle deneysel süreçlerde kullanılır.
C++ ise her konuda olduğu gibi bu konuda da oldukça güçlü bir dildir. Yazdığınız kodu performans açısından en yüksek noktalara eriştirebilirsiniz. Ayrıca geniş kütüphane yapısı, derleyici olanakları, işletim sistemi desteği bakımından sizi yarı yolda bırakmaz. Fakat geliştirme sürecini oldukça uzatan bir programlama dilidir. Yeni fikirleri anında uygulamaya dökmek, bu dil için oldukça zaman alıcı bir süreçtir. Bu nedenle daha profesyonel alanlarda kullanılması tercih edilir.
Python ise bilgisayarlı görme konusunda bu iki dilin arasını yakalamış olan bir dildir. MATLAB kadar olmasa da bir şeyler yazıp test etmek oldukça kolaydır. C++ kadar olmasa da yazdığınız şeyin performansı kabul edilebilir ölçüdedir. Bu nedenle belki de bu konuda en çok tercih edilen dil konumuna gelmiştir. Yeni şeyleri hayata geçirmek bu dil ile oldukça mümkündür. Yani anlayacağınız, her alanda olduğu gibi bilgisayarlı görmede de seçeceğiniz programlama dili, amacınızın ne olduğuyla doğrudan ilişkilidir. Bu dillerin yanında C# ve Java gibi programlama dilleri de bu alanda kullanılmaktadır. Fakat popülerliği bu 3 dile nazaran oldukça azdır.
Programlama dillerinden bahsettikten sonra dünyanın en çok kullanılan bilgisayarlı görme kütüphanesi olan OpenCV kütüphanesinden bahsedelim. OpenCV (Open Source Computer Vision Library), 1999 yılında Intel Corporation tarafından geliştirilmiş ve daha sonra Willow Garage tarafından desteklenip bütün dünyaya açılmış, en son da Itseez (Mayıs 2016’da Intel tarafında satın alınan bir firmadır) firması tarafından desteklenmiş olan açık kaynak kodlu bir bilgisayarlı görme kütüphanesidir. OpenCV, bilgisayarlı görme konularındaki gerçek zamanlı uygulamalarda kullanılmak ve hesaplamalarda verimliliği sağlamak amacıyla yazılmış bir kütüphanedir.
OpenCV temelde C++ dili ile yazılmış ve kullanıcılara çok çekirdekli işlemcilerin hesap gücünü kullanma avantajını sağlamıştır. Aslında aynı avantajı (hatta daha ilerisini) sadece Intel işlemciler için sağlayan ve yine Intel’in yayınladığı IPP (Integrated Performance Prmitives) isimli bir kütüphane de mevcuttur. Bu kütüphane birçok farklı multimedya fonksiyonu için alt seviye optimize edilmiş rutinleri içerisinde barındırmaktadır. Fakat bu kütüphanenin tamamını kullanmak ücretlidir. Eğer sisteminizde bu kütüphane yüklüyse, OpenCV çalışma zamanı sırasında onu otomatik olarak kullanmaya programlanmıştır.
OpenCV C++ programlama dilinde yazılmış olsa da eski C yapılarını hala kütüphane içerisinde barındırmaktadır. Bunun yanında bu kütüphanenin Python, Java ve MATLAB programlama dillerinde de kullanımı mevcuttur. Bunların dışında çeşitli topluluklar tarafından C#, Perl, Haskell ve Ruby gibi dillere de çevrimi yapılmıştır. 3.4 versiyonundan itibaren OpenCV.js adı altında JavaScript kütüphanesi formunu da bulabilirsiniz. En yeni özellikler her zaman C++ haline eklenmektedir.
Şu anda kişilerden tutun da büyük şirketlere (IBM, Microsoft, Intel, SONY, Siemens, Google vb.) herkes OpenCV’yi kullanmakta ve desteklemektedirler. OpenCV’nin açık kaynak lisansı ayrıca ticari kullanımda da herhangi bir kısıtlama getirmemektedir. Ayrıca MIT, CMU, Cambridge ve Stanford gibi pek çok üniversite, eğitimlerinde OpenCV’ye genişçe yer vermeketdirler. Kendisinin hem açık kaynaklı olup hem de kolay kullanılabilir bir yapıda olması onu bu kadar popüler kılmıştır. Daha önce de bahsettiğim bilgisayarlı görmenin pek çok uygulama alanında OpenCV kendine bir yer edinebilmektedir.
Geçmişten günümüze kadar OpenCV’nin pek çok farklı sürümü yayınlanmıştır. Şu anda geliştirilmekte olan sürümler OpenCV 3.X ve OpenCV 4.X sürümleridir. Her iki sürümün de OpenCV 2.X sürümüne desteği bulunduğundan, genellikle OpenCV 2.X küyüphanesindeki fonksiyonlar ile çalışmalar yapılmaktadır. Şimdi size burada OpenCV’nin ilk sürümünden günümüze kadar olan önemli sürümlerinin yayınlanma tarihlerini ve eklenen önemli özelliklerini listeleyeceğim[3]:
| Sürüm | Yayınlanma Tarihi | Açıklama/Önemli Değişiklikler |
|---|---|---|
| Alpha | 2000 | CVPR konferansında yayınlanan ve bilinen ilk sürümdür. |
| Beta | 2001 – 2005 | Bu tarihler arasında 5 adet Beta sürümü yayınlandı. İlk Beta sürümünden itibaren Linux desteği sağlandı. |
| v1.0 | Ekim 2006 | Beta’dan çıkan ilk sürümdür. Bu sürüm ile HighGUI modülüne EXR ve JPEG2000 desteği gelmiştir. Ayrıca Windows yükleme paketleri önceden derlenmiş olan Python modüllerini içermekteydi. |
| v2.0 | Eylül 2009 | Yeni Python arayüzü resmi olarak yayınlandı. SSE2 komut seti desteği ile bazı görüntü işleme operasyonlarına optimizasyonlar getirildi. FFMpeg desteği geldi. Birçok modül için yeni C++ arayüzleri yayınlandı. |
| v2.1 | Nisan 2010 | Paralel döngüler için OpenMP yerine Intel TBB kullanıldı. Windows ve MacOSX için 64-bit desteği getirildi. |
| v2.2 | Aralık 2010 | Kütüphane yapısı yeniden organize edildi ve fonksiyonlar daha küçük modüllere aktarıldı. Yani modül sayısı arttırıldı. CUDA desteği eklendi. |
| v2.3 | Temmuz 2011 | Android için bir geliştirme portu açıldı ve Android sistemlere entegrasyonda büyük ilerleme kaydedildi. Çeşitli Makine Öğrenimi algoritmaları TBB kütüphanesi ile hızlandırıldı. |
| v2.4.0 | Mayıs 2012 | Yüz tanıma başta olmak üzere çeşitli üst düzey konular için birçok yeni fonksiyon kütüphaneye eklendi. Hem C++ hem de Python tarafında Threading ile alakalı birçok farklı düzenleme yapıldı. Android desteği OpenCV4Android adı altında resmen getirildi. |
| v2.4.2 | Temmuz 2012 | Yüz tanıma algoritmları ile ilgili iyileştirmeler yapıldı. iOS desteği getirildi. |
| v2.4.3 | Kasım 2012 | OpenCL desteği getirildi. iOS ve Android portları için çeşitli güncelleştirmeler yapıldı. Çeşitli örnekler eklendi. CUDA tarafında yeni özellikler eklendi. |
| v2.4.5 | Nisan 2013 | Deneysel olarak WinRT desteği getirildi. OpenCL tarafında çeşitli güncellemeler yapıldı. |
| v2.4.6 | Temmuz 2013 | WinRT desteği geliştirildi. Masaüstü ve ARM için CUDA 5.5 desteği getirildi. Qt5 desteği getirildi. |
| v3.0 Beta | Kasım 2014 | ARM işlemciler için NEON desteği getirildi. OpenCL performansı geliştirildi. Intel IPP desteği varsayılan hale getirildi. Java tarafı geliştirilmeye başlandı. |
| v3.0 | Haziran 2015 | Android’deki OpenCV Manager isimli yönetim uygulaması tamamen Java ile yeniden yazıldı. Çeşitli Threading işlemleri için Pthreads desteği getirildi. |
| v3.2 | Aralık 2016 | DNN (Deep Neural Networks) modülünde birçok farklı yenilik ve geliştirme yapıldı. Desteklenen işletim sistemi ve IDE sürümleri güncellendi. Nvidia firması Carotene isimli kütüphaneyi OpenCV’ye bağışladı. CUDA 8 desteği getirildi. OpenVX desteği getirildi. |
| v3.3 | Ağustos 2017 | C++11 desteği getirildi. SSE4.2/AVX/AVX2 gibi çeşitli komut seti destekleri getirildi. IPPICV sürümü güncellendi. |
| v3.4 | Aralık 2017 | Daha hızlı R-CNN desteği ve yeni örneği eklendi. JavaScript desteği geliştirildi. |
| v4.0.0 Final | Kasım 2018 | OpenCV 1.X sürümlerinden gelen birçok API silindi. C++11 kullanımı zorunlu hale getirildi. G-API (Graph API) isimli modül geliştirildi. Bu modül ile OpenCV ile yapılan işlemler bir Pipeline mantığı kullanılarak kolayca implement edilebilecek. QR kod algılama ve kodlama fonksiyonları ve bununla ilgili örnekler eklendi. Popüler Kinect Fusion algoritması impelement edilip optimize edildi. |
| v4.1.0 | Nisan 2019 | AVX2 komut seti için daha fazla optimizasyon getirildi. DNN modülü için yeni nesne algılama modelleri getirildi. |
| v4.1.2 | Ekim 2019 | Platformlarda çeşitli performans iyileştirmeleri yapıldı. QR kod algılama algoritmaları iyileştirildi. |
Açıklamalardan da anlayacağınız gibi OpenCV çeşitli modüllerden meydana gelmiştir. Bu modüllerin sayısı ve isimleri her versiyonda değişebilse bile temelde bazı modüller hep varlığını sürdürmüştür. OpenCV’yi kullanırken de sadece ihtiyacınız olan modülü kullanıp alandan tasarruf edebilirsiniz. Bu modüllerin her birini burada göstermeyeceğim. Bu başka bir yazının konusudur. Genel olarak kullanılan modüllerin isimlerini şu şekilde verebilirim:
OpenCV’nin bu kadar popüler olmasının sebeplerinden birisi de platform desteğinin oldukça geniş olmasıdır. OpenCV kütüphanesini Windows, GNU/Linux, MacOS, Android, iOS gibi pazarın büyük bölümlerini kaplayan işletim sistemlerinde uygulama geliştirmek için kullanabilirsiniz. Bunun yanında Qt gibi çatılar (framework) ile uyum içinde de çalışabilecek bir yapıdadır. Onun bu kadar geniş bir yelpazeye sahip olması, yazılan bir kodun fazla bir değişikliğe uğramadan birçok platformda çalışabilmesi anlamına gelmektedir. Fakat teoride durum böyleyken, pratikte OpenCV’nin bazı özelliklerini bazı platformlarda kullanmakta güçlük çekebilirsiniz.
Son olarak da bilgisayarlı görme alanında kullanılan ve OpenCV benzeri olan birkaç kütüphaneden bahsedelim. Bilgisayarlı görme alanında C# ve Java programlama dillerinin pek popüler olmadığını söylesek de bu dillerde bu işi yapan güçlü kütüphane ve çatıların olmadığını söylemedik. Java tarafında OpenCV’ye alternatif olarak kullanılabilen BoofCV isimli çatı ile, hemen hemen OpenCV ile yapabileceğiniz her şeyi yapabilirsiniz. Bunun yanında C# tarafında Accord.NET isimli çatı, çeşitli makine öğrenimi algoritmalarından tutun da bilgisayarlı görme ve görüntü işlemeye kadar pek çok fonksiyonu ve sınıfı içerisinde barındırmaktadır.
Bunların dışında Qualcomm firması tarafından desteklenen FastCV kütüphanesi, genellikle mobil cihazları hedef alan bir bilgisayarlı görme kütüphanesidir. Bu kütüphanenin bütün ARM tipi işlemcilere ve sadece Qualcomm SoC mimarisine destek veren iki farklı sürümü vardır. Bu sürümler "FastCV for ARM" ve "FastCV for Snapdragon" olarak isimlendirilmektedirler. Bu kütüphane ile ilgili çok daha fazla bilgiyi kendi web sayfasından öğrenebilirsiniz.
Son olarak bahsedeceğimiz çatı ise SimpleCV adıyla bilinen ve bilgisayarlı görme alanında kullanılan birçok kütüphane ve yazılımın bir araya gelmesi ile oluşturulan bir çatı olacaktır. Bu kütüphaneler topluluğu Python dili ile yazılıp bir araya getirilmiş ve MacOS, Windows, GNU/Linux (sitesinde sadece Ubuntu Linux olarak yazıyor) işletim sistemleri altında çalışma yetisine sahip olmuştur. Yine kendi web sayfasından çok daha ayrıntılı bilgilere erişebilirsiniz.
Bu yazımızda bilgisayarlı görme alanının ne olduğundan ve hangi disiplinlerden meydana geldiğinden bahsettik. Ayrıca bilgisayarlı görme kütüphanelerinin en popüleri olan OpenCV kütüphanesine kısaca bir giriş yaptık. Sonunda da diğer programlama dillerinde kullanılan ve bilgisayarlı görme ile ilgili olan çeşitli kütüphane ve çatılara kısaca göz attık. İleriki yazılarımda OpenCV kütüphanesi üzerine gitmeyi ve onunla ilgili bilgiler vermeyi düşünüyorum.







