基于opencv-ANN的水果识别模型训练

本文介绍了如何使用OpenCV库训练一个基于多层感知器(ANN_MLP)的机器视觉模型,用于识别苹果、香蕉等五种水果。步骤包括简化训练样本、生成训练数据、设置参数并训练模型,最终实现100%的预测准确率,并详细讲解了关键步骤和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

机器视觉---ANN

 

目录

机器视觉---ANN

前言

一、简化训练样本

二、生成训练数据

1.读取样本

2.读取标签

三、训练模型

1、转换数据集

2、创建模型

3、设置参数

4、训练模型

5、测试模型

6、保存模型

7、测试保存的模型

总结



前言

本文通过opencv提供的ANN-MLP训练水果识别模型,样本为苹果、香蕉、梨、葡萄、橙,训练集为5种水果各100个样本(共500个),测试集为每类水果10个样本(共50个)。


一、简化训练样本

原样本为尺寸不一的图片,大部分图片的宽高比例范围在3:2~2:1,为将图片拉成同等长度的向量,生成训练集时将读取的图片统一为3:2的宽高比例,本文样本宽高选取45:30。(src原图像为灰度图片)

void MainWindow::FruitAnnPrePro(cv::Mat &src, cv::Mat &dst)
{
    using namespace cv;
    src.convertTo(src,CV_32FC1);
    cv::resize(src,src,Size(45,30));
    dst.push_back(src.reshape(0,1));
}

二、生成训练数据

1.读取样本

样本存储在5个文件夹下,先将文件夹名称和文件名称以字符串数组形式保存,以便逐项读取。读取后将经预处理函数简化并拉成长度为45*30=1350的行向量,然后将向量压入trainData中形成符合要求的训练集。

代码如下(示例):

 

    string fruits[5] = {"apple","banana","grape","pear","orange"};
    string path = "/home/ghoson-x/Downloads/fruits/";//样本所在文件夹
    string * filePath = new string;
    filePath->append(path).append(fruits[i]).append("/");//i文件夹序号,对应文件夹名
    for(int j=0;j<100;++j){
    string * imagePath = new string;               imagePath->append(filePath->data()).append(QString::number(j).toStdString()).append(".jpg");//形成完整读取路径
            Mat temp = imread(imagePath->data(),IMREAD_GRAYSCALE);
            if(temp.empty()){
                break;
            }
            FruitAnnPrePro(temp,trainData);//自定义图像预处理函数
            trainLabel.push_back(Label.row(i));//构造标签矩阵
            delete imagePath;
        }

2.读取标签

标签矩阵要求行向量对应样本类别,例如第0行~99行为苹果的标签,本文定义【1,0,0,0,0】行向量为苹果的标签。

代码如下(示例):

Mat Label = Mat::eye(5,5,CV_32FC1);
trainLabel.push_back(Label.row(i));//读取样本时同时生成对应标签
同理测试集和测试标签也可如法炮制。

三、训练模型

1、转换数据集

Ptr<TrainData> trainData=TrainData::create(trainDataMat,ROW_SAMPLE,trainLabelMat);

2、创建模型

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

3、设置参数

根据数据集特点设置参数,特征数为1350,隐藏层设为10,输出层为5;选择Sigmoid函数作为激活函数

    Mat layerSize = (cv::Mat_<int>(1,3) << 1350, 10, 5);
    ANN_model->setLayerSizes(layerSize);
    ANN_model->setActivationFunction(ANN_MLP::SIGMOID_SYM,1,1);
    ANN_model->setTermCriteria(cv::TermCriteria(cv::TermCriteria::MAX_ITER + cv::TermCriteria::EPS,300,0.95));
    ANN_model->setTrainMethod(ANN_MLP::RPROP,0.1);

4、训练模型

ANN_model->train(trainData);

5、测试模型

通过判断预测输出向量最大值位置是否与测试标签向量最大值位置对应,例如【1,0,0,0,0】,最大值位置为(0,0),0行0列处。

ANN_model->predict(testDataMat.row(i),Response);
cv::minMaxLoc(Response,&MinVal,&MaxVal,&Minloc,&Maxloc);
 cv::minMaxLoc(testLabelMat.row(i),&MinVal,&MaxVal,&Minloc,&Maxlab);
        if(Maxloc.y == Maxlab.y){
            cout << "Y" << endl;
            ++rightNum;
        }
        else{
            cout << "N" << endl;
            ++errorNum;
        }

