作为一种人工智能,机器学习使计算机能够通过经验学习:使用过去收集的数据预测未来。最重要的是,计算机视觉是当今最令人兴奋的机器学习应用领域之一,深度学习和卷积神经网络推动创新系统,如自动驾驶汽车和谷歌的DeepMind。
在本章中,我们将讨论为什么机器学习变得如此受欢迎,并讨论它可以解决的问题类型。在整本书中,我将假设您已经掌握了OpenCV和Python的基本知识。
机器学习入门
机器学习已经存在了至少60年。 在寻求人工智能的过程中,早期的机器学习系统使用if ... else语句的手工编码规则来处理数据和做出决策。 想想一个垃圾邮件过滤器,其工作是解析传入的电子邮件并将不需要的邮件移动到垃圾邮件文件夹:
我们可以提出单词黑名单,只要它们出现在邮件中,就将电子邮件标记为垃圾邮件。如果将它们组合并嵌套在决策树中,这些专家决策规则可变得任意复杂。
手动编码这些决策规则有时是可行的,但有两个主要缺点:
- 逻辑仅适用于单个特定任务。例如无法使用此垃圾邮件过滤器标记朋友的照片。
- 需要深入了解问题。我们必须确切地知道哪种类型的电子邮件构成垃圾邮件及可能的例外。
这就是机器学习的用武之地。有时,任务无法很好地定义,机器学习通常可以用来提取这些隐藏的关系(也称为数据挖掘)。
如今多数智能手机可以检测到图像中的脸部。但是20几年前,这个问题没有得到解决。人类倾向于不以像素为单位思考。我们寻找定义面部特征,例如眼睛,鼻子,嘴巴等,始终没想出一套好的决策规则来定义面部。然而卷积神经网络和深度学习能识别人脸。我们所要做的只是简单地呈现面部图像的集合到机器。机器就能够发现一组特征来识别面部,这是机器学习的真正力量。我们需要的是解决问题,而不一定要找出其定义规则。好比中医能解决很多西医解决不了的问题,西医的理论认为中医的结果很多无法用西医解释,但是实际中医上也是成千上万年自然机器学习的结果。
机器学习可以解决的问题
大多数机器学习问题属于以下三个主要类别:
监督学习。每个数据点都被标记或与类别。比如分类标签将图像指定为猫或狗。有训练数据和测试数据
无监督学习。以某种方式组织数据或描述其结构。这可能意味着将它们分组或查找查看复杂数据的不同方式使它们看起来更简单。
强化学习中,算法可以选择响应每个数据点的动作。这是机器人技术中常见的传感器方法,一个时间点的读数是一个数据点,算法必须选择机器人的下一步行动。它也非常适合物联网应用,其中学习算法在短时间内收到奖励信号。基于此,算法修改其策略以获得最高回报。
这三个主要类别如下图所示:
许多开源机器学习库提供了比OpenCV更多的功能。一个突出的例子是scikit-learn,它提供了许多最先进的机器学习算法以及丰富的在线教程和代码片段。由于OpenCV主要是为了提供计算机视觉算法而开发的,因此其机器学习功能仅限于一个名为ml的模块。OpenCV仍然提供了许多最先进的算法,但有时缺乏一些功能。为此我们需要将scikitlearn等和opencv结合。
对效率要求比较高的,可以考虑采用:cython、joblib、dask(相关链接
Anaconda简介
Anaconda 是一种Python语言的免费增值开源发行版,用于进行大规模数据处理、预测分析,和科学计算,致力于简化包的管理和部署。Anaconda使用软件包管理系统Conda进行包管理。Anaconda跨平台,集成了NumPy、SciPy、scikit-learn、Matplotlib和Jupyter Notebook等优秀库。
下载后直接双击安装。使用时,可以点击启动相应的编程环境:
Python(shell) : 标准CPython
IPython(shell): 相当于在命令窗口的命令提示符后输入ipython回车。pip install ipython安装的ipython用法一样。
Ipython QTConsole
IPython Notebook:直接点击打开,或者在命令提示符中输入ipython.exe notebook
Jupyter QTConsole
Jupyter Notebook:直接点击打开,或在终端中输入: jupyter notebook 以启动服务器;在浏览器中打开notebook页面地址:http://localhost:8888 。Jupyter Notebook是一种 Web 应用,能让用户将说明文本、数学方程、代码和可视化内容全部组合到一个易于共享的文档中。
Spyder:直接点击打开IDE。最大优点就是模仿MATLAB的“工作空间”
Anaconda Prompt : 命令行终端
支持其他IDE,如Pycharm
安装包管理,
列出已经安装的包:在命令提示符中输入pip list或者用conda list
安装新包:在命令提示符中输入“pip install 包名”,或者“conda install 包名”
更新包: conda update package_name
升级所有包: conda upgrade --all
卸载包:conda remove package_names
搜索包:conda search search_term
管理环境:
安装nb_conda,用于notebook自动关联nb_conda的环境
创建环境:在Anaconda终端中 conda create -n env_name package_names[=ver]
使用环境:在Anaconda终端中 activate env_name
离开环境:在Anaconda终端中 deactivate
导出环境设置:conda env export > environmentName.yaml 或 pip freeze > environmentName.txt
导入环境设置:conda env update -f=/path/environmentName.yaml 或 pip install -r /path/environmentName.txt
列出环境清单:conda env list
删除环境: conda env remove -n env_name
还可以基于用户搜索$ conda install -c user_name package_name
conda虚拟环境安装
$ conda config --add channels conda-forge
$ conda create -n Python3 python=3.5 --file requirements.txt
$ source activate Python3 # on Linux / Mac OS X
$ activate Python3 # on Windows
$ source deactivate # on Linux / Mac OS X
$ deactivate # on Windows
如果你不想安装本书环境,也可以访问:https://mybinder.org/v2/gh/mbeyeler/opencv-machine-learning/master
环境检验:
$ conda config --add channels conda-forge
$ conda create -n Python3 python=3.5 --file requirements.txt
$ source activate Python3 # on Linux / Mac OS X
$ activate Python3 # on Windows
$ source deactivate # on Linux / Mac OS X
$ deactivate # on Windows
$ jupyter notebook
这将打开浏览器窗口,显示当前目录中的文件列表。单击opencv-machine-learning文件夹,然后单击notebooks文件夹,您将找到本书的所有代码:
点击笔记01.00-A-Taste-of-Machine-Learning.ipynb,您可以通过选择Kernel> Restart&Run All来自己运行代码:
有一些方便的键盘快捷键用于Jupyter。刚开始需要知道的是:
- 单击单元格以进行编辑。
- 选中单元格后,按Ctrl + Enter执行其中的代码。
- 或者,按Shift + Enter执行单元格并选择其下方的单元格。
- 按Esc退出写入模式,然后按A键在当前选定的上方插入单元格,B在下面插入单元格。
快捷键的查看:Help > Keyboard Shortcut 或 Help > User Interface Tour
>>> import cv2
>>> cv2.__version__
'3.4.1'
>>> dir(cv2.ml)
['ANN_MLP_ANNEAL', 'ANN_MLP_BACKPROP', 'ANN_MLP_GAUSSIAN', 'ANN_MLP_IDENTITY', 'ANN_MLP_LEAKYRELU', 'ANN_MLP_NO_INPUT_SCALE', 'ANN_MLP_NO_OUTPUT_SCALE', 'ANN_MLP_RELU', 'ANN_MLP_RPROP', 'ANN_MLP_SIGMOID_SYM', 'ANN_MLP_UPDATE_WEIGHTS', 'ANN_MLP_create', 'ANN_MLP_load', 'BOOST_DISCRETE', 'BOOST_GENTLE', 'BOOST_LOGIT', 'BOOST_REAL', 'Boost_DISCRETE', 'Boost_GENTLE', 'Boost_LOGIT', 'Boost_REAL', 'Boost_create', 'Boost_load', 'COL_SAMPLE', 'DTREES_PREDICT_AUTO', 'DTREES_PREDICT_MASK', 'DTREES_PREDICT_MAX_VOTE', 'DTREES_PREDICT_SUM', 'DTrees_PREDICT_AUTO', 'DTrees_PREDICT_MASK', 'DTrees_PREDICT_MAX_VOTE', 'DTrees_PREDICT_SUM', 'DTrees_create', 'DTrees_load', 'EM_COV_MAT_DEFAULT', 'EM_COV_MAT_DIAGONAL', 'EM_COV_MAT_GENERIC', 'EM_COV_MAT_SPHERICAL', 'EM_DEFAULT_MAX_ITERS', 'EM_DEFAULT_NCLUSTERS', 'EM_START_AUTO_STEP', 'EM_START_E_STEP', 'EM_START_M_STEP', 'EM_create', 'EM_load', 'KNEAREST_BRUTE_FORCE', 'KNEAREST_KDTREE', 'KNearest_BRUTE_FORCE', 'KNearest_KDTREE', 'KNearest_create', 'LOGISTIC_REGRESSION_BATCH', 'LOGISTIC_REGRESSION_MINI_BATCH', 'LOGISTIC_REGRESSION_REG_DISABLE', 'LOGISTIC_REGRESSION_REG_L1', 'LOGISTIC_REGRESSION_REG_L2', 'LogisticRegression_BATCH', 'LogisticRegression_MINI_BATCH', 'LogisticRegression_REG_DISABLE', 'LogisticRegression_REG_L1', 'LogisticRegression_REG_L2', 'LogisticRegression_create', 'LogisticRegression_load', 'NormalBayesClassifier_create', 'NormalBayesClassifier_load', 'ParamGrid_create', 'ROW_SAMPLE', 'RTrees_create', 'RTrees_load', 'STAT_MODEL_COMPRESSED_INPUT', 'STAT_MODEL_PREPROCESSED_INPUT', 'STAT_MODEL_RAW_OUTPUT', 'STAT_MODEL_UPDATE_MODEL', 'SVMSGD_ASGD', 'SVMSGD_HARD_MARGIN', 'SVMSGD_SGD', 'SVMSGD_SOFT_MARGIN', 'SVMSGD_create', 'SVMSGD_load', 'SVM_C', 'SVM_CHI2', 'SVM_COEF', 'SVM_CUSTOM', 'SVM_C_SVC', 'SVM_DEGREE', 'SVM_EPS_SVR', 'SVM_GAMMA', 'SVM_INTER', 'SVM_LINEAR', 'SVM_NU', 'SVM_NU_SVC', 'SVM_NU_SVR', 'SVM_ONE_CLASS', 'SVM_P', 'SVM_POLY', 'SVM_RBF', 'SVM_SIGMOID', 'SVM_create', 'SVM_getDefaultGridPtr', 'SVM_load', 'StatModel_COMPRESSED_INPUT', 'StatModel_PREPROCESSED_INPUT', 'StatModel_RAW_OUTPUT', 'StatModel_UPDATE_MODEL', 'TEST_ERROR', 'TRAIN_ERROR', 'TrainData_create', 'TrainData_getSubVector', 'VAR_CATEGORICAL', 'VAR_NUMERICAL', 'VAR_ORDERED', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
参考
代码:https://github.com/mbeyeler/opencv-machine-learning
中文书籍技术支持:技术支持qq群: 144081101 591302926 567351477 钉钉免费群:21745728
Machine Learning for OpenCV - 2017.pdf