记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + 演示效果

1.准备工作

1.1 训练集和测试集准备

先将数据集手动划分成训练集和测试集,并分好类,比如第一类就放在文件夹名为0的文件夹下,第二类就是1,如此类推。

当前程序只能处理10类以下车标,因为当前程序逻辑不支持10以上的数字识别(具体可以仔细看下代码)

所有训练集的图片放在train文件夹中,测试集放在test文件夹下。最终的文件树如下:

reCarlog是工程名,即Cardata和main.cpp同目录。

测试集的类别数字和训练集的要一一对应。因为程序将要用它们作为分类依据。

在 main.cpp目录下准备两个文件,trainpath.txt和testpath.txt,用以保存所有训练集和测试集图片的路径。程序需要这两个文件来读取训练集和测试集的图片。举例如下(trainpath.txt)

./Cardata/train/0/train_citroen1.jpg

./Cardata/train/0/train_citroen10.jpg ./Cardata/train/0/train_citroen100.jpg ./Cardata/train/0/train_citroen101.jpg

建议使用相对路径。

这样,当我们读取一张图片的时候,可以利用图片的路径名称,通过split调用确定该车标的类别(使用切分字符'/',第4个值即类别(0,1,2,3,4...))

2.实现步骤

2.1 代码概览

代码很简单,就一个main.cpp文件。大致分为以下3块

全局变量:比如整理好的数据集,标签集,HOG特征向量

全局函数:模块划分,使得main函数不显得臃肿。

自定义网络类:myNeraulNetwork用于搭建简单BP网络和训练预测

2.2 运行流程

分3步:

训练集装载

定义网络+训练网络

测试网络

2.2.1 训练集装载

全局变量设定:

#define N_SAMPLE 1000

#define F_NUM 1764

#define CLASSNUM 5

float Data[N_SAMPLE][F_NUM]; // 数据存放

float Label[N_SAMPLE][CLASSNUM] // 标签存放

训练网络输入是两个二维矩阵,第一个矩阵是数据矩阵(第一维是样本个数N_SAMPLE,第二维是每个样本的特征向量是,宽度为F_NUM),第二个矩阵是标签矩阵,对应每个样本,都有一个类别标签,如果是第一类,则它的标签向量为1,0,0,0,0(本例是5维)。

这里主要提一下数据矩阵的第二维是怎么确定的。

每个样本的特征向量即每张图片的HOG特征。HOG特征是一个一维向量。

HOG特征维度确定

对于一张图片,使用一个滑动窗口以一定的步进滑动,分别获取每个窗口的特征值,是一般的人工图像特征提取方式。简单说下HOG特征的提取。

假设一张图片的维度是img_size=64x64,我们使用的滑动窗口大小为block_size=16x16,滑动步进stride=8x8,那么对一个这样的图像,能得到(64-8)/8 x (64-8)/8=7x7=49个窗口,对于每个窗口block,HOG特征细分为胞元cell_size=8x8。于是一个block就有2x2=4个胞元,每个胞元默认有9个特征值,所以在上述参数的情况下,HOG特征的维度为49x4x9=1764,这也是本工程的默认参数。

opencv自带HOG特征提取,img_size、block_size、stride和cell_size都需要自行设定,因此需要事先计算好特征维度,才能确定数据矩阵第二维的宽度。

装载过程

read trainpath.txt; // 读取路径文件

for each trainImg in trainpath.txt :

getHOG(trainImg) // 获取HOG特征

getLabel according to its path

put its hog into Data[][]

put its label into Label[][]

2.2.2 定义网络+训练网络

对opencv自带网络类进行了简单的封装,如下:

定义和使用代码里说的很清楚了,这里再提下两个构造函数: 带参数的构造函数使用网络参数文件名作为参数。可以直接使用训练好的网络参数文件直接初始化网络,而不需要initialNN。

2.2.3 测试网络

读取测试文件,输入网络,获得输出。

输入为每次一个图片,所以输入的二维矩阵为test[1][F_NUM]。myNerualNetwork().predict(img)获得一个预测值,可以跟实际值(分析文件路径名获得)做对比,得到分类正确率。

3.其他注意事项

使用宏定义来进行训练or测试

Opencv的安装配置查看教程

还有其他问题可直接私戳

4.运行效果

基于Opencv自带BP网络的车标简易识别

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

