用面向直方图的梯度训练神经网络C ++ OpenCV

时间:2019-06-01 21:18:53

标签: c++ opencv image-processing machine-learning neural-network

我想从像这样的视频流中检测阀门的关闭/打开位置(只是一个例子):

Example of images

我创建了两组数据集 open close ,并且我选择了为每张图像计算直方图的梯度并将其提供给opencv的神经网络训练它识别视频流中的位置(打开/关闭)。 我有两个问题:

1。我是否正在选择解决此问题的最佳方法(我必须在项目中使用机器学习)?

2。我是机器学习的新手,我不知道将HOG应用于神经网络是否是一个好主意,因为我已经计算出图像的HOG并为其提供了大小为[1 x 3780]的向量](如果我给他一张64宽x 128高的图像),输入的图层大小是否将为3780,并且由于我使用视频流,因此时间计算不是问题吗?

这是我用来计算HOG描述符的代码:

Mat img_raw = imread("C:\\testimg.png", 1); // load as color image

resize(img_raw, img_raw, Size(64,128) );

Mat img;
cvtColor(img_raw, img, CV_RGB2GRAY);


HOGDescriptor d;

// void HOGDescriptor::compute(const Mat& img, vector<float>& descriptors,
//                             Size winStride, Size padding,
//                             const vector<Point>& locations) const
vector<float> descriptorsValues;
vector<Point> locations;
d.compute( img, descriptorsValues, Size(0,0), Size(0,0), locations);

cout << "HOG descriptor size is " << d.getDescriptorSize() << endl;
cout << "img dimensions: " << img.cols << " width x " << img.rows << "height" << endl;
cout << "Found " << descriptorsValues.size() << " descriptor values" << endl;
cout << "Nr of locations specified : " << locations.size() << endl;

谢谢。

1 个答案:

答案 0 :(得分:0)

据我了解,这种方法看起来不错(特别是如果您不得不使用机器学习的话),但可能会有点慢。我可能会考虑将瓣膜的分割(也可以在这里使用机器学习;尽管,如果这是唯一的动作,则可以通过背景减法提取出来)与the image moments的计算如果您想要可以快速工作的东西。

如果您使用的是opencv,则也可以使用contour properties作为功能。

机器学习可能只是您通过一系列这些功能而训练的简单分类器。