tag:blogger.com,1999:blog-27391066571755805442024-03-23T05:14:57.676-07:00İbrahim Delibaşoğluİbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.comBlogger58125tag:blogger.com,1999:blog-2739106657175580544.post-71787772031504948202024-02-20T07:33:00.000-08:002024-02-20T07:43:35.258-08:00İsveç oturum izni alma ve tasinma surecleri<h1 class="entry-title" style="background: rgb(255, 255, 255); border: 0px; box-sizing: border-box; color: #333333; font-weight: 500; line-height: 1em; margin: 0px; outline: 0px; padding: 0px 0px 10px; text-size-adjust: 100%; vertical-align: baseline;"><span style="font-family: inherit; font-size: large;">İsveç`te postdoc icin kabul aldiktan sonra tabi ki ilk is olarak oturum izni konusu gundeme geldi. Ben Universitede calisacagim icin basvuru icin universiteden aldigim kontrati kullandim, baska herhangi bir maas bordrosu, banka hesabi vs gibi seylere ihtiyac olmadi. </span></h1><p style="text-align: justify;"><span style="font-family: inherit; font-size: large;"></span></p><div style="text-align: justify;"><span style="font-family: inherit; font-size: large;"><a name='more'></a></span></div><p style="text-align: justify;"><span style="font-family: inherit; font-size: large;">Basvuru icin konsolosluga gitmeye gerek yok, online olarak yapabiliyorsunuz. <a href="https://www.migrationsverket.se/" target="_blank">M</a><a href="https://www.migrationsverket.se/" target="_blank">igrationsverket</a> uzerinden size uygun olan secenegi secip oturum iznine basvuru yapiyorsunuz. Burada dikkat edilecek husus, basvuru yaparken esiniz cocugunuz vs her kimle birlikte gidecekseniz onlar adina da bilgileri girip, aile adina tek bir basvuru yapiyorsunuz (Her bir bireyin takip numarasi ayri oluyor). Sizden evlilik cuzdani ve cocuklar icin dogum belgesi yuklemenizi istiyor. Uluslararasi dogum belgesini (Formul A) nufus mudurlugunden ucretsiz temin edebilirsiniz. Ardindan basvurunuzu size mail olarak gelen takip numaralari uzerinden (zaten sisteme de kayit oldunuz) takip ediyorsunuz. Sitede size tahmini bir sure gosteriyor, benim icin 3 ay sure ongordu Fakat 1 ay icerisinde konsolosluga cagrildim.</span></p><p style="text-align: justify;"><span style="font-family: inherit; font-size: large;">Konsolosluga basvurabilirsiniz mailini aldiktan sonra, basvuru asamasinda sectiginiz konsolosluga gidip (randevuya gerek yok) pasaportlarinizi ibraz ediyorsunuz. Basvuru sahibi herkesin, bebekler de dahil, orada bulunmasi gerekiyor. Ardindan yine bir bekleme surecinden sonra nihai karar veriliyor. Ben daha eve ulasmadan kabul e-postasini aldim :) Kabul aldiktan sonra oturum kartini almak icin tekrar konsolosluktan randevu alip fotograf ve parmak izi verilmesi gerekiyor. Benim yesil pasaportum oldugundan (Isvec`e giris icin vizeye ihtiyacim yok) oturum karti basvurusunu Isvec`te yaptim. Isvec`te gocmenlik burosundan randevu aldiktan sonra (randevu onemli ve bos saat olmayabiliyor), gidisimin ertesi gunu oturum izni kartina basvurumu yaptim. Sadece pasaport yeterli, fotograf cekip parmak izi aliyorlar. Ve 1 hafta sonra oturum kartim bana ulasti.</span></p><p style="text-align: justify;"><span style="font-family: inherit; font-size: large;"><span>Yukarida bahsettigim tum bu surecleri ilerletirken, bir taraftan da ev aramaya baslamaniz gerekiyor. Bunun icin <a href="https://www.blocket.se/">blocket </a>sitesine goz atabilirsiniz. Bizdeki sahibinden benzeri bir site. Burada bir diger populer ev kiralama firmasi olan <a href="https://www.victoriahem.se/">victoriahem</a> ilanlarini da gorebilirsiniz. Internetteki yazilara bakarsaniz genelde ev bulmanin zorluklarindan bahsedildigini goreceksiniz. Isin bu kismi tamamen kismet diyebiliriz. Genel olarak esyali ev bulmanin biraz daha zor oldugunu soyleyebilirim, ayrica evlerin bize gore kucuk oldugunu da. Ama esyasiz evlerde bile beyaz esyalarin standart olarak bulunmasi cok iyi. Buraya kadar okuduysaniz, umarim isinize yarar bilgiler edinmissinizdir. Son olarak asagiya Stockholm ve</span><span> Linkoping</span><span style="color: #333333; text-align: left;">`</span><span style="color: #333333;"><span> e ilk indigim anda karsilastigim havaya</span></span><span style="color: #333333;"> dair fotograflar ekliyorum.</span></span></p><p style="text-align: justify;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7mK6oV5YSExyQfZcgRjUZzuLAMC05PpUN_PbR8gRrg8GsEzQXoApk6LjhFHdm48-M5mHOoQhOQ3M50dg6eFIJEuA9JX81lquI6slyPc-IfkOMRzLYsQpwmZAqpFIjLGi55ta4y-C9cQJ-gOhpBtdLMzv9fbtrOSnzqzL97k-EMQNpT2y0kyEEXhZOj-o/s4032/20240213_114924.jpg" style="margin-left: 1em; margin-right: 1em; text-align: center;"><span style="font-family: inherit; font-size: large;"><img border="0" data-original-height="4032" data-original-width="3024" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7mK6oV5YSExyQfZcgRjUZzuLAMC05PpUN_PbR8gRrg8GsEzQXoApk6LjhFHdm48-M5mHOoQhOQ3M50dg6eFIJEuA9JX81lquI6slyPc-IfkOMRzLYsQpwmZAqpFIjLGi55ta4y-C9cQJ-gOhpBtdLMzv9fbtrOSnzqzL97k-EMQNpT2y0kyEEXhZOj-o/s320/20240213_114924.jpg" width="240" /></span></a></p><p style="text-align: justify;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb8MME9JQzOwE3XSe8NlWwZTe3SPF88jO8cx-IIY_yunFda2NRJ6c1_sQ2Zrxd36x1A4Kgq_dHLoIOJBM9Docs_m3W2R6_mrOA5b6tYLUOjMgQnKy3o2tG_BfP8O7c6PEHjjNFCHoG7YHRvIAD3cJKRYKQxogNE1njsJzIkENvKy3QXbJTOQkxNlMhkxU/s4032/20240213_164110.jpg" style="margin-left: 1em; margin-right: 1em; text-align: center;"><span style="font-family: inherit; font-size: large;"><img border="0" data-original-height="4032" data-original-width="3024" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb8MME9JQzOwE3XSe8NlWwZTe3SPF88jO8cx-IIY_yunFda2NRJ6c1_sQ2Zrxd36x1A4Kgq_dHLoIOJBM9Docs_m3W2R6_mrOA5b6tYLUOjMgQnKy3o2tG_BfP8O7c6PEHjjNFCHoG7YHRvIAD3cJKRYKQxogNE1njsJzIkENvKy3QXbJTOQkxNlMhkxU/s320/20240213_164110.jpg" width="240" /></span></a></p>İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com0İsveç60.128161000000013 18.64350131.817927163821167 -16.512749 88.438394836178858 53.799751tag:blogger.com,1999:blog-2739106657175580544.post-92011275228390391752023-01-21T04:52:00.005-08:002023-01-21T04:55:16.730-08:00Moving object detection from ChatGPT perspective<p><span face="Söhne, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Ubuntu, Cantarell, "Noto Sans", sans-serif, "Helvetica Neue", Arial, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"" style="background-color: #f7f7f8; color: #374151; font-size: 16px; white-space: pre-wrap;">Moving object detection is a research area that focuses on identifying and tracking objects in video sequences. This can include cars, pedestrians, animals, and other moving objects. The goal of moving object detection is to accurately identify and track objects in real-time, despite changes in lighting, weather, and other environmental conditions.</span></p><p><span></span></p><a name='more'></a><p></p><p><span style="background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Ubuntu, Cantarell, "Noto Sans", sans-serif, "Helvetica Neue", Arial, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 16px; white-space: pre-wrap;">Some of the key challenges in moving object detection include dealing with occlusion, background clutter, and changes in object appearance. To address these challenges, researchers often use a combination of computer vision techniques such as background subtraction, feature extraction, and object tracking.</span></p><p style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(59,130,246,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Ubuntu, Cantarell, "Noto Sans", sans-serif, "Helvetica Neue", Arial, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 16px; margin: 1.25em 0px; white-space: pre-wrap;">Deep learning approaches, such as convolutional neural networks (CNNs), have also become increasingly popular in moving object detection research. These methods have shown to be effective in detecting objects in video sequences and have been used in a variety of applications such as self-driving cars, surveillance, and video monitoring.</p><p style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(59,130,246,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Ubuntu, Cantarell, "Noto Sans", sans-serif, "Helvetica Neue", Arial, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 16px; margin: 1.25em 0px; white-space: pre-wrap;">Another area of research in moving object detection is event-based object detection, which aims to detect and track objects in real-time using event cameras, which have the capability to output per-pixel intensity changes, instead of frames. This allows for detection and tracking of objects at high-speed and low-light conditions.Event cameras have the potential to provide improved results for motion detection in certain scenarios. One of the main advantages of event cameras is that they can detect motion at a much faster rate than traditional frame-based cameras. This makes them well-suited for applications that require real-time object detection and tracking, such as self-driving cars and robotics. </p><p style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(59,130,246,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Ubuntu, Cantarell, "Noto Sans", sans-serif, "Helvetica Neue", Arial, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 16px; margin: 1.25em 0px; white-space: pre-wrap;">Event cameras also have a high dynamic range, which allows them to capture fine details even in low-light conditions. This makes them well-suited for tracking objects in challenging environments, such as in dark or dimly lit scenes. Additionally, event cameras have low power consumption, making them suitable for battery-powered devices. However, event cameras have some limitations, such as low spatial resolution, which make them less suited for applications that require high-resolution images, and their data format is less common and not as well supported as traditional cameras. In brief, event cameras have the potential to provide improved results for motion detection in certain scenarios, particularly when high-speed, low-light, or low power are requirements. But it also depends on specific use-case and the trade-off between the advantages and limitations.</p><p style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(59,130,246,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Ubuntu, Cantarell, "Noto Sans", sans-serif, "Helvetica Neue", Arial, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 16px; margin: 1.25em 0px 0px; white-space: pre-wrap;">Overall, moving object detection is a multidisciplinary field that involves techniques from computer vision, image processing, and machine learning, which is an active research area with many open challenges and opportunities for further development.</p>İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com0tag:blogger.com,1999:blog-2739106657175580544.post-76413395641044356192022-09-29T13:33:00.001-07:002023-02-16T12:25:37.881-08:00Using Pytorch C++ API to extract features with CNN <p><span style="background-color: white; color: #1c1d1f; font-family: "udemy sans", "sf pro text", -apple-system, BlinkMacSystemFont, Roboto, "segoe ui", Helvetica, Arial, sans-serif, "apple color emoji", "segoe ui emoji", "segoe ui symbol"; font-size: 16px; font-variant-ligatures: none; white-space: pre-wrap;">I continue to enhance the existing courses over Udemy. I have prepared a new video to show how to use Pytorch C++ API. In this example, We will save a model for feature extraction in the Python, and then use that model in C++. </span></p><p style="background-color: white; box-sizing: border-box; color: #1c1d1f; font-family: "udemy sans", "sf pro text", -apple-system, BlinkMacSystemFont, Roboto, "segoe ui", Helvetica, Arial, sans-serif, "apple color emoji", "segoe ui emoji", "segoe ui symbol"; font-size: 16px; font-variant-ligatures: none; margin: 0.8rem 0px 0px; max-width: 80rem; padding: 0px; white-space: pre-wrap;">By using extracted features, we will classify two target objects. </p><p style="background-color: white; box-sizing: border-box; margin: 0.8rem 0px 0px; max-width: 80rem; padding: 0px;"><span style="color: #1c1d1f; font-family: udemy sans, sf pro text, -apple-system, BlinkMacSystemFont, Roboto, segoe ui, Helvetica, Arial, sans-serif, apple color emoji, segoe ui emoji, segoe ui symbol;"><span style="font-variant-ligatures: none; white-space: pre-wrap;"><a href="https://www.udemy.com/course/computer-vision-by-using-cpp-and-opencv-with-gpu-support/?couponCode=202209">https://www.udemy.com/course/computer-vision-by-using-cpp-and-opencv-with-gpu-support/?couponCode=202209</a></span></span></p><p style="background-color: white; box-sizing: border-box; margin: 0.8rem 0px 0px; max-width: 80rem; padding: 0px;"><span style="color: #1c1d1f; font-family: udemy sans, sf pro text, -apple-system, BlinkMacSystemFont, Roboto, segoe ui, Helvetica, Arial, sans-serif, apple color emoji, segoe ui emoji, segoe ui symbol;"><br /></span></p><p style="background-color: white; box-sizing: border-box; margin: 0.8rem 0px 0px; max-width: 80rem; padding: 0px;"></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dxxUSJRrn8rDVCnI0E-atDG_e7aweFt-aYXgxymbltuOv3TNB0cdc9rw6WZa9dILnECFdlYFdM83KFgBmE7AQ' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div><br /><span style="color: #1c1d1f; font-family: udemy sans, sf pro text, -apple-system, BlinkMacSystemFont, Roboto, segoe ui, Helvetica, Arial, sans-serif, apple color emoji, segoe ui emoji, segoe ui symbol;"><br /></span><p></p>İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com0tag:blogger.com,1999:blog-2739106657175580544.post-2430719708056374812021-11-20T13:45:00.002-08:002021-11-20T13:45:59.050-08:00OCR example processing a newspaper image<iframe width="480" height="270" src="https://youtube.com/embed/5_OlCzK3HJ4" frameborder="0"></iframe>İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com0tag:blogger.com,1999:blog-2739106657175580544.post-88890036166955309682021-08-12T06:59:00.002-07:002023-01-21T04:53:49.152-08:00OpenCV: SVM ve HOG ile nesne tespiti<div style="text-align: justify;"><span style="font-family: arial; font-size: medium;"><span style="background-color: #fefdfa;">B</span><span style="background-color: #fefdfa; color: #333333;">u yazı kapsamında Python ile OPENCV kütüphanesini kullanarak</span><span style="background-color: #fefdfa; color: #333333;"> basit bir nesne tespiti/sınıflama uygulamasını nasıl gerçekleştirebileceğinizi anlatacağım. Örneğimizde OpenCV <i><b>ML (machine learning)</b></i> modülü içerisindeki <i>SVM(Support Vector Machine)</i> ve <i><b>Object Detection</b></i> modülü içerisindeki <i>HOG</i> yöntemlerini kullanacağız.</span></span></div><div style="text-align: justify;"><span style="font-family: arial; font-size: medium;"><span><a name='more'></a></span><span style="background-color: #fefdfa; color: #333333;"><br /></span></span></div><div style="text-align: justify;"><span style="font-family: arial; font-size: medium;"><span style="background-color: #fefdfa; color: #333333;"><br /></span></span></div><div style="text-align: justify;"><span style="font-family: arial; font-size: medium;"><span style="background-color: #fefdfa; color: #333333;">SVM etiketlenmiş bir veri kümesindeki farklı sınıfları birbirinden ayıracak hyperplane(düzlemleri) çıkararak sınıflama işlemi gerçekleştirir. OpenCV dökümantasyonundan detaylı bilgilere <a href="https://docs.opencv.org/3.4/d1/d73/tutorial_introduction_to_svm.html" target="_blank">erişebilirsiniz</a>. HOG(Histogram of Gradient) yöntemi ise görüntü üzerinden özellik çıkarımı yapan bir yöntemdir. Alternatif olarak SURF ve ORB metotları da bir başka özellik çıkarımı yöntemleri olarak sıralanabilir. Özellik çıkarımından kastedilen şey, örneğin 224x224 boyutlarındaki bir görüntüyü işleyip, bu görüntüyü ifade eden 255 elemandan oluşan bir vektörün çıkarılması olarak düşünülebilir. Elde edilen bu daha düşük boyutlu vektörde önemli bilgilerin(özelliklerin) tutulması, gereksiz bilgilerin ise atılması hedeflenmektedir.</span></span></div><div style="text-align: justify;"><span style="font-family: arial; font-size: medium;"><span style="background-color: #fefdfa; color: #333333;"><br /></span></span></div><div style="text-align: justify;"><span style="background-color: #fefdfa;"><span style="color: #333333; font-family: arial; font-size: medium;">HOG metotunda, yatay ve dikey gradyanlar alındıktan sonra bu gradyanların histogramı hesaplanır. x ve y ekseninde hesaplanmış gradyan örneğini aşağıdaki resimde görebilirsiniz. Bu ve bunun gibi görüntü işlemede temel teşkil eden konuları öğrenmek ve uygulamalı örneklerle bunları pekiştirmek için udemy'deki kursuma göz atabilirsiniz. :) (İletişim sayfasından ulaşırsanız sizlere kupon kodu tanımlayabilirim) </span></span></div><div style="text-align: justify;"><span style="background-color: #fefdfa;"><span style="color: #333333; font-family: arial; font-size: medium;"><a href="https://www.udemy.com/course/python-ile-goruntu-isleme/">https://www.udemy.com/course/python-ile-goruntu-isleme/</a></span></span></div><div style="text-align: justify;"><span style="background-color: #fefdfa;"><span style="color: #333333; font-family: arial; font-size: medium;"><br /></span></span></div><div style="text-align: justify;"><span style="background-color: #fefdfa;"><span style="color: #333333; font-family: arial; font-size: medium;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtRRaGcr-6sv5CCkxJVh9W5SN5g-iuLYNr6U51iYWmttDTR3vA8UdOuj8IDFBqd1wqs6FXxbwgxIJcvYPuwDQeahwGUWKNAwFbhpW9D6hx9m_NKur13bZQHGCruggcgnOJ82Pnh0pJcQg/s1102/gradients.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="474" data-original-width="1102" height="138" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtRRaGcr-6sv5CCkxJVh9W5SN5g-iuLYNr6U51iYWmttDTR3vA8UdOuj8IDFBqd1wqs6FXxbwgxIJcvYPuwDQeahwGUWKNAwFbhpW9D6hx9m_NKur13bZQHGCruggcgnOJ82Pnh0pJcQg/s320/gradients.png" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div>HOG metotunda görüntü ızgaralara bölünerek her bir ızgara içerisindeki gradyanların histogramları hesaplanır. Algoritmaya girdi olarak verilen bu ızgara boyutları elde edilecek özellik vektörünün boyutunu doğrudan etkilemektedir. HOG metodu hakkında daha detaylı bilgiler için <a href="https://learnopencv.com/histogram-of-oriented-gradients/" target="_blank">learnopencv</a> sayfasına göz atabilirsiniz.</span></span></div><div style="text-align: justify;"><span style="background-color: #fefdfa;"><span style="color: #333333; font-family: arial; font-size: medium;"><br /></span></span></div><div style="text-align: justify;"><span style="background-color: #fefdfa;"><span style="color: #333333; font-family: arial; font-size: medium;"><br /></span></span></div><div style="text-align: justify;"><span style="background-color: #fefdfa;"><span style="color: #333333; font-family: arial; font-size: medium;">Kullanacağımız yöntemlerle ilgili bu çok temel bilgilerden sonra kodları yazmaya başlayabiliriz. İlk yapacağımız bir çeşit makine öğrenmesi yöntemi olan SVM'i eğitmek amaçlı kullanacağımız bir örnek veri seti hazırlamak. Ben örnek olarak kolonya tespit uygulaması yapmaya karra verdim, bu sebeple kolonya içeren ve içermeyen bir dizi görüntü içeren iki farklı klasör oluşturdum. Siz görüntü sayısını arttırarak yöntemin performansını daha iyi test edebilirsiniz. Hazırladığım örnek veri setine ait görüntüleri aşağıda görebilirsiniz.</span></span></div><div style="text-align: justify;"><span style="color: #333333; font-family: arial; font-size: medium;"><br /></span><span style="background-color: #fefdfa;"><span style="color: #333333; font-family: arial; font-size: medium;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgy0TxdaeEHG-0t8zfx2Ji0mNIveiia9Rpw2ksHjnWvvDhiGPgQleZCeVZ_COAS_Jv_ZihyslziWrR41YSpDhgYPTHVVJFt88UifabjEAgYI93Xuvm6Xom6vX-3vFmLsh0NmKaWgT5inDw/s982/SVM-dataset.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="498" data-original-width="982" height="325" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgy0TxdaeEHG-0t8zfx2Ji0mNIveiia9Rpw2ksHjnWvvDhiGPgQleZCeVZ_COAS_Jv_ZihyslziWrR41YSpDhgYPTHVVJFt88UifabjEAgYI93Xuvm6Xom6vX-3vFmLsh0NmKaWgT5inDw/w640-h325/SVM-dataset.png" width="640" /></a></div><br /><br />Şimdi bu kadar girizgahtan sonra bu 2 klasördeki görüntüleri alıp, HOG ile özellik çıkarımını yapıp, SVM ile modeli eğitip sonucunu bir dosyaya kaydeden örnek python kodunu paylaşıyorum.</span></span></div><div style="text-align: justify;"><span style="background-color: #fefdfa;"><span style="color: #333333; font-family: arial; font-size: medium;"><br /></span></span></div><div style="text-align: justify;"><br /><span style="font-size: large;"></span><br /><div style="-webkit-text-stroke-width: 0px; text-align: left;"></div><br /><div style="text-align: left;"><div style="text-align: justify;"><div><pre style="border: 1px dashed rgb(153, 153, 153); line-height: 14px; margin-bottom: 0px; margin-top: 0px; overflow: auto; padding: 5px; text-align: left; width: 653px;">import cv2
import os
import numpy as np
def loadImages(hog, path):
file_list = os.listdir(path)
x = []
for filename in file_list:
img = cv2.imread(path + filename)
hist = hog.compute(img)
x.append(hist)
return x
winSize = (128, 128)
blockSize = (64, 64)
blockStride = (64, 64)
cellSize = (32, 32)
nBin = 9
hog = cv2.HOGDescriptor(winSize, blockSize, blockStride, cellSize, nBin)
featuresCologne = np.array(loadImages(hog, "dataset/1/"))
featuresOther = np.array(loadImages(hog, "dataset/0/"))
labelsCologne = np.ones(((len(featuresCologne),1)), np.int32)
labelsOther = np.zeros(((len(featuresOther),1)), np.int32)
features = np.float32(np.concatenate((featuresCologne, featuresOther), axis=0))
labels = np.concatenate((labelsCologne, labelsOther), axis=0)
svm = cv2.ml.SVM_create()
svm.setType(cv2.ml.SVM_C_SVC)
svm.setKernel(cv2.ml.SVM_LINEAR)
svm.setTermCriteria((cv2.TERM_CRITERIA_MAX_ITER, int(1e7), 1e-6))
print("training....")
ret = svm.train(features, cv2.ml.ROW_SAMPLE, labels)
svm.save('svm_data_hog.xml')
</pre><div><br /></div></div></div></div></div><div style="text-align: justify;"><span style="background-color: #fefdfa;"><span style="color: #333333; font-family: arial; font-size: medium;"><br /></span></span></div><div style="text-align: justify;"><span style="background-color: #fefdfa;"><span style="color: #333333; font-family: arial; font-size: medium;">Eğitilmiş modeli kullanarak bir video üzerindeki belirli bir bölgedeyi (ROI) tarayan ve buraya göstermiş olduğum kolonyayı tanımaya yarayan kod parçacığını ise aşağıya bırakıyorum.</span></span></div><div style="text-align: justify;"><br class="Apple-interchange-newline" /><br /><div style="text-align: left;"><div style="text-align: justify;"><div><pre style="border: 1px dashed rgb(153, 153, 153); line-height: 14px; margin-bottom: 0px; margin-top: 0px; overflow: auto; padding: 5px; text-align: left; width: 653px;">import cv2
import numpy as np
winSize = (128, 128)
blockSize = (64, 64)
blockStride = (64, 64)
cellSize = (32, 32)
nBin = 9
hog = cv2.HOGDescriptor(winSize, blockSize, blockStride, cellSize, nBin)
svm = cv2.ml.SVM_create()
svm = cv2.ml.SVM_load("svm_data_hog.xml")
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("Cannot open camera")
exit()
x,y,w,h = 20, 50, 243, 348
while True:
ret, frame = cap.read()
if not ret:
print("Can't receive frame. Byess")
break
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),1)
patch = frame[y:y+h, x:x+w, :]
hist = hog.compute(patch)
inputX = np.float32(np.expand_dims(hist, axis=0))
res = svm.predict(inputX)[1]
print(res)
ch = cv2.waitKey(1)
if ch == ord('q'):
break
if res[0] == 1:
cv2.putText(frame, "It is a Cologne", (x,y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255),1)
cv2.imshow("frames", frame)
cap.release()
cv2.destroyAllWindows()
</pre><div style="text-align: left;"><br /></div></div></div></div></div><div style="text-align: justify;"><span style="background-color: #fefdfa;"><span style="color: #333333; font-family: arial; font-size: medium;"><br /></span></span></div><div style="text-align: justify;"><span style="background-color: #fefdfa;"><span style="color: #333333; font-family: arial; font-size: medium;">Ve son olarak uygulamanın örnek bir çıktısı</span></span></div><div style="text-align: justify;"><span style="background-color: #fefdfa;"><span style="color: #333333; font-family: arial; font-size: medium;"><br /></span></span></div><div style="text-align: justify;"><span style="background-color: #fefdfa;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxlDf0Y0C1RPXyII29sxXesAgHNhXky30imVJuWBh6KcMloaqQoEJEVBQ6W2454vIWzHaYq7u8mx1rT7zMP6smQATApJPtzG-yu6RmlgpWKCKsY-mgOo-HQyWav3KKuPNZJt14lBIjQA8/s1280/clip-svm-hog.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="720" data-original-width="1280" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxlDf0Y0C1RPXyII29sxXesAgHNhXky30imVJuWBh6KcMloaqQoEJEVBQ6W2454vIWzHaYq7u8mx1rT7zMP6smQATApJPtzG-yu6RmlgpWKCKsY-mgOo-HQyWav3KKuPNZJt14lBIjQA8/s320/clip-svm-hog.gif" width="320" /></a></div><br /><span style="color: #333333; font-family: arial; font-size: medium;"><br /></span></span></div><div style="text-align: justify;"><span style="background-color: #fefdfa;"><span style="color: #333333; font-family: arial; font-size: medium;"><br /></span></span></div><div style="text-align: justify;"><span style="background-color: #fefdfa;"><span style="color: #333333; font-family: arial; font-size: medium;"><br /></span></span></div><div style="text-align: justify;"><i style="background-color: #fefdfa; color: #333333; font-family: "courier new", courier, monospace; font-size: large; text-align: left;">Her türlü görüş, öneri ve sorularınızı iletebilirsiniz...</i></div>İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com0tag:blogger.com,1999:blog-2739106657175580544.post-1119547947135947682021-03-23T08:13:00.005-07:002021-03-25T02:35:08.769-07:00UAV Images Dataset (PESMOD) for Moving Object Detection from Moving Cameras<p><span style="font-size: medium;"><span color="rgba(0, 0, 0, 0.9)" face="-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif" style="background-color: white;">I have prepared a high resolution aerial images dataset for motion detection. This dataset (named PESMOD) consists of challenging images containing small targets compared to other publicly available datasets. You can view the preprint paper comparing two methods in the literature and proposed method which is relatively simple.</span></span></p><span style="font-size: medium;"><a data-attribute-index="7" href="https://lnkd.in/dFVyP-E" style="background: rgb(255, 255, 255); border: 0px; box-sizing: inherit; font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-weight: var(--font-weight-bold); line-height: inherit; margin: 0px; padding: 0px; position: relative; text-decoration-line: none; touch-action: manipulation; vertical-align: baseline;" target="_blank">https://lnkd.in/dFVyP-E</a><br style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; line-height: inherit;" /><span color="rgba(0, 0, 0, 0.9)" face="-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif" style="background-color: white;">To download the dataset and compare your own method</span><br style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; line-height: inherit;" /><a data-attribute-index="8" href="https://lnkd.in/d3ASwaC" style="background: rgb(255, 255, 255); border: 0px; box-sizing: inherit; font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-weight: var(--font-weight-bold); line-height: inherit; margin: 0px; padding: 0px; position: relative; text-decoration-line: none; touch-action: manipulation; vertical-align: baseline;" target="_blank">https://lnkd.in/d3ASwaC</a><br style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; line-height: inherit;" /><br /></span>İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com0tag:blogger.com,1999:blog-2739106657175580544.post-60829977079735671062021-01-01T12:02:00.002-08:002021-01-22T00:25:17.266-08:00Moving object detection from moving camera<div>Hareketli kameradan hareketli nesne tanıma üzerine bir takım çalışmalar</div><div><br /></div><iframe frameborder="0" height="270" src="https://youtube.com/embed/6DeZVKD9_PM" style="background-image: url(https://i.ytimg.com/vi/6DeZVKD9_PM/hqdefault.jpg);" width="480"></iframe>İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com2tag:blogger.com,1999:blog-2739106657175580544.post-61604055170597497582020-11-06T10:45:00.004-08:002020-11-06T10:49:38.363-08:00C++ ile OpenCV CUDA metodlarının kullanımı<p><span style="font-size: medium;">Python kullanarak OpenCV ile Görüntü işleme üzerine yayınladığım udemy kurslarına ek olarak, C++ ile OpenCV+CUDA destekli metodları nasıl kullanabileceğimize dair bir başka video serisi daha hazırladım.</span></p><span><span style="font-size: medium;"><a name='more'></a></span></span><p><span style="font-size: medium;"><a href="https://www.udemy.com/user/671f806a-52d6-4ce9-970b-84cd7fa4e2c9/">https://www.udemy.com/user/671f806a-52d6-4ce9-970b-84cd7fa4e2c9/</a></span></p><p><span style="font-size: medium;"><br /></span></p><p><span style="font-size: medium;">Kursta neler anlattığımdan özet olarak bahsedecek olursam;</span></p><p></p><ul style="text-align: left;"><li><span style="font-size: medium;">İlk bölümde Ubuntu işletim sistemi üzerinde OpenCV'yi nasıl derleyeceğimizi ve CUDA kurulumları anlattım.</span></li><li><span style="font-size: medium;">Ardından bir klasördeki görüntü dosyalarını nasıl okuruz, renk uzayı dönüşümleri, CUDA desteğiyle GPU üzerinde filtreleme işlemlerinden ve bize kazandırdığı performanstan bahsettim</span></li></ul><p></p><div class="separator" style="clear: both; text-align: center;"><span style="font-size: medium;"><br /></span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTD6FAc7rn27we22X2I4A7ORzvlnLdvAeawT8AJP1UZU4yOZhIp14lOf0MVMTwOHFUMqWICj3irWm7Iq5ZpnNOEpVlpjER-WnXwW5MUcK6e8m-gYYz05xMSxbNZD32Se8q4NwLbuFtkI8/s1136/EkoqtefXIAA3IR8.jpeg" style="margin-left: 1em; margin-right: 1em;"><span style="font-size: medium;"><img border="0" data-original-height="952" data-original-width="1136" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTD6FAc7rn27we22X2I4A7ORzvlnLdvAeawT8AJP1UZU4yOZhIp14lOf0MVMTwOHFUMqWICj3irWm7Iq5ZpnNOEpVlpjER-WnXwW5MUcK6e8m-gYYz05xMSxbNZD32Se8q4NwLbuFtkI8/s320/EkoqtefXIAA3IR8.jpeg" width="320" /></span></a></div><span style="font-size: medium;"><ul style="text-align: left;"><li>Bir başka bölümde Arka plan çıkarma yöntemlerinden ve GPU implementasyonlarından bahsettim. Ekstra olarak mini bir tracking(takip) kodu yazdık</li></ul></span><div class="separator" style="clear: both; text-align: left;"><span style="font-size: medium;"><br /></span></div><span style="font-size: medium;"><br /></span><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8sdqREt24jFG19NU7abragbr4PDNQ3blEIXPngX9LMH5vpRTssEh1wL4HE3bkho9y1gyoDoh8I1pkrfq6qBcqdy9W0jAVazYtNkazBHT_DOoBFaNUYUsRZIF0Q2ub9tlraH2Re2dZVEo/s1131/EkorBD_W0AE64Ft.jpeg" style="margin-left: 1em; margin-right: 1em;"><span style="font-size: medium;"><img border="0" data-original-height="962" data-original-width="1131" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8sdqREt24jFG19NU7abragbr4PDNQ3blEIXPngX9LMH5vpRTssEh1wL4HE3bkho9y1gyoDoh8I1pkrfq6qBcqdy9W0jAVazYtNkazBHT_DOoBFaNUYUsRZIF0Q2ub9tlraH2Re2dZVEo/s320/EkorBD_W0AE64Ft.jpeg" width="320" /></span></a></div><span style="font-size: medium;"><br /></span><div class="separator" style="clear: both; text-align: center;"><ul><li style="text-align: justify;"><span style="font-size: medium;">OpenCV Machine Learning modülünden bahsettiğimiz bölümde, nesne tanıma örneği için örnek bir veri seti hazırladık, modeli eğittik ve nesne tanıma işlemini gerçekleştirdik. (CUDA desteği ile)</span></li></ul></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLgTmTblsXXAahqk82A19t416czAjxVvbu7WPVc2vGbWn8SeqDC4gV_3kW8Q0yKUvj3ZsMLXHoaWYhRI3qxAG5akhDt_svQaeFL0aEEX8_vanTJmcJ1XvhEOUl9RkKJUCPVmxLRMUPU1s/s613/ML-bear.png" style="margin-left: 1em; margin-right: 1em;"><span style="font-size: medium;"><img border="0" data-original-height="479" data-original-width="613" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLgTmTblsXXAahqk82A19t416czAjxVvbu7WPVc2vGbWn8SeqDC4gV_3kW8Q0yKUvj3ZsMLXHoaWYhRI3qxAG5akhDt_svQaeFL0aEEX8_vanTJmcJ1XvhEOUl9RkKJUCPVmxLRMUPU1s/w200-h156/ML-bear.png" width="200" /></span></a></div><p></p><ul style="text-align: left;"><li><span style="font-size: medium;">Ve son bölümde optical flow yöntemlerinden bahsettim. CUDA destekli klasik yöntemler ile derin öğrenme yöntemini örnek bir video üzerinde kıyaslayıp performans karşılaştırması yapmış olduk. Videosunu bir önceki postta görebilirsiniz.</span></li></ul><p></p>İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com0tag:blogger.com,1999:blog-2739106657175580544.post-73759472518995110572020-10-07T03:47:00.001-07:002020-10-07T03:47:03.635-07:00Comparison of Dense optical flow methods<iframe allowfullscreen="" frameborder="0" height="344" src="https://www.youtube.com/embed/drmtUknLWjw" width="459"></iframe>İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com0tag:blogger.com,1999:blog-2739106657175580544.post-29035799619988332922020-04-15T01:01:00.000-07:002020-04-15T01:05:42.865-07:00Nvidia CUDA and tensorflow-GPU installation on Ubuntu 16.04<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; margin-bottom: 12px; padding: 0px;">
<strong style="margin-top: 0px;"><em style="margin-top: 0px;"><span style="font-size: large;">NVIDIA DRIVER INSTALLATION</span></em></strong></div>
<div style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; margin-bottom: 12px; padding: 0px;">
Firstly install Nvidia driver, open terminal and run following commands.</div>
<ol class="remarkup-list" style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; list-style-image: initial; list-style-position: initial; margin: 12px 0px 12px 30px; padding: 0px;">
<li class="remarkup-list-item" style="border: 0px; line-height: 1.7em; margin: 0px; padding: 0px;"><strong style="margin-top: 0px;">sudo apt update</strong></li>
<li class="remarkup-list-item" style="border: 0px; line-height: 1.7em; margin: 0px; padding: 0px;"><strong style="margin-top: 0px;">sudo add-apt-repository ppa:graphics-drivers/ppa</strong></li>
<li class="remarkup-list-item" style="border: 0px; line-height: 1.7em; margin: 0px; padding: 0px;"><strong style="margin-top: 0px;">sudo apt update</strong></li>
<li class="remarkup-list-item" style="border: 0px; line-height: 1.7em; margin: 0px; padding: 0px;"><strong style="margin-top: 0px;">sudo apt upgrade</strong></li>
<li class="remarkup-list-item" style="border: 0px; line-height: 1.7em; margin: 0px; padding: 0px;"><strong style="margin-top: 0px;">sudo ubuntu-drivers devices</strong></li>
<li class="remarkup-list-item" style="border: 0px; line-height: 1.7em; margin: 0px; padding: 0px;"><strong style="margin-top: 0px;">sudo apt install nvidia-410<a name='more'></a></strong></li>
</ol>
<div style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; margin-bottom: 12px; padding: 0px;">
After installation reboot your PC. Then if you have a problem in login (loop in login);</div>
<div style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; margin-bottom: 12px; padding: 0px;">
Open terminal in login screen with CTRL + ALT + F1 and then query your graphics card</div>
<ul class="remarkup-list" style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; list-style-image: initial; list-style-position: initial; margin: 12px 0px 12px 30px; padding: 0px;">
<li class="remarkup-list-item" style="border: 0px; line-height: 1.7em; margin: 0px; padding: 0px;"><strong style="margin-top: 0px;">sudo prime-select query</strong></li>
</ul>
<div style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; margin-bottom: 12px; padding: 0px;">
select intel graphics card, if nvidia is selected</div>
<ul class="remarkup-list" style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; list-style-image: initial; list-style-position: initial; margin: 12px 0px 12px 30px; padding: 0px;">
<li class="remarkup-list-item" style="border: 0px; line-height: 1.7em; margin: 0px; padding: 0px;"><strong style="margin-top: 0px;">sudo prime-select intel</strong></li>
</ul>
<div style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; margin-bottom: 12px; padding: 0px;">
Turn back to login screen (CTRL + ALT + <a class="phui-tag-view phui-tag-type-object " data-meta="0_0" data-sigil="hovercard" href="https://phab.erbul.com/F7" style="-webkit-font-smoothing: antialiased; color: black; cursor: pointer; font-weight: bold; margin-top: 0px; position: relative; text-decoration-line: none; white-space: nowrap;"><span class="phui-tag-core phui-tag-color-object" style="background-color: #ebecee; border-radius: 3px; border: 1px solid rgb(199 , 204 , 217); color: inherit; margin-top: 0px; padding: 0px 4px;">F7</span></a>), now you must be able to login succesfully.</div>
<div style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; margin-bottom: 12px; padding: 0px;">
Open Terminal, activate and check driver;</div>
<ul class="remarkup-list" style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; list-style-image: initial; list-style-position: initial; margin: 12px 0px 12px 30px; padding: 0px;">
<li class="remarkup-list-item" style="border: 0px; line-height: 1.7em; margin: 0px; padding: 0px;"><strong style="margin-top: 0px;">sudo prime-select intel</strong></li>
<li class="remarkup-list-item" style="border: 0px; line-height: 1.7em; margin: 0px; padding: 0px;"><strong style="margin-top: 0px;">nvidia-smi</strong></li>
</ul>
<div style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; margin-bottom: 12px; padding: 0px;">
If everthing is OK, you must an output similar to;</div>
<div style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; margin-bottom: 12px; padding: 0px;">
</div>
<div class="phabricator-remarkup-embed-layout-left" style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; margin: 0px; padding: 0px;">
<a class="phabricator-remarkup-embed-image" data-meta="0_1" data-sigil="lightboxable" href="https://phab.erbul.com/file/data/4khtufua7yp37ktfinqo/PHID-FILE-45s7l746ajydhwf4c65d/nvidia-smi.png" style="border: 3px solid white; box-shadow: rgba(0, 0, 0, 0.2) 1px 1px 2px; color: #136cb2; cursor: pointer; display: inline-block; margin-top: 0px; text-decoration-line: none;"><img height="124.74860335196" src="https://phab.erbul.com/file/data/lzba6iaxkrg5p5f7l23f/PHID-FILE-h32gwu2v4ks34dcsoava/preview-nvidia-smi.png" style="border: 0px; display: block; margin-top: 0px;" width="220" /></a></div>
<div style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; margin-bottom: 12px; padding: 0px;">
</div>
<div style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; margin-bottom: 12px; padding: 0px;">
<span style="font-size: large;"><strong style="margin-top: 0px;"><em style="margin-top: 0px;"><br /></em></strong></span></div>
<div style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; margin-bottom: 12px; padding: 0px;">
<span style="font-size: large;"><strong style="margin-top: 0px;"><em style="margin-top: 0px;">CUDA TOOLKIT INSTALLATION</em></strong></span><span style="font-size: 14px;"><br /></span></div>
<div style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; margin-bottom: 12px; padding: 0px;">
<span style="font-size: 14px;">Now we are ready for CUDA installation;</span></div>
<ul class="remarkup-list" style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; list-style-image: initial; list-style-position: initial; margin: 12px 0px 12px 30px; padding: 0px;">
<li class="remarkup-list-item" style="border: 0px; line-height: 1.7em; margin: 0px; padding: 0px;">download CUDA 10.0 for Linux-Ubuntu-16.04: <a class="remarkup-link" href="https://developer.nvidia.com/cuda-10.0-download-archive" rel="noreferrer" style="color: #136cb2; cursor: pointer; margin-top: 0px; text-decoration-line: none;" target="_blank">https://developer.nvidia.com/cuda-10.0-download-archive</a></li>
</ul>
<div style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; margin-bottom: 12px; padding: 0px;">
Run <strong style="margin-top: 0px;">sudo sh cuda_10.0.130_410.48_linux.run</strong> (When it asks to install driver, answer <strong>NO</strong>, because we have already did it!) Answer <strong>YES</strong> for all other questions</div>
<ul class="remarkup-list" style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; list-style-image: initial; list-style-position: initial; margin: 12px 0px 12px 30px; padding: 0px;">
<li class="remarkup-list-item" style="border: 0px; line-height: 1.7em; margin: 0px; padding: 0px;">download cudnn-7.4.2 for CUDA 10.0 ( <strong style="margin-top: 0px;">cuDNN Library for Linux</strong> )-> <a class="remarkup-link" href="https://developer.nvidia.com/rdp/cudnn-archive" rel="noreferrer" style="color: #136cb2; cursor: pointer; text-decoration-line: none;" target="_blank">https://developer.nvidia.com/rdp/cudnn-archive</a></li>
</ul>
<div style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; margin-bottom: 12px; padding: 0px;">
</div>
<div class="phabricator-remarkup-embed-layout-left" style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; margin: 0px; padding: 0px;">
<a class="phabricator-remarkup-embed-image" data-meta="0_2" data-sigil="lightboxable" href="https://phab.erbul.com/file/data/mtutmvcvximznxxpqtks/PHID-FILE-7zxdgi5ngdof237bl4dj/cudnn.png" style="border: 3px solid white; box-shadow: rgba(0, 0, 0, 0.2) 1px 1px 2px; color: #136cb2; cursor: pointer; display: inline-block; margin-top: 0px; text-decoration-line: none;"><img height="90.272300469484" src="https://phab.erbul.com/file/data/ehr3alywxy3xze25udym/PHID-FILE-q75jupzis5hz4ohch4jj/preview-cudnn.png" style="border: 0px; display: block; margin-top: 0px;" width="220" /></a></div>
<div style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; margin-bottom: 12px; padding: 0px;">
</div>
<div style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; margin-bottom: 12px; padding: 0px;">
Then extract the downloaded cuDNN tar file and copy the lib files to <strong style="margin-top: 0px;">/usr/local/cuda-10.0 </strong>default path with following commands</div>
<ul class="remarkup-list" style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; list-style-image: initial; list-style-position: initial; margin: 12px 0px 12px 30px; padding: 0px;">
<li class="remarkup-list-item" style="border: 0px; line-height: 1.7em; margin: 0px; padding: 0px;"><strong style="margin-top: 0px;">tar -xf cudnn-10.0-linux-x64-v7.4.2.24.tgz</strong></li>
<li class="remarkup-list-item" style="border: 0px; line-height: 1.7em; margin: 0px; padding: 0px;"><strong style="margin-top: 0px;">sudo cp -R cuda/include/* /usr/local/cuda-10.0/include</strong></li>
<li class="remarkup-list-item" style="border: 0px; line-height: 1.7em; margin: 0px; padding: 0px;"><strong style="margin-top: 0px;">sudo cp -R cuda/lib64/* /usr/local/cuda-10.0/lib64</strong></li>
</ul>
<div style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; margin-bottom: 12px; padding: 0px;">
<strong style="margin-top: 0px;"><em style="margin-top: 0px;"><span style="font-size: large;"><br /></span></em></strong></div>
<div style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; margin-bottom: 12px; padding: 0px;">
<strong style="margin-top: 0px;"><em style="margin-top: 0px;"><span style="font-size: large;">PYTHON AND TENSORFLOW-GPU INSTALLATION</span></em></strong></div>
<div style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; margin-bottom: 12px; padding: 0px;">
We suggest using conda distribution (download Python 3.7): <a class="remarkup-link" href="https://www.anaconda.com/distribution/#download-section" rel="noreferrer" style="color: #136cb2; cursor: pointer; margin-top: 0px; text-decoration-line: none;" target="_blank">https://www.anaconda.com/distribution/#download-section</a></div>
<div style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; margin-bottom: 12px; padding: 0px;">
After installation, add anaconda path to environment: <strong style="margin-top: 0px;">export PATH=~/anaconda3/bin:$PATH</strong><br />
Then run : <strong>conda</strong> in Terminal to check and run: <strong>conda activate</strong> in your terminal to activate anaconda python environment</div>
<div style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; margin-bottom: 12px; padding: 0px;">
To install tensorflow for GPU:</div>
<ul class="remarkup-list" style="background-color: white; border: 0px; font-family: "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; list-style-image: initial; list-style-position: initial; margin: 12px 0px 12px 30px; padding: 0px;">
<li class="remarkup-list-item" style="border: 0px; line-height: 1.7em; margin: 0px; padding: 0px;"><strong style="margin-top: 0px;">pip install tensorflow-gpu==1.13.1</strong> (This version is suitable for CUDA 10.0)</li>
</ul>
</div>
İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com0tag:blogger.com,1999:blog-2739106657175580544.post-22992230004233922652019-12-12T03:03:00.000-08:002019-12-27T06:25:38.817-08:00RASA ile chatbot geliştirme<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
<span style="font-size: large;">Bu yazıda sizlere açık kaynak <i>chatbot </i>geliştirme <i>framework </i>lerinden birisi olan <a href="https://rasa.com/docs/getting-started/" target="_blank">rasa </a>dan bahsedeceğim. </span><br />
<span style="font-size: large;"></span><br />
<a name='more'></a><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKDZBynzOAYfWa0aU8GCJvK8-AzZ3mOkdL7laT27PiChaynouhH-OFIjusHH7WT3MCNYo2Zhy1ez5rAOb5H6rd2akrCrOZQco9a2-OmeybLJtR-2wRT1CQRSkNE-JT-cmMFtHzm_Vbb_c/s1600/chatbot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="960" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKDZBynzOAYfWa0aU8GCJvK8-AzZ3mOkdL7laT27PiChaynouhH-OFIjusHH7WT3MCNYo2Zhy1ez5rAOb5H6rd2akrCrOZQco9a2-OmeybLJtR-2wRT1CQRSkNE-JT-cmMFtHzm_Vbb_c/s320/chatbot.png" width="320" /></a></div>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">Konuya giriş yapmadan evvel <i>chatbot </i>ile kastedilen şey nedir diye bir göz atmakta fayda var. <i>Chatbot, </i>kullanıcılarla yazılı olarak iletişime geçip,<i> </i>onlarla sohbet edebilen, dertlerini dinleyen, en azından belli başlı konularda da olsa yanıtlar verebilen programdır. </span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Ö</span><span style="font-size: large;">zellikle hizmet sektöründe </span><span style="font-size: large;">personel ihtiyacını ortadan kaldırarak</span><span style="font-size: large;"> müşterilere/ kullanıcılara daha hızlı ve sürekli iletişim imkanı sunmaya olanak tanır. Amaçlanan her ne kadar karşıda bir insan varmış gibi konuşabilmek olsa da, günümüzde henüz o seviyeye gelindiğini söylemek mümkün değil. Bu konuda çalışmalar da aslında son derece yoğun bir şekilde devam etmekte. (<b>bknz NLP, NLU</b>) Bu mini girizgahtan sonra, ilk olarak <i>chatbot </i>dünyasında (belki biraz <i>rasa </i>özelinde olabilir) kullanılan bazı temel terimlerden bahsetmek istiyorum.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
</div>
<ul>
<li><span style="font-size: large;"><b>INTENT:</b> Her bir cümle ile ifade edilmek istenen şey.</span></li>
</ul>
<div>
<span style="font-size: large;">Örnek: merhaba diye bir <i>intent </i>tanımladık farzedelim. Farklı cümleler bu <i>intent</i>'i ifade edebilir.</span></div>
<div>
<span style="font-size: large;"> <i>intent: merhaba</i></span></div>
<div>
<span style="font-size: large;"> - merhaba nasılsın</span></div>
<div>
<span style="font-size: large;"> - selam dostum</span></div>
<div>
<span style="font-size: large;"> - hello dude</span></div>
<ul>
<li style="text-align: justify;"><span style="font-size: large;"><b>ENTITY: </b><i>Intent </i>içerisinden bir değer çıkarılmak istenebilir. Örneğin kur bilgisini ifade eden bir <i>intent </i>tanımladık diyelim. <i>miktar </i>ise bu <i>intent </i>içerisinde geçen bir <i>entity </i>olacaktır.</span></li>
</ul>
<br />
<div style="text-align: justify;">
<span style="font-size: large;">Örnek: döviz <i>intent</i>'i içerisinden <i>miktar </i>ve <i>kur </i>bilgisinin çıkarılması;</span></div>
<div style="text-align: justify;">
<b style="font-size: x-large;"> </b><span style="font-size: large;"><i> intent: döviz</i></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"> - <b>3</b> <b>dolar </b>kaç lira { entity--> miktar = 3, kur=dolar}</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"> </span><span style="font-size: large;">- <b>25 dolar </b>kaç lira <b>sterlin </b>{ entity--> miktar = 3 , kurFrom = dolar, kurTo = sterlin}</span></div>
<ul>
<li style="text-align: justify;"><span style="font-size: large;"><b>STORY: </b>Akış diye Türkçeye çevirebileceğimiz <i>story '</i>ler ise, kullanıcı tarafından girilen mesajların ilgili <i>intent</i>'ler ile eşleştirilmesi neticesinde, <i>bot</i>'un vereceği cevapları içeren sohbet yönergeleri diyebiliriz.</span></li>
</ul>
<span style="font-size: large;">Örnek bir akış; </span><br />
<div>
<span style="font-size: large;"> * havalar_nasil</span></div>
<div>
<span style="font-size: large;"> - hangi şehir için havayı sordun kardeş</span></div>
<div>
<span style="font-size: large;"> * sehir</span></div>
<div>
<span style="font-size: large;"> - action_hava</span></div>
<div>
<span style="font-size: large;"><br /></span></div>
<div>
<span style="font-size: large;">Yukarıdaki akışı incelersek;</span></div>
<div>
<br /></div>
<div style="text-align: left;">
<ul style="text-align: left;"><ol>
<li><span style="font-size: large;">kullanıcı bir cümle yazdı ve bu cümle <b>havalar_nasil</b> intent'i ile eşleşti.</span></li>
<li><span style="font-size: large;">bot ilgili akışı izleyerek "hangi şehir için havayı sordun kardeş" diye bir cevap döndü</span></li>
<li><span style="font-size: large;">Kullanıcı bir şehir girdi, girilen bu mesaj da yine bir <i>intent </i>ile eşleştirildi.</span></li>
<li><span style="font-size: large;">Şayet <i>sehir </i>isminde tanımlı olan <i>intent </i>ile eşleşirse, bot (rasa) <b>action_hava </b>diye bir kodu çalıştırdı.</span></li>
</ol>
</ul>
</div>
<div>
<ul>
<li style="text-align: justify;"><span style="font-size: large;"><b>TEMPLATE: </b>Bir önceki maddede akışları anlatırken, "hangi şehir için havayı sordun kardeş" diye bir cevap döndüğünden bahsettik. Bu tip cevaplar, <i>rasa </i>da akışlar içerisinde direkt olarak yazılmıyor. Bunun için ayrıca <i>template'</i>ler tanımlanıp, bu <i>template'</i>lerin isimleri akışların içerisine yazılmakta.</span></li>
</ul>
<ul>
<li style="text-align: justify;"><span style="font-size: large;"><b>ACTION: </b>Yine akışları anlatırken <i>action_hava </i>diye bir komut yazdık. Şayet sabit bir cevaptan ziyade, veri tabanından veya herhangi bir başka yerden bir sonuç alınıp kullanıcıya gönderilmek isteniyorsa, bu durumlarda <b>action </b>lar kullanılmakta. <i>Action aslında python ile yazılmış bir fonksiyon.</i></span></li>
</ul>
<div style="text-align: justify;">
<span style="font-size: large;"><i> </i>Konu ile alakalı en azından temel kavramlardan bahsettikten sonra, adım adım basit bir <i><u>rasa chatbot</u></i> örneği hazırlayalım. <b>Bknz: </b></span><span style="font-size: large;"><a href="https://rasa.com/docs/rasa/user-guide/rasa-tutorial/#create-a-new-project" target="_blank">https://rasa.com/docs/rasa/user-guide/rasa-tutorial/#create-a-new-project </a></span><br />
<br />
<span style="font-size: large;"><b><i><u>Kurulum</u></i></b></span><br />
<span style="font-size: large;">RASA'yı yüklemek son derece basit, <b>pip install rasa</b> komutu ile son derece kolay bir şekilde yükleyebilirsiniz. Kurulumdan sonra python kurulu olan klasördeki Scripts klasöründe (Anaconda için) rasa.exe dosyasını göreceksiniz. Bu exe dosyası aslında rasa modüllerini çalıştırmak için hazırlanmış bir uygulama, sizin bilgisayarınızdaki kurulum dosya yoluna göre ilgili python rasa modüllerini çağırmanızı sağlıyor. <b>rasa.exe</b> dosyasını kullanmadan da örneğin <i>python -m rasa train</i> yazarak, rasa ile train işlemi yapabiliriz. Ancak kaynak olarak verdiğim <i>tutorial</i>'de "<i>rasa train" </i>komutu ile bu işlem gerçekleştirilmekte.</span><br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><b><i><u>Proje oluşturma</u></i></b></span><br />
<span style="font-size: large;">Kurulumu tamamladıktan sonra, boş bir klasör açıp terminalden bu klasör altında <b>rasa init</b> komutunu yazınca, ilgili klasörde birçok dosyanın oluştuğunu göreceksiniz ve "hello word" niteliğinde bir <i>rasa chatbot</i> projesine sahip olmuş olacaksınız. </span><br />
<span style="font-size: large;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7QVcaSHAwKdml95W0VbGh_oye_3e81Bo-Ar9Vuovz2Li1mttdn-JYtlcf8IVkwlIeZBJJmNae_8RYU81hGFIMDg0xbgz_joD7ghnscMM45OKZ6MC5nq2_otbqEHwYl4IfVKbahzIXmOI/s1600/fig-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="236" data-original-width="636" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7QVcaSHAwKdml95W0VbGh_oye_3e81Bo-Ar9Vuovz2Li1mttdn-JYtlcf8IVkwlIeZBJJmNae_8RYU81hGFIMDg0xbgz_joD7ghnscMM45OKZ6MC5nq2_otbqEHwYl4IfVKbahzIXmOI/s640/fig-1.png" width="640" /></a></div>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">Bu dosyalardan bazılarını girişte anlattığım temel terimler ile eşleştirirsek;</span><br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><b>data/nlu.md </b> ---- <i>intent'</i>lerin ve <i>entity'</i>lerin yer alacağı dosya</span><br />
<span style="font-size: large;"><b>data/stories.md </b> ---- <i>story </i>(akış) lerin yer alacağı dosya</span><br />
<div style="text-align: left;">
<span style="font-size: large;"><b>domain.yml </b> -- chatbot projemizdeki tüm tanımların yapıldığı, sabit cevap (template) ların tanımlandığı dosya</span></div>
<span style="font-size: large;"><b>actions.py </b> ---- <i>action</i>' ların yazıldığı python dosyası</span><br />
<div>
<span style="font-size: large;"><br /></span></div>
<div>
<span style="font-size: large;">Bu dosyaların içeriğini şu şekilde güncelleyelim.</span></div>
<div>
<span style="font-size: large;"><br /></span></div>
<div>
<span style="color: red;"><span style="font-size: large;">************</span><span style="font-size: large;"> data/nlu.md ************</span></span></div>
<div>
<span style="color: purple; font-size: large;">## intent:merhaba</span><br />
<span style="color: purple; font-size: large;">- selam</span><br />
<span style="color: purple; font-size: large;">- selam aleykum</span><br />
<span style="color: purple; font-size: large;">- heyyy</span><br />
<span style="color: purple; font-size: large;">- naber</span><br />
<span style="color: purple; font-size: large;"><br /></span>
<span style="color: purple; font-size: large;">## intent:onay</span><br />
<span style="color: purple; font-size: large;">- evet</span><br />
<span style="color: purple; font-size: large;">- kesinlikle</span><br />
<span style="color: purple; font-size: large;">- tabiki</span><br />
<span style="color: purple; font-size: large;">- mantikli</span><br />
<span style="color: purple; font-size: large;">- ok</span><br />
<span style="color: purple; font-size: large;">- onayliyorum</span><br />
<span style="color: purple; font-size: large;">- uygun</span><br />
<span style="color: purple; font-size: large;"><br /></span>
<span style="color: purple; font-size: large;">## intent:reddet</span><br />
<span style="color: purple; font-size: large;">- hayir</span><br />
<span style="color: purple; font-size: large;">- asla</span><br />
<span style="color: purple; font-size: large;">- dogru degil</span><br />
<span style="color: purple; font-size: large;">- oyle dusunmuyorum</span><br />
<span style="color: purple; font-size: large;">- ilgilenmiyorum</span><br />
<span style="color: purple; font-size: large;"><br /></span>
<span style="color: purple; font-size: large;">## intent:soru</span><br />
<span style="color: purple; font-size: large;">- bir sorum var</span><br />
<span style="color: purple; font-size: large;">- bir sey sorucam</span><br />
<span style="color: purple; font-size: large;">- sorum var</span><br />
<span style="color: purple; font-size: large;">- birşey sorabilir miyim</span><br />
<br />
<span style="color: purple; font-size: large;">## intent:hakaret</span><br />
<span style="color: purple; font-size: large;">- seni gerizekali</span><br />
<span style="color: purple; font-size: large;">- gerizekalı</span><br />
<span style="color: purple; font-size: large;">- aptal</span><br />
<span style="color: purple; font-size: large;">- salak</span><br />
<span style="color: purple; font-size: large;">- öküz</span><br />
<span style="color: purple; font-size: large;"><br /></span>
<span style="color: purple; font-size: large;">## intent:kimsin</span><br />
<span style="color: purple; font-size: large;">- sen kimsin</span><br />
<span style="color: purple; font-size: large;">- kiminle gorusuyorum</span><br />
<span style="color: purple; font-size: large;">- adin ne</span><br />
<span style="color: purple; font-size: large;">- adin ne kardes</span><br />
<span style="color: purple; font-size: large;">- kimsin</span><br />
<span style="color: purple; font-size: large;">-</span><br />
<span style="color: purple; font-size: large;">## intent:iyiyim</span><br />
<span style="color: purple; font-size: large;">- mükemmel</span><br />
<span style="color: purple; font-size: large;">- çok iyi</span><br />
<span style="color: purple; font-size: large;">- super</span><br />
<span style="color: purple; font-size: large;">- çok iyiyim</span><br />
<span style="color: purple; font-size: large;">- idare eder</span><br />
<span style="color: purple; font-size: large;">- iyiyim ben de</span><br />
<span style="color: purple; font-size: large;">- iyiyim</span><br />
<span style="color: purple; font-size: large;">- ben de iyiyim</span><br />
<span style="color: purple; font-size: large;">- süperim</span><br />
<span style="color: purple; font-size: large;">- iyi hissediyorum</span><br />
<span style="color: purple; font-size: large;">- harikayım</span><br />
<span style="color: purple; font-size: large;"><br /></span>
<span style="color: purple; font-size: large;">## intent:kotuyum</span><br />
<span style="color: purple; font-size: large;">- kötü</span><br />
<span style="color: purple; font-size: large;">- üzgün</span><br />
<span style="color: purple; font-size: large;">- mutsuz</span><br />
<span style="color: purple; font-size: large;">- çok kötü</span><br />
<span style="color: purple; font-size: large;">- berbatım</span><br />
<span style="color: purple; font-size: large;">- korkunc</span><br />
<span style="color: purple; font-size: large;">- çok iyi değilim</span><br />
<span style="color: purple; font-size: large;">- iyi degilim</span><br />
<span style="color: purple; font-size: large;">- hic iyi degilim</span><br />
<span style="color: purple; font-size: large;">- moralim bozuk</span><br />
<span style="color: purple; font-size: large;"></span><br />
<span style="color: purple; font-size: large;">- kötüyüm</span></div>
<div>
<br /></div>
<div>
<span style="font-size: large;"><br /></span></div>
<div>
<span style="color: red;"><span style="font-size: large;">************</span><span style="font-size: large;"> data/stories.md ************</span></span></div>
<div>
<span style="color: purple; font-size: large;">## happy path</span><br />
<span style="color: purple; font-size: large;">* merhaba</span><br />
<span style="color: purple; font-size: large;"> - utter_merhaba</span><br />
<span style="color: purple; font-size: large;">* iyiyim</span><br />
<span style="color: purple; font-size: large;"> - utter_iyiyim</span><br />
<span style="color: purple; font-size: large;"><br /></span>
<span style="color: purple; font-size: large;">## sad path 1</span><br />
<span style="color: purple; font-size: large;">* merhaba</span><br />
<span style="color: purple; font-size: large;"> - utter_merhaba</span><br />
<span style="color: purple; font-size: large;">* kotuyum</span><br />
<span style="color: purple; font-size: large;"> - utter_kotuyum</span><br />
<span style="color: purple; font-size: large;"><br /></span>
<span style="color: purple; font-size: large;">## kimsin</span><br />
<span style="color: purple; font-size: large;">* kimsin</span><br />
<span style="color: purple; font-size: large;"> - utter_kimsin</span><br />
<span style="color: purple; font-size: large;"><br /></span>
<span style="color: purple; font-size: large;">* hakaret</span><br />
<span style="color: purple; font-size: large;"> - utter_hakaret</span></div>
<div>
<span style="font-size: large;"><br /></span></div>
<div>
<span style="color: red;"><span style="font-size: large;">************</span><span style="font-size: large;"> domain.yml ************</span></span></div>
<div>
<span style="color: purple; font-size: large;">intents:</span><br />
<span style="color: purple; font-size: large;"> - merhaba</span><br />
<span style="color: purple; font-size: large;"> - iyiyim</span><br />
<span style="color: purple; font-size: large;"> - kotuyum</span><br />
<span style="color: purple; font-size: large;"> - reddet</span><br />
<span style="color: purple; font-size: large;"> - soru</span><br />
<span style="color: purple; font-size: large;"> - hakaret</span><br />
<span style="color: purple; font-size: large;"> - kimsin</span><br />
<span style="color: purple; font-size: large;"><br /></span>
<span style="color: purple; font-size: large;">actions:</span><br />
<span style="color: purple; font-size: large;">- utter_merhaba</span><br />
<span style="color: purple; font-size: large;">- utter_iyiyim</span><br />
<span style="color: purple; font-size: large;">- utter_kotuyum</span><br />
<span style="color: purple; font-size: large;">- utter_kimsin</span><br />
<span style="color: purple; font-size: large;">- utter_hakaret</span><br />
<span style="color: purple; font-size: large;"><br /></span>
<span style="color: purple; font-size: large;">templates:</span><br />
<span style="color: purple; font-size: large;"> utter_merhaba:</span><br />
<span style="color: purple; font-size: large;"> - text: "Merhabalar, nasılsınız?"</span><br />
<span style="color: purple; font-size: large;"><br /></span>
<span style="color: purple; font-size: large;"> utter_iyiyim:</span><br />
<span style="color: purple; font-size: large;"> - text: "İyi olmanıza sevindim, size nasıl yardımcı olabilirim"</span><br />
<span style="color: purple; font-size: large;"><br /></span>
<span style="color: purple; font-size: large;"> utter_iyiyim:</span><br />
<span style="color: purple; font-size: large;"> - text: "Hayat üzülmek için çok kısa, Umarım hersey düzelir. Bana sorunuz var mı?"</span><br />
<span style="color: purple; font-size: large;"><br /></span>
<span style="color: purple; font-size: large;"> utter_kimsin:</span><br />
<span style="color: purple; font-size: large;"> - text: "Ben bir sanal asistanım, kiminle görüşüyorum"</span><br />
<span style="color: purple; font-size: large;"><br /></span>
<span style="color: purple; font-size: large;"> utter_hakaret:</span><br />
<span style="color: purple; font-size: large;"></span><br />
<span style="color: purple; font-size: large;"> - text: "Lütfen daha kibar olun!"</span></div>
<div>
<br /></div>
<div>
<span style="font-size: large;"><br /></span></div>
<div>
<span style="font-size: large;">Bu ve henüz bahsetmediğim (endpoints.yml, credentials.yml, config.yml) dosyalarını gördükten sonra ise tek yapacağımız şey şu komutu çalıştırmak;</span></div>
<div>
<span style="font-size: large;"><br /></span></div>
<div>
<span style="font-size: large;"><b>--> rasa train</b></span></div>
<div>
<span style="font-size: large;"><br /></span></div>
<div>
<span style="font-size: large;">Bu komutu çalıştırınca bir eğitim süreci başlamış olacak, eğitim işlemi bittiğinde ise <i>models </i>klasörü altında <i>.tar.gz</i> uzantılı bir dosyanın oluştuğunu göreceksiniz. Eğittiğimiz bot ile konuşmak için <b>rasa shell</b> komutunu çalıştırmamız kafi.</span><br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><i style="background-color: #fefdfa; color: #333333; font-family: "courier new", courier, monospace; font-size: large; text-align: left;">Her türlü görüş, öneri ve sorularınızı İletişim sayfası aracılığıyla iletebilirsiniz...</i></span></div>
</div>
</div>
</div>
İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com2tag:blogger.com,1999:blog-2739106657175580544.post-78817107774313393112019-07-01T03:50:00.000-07:002019-07-01T03:50:02.292-07:00Topshelf nedir ve "Hello World" örneği<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
<span style="font-size: large;"><a href="http://topshelf-project.com/" target="_blank">Topshelf</a> windows üzerinde servis olarak çalışabilecek uygulamalar geliştirmeye imkan sağlayan bir kütüphanedir. Servisler bilindiği gibi işletim sistemde arka planda uzun süreli çalışan uygulamalardır ve konfigürasyona bağlı olarak işletim sistemi başlatıldığında otomatik olarak çalışmaya başlayabilirler.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"></span></div>
<a name='more'></a><br />
<div style="text-align: justify;">
<span style="font-size: large;">Bu yazı kapsamında basit bir örnek konsol uygulamasının <b>topshelf</b> kullanılarak servis olarak çalıştırılması sağlanacaktır. İlk olarak Nuget paket yöneticisi üzerinden topshelf kütüphanesi projeye eklenmelidir.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2MfpJ4fDQd89oXxrPHVcRVsZjuENb-8wJGpvZnDR0h6Y6Ydo-oQBH4OeyzUHRHJWsbcfLMu0vG4pCtSN_WPRFVGOcZ3RezAHNEgfTBGTNQtJZmR2S7d-BGfHtTrJjtlMR2HEUpGYmepY/s1600/nuget+topshelf.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="456" data-original-width="1024" height="142" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2MfpJ4fDQd89oXxrPHVcRVsZjuENb-8wJGpvZnDR0h6Y6Ydo-oQBH4OeyzUHRHJWsbcfLMu0vG4pCtSN_WPRFVGOcZ3RezAHNEgfTBGTNQtJZmR2S7d-BGfHtTrJjtlMR2HEUpGYmepY/s320/nuget+topshelf.PNG" width="320" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: large;">Bir konsol uygulama oluşturup, <i>topshelf</i>'i projemize ekledikten sonra ilk olarak Servis olarak çalışacak bir sınıf tanımlıyoruz. Bu sınıfta bir serviste bulunması gereken <i><b>start </b></i>ve <i><b>stop </b></i>metodları mevcut.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5J9dkhWOZRSyvuhy6zqQgO0n5qte7abPfDXX7_M8VnSIFPU4pOEg4zE0vrSy1SRm7jlh43-o7wjwg-qfHJKBFq2j422VTUKKBLLv-WOWjEtbk7R1v8yVk3HEuHob5igRUFvDpq-v6Ofo/s1600/MyService.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="529" data-original-width="843" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5J9dkhWOZRSyvuhy6zqQgO0n5qte7abPfDXX7_M8VnSIFPU4pOEg4zE0vrSy1SRm7jlh43-o7wjwg-qfHJKBFq2j422VTUKKBLLv-WOWjEtbk7R1v8yVk3HEuHob5igRUFvDpq-v6Ofo/s640/MyService.PNG" width="640" /></a></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Servis sınıfımızı tanımladıktan sonra, bu sınıfı <b>topshelf</b> projesini kullanarak <i>konfigure </i>edecek <i>ConfigureService </i>adında bir sınıf tanımlıyoruz. Servis başlatıldığında/durdurulduğunda çağrılacak metodları ve servis adı,açıklaması gibi bilgileri burada belirtiyoruz.</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZfnh-Ak35idZsv5gMv9WyMT-i-WEJ3k9fKfcpZ_Wn7MqGlhpEnZ7evk2beAnQP9lgLheTMVWKjDdWVk9PrCXpJlyKqdzA286E-cvIHFprhyphenhyphenvZmwA8xCuo1cP8dTo3ajnbZBblZkDK6bA/s1600/Configure.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="532" data-original-width="841" height="404" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZfnh-Ak35idZsv5gMv9WyMT-i-WEJ3k9fKfcpZ_Wn7MqGlhpEnZ7evk2beAnQP9lgLheTMVWKjDdWVk9PrCXpJlyKqdzA286E-cvIHFprhyphenhyphenvZmwA8xCuo1cP8dTo3ajnbZBblZkDK6bA/s640/Configure.PNG" width="640" /></a></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Main içerisinde tek yaptığımız <i>ConfigureMyService.Configure </i>metodunu çağırmak.</span></div>
<div style="text-align: justify;">
<br /></div>
<pre style="border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 653px;">class Program
{
static void Main(string[] args)
{
ConfigureMyService.Configure();
}
}
</pre>
<div style="text-align: left;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: large;">Uygulamayı <i>build </i>ettiğimizde, uygulama çıktısı (</span><span style="text-align: left;"><span style="font-size: large;"><b>proje-adi.exe) </b>oluşuyor. Bu uygulamayı servis olarak kaydetmemiz için tek yapmamız gereken, <i>admin</i> olarak açtığımız terminalde;</span></span></div>
<div style="text-align: justify;">
<span style="text-align: left;"><span style="font-size: large;">" <b><i>ConsoleApp1.exe install</i></b> " komutunu girmek. (servisi kaldırmak için de hakeza <i>uninstall </i>komutunu kullanacağız)</span></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgabArHDeVqvuRukfA02gpPKWjk56tonWhNxvOZDWF3S5Cdjj2DiJb4LITumhBDAZg4tkVY3XA-CaCdAKzI_AlVLX1I9TdJlgo4QGpMKtfHSU04-Mowx3JszukW7kcoqZrlkqKBDRzxw2A/s1600/create+servis.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="391" data-original-width="946" height="264" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgabArHDeVqvuRukfA02gpPKWjk56tonWhNxvOZDWF3S5Cdjj2DiJb4LITumhBDAZg4tkVY3XA-CaCdAKzI_AlVLX1I9TdJlgo4QGpMKtfHSU04-Mowx3JszukW7kcoqZrlkqKBDRzxw2A/s640/create+servis.PNG" width="640" /></a></div>
<div style="text-align: justify;">
<span style="text-align: left;"><span style="font-size: large;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="text-align: left;"><span style="font-size: large;">Uygulamamız artık servis olarak çalışmaya başladı, makinemizde çalışan servislere göz atarsak;</span></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_NmBMsR3mzg7rvwg3fqJKlG6Na3ZFZYzkd1MxrVsCMu15Kaq2bacZ_MMlKX2XOMfDJc-tx3KAlPcr67B9x2UBLPy3sJGWEF7al1YXrh0a5_XOCi_xI3xBIKqchmxyZ1-hifQDbv84iUU/s1600/servis+MyServis.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="94" data-original-width="644" height="57" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_NmBMsR3mzg7rvwg3fqJKlG6Na3ZFZYzkd1MxrVsCMu15Kaq2bacZ_MMlKX2XOMfDJc-tx3KAlPcr67B9x2UBLPy3sJGWEF7al1YXrh0a5_XOCi_xI3xBIKqchmxyZ1-hifQDbv84iUU/s400/servis+MyServis.PNG" width="400" /></a></div>
<div style="text-align: justify;">
<span style="text-align: left;"><span style="font-size: large;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Böylece <i>Topshelf </i>kullanarak hızlı ve basit bir şekilde servis uygulaması yazmış olduk.</span></div>
<div style="text-align: justify;">
<span style="text-align: left;"><span style="font-size: large;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
</div>
İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com2tag:blogger.com,1999:blog-2739106657175580544.post-33890119210456905482019-07-01T02:16:00.004-07:002019-07-01T02:16:41.415-07:00Nancy nedir ve "hello world" örneği! <div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><a href="http://nancyfx.org/" target="_blank">Nancy </a> .NET ve Mono ile http tabanlı servisler oluşturmak için geliştirilmiş bir <i>framework</i>'tür. Visual studio ile </span><span style="font-size: large;">Nuget paket yöneticisi kullanılarak kolayca projeye eklenebilir. </span><br />
<span style="font-size: large;"></span><br />
<a name='more'></a><br /><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlsukpeksGWXpv5_dyA3EgitTgOXi6367pB8Ln0wrSZm1p30vA1pw2YpcYFNVGhLjq3sgkNzVfS9OBM-9id24-9u0pJq95wF9YmJeH-KCq0Gmre45TupI-ZggsBLoSxEuJizYoEehoCiM/s1600/nancy+nuget.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="372" data-original-width="670" height="354" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlsukpeksGWXpv5_dyA3EgitTgOXi6367pB8Ln0wrSZm1p30vA1pw2YpcYFNVGhLjq3sgkNzVfS9OBM-9id24-9u0pJq95wF9YmJeH-KCq0Gmre45TupI-ZggsBLoSxEuJizYoEehoCiM/s640/nancy+nuget.PNG" width="640" /></a></div>
<span style="font-size: large;"><br /></span>
( <b>Not:</b> Nancy kurulumuna ek olarak , Nancy.Hosting ve Nancy.Viewengines.razor (html işlemleri için) kurulumu da yapmalıyız. )<br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">2525 portunu dinleyen ve http Get isteğine cevap veren basit bir örnek şu şekildedir;</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZoOZmEohyphenhyphenPOpj7WV9TBGachXgVV2lpEhRZyexqPYaNRIfavEN1V9m1sCDlNo9fW24iOuqBQ1JDfLS9quPorc9e58_W66ppMgR8i0BghUxnMDndWsuDCHgXwVXnKMsvINlbQX8JkMNGxU/s1600/ornek.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="468" data-original-width="636" height="470" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZoOZmEohyphenhyphenPOpj7WV9TBGachXgVV2lpEhRZyexqPYaNRIfavEN1V9m1sCDlNo9fW24iOuqBQ1JDfLS9quPorc9e58_W66ppMgR8i0BghUxnMDndWsuDCHgXwVXnKMsvINlbQX8JkMNGxU/s640/ornek.PNG" width="640" /></a></div>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><b>NancyModule</b> sınıfından türetilen <i>SampleModule</i> içerisinde Get metodunda ne yapılacağı tanımlanmıştır. Uygulamayı çalıştırdığımızda ve postman uygulaması ile bir istek gönderdiğimizde alınan cevap</span><img alt="👇" aria-label="Emoji: Aşağıyı işaret etmek" class="Emoji Emoji--forText" draggable="false" src="https://abs.twimg.com/emoji/v2/72x72/1f447.png" style="background-color: #15202b; border: 0px; color: white; font-family: "Segoe UI", Arial, sans-serif; font-size: 14px; height: 1.25em; padding: 0px 0.05em 0px 0.1em; vertical-align: -0.2em; white-space: pre-wrap; width: 1.25em;" title="Aşağıyı işaret etmek" /><br />
<span style="font-size: large;"><br /></span>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN04zt1xP1HC2G8ISBxHzL9TwZtwaUxgy4M9_6_O8IvMXzPeqbrlWhZM4Vd27juhlhINtcuo9CFzrjaaSTp1zQ7oUoRQUGHM1ErQcQUwhXZpVWHHGisgH0Hc_VvzJC3CkdAiM2qg_t7VI/s1600/ornek+%25C3%25A7%25C4%25B1kt%25C4%25B1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="578" data-original-width="995" height="370" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN04zt1xP1HC2G8ISBxHzL9TwZtwaUxgy4M9_6_O8IvMXzPeqbrlWhZM4Vd27juhlhINtcuo9CFzrjaaSTp1zQ7oUoRQUGHM1ErQcQUwhXZpVWHHGisgH0Hc_VvzJC3CkdAiM2qg_t7VI/s640/ornek+%25C3%25A7%25C4%25B1kt%25C4%25B1.PNG" width="640" /></a></div>
<span style="font-size: large;"><br /></span>
<br /></div>
İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com0tag:blogger.com,1999:blog-2739106657175580544.post-44292645042234914352019-02-28T04:45:00.000-08:002019-02-28T04:47:03.502-08:00C++ : inheriting constructor - lambda - bind function - variant -clamp<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div>
<span style="font-size: large;">C++ örnekler;</span></div>
<ul style="text-align: left;">
<li><span style="font-size: large;">inheriting constructor</span></li>
<li><span style="font-size: large;">lambda expressions</span></li>
<li><span style="font-size: large;">std::bind</span></li>
<li><span style="font-size: large;">std::variant (C++17)</span></li>
<li><span style="font-size: large;">std::clamp (C++17)<a name='more'></a></span></li>
</ul>
<br />
<span style="font-size: large;"><u><i><b>inheriting constructor</b></i></u></span><br />
<span style="font-size: large;">Bu örnekte yapıcı metodu kalıtım ile aktarmayı göreceksiniz. </span><br />
<span style="font-size: large;"><span style="color: #0b5394;">using </span><span style="color: lime;">A</span>::A; komutu ile temel sınıf olan A'nın parametre almayan ve tek parametre alan yapıcı metodlarını kalıtım ile B'ye aktarmış olduk.</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG1JD-DYM8K7bL-7bPcxyy8UJWCUiuva86z4Orq2tSxg6bt0dAI3L0dGYJvpupLDR3j-mQ5zqJRRVvXULm8I4vGyxIBn504P0wxmZ_c8SKnpEHQdf9brUOr_LMxJ1NTwK7GujUieGubYw/s1600/inheriting+constructor.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="409" data-original-width="365" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG1JD-DYM8K7bL-7bPcxyy8UJWCUiuva86z4Orq2tSxg6bt0dAI3L0dGYJvpupLDR3j-mQ5zqJRRVvXULm8I4vGyxIBn504P0wxmZ_c8SKnpEHQdf9brUOr_LMxJ1NTwK7GujUieGubYw/s320/inheriting+constructor.PNG" width="285" /></a></div>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><u><i><b>lambda expressions</b></i></u></span><br />
<span style="font-size: large;">C++11 itibariyle eklenmiş lambda ifadelerinde genel syntax şu şekilde;</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXmyitp6DFiBt7cnP0tQ7ceuoGL_VRAtz-0EAgYnF9UGJUYgky5U4s8vB-2omMe_xwJjZH52XFJ3K7ZI30Se9_pfWBwrBtBXHh863hyUxwftOLuFzOmblgyXznpvXVDO6gRmGlYziWNpc/s1600/lambda.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="98" data-original-width="304" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXmyitp6DFiBt7cnP0tQ7ceuoGL_VRAtz-0EAgYnF9UGJUYgky5U4s8vB-2omMe_xwJjZH52XFJ3K7ZI30Se9_pfWBwrBtBXHh863hyUxwftOLuFzOmblgyXznpvXVDO6gRmGlYziWNpc/s1600/lambda.PNG" /></a></div>
<span style="font-size: large;">Tek bir parametre alan ve aldığı değerin karesini dönen bir lambda fonksiyon örneği (</span><i>geri dönüş tipi opsiyonel</i><span style="font-size: large;">);</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq8fKs_0WMssqgnluKftuJ8mvl1UfoR6Y8yrIgVqiPfKAuka_EmmebT_5BGeyXnDodaAZmm6g6hMjBWtT3013mrU2IUlfg-HGu1pb4ZdPPxrwQXQIBl7idHtLN1xjKAlflFdig2dSAsa0/s1600/lambda-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="315" data-original-width="969" height="208" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq8fKs_0WMssqgnluKftuJ8mvl1UfoR6Y8yrIgVqiPfKAuka_EmmebT_5BGeyXnDodaAZmm6g6hMjBWtT3013mrU2IUlfg-HGu1pb4ZdPPxrwQXQIBl7idHtLN1xjKAlflFdig2dSAsa0/s640/lambda-1.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<span style="font-size: large;">Capture list seçenekleri ile lambda kapsamı içerisindeki değerlerin geri alınabilmesi sağlanabilir. (</span><i>bknz: call by reference</i><span style="font-size: large;">)</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-QD2pbUy6k43ktXdYOWV_QHbSbQgOyC8IDqErS3ALocyACKYLHCj2kbt7Hi-ONK4JGl4SrsVVEGAb4zfSY5akIRhyvfeIussu5AAXSNrj5dpBEZie_u9uOH0uqqTk5qHKUiQptkb253s/s1600/lambda-capturelist.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="120" data-original-width="466" height="163" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-QD2pbUy6k43ktXdYOWV_QHbSbQgOyC8IDqErS3ALocyACKYLHCj2kbt7Hi-ONK4JGl4SrsVVEGAb4zfSY5akIRhyvfeIussu5AAXSNrj5dpBEZie_u9uOH0uqqTk5qHKUiQptkb253s/s640/lambda-capturelist.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJA8Tkjwi8byQLxxrMt3HUpeN1vSSoD_Gvm4aumGbcCo2-1yUTVjdTteVtwy1E5drJF0sdZKWgSaSTNqKuPs6Kr3w8HjajAsHTjsK0xsdloQEVbTelDIzcn16p20vgxjw5JEzBEQsOHm4/s1600/lambda-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="461" data-original-width="758" height="388" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJA8Tkjwi8byQLxxrMt3HUpeN1vSSoD_Gvm4aumGbcCo2-1yUTVjdTteVtwy1E5drJF0sdZKWgSaSTNqKuPs6Kr3w8HjajAsHTjsK0xsdloQEVbTelDIzcn16p20vgxjw5JEzBEQsOHm4/s640/lambda-2.png" width="640" /></a></div>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><b><i><u>std::bind function</u></i></b></span><br />
<div style="text-align: justify;">
<span style="font-size: large;"><i>std::bind</i> bir <i>template </i>fonksiyondur ve bir fonksiyonun parametrelerine <i>binding </i>işlemi yapmaya olanak sağlar. Aşağıdaki örnekte iki parametre alan <i>print </i>fonksiyonunun ilk parametre değerine 25 değeri verilerek yeni bir <i>f</i> fonksiyonu tanımlanmıştır. Artık bu <i>f </i>fonksiyonu sadece bir parametre ile çağrılabilir. </span></div>
<div style="text-align: left;">
<span style="font-family: "courier new" , "courier" , monospace;"><i>(Not: std:bind için <b><u>header </u></b>-> #include <functional> )</i></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeBXQRNtMVzhVr4Sd0BMBmUKyJ0pxysGC_CkpuDJTqeEs7fGxLvD0FjZDHuDCqXidfw5XBRCm5C05oug1zVYFiymp31jGcaNvDE4PoikYMJOtg4kSEwCttcXOjC3fnYznKtRI_wxuBuPE/s1600/binding.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="444" data-original-width="535" height="530" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeBXQRNtMVzhVr4Sd0BMBmUKyJ0pxysGC_CkpuDJTqeEs7fGxLvD0FjZDHuDCqXidfw5XBRCm5C05oug1zVYFiymp31jGcaNvDE4PoikYMJOtg4kSEwCttcXOjC3fnYznKtRI_wxuBuPE/s640/binding.png" width="640" /></a></div>
<div style="text-align: left;">
<span style="font-size: large; text-align: justify;">25 değerini 2. parametreye bağlamak için;</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU8-adzIbUWNSrX-8EiFDDDzEeNnlzXc0UuzfATs2yFc7Fv-enFTKWNVNgN_fn-UL2fDTEiVRfS3p1Xz2AmqsxxRAbKG8sR2TKXor4xvyYDdE4XUZKRcxDzxxieQ3RxJOxT_Ta6XBmLPM/s1600/binding.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="392" data-original-width="510" height="490" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU8-adzIbUWNSrX-8EiFDDDzEeNnlzXc0UuzfATs2yFc7Fv-enFTKWNVNgN_fn-UL2fDTEiVRfS3p1Xz2AmqsxxRAbKG8sR2TKXor4xvyYDdE4XUZKRcxDzxxieQ3RxJOxT_Ta6XBmLPM/s640/binding.png" width="640" /></a></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<span style="font-size: large; text-align: justify;">Hakeza fonksiyon parametrelerinin yerlerinin değiştirilmiş halini bir başka fonksiyona <i>bind </i>edebiliriz.</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTfqViagLw6nhduqlqHAAs441nYsKD2TndKXB8c-BFjQH2kkXtWVQGMnwecWG1PIiJb07U6tJQI2qPciRNYzvlGocutU5z9DqWqIJjGvAjU8p1thEdyN4K7XW2B7zaximwurZ1Eh9pNMg/s1600/binding.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="426" data-original-width="664" height="410" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTfqViagLw6nhduqlqHAAs441nYsKD2TndKXB8c-BFjQH2kkXtWVQGMnwecWG1PIiJb07U6tJQI2qPciRNYzvlGocutU5z9DqWqIJjGvAjU8p1thEdyN4K7XW2B7zaximwurZ1Eh9pNMg/s640/binding.png" width="640" /></a></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<span style="font-size: large;"><b><i><u>std::variant</u></i></b></span></div>
<div style="text-align: left;">
<span style="font-size: large;"><i>variant </i>C++17 itibariyle eklenmiş , daha önceden kullanılan <a href="https://en.cppreference.com/w/cpp/language/union" target="_blank">union </a>'un <i>type-safe</i> halidir. <i>variant </i>ile <i>union</i>'un aksine hangi tipte değer saklandığı bilinebilir, yanlış elemana erişilmek istenirse hata alınır. İstenen değere index veya değişken tipi ile erişilebilir.</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiYM0sZRrwxVNknZnNhbdzd3NWayzMOMaSIAO1xaYDIEqkGyfqoWcSQSQgrZZeJ23PLQZE5L3yhMfJhCpr-e4gdCBmAC43hnU1TqLQI2k1XCcYcc5zAzlrQk1RZztFCOOP8GEp2yJdWQs/s1600/variant.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="181" data-original-width="434" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiYM0sZRrwxVNknZnNhbdzd3NWayzMOMaSIAO1xaYDIEqkGyfqoWcSQSQgrZZeJ23PLQZE5L3yhMfJhCpr-e4gdCBmAC43hnU1TqLQI2k1XCcYcc5zAzlrQk1RZztFCOOP8GEp2yJdWQs/s640/variant.png" width="640" /></a></div>
<div style="text-align: left;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: left;">
<span style="font-size: large;">variant tipindeki değişken tek bir değer içerebileceği için, <i>index </i>numarasına göre kontrol ederek ilgili elemana ulaşabiliriz. Aşağıdaki örnekte '<i>int 25'</i> değerine erişmek istersek hata alırız, çünkü <i>variant </i>ile <i>union </i>gibi sadece bir değer saklanır.</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifA0oo5fbzlcWq4BxldCk7wktLg8EbAC2rWkIj562Ug4tLamQwKTUHdaMN3O1uAQufZNa6iXBjedJpszYwNW3zQCBljg3KY2ME_mzmk9qslQhwO9yPhg_o4lNuir62JX70YM4rZ9_o97g/s1600/variant.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="342" data-original-width="625" height="350" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifA0oo5fbzlcWq4BxldCk7wktLg8EbAC2rWkIj562Ug4tLamQwKTUHdaMN3O1uAQufZNa6iXBjedJpszYwNW3zQCBljg3KY2ME_mzmk9qslQhwO9yPhg_o4lNuir62JX70YM4rZ9_o97g/s640/variant.png" width="640" /></a></div>
<div style="text-align: left;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: left;">
<span style="font-size: large;"><br /></span></div>
<span style="font-size: large;"><b><i><u>std::clamp</u></i></b></span><br />
<span style="font-size: large;">clamp c++17 itibariyle eklenmiş bir fonksiyondur ve verilen bir değeri belirtilen <i>min. </i>ve<i> max.</i> değerler arasında tutmaya yarar.</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEH37LsBLXboAcfM1HYslBXyLEmpGJswCjGUCwsbGI4T3sFn-QngDQ8Uf47sRFv04nhRpnPD4vnHRCWt3sL0WAHc3uze6QLmhgq7qBAqtYSOZ9hfaB0Url-iFiZ_898UccDLoBmgoT_14/s1600/clamp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="354" data-original-width="402" height="351" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEH37LsBLXboAcfM1HYslBXyLEmpGJswCjGUCwsbGI4T3sFn-QngDQ8Uf47sRFv04nhRpnPD4vnHRCWt3sL0WAHc3uze6QLmhgq7qBAqtYSOZ9hfaB0Url-iFiZ_898UccDLoBmgoT_14/s400/clamp.png" width="400" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div style="text-align: left;">
<i style="background-color: #fefdfa; color: #333333; font-family: "courier new", courier, monospace; font-size: large;">Her türlü görüş, öneri ve sorularınızı İletişim sayfası aracılığıyla iletebilirsiniz...</i></div>
<div style="text-align: left;">
<i style="background-color: #fefdfa; color: #333333; font-family: "courier new", courier, monospace; font-size: large;"><br /></i></div>
<div style="text-align: left;">
<span style="font-size: large;"><u><i><b><br /></b></i></u></span></div>
</div>
İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com0tag:blogger.com,1999:blog-2739106657175580544.post-9527607478317909502019-02-26T06:45:00.000-08:002019-02-28T03:39:57.644-08:00C++17 std::optional kullanımı<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
<span style="font-size: large;"><b>std::optional C++17 </b>ile eklenmiş yeni bir tiptir. std::optional<b> </b> kullanarak, bir değer içeren veya null (geçerli değer içermeyen) değere sahip değişkenler tanımlayabilirsiniz. Yani özünde bir değer ve bir değer içerip/içermediğini ifade eden bir <b><i>flag </i></b>barındıran bir değişken tanımlayabiliriz. Bu özellik c++ için yaygın kullanılan boost kütüphanesinde zaten uzun yıllardır mevcut idi(</span><span style="color: #222222; font-family: monospace; font-size: 15.4px; text-align: justify;"><a href="https://www.boost.org/doc/libs/1_65_1/libs/optional/doc/html/index.html" target="_blank">boost::optional</a></span><span style="font-size: large;">). Bu yazı kapsamında C++ ile optional kullanımına dair bir örnek paylaşılmıştır.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"></span></div>
<a name='more'></a><br />
<br />
<div style="text-align: justify;">
<span style="font-size: large;">İlk olarak değinmek istediğim nokta şu; eğer Visual Studio ile std::optional'ı kullanmaya çalıştığınızda C++17 aktif değil dolayısıyla std::optional tanımlı değil diye bir uyarı alırsanız, yapmanız gereken ayar şu. (</span><span style="font-size: medium;"><i><u><b>Additional options'a</b></u></i></span><span style="font-size: large;"> </span><span style="background-color: #eff0f1; color: #242729; font-family: "consolas" , "menlo" , "monaco" , "lucida console" , "liberation mono" , "dejavu sans mono" , "bitstream vera sans mono" , "courier new" , monospace , sans-serif; text-align: left; white-space: pre-wrap;">c++latest</span><span style="background-color: #eff0f1; color: #242729; font-family: "consolas" , "menlo" , "monaco" , "lucida console" , "liberation mono" , "dejavu sans mono" , "bitstream vera sans mono" , "courier new" , monospace , sans-serif; font-size: 13px; text-align: left; white-space: pre-wrap;"> </span>yazarak da en son versiyonu aktif edebilirsiniz<span style="font-size: large;">)</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiujkQgsLBET2qHaXH9JFn4zGkeVW_3dEXVtHy4lfC85KAedBS2c5hDuCTnFzsbFYlvgN_pzJYYeG3mcL7_NhkG6uNk08zNXMdb2PfD6wVH6lHTcI5IE4zyPOtDZYIwI-7Rprpk2OG_uc/s1600/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="557" data-original-width="835" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiujkQgsLBET2qHaXH9JFn4zGkeVW_3dEXVtHy4lfC85KAedBS2c5hDuCTnFzsbFYlvgN_pzJYYeG3mcL7_NhkG6uNk08zNXMdb2PfD6wVH6lHTcI5IE4zyPOtDZYIwI-7Rprpk2OG_uc/s640/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" width="640" /></a></div>
<br />
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<h3>
<span style="font-size: large;"><b>Hangi durumlarda std::optional kullanalım?</b></span></h3>
<span style="font-size: large;">std::optional tipini kullanarak geçersiz bir değere sahip olabilecek bir değişkeni <i>nullptr </i>ya da <i>-1,0</i> gibi spesifik değerler ile ifade etme zorunluluğunu ortadan kaldırabilirsiniz. Veya bir değer hesaplayıp dönen bir fonksiyon içerisinde hata alınması durumunda, geriye boş değer döndürebilirsiniz. Gerçekleştireceğimiz örnek de bu kapsamda basit bir uygulama olacak. <b>str_to_int </b>isminde <b><i>string </i></b>bir parametre alıp bunu <i><b>int </b></i>değere dönüştüren basit bir fonksiyon yazacağız. Bu fonksiyon eğer dönüştürme işlemini başaramazsa, geri dönülen std::optional<int> tipindeki değişkenin <b><i>flag </i></b>değerini kontrol ederek, işlem sonucunu ekranda görüntüleyeceğiz. Bu amaçla yazdığımız 2 method aşağıda paylaşılmıştır.</span></div>
<div style="text-align: justify;">
<br />
<span style="font-size: large;"></span><br />
<div style="text-align: left;">
<div style="text-align: justify;">
<div style="text-align: justify; text-indent: 0px;">
<pre style="border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; text-align: left; width: 653px;">#include <string>
#include <cctype>
#include <iostream>
#include <optional>
bool is_number(const std::string& s)
{
std::string::const_iterator it = s.begin();
while (it != s.end() && std::isdigit(*it)) ++it;
return !s.empty() && it == s.end();
}
std::optional<int> str_to_int(std::string str) {
if (is_number(str)) {
int x = std::stoi(str);
return std::optional<int>(x);
}
return {};
}
</pre>
<div style="text-align: left;">
<br /></div>
</div>
</div>
</div>
<span style="font-size: large;">Eğer <b>str_to_int </b>fonksiyonuna gönderilen değer <i>int </i>değere dönüştürülebiliyorsa, ekranda <i>int </i>değeri görmek istiyoruz. Eğer işlem başarısız ise ekranda "return null" uyarısı verebiliriz.</span><br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"></span><br />
<pre style="border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; text-align: left; width: 653px;">int main()
{
std::optional<int> opt = str_to_int("25");
if (opt.has_value())
std::cout << "str_to_int(25) returned "<< opt.value() << '\n';
else
std::cout << "str_to_int(25) return null " << '\n';
opt = str_to_int("x25");
if (opt.has_value())
std::cout << "str_to_int(x25) returned " << opt.value() << '\n';
else
std::cout << "str_to_int(x25) return null " << '\n';
return 0;
}</pre>
</div>
<div style="text-align: justify;">
<span style="font-size: large;"><u>Ekran çıktısı</u></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEig1xZoLNq25n8LjOL-jgwqCqdNJUyx91Q8HKjUaFzbOmDfzi7wH-OfodL9q0unfPDvwgvGhJKvxwjh0OoNRSh0TyDZus7RAFEQc_4jcW1tSz-5m5hTLUJT7xzw7ffsOONaSThKDrnKAmo/s1600/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="73" data-original-width="262" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEig1xZoLNq25n8LjOL-jgwqCqdNJUyx91Q8HKjUaFzbOmDfzi7wH-OfodL9q0unfPDvwgvGhJKvxwjh0OoNRSh0TyDZus7RAFEQc_4jcW1tSz-5m5hTLUJT7xzw7ffsOONaSThKDrnKAmo/s1600/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" /></a></div>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">Bu örnekte optional kullanarak değişkenin geçerli bir değer içerip içermediğini, değişkenin değeri ile birlikte fonksiyondan geri almış olduk. </span><span style="font-size: large;">Örneği incelerseniz, optional tipi için bahsettiğimiz flag değerini has_value() metodu ile kontrol etiğimizi göreceksiniz. Eğer bu kontrolü yapmazsak, "x25" değeri için </span><b style="font-size: x-large;"><u><i>std::bad_optional_access</i></u></b><span style="font-size: large;"> hatası alırız. </span><br />
<br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><i style="background-color: #fefdfa; color: #333333; font-family: "courier new", courier, monospace; font-size: large; text-align: left;">Her türlü görüş, öneri ve sorularınızı İletişim sayfası aracılığıyla iletebilirsiniz...</i></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
</div>
İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com0tag:blogger.com,1999:blog-2739106657175580544.post-5780083904124167872019-01-15T10:50:00.002-08:002019-01-15T10:50:38.353-08:00Docker container klasör paylaşımı<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
<span style="font-size: large;"><i>Docker container </i>içerisinde çalışan bir uygulamanın bilgisayarımızdaki verilere ulaşmasını isteyebiliriz. Bu durumda izole bir ortam olan docker container ile makinemizdeki bir dizini bağlayıp, ortak bir klasör olarak kullanabiliriz.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"></span></div>
<a name='more'></a><span style="font-size: large;"><br /></span>
<div style="text-align: justify;">
<span style="font-size: large;">Bir <a href="http://ibrahimdelibasoglu.blogspot.com/2019/01/docker-ile-opencv-uygulamas-giris.html" target="_blank">önceki yazımızda</a> docker <i>container </i>üzerinde basit bir python + opencv uygulaması çalıştırılmasına dair bir örnek gerçekleştirmiştim. Bu yazı kapsamında ise, container ile windows bilgisayarımız arasında klasör paylaşımını anlatacağım.</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: large;">İlk yazımda docker kurulumundan hiç bahsetmedim. Kısaca değinmek gerekirse; docker linux kernel kullandığı için, <i>docker engine</i> windows üzerinde çalışmamakta. Bu sebeple docker'ı windows makinede kullanabilmek için <a href="https://docs.docker.com/toolbox/toolbox_install_windows/" target="_blank">docker toolbox</a> kurmamız gerekiyor. Docker toolbox ile birlikte de makinemize <i>Oracle VM VirtualBox</i> kurulmuş oluyor. Böylece <i>docker engine</i>, bu sanal makine üzerinde çalışmış oluyor.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Klasör paylaşımı için sanal makineyi açıp, <i><u>Ayarlar-Paylaşılan Klasörler</u></i> sekmesinden klasör yolunu belirtmemiz gerekiyor. Bu işlemi yaptıktan sonra, sanal makineyi kapatıp açmak gerekebilir.</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirIIpjcBl3gKtMRyoNsI2NrEyjwbKcMKRyr9D4ZDJEKsquLRQkXtu4IzjHSOYhG47CDj6UIUANZjcuj6_-I4WlqF2qpfS_9m0smita7hUWqW7i8tmqN0v72tIP45Qh6sVijC5NWhyVH3Q/s1600/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="564" data-original-width="891" height="405" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirIIpjcBl3gKtMRyoNsI2NrEyjwbKcMKRyr9D4ZDJEKsquLRQkXtu4IzjHSOYhG47CDj6UIUANZjcuj6_-I4WlqF2qpfS_9m0smita7hUWqW7i8tmqN0v72tIP45Qh6sVijC5NWhyVH3Q/s640/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" width="640" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: large;">Örneğin; D dizininde docker ismindeki bir klasörü paylaşılan klasörlere ekliyorum. Klasör adı: <b>d/docker</b> olarak giriyoruz.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Ardından container oluştururken </span><span style="font-size: large; text-align: left;"><b>-v host-path:container-path</b> komutu ile dizinleri birbirine bağlıyoruz</span><span style="font-size: large;">;</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; color: #24292e; line-height: 1.45; margin-bottom: 16px; overflow-wrap: normal; overflow: auto; padding: 16px;"><span style="font-size: large;">docker run <b>-v /d/docker:/home</b> -it jjanzic/docker-python3-opencv bash</span></pre>
<div style="text-align: justify;">
<span style="font-size: large;">Böylece bir <a href="http://ibrahimdelibasoglu.blogspot.com/2019/01/docker-ile-opencv-uygulamas-giris.html" target="_blank">önceki yazımızda</a> da bahsettiğimiz, python-opencv kütüphanelerini içeren image ile bir container oluşturuyoruz ve <b><i>D:\docker </i></b>klasörü ile container içerisindeki <b><i>/home</i></b> klasörünü birbirine bağlamış oluyoruz. Aşağıdaki ekran çıktısında da görüldüğü gibi, herhangi bir klasör bağlantısı yapmadan container oluşturunca <i>home </i>klasörünün içerisinde herhangi bir kayıt listelenmiyor. </span><b style="background-color: #f6f8fa; color: #24292e; font-size: x-large; text-align: left;">-v /d/docker:/home</b><span style="font-size: large;"> komutu ile container oluşturunca ise <b>ls home</b></span><span style="font-size: large;"> komutu ile makinemizdeki <b>D:\docker</b> klasöründeki dosyaları görüntülemiş oluyoruz.</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvqrkVXcDydyRizpWH32UAihnEE5nS-LEqi92PULgpvtoz1kRfVCXsweTmjoR4PBnaeSW8k3aY-N4AkT1TrBgUcW0H92QNW0kZo_rnzMAaXZCsnasufLLO1AhKNBfxXEdcLaO56I7Uhss/s1600/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="198" data-original-width="681" height="186" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvqrkVXcDydyRizpWH32UAihnEE5nS-LEqi92PULgpvtoz1kRfVCXsweTmjoR4PBnaeSW8k3aY-N4AkT1TrBgUcW0H92QNW0kZo_rnzMAaXZCsnasufLLO1AhKNBfxXEdcLaO56I7Uhss/s640/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" width="640" /></a></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
</div>
İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com0tag:blogger.com,1999:blog-2739106657175580544.post-85225577704536280242019-01-15T00:51:00.000-08:002019-01-17T04:36:55.786-08:00Docker ile Python ve OpenCV uygulaması - Giriş<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
<span style="font-size: large;">Docker ile sanal ortamlar oluşturup, uygulamaları bu sanal ortam üzerinde çalıştırıp "benim makinemde çalışıyordu sende neden çalışmadı!" problemini ortadan kaldırabiliriz. Detayları için benim de istifade ettiğim <a href="https://gokhansengun.com/docker-nedir-nasil-calisir-nerede-kullanilir/" target="_blank">şu linkteki yazıya</a> göz atmanızı tavsiye ederim. </span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Bu yazı kapsamında sizlere (python+opencv) uygulamasını, bilgisayarımıza ilgili kütüphanelerin kurulumu ile uğraşmadan nasıl docker üzerinde çalıştırabileceğimizi açıklamaya çalışacağım. Bu basit örnek üzerinden, docker ile ilgili linkini verdiğim yazıdaki bazı noktaları da açıklamış olacağım.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"></span></div>
<a name='more'></a><span style="font-size: large;"><br /></span>
<br />
<div style="text-align: justify;">
<span style="font-size: large;">Docker ile ilgili uygulamamıza geçmeden önce, en azından bazı temel terimleri açıklamada fayda var (<a href="https://gokhansengun.com/docker-nedir-nasil-calisir-nerede-kullanilir/" target="_blank">detaylı bilgi için</a>); </span><span style="font-size: large;"><b>Image</b>, içerisinde uygulamaları barındıran hazır paket olarak düşünülebilir. <b>Container </b>ise <b>image </b>üzerinden oluşturulmuş, ve <i>host </i>makine üzerinde çalışan veya çalışmaya hazır hale getirilmiş ortamdır. Bir image üzerinden birden fazla container oluşturulabilir. Bir image oluşturmak için, belirli komutlar ile hazırlanmış <b>Dockerfile </b>dosyaları kullanılır. Hazırlanan <i>Dockerfile </i>isimli dosya <i>build </i>edilerek, <i>Dockerfile </i>'da tanımlanan özelliklerde <i>image </i>oluşturulmuş olur. Bunun dışında hali hazırda üretilmiş <i>image</i>'ların yayınlandığı <b><a href="https://hub.docker.com/" target="_blank">Dockerhub </a></b>üzerinden de ihtiyaç duyacağımız birçok <i>image</i>'a ulaşmak mümkün. Yani spesifik bir ortam hazırlamayacak isek, </span><span style="font-size: large;">docker mağazasında ihtiyaç duyacağımız ortamı bulabiliriz ve bir <i>Dockerfile </i>dosyası hazırlayıp <i>build </i>etmemize gerek kalmayabilir.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Bu noktada örnek uygulamamıza geçecek olursak, mini bir araştırma ile python ve opencv kurulumları içeren birçok image'ı <a href="https://hub.docker.com/" target="_blank">dockerhub </a>üzerinde bulabilirsiniz. </span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><u><i>python ve opencv için örnek docker image</i></u></span></div>
<div style="text-align: justify;">
<span style="text-align: left;"><span style="font-size: large;"><a href="https://hub.docker.com/r/jjanzic/docker-python3-opencv/">https://hub.docker.com/r/jjanzic/docker-python3-opencv/</a></span></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Üstteki linke tıklarsanız python ve opencv içeren image detaylarını görüntüleyebilirsiniz. Kullanımı için tek yapmanız gereken </span><span style="color: #244357; font-family: "ubuntu mono" , "consolas" , "monaco" , monospace; text-align: left;">docker run -it jjanzic/docker-python3-opencv python</span><span style="color: #244357; font-family: "ubuntu mono" , "consolas" , "monaco" , monospace; font-size: 11.9px; text-align: left;"> </span><span style="font-size: large;">komutunu çalıştırmak. -it 'den sonra yazılı olan image dockerhub dan otomatik olarak indirilecek ve bilgisayarınızda kullanıma hazır bir image oluşacaktır. Ve bu image üzerinde python çalıştırılacaktır.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgW-cSMuyq5xEs9_hn5MDJQylWO5APwSTxB2HYS27br8q_uCbC8d0ERe6kRn6IMhfU0nIfogXCGNEg9hD1hkNl4TH8hW11s5JSq8Ln2N5KOaZMpv0mb82n1dK0xgtfKec-h5qtruJKDxkM/s1600/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="135" data-original-width="574" height="148" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgW-cSMuyq5xEs9_hn5MDJQylWO5APwSTxB2HYS27br8q_uCbC8d0ERe6kRn6IMhfU0nIfogXCGNEg9hD1hkNl4TH8hW11s5JSq8Ln2N5KOaZMpv0mb82n1dK0xgtfKec-h5qtruJKDxkM/s640/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" width="640" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: large;">Yazdığımız komut ile belirttiğimiz image üzerinden bir container oluşturup, container üzerinde de python komutunu çalıştırmış olduk. Kullandığımız hazır image'ın <a href="https://hub.docker.com/r/jjanzic/docker-python3-opencv/dockerfile" target="_blank">Dockerfile </a>ına göz atarsanız, gerçekleştirilen kurulumları vs görebilirsiniz. Bu noktada sadece bu hazır Dockerfile üzerinde küçük bir değişiklik yapıp, bu defa Dockerfile kullanarak bir image oluşturacağız. </span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRjHNKrhYSJscTrq7Nzsdpr6ada1JQAYtC3BTUJYQcc1bXnw9pqAeC1tAf0kHkLTh0eL-PDU6EkaAV2jYQOJNtIHeRIL6XNEhBEAn3O0dArCF1bluOm8iitCGy9879OtKShpAFweirxMs/s1600/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="736" data-original-width="594" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRjHNKrhYSJscTrq7Nzsdpr6ada1JQAYtC3BTUJYQcc1bXnw9pqAeC1tAf0kHkLTh0eL-PDU6EkaAV2jYQOJNtIHeRIL6XNEhBEAn3O0dArCF1bluOm8iitCGy9879OtKShpAFweirxMs/s640/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" width="515" /></a></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><a href="https://hub.docker.com/u/jjanzic" target="_blank">jjanzic</a> tarafında hazırlanmış <b>Dockerfile'</b>ı aldık, sadece sonuna </span><span style="text-align: left;"><span style="font-size: large;"><b>ENTRYPOINT [ "python" ]</b> satırını ekledik. Böylece oluşturacağımız image için bir entrypoint tanımlamış oluyoruz. Dockerfile isimli dosyamızın bulunduğu klasöre gelerek,</span></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><b>docker build -t myopencv .</b> komutu ile myopencv isimli kendi image'ımızı oluşturuyoruz. Bu işlem biraz zaman alıyor, çünkü hazır ortam indirmeyip kendimiz sıfırdan bir image oluşturuyoruz. Dolayısıyla kütüphane kurulumları biraz zaman alıyor.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Kurulum bittikten sonra "<b>docker images</b>" komutu ile bilgisayarınızda kurulu olan bütün image'ları listeleyebilirsiniz. Şimdi isterseniz bu yeni oluşturduğumuz image'ı çalıştıralım.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><b>docker run -it myopencv</b> komutunu yazdığımızda ilk olarak python'un çalıştığını görüyoruz. Yani bu image'dan bir container oluşturup çalıştırıldığında direk python çalışmış oluyor.</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVatDCiRHgl3s3dq899BKffq-_MqzuxWONBBo6iSy5tWVMz7miVOOmiOG7qEK1zOpFcbtNLo0zaiEHs3rCjIYpyi9TWlgnF26vLIWe0HCORsQP53UTap87MmuJDz_PMLqCeA9KihqGqIM/s1600/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="136" data-original-width="577" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVatDCiRHgl3s3dq899BKffq-_MqzuxWONBBo6iSy5tWVMz7miVOOmiOG7qEK1zOpFcbtNLo0zaiEHs3rCjIYpyi9TWlgnF26vLIWe0HCORsQP53UTap87MmuJDz_PMLqCeA9KihqGqIM/s640/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" width="640" /></a></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Şimdi ise, bir python dosyasını makinemizden oluşturduğumuz bir container içerisine kopyalayalım. İk olarak "<b>docker ps</b>" komutu ile çalışmakta olan container'ları listeleyelim.</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidhjRtRUNmqkbtZQc62T4lxrPlDxySHXTZFqCJjgUfoCi9kAjPb8V0gh60klL7PuJj5Js1meXDoABRiiEn0YsFGkgldhU1kxhgCV-Xyo7I4sJ_6NwDAc5YddZLQxnWaGXAns5j4CshYPE/s1600/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="116" data-original-width="732" height="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidhjRtRUNmqkbtZQc62T4lxrPlDxySHXTZFqCJjgUfoCi9kAjPb8V0gh60klL7PuJj5Js1meXDoABRiiEn0YsFGkgldhU1kxhgCV-Xyo7I4sJ_6NwDAc5YddZLQxnWaGXAns5j4CshYPE/s640/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" width="640" /></a></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div style="text-align: justify;">
<span style="font-size: large;">myopencv image'ı üzerinden oluşturduğum 1 tane container görülmekte. Bu container'ın içerisine D:/docker/ klasöründeki bir python dosyasını kopyalamak istiyorum, bunun için;</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="color: red; font-size: large;">docker cp D:/docker/example.py 685c285cff53:/home/example.py</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">komutu ile, </span><span style="font-size: large;"><i>D:/docker/example.py</i> dosyasını, ilgili container ID'si ile container'daki <i>home/</i> klasörüne kopyalıyorum. Şimdi ilgili container'a bağlanıp, dosyamız kopyalandı mı kontrol edelim.</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0COptvz4wIwbFys4TzhRfNK8x3wbJo0BeeIOpoZcMHo8IV1J2mswWKvesUxbMSXZW4QZLt1WvS9EBVU6tVohLqoP-GfuAuk_iRWXNvZCsrcgarmVB8y61vkvyyY-Qw2E-NHGkDmS6Zpw/s1600/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="135" data-original-width="496" height="108" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0COptvz4wIwbFys4TzhRfNK8x3wbJo0BeeIOpoZcMHo8IV1J2mswWKvesUxbMSXZW4QZLt1WvS9EBVU6tVohLqoP-GfuAuk_iRWXNvZCsrcgarmVB8y61vkvyyY-Qw2E-NHGkDmS6Zpw/s400/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Artık ilgili container içerisinde, home/ klasöründe <i>example.py</i> isimli bir dosya mevcut. İçerisine python kodu attığımız bu container'ı, yeni bir image olarak kaydedebiliriz. Böylece oluşan bu image içerisinde <i>home </i>klasöründe bir <i>example.py</i> dosyası yer alacaktır. </span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="color: red;"><span style="font-size: large;">docker commit </span><span style="font-size: large;">685c285cff53 </span><span style="font-size: large;">myopencv-2</span></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8P8mftgw8lyNZB_kUpwqqpoXOFPsXRKnhSEovmdRATToCKPyzv_bIyli28jEeEC9u2nN2L22ONrAi__sHcY5zivuzNBaab3hII-72Z75Ll1druZqdg9MchPLKXTBBlIseBUnrEmeWRF0/s1600/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="307" data-original-width="822" height="238" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8P8mftgw8lyNZB_kUpwqqpoXOFPsXRKnhSEovmdRATToCKPyzv_bIyli28jEeEC9u2nN2L22ONrAi__sHcY5zivuzNBaab3hII-72Z75Ll1druZqdg9MchPLKXTBBlIseBUnrEmeWRF0/s640/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" width="640" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: large;">Oluşturduğumuz <b>myopencv-2</b> üzerinden çalıştırılmış bir container ile, <i>example.py </i>dosyasını şu şekilde çalıştırabiliriz.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="color: red; font-size: large;"><span id="goog_729841942"></span>docker exec -it f35bb4221da6 python home/example.py</span></div>
<div style="text-align: justify;">
<span style="color: red; font-size: large;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5nB7IdV3Q25MsvftW-7Q4tnh_VruTS_o7-doxVxkIwzdO0I-u0PnEVkQYTDWwcTvZSEDMpCf_rlGxuCz006I48_iuQ40c_xr1WdidT4-0vvUat__9bUa-nVVEZnJWW24rA4-Uv-wOWGc/s1600/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="83" data-original-width="504" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5nB7IdV3Q25MsvftW-7Q4tnh_VruTS_o7-doxVxkIwzdO0I-u0PnEVkQYTDWwcTvZSEDMpCf_rlGxuCz006I48_iuQ40c_xr1WdidT4-0vvUat__9bUa-nVVEZnJWW24rA4-Uv-wOWGc/s1600/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" /></a></div>
<div style="text-align: justify;">
<br />
<span id="goog_729841943"></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><i>example.py dosyasının içeriği</i></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX_HuMq_scDAcatROxXVwSGfWdAbU_2d_BLTAbb2DyAiT9Na_3jLqdpfh3okK5y6ordRhkpdaNY2U8XlayMmgYdDsJEzteCt301Ujxu2G8rpBe8EmQYz6CMMcvYcapM5vr9MuCmByjJGo/s1600/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="132" data-original-width="245" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX_HuMq_scDAcatROxXVwSGfWdAbU_2d_BLTAbb2DyAiT9Na_3jLqdpfh3okK5y6ordRhkpdaNY2U8XlayMmgYdDsJEzteCt301Ujxu2G8rpBe8EmQYz6CMMcvYcapM5vr9MuCmByjJGo/s1600/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" /></a></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Bu yazı kapsamında python ve opencv içeren basit bir uygulamayı docker üzerinde çalıştırmayı öğrendik. Aynı zamanda <i>entrypoint</i>'in ne olduğunu ve üzerinde değişiklik yaptığımız bir <i>container</i>'ı nasıl kaydedeceğimizi de öğrenmiş olduk.</span></div>
<div style="text-align: justify;">
<br /></div>
</div>
İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com0tag:blogger.com,1999:blog-2739106657175580544.post-84249450023925061622018-11-14T01:55:00.003-08:002018-11-14T03:22:31.046-08:00C++ - Memory Leak (Bellek sızıntısı) tespiti<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
<span style="font-size: large;"> "<i>Memory leak</i>" yani bellek sızıntısı bir uygulamanın kullandığı hafıza bloğunu serbest bırakmaması sonucunda, kendisi için ayrılan bellek miktarının aşırı şişmesi durumudur. Özellikle uzun süreli çalışan uygulamalarda sistem kaynaklarının aşırı tüketilmesine, dolayısıyla performans kaybına ve aynı zamanda uygulamanın çökmesine sebep olabilmektedir. </span></div>
<div style="text-align: justify;">
<span style="font-size: large;"></span></div>
<a name='more'></a><br />
<div style="text-align: justify;">
<span style="font-size: large;">Konuya C++ özelinde baktığımızda dinamik olarak hafızada ayrılan bellek (bknz:pointer) geri bırakılmadığı durumlarda böyle bir sorunla karşılaşılır. Nispeten büyük bir projede ise nerede bellek sızıntısı olduğunu bulmak son derece zor olabilir. Yazdığımız programda nerede bellek sızıntısı olduğunu bulmak için geliştirilmiş çeşitli araçlar mevcut, ben de bu yazı kapsamında sizlere kullanmış olduğum <a href="https://kinddragon.github.io/vld/" target="_blank"><b>Visual Leak Detector</b></a> hakkında bilgi vereceğim. Kurulumu son derece basit, <a href="https://kinddragon.github.io/vld/" target="_blank">linkten </a><i>installer</i>'ı indirip </span><span style="font-size: large;">bilgisayarınıza </span><span style="font-size: large;">kolayca kurabiliyorsunuz.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb03RHl4J7lmmMQPa5rLEeDMp4GaPs_P7jSY48TXOekk5_qLF1CE9ec7vAOAi-i5MbNmx-3MWZpDR8N5SDCFfMclkkfgABCzgGcukMZCQvRlfBjOK15qvAN6BksWixh-pJbIKEieVUxQU/s1600/Ads%25C4%25B1z.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="416" data-original-width="1134" height="117" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb03RHl4J7lmmMQPa5rLEeDMp4GaPs_P7jSY48TXOekk5_qLF1CE9ec7vAOAi-i5MbNmx-3MWZpDR8N5SDCFfMclkkfgABCzgGcukMZCQvRlfBjOK15qvAN6BksWixh-pJbIKEieVUxQU/s320/Ads%25C4%25B1z.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large; text-align: justify;">Kullanımına gelecek olursak;</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="color: red; font-size: large;">#include "vld.h" </span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;"><br /></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-size: large;">ile <i>visual leak detector </i>ün yazdığımız kodu analiz etmesini sağlıyoruz. Burada istisna olan nokta şu, eğer "stdafx.h" dosyası <i>include</i> edilmiş ise, bunun dosyanın en başında olması gerekiyor. Yani <i>vld.h</i> dosyası, <i>stdafx.h</i> dan sonra <i>include </i>edilmeli. Bunun dışında projede istenilen dosyada ve sırada <i>vld.h</i> dosyasının <i>include </i>edilmesi yeterli. </span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;">Şimdi <i>memory leak</i> içeren bir kod yazalım ve uygulamayı <i>debug </i>modunda çalıştırarak <i>memory leak'</i>leri tespit edelim.</span></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicAZ_SsIVw7LVOzaRGQG7nQ1ewCIfH8Vupd-wnjfALm7MStful9mUtJgyeP_gcTdd5QCJtOIa3t9p8oR3wEsxREZR0Hk49iauAymlGWZBhP37iH2WqS06xPcpaE3olNZQQz8BKx4vu5jo/s1600/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="648" data-original-width="664" height="624" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicAZ_SsIVw7LVOzaRGQG7nQ1ewCIfH8Vupd-wnjfALm7MStful9mUtJgyeP_gcTdd5QCJtOIa3t9p8oR3wEsxREZR0Hk49iauAymlGWZBhP37iH2WqS06xPcpaE3olNZQQz8BKx4vu5jo/s640/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;">Örnekte bir döngü içerisinde pointer ile integer değişken için yer ayırdık, Fakat ayrılan yeri silmedik. Ekranda <span style="color: red;"><i>5</i> <i>memory leaks</i></span> oluştu diye bir uyarı aldık, output ekranını yukarı kaydırırsanız, her bir bellek sızıntısı ile ilgili detayları da görüntüleyebiliyorsunuz.</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;"><br /></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-size: large;">Hatamızı gördükten sonra hatamızı çözüp, kodu tekrar çalıştırdığımızda, <span style="color: red;">"<i>no memory leaks detected</i>"</span> mesajını okuyarak sızıntısız kod yazmış olmanın keyfini yaşıyoruz :)</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNOhRyy-OabVk_hRm0L8mEPdoYajm1y_GfoUjSowua01jX1Wcwg6Ha6qJkw22B9aJzI-VreVpJBLV-IdPl_HsBbqAnliID7-6BGmPgd-sCnPf7g6-rQ4FiNf0o-OnxjHSVXW3oVrJa3_A/s1600/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="534" data-original-width="496" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNOhRyy-OabVk_hRm0L8mEPdoYajm1y_GfoUjSowua01jX1Wcwg6Ha6qJkw22B9aJzI-VreVpJBLV-IdPl_HsBbqAnliID7-6BGmPgd-sCnPf7g6-rQ4FiNf0o-OnxjHSVXW3oVrJa3_A/s640/Ekran+Al%25C4%25B1nt%25C4%25B1s%25C4%25B1.PNG" width="594" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;"><br /></span></div>
</div>
İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com0tag:blogger.com,1999:blog-2739106657175580544.post-76644693327875764602018-09-10T05:23:00.003-07:002018-09-10T05:44:13.722-07:00C++ - OpenCV Nesne Takip Modülleri<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
<span style="font-size: large;">Bu yazı kapsamında sizlere OpenCV içerisindeki nesne takip modüllerinden bahsedeceğim. </span><br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dychRvYNF8V_VP7f1NQryxGm61xYWeUQ5WK5zWXCh4_YKg3vBL_8-h59XyzvUJDQYiSyiSdAaJbpKrH7X4diA' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div>
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"></span></div>
<a name='more'></a><br />
<div style="text-align: justify;">
<span style="font-size: large;">Nesne takip bir videodaki herhangi bir nesneyi birbirini takip eden görüntülerde bulma işlemidir. Nesne takip yöntemleri özellikle nesne tanıma yöntemleri ile birlikte kullanılarak, hedef nesnenin tespit edilemediği durumlarda takip yönteminin devreye girmesiyle son derece faydalı olabilir.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Görüntü işleme alanında son derece popüler olan OpenCV kütüphanesine ise, 3.0 sürümünden itibaren çeşitli nesne takip modülleri eklenmiştir. Buna göre bir videoda ilk görüntüde bir dikdörtgen alan seçerek, seçilen bu alanı (yani alanın içerisindeki nesneyi) takip etmek son derece kolay hale gelmiş oldu.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">OpenCV 3.4.2 sürümü itibariyle BOOSTING, MIL, KCF, TLD, MEDIANFLOW, MOSSE, CSRT ve GOTURN gibi birçok takip modülü implemente edilmiş durumda. (detaylı bilgi için <a href="https://www.learnopencv.com/object-tracking-using-opencv-cpp-python/" target="_blank">tıklayınız</a>)</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Bu yöntemlerin içerisinde GOTURN'e ayrıca değinmek istiyorum. Açılımı </span><em style="background-color: white; box-sizing: inherit; color: #333333; font-family: "Open Sans", sans-serif; font-size: 20px; text-align: left;">Generic Object Tracking Using Regression Networks</em><span style="font-size: large;"> olan bu yöntem, adından da anlaşılacağı gibi sinir ağı yani popüler adıyla derin öğrenme temelli bir yöntem. Bu yöntemi kullanmak için diğerlerinden farklı olarak, eğitilmiş modeli indirip programı çalıştıracağımız dizine kopyalamamız gerekiyor. İndirmemiz gereken dosyalar; </span><span style="text-align: left;"><span style="font-size: large;"><i>goturn.caffemodel</i> ve <i>goturn.prototxt . (</i>detaylı bilgi ve dosyaları indirmek için <a href="https://www.learnopencv.com/goturn-deep-learning-based-object-tracking/" target="_blank">tıklayınız</a>)</span></span></div>
<div style="text-align: justify;">
<span style="text-align: left;"><span style="font-size: large;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="text-align: left;"><span style="font-size: large;"><b>Kodları paylaşmadan önce belirtmek istediğim önemli bir not: </b>nesne takip yöntemlerini kullanabilmeniz için OpenCV'yi ekstra modülleri ile birlikte kurmanız gerekmekte. Bunun için <a href="https://github.com/opencv/opencv" target="_blank">opencv </a>ve ekstra modüllerin olduğu <a href="https://github.com/opencv/opencv_contrib" target="_blank">opencv_contrib</a> kaynak kodlarını indirip, OpenCV'yi ekstra modülleri ile birlikte derlemeniz gerekecek.</span></span></div>
<div style="text-align: justify;">
<span style="text-align: left;"><span style="font-size: large;"><br /></span></span></div>
<div style="text-align: left;">
<span style="font-size: large;">Mini girizgahtan sonra C++ ile yazılmış kodları paylaşıyorum.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">include edeceğimiz dosyalar</span></div>
<pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; line-height: 1.45; overflow-wrap: normal; overflow: auto; padding: 16px; word-break: normal;"><span style="color: #24292e;"><span style="font-size: 13.6px;">#include<iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/tracking.hpp></span></span></pre>
<pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; line-height: 1.45; overflow-wrap: normal; overflow: auto; padding: 16px; word-break: normal;">using namespace std;
using namespace cv;</pre>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Dosya yolunu argüman olarak almak istersek;</span></div>
<pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; line-height: 1.45; overflow-wrap: normal; overflow: auto; padding: 16px; word-break: normal;"><span style="color: #24292e;"> <span style="font-size: 13.6px;">string str = "0";
char* video_input = (char*)str.c_str();
for (int argv_index = 1; argv_index < argc; argv_index++)
{
if (0 == strcmp("-v", argv[argv_index]))
{
if ((++argv_index) < argc)
{
video_input = argv[argv_index];
}
}
else if (0 == strcmp("-c", argv[argv_index]))
{
if ((++argv_index) < argc)
{
video_input = argv[argv_index];
}
}
}</span></span>
</pre>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div style="text-align: justify;">
<span style="font-size: large;"><b>Tracker </b>nesnesini seçilen farklı yöntemlere göre oluşturmak için;</span></div>
</div>
<pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; line-height: 1.45; overflow-wrap: normal; overflow: auto; padding: 16px; word-break: normal;"><span style="color: #24292e;"> <span style="font-size: 13.6px;">Ptr<Tracker> tracker;
string trackerTypes[8] = { "BOOSTING", "MIL", "KCF", "TLD","MEDIANFLOW", "GOTURN", "MOSSE", "CSRT" };
string trackerType = trackerTypes[7];
if (trackerType == "BOOSTING")
tracker = TrackerBoosting::create();
if (trackerType == "MIL")
tracker = TrackerMIL::create();
if (trackerType == "KCF")
tracker = TrackerKCF::create();
if (trackerType == "TLD")
tracker = TrackerTLD::create();
if (trackerType == "MEDIANFLOW")
tracker = TrackerMedianFlow::create();
if (trackerType == "GOTURN")
tracker = TrackerGOTURN::create();
if (trackerType == "MOSSE")
tracker = TrackerMOSSE::create();
if (trackerType == "CSRT")
tracker = TrackerCSRT::create();</span></span></pre>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Eğer video yolu belirtilmemişse, kamerayı açmak istersek;</span></div>
<pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; line-height: 1.45; overflow-wrap: normal; overflow: auto; padding: 16px; word-break: normal;"><span style="color: #24292e;"> VideoCapture *video;
if (strlen(video_input) == 1 && (video_input[0] >= 48 || video_input[0] <= 57))
{
unsigned short x = video_input[0] - 48;
video = new cv::VideoCapture(x);
}
else {
video = new cv::VideoCapture(video_input);
}</span></pre>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Ve artık selectROI ile bir dikdörtgen seçip takip işlemini başlatabiliriz.</span></div>
<pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; line-height: 1.45; overflow-wrap: normal; overflow: auto; padding: 16px; word-break: normal;"><span style="color: #24292e;"> Mat frame;
video->read(frame);
Rect2d rect = selectROI(frame);
// Initialize tracker with first frame and bounding box
tracker->init(frame, rect);</span></pre>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: large;">Bir döngü içerisinde takip sonuçlarını ekranda görüntülemek için;</span></div>
<pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; line-height: 1.45; overflow-wrap: normal; overflow: auto; padding: 16px; word-break: normal;"><span style="color: #24292e;"> while (video->read(frame))
{
// Update the tracking result
bool ok = tracker->update(frame, rect);
if (ok)
{
rectangle(frame, rect, Scalar(255, 0, 255), 2, 1);
}
else
{
putText(frame, "Tracking failure detected", Point(100, 80), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0, 0, 255), 2);
}
putText(frame, trackerType, Point(100, 20), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(50, 170, 50), 2);
// Display frame.
imshow("Tracking", frame);
// Exit if ESC pressed.
if (waitKey(1) == 27) break;
}</span></pre>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
</div>
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: justify; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
</div>
<br />
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: justify; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<div style="margin: 0px;">
<i style="background-color: #fefdfa; color: #333333; font-family: "courier new", courier, monospace; font-size: large; text-align: left;">Her türlü görüş, öneri ve sorularınızı iletebilirsiniz...</i></div>
</div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
</div>
İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com0tag:blogger.com,1999:blog-2739106657175580544.post-66318384497772776812018-08-17T12:19:00.003-07:002018-08-17T12:25:12.019-07:00Deep Learning based object detection REST API<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-size: large;">Learn how to develop a REST API listening http requests to find objects in the image. </span><br />
<span style="font-size: large;"></span><br />
<a name='more'></a><span style="font-size: large;"><br /></span>
<span style="font-size: large;">For deep learning based object detection API, we have defined a predict function listening POST requests, processing input image and return detection results as json response.</span><br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><a href="https://twitter.com/ibrahimd25/status/1030530580637777922">https://twitter.com/ibrahimd25/status/1030530580637777922</a></span><br />
<br />
<span style="font-size: large;">You can reach this example (also many other special examples) in <a href="https://www.udemy.com/learn-computer-vision-with-opencv-and-python/?couponCode=LEARNCV9" target="_blank">my Computer Vision course</a> over Udemy.</span><br />
<br />
<span style="font-size: large;">Course details:</span><br />
<a href="http://ibrahimdelibasoglu.blogspot.com.tr/2018/01/learn-computer-vision-with-opencv-and.html"><span style="font-size: large;">http://ibrahimdelibasoglu.blogspot.com.tr/2018/01/learn-computer-vision-with-opencv-and.html</span></a></div>
İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com0tag:blogger.com,1999:blog-2739106657175580544.post-29369800954889245432018-06-21T01:44:00.001-07:002018-06-21T01:54:03.980-07:00GPU destekli Tensorflow kurulumu (NVIDIA CUDA ile)<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-size: large; text-align: justify;">Bu yazı kapsamında GPU destekli tensorflow kurulumu için izlenecek yol anlatılacaktır. Bunun için NVIDIA'nın GPU (grafik işlem birimi) gücünü kullanmak için geliştirmiş olduğu paralel hesaplama mimarisi olan CUDA'yı kullanacağız. İlk olarak bilgisayarınızdaki grafik kartının CUDA'yı destekleyip desteklemediğini öğrenmek için aşağıdaki linkten kontrol ediniz;</span><br />
<a name='more'></a><a href="https://developer.nvidia.com/cuda-gpus" style="font-size: x-large; text-align: justify;">https://developer.nvidia.com/cuda-gpus</a><br />
<span style="font-size: large;">
</span>
<br />
<div style="text-align: justify;">
<span style="font-size: large;">Eğer grafik kartınız CUDA destekli ise, Tensorflow yüklemeden önce ilk olarak CUDA yı indirip kurmanız gerekiyor.</span></div>
<a href="https://developer.nvidia.com/cuda-toolkit" style="font-size: x-large; text-align: justify;">https://developer.nvidia.com/cuda-toolkit</a><br />
<span style="font-size: large;">
</span>
<br />
<span style="font-size: large;"></span><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtt-EGmZMb2J7GyqvdhYKPFj-ficqDPv9xCDFwxtv8k5bUyL15q8nTcYrkF4YgjOkxCAluvFvYhk3RDiFajX7zS7GD3VUTffkgJan0i3V3mBHYuzAAK4H5WGIGat8mhfu-r7PYspvdJiI/s1600/cuda-toolkit.png" imageanchor="1" style="font-size: x-large; margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="518" data-original-width="889" height="371" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtt-EGmZMb2J7GyqvdhYKPFj-ficqDPv9xCDFwxtv8k5bUyL15q8nTcYrkF4YgjOkxCAluvFvYhk3RDiFajX7zS7GD3VUTffkgJan0i3V3mBHYuzAAK4H5WGIGat8mhfu-r7PYspvdJiI/s640/cuda-toolkit.png" width="640" /></a><br />
<span style="font-size: large; text-align: justify;">CUDA Toolkit farklı sürümleri için:</span><br />
<span style="font-size: large;"><a href="https://developer.nvidia.com/cuda-toolkit-archive">https://developer.nvidia.com/cuda-toolkit-archive</a></span><br />
<br />
<div style="text-align: justify;">
<span style="font-size: large;">Tensorflow resmi sitesinde an itibariyle CUDA 9 'ı kurmamız belirtildiği için, ben de Windows 10 için CUDA Toolkit 9 versiyonunu indirip makineme yüklüyorum.</span></div>
<span style="font-size: large;">
</span>
<br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: large;">CUDA yı kurduktan sonra gpu destekli tensorflow kurulumunu yapalım ve çalışıp çalışmadığını kontrol edelim. Bilgisayarımızda şayet Python yüklü ise mevcut sürümün ve diğer kütüphanelerin etkilenmemesi için Anaconda ile yeni bir ortam (<i>environment</i>) oluşturup, gpu destekli tensorflow kuralım.</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="color: red; font-size: large;">conda create --name gpu-env python=3.5</span></div>
<span style="color: red; font-size: large;">
</span>
<br />
<div style="text-align: justify;">
<span style="font-size: large;">Bu komutla </span><span style="color: red; font-size: large;">gpu-env </span><span style="font-size: large;">isimli yeni bir ortam oluşturup,içerisine python 3.5 yüklemiş olduk. </span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: large;"><span style="color: red;">activate gpu-env</span> komutu ile eklemiş olduğumuz yeni <span style="color: red;">gpu-env</span> isimli ortamı aktif edip, gpu destekli tensorlow 'u aşağıdaki komut ile yükleyebiliriz;</span></div>
<br />
<div style="text-align: justify;">
<span style="color: red; font-size: large;">pip install --ignore-installed --upgrade tensorflow-gpu</span></div>
<br />
<div style="text-align: justify;">
<span style="font-size: large;">Eğer bir hata almadıysak tensorflow kurulumunu tamamladık gibi görünüyor. </span><span style="font-size: large;">Fakat import tensorflow komutu ile kurulumu test etmek istediğimizde karşımıza çıkan hata;</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><span style="color: red;"><i>Could not find 'cudnn64_7.dll' </i></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: large;">Hata mesajındaki versiyon numarasından anlaşılacağı gibi CuDNN versiyon 7 'yi kurmamız gerekiyor. </span><span style="font-size: large;">tensorflow'u import ettiğimizde CUDA Toolkit ya da CuDNN ile ilgili herhangi bir hata veya versiyon uyuşmazlığı </span><span style="font-size: large;">olması durumunda doğru versiyonu indirip kurmanız gerekiyor.</span></div>
<span style="font-size: large;">
</span>
<br />
<div style="text-align: justify;">
<span style="font-size: large;">CuDNN indirmek için (hesap oluşturup giriş yapmalısınız)</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><a href="https://developer.nvidia.com/cudnn">https://developer.nvidia.com/cudnn</a></span></div>
<span style="font-size: large;">
</span>
<br />
<div style="text-align: justify;">
<span style="font-size: large;">Yüklemiş olduğunuz CUDA Toolkit'e uygun CuDNN versiyonunu indirmeli</span><span style="font-size: large;">siniz</span><span style="font-size: large;"></span><br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-size: large;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg712NOipKK2PyQrQRmAvoijd_1GtsGYDEJzQHavR2FagxfN4Ccspav44lB4rzTD7ZvKgMLmWHZaIBFYnfSzVEnVDZdu2aVauHVi_yAGBHXUadvwOjUTEzt4ZT0Y0Jl6EggBI8HtUDWOms/s1600/CuDNN.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="280" data-original-width="701" height="158" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg712NOipKK2PyQrQRmAvoijd_1GtsGYDEJzQHavR2FagxfN4Ccspav44lB4rzTD7ZvKgMLmWHZaIBFYnfSzVEnVDZdu2aVauHVi_yAGBHXUadvwOjUTEzt4ZT0Y0Jl6EggBI8HtUDWOms/s400/CuDNN.PNG" width="400" /></a></span></div>
<span style="font-size: large;">
</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: large;">Uygun CuDNN 'i indirdiğinizde dll, header ve library dosyalarını içeren 3 farklı klasör göreceksiniz. Bu dosyaları ortam değişkenlerinde;</span></div>
<span style="font-size: large;">
</span>
<span style="font-size: large;"></span><br />
<div style="text-align: justify;">
<span style="font-size: large;"><u><span style="color: orange;">CUDA_PATH = C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0 </span></u> ile tanımlı olan dizine kopyalayın. </span></div>
<span style="font-size: large;">
</span>
<br />
<div style="text-align: justify;">
<span style="font-size: large;">(<b>dll </b>dosyasını <b>bin </b>klasörüne, <b>header </b>dosyasını <b>include </b>klasörüne ve <b>library </b>dosyasını <b>lib\x64</b> klasörüne)</span></div>
<br />
<span style="font-size: large;"></span><br />
<div style="text-align: justify;">
<span style="font-size: large;">Tekrar "import tensorflow" ile tensorflow kurulumunu test edin, hata varsa başa dönün :)</span></div>
<span style="font-size: large;">
</span>
<br />
<div style="text-align: justify;">
<br /></div>
<span style="font-size: large;">
</span>
<br />
<div style="text-align: justify;">
<span style="font-size: large;"><i style="background-color: #fefdfa; color: #333333; font-family: "courier new", courier, monospace; font-size: large; text-align: left;">Her türlü görüş, öneri ve sorularınızı iletebilirsiniz...</i></span></div>
<span style="font-size: large;">
</span>
<br />
<div style="text-align: justify;">
<span style="font-size: large;"><i style="background-color: #fefdfa; color: #333333; font-family: "courier new", courier, monospace; font-size: large; text-align: left;"><br /></i></span></div>
<span style="font-size: large;">
</span>
<br />
<div style="text-align: justify;">
<br /></div>
</div>
İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com1tag:blogger.com,1999:blog-2739106657175580544.post-71239119501135770292018-06-18T04:50:00.001-07:002018-06-18T04:58:29.811-07:00Tesseract versiyon 4 ile OCR (optik karakter tanıma) uygulaması<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
<span style="font-size: large;">Daha önceki bir <a href="http://ibrahimdelibasoglu.blogspot.com/2017/02/mac-os-uzerine-tesseract-ocr-karakter.html">yazımda</a> tesseract OCR kurulumundan bahsetmiştim. Bu yazı kapsamında aradan geçen zaman zarfında <a href="https://github.com/tesseract-ocr" target="_blank">Tesseract</a> kütüphanesinde ne gibi gelişmeler olduğundan bahsedip, örnek uygulama geliştireceğiz. </span></div>
<div style="text-align: justify;">
<span style="font-size: large;"></span></div>
<a name='more'></a><span style="font-size: large;"><br /></span>
<br />
<div style="text-align: justify;">
<span style="font-size: large;">Açık kaynak Tesseract OCR kütüphanesini Python ile kullanmamıza imkan sağlayan iki farklı <i>wrapper </i>;</span></div>
<div style="text-align: justify;">
</div>
<ul>
<li><span style="font-size: large;"> <a href="https://pypi.org/project/pytesseract/" target="_blank">pytesseract</a></span></li>
<li><span style="font-size: large;"> <a href="https://github.com/sirfz/tesserocr" target="_blank">tesserocr </a></span></li>
</ul>
<br />
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Bu konuyla ilgili<a href="http://ibrahimdelibasoglu.blogspot.com/2017/02/mac-os-uzerine-tesseract-ocr-karakter.html" target="_blank"> bir önceki yazımda</a> pytesseract kurulumundan bahsedip, örnek görüntüler üzerinden kütüphaneyi test etmiştim. Aradan geçen zaman zarfında tesseract version 4' ün beta sürümü yayınlandı. Bu sürümde neler değişti diye bakacak olursak, OCR çalışmalarının da derin öğrenmeden nasibini aldığını söyleyebiliriz. Tesseract 4 ile birlikte LSTM ağ modeli tabanlı yeni bir yöntem benimsendi ve versiyon 3'e göre daha hızlı ve güvenilir olduğu söylenmekte. </span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Örnek uygulamamıza geçmeden önce, ilk olarak <a href="https://github.com/sirfz/tesserocr" target="_blank">tesserocr</a> 'yi bilgisayarımıza nasıl yükleyeceğimize bakalım ;</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><a href="https://anaconda.org/anaconda/python" target="_blank">Anaconda </a>kullanıyorsanız :</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; color: #24292e; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; line-height: 1.45; margin-bottom: 16px; overflow: auto; padding: 16px; word-wrap: normal;"><span style="font-size: large;">conda install -c simonflueckiger tesserocr </span></pre>
<pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; color: #24292e; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; line-height: 1.45; margin-bottom: 16px; overflow: auto; padding: 16px; word-wrap: normal;"><span style="font-size: large;">conda install -c simonflueckiger/label/tesseract-4.0.0-master tesserocr</span></pre>
<div style="text-align: justify;">
<span style="font-size: large;">komutları ile kolayca yükleyebilirsiniz. </span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Alternatif olarak kullandığınız Python versiyonuna göre uygun windows release 'ini <a href="https://github.com/simonflueckiger/tesserocr-windows_build/releases" target="_blank">bu linkten</a> indirip, </span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; color: #24292e; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; line-height: 1.45; margin-bottom: 16px; overflow: auto; padding: 16px; word-wrap: normal;"><div style="color: black; font-family: "Times New Roman"; text-align: justify; white-space: normal;">
<span style="font-size: large;">pip install tesserocr-2.2.2-cp36-cp36m-win_amd64.whl</span></div>
</pre>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">komutu ile yükleyebilirsiniz. Farklı işletim sistemleri ve daha detaylı bilgi için <a href="https://github.com/sirfz/tesserocr" target="_blank">tıklayınız</a>. Buraya kadar sorun yoksa, Artık <i><b>import tesserocr</b></i> komutu ile <i>tesserocr </i>'nin yüklenip yüklenmediğini test edebilirsiniz.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Eğer "<i>Failed to init API, possibly an invalid tessdata path</i>" hatası alırsanız, tek yapmanız gereken <a href="https://github.com/tesseract-ocr/tessdata" target="_blank">tessdata </a>yı indirip, indirdiğiniz klasörü Python 'un kurulu olduğu dizine kopyalamak. (örnek; indirdiğim <i>tessdata </i>klasörünü, Python'un kurulu olduğu "C:\Users\IbrahimD\Anaconda3" içerisine kopyaladım)</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Bir görüntüyü okuyup, tesseract ile metne çevirmek için;</span></div>
<pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; line-height: 1.45; overflow: auto; padding: 16px; word-break: normal; word-wrap: normal;"><span style="font-size: large;">import tesserocr
from PIL import Image
print(tesserocr.tesseract_version())
#print(tesserocr.get_languages())
img = Image.open('galata.png')
print(tesserocr.image_to_text(img))</span></pre>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Buraya kadar kurulumu yaptık ve bir görüntüyü okuyup <i>tesserocr image_to_text </i>fonksiyonu ile karakterleri buldurduk. Bir video üzerinde bu işlemi yapmak istediğimizde ise, bu işlemin gerçek zamanlı yapılabilmesi için biraz fazla işlem gücü gerektirdiğini/zaman aldığını göreceksiniz.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Video üzerinden OCR uygulama örneği gerçekleştirmek için şöyle bir yol izledim. Videoda belirli bir alanı seçip bu alandaki yazıları OCR ile tanımak istiyorum diyelim. Buradaki temel nokta şu; OCR ile seçilmiş bu alandaki görüntüyü sürekli olarak metne çevirmeyi denemeli miyim? İşin bu kısmı OCR'dan bağımsız ve geliştirilmeye/öneriye açık. Benim önerdiğim yöntemde, seçili alan içim <i>SIFT </i>algoritması ile <i>keypoint </i>leri buldum ve bulunan bu <i>keypoint </i>sayısına göre seçili alan için OCR algoritmasını çalıştırdım. Siz burada arka plan çıkarma yöntemlerini uygulayıp, videoda seçili olan alana yeni birşey gelip gelmediğini kontrol ederek (örneğin birisinin seçili alana bir kağıda yazmış olduğu yazıyı göstermesi gibi) OCR metodunu çağırmayı deneyebilirsiniz. Benim gerçekleştirmiş olduğum basit video uygulaması için örnek Python kodları ve çıktıyı aşağıda inceleyebilirsiniz.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 653px;"># -*- coding: utf-8 -*-
"""
Created on Mon Jun 11 17:30:54 2018
@author: IbrahimD
"""
import tesserocr
from PIL import Image
import cv2
import numpy as np
print(tesserocr.tesseract_version())
sift = cv2.xfeatures2d.SIFT_create()
cap = cv2.VideoCapture("video3.mp4")
n = 5
kernel = np.ones((n,n),np.uint8)
ret, frame = cap.read()
frame = cv2.resize(frame, (640,480))
r = cv2.selectROI(frame)
x,y,w,h = r[0],r[1],r[2],r[3]
whiteLower = (200, 0, 0)
whiteUpper = (255, 255, 255)
while(cap.isOpened()):
ret, frame = cap.read() #read a frame
if ret==False:
print("No Camera found")
break
frame = cv2.resize(frame, (640,480))
imCrop = frame[y:y+h, x:x+w].copy()
gray = cv2.cvtColor(imCrop, cv2.COLOR_BGR2GRAY)
ret,th = cv2.threshold(gray,150,255,cv2.THRESH_BINARY)
th = cv2.erode(th,kernel,iterations = 1)
kp, des = sift.detectAndCompute(th,None)
text = str(len(kp))
if len(kp)>150:
img = Image.fromarray(th)
text = tesserocr.image_to_text(img)
cv2.putText(frame, text, (10,50), cv2.FONT_HERSHEY_SIMPLEX,0.7, (0, 0, 255), 2)
cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,255),2)
cv2.imshow("frame",frame)
cv2.imshow("selected",th)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
cv2.waitKey(0)
</pre>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dzAbppHO4DHzL2bq9b3ElYPgJ1lxqCibMslCBaLk05cf91PBDKWG1ZwoFv1msRxtH2-6gbYEXJii1ITEh9DLA' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<i style="background-color: #fefdfa; color: #333333; font-family: "courier new", courier, monospace; font-size: large; text-align: left;">Her türlü görüş, öneri ve sorularınızı iletebilirsiniz...</i></div>
<div style="text-align: justify;">
<i style="background-color: #fefdfa; color: #333333; font-family: "courier new", courier, monospace; font-size: large; text-align: left;"><br /></i></div>
</div>
İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com6tag:blogger.com,1999:blog-2739106657175580544.post-41370269140094693832018-03-26T02:24:00.003-07:002018-03-26T02:30:27.752-07:00Java ve Spring ile JSON-RPC Sunucu <div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
<span style="font-size: large;">Python, C++, Görüntü işleme, Derin öğrenme vs. derken, yazılım alanında </span><span style="font-size: large;">Türkçe kaynak oluşmasına katkıda bulunma adına</span><span style="font-size: large;"> bir projemizde aktif kullandığımız Java ile JSON-RPC kullanımına dair bir blog yazısı hazırladım. Bu yazı kapsamında size, Spring ve </span><a href="https://github.com/briandilley/jsonrpc4j" style="font-size: x-large;">jsonrpc4j</a><span style="font-size: large;"> kullanarak "Java ile nasıl ve en kolay(hızlı) JSON-RPC sunucu uygulaması geliştirebiliriz" sorusunun cevabını vermeye çalışacağım. Ve her ne kadar bu yazının konusu Java diye belirlediysek de, JSON-RPC sunucumuza istek gönderen uygulamamızı yine Python ile geliştireceğiz.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"></span></div>
<a name='more'></a><span style="font-size: large;"><br /></span>
<br />
<div style="text-align: justify;">
<span style="font-size: large;">İlk olarak </span><span style="text-align: left;"><span style="font-size: large;"><a href="https://start.spring.io/">https://start.spring.io/</a> adresinden Java Spring Boot ve Maven ile projemizi oluşturuyoruz. Eclipse ile de <i>File-> New -> "Spring Starter Project"</i> ile projemizi oluşturabiliriz. Maven bağımlıklık yönetim aracının, jsonrpc4j için gerekli yüklemeleri yapması için <i>pom.xml </i>dosyasına aşağıdaki bağımlılığı (<i>dependency</i>) 'i ekliyoruz.</span></span></div>
<div style="text-align: left;">
<pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; color: #24292e; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 13.6px; line-height: 1.45; overflow: auto; padding: 16px; word-break: normal; word-wrap: normal;"> <span class="pl-c" style="box-sizing: border-box; color: #6a737d;"><span class="pl-c" style="box-sizing: border-box;"><!--</span> jsonrpc4j <span class="pl-c" style="box-sizing: border-box;">--></span></span>
<<span class="pl-ent" style="box-sizing: border-box; color: #22863a;">dependency</span>>
<<span class="pl-ent" style="box-sizing: border-box; color: #22863a;">groupId</span>>com.github.briandilley.jsonrpc4j</<span class="pl-ent" style="box-sizing: border-box; color: #22863a;">groupId</span>>
<<span class="pl-ent" style="box-sizing: border-box; color: #22863a;">artifactId</span>>jsonrpc4j</<span class="pl-ent" style="box-sizing: border-box; color: #22863a;">artifactId</span>>
<<span class="pl-ent" style="box-sizing: border-box; color: #22863a;">version</span>>1.5.2</<span class="pl-ent" style="box-sizing: border-box; color: #22863a;">version</span>>
</<span class="pl-ent" style="box-sizing: border-box; color: #22863a;">dependency</span>></pre>
</div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Projemizde bir <i>Service Interface</i> tanımlıyoruz. Bizim örneğimizde, sunucumuz 2 fonksiyonu <i>implement</i>'e edecek. Bunlar iki sayıyı çarpan basit bir çarpma metodu ile bir String listesini verilen bir diğer String'e göre birleştirip tek bir String haline getiren basit bir fonksiyon olsun. <b>ServiceApi</b> isimli bir java dosyayı oluşturup, aşağıdaki gibi <i>Service</i> tanımlıyoruz.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqjXS9rA9HkV0B1bichGLuNkH_6Rg5pAhAzkiXk6EPp1gsksxiwSK3OVp1Fvaa_B7WiwHV_KXnkcTdlBEYMuLgrxAUdONrMtxetsqDTtQxB2afvV4pWSMJd7rocgvGaLcx69BSegCZwi4/s1600/jsonService.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="307" data-original-width="870" height="224" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqjXS9rA9HkV0B1bichGLuNkH_6Rg5pAhAzkiXk6EPp1gsksxiwSK3OVp1Fvaa_B7WiwHV_KXnkcTdlBEYMuLgrxAUdONrMtxetsqDTtQxB2afvV4pWSMJd7rocgvGaLcx69BSegCZwi4/s640/jsonService.PNG" width="640" /></a></div>
<br />
<div style="text-align: justify;">
<span style="font-size: large;">Burada dikkat edeceğimiz nokta; </span><span style="font-size: large;"><span style="color: red;">@JsonRpcService("/utility") </span><i>annotation</i>. </span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">Daha sonra bu fonksiyonları <i>implement</i> edeceğimiz, <b>ServiceApiImpl</b> isimli bir dosya daha ekleyip, metodlarımızın içerisini dolduruyoruz.</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinoLdLqlqSnY3hckaLWF048OFIKTt23j3AEQ1SLdu4_cWoRX_TtkiN3nIFdV_OIpcZYwMJjI3br-TM1VegruVnWZTmf1ogfNdZNrF-tSzy1QXOlOwWHCV6oY36zRIlz7Cm58HuMrIClUY/s1600/jsonServiceImpl.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="425" data-original-width="571" height="474" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinoLdLqlqSnY3hckaLWF048OFIKTt23j3AEQ1SLdu4_cWoRX_TtkiN3nIFdV_OIpcZYwMJjI3br-TM1VegruVnWZTmf1ogfNdZNrF-tSzy1QXOlOwWHCV6oY36zRIlz7Cm58HuMrIClUY/s640/jsonServiceImpl.PNG" width="640" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: large;">Burada dikkat edeceğimiz nokta ise, </span><span style="background-color: #f6f8fa; color: #d73a49; font-family: , "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 13.6px; text-align: left;">@AutoJsonRpcServiceImpl </span><span style="font-size: large;">ile <i>Service Interface</i>'in implementasyonu için <i>annotation</i> eklemek. </span><span style="font-size: large;">Artık bu sınıf JSON-RPC Servis olarak Spring tarafından yönetilecek.</span></div>
<div style="text-align: left;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: left;">
<span style="font-size: large;">Son olarak ise @Configuration sınıfımızda;</span></div>
<div style="text-align: left;">
<span style="background-color: white; color: #24292e; font-family: , "blinkmacsystemfont" , "segoe ui" , "helvetica" , "arial" , sans-serif , "apple color emoji" , "segoe ui emoji" , "segoe ui symbol"; font-size: 16px; text-align: left;">AutoJsonRpcServiceImplExporter</span><span style="background-color: white; color: #24292e; font-family: , "blinkmacsystemfont" , "segoe ui" , "helvetica" , "arial" , sans-serif , "apple color emoji" , "segoe ui emoji" , "segoe ui symbol"; font-size: 16px; text-align: left;"> </span><span style="font-size: large;"> <b>bean </b>tanımlamalıyız.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; color: #24292e; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 13.6px; line-height: 1.45; overflow: auto; padding: 16px; word-break: normal; word-wrap: normal;"><span class="pl-k" style="box-sizing: border-box; color: #d73a49;">import</span> <span class="pl-smi" style="box-sizing: border-box;">com.googlecode.jsonrpc4j.spring.AutoJsonRpcServiceImplExporter</span>;
<span class="pl-k" style="box-sizing: border-box; color: #d73a49;">import</span> <span class="pl-smi" style="box-sizing: border-box;">org.springframework.context.annotation.Bean</span>;
<span class="pl-k" style="box-sizing: border-box; color: #d73a49;">import</span> <span class="pl-smi" style="box-sizing: border-box;">org.springframework.context.annotation.Configuration</span>;
<span class="pl-k" style="box-sizing: border-box; color: #d73a49;">@Configuration</span>
<span class="pl-k" style="box-sizing: border-box; color: #d73a49;">public</span> <span class="pl-k" style="box-sizing: border-box; color: #d73a49;">class</span> <span class="pl-en" style="box-sizing: border-box; color: #6f42c1;">ApplicationConfig</span> {
<span class="pl-k" style="box-sizing: border-box; color: #d73a49;">@Bean</span>
<span class="pl-k" style="box-sizing: border-box; color: #d73a49;">public</span> <span class="pl-k" style="box-sizing: border-box; color: #d73a49;">static</span> <span class="pl-smi" style="box-sizing: border-box;">AutoJsonRpcServiceImplExporter</span> <span class="pl-en" style="box-sizing: border-box; color: #6f42c1;">autoJsonRpcServiceImplExporter</span>() {
<span class="pl-smi" style="box-sizing: border-box;">AutoJsonRpcServiceImplExporter</span> exp <span class="pl-k" style="box-sizing: border-box; color: #d73a49;">=</span> <span class="pl-k" style="box-sizing: border-box; color: #d73a49;">new</span> <span class="pl-smi" style="box-sizing: border-box;">AutoJsonRpcServiceImplExporter</span>();
<span class="pl-c" style="box-sizing: border-box; color: #6a737d;"><span class="pl-c" style="box-sizing: border-box;">//</span>in here you can provide custom HTTP status code providers etc. eg:</span>
<span class="pl-c" style="box-sizing: border-box; color: #6a737d;"><span class="pl-c" style="box-sizing: border-box;">//</span>exp.setHttpStatusCodeProvider();</span>
<span class="pl-c" style="box-sizing: border-box; color: #6a737d;"><span class="pl-c" style="box-sizing: border-box;">//</span>exp.setErrorResolver();</span>
<span class="pl-k" style="box-sizing: border-box; color: #d73a49;">return</span> exp;
}
}</pre>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;">JSON-RPC sunucumuz hazır, uygulamayı çalıştırdıktan sonra bir başka uygulama ile sunucuya bağlanıp tanımladığımız her iki metodu çağırabiliriz. Bunun için aşağıdaki python koduna göz atalım.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; line-height: 1.45; overflow: auto; padding: 16px; word-break: normal; word-wrap: normal;"><span style="color: #d73a49; font-family: , "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;">import json
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
data = {}
data['jsonrpc'] = '2.0'
data['id'] = '1'
data['method'] = "multiplier" // cagrilacak metod ismi
params={}
params['a'] = 5
params['b'] = 7
data['params'] = params
json_data = json.dumps(data)
headers = {'Content-type': 'application/json', 'Accept': 'application/json'}
r = requests.post('http://localhost:8080/utility', data=json.dumps(data), verify=False, headers=headers)
answer = r.text</span></span></pre>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="background-color: #f6f8fa; color: #d73a49; font-family: , "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 13.6px; text-align: left;">http://localhost:8080/utility </span><span style="font-size: large; text-align: left;">adresine <b>json_data</b> post ediyoruz. json_data nın içeriğine bakacak olursanız, method = multiplier ve a=5, b=7 parametreleri ile ilgili metodu çağırıyoruz. İsteğimize dönen cevap;</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKc__2cR-5tSAFY6WjqSenmZCfGKqNVSY8OEI9vxPrNKPj_1F6ePsbLqMq9czxZ0J9_Dm1fpnOWfI2le-EmFWZSqBG_Lro_pVU5nYnnER8ASzVQscGaDSUBEgGCwk_FeGmiSVjoqeM2Nw/s1600/answer1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="29" data-original-width="279" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKc__2cR-5tSAFY6WjqSenmZCfGKqNVSY8OEI9vxPrNKPj_1F6ePsbLqMq9czxZ0J9_Dm1fpnOWfI2le-EmFWZSqBG_Lro_pVU5nYnnER8ASzVQscGaDSUBEgGCwk_FeGmiSVjoqeM2Nw/s1600/answer1.PNG" /></a></div>
<div style="text-align: justify;">
<span style="font-size: large; text-align: left;"><b>stringJoin </b>metodunu çağırmak için ilgili python kodu ve isteğimize dönen cevap ise aşağıdaki gibi olacaktır.</span></div>
<pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; line-height: 1.45; overflow: auto; padding: 16px; word-break: normal; word-wrap: normal;"><span style="color: #d73a49; font-family: , "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;">data = {}
data['jsonrpc'] = '2.0'
data['id'] = '1'
data['method'] = "stringJoin"
params={}
params['str'] = ["Bilinmez","neleri","getirir","zaman"]
params['b'] = ","
data['params'] = params
json_data = json.dumps(data)
headers = {'Content-type': 'application/json', 'Accept': 'application/json'}
r = requests.post('http://localhost:8080/utility', data=json.dumps(data), verify=False, headers=headers)
answer = r.text</span></span></pre>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN9fLi1NchU63ge3dXqQpxzIFFS8dYNtEWoSupXR1PT194aQAJ5omoAEOGFn-x22MToVcaFtm77rfFZ8qTGtCOhiO09DfM5iNMTACVp0MIFBf95-yvAvgddHVFYTZ7G90Su0U68pLcm3w/s1600/answer2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="29" data-original-width="481" height="36" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN9fLi1NchU63ge3dXqQpxzIFFS8dYNtEWoSupXR1PT194aQAJ5omoAEOGFn-x22MToVcaFtm77rfFZ8qTGtCOhiO09DfM5iNMTACVp0MIFBf95-yvAvgddHVFYTZ7G90Su0U68pLcm3w/s640/answer2.PNG" width="640" /></a></div>
<div style="text-align: justify;">
<span style="font-size: large; text-align: left;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large; text-align: left;">Son olarak <i>json </i>formatında dönen cevabı kolayca Python <i>dictionary </i>'e çevirip (<i>decode </i>edip) dönen cevabı şu şekilde çekebiliriz.</span></div>
<pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; line-height: 1.45; overflow: auto; padding: 16px; word-break: normal; word-wrap: normal;"><span style="color: #d73a49; font-family: , "consolas" , "liberation mono" , "menlo" , "courier" , monospace;"><span style="font-size: 13.6px;">answer = json.loads(answer)
result = answer['result']</span></span></pre>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs-mwEN-0l2cqJJZ-MtSxIccpQ7t6xzPSdC9mop8h0LkTU47PWrWkZcLf774dRIo3LmJ0m0tgB0nCWvzPqf0Mkef6MMP9uv1JvfnTaAE5eyM0W4bSwz1GlywPx2jw6NEWOB6ADqXUMtYE/s1600/result.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="28" data-original-width="389" height="23" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs-mwEN-0l2cqJJZ-MtSxIccpQ7t6xzPSdC9mop8h0LkTU47PWrWkZcLf774dRIo3LmJ0m0tgB0nCWvzPqf0Mkef6MMP9uv1JvfnTaAE5eyM0W4bSwz1GlywPx2jw6NEWOB6ADqXUMtYE/s320/result.PNG" width="320" /></a></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: large;"><i>Bir yazının daha sonuna geldik, umarım ilgili kişilere bir faydamız dokunur. </i></span></div>
<div style="text-align: justify;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: large;"><i style="background-color: #fefdfa; color: #333333; text-align: left;">Her türlü görüş, öneri ve sorularınızı iletebilirsiniz...</i></span></div>
</div>
İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com0tag:blogger.com,1999:blog-2739106657175580544.post-9848826167499521952018-01-28T10:15:00.001-08:002019-03-06T02:17:20.538-08:00Learn Computer Vision with OpenCV and Python<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
<div style="background-color: white; box-sizing: border-box; color: #29303b; font-family: arial, "helvetica neue", helvetica, tahoma, sans-serif; margin-bottom: 16px; padding: 0px;">
<span style="font-size: large;">I have prepared a course to teach computer vision & image processing from scratch. </span><span style="font-size: large;">In this course, y</span><span style="font-size: large;">ou will find special examples beside the fundamental topics. </span><span style="font-size: large;">I preferred to use OpenCV which is an open source computer vision library used and supported by many people!. And I have used OpenCV with Python, because Python allows us to focus on the problem easily without spending time for programming syntax/complex codes.</span></div>
<div style="background-color: white; box-sizing: border-box; color: #29303b; font-family: arial, "helvetica neue", helvetica, tahoma, sans-serif; margin-bottom: 16px; padding: 0px;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiChp2dBvd-_pce7POOWW2W297HSADvLNB8v_Jlv10zWgfExso6aghmOtWDqWyuJzrFJy3-0L_bTrGkG0MB5_xqXeNy3EFLgyp7WQ0gpOzSdgRrDWt49pQS9A3qfX2TO0Kkv05ssLyDgUc/s1600/learnCV.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="607" data-original-width="1053" height="230" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiChp2dBvd-_pce7POOWW2W297HSADvLNB8v_Jlv10zWgfExso6aghmOtWDqWyuJzrFJy3-0L_bTrGkG0MB5_xqXeNy3EFLgyp7WQ0gpOzSdgRrDWt49pQS9A3qfX2TO0Kkv05ssLyDgUc/s400/learnCV.PNG" width="400" /></a></div>
</div>
<div class="separator" style="background-color: #fefdfa; clear: both; color: #333333; font-family: arial, tahoma, helvetica, freesans, sans-serif; text-align: center;">
</div>
<div class="separator" style="background-color: #fefdfa; clear: both; color: #333333; font-family: arial, tahoma, helvetica, freesans, sans-serif; text-align: center;">
</div>
<a name='more'></a><div style="background-color: #fefdfa;">
<br /></div>
<div style="background-color: #fefdfa;">
<br /></div>
<div style="background-color: white; box-sizing: border-box; margin-bottom: 16px; padding: 0px;">
<div style="color: #29303b; font-family: arial, "helvetica neue", helvetica, tahoma, sans-serif;">
<span style="font-size: large; font-weight: 700;">Note: </span><i><span style="font-size: large;">Below</span></i><i><span style="font-size: large;"> you can find some figures/videos about the lectures. Also new videos will be added and course content will expand</span></i></div>
<div style="color: #29303b; font-family: arial, "helvetica neue", helvetica, tahoma, sans-serif;">
<i><span style="font-size: large;"><br /></span></i>
<span style="font-size: large;"><i>Coupon Codes : </i></span><b style="font-size: x-large; font-style: italic;">CV2019 </b><b style="font-size: x-large; font-style: italic;">(**<u>for discount</u>**)</b></div>
<div>
<i style="color: #29303b; font-family: arial, "helvetica neue", helvetica, tahoma, sans-serif;"><span style="font-size: large;"><br /></span></i><span style="color: #29303b; font-family: "arial" , "helvetica neue" , "helvetica" , "tahoma" , sans-serif;"><i><a href="https://www.udemy.com/learn-computer-vision-with-opencv-and-python/?couponCode=CV2019">https://www.udemy.com/learn-computer-vision-with-opencv-and-python/?couponCode=CV2019</a></i></span></div>
<div style="color: #29303b; font-family: arial, "helvetica neue", helvetica, tahoma, sans-serif;">
<i><span style="font-size: large;"><br /></span></i>
<span style="box-sizing: border-box; font-weight: 700;"><span style="font-size: large;">You will learn the topics:</span></span></div>
</div>
<ul style="background-color: white; box-sizing: border-box; list-style-image: initial; list-style-position: initial; margin: 0px 0px 16px 24px; padding: 0px; text-align: start;">
<li style="box-sizing: border-box; color: #29303b; font-family: Arial, 'Helvetica Neue', Helvetica, Tahoma, sans-serif; text-align: left;"><span style="font-size: large;">The key concepts of computer Vision & OpenCV</span></li>
<li style="box-sizing: border-box; color: #29303b; font-family: Arial, 'Helvetica Neue', Helvetica, Tahoma, sans-serif; text-align: left;"><span style="font-size: large;">Basic operations: histogram equalization,thresholding, convolution, edge detection, sharpening ,morphological operations, image pyramids.</span></li>
<li style="box-sizing: border-box; text-align: left;"><span style="font-size: large;"><span style="color: #29303b; font-family: "arial" , "helvetica neue" , "helvetica" , "tahoma" , sans-serif;">Keypoints and key point matching</span></span></li>
</ul>
<div class="separator" style="background-color: #fefdfa; clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqx1UZJMk64VL_3TG25cpk7geuybYgwZBENW6y6tfVVbHCy89yv4e6F-G0qHP0zMBG5batZch3jTSR0P1IEarH7CNrAqOgBlyjAM6qP3OQ0J5l68Sui5nHtdtwipcDpJR0wvCbgJZrRWY/s1600/kpmatch.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="476" data-original-width="635" height="149" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqx1UZJMk64VL_3TG25cpk7geuybYgwZBENW6y6tfVVbHCy89yv4e6F-G0qHP0zMBG5batZch3jTSR0P1IEarH7CNrAqOgBlyjAM6qP3OQ0J5l68Sui5nHtdtwipcDpJR0wvCbgJZrRWY/s200/kpmatch.png" width="200" /></a></div>
<div style="background-color: #fefdfa; text-align: left;">
<span style="color: #29303b; font-family: "arial" , "helvetica neue" , "helvetica" , "tahoma" , sans-serif; font-size: large;"><br /></span></div>
<ul style="background-color: white; box-sizing: border-box; list-style-image: initial; list-style-position: initial; margin: 0px 0px 16px 24px; padding: 0px; text-align: start;">
<li style="box-sizing: border-box; color: #29303b; font-family: Arial, 'Helvetica Neue', Helvetica, Tahoma, sans-serif; text-align: left;"><span style="font-size: large;">Special App : mini game by using key points</span></li>
</ul>
<div class="separator" style="background-color: #fefdfa; clear: both; text-align: center;">
</div>
<div style="background-color: #fefdfa; text-align: left;">
<span style="color: #29303b; font-family: "arial" , "helvetica neue" , "helvetica" , "tahoma" , sans-serif; font-size: large;"><a href="https://twitter.com/ibrahimd25/status/896419043216957442" target="_blank">https://twitter.com/ibrahimd25/status/896419043216957442</a></span><br />
<span style="color: #29303b; font-family: "arial" , "helvetica neue" , "helvetica" , "tahoma" , sans-serif; font-size: large;"><br /></span></div>
<ul style="background-color: white; box-sizing: border-box; color: #29303b; font-family: arial, "helvetica neue", helvetica, tahoma, sans-serif; margin: 0px 0px 16px 24px; padding: 0px;">
<li style="box-sizing: border-box; text-align: left;"><span style="font-size: large;">Image segmentation: segmentation and contours, contour properties, line detection, circle detection, blob detection, watershed segmentation.</span></li>
</ul>
<div class="separator" style="background-color: #fefdfa; clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8LxEB-cuC45HYtO5iSocky7sxYhHtq3uxidTDYnHwM8o_uGa3EBin7QundlUFcc4JmUqmw1DD1HzQwI3YZowSxF9pvkLGlkqbGR7TWAnBnJMBWtHveRbX4sjGgQMplMHRnwTmNnFO4GU/s1600/watershed.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="422" data-original-width="451" height="186" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8LxEB-cuC45HYtO5iSocky7sxYhHtq3uxidTDYnHwM8o_uGa3EBin7QundlUFcc4JmUqmw1DD1HzQwI3YZowSxF9pvkLGlkqbGR7TWAnBnJMBWtHveRbX4sjGgQMplMHRnwTmNnFO4GU/s200/watershed.png" width="200" /></a></div>
<ul style="background-color: white; box-sizing: border-box; color: #29303b; font-family: arial, "helvetica neue", helvetica, tahoma, sans-serif; margin: 0px 0px 16px 24px; padding: 0px;">
<li style="box-sizing: border-box; text-align: left;"><span style="font-size: large;">Special App: People counter </span></li>
</ul>
<div class="separator" style="background-color: #fefdfa; clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxFpuatx2nlpGvb68hrAUka19ym7PBjM3giuj_3SBPfTfYr2zyF69IFgWhnrrA1uc5kua6EyzQiECWIViEToAKfPLkf0O_3MSAkbGBfzu-b9aNmBazvhBWclzAyJJV4nOe2fO6PWxIjmU/s1600/people+count.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="476" data-original-width="621" height="245" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxFpuatx2nlpGvb68hrAUka19ym7PBjM3giuj_3SBPfTfYr2zyF69IFgWhnrrA1uc5kua6EyzQiECWIViEToAKfPLkf0O_3MSAkbGBfzu-b9aNmBazvhBWclzAyJJV4nOe2fO6PWxIjmU/s320/people+count.png" width="320" /></a></div>
<div style="background-color: #fefdfa; text-align: left;">
<span style="color: #29303b; font-family: "arial" , "helvetica neue" , "helvetica" , "tahoma" , sans-serif; font-size: large;"><br /></span></div>
<ul style="background-color: white; box-sizing: border-box; color: #29303b; font-family: arial, "helvetica neue", helvetica, tahoma, sans-serif; margin: 0px 0px 16px 24px; padding: 0px;">
<li style="box-sizing: border-box; text-align: left;"><span style="font-size: large;">Object tracking:Tracking APIs, Filtering by Color.</span></li>
</ul>
<div class="separator" style="background-color: #fefdfa; clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dyyx5zLD6i6Jmf_j5eEnpPqiy1XCZZXidBihblgHuv2D5w7dqZzly0Lt-n2zcOsFvQiulJ0rXQlohxSNU1K' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div>
<div style="background-color: #fefdfa; text-align: left;">
<span style="color: #29303b; font-family: "arial" , "helvetica neue" , "helvetica" , "tahoma" , sans-serif; font-size: large;"><br /></span></div>
<div class="separator" style="background-color: #fefdfa; clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dyx_N8YQmhD0kmG2CRkYv9wua7fEpUGwcdxaeKo68tCP4UBSi6pT6rzTNlL9rfeC2CAP1iwtlsBQAt5zf4rGQ' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div>
<div style="background-color: #fefdfa; text-align: left;">
<span style="color: #29303b; font-family: "arial" , "helvetica neue" , "helvetica" , "tahoma" , sans-serif; font-size: large;"><br /></span></div>
<ul style="background-color: white; box-sizing: border-box; color: #29303b; font-family: arial, "helvetica neue", helvetica, tahoma, sans-serif; margin: 0px 0px 16px 24px; padding: 0px;">
<li style="box-sizing: border-box; text-align: left;"><span style="font-size: large;">Special App: Tracking of moving objectT</span></li>
</ul>
<div class="separator" style="background-color: #fefdfa; clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dzazZReU4pjgMEj2l8RayGhHFVx5Y3YSWsk47FEoC96A4KAiY473FKPkrqzs0mPOXJ4eTzUTSbLdCnOzB2OAQ' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div>
<ul style="background-color: white; box-sizing: border-box; color: #29303b; font-family: arial, "helvetica neue", helvetica, tahoma, sans-serif; margin: 0px 0px 16px 24px; padding: 0px;">
<li style="box-sizing: border-box; text-align: left;"><span style="font-size: large;">Object detection: haarcascade face and eye detection, HOG pedestrian detection</span></li>
</ul>
<div class="separator" style="background-color: #fefdfa; clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-hDKLnFzx2kGSrUMx9q6O8FPQyiwgEn7RoIJvwq-EAz-kwNnpS2P1e91cnnoj21qLxWMm_xgXNyqwP3JP_m-dg_ThsN274j7n6zizKoqQ37XVr-J_EmC1ootbcvoplfeyjedYGx9bXkA/s1600/pedestrian+detection.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="451" data-original-width="1187" height="121" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-hDKLnFzx2kGSrUMx9q6O8FPQyiwgEn7RoIJvwq-EAz-kwNnpS2P1e91cnnoj21qLxWMm_xgXNyqwP3JP_m-dg_ThsN274j7n6zizKoqQ37XVr-J_EmC1ootbcvoplfeyjedYGx9bXkA/s320/pedestrian+detection.png" width="320" /></a></div>
<div style="background-color: #fefdfa; text-align: left;">
<span style="color: #29303b; font-family: "arial" , "helvetica neue" , "helvetica" , "tahoma" , sans-serif; font-size: large;"><br /></span></div>
<ul style="background-color: white; box-sizing: border-box; color: #29303b; font-family: arial, "helvetica neue", helvetica, tahoma, sans-serif; margin: 0px 0px 16px 24px; padding: 0px;">
<li style="box-sizing: border-box; text-align: left;"><span style="font-size: large;">Object detection with Deep Learning</span></li>
</ul>
<div class="separator" style="background-color: #fefdfa; clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirLFmbQRJ4sgAieSb0JPKmJ9U5DiZq647LHyKJBuO2EKLtypMjlWGEKqvnucCzaMDbJvYxkAxNCQ_3rI37R48ICJzguIprYaOcSDv6GBu1VBRp3cPJCDfEWa-dQGLPpn75oEhDJ6sjHRQ/s1600/dnn2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="318" data-original-width="294" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirLFmbQRJ4sgAieSb0JPKmJ9U5DiZq647LHyKJBuO2EKLtypMjlWGEKqvnucCzaMDbJvYxkAxNCQ_3rI37R48ICJzguIprYaOcSDv6GBu1VBRp3cPJCDfEWa-dQGLPpn75oEhDJ6sjHRQ/s1600/dnn2.png" /></a></div>
<div style="background-color: #fefdfa;">
<br /></div>
<div class="separator" style="background-color: #fefdfa; clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEic7Hihm-D1Q23Jmmy0vLb4qI5wcaKH66It-CSyj8IyUypiM0aJB6bbVg4JAB79WB_YS2YHD1_i9utSYg01tgtVJp5WsKj1J0MiyaEOxCGhlKwAOGKMS4Uq8AimAism5VM2dABaXPs8MIY/s1600/dnn3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="318" data-original-width="299" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEic7Hihm-D1Q23Jmmy0vLb4qI5wcaKH66It-CSyj8IyUypiM0aJB6bbVg4JAB79WB_YS2YHD1_i9utSYg01tgtVJp5WsKj1J0MiyaEOxCGhlKwAOGKMS4Uq8AimAism5VM2dABaXPs8MIY/s1600/dnn3.png" /></a></div>
<div style="text-align: left;">
<div style="background-color: #fefdfa;">
<span style="color: #29303b; font-family: "arial" , "helvetica neue" , "helvetica" , "tahoma" , sans-serif; font-size: large;"></span><br /></div>
<div style="background-color: #fefdfa;">
<span style="color: #29303b; font-family: "arial" , "helvetica neue" , "helvetica" , "tahoma" , sans-serif;"><br /></span></div>
<div style="background-color: #fefdfa;">
<ul style="background-color: white; box-sizing: border-box; color: #29303b; font-family: arial, "helvetica neue", helvetica, tahoma, sans-serif; margin: 0px 0px 16px 24px; padding: 0px; text-align: justify;">
<li style="box-sizing: border-box; text-align: left;"><span style="font-size: large;">Create dataset, Train and Test Deep Learning Model</span></li>
</ul>
<div>
<span style="color: #29303b; font-family: "arial" , "helvetica neue" , "helvetica" , "tahoma" , sans-serif; font-size: large;"><a href="https://twitter.com/ibrahimd25/status/1000688753122463744" target="_blank">https://twitter.com/ibrahimd25/status/1000688753122463744</a></span></div>
<div>
<br /></div>
<ul style="background-color: white; box-sizing: border-box; color: #29303b; font-family: arial, "helvetica neue", helvetica, tahoma, sans-serif; margin: 0px 0px 16px 24px; padding: 0px; text-align: justify;">
<li style="box-sizing: border-box; text-align: left;"><span style="font-size: large;">Facial Landmark smiling detection</span></li>
</ul>
<div>
<span style="color: #29303b; font-family: "arial" , "helvetica neue" , "helvetica" , "tahoma" , sans-serif; font-size: large;"><a href="https://twitter.com/ibrahimd25/status/1005552714414198789" target="_blank">https://twitter.com/ibrahimd25/status/1005552714414198789</a></span></div>
<div>
<br /></div>
<ul style="background-color: white; box-sizing: border-box; color: #29303b; font-family: arial, "helvetica neue", helvetica, tahoma, sans-serif; margin: 0px 0px 16px 24px; padding: 0px; text-align: justify;">
<li style="box-sizing: border-box; text-align: left;"><span style="font-size: large;">Facial Landmark sleeping detection</span></li>
</ul>
<div>
<span style="color: #29303b; font-family: "arial" , "helvetica neue" , "helvetica" , "tahoma" , sans-serif; font-size: large;"><a href="https://twitter.com/ibrahimd25/status/1005520825150255104" target="_blank">https://twitter.com/ibrahimd25/status/1005520825150255104</a></span></div>
<div style="text-align: justify;">
<br /></div>
</div>
<div style="text-align: justify;">
<ul style="background-color: white; box-sizing: border-box; color: #29303b; font-family: arial, "helvetica neue", helvetica, tahoma, sans-serif; margin: 0px 0px 16px 24px; padding: 0px;">
<li style="box-sizing: border-box; text-align: left;"><span style="font-size: large;">Missing and abandoned object detection</span></li>
</ul>
<div style="background-color: #fefdfa;">
<span style="color: #29303b; font-family: "arial" , "helvetica neue" , "helvetica" , "tahoma" , sans-serif; font-size: large;"><a href="https://twitter.com/ibrahimd25/status/1000686598588116995" target="_blank">https://twitter.com/ibrahimd25/status/1000686598588116995</a></span></div>
<div style="background-color: #fefdfa;">
<br /></div>
<div>
<ul style="background-color: white; box-sizing: border-box; color: #29303b; font-family: arial, "helvetica neue", helvetica, tahoma, sans-serif; margin: 0px 0px 16px 24px; padding: 0px;">
<li style="box-sizing: border-box; text-align: left;"><span style="font-size: large;">Soccer players detection</span></li>
</ul>
<div style="text-align: left;">
<div style="background-color: #fefdfa;">
<span style="color: #29303b; font-family: "arial" , "helvetica neue" , "helvetica" , "tahoma" , sans-serif; font-size: large;"><a href="https://twitter.com/ibrahimd25/status/1000684933277417472" target="_blank">https://twitter.com/ibrahimd25/status/1000684933277417472</a></span></div>
<div style="background-color: #fefdfa; color: black; font-family: "times new roman"; font-size: medium; font-style: normal; font-weight: 400; letter-spacing: normal; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">
</div>
<div style="background-color: #fefdfa;">
<br /></div>
<ul style="background-color: white; box-sizing: border-box; color: #29303b; font-family: arial, "helvetica neue", helvetica, tahoma, sans-serif; font-size: medium; font-style: normal; font-weight: 400; letter-spacing: normal; margin: 0px 0px 16px 24px; padding: 0px; text-align: justify; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">
<li style="box-sizing: border-box; text-align: left;"><span style="font-size: large;">Deep learning based object detection API with Flask</span></li>
</ul>
<div style="background-color: #fefdfa;">
<span style="font-size: large;"><a href="https://twitter.com/ibrahimd25/status/1030530580637777922" target="_blank">https://twitter.com/ibrahimd25/status/1030530580637777922</a></span></div>
<div style="background-color: #fefdfa; color: black; font-family: "times new roman"; font-style: normal; font-weight: 400; letter-spacing: normal; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">
</div>
<div style="background-color: #fefdfa;">
<br /></div>
<ul style="background-color: white; box-sizing: border-box; color: #29303b; font-family: arial, "helvetica neue", helvetica, tahoma, sans-serif; font-style: normal; font-weight: 400; letter-spacing: normal; margin: 0px 0px 16px 24px; padding: 0px; text-align: justify; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">
<li style="box-sizing: border-box; text-align: left;"><span style="font-size: large;">Search object with sliding window and eliminate overlapping bounding boxes</span></li>
</ul>
<div style="background-color: #fefdfa;">
<span style="background-color: white; color: #29303b; font-family: "arial" , "helvetica neue" , "helvetica" , "tahoma" , sans-serif;"><span style="font-size: large;"><a href="https://twitter.com/ibrahimd25/status/1058065467024269315" target="_blank">https://twitter.com/ibrahimd25/status/1058065467024269315</a></span></span></div>
<div style="background-color: #fefdfa;">
<span style="background-color: white; color: #29303b; font-family: "arial" , "helvetica neue" , "helvetica" , "tahoma" , sans-serif;"><br /></span>
<span style="background-color: white; color: #29303b; font-family: "arial" , "helvetica neue" , "helvetica" , "tahoma" , sans-serif;"></span></div>
<ul style="background-color: white; box-sizing: border-box; color: #29303b; font-family: arial, "helvetica neue", helvetica, tahoma, sans-serif; margin: 0px 0px 16px 24px; padding: 0px; text-align: justify;">
<li style="box-sizing: border-box; text-align: left;"><span style="font-size: large;">Learn how to code to play dino runner with your hand movements</span></li>
</ul>
<div style="background-color: #fefdfa;">
<span style="background-color: white; color: #29303b; font-family: "arial" , "helvetica neue" , "helvetica" , "tahoma" , sans-serif; font-size: large;"><a href="https://twitter.com/ibrahimd25/status/1059520531245027328" target="_blank">https://twitter.com/ibrahimd25/status/1059520531245027328</a></span></div>
<div style="background-color: #fefdfa;">
<br /></div>
<ul style="background-color: white; box-sizing: border-box; color: #29303b; font-family: arial, "helvetica neue", helvetica, tahoma, sans-serif; margin: 0px 0px 16px 24px; padding: 0px; text-align: justify;">
<li style="box-sizing: border-box; text-align: left;"><span style="font-size: large;">Head angle detection</span></li>
</ul>
<div style="background-color: #fefdfa;">
<span style="font-size: large;"><a href="https://twitter.com/ibrahimd25/status/1063505870527582213" target="_blank">https://twitter.com/ibrahimd25/status/1063505870527582213</a></span></div>
<div style="background-color: #fefdfa;">
<br /></div>
<ul style="background-color: white; box-sizing: border-box; color: #29303b; font-family: arial, "helvetica neue", helvetica, tahoma, sans-serif; margin: 0px 0px 16px 24px; padding: 0px; text-align: justify;">
<li style="box-sizing: border-box; text-align: left;"><span style="font-size: large;">Detect if you are wearing a hat or not!</span></li>
</ul>
<div style="background-color: #fefdfa;">
<span style="font-size: large;"><a href="https://twitter.com/ibrahimd25/status/1076580159891873794">https://twitter.com/ibrahimd25/status/1076580159891873794</a></span></div>
<div style="background-color: #fefdfa;">
<br /></div>
<ul style="box-sizing: border-box; font-family: arial, "helvetica neue", helvetica, tahoma, sans-serif; margin: 0px 0px 16px 24px; padding: 0px; text-align: justify;">
<li style="box-sizing: border-box; text-align: left;"><span style="font-size: large;"><span style="color: #29303b;"><span style="background-color: white;">Skin detection</span></span></span></li>
</ul>
<a href="https://twitter.com/ibrahimd25/status/1103012031563792385" target="_blank"><span style="font-size: large;">https://twitter.com/ibrahimd25/status/1103012031563792385</span></a><br />
<div style="background-color: #fefdfa;">
<br /></div>
<div style="background-color: #fefdfa;">
<br /></div>
<div style="background-color: #fefdfa;">
<br /></div>
<div style="background-color: #fefdfa;">
<br /></div>
</div>
</div>
</div>
</div>
</div>
</div>
İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com3tag:blogger.com,1999:blog-2739106657175580544.post-90045146189960374432017-12-22T00:50:00.000-08:002017-12-22T01:29:33.653-08:00C++ - Dizide lokal maksimum/minimum değerlerinin bulunması<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: large;">Bu yazı kapsamında bir dizi içerisindeki değerlerin lokal maksimum/minimum noktalarını bulan algoritmayı açıklayıp, C++ ile implementasyonunu gerçekleştireceğiz. OpenCV ile hareket tespiti, takibi ve yapılan hareketin tanınmasına yönelik hobi amaçlı gerçekleştirdiğim bir proje dahilinde böyle bir ihtiyaç ortaya çıktı ve ben de projenin bu kısmını paylaşmak istedim. Örneğin şöyle bir dizimiz olduğunu farzedelim ve bu dizinin değerlerini grafik üzerinde gösterelim.</span></div>
<div style="text-align: justify;">
<span style="font-size: large;"></span><br />
<a name='more'></a><span style="font-size: large;"><br /></span></div>
<pre style="-webkit-transition: none !important; background-color: #f6f6f6; border-bottom-left-radius: 0px; border-bottom-right-radius: 0px; border-top-left-radius: 0px; border-top-right-radius: 0px; border: none; box-sizing: border-box; color: #404040; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 13px; line-height: 1.42; overflow: auto; padding: 0px; text-align: justify; transition: none !important; word-break: normal; word-wrap: normal;">data = [3 8 15 5 6 10 10 3 1 20 7];</pre>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiViO1j0v4akvo1FMTTaGaK3nnGCL1zPsW8YApqD92YthzcPWpXliE3_ZBOMPUK9PWQwlBPWmzy0qkdlgCIV0wszbK17FLK1bPsw5X-w31utXx7qBhRPqGMKgqy4DvQTagG37Y5bh_l74/s1600/fig1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="430" data-original-width="568" height="302" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiViO1j0v4akvo1FMTTaGaK3nnGCL1zPsW8YApqD92YthzcPWpXliE3_ZBOMPUK9PWQwlBPWmzy0qkdlgCIV0wszbK17FLK1bPsw5X-w31utXx7qBhRPqGMKgqy4DvQTagG37Y5bh_l74/s400/fig1.PNG" width="400" /></a></div>
<br /></div>
<div style="text-align: justify;">
<span style="font-size: large;">Bu dizideki lokal maksimum değerler: 15, 10 ve 20 değerleridir, diyebiliriz. Aslında lokal maksimum ya da lokal minimum noktalarını tepe noktası olarak da isimlendirebiliriz. Tepe noktasını tanımlayacak olursak, dizideki değerlerin artıştan azalışa veyahut da azalıştan artışa geçtiği noktalardır. </span></div>
<div style="text-align: justify;">
<span style="font-size: large;"> Yukarıdaki örnek veri için tepe noktaları 15,10 ve 20'dir dedim. Fakat burada aslında görece bir durum söz konusu. Yani sadece 15 veya 20 değerleri de bizim için tepe noktaları olabilirdi. Demek ki bu noktada algoritmamıza bir <b><i>threshold</i></b> değeri belirtmemiz faydalı olacaktır. </span><b style="font-size: x-large;"><i>threshold </i></b><span style="font-size: large;">değeri ile bulmak istediğimiz tepelerin yüksekliklerini belirleyeceğiz. Tepe noktalarını bulacak algoritmamızı yazılı olarak özetledikten sonra ilgili işi yapan kod parçacığını/fonksiyonu aşağıda bulabilirsiniz. </span><br />
<span style="font-size: large;"><br /></span><span style="font-size: large;">İlk olarak dizi üzerinde dolaşıp maksimum ve minimum değerleri bulacağız ve bunları sürekli güncelleyeceğiz. Yani iterasyon dahilinde yeni alınan değer maksimum değerden büyükse bu değer maksimum olarak atanacaktır (minimum için de hakeza tam tersi). Şunu da belirtelim ilk olarak bir lokal maksimum değer arıyoruz, yani ilk lokal maksimum noktamızı bulmadan lokal minimum değer bulmayacağız. Peki bir noktanın lokal maksimum olduğuna nasıl karar vereceğiz? Eğer iterasyon dahilinde üzerinde bulunulan değer, bulunan maksimum değerden en az <b><i>threshold</i></b> değeri kadar küçükse bu nokta bir <b><i>lokal maksimum</i></b>dur. Bu durumu aşağıda grafik üzerinden gösterirsek daha anlaşılır olacaktır.</span></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgW8ya8YLVYo3ZM7piu6Rv_dMvcknnckBWo2nIOa8Vn9FD7FyLwE-MxkCDjFpADVldG1z4dpCq3tQsYpBaD7rYInrrOmL7RDd8OaHUsTmnICC_S_wXzSVtUMg4B_2aUuRqyUxL07NhEfcg/s1600/fig1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="430" data-original-width="568" height="302" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgW8ya8YLVYo3ZM7piu6Rv_dMvcknnckBWo2nIOa8Vn9FD7FyLwE-MxkCDjFpADVldG1z4dpCq3tQsYpBaD7rYInrrOmL7RDd8OaHUsTmnICC_S_wXzSVtUMg4B_2aUuRqyUxL07NhEfcg/s400/fig1.PNG" width="400" /></a></div>
<br />
<span style="font-size: large;">Dolayısıyla bulunmuş bu <b><i>maksimum</i></b> nokta, <b style="font-style: italic;">lokal bir maksimum</b>dur. Bu durumun tersi de yine <i><b>lokal minimum</b></i> değerler için geçerli olacaktır. Bu algoritmada son derece önemli bir nokta ise şu: lokal minimum nokta bulduktan sonra, lokal minimum değeri bulduğumuz nokta (<i>data[i]) ( </i>yani bulunmuş minimum değere göre <b><i>threshold</i></b> değerinden daha büyük bir artışın olduğu nokta) daki değeri, <i>yeni maksimum nokta ve değeri </i>olarak güncelliyoruz. Bunu yapmamızın sebebi, büyük bir lokal maksimum nokta bulduktan sonra, daha küçük olan lokal maksimum noktaları kaçırmak istemememiz. Bu durumun da tam tersi yine lokal minimumlar için geçerli. Algoritmamızın bu kısa sözlü açıklamasının ışığında fonksiyonu inceleyebilirsiniz.</span><br />
<br />
<span style="font-size: large;"></span><br />
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
</div>
<br />
<div style="orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; widows: 2;">
<div style="text-align: justify;">
<div style="text-align: justify; text-indent: 0px;">
<pre style="border: 1px dashed rgb(153, 153, 153); line-height: 14px; margin: 0px; overflow: auto; padding: 5px; text-align: left; width: 653px;">#include<map>
#include<vector>
#include<iostream>
using namespace std;
struct peak
{
unsigned int index;
int value;
peak()
{
}
peak(int ind,int val)
{
index = ind;
value = val;
}
};
map<int, peak> local_peaks(vector<int> vec, int thresh)
{
size_t length = vec.size();
int max = 0, min = 100000;
int maxloc = -1, minloc = -1;
bool lookformax = true;
map<int,peak> max_peaks;
map<int,peak> min_peaks;
for (size_t i = 0; i < length; i++)
{
int current = vec[i];
if (current > max)
{
max = current;
maxloc = i;
}
if (current < min)
{
min = current;
minloc = i;
}
if (lookformax)
{
if (current < (max - thresh))
{
std::cout << "local max: " << max << std::endl;
max_peaks[maxloc] = peak(maxloc, max);
min = current;
minloc = i;
lookformax = false;
}
}
else
{
if (current > (min + thresh))
{
std::cout << "local min: " << min << std::endl;
min_peaks[minloc] = peak(minloc, min);
max = current;
maxloc = i;
lookformax = true;
}
}
}
return max_peaks;
}
int main(int argc, const char * argv[]) {
// insert code here...
vector<int> vec = { 3,4,8,9,22,20,19,18,17,13,14,15,16,17,18,20,25,28,32,35,30,21,20,10,5,2,4,6,7,8,9,28,3,5,2,0 };
//vec = { 3,8,15,5,6,10,10,3,1,20,7 };
auto elem = local_peaks(vec,5);
return 0;
}</pre>
</div>
</div>
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; text-align: justify; text-transform: none; white-space: normal; word-spacing: 0px;">
</div>
</div>
<br /></div>
<div style="text-align: justify;">
<span style="font-size: large;"> <b><i>threshold</i></b> = 5 için</span></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_Ztp8rh2WSzsVdp0ymX3i-1NY-XyJBcvDHSvPgkspa2Sjzv2FYxzjzCN8IiGuLD3MM6_QpzG-wrCC1Cvn68ZENIRMCYdFohhidIaqPCTz-CxbHg6oiFTpsPNmHeWGmVvmGkfTrYu-nWI/s1600/result.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="443" data-original-width="590" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_Ztp8rh2WSzsVdp0ymX3i-1NY-XyJBcvDHSvPgkspa2Sjzv2FYxzjzCN8IiGuLD3MM6_QpzG-wrCC1Cvn68ZENIRMCYdFohhidIaqPCTz-CxbHg6oiFTpsPNmHeWGmVvmGkfTrYu-nWI/s400/result.PNG" width="400" /></a></div>
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"> <b><i>threshold</i></b> = 10 için</span></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7fjDIN5npotckcktlSAXMYLNHv4wG1qqFuxx2Ckk_J7i8UYsK75nHWKBzCjN0TECfwpIFXtbQ_Zk7sKXK3B0PoaNpBflvo6XVeCRIL0JJlS_XzVVEAPqeztAv5T9KI1Y-j4-mWVTCTLc/s1600/result.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="443" data-original-width="590" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7fjDIN5npotckcktlSAXMYLNHv4wG1qqFuxx2Ckk_J7i8UYsK75nHWKBzCjN0TECfwpIFXtbQ_Zk7sKXK3B0PoaNpBflvo6XVeCRIL0JJlS_XzVVEAPqeztAv5T9KI1Y-j4-mWVTCTLc/s400/result.PNG" width="400" /></a></div>
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: justify;">
<i style="background-color: #fefdfa; color: #333333; font-family: "courier new", courier, monospace; font-size: large; text-align: left;">Her türlü görüş, öneri ve sorularınızı iletebilirsiniz...</i></div>
<div style="text-align: justify;">
<span style="font-size: large;"><br /></span></div>
<span style="font-size: large;"><br /></span></div>
İbrahim Delibaşoğluhttp://www.blogger.com/profile/01013883334760017796noreply@blogger.com0