簡體   English   中英

在OpenCV中將圖像轉換為CvMat以訓練神經網絡

[英]Converting image into CvMat in OpenCV for training neural network

我正在編寫一個使用OpenCv神經網絡模塊以及C#和OpenCvSharp庫的程序。 它必須識別用戶的面孔,因此為了訓練網絡,我需要一組樣本。 問題是如何將樣本圖像轉換為適合訓練的陣列。 我得到的是200x200 BitMap圖像,以及具有40000個輸入神經元,200個隱藏神經元和一個輸出的網絡:

        CvMat layerSizes = Cv.CreateMat(3, 1, MatrixType.S32C1);
        layerSizes[0, 0] = 40000;
        layerSizes[1, 0] = 200;
        layerSizes[2, 0] = 1;
        Network = new CvANN_MLP(layerSizes,MLPActivationFunc.SigmoidSym,0.6,1);

所以然后我試圖將BitMap圖像轉換為CvMat數組:

private void getTrainingMat(int cell_count, CvMat trainMAt, CvMat responses)
    {
        CvMat res = Cv.CreateMat(cell_count, 10, MatrixType.F32C1);//10 is a number of samples
        responses = Cv.CreateMat(10, 1, MatrixType.F32C1);//array of supposed outputs
        int counter = 0;
        foreach (Bitmap b in trainSet)
        {
            IplImage img = BitmapConverter.ToIplImage(b);
            Mat imgMat = new Mat(img);
            for (int i=0;i<imgMat.Height;i++)
            {
                for (int j = 0; j < imgMat.Width; j++)
                {
                    int val =imgMat.Get<int>(i, j);
                    res[counter, 0] = imgMat.Get<int>(i, j);
                }
                responses[i, 0] = 1;
            }
            trainMAt = res;
        }
    }

然后,在嘗試對其進行訓練時,我遇到了以下異常:

輸入的訓練數據應為浮點矩陣,其行數等於訓練樣本數,列數等於第0(輸入)層的大小

培訓代碼:

        trainMAt = Cv.CreateMat(inp_layer_size, 10, MatrixType.F32C1);
        responses = Cv.CreateMat(inp_layer_size, 1, MatrixType.F32C1);
        getTrainingMat(inp_layer_size, trainMAt, responses);
        Network.Train(trainMAt, responses, new CvMat(),null, Parameters);

我是OpenCV的新手,我認為由於缺乏對CvMat結構的了解,在轉換時做錯了一些事情。 我的錯誤在哪里,還有其他轉換位圖的方法嗎?

行數等於訓練樣本數

那是10個樣本。

並且列數等於第0(輸入)層的大小

那是inp_layer_size。

trainMAt = Cv.CreateMat(10, inp_layer_size, MatrixType.F32C1);
responses = Cv.CreateMat(10, 1, MatrixType.F32C1); // 10 labels for 10 samples

我主要使用C ++,所以如果我誤會我,請原諒我,但您的像素循環還需要進行調整。

當您分配給val ,您的內部循環看起來val ,但是從不使用它,也從不增加您的計數器。

另外,在您的外循環中,分配trainMAt = res; 因為每個圖像似乎都不是一個好主意。

我確信您可以使它正常運行,只需記住以下事實:目標是將每個圖像展平為一行,因此最終inp_layer_size 10行和inp_layer_size列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM