C#中的深度學習(一):使用OpenCV識別硬幣

在本系列文章中,咱們將使用深度神經網絡(DNN)來執行硬幣識別。具體來講,咱們將訓練一個DNN識別圖像中的硬幣。算法

在本文中,咱們將描述一個OpenCV應用程序,它將檢測圖像中的硬幣。硬幣檢測是硬幣完整識別以前的一個常見階段。它包括從給定圖像中檢測和提取硬幣。c#

圖片1.png

本系列附帶的代碼將使用Keras在C#中實現。在本系列的最後一篇文章中,咱們將簡要地使用ML.NET。在衆多選擇中,爲何要使用Keras.NET呢?Keras.NET 很是容易學習,由於它基本上是從Python編寫的經典TensorFlow到C#的直接映射。對於不熟悉機器學習的讀者來講,這比用其餘方法建立示例要容易得多。bash

硬幣檢測過程分爲三個階段:網絡

  1. 轉換圖像到灰度。顏色增長了檢測任務的複雜性,並且在不少狀況下,它們不能傳遞任何能夠從圖像亮度中獲取的相關信息。
  2. 應用高斯模糊。由於硬幣一般包含一個內圓,咱們應用這個變換來模糊圖像。這確保了任何內圓被下一步中的操做忽略,因此咱們的算法不會意外地認爲它們是一個單獨的硬幣。
  3. 應用霍夫變換。這是爲了檢測圓形。

首先,讓咱們在Visual Studio Community 2019中建立一個.net Framework 4.7.2控制檯應用程序。咱們將把咱們的解決方案和項目命名爲「CoinRecognitionExample」,並在其中建立一個Detection文件夾,建立一個CoinDetector類。機器學習

圖片2.png

咱們將使用OpenCVSharp,因此咱們能夠繼續在Visual Studio中從Nuget包管理器安裝依賴項。要作到這一點,請點擊Tools Nuget Package Manager.ide

咱們能夠看到須要安裝OpenCVSharp的依賴項。函數

圖片3.png

具體的實現發生在CoinDetector類中:學習

public class CoinDetector
  {
      private Mat _image;
      private Mat _originalImage;
      private string _pathToFile;

      public CoinDetector(string pathToFile)
      {
          _pathToFile = pathToFile;
      }

      public void ImagePreprocessing()
      {
          _image = new Mat(_pathToFile, ImreadModes.Color);
          _originalImage = _image.Clone();
          TransformGrayScale();
          TransformGaussianBlur();
          HoughSegmentation();
      }

      private void TransformGrayScale()
      {
          _image = _originalImage.CvtColor(ColorConversionCodes.BGR2GRAY);
          new Window("Grayed Coins", WindowMode.Normal, _image);
          Cv2.WaitKey();
      }

      private void TransformGaussianBlur()
      {
          Cv2.GaussianBlur(_image, _image, new Size(0, 0), 1);
          new Window("Blurred Coins", WindowMode.Normal, _image);
          //Cv2.WaitKey();
      }

      private void HoughSegmentation()
      {
          Mat result = _image.Clone();

          var circleSegments = Cv2.HoughCircles(_image, HoughMethods.Gradient, 1.02, 40);
          for (int i = 0; i < circleSegments.Length; i++)
          {
              Cv2.Circle(result, (Point) circleSegments[i].Center, (int)circleSegments[i].Radius, new Scalar(255, 255, 0), 2);
          }

          using (new Window("Circles", result))
          {
              Cv2.WaitKey();
          }
      }
  }

在類的構造函數中,咱們接收到硬幣圖像的路徑。這個方法和ImagePreprocessing方法是CoinDetector類中僅有的兩個公共實體。全部其餘方法都是私有的,與上面列出的三個階段相關。在ImageProcessing 方法中,咱們保存一個原始的Mat(像素矩陣)對象的圖像,並生成即將發生的轉換副本。Mat類和全部對Cv2類的調用都來自OpenCVSharp。在每次轉換以後,咱們調用new Window以可視化地顯示轉換。Cv2.HoughCircles的參數取決於你所面臨的問題,也就是正在處理的圖像。測試

代碼中顯示的參數符合咱們的示例。spa

要完成硬幣檢測示例,咱們能夠在控制檯應用程序項目的主方法中添加如下代碼行並執行。

string filePath = @"C:/Users/arnal/Documents/coins.jpg";
var coinDetector = new CoinDetector(filePath);
coinDetector.ImagePreprocessing();

這是咱們將用於測試的圖像。其中包括塞爾維亞硬幣:

圖片4.png最終的結果將是咱們以前看到的圖像:

圖片5.png

正如咱們所看到的,在中間使用對應霍夫變換的白色圓圈標識,並被識別出來。

本系列的第一篇文章到此結束。在下一篇文章中,咱們將對輸入到機器學習模型中的數據集進行預處理。

歡迎關注個人公衆號,若是你有喜歡的外文技術文章,能夠經過公衆號留言推薦給我。

無標題.png

相關文章
相關標籤/搜索