cxi前処理識別硬貨のデータセット


本論文では,機械学習モデルに入力されたデータセットを前処理する。
ここでは硬貨データセットを前処理して、今後は学習モデルを監督する訓練を行います。マシン学習においてデータセットを前処理すると、通常は以下のタスクに関連します。
  • は、データを整理する。周辺データの平均値または他のポリシーを使用することによって、データの欠落または破損による脆弱性をカバーする。
  • 規格データ――データのスケーリング値を標準範囲に標準化し、通常は0から1までです。広範な値の範囲を持つデータは不適合を招く可能性がありますので、私達はすべてのデータを共通の範囲に置いています。
  • は、データセットの対象のラベルまたはクラスをN次元バイナリベクトルとして符号化する熱符号化ラベルであり、ここでNはクラスの総数である。配列要素はすべて0に設定されています。オブジェクトのクラスに対応する要素を除いて、1に設定されています。これは、各配列に1の値を持つ要素を意味する。
  • は入力データセットをトレーニングセットと検証セットに分けます。トレーニングセットはトレーニングモデルに使われます。検証セットは私たちのトレーニング結果を確認するためのものです。
  • この例はNumpy.NETを使用します。基本的にPythonで流行っているNumpyライブラリのNETバージョンです。
    Numpyはマトリックス処理に専念するライブラリである。
    私たちのデータセットプロセッサを実現するために、PrProcessingフォルダにUtilsクラスとDataSetクラスを作成します。Utils類は静的Normalizeを合併しました。 方法は、以下の通りです。
    
    public class Utils
      {
        public static NDarray Normalize(string path)
        {
          var colorMode = Settings.Channels == 3 ? "rgb" : "grayscale";
          var img = ImageUtil.LoadImg(path, color_mode: colorMode, target_size: (Settings.ImgWidth, Settings.ImgHeight));
          return ImageUtil.ImageToArray(img) / 255;
        }
    
      }
    この方法では,与えられた色モード(RGBまたはグレースケール)で画像をロードし,与えられた幅と高さに調整した。次に、画像を含むマトリクスを返します。各要素は255で割っています。各要素は255で割って標準化されています。画像中のどの画素の値も0から255の間にあるので、255で割って、新たな範囲が0から1までであることを確認しました。
    私たちはまだコードの中でSettingsクラスを使っています。このクラスには、アプリケーションにまたがって使用するための多くの定数が含まれています。もう一つのクラスのDataSetは、マシン学習モデルのデータセットを訓練するために使用されるということです。ここには以下のフィールドがあります。
  • _pathToFolder――画像を含むフォルダのパス。
  • _ext List――考慮するファイル拡張子リスト。
  • _labels―_pathToFolderの画像のラベルまたはクラス。
  • _Objs-画像自体は、Numpy.NDarrayと表示されます。
  • _validationSplitは、全画像数を検証セットとトレーニングセットの百分率に分割するために使用され、この例では、パーセンテージで、検証セットと全体画像数との間のサイズを定義します。
  • Number Class-データセットの唯一のクラスの総数。
  • TrainX-トレーニングデータは、Numpy.NDarrayと表しています。
  • TrainY-トレーニングラベルはNumpy.NDarrayと表します。
  • Validation X-検証データは、Numpy.NDarrayと表しています。
  • Validation Y-検証タグは、Numpy.NDarrayと表しています。
  • これはDataSet類です
    
    public class DataSet
      {
        private string _pathToFolder;
        private string[] _extList;
        private List<int> _labels;
        private List<NDarray> _objs;
        private double _validationSplit;
        public int NumberClasses { get; set; }
        public NDarray TrainX { get; set; }
        public NDarray ValidationX { get; set; }
        public NDarray TrainY { get; set; }
        public NDarray ValidationY { get; set; }
    
        public DataSet(string pathToFolder, string[] extList, int numberClasses, double validationSplit)
        {
          _pathToFolder = pathToFolder;
          _extList = extList;
          NumberClasses = numberClasses;
          _labels = new List<int>();
          _objs = new List<NDarray>();
          _validationSplit = validationSplit;
        }
    
        public void LoadDataSet()
        {
          // Process the list of files found in the directory.
          string[] fileEntries = Directory.GetFiles(_pathToFolder);
          foreach (string fileName in fileEntries)
            if (IsRequiredExtFile(fileName))
              ProcessFile(fileName);
    
          MapToClassRange();
          GetTrainValidationData();
        }
    
        private bool IsRequiredExtFile(string fileName)
        {
          foreach (var ext in _extList)
          {
            if (fileName.Contains("." + ext))
            {
              return true;
            }
          }
    
          return false;
        }
    
        private void MapToClassRange()
        {
          HashSet<int> uniqueLabels = _labels.ToHashSet();
          var uniqueLabelList = uniqueLabels.ToList();
          uniqueLabelList.Sort();
    
          _labels = _labels.Select(x => uniqueLabelList.IndexOf(x)).ToList();
        }
    
        private NDarray OneHotEncoding(List<int> labels)
        {
          var npLabels = np.array(labels.ToArray()).reshape(-1);
          return Util.ToCategorical(npLabels, num_classes: NumberClasses);
        }
    
        private void ProcessFile(string path)
        {
          _objs.Add(Utils.Normalize(path));
          ProcessLabel(Path.GetFileName(path));
        }
    
        private void ProcessLabel(string filename)
        {
          _labels.Add(int.Parse(ExtractClassFromFileName(filename)));
        }
    
        private string ExtractClassFromFileName(string filename)
        {
          return filename.Split('_')[0].Replace("class", "");
        }
    
        private void GetTrainValidationData()
        {
          var listIndices = Enumerable.Range(0, _labels.Count).ToList();
          var toValidate = _objs.Count * _validationSplit;
          var random = new Random();
          var xValResult = new List<NDarray>();
          var yValResult = new List<int>();
          var xTrainResult = new List<NDarray>();
          var yTrainResult = new List<int>();
    
          // Split validation data
          for (var i = 0; i < toValidate; i++)
          {
            var randomIndex = random.Next(0, listIndices.Count);
            var indexVal = listIndices[randomIndex];
            xValResult.Add(_objs[indexVal]);
            yValResult.Add(_labels[indexVal]);
            listIndices.RemoveAt(randomIndex);
          }
    
          // Split rest (training data)
          listIndices.ForEach(indexVal => 
          { 
            xTrainResult.Add(_objs[indexVal]);
            yTrainResult.Add(_labels[indexVal]);
          });
    
          TrainY = OneHotEncoding(yTrainResult);
          ValidationY = OneHotEncoding(yValResult);
          TrainX = np.array(xTrainResult);
          ValidationX = np.array(xValResult);
        }
    }
    以下は各方法の説明です。
  • LoadDataSet()クラスの主な方法は、_をロードするために呼び出される。pathToFolderのデータセットです。この操作を完了するために、以下に示す他の方法を呼び出します。
  • IsRequireExtFile(filename) - 与えられたファイルが少なくとも一つのデータセットのために処理すべき拡張子を含むかどうかをチェックします。ext Listに記載)。
  • MapToClass Range()-データセット固有のラベルのリストを取得します。
  • ProcessiFile-Utils.Normalizeを用いて画像を規格化し、Process Label方法を呼び出す。
  • ProcesssLabel-Extract Class From FileNameメソッドの結果をラベルに追加します。
  • Extract Class From FileName-画像のファイル名からクラスを抽出します。
  • Get TrainValidation Data()は、データセットをトレーニングデータセットと検証サブデータセットに分割する。
  • 本シリーズでは、https://cvl.tuwien.ac.at/research/cvl-databases/coin-image-dataset/上の硬貨画像データセットを使用する。
    データセットをロードするには、コンソールアプリケーションのメインクラスに以下の内容を含めることができます。
    
    var numberClasses = 60;
    var fileExt = new string[] { ".png" };
    var dataSetFilePath = @"C:/Users/arnal/Downloads/coin_dataset";
    var dataSet = new PreProcessing.DataSet(dataSetFilePath, fileExt, numberClasses, 0.2);
    dataSet.LoadDataSet();
    私たちのデータは今機械学習モデルに入力できます。次の文章では、マシン学習を監督する基礎知識とトレーニングと検証段階について、どのような内容が含まれていますか?AIの経験のない読者のための準備です。
    以上はcxiの前処理識別硬貨のデータセットの詳細です。cxi識別データセットに関する資料は他の関連記事に注目してください。