基于Opencv自带BP网络的车标简易识别
记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + 演示效果
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大师代发,拒绝转载,转载需要作者授权
基于Opencv自带BP网络的车标简易识别的更多相关文章
- 基于OpenCV的KNN算法实现手写数字识别
基于OpenCV的KNN算法实现手写数字识别 一.数据预处理 # 导入所需模块 import cv2 import numpy as np import matplotlib.pyplot as pl ...
- 基于C语言的Socket网络编程搭建简易的Web服务器(socket实现的内部原理)
首先编写我们服务器上需要的c文件WebServer.c 涉及到的函数API: int copy(FILE *read_f, FILE * write_f) ----- 文件内容复制的方法 int Do ...
- 基于OpenCV读取摄像头进行人脸检测和人脸识别
前段时间使用OpenCV的库函数实现了人脸检测和人脸识别,笔者的实验环境为VS2010+OpenCV2.4.4,opencv的环境配置网上有很多,不再赘述.检测的代码网上很多,记不清楚从哪儿copy的 ...
- 基于opencv网络摄像头在ubuntu下的视频获取
基于opencv网络摄像头在ubuntu下的视频获取 1 工具 原料 平台 :UBUNTU12.04 安装库 Opencv-2.3 2 安装编译运行步骤 安装编译opencv-2.3 参 ...
- 基于Levenberg-Marquardt训练算法的BP网络Python实现
经过一个多月的努力,终于完成了BP网络,参考的资料为: 1.Training feed-forward networks with the Marquardt algorithm 2.The Leve ...
- 使用HOG特征+BP神经网络进行车标识别
先挖个坑,快期末考试了,有空填上w 好了,今晚刚好有点闲,就把坑填上吧. //-------------------------------开篇---------------------------- ...
- 基于OpenCV制作道路车辆计数应用程序
基于OpenCV制作道路车辆计数应用程序 发展前景 随着科学技术的进步和工业的发展,城市中交通量激增,原始的交通方式已不能满足要求:同时,由于工业发展为城市交通提供的各种交通工具越来越多,从而加速了城 ...
- 如何利用OpenCV自带的级联分类器训练程序训练分类器
介绍 使用级联分类器工作包括两个阶段:训练和检测. 检测部分在OpenCVobjdetect 模块的文档中有介绍,在那个文档中给出了一些级联分类器的基本介绍.当前的指南描述了如何训练分类器:准备训练数 ...
- 【MFC】基于OpenCV的魔镜
最近半个月事情太多了,参加了泰迪杯数据挖掘,参加学院的科技节,科技节里面总共我参加了数学建模.PS.软件设计制作.电子设计大赛这4个.还有期中考.英语论文作业.今天终于忙的差不多,有时间来总结一下前段 ...
随机推荐
- AC日记——[SHOI2008]小约翰的游戏John bzoj 1022
1022 思路: nim: 代码: #include <cstdio> #include <cstdlib> #include <iostream> #includ ...
- centos6.5 的rpm 可以来这边找
http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-i386/gcc-4.8.2-16.3.fc20/
- 利用navigator对象判断设备类型
function getTerminalType() { //获取navigator对象 var o = navigator.userAgent, t = ""; if (/\bi ...
- UTC时间
世界的每个地区都有自己的本地时间,在Internet及无线电通信时,时间的统一非常重要! 整个地球分为二十四时区,每个时区都有自己的本地时间.在国际无线电通信中,为统一而普遍使用一个标准时间,称为通用 ...
- Problem C: 机器翻译【stl-队列】
Problem C: 机器翻译 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 54 Solved: 27[Submit][Status][Web Bo ...
- Socket学习总结系列(一) -- IM & Socket
写在准备动手的时候: Socket通讯在iOS中也是很常见,自己最近也一直在学习Telegram这个开源项目,Telegram就是在Socket的基础上做的即时通讯,这个相信了解这个开源项目的也都知道 ...
- 利用PyPDF2删除PDF文件首页
前话:有个朋友让我给他编辑他们公司的PDF文件,签名的日期时间不对,需要进(nong)行(xu)优(zuo)化(jia).而我手上只有两个管理pdf的软件,一个福晰阅读器,还有一个福晰编辑器.但是阅读 ...
- Codeforces 1036E. Covered Points
又一次写起了几何.... 特殊处理在于有可能出现多条线段交于一点的情况,每次考虑时,对每条线段与其他所有线段的交点存在一个set里,对每一个set,每次删除set.size()即可 重点在于判断两条线 ...
- 【PHP】mysql基本操作整合
php版本:PHP Version 5.5.1 环境:windows10 XMAPP 数据库:mysql 代码: <?php function connetionDB($servername, ...
- 冒泡排序--注意flag变量的设置
代码: #include<stdio.h> void BubbleSort(int a[],int n){ int i,j; int temp; ; // 此处flag变量的设置可以提高算 ...