java opencv bp网_基于Opencv自带BP网络的车标简易识别相关推荐

  1. 基于Opencv自带BP网络的车标简易识别

    代码地址如下: http://www.demodashi.com/demo/12966.html 记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + 演示效果 1.准备工作 1.1 训练集和 ...

  2. opencv 边缘平滑_基于OpenCV的车道检测实现(一)

    无人驾驶的话题日趋起热,而车道线检测对于无人驾驶的路径规划来讲特别重要.要遵守交通规则,首先的要求便是对车道线检测,而且通过检测车道线可以进一步的检测地面指示标志.进行前碰撞预警策略设计等. 早早就对 ...

  3. opencv 轮廓放大_基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析...

    title: [python]基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析 type: categories copyright: true categories ...

  4. c++opencv汉字分割_基于OpenCV 的车牌识别

    车牌识别是一种图像处理技术,用于识别不同车辆.这项技术被广泛用于各种安全检测中.现在让我一起基于OpenCV编写Python代码来完成这一任务. 车牌识别的相关步骤 1.车牌检测:第一步是从汽车上检测 ...

  5. opencv python考勤_基于opencv和dlib人脸识别的员工考勤系统

    已打包生成可执行文件exe,可直接下载运行,exe文件及代码均已上传到我的github,点击传送门,打包的具体过程及教程可见pyinstaller简明教程 WorkAttendanceSystem 一 ...

  6. c# opencv 轮廓检测_基于OpenCV的区域分割、轮廓检测和阈值处理

    OpenCV是一个巨大的开源库,广泛用于计算机视觉,人工智能和图像处理领域.它在现实世界中的典型应用是人脸识别,物体检测,人类活动识别,物体跟踪等. 现在,假设我们只需要从整个输入帧中检测到一个对象. ...

  7. opencv 图片叠加_基于OpenCV的红绿灯识别代码解析

    一堆废话 红绿灯分为导向灯和圆形灯.一般圆形灯在路口只有一盏灯,红灯亮时禁止直行和左转,可以右转弯.导向灯市带有箭头的,可以有两个或三个,分别指示不同方向的行车和停车.按指示的灯即可,没有右转向导向灯 ...

  8. opencv 处理黑夜_基于 opencv图像去噪

    1. 实验步骤:先为灰度图像添加高斯噪声.胡椒噪声.盐噪声和椒盐噪声,再分别利用算术均值滤波器.几何均值滤波器.谐波和逆谐波均值滤波器进行图像去噪.模板大小为5*5. 核心代码如下: 添加各类噪声: ...

  9. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

最新文章

  1. 世界杯规则终因IT而改变
  2. gcc 复杂结构体 初始化_gcc编译选项
  3. [HNOI2015]接水果
  4. 深入理解JAVA虚拟机 虚拟机性能监控和故障处理工具
  5. 查看mysql当前表使用的存储引擎(转)
  6. 图片识别文字, OCR
  7. easyui radio 取值和赋值
  8. hdu-You can Solve a Geometry Problem too
  9. HTTP1.1与HTTP1.0的区别
  10. PyTorch教程(十一):多输出的感知机以及梯度
  11. tomcat的端口修改
  12. C++数组与指针概念
  13. Python打卡第四周
  14. java占32位存储空间时,java空间
  15. MTK驱动(84)---GPS 配置
  16. 透过现象看本质,透析NAC系统几步走(4)
  17. 前端面试题集锦(二)之CSS部分
  18. Danfo.js专题 - 附:Dnotebook(Danfo Notebook)单机资源与汉化文档
  19. 图像语义分割(16)-DUpsampling-新型上采样模块:能够聚合丰富特征的数据相关型解码方式(CVPR2019)
  20. 看完这篇 你就能完全操作git 远程分支的增、删、改、查了

热门文章

  1. mysqlimport命令
  2. 【转】memcached工作原理介绍
  3. 求方程ax^2+bx+c=0的根。
  4. sql server修改索引名称_【索引潜规则】覆盖索引、ICP、MRR详解
  5. centos7 cmake安装mysql_centos7 安装cmake
  6. 36岁的it一线运维是不是废了_IT外包人员职业人生的漂泊,何为归处?
  7. html响应式布局media,JS中使用media实现响应式布局
  8. python 内存回收机制_Python垃圾回收机制是什么
  9. linux安装mysql php_Linux 安装mysql和php
  10. 二维非稳态导热微分方程_第三章非稳态导热分析解法