OpenCV4机器学习算法原理与编程实战(附部分模型下载地址)
一直想找本书,能在机器学习复杂的算法原理和高效的编程实战之间达到合适的平衡:让感兴趣的同学拿到就有能用的代码,还有基本原理的介绍,因为了解原理才知道什么时候用什么算法最合适,以及如何调整参数。
一直没找到合适的,所以动手写了一本:p 拖拖拉拉花了三年多时间,幸运的是三年间技术一直在进步,也就有机会将最新的OpenCV4机器学习ML和深度学习DNN模块的精彩呈现在纸面,汇集了大量的算法原理与对应的示例程序,希望能对大家的学习有所帮助:)
最近有读者询问示例代码中某些文件的下载地址,为方便大家学习整理了一些模型和文件,在文末给出下载地址。
本文的思路是:
- 先介绍涉及的知识体系和主要特色,并给出这本书的目录结构;
- 再给出书中的三个案例,分别是DNN深度学习模型落地和SVM的在机器视觉中的应用;
- 最后是书中内容的截图展示。
目录
目录
内容介绍
全书目录
案例1:用C++ 和OpenCV 实现视频目标检测(YOLOv4)
1.实现思路
2.实现步骤
案例2:使用C++ 和OpenCV 实现场景文本检测识别(DB+CRNN)
1.实现思路
2.实现步骤
案例3:使用C++ 和OpenCV 实现手写数字识别(HOG+SVM)
应用提示
内容截图
书中部分模型与附件文件下载地址
分类算法模型
跟踪算法模型
分割算法的color.txt
检测算法的coco.names
本文分析算法的词典文件
内容介绍
机器学习关注的问题是:计算机程序如何随着经验积累自动提高性能。机器学习算法已成功应用于模式识别、通信、控制、金融、生物信息学、计算机视觉等众多领域。近年来,深度学习技术的进步,更是推动了计算机视觉领域的研究与行业应用的巨大变革。
目前介绍机器学习的书籍大致分为理论与实践两类,大多数应用类书籍使用Python或MATLAB语言编程实现。这本书的初衷是为读者拉近机器学习理论与算法C++编程实践之间的距离。OpenCV的机器学习与深度学习模块为我们在机器学习理论与编程实战之间架设了一座桥梁。读者通过阅读本书可在理解算法原理的基础上,通过大量应用与示例代码迅速提升基于C++语言的机器学习算法编程实践能力,书中的大量OpenCV函数用法、参数的介绍同样适用于Python接口调用。
本书以OpenCV4为工具,介绍的机器学习算法原理、代码实现与应用示例。第1章和第2章介绍了OpenCV4的安装配置、基本数据结构与图像处理操作;第3章讲解机器学习的基本概念;第4章从最简单的K均值和K近邻算法入手介绍聚类、分类与回归算法原理与应用;第5章至第7章介绍了最早的机器学习算法之一的决策树算法,及其改进算法——随机森林和Boosting集成学习算法;第8章介绍了应用广泛的支持向量机算法及应用,并涉及到一些基本的统计学习理论知识;第9章至第10章,重点介绍了人工神经网络与深度学习算法,并通过图像分类、对象检测、实例分割、目标跟踪与场景文本检测与识别等不同类型的大量应用介绍了GoogLeNet、YOLOv4、Mask R-CNN、GOTURN、DB、CRNN等深度学习算法模型的部署方法,其中不乏近年出现的高性能模型。
全书目录
第1章 概述
1.1 OpenCV简述
1.2 OpenCV的功能
1.3 OpenCV中的机器学习与深度神经网络模块
1.4 基本数据类型
1.4.1 数据类型概述
1.4.2 cv::Vec类
1.4.3 cv::Point类
1.4.4 cv::Scalar类
1.4.5 cv::Size类
1.4.6 cv::Rect类
1.4.7 cv::RotatedRect类
1.4.8 cv::Mat类
1.4.9 基本矩阵运算
参考文献
第2章 OpenCV在机器学习任务中的基本图像操作
2.1 基本图像操作
2.1.1 读取、显示和存储图像
2.1.2 颜色空间转换
2.1.3 图像的几何变换
2.1.4 直方图均衡化
2.1.5 标注文字和矩形框
2.2 基本视频操作
2.2.1 读取和播放视频文件
2.2.2 处理视频文件
2.2.3 存储视频文件
参考文献
第3章 机器学习的基本原理与OpenCV机器学习模块
3.1 机器学习的基本概念
3.1.1 机器学习的定义
3.1.2 机器学习的分类
3.2 机器学习的一般流程
3.2.1 机器学习流程
3.2.2 数据集
3.2.3 偏差与方差
3.2.4 评估分类器性能的方法
3.3 逻辑回归分类示例
3.3.1 图像数据与数据表示
3.3.2 逻辑回归模型
3.3.3 逻辑回归的损失函数
3.4 OpenCV支持的机器学习算法
3.4.1 机器学习模块的结构
3.4.2 机器学习模块中的算法
3.4.3 数据集准备
3.4.4 特征选择
参考文献
第4章 K-means和KNN
4.1 算法原理
4.1.1 K-means原理
4.1.2 KNN原理
4.2 OpenCV实现
4.2.1 K-means的实现
4.2.2 KNN的实现
4.3 应用示例
4.3.1 K-means聚类示例
4.3.2 KNN手写数字识别示例
4.3.3 应用提示
参考文献
第5章 决策树
5.1 决策树原理
5.1.1 决策树的基本思想
5.1.2 决策树的表示方法
5.1.3 最佳切分属性的选择
5.1.4 停止标准
5.1.5 剪枝
5.2 OpenCV实现
5.2.1 创建决策树
5.2.2 训练决策树
5.2.3 使用决策树预测
5.3 应用示例
5.3.1 蘑菇可食性分类
5.3.2 预测波士顿房价
5.3.3 应用提示
参考文献
第6章 随机森林
6.1 随机森林原理
6.1.1 随机森林的基本思想
6.1.2 Bagging算法
6.2 OpenCV实现
6.2.1 OpenCV中的随机森林
6.2.2 创建随机森林
6.2.3 训练随机森林
6.2.4 使用随机森林预测
6.3 应用示例
6.3.1 蘑菇可食性分类
6.3.2 预测波士顿房价
6.3.3 应用提示
参考文献
第7章 Boosting算法
7.1 Boosting算法原理
7.1.1 Boosting算法的基本思想
7.1.2 Boosting算法
7.1.3 AdaBoost算法
7.2 OpenCV实现
7.2.1 创建AdaBoost模型
7.2.2 训练AdaBoost模型
7.2.3 使用AdaBoost模型预测
7.3 应用示例
7.3.1 蘑菇可食性分类
7.3.2 英文字母分类问题
7.3.3 应用提示
参考文献
第8章 支持向量机
8.1 支持向量机原理
8.1.1 统计学习理论概述
8.1.2 线性SVM算法基本原理
8.1.3 非线性SVM算法的基本原理
8.1.4 SVM回归算法的基本原理
8.1.5 SVM算法执行SRM准则的解释
8.2 OpenCV实现
8.2.1 OpenCV中的SVM算法
8.2.2 创建SVM模型
8.2.3 训练SVM模型
8.2.4 使用SVM模型预测
8.3 应用示例
8.3.1 使用HOG特征与SVM算法识别手写数字
8.3.2 应用提示
参考文献
第9章 神经网络
9.1 神经网络算法原理
9.1.1 神经网络的结构与表示
9.1.2 单隐层前馈神经网络
9.1.3 多隐层前馈神经网络
9.1.4 梯度下降法
9.1.5 反向传播算法
9.2 OpenCV实现
9.2.1 OpenCV中的MLP算法
9.2.2 创建MLP模型
9.2.3 训练MLP模型
9.2.4 使用MLP模型预测
9.3 应用示例
9.3.1 使用神经网络识别手写数字
9.3.2 应用提示
参考文献
第10章 深度神经网络
10.1 卷积神经网络的基本原理
10.1.1 卷积神经网络的结构
10.1.2 卷积层
10.1.3 池化
10.1.4 Softmax层
10.1.5 CNN特征学习的过程
10.1.6 CNN特征学习的原理
10.2 OpenCV的DNN模块
10.2.1 OpenCV支持的深度学习框架
10.2.2 支持的层类型
10.2.3 编译支持GPU加速的OpenCV
10.2.4 DNN模块的使用
10.3 应用示例
10.3.1 典型计算机视觉任务
10.3.2 使用GoogLeNet实现图像分类
10.3.3 使用YOLOv4实现目标检测
10.3.4 使用Mask R-CNN实现实例分割
10.3.5 使用GOTURN模型实现目标跟踪
10.3.6 使用DB算法实现场景文本检测
10.3.7 使用CRNN实现场景文本识别
10.3.8 应用提示
参考文献
案例1:用C++ 和OpenCV 实现视频目标检测(YOLOv4)
1.实现思路
读取视频流,载入模型,执行推理,找出所有目标及其位置,最后绘制检测结果。
2.实现步骤
cv::VideoCapture cap;
cap.open(0); //打开摄像头
//cap.open("TH1.mp4"); //读取视频文件
cv::dnn::Net net = cv::dnn::readNet(config, model, framework);
net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);
net.forward(outs, outNames); //前向传播
for (size_t i = 0; i < outs.size(); ++i) {data = (float*)outs[i].data;for (int j = 0; j < outs[i].rows; ++j, data += outs[i].cols){scores = outs[i].row(j).colRange(5, outs[i].cols);cv::minMaxLoc(scores, 0, &confidence, 0, &classIdPoint);
void drawPred(cv::Mat &frame,vector<cv::Rect> &boxes,vector<int> &classIds,vector<int> &indices,vector<string> &classNamesVec)
案例2:使用C++ 和OpenCV 实现场景文本检测识别(DB+CRNN)
将检测模型的文本区域检测结果输入识别模型后,便可以对场景图像中的文字进行检测识别了。示例代码10-7是在OpenCV官方场景文字检测识别示例代码基础上修改而来的。
1.实现思路
读取图像,初始化参数,载入模型,载入词典,场景文本提取,提取后文本识别,检测结果后处理。
2.实现步骤
//[1]初始化参数//DB文本检测模型cv::String detModelPath ="D:/models/TextRecognitionModel_google/DB_TD500_resnet50.onnx";float binThresh = 0.3; float polyThresh = 0.5; double unclipRatio = 2.0; uint maxCandidates = 200; int height = 736; int width = 736; //CRNN文本识别模型
cv::String recModelPath ="D:/models/TextRecognitionModel_google/crnn_cs_CN.onnx";cv::String vocPath ="D:/models/TextRecognitionModel_google/alphabet_3944.txt";int imreadRGB = 1;
//[2]载入模型cv::dnn::TextDetectionModel_DB detector(detModelPath);detector.setBinaryThreshold(binThresh).setPolygonThreshold(polyThresh).setUnclipRatio(unclipRatio).setMaxCandidates(maxCandidates);
//[3]载入词典CV_Assert(!vocPath.empty());std::ifstream vocFile;vocFile.open(samples::findFile(vocPath));CV_Assert(vocFile.is_open());cv::String vocLine;std::vector<String> vocabulary;while (std::getline(vocFile, vocLine)) {vocabulary.push_back(vocLine);}
//[4]推理cv::Mat frame = imread(samples::findFile(imgPath), imreadRGB);CV_Assert(!frame.empty());std::string recognitionResult = recognizer.recognize(frame);cv::imshow("evaluate image", frame);
//[5]载入图像cv::Mat frame = cv::imread("acmilan.jpg");std::cout << frame.size << std::endl;
//[6]推理std::vector< std::vector<cv::Point> > detResults;detector.detect(frame, detResults);
std::vector< std::vector<Point> > contours;for (uint i = 0; i < detResults.size(); i++){const auto& quadrangle = detResults[i];CV_CheckEQ(quadrangle.size(), (size_t)4, "");contours.emplace_back(quadrangle);std::vector<Point2f> quadrangle_2f;for (int j = 0; j < 4; j++)quadrangle_2f.emplace_back(quadrangle[j]);
案例3:使用C++ 和OpenCV 实现手写数字识别(HOG+SVM)
在了解了类的关键构造参数后,首先,创建HOGDescriptor类的一个实例hog,根据手写数字图像大小来初始化实例hog的参数:
HOGDescriptor hog(Size(20, 20), //winSizeSize(10, 10), //blocksizeSize(5, 5), //blockStrideSize(10, 10), //cellSize9, //nBins1, //derivAper-1, //winSigma0, //histogramNormType0.2, //L2HysThresh1,//gammal correction64,//nlevels=641);//Use signed gradients
然后,调用HOGDescriptor类的compute方法计算HOG特征,得到特征描述子descriptors:
vector<float> descriptors;hog.compute(img, descriptors);
接着,将特征描述子descriptors转换成OpenCV的Mat数据类型,并存入训练样本集:
vector<Mat> trainDataVec
trainDataVec.push_back(Mat(descriptors).clone());
最后,使用convert_to_ml函数将vector<cv::Mat>类型的样本特征向量集转成OpenCV机器学习算法要求的训练数据集格式:
void convert_to_ml(const vector<Mat> & train_samples, Mat& trainData)
{//--Convert dataconst int rows = (int)train_samples.size();const int cols = (int)std::max(train_samples[0].cols,train_samples[0].rows);Mat tmp(1, cols, CV_32FC1); trainData = Mat(rows, cols, CV_32FC1);for (size_t i = 0; i < train_samples.size(); ++i){CV_Assert(train_samples[i].cols == 1 || train_samples[i].rows == 1);if (train_samples[i].cols == 1){transpose(train_samples[i], tmp);tmp.copyTo(trainData.row((int)i));}else if (train_samples[i].rows == 1){train_samples[i].copyTo(trainData.row((int)i));}}
}
前文介绍了如何计算每幅图像的HOG特征,并将其组成训练样本。下面编写函数generateDataSet,完成整个数据集的制作:
/** @生成模型的训练集与测试集
参数1:img,输入,灰度图像,由固定尺寸的小图像拼接成的大图,不同类别的小图像依次排列
参数2:trainDataVec,输出,训练集维度为训练样本数×单个样本特征数,CV_32F类型
参数3:testDataVec,输出,测试集维度为测试样本数×单个样本特征数,CV_32F类型
参数4:trainLabel,输出,训练集标签维度为训练样本数×1,int型向量
参数4:testLabel ,输出,测试集标签维度为测试样本数×1,int型向量
参数5:train_rows,输入,用于训练的样本所占的行数,默认4行用于训练,1行用于测试
参数6:HOG_flag,输入。true:提取HOG特征描述子作为特征向量。false:直接使用图像原始像素
*/
void generateDataSet(Mat &img, vector<Mat> &trainDataVec, vector<Mat> &testDataVec, vector<int> &trainLabel, vector<int> &testLabel, int train_rows, bool HOG_flag)
{//初始化图像中切片图像与其他参数int width_slice = 20; //单个数字切片图像的宽度int height_slice = 20; //单个数字切片图像的高度int row_sample = 100; //每行样本数int col_sample = 50; //每列样本数int row_single_number = 5; //单个数字占5行int test_rows = row_single_number - train_rows; //测试样本所占行数Mat trainMat(train_rows * 20 * 10, img.cols, CV_8UC1); //存放所有训练图片trainMat = Scalar::all(0);Mat testMat(test_rows * 20 * 10, img.cols, CV_8UC1); //存放所有测试图片testMat = Scalar::all(0);//生成测试大图和训练大图for (int i = 1; i <= 10; i++){Mat tempTrainMat = img.rowRange((i - 1) * row_single_number * 20, (i *row_single_number - 1) * 20).clone();Mat tempTestMat = img.rowRange((i * row_single_number - 1) * 20, (i * row_single_number) * 20).clone();//traincv::Mat roi_train = trainMat(Rect(0, (i - 1) * train_rows * 20,tempTrainMat.cols, tempTrainMat.rows));Mat mask_train(roi_train.rows, roi_train.cols, roi_train.depth(),Scalar(1));//testcv::Mat roi_test = testMat(Rect(0, (i - 1) * test_rows * 20,tempTestMat.cols, tempTestMat.rows));Mat mask_test(roi_test.rows, roi_test.cols, roi_test.depth(),Scalar(1));//把提取的训练测试行分别复制到训练图片与测试图片中tempTrainMat.copyTo(roi_train, mask_train);tempTestMat.copyTo(roi_test, mask_test);}
应用提示
更多内容后续逐步更新,大家也可使用原书(含全套源码)学习参考。
内容截图
书中部分模型与附件文件下载地址
分类算法模型
链接:https://pan.baidu.com/s/1rlapvOnKBCR9CruaGW0K0Q
提取码:5etb
跟踪算法模型
链接:https://pan.baidu.com/s/1Os5a_ZiZ_RLnMvpbjEeIlA
提取码:vqnx
分割算法的color.txt
链接:https://pan.baidu.com/s/1wP0X67BFn68M46gJeUFlGw
提取码:b05v
检测算法的coco.names
链接:https://pan.baidu.com/s/1MU6Rje8oeFbLeTfdpf82Ng
提取码:ued4
本文分析算法的词典文件
链接:https://pan.baidu.com/s/1UTtuGKIQu3n0Kjzb7CR7Ww
提取码:kqbf
本文更新链接:OpenCV4机器学习算法原理与编程实战(附部分模型下载地址)_iracer的博客-CSDN博客_opencv4机器学习算法原理与编程实战
OpenCV4机器学习算法原理与编程实战(附部分模型下载地址)相关推荐
- TensorFlow深度学习算法原理与编程实战 人工智能机器学习技术丛书
作者:蒋子阳 著 出版社:中国水利水电出版社 品牌:智博尚书 出版时间:2019-01-01 TensorFlow深度学习算法原理与编程实战 人工智能机器学习技术丛书 ISBN:97875170682 ...
- 郑捷《机器学习算法原理与编程实践》学习笔记(第七章 预测技术与哲学)7.1 线性系统的预测...
7.1.1 回归与现代预测 7.1.2 最小二乘法 7.1.3 代码实现 (1)导入数据 def loadDataSet(self,filename): #加载数据集X = [];Y = []fr = ...
- 郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(三)SVD...
4.5.1 SVD算法回顾 A = U∑VT 其中:A是N*M的矩阵,U是M*M的方阵(里面向量正交,称为左奇异向量),∑是一个M*N的矩阵,VT是一个N*N的矩阵(里面向量正交,右奇异向量) 那么奇 ...
- halcon机器视觉算法原理与编程实战_快速弄懂机器学习里的集成算法:原理、框架与实战...
作者: 博观厚积 简书专栏:https://www.jianshu.com/u/2f376f777ef1 1. 关于集成学习算法 集成学习算法,通俗地讲就是:三个臭皮匠,顶个诸葛亮,这在很多地方都有 ...
- scikit-learn机器学习常用算法原理及编程实战(五)
决策树 决策树是最经典的机器学习模型之一.预测速度快,可以处理类别型数据和连续型数据.通过本章读者可以掌握以下内容: 信息熵及信息增益的概念,以及决策树的分裂的原则: 决策树的创建及剪枝算法: sci ...
- 特征值 与特征向量(机器学习算法原理与实践)
取至:机器学习算法原理与编程实践(郑捷) # -*- coding: utf-8 -*- # Filename : matrix05.py import operator from numpy imp ...
- 《机器学习:算法原理与编程实践》的读书笔记:SMO部分最难,大部分代码基于Scikit-Learn,决策树其实用处不大
机器学习:算法原理与编程实践 目录 [隐藏] 1 机器学习的基础 2 中文文本分类 3 决策树的发展 4 推荐系统原理 5 梯度寻优 6 神经网络初步 7 预测的技术与哲学 8 万能分类器:SVM 9 ...
- python教程下载地址-最新python实战教程网盘下载地址
原标题:最新python实战教程网盘下载地址 Python在程序员中始终流行:40%的受访者都会学习,44%的受访者每周都会学习.目前技术领域最热点的技术排名,排在前一位的是:Python.Pytho ...
- Win10 .Net framework 3.5离线安装包(附安装方法)下载地址
Win10 .Net framework 3.5离线安装包(附安装方法)下载地址 很多办公环境是没有外网的,而Win10又不自带.net 3.5,导致很多运行在.net 2.0\3.0\3.5的程序无 ...
最新文章
- php 一次性替换多个关键词
- Android平台下OpenGL初步
- mysql 下载地址及安装教程
- 合并excel文件 C语言,再见Ctrl + C!合并100个Excel表格,只需30秒!
- goupby 两个值 结果变了_一道问题引出的python中可变数据类型与不可变数据类型...
- 更新fielddata为true_线程与更新UI,细谈原理
- HACMP环境修改IP的方法
- CSS动画效果构成分析
- [转]C# 中的常用正则表达式总结
- RxJava 在Android中的应用
- 睡眠分期--深度学习算法
- 五款优秀免费的在线抠图工具
- 震旦打印机扫描件到电脑设置流程
- 大数据技术之Hadoop(入门)
- openssl 签发证书相关命令
- NRF24L01-状态寄存器
- 固态硬盘系统迁移踩过的坑
- 联想服务器AR系列,联想正式发布AR一体机:晨星AR
- 试验解析抖音无水印视频【PHP版】
- 【转】怎样评价寒武纪的芯片1P 1M和MLU100?能够叫板英伟达吗?
热门文章
- 数据结构、数据类型、抽象数据类型之间的区别
- python快速排序算法没看懂_你需要知道的九大排序算法【Python实现】之快速排序...
- 扩展 Jianyi的SmartQuery,正式发布 ListQuery WebPart,已发布到Codeplex.CamlQuery项目中...
- mybatis报错:前言中不允许有内容
- 杨辉三角Work08
- 近视手术?医学界的一个阴谋
- chickens come home to roost恶有恶报
- 适合数据库管理者的七个空间数据库(在2021版本中)
- 切比雪夫不等式例题讲解_【初一】含字母参数的一元一次不等式(组)的解题技巧...
- python数据分析 - 各种图