作为一种人工智能, 机器学习使计算机能够通过经验学习: 使用过去收集的数据预测未来. 最重要的是, 计算机视觉是当今最令人兴奋的机器学习应用领域之一, 深度学习和卷积神经网络推动创新系统, 如自动驾驶汽车和谷歌的 DeepMind.
在本章中, 我们将讨论为什么机器学习变得如此受欢迎, 并讨论它可以解决的问题类型. 在整本书中, 我将假设您已经掌握了 OpenCV 和 Python 的基本知识.
机器学习入门
机器学习已经存在了至少 60 年. 在寻求人工智能的过程中, 早期的机器学习系统使用 if ... else 语句的手工编码规则来处理数据和做出决策. 想想一个垃圾邮件过滤器, 其工作是解析传入的电子邮件并将不需要的邮件移动到垃圾邮件文件夹:
image.PNG
我们可以提出单词黑名单, 只要它们出现在邮件中, 就将电子邮件标记为垃圾邮件. 如果将它们组合并嵌套在决策树中, 这些专家决策规则可变得任意复杂.
image.PNG
手动编码这些决策规则有时是可行的, 但有两个主要缺点:
逻辑仅适用于单个特定任务. 例如无法使用此垃圾邮件过滤器标记朋友的照片.
需要深入了解问题. 我们必须确切地知道哪种类型的电子邮件构成垃圾邮件及可能的例外.
这就是机器学习的用武之地. 有时, 任务无法很好地定义, 机器学习通常可以用来提取这些隐藏的关系 (也称为数据挖掘).
如今多数智能手机可以检测到图像中的脸部. 但是 20 几年前, 这个问题没有得到解决. 人类倾向于不以像素为单位思考. 我们寻找定义面部特征, 例如眼睛, 鼻子, 嘴巴等, 始终没想出一套好的决策规则来定义面部. 然而卷积神经网络和深度学习能识别人脸. 我们所要做的只是简单地呈现面部图像的集合到机器. 机器就能够发现一组特征来识别面部, 这是机器学习的真正力量. 我们需要的是解决问题, 而不一定要找出其定义规则. 好比中医能解决很多西医解决不了的问题, 西医的理论认为中医的结果很多无法用西医解释, 但是实际中医上也是成千上万年自然机器学习的结果.
机器学习可以解决的问题
大多数机器学习问题属于以下三个主要类别:
监督学习. 每个数据点都被标记或与类别. 比如分类标签将图像指定为猫或狗. 有训练数据和测试数据
无监督学习. 以某种方式组织数据或描述其结构. 这可能意味着将它们分组或查找查看复杂数据的不同方式使它们看起来更简单.
强化学习中, 算法可以选择响应每个数据点的动作. 这是机器人技术中常见的传感器方法, 一个时间点的读数是一个数据点, 算法必须选择机器人的下一步行动. 它也非常适合物联网应用, 其中学习算法在短时间内收到奖励信号. 基于此, 算法修改其策略以获得最高回报.
这三个主要类别如下图所示:
image.PNG
许多开源机器学习库提供了比 OpenCV 更多的功能. 一个突出的例子是 scikit-learn, 它提供了许多最先进的机器学习算法以及丰富的在线教程和代码片段. 由于 OpenCV 主要是为了提供计算机视觉算法而开发的, 因此其机器学习功能仅限于一个名为 ml 的模块. OpenCV 仍然提供了许多最先进的算法, 但有时缺乏一些功能. 为此我们需要将 scikitlearn 等和 opencv 结合.
对效率要求比较高的, 可以考虑采用: cython,joblib,dask(相关链接 https://GitHub.com/china-testing/python-API-tesing
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
image.PNG
还可以基于用户搜索 $ 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
如果你不想安装本书环境, 也可以访问:
环境检验:
- $ 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 文件夹, 您将找到本书的所有代码:
image.PNG
点击笔记 01.00-A-Taste-of-Machine-Learning.ipynb, 您可以通过选择 Kernel> Restart&Run All 来自己运行代码:
image.PNG
有一些方便的键盘快捷键用于 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__']
参考
来源: http://www.jianshu.com/p/a0346e339788