最终预测准确率为100%

6、保存模型

ANN_model->save("FruitsRecogModel.xml");

7、测试保存的模型

预处理读取的图片,然后加载模型,将要预测的数据传入模型,得到预测结果向量,整理预测结果,输出。

 Ptr<ANN_MLP> annModel = ANN_MLP::load("FruitsRecogModel.xml");
 annModel->predict(dst,result);
 std::cout << format(result,Formatter::FMT_NUMPY) << std::endl;

 输出向量中易见,各个类别的可能性,最大可能为橘子,因此输出结果orange.

 

总结

1、需要注意的是训练数据集和训练标签Mat数据类型必须为CV_32F,否则报错。

2、要注意数据集的大小,行数对应样本数,列数对应特征数(这里为45*30=1350),标签矩阵行数为样本数,列数为5(5种水果)。

3、参数设置,层的尺寸要对应好输入为1350,输出为5

4、若出现trainData相关报错,先输出Mat查看其数据类型或尺寸,看是否有不匹配的地方。

### 使用 OpenCV-Python 和 BP 祿经网络实现图像分类 尽管 OpenCV 主要用于计算机视觉任务,但它也提供了一些基本的人工神经网络支持。然而,OpenCV 的功能主要集中在加载预训练模型和推理阶段,而不是构建复杂的神经网络架构或执行端到端的训练过程[^1]。 如果希望使用 Python 来实现 BP 神经网络并结合 OpenCV 进行图像处理,则可以采用以下方法: #### 图像数据准备 利用 OpenCV 加载和预处理图像数据是一个常见的需求。下面展示了一个简单的例子来说明如何读取、显示和保存图像[^3]: ```python import cv2 # 读取图像 image = cv2.imread('example.jpg') if image is None: raise ValueError("Image not found or unable to load") # 显示原始图像 cv2.imshow('Original Image', image) # 转换为灰度图 gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) cv2.imshow('Grayscale Image', gray_image) # 保存灰度图像 cv2.imwrite('grayscale_example.jpg', gray_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` #### 构建 BP 神经网络 虽然 OpenCV 提供了 `ml` 模块中的 ANN(人工神经网络),但其灵活性有限,通常建议使用更强大的库如 TensorFlow 或 PyTorch 来完成复杂任务。不过为了满足特定场景下的简单需求,以下是基于 OpenCV 的 BP 神经网络示例代码: ```python import numpy as np import cv2 # 创建一个三层前馈神经网络 (输入层 -> 隐藏层 -> 输出层) ann = cv2.ml.ANN_MLP_create() # 定义层数结构 [输入节点数, 隐藏层节点数, 输出节点数] layer_sizes = np.int32([784, 100, 10]) # 假设 MNIST 数据集作为输入 ann.setLayerSizes(layer_sizes) # 设置激活函数为 Sigmoid ann.setActivationFunction(cv2.ml.ANN_MLP_SIGMOID_SYM) # 设置训练参数 term_criteria = (cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_EPS, 100, 1e-6) ann.setTermCriteria(term_criteria) # 初始化权重随机化 ann.setTrainMethod(cv2.ml.ANN_MLP_BACKPROP) # 准备训练数据 (假设 X_train 是特征矩阵, y_train 是标签向量) X_train = np.random.rand(100, 784).astype(np.float32) # 替换为实际数据 y_train = np.random.randint(0, high=10, size=(100,)).reshape(-1, 1).astype(np.float32) # 替换为实际标签 # 将标签转换为 one-hot 编码形式 train_labels = np.zeros((len(y_train), 10)) for i in range(len(y_train)): train_labels[i][int(y_train[i])] = 1.0 # 训练神经网络 ann.train(X_train, cv2.ml.ROW_SAMPLE, train_labels) # 测试预测能力 test_sample = X_train[0].reshape(1, -1) # 取第一个样本测试 ret, output = ann.predict(test_sample) print(f'Predicted Output: {output}') ``` 上述代码展示了如何通过 OpenCV 的 `ANN_MLP` 类创建一个多层感知器,并对其进行配置和训练。 #### 结合 AI 辅助工具加速开发流程 对于初学者来说,借助现代 AI 工具可以帮助快速上手编码工作。例如 CodeWhisperer、GitHub Copilot 或者阿里云的通义灵码都可以显著提升效率[^2]。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值