2017-06-19 33 views
2

我是AI界的新手,尝试一些练习。 看起来我需要一些第三方体验。OpenCV用于图像处理的神经网络

比方说,我需要摆脱图像缺陷(实际上任务更棘手)。 我希望受过训练的NN能够插入缺陷区域。

由于这些原因,我尝试创建简单的神经网络。 它有输入:具有deffect(72 * 54)的灰度图像和没有缺陷的相同图像。 隐藏层有2 * 72 * 54个神经元。

的代码主片

cv::Ptr<cv::ml::ANN_MLP> ann = cv::ml::ANN_MLP::create(); 

    int inputsCount = imageSizes.width * imageSizes.height; 
    std::vector<int> layerSizes = { inputsCount, inputsCount * 2, inputsCount}; 
    ann->setLayerSizes(layerSizes); 
    ann->setActivationFunction(cv::ml::ANN_MLP::SIGMOID_SYM); 

    cv::TermCriteria tc(cv::TermCriteria::MAX_ITER + cv::TermCriteria::EPS, 50, 0.1); 
    ann->setTermCriteria(tc); 

    ann->setTrainMethod(cv::ml::ANN_MLP::BACKPROP, 0.0001); 

    std::cout << "Result : " << ann->train(trainData, cv::ml::ROW_SAMPLE, resData) << std::endl; 
    ann->predict(trainData, predicted); 

我的训练数据集看起来像 enter image description here

培训了10项数据集NN给出了关于这个(下同)投入坏的结果。我尝试了不同的参数 enter image description here

但是仅对2幅图像进行训练NN获得接近的输出(在训练数据上)。

enter image description here

我想,这不是正确对待和解决方案也不是那么容易。

也许有人对参数或神经网络架构或整体方法有一些建议。

回答

1

似乎只有两个样本的终止标准是正确的,但在用大量样本训练时不够好。请尝试调整它们,以及学习率。 根据已正确恢复的像素的质量来判断,网络体系结构似乎对此任务很好。一旦网络在10个样本上运行良好,我强烈建议添加更多的训练样本。

1

主要的问题是,你有办法给一些给定网络的数据。

您的NN已完全连接。像素0,0的权重与像素1,0的权重完全分开,并且像素0,1具有不同的权重。你有一个重量很多,有这么多的节点。因此,尽管10张图像中有大量像素,但您无法获得足够的所有权重像素。

A 卷积神经网络具有很少的权重,因为它的许多权重被重用。这意味着在训练中,这些权重通过每个训练图像的多个像素进行训练。

不是我期望这只适用于10张图片。人类的期望来源于多年的人类视觉,几十亿的图像。