摘要
- 计算机视觉库:OpenCV
- Using OpenCV with Node.js
Privious
OpenCV ( Open Source Computer Vision Library ),是一个基于C/C++语言的计算机视觉库,在跨平台图像/视频处理、模式识别、人机交互、机器人等领域有广泛的应用。
OpenCV 包含机器学习库,支持传统的机器学习算法(决策树、朴素贝叶斯、支持向量机、随机森林等),近期的版本演进侧重于增强深度学习的支持,例如 OpenCV 3.3 将深度神经网络(Deep neural networks,DNN ) 提升到主代码库(promote DNN module from opencv_contrib to the main repository),2017 年 12 月发布的 OpenCV 3.4 针对 R-CNN 进行了性能优化。
OpenCV 的主要编程是 C++ ,大部分的接口也是基于 C++,但它仍然保留着很多 C 接口(功能不完整)。绑定语言(binding)有 Python,java 和 MATLAB /OCTAVE ,另外还有一些其他语言的包装器(wrapper)如 C# , Perl , Haskell 和 Ruby。opencv4nodejs 项目是一个支持所有 OpenCV 3 的 Node.js 绑定,有助于弥补 JavaScript 缺乏计算机视觉实现的不足,为 Node.js 优势应用场景的选型中提供了更多选择(例如使用 WebSocket 推送技术创建实时 Web 应用)。
前文回顾:Machine Learning(一):基于 TensorFlow 实现宠物血统智能识别 中演示了一个图像识别的案例,我们来看看基于 OpenCV + Node.js 是如何实现的:
Using OpenCV with Node.js
Enviroment
1 | $ cmake --version |
Load InceptionModel
Tensorflow Inception Model 是一个已经被训练好的模型,可以识别数千类对象,只要将图像输入就可以输出推测的一个分类概率。Tensorflow Inception Model 包括 ‘graph.pb’ 和 ‘label_strings.txt’ 两个文件,使用之前需要先加载。
1 | const cv = require('opencv4nodejs'); |
Image Classify
读取图片存储为 Blob 格式,调用 net.forward() (图像作为输入参数),此处我们仅输出概率高于 5% 的分类。
1 | const classifyImg = (img) => { |
Test
1 | const testData = [ |
1 | $ npm run tf-classify |
问题:对比之前 Machine Learning(一):基于 TensorFlow 实现宠物血统智能识别 的预测值,两次识别的结果很接近,但是又有不同,这是为什么呢?请注意后续更新。
OpenCV 概要
OpenCV ( Open Source Computer Vision Library ),是一个基于C/C++语言的跨平台图像/视频处理函数库。OpenCV 由英特尔公司于1999年发起并参与开发,以 BSD 许可证授权发行,可以在商业和研究领域中免费使用。OpenCV 主要用于开发实时的图像处理、计算机视觉以及模式识别程序。
OpenCV 的主要编程是 C++ ,大部分的接口也是基于 C++,但它仍然保留着很多 C 接口(不完整)。绑定语言(binding)有 Python,java 和 MATLAB /OCTAVE ,另外还有一些其他语言的包装器(wrapper)如 C# , Perl , Haskell 和 Ruby。
OpenCV 版本
OpenCV 第一个预览版本于 2000 年在 IEEE Conference 公开,目前每6个月就会有一个官方版本,由一个商业公司赞助的独立小组开发。
OpenCV 1.0:2006年发布
OpenCV 2.0:2009年10月发布,主要更新包括 C++ 接口
OpenCV 2.3:2011年6月发布,主要更新包括移动终端兼容性(NDK-Build)
OpenCV 3.0:2015年6月发布
OpenCV 3.3: 2017年8月发布,主要更新包括深度学习(promote DNN module from opencv_contrib to the main repository)
OpenCV 3.4: 2017年12月发布,主要更新包括 DNN 模块改进(包括 R-CNN 性能优化), Javascript 绑定和 OpenCL 实现
1 | #查看版本 |
OpenCV 主要模块
- cv 核心函数库
- cvaux 辅助函数库
- cxcore 数据结构与线性代数库
- highgui GUI 函数库,包括用户界面、读/写图像及视频
- ml 机器学习函数库,包括统计模型、贝叶斯、最近邻居、支持向量机、决策树、随机树、最大期望、神经网络等,详见Machine Learning:机器学习算法。
- gpu GPU加速,GPU模块及数据结构,包含图像处理与分析模块
OpenCV 主要功能
- 图像数据操作(内存分配与释放 allocation & release,图像复制 copying、设定和转换 setting & conversion)
- 矩阵/向量数据操作及线性代数运算(矩阵乘积、矩阵方程求解、特征值、奇异值分解)
- 支持多种动态数据结构(链表、队列、数据集、树、图)
- 基本图像处理(去噪、边缘检测、角点检测、采样与插值、色彩变换、形态学处理、直方图、图像金字塔结构)
- 结构分析(连通域/分支、轮廓处理、距离转换、图像矩、模板匹配、霍夫变换、多项式逼近、曲线拟合、椭圆拟合、狄劳尼三角化)
- 图像/视频的输入输出(支持文件或摄像头的输入,图像/视频文件的输出)
- 摄像头定标(寻找和跟踪定标模式、参数定标、基本矩阵估计、单应矩阵估计、立体视觉匹配)
- 运动分析(光流 optical flow、动作分割 motion segmentation、目标跟踪 tracking)
OpenCV 基本数据类型
- CvPoint:表示一个坐标为整数的二维点
- CvSize:表示矩阵框大小,以像素为精度。
- CvRect:通过方形左上角坐标和方形的高和宽来确定一个矩形区域
- CvScalar:用来存放像素值( double 数组,不一定是灰度值)
1 | typedef struct CvPoint |
OpenCV 与机器学习
OpenCV 包含机器学习库,支持以下算法:
- Boosting
- Decision tree learning
- Gradient boosting trees
- Expectation-maximization algorithm
- k-nearest neighbor algorithm
- Naive Bayes classifier
- Artificial neural networks
- Random forest
- Support vector machine (SVM)
- Deep neural networks (DNN) (OpenCV 3.3 promote DNN module from opencv_contrib to the main repository)
OpenCV 资源
- OpenCV github repo
- Using OpenCV with Node.js
- opencv4nodejs
- OpenCV编程简介 Introduction to programming with OpenCV
扩展阅读
《The Machine Learning Master》
- Machine Learning(一):基于 TensorFlow 实现宠物血统智能识别
- Machine Learning(二):宠物智能识别之 Using OpenCV with Node.js
- Machine Learning:机器学习项目
- Machine Learning:机器学习算法
- Machine Learning:如何选择机器学习算法
- Machine Learning:神经网络基础
- Machine Learning:机器学习书单
- Machine Learning:人工智能媒体报道集
- Machine Learning:机器学习技术与知识产权法
- Machine Learning:经济学家谈人工智能
- 数据可视化(三)基于 Graphviz 实现程序化绘图
参考文献
- The 5 Computer Vision Techniques That Will Change How You See The World
- Paper Rethinking the Inception Architecture for Computer Vision
- Node.js meets OpenCV’s Deep Neural Networks — Fun with Tensorflow and Caffe
- Build an Image Recognition API with Go and TensorFlow
- Train your own image classifier with Inception in TensorFlow | Wednesday, March 09, 2016 | Google Research Blog
- Node.js + OpenCV for Face Recognition
- Node.js + face-recognition.js : Simple and Robust Face Recognition using Deep Learning
- Node.js meets OpenCV’s Deep Neural Networks — Fun with Tensorflow and Caffe
- Machine Learning is Fun! Part 4: Modern Face Recognition with Deep Learning
- Machine Learning with OpenCV and JavaScript: Recognizing Handwritten Letters using HOG and SVM
- Live Face Detection in Go using OpenCV and MachineBox | video
- 雅虎开源色情图片检测神经网络