代码地址如下:
http://www.demodashi.com/demo/12966.html

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

1.准备工作

1.1 训练集和测试集准备

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

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

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

  1. reCarlog是工程名,即Cardatamain.cpp同目录。
  2. 测试集的类别数字和训练集的要一一对应。因为程序将要用它们作为分类依据。
  1. main.cpp目录下准备两个文件,trainpath.txttestpath.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步:

  1. 训练集装载
  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_sizeblock_sizestridecell_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网络的车标简易识别

代码地址如下:
http://www.demodashi.com/demo/12966.html

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

基于Opencv自带BP网络的车标简易识别的更多相关文章

  1. 基于OpenCV的KNN算法实现手写数字识别

    基于OpenCV的KNN算法实现手写数字识别 一.数据预处理 # 导入所需模块 import cv2 import numpy as np import matplotlib.pyplot as pl ...

  2. 基于C语言的Socket网络编程搭建简易的Web服务器(socket实现的内部原理)

    首先编写我们服务器上需要的c文件WebServer.c 涉及到的函数API: int copy(FILE *read_f, FILE * write_f) ----- 文件内容复制的方法 int Do ...

  3. 基于OpenCV读取摄像头进行人脸检测和人脸识别

    前段时间使用OpenCV的库函数实现了人脸检测和人脸识别,笔者的实验环境为VS2010+OpenCV2.4.4,opencv的环境配置网上有很多,不再赘述.检测的代码网上很多,记不清楚从哪儿copy的 ...

  4. 基于opencv网络摄像头在ubuntu下的视频获取

     基于opencv网络摄像头在ubuntu下的视频获取 1  工具 原料 平台 :UBUNTU12.04 安装库  Opencv-2.3 2  安装编译运行步骤 安装编译opencv-2.3  参 ...

  5. 基于Levenberg-Marquardt训练算法的BP网络Python实现

    经过一个多月的努力,终于完成了BP网络,参考的资料为: 1.Training feed-forward networks with the Marquardt algorithm 2.The Leve ...

  6. 使用HOG特征+BP神经网络进行车标识别

    先挖个坑,快期末考试了,有空填上w 好了,今晚刚好有点闲,就把坑填上吧. //-------------------------------开篇---------------------------- ...

  7. 基于OpenCV制作道路车辆计数应用程序

    基于OpenCV制作道路车辆计数应用程序 发展前景 随着科学技术的进步和工业的发展,城市中交通量激增,原始的交通方式已不能满足要求:同时,由于工业发展为城市交通提供的各种交通工具越来越多,从而加速了城 ...

  8. 如何利用OpenCV自带的级联分类器训练程序训练分类器

    介绍 使用级联分类器工作包括两个阶段:训练和检测. 检测部分在OpenCVobjdetect 模块的文档中有介绍,在那个文档中给出了一些级联分类器的基本介绍.当前的指南描述了如何训练分类器:准备训练数 ...

  9. 【MFC】基于OpenCV的魔镜

    最近半个月事情太多了,参加了泰迪杯数据挖掘,参加学院的科技节,科技节里面总共我参加了数学建模.PS.软件设计制作.电子设计大赛这4个.还有期中考.英语论文作业.今天终于忙的差不多,有时间来总结一下前段 ...

随机推荐

  1. portainer,用于管理docker swarm,好像也不错哟

    shipyard的模式,好像在docker 1.12之后,没有啥用武之地了,也没有更新. 接下来,集群管理和调度,最有知名度的就是rancher了. 在rancher之前,我们试一下portainer ...

  2. javascript面试题(一)(转载)

    1,判断字符串是否是这样组成的,第一个必须是字母,后面可以是字母.数字.下划线,总长度为5-20 var reg = /^[a-zA-Z][a-zA-Z_0-9]{4,19}$/; /*注意:1.要用 ...

  3. Arduino mega 2560驱动安装失败(没有建立对验证码(TM)签名的目录的发布者信任)的解决方法

    转载请注明出处,谢谢...... 放假的时候在自己家台式机上安装时候是很顺畅的,今天在自己本子上安装的时候就不行了~ IDE版本:1.05 问题描述:在网上搜索了相关问题,发现绝大部分安装失败的时候都 ...

  4. Hadoop-eclipse插件配置

    1.准备jar包与安装eclipse. 2.将jar包拷贝到eclipse/plugin.

  5. 折半搜索+状态压缩【P3067】 [USACO12OPEN]平衡的奶牛群Balanced Cow S…

    Description 给n个数,从中任意选出一些数,使这些数能分成和相等的两组. 求有多少种选数的方案. Input 第\(1\)行:一个整数\(N\) 第\(2\)到\(N+1\)行,包含一个整数 ...

  6. 10、Flask实战第10天:视图使用装饰器

    在实际开发中,我们有时候会用到自己定义装饰器并应用到函数视图或者类视图里面:比如:我们要想进入个人中心页面,首先要验证你是否登录,否则进不去,下面我们来模拟这个场景 定义一个装饰器 from func ...

  7. HDU 1754 I Hate It<区间最值 单点修改>

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  8. [BZOJ1833][ZJOI2010]Count数字计数(DP)

    数位DP学傻了,怎么写最后都写不下去了. 这题严格上来说应该不属于数位DP?只是普通DP加上一些统计上的判断吧. 首先复杂度只与数的位数$\omega$有关,所以怎么挥霍都不会超. f[i][j][k ...

  9. 【扩展欧几里得】poj2115 C Looooops

    题意大概是让你求(A+Cx) mod 2^k = B的最小非负整数解. 若(B-A) mod gcd(C,2^k) = 0,就有解,否则无解. 式子可以化成Cx + 2^k*y = B - A,可以用 ...

  10. 【博弈论】【SG函数】bzoj3404 [Usaco2009 Open]Cow Digit Game又见数字游戏

    #include<cstring> #include<cstdio> #include<algorithm> #include<set> using n ...