1. 程式人生 > 實用技巧 >C#中的深度學習(一):使用OpenCV識別硬幣

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

在本系列文章中,我們將使用深度神經網路(DNN)來執行硬幣識別。具體來說,我們將訓練一個DNN識別影象中的硬幣。

在本文中,我們將描述一個OpenCV應用程式,它將檢測影象中的硬幣。硬幣檢測是硬幣完整識別之前的一個常見階段。它包括從給定影象中檢測和提取硬幣。

本系列附帶的程式碼將使用Keras在C#中實現。在本系列的最後一篇文章中,我們將簡要地使用ML.NET。在眾多選擇中,為什麼要使用Keras.NET呢?Keras.NET非常容易學習,因為它基本上是從Python編寫的經典TensorFlow到C#的直接對映。對於不熟悉機器學習的讀者來說,這比用其他方法建立示例要容易得多。

硬幣檢測過程分為三個階段:

  1. 轉換影象到灰度。顏色增加了檢測任務的複雜性,而且在很多情況下,它們不能傳遞任何可以從影象亮度中獲取的相關資訊。
  2. 應用高斯模糊。因為硬幣通常包含一個內圓,我們應用這個變換來模糊影象。這確保了任何內圓被下一步中的操作忽略,所以我們的演算法不會意外地認為它們是一個單獨的硬幣。
  3. 應用霍夫變換。這是為了檢測圓形。

首先,讓我們在Visual Studio Community 2019中建立一個.net Framework 4.7.2控制檯應用程式。我們將把我們的解決方案和專案命名為“CoinRecognitionExample”,並在其中建立一個Detection資料夾,建立一個CoinDetector類。

我們將使用OpenCVSharp,所以我們可以繼續在Visual Studio中從Nuget包管理器安裝依賴項。要做到這一點,請點選Tools>Nuget Package Manager.

我們可以看到需要安裝OpenCVSharp的依賴項。

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

 1 public class CoinDetector
 2   {
 3       private Mat _image;
 4       private Mat _originalImage;
 5       private string _pathToFile;
 6 
 7       public
CoinDetector(string pathToFile) 8 { 9 _pathToFile = pathToFile; 10 } 11 12 public void ImagePreprocessing() 13 { 14 _image = new Mat(_pathToFile, ImreadModes.Color); 15 _originalImage = _image.Clone(); 16 TransformGrayScale(); 17 TransformGaussianBlur(); 18 HoughSegmentation(); 19 } 20 21 private void TransformGrayScale() 22 { 23 _image = _originalImage.CvtColor(ColorConversionCodes.BGR2GRAY); 24 new Window("Grayed Coins", WindowMode.Normal, _image); 25 Cv2.WaitKey(); 26 } 27 28 private void TransformGaussianBlur() 29 { 30 Cv2.GaussianBlur(_image, _image, new Size(0, 0), 1); 31 new Window("Blurred Coins", WindowMode.Normal, _image); 32 //Cv2.WaitKey(); 33 } 34 35 private void HoughSegmentation() 36 { 37 Mat result = _image.Clone(); 38 39 var circleSegments = Cv2.HoughCircles(_image, HoughMethods.Gradient, 1.02, 40); 40 for (int i = 0; i < circleSegments.Length; i++) 41 { 42 Cv2.Circle(result, (Point) circleSegments[i].Center, (int)circleSegments[i].Radius, new Scalar(255, 255, 0), 2); 43 } 44 45 using (new Window("Circles", result)) 46 { 47 Cv2.WaitKey(); 48 } 49 } 50 }

在類的建構函式中,我們接收到硬幣影象的路徑。這個方法和ImagePreprocessing方法是CoinDetector類中僅有的兩個公共實體。所有其他方法都是私有的,與上面列出的三個階段相關。在ImageProcessing方法中,我們儲存一個原始的Mat(畫素矩陣)物件的影象,並生成即將發生的轉換副本。Mat類和所有對Cv2類的呼叫都來自OpenCVSharp。在每次轉換之後,我們呼叫new Window以視覺化地顯示轉換。Cv2.HoughCircles的引數取決於你所面臨的問題,也就是正在處理的影象。

程式碼中顯示的引數符合我們的示例。

要完成硬幣檢測示例,我們可以在控制檯應用程式專案的主方法中新增以下程式碼行並執行。

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

這是我們將用於測試的影象。其中包括塞爾維亞第納爾硬幣:

最終的結果將是我們之前看到的影象:

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

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

歡迎關注我的公眾號,如果你有喜歡的外文技術文章,可以通過公眾號留言推薦給我。