mingw编译librtmp
1 下载
MinGW和MSYS:http://www.mingw.org/
zlib:http://www.zlib.net/
openSSL:http://www.openssl.org/
ActiveState Perl:http://www.perl.org/
rtmpdump:http://rtmpdump.mplayerhq.hu/
2 编译
2.1 编译zlib1
2copy win32\makefile.gcc makefile.gcc
mingw32-make -f makefile.gcc
2.2 编译openssl1
2
3
4
5
6
7
8
9
10
11
12
13./configure mingw --prefix=`pwd`/win32libs -DL_ENDIAN -DOPENSSL_NO_HW
#修改Makefile和crypto/Makefile文件
#将gcc替换为mingw32-gcc
#将cc替换为mingw32-cc
#修改文件
#md2test.c
#dummytest.c修改为#include "dummytest.c"
#rc5test.c
#dummytest.c修改为#include "dummytest.c"
#jpaketest.c
#dummytest.c修改为#include "dummytest.c"
make
make install
2.3 编译rtmpdump
2.3.1 依赖文件
将openssl/include下openssl文件夹复制到/MinGW/include目录
将zlib下zconf.h和zlib.h复制/MinGW/include目录
将openssl下(libcrypto.a,libssl.a,ssleay32.lib,libeay32.lib)拷至/MinGW/lib目录
zlib下libz.a拷至/MinGW/lib目录
2.3.2 编译1
2make SYS=mingw
make SYS=mingw install
MinGW编译x264
1 准备
x264:http://www.videolan.org/developers/x264.html
下载对应系统的yasm放到/MinGW/msys/1.0/bin下,重新命名为yasm.exe
2 编译
./configure –enable-shared
make
基于Mirror Driver的屏幕捕捉技术
1 | int _tmain(int argc, _TCHAR* argv[]) |
Directshow开发指南-Filter
Filter是Directshow中最基本的概念。Directshow使用FilterGraph来管理Filter。
Filter一般由一个或多个Pin组成,Filter之间通过Pin相互连接,构成一条顺序的链路。Filter根据实现功能的不同大致可分为3类:source filters、transform filters和rendering filters。
Filter是一种Com组将。每个Filter实现了IBaseFilter接口。
Filter通过API函数CoCreateInstance完成。
Filter使用媒体类型(Media Type)来描述数据流1
2
3
4
5
6
7
8
9
10
11Typedefstruct _MediaType{
GUID Majortype;
GUID Subtype;
BOOL bFixedSizeSamples;
BOOL bTemporalCompression;
ULONG lSampleSize;
GUID Formattype;
Iunknown *pUnk;
ULONG cbFormat;
BYTE *pbFormat;
}AM_MEDIA_TYPE;
媒体类型主要用3部分来描述:majortype(主类型)、subtype(辅助说明类型)和formattype(格式细节类型)
Majortype:定性的描述媒体类型,比如MEDIATYPE_Video,MEDIATYPE_Audio等
Subtype:辅助说明majortype,指明具体是哪种格式,例如,UYVY、YUY2
Formattype:指定了一种进一步描述格式细节的数据结构类型,包括视频图像大小、帧率,这个描述格式细节的数据块指针保存在pbFormat成员中。
Filter的连接:
1.Filter GraphManager在输出Pin上调用Ipin::Connect(带输入Pin的指针作为参数);
2.如果输出Pin接受连接,则调用输入Pin上的Ipin::ReceiveConnection;
3.如果输入Pin也接受这次连接,则双方连接成功。
Filter的Merit值,Merit可以理解成为Filter被智能连接所使用的优先级。1
2
3
4
5
6
7
8
9Enum
{
MERIT_PREFERRED
MERIT_NORMAL
MERIT_UNLIKELY
MERIT_DO_NOT_USE
MERIT_SW_COMPRESSOR
MERIT_HW_COMPRESSOR
};
Merit值只有在大于MERIT_DO_NOT_USE的时候,才有可能被智能连接所使用
神经网络
神经网络是由简单处理单元构成的大规模并行分布式处理器,天然地具有存储经验知识和使之可用的特性。神经网络在两个方面与大脑相似:
1.神经网络是通过学习过程从外界环境中获取知识的。
2.互连神经元的连接强度,即突触权值,用于存储获取的知识。
神经网络的性质和能力
1.非线性。
2.输入输出映射。称之为有教师学习或监督学习的关于学习的流行方法。它使用带表号的训练样例或任务样例对神经网络的突触权值进行修改。
3.自适应性。神经网络具有调整自身突触权值以适应外界环境变化的固有能力。
4.证据响应。在模式分类问题中,神经网络可以设计成不仅提供选择哪一个特定模式的信息,还提供关于决策的置信度信息。
5.上下文信息。网络中每一个神经元都受网络中所有其他神经元全局活动的潜在影响。
6.容错性。由于网络存储的分布特性,神经网络从性能上显示了一个缓慢恶化的过程而不是灾难性的失败。
7.VLSI实现。神经网络的大规模并行性使它具有快速处理某些任务的潜在能力。
8.分析和设计的一致性。基本上,神经网络作为信息处理器具有通用性。
9.神经生物类比。神经网络的设计是由与人脑的类比引发的。
Apriori
优点:易编码实现。
缺点:在大数据集上可能较慢。
适用数据类型:数值型或者标称型数据。
规则的支持度和置信度是规则兴趣度的两种度量。它们分别反映所发现规则的有用性和确定性。关联规则的支持度为2%,意味着所分析的所有事务的2%显示计算机和杀毒软件被同时购买。置信度60%意味购买计算机的顾客60%也购买了杀毒软件。
Apriori算法的一般过程
1.收集数据:使用任意方法。
2.准备数据:任何数据类型都可以,因为我们只保存集合。
3.分析数据:使用任意方法。
4.训练算法:使用Apriori算法来找到频繁项集。
5.测试算法:不需要测试过程。
6.使用算法:用于发现频繁项集以及物品之间的关联规则。
Apriori原理
Apriori原理是说如果某个项集市频繁的,那么它的所有子集也是频繁的。这意味着如果{0, 1}是频繁的,那么{0}、{1}也一定是频繁的。这个原理直观上并没有什么帮助,但是如果反过来看就有用了,也就是说如果一个项集是非频繁集,那么它的所有超集也是非频繁的。
伪代码
当集合中项的个数大于0时
构建一个k个项组成的候选项集的列表
检查数据以确认每个项集都是频繁的
保留频繁项集并构建k + 1项组成的候选项集的列表
决策树
ID3算法,C4.5算法,CART算法
优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据。
缺点:可能会产生过度匹配问题。
适用数据类型:数值型和标称型。
1.收集数据:可以使用任何方法。
2.准备数据:树构造算法只适用于标称型数据,因此数值型数据必须离散化。
3.分析数据:可以使用任何方法,构造树完成之后,我们应该检查图形是否符合预期。
4.训练算法:构造树的数据结构。
5.测试算法:使用经验树计算错误率。
6.使用算法:此步骤可以适用于任何监督学习算法发,而使用决策树可以更好地理解数据的内在含义。
划分数据集的大原则是:将无需的数据变得更加有序。
组织杂乱无章数据的一种方法就是使用信息论度量信息。
在划分数据集之前之后发生的变化称为信息增益。集合信息的度量方式称为香农熵或者简称为熵。
熵定义为信息的期望值。如果待分类的事务可能划分在多个分类之中,则
所有类别所有可能值包含的信息期望值,
另一种度量集合无序程度的方法是基尼不纯度
从一个数据集中随机选取子项,度量其被错误分类到其他分组里的概率。
决策树分类器就像带有终止块的流程图,终止块表示分类结果。开始处理数据集时,我们首先需要测量集合中数据的不一致性,也就是熵,然后寻找最优方案划分数据集,直到数据集中的所有数据属于同一分类。ID3算法可以用于划分标称型数据集。构建决策树时,我们通常采用递归的方法将数据集转化为决策树。
机器学习-sklearn
Scikit-Learn 设计的 API 设计的非常好。它的主要设计原则是:
一致性:
所有对象的接口一致且简单:
估计器(estimator)
任何可以基于数据集对一些参数进行估计的对象都被称为估计器(比如, imputer 就是个估计器)。
估计本身是通过 fit() 方法,只需要一个数据集作为参数(对于监督学习算法,需要两个数据集;第二个数据集包含标签)。
任何其它用来指导估计过程的参数都被当做超参数(比如 imputer 的 strategy ),
并且超参数要被设置成实例变量(通常通过构造器参数设置) 。
转换器(transformer)
一些估计器(比如 imputer ) 也可以转换数据集,这些估计器被称为转换器。
API也是相当简单:转换是通过 transform() 方法,被转换的数据集作为参数。
返回的是经过转换的数据集。转换过程依赖学习到的参数,比如 imputer 的例子。
所有的转换都有一个便捷的方法 fit_transform() ,等同于调用 fit() 再 transform() (但有时 fit_transform() 经过优化,运行的更快) 。
预测器(predictor)
最后,一些估计器可以根据给出的数据集做预测,这些估计器称为预测器。
例如,上一章的 LinearRegression 模型就是一个预测器:它根据一个国家的人均 GDP 预测生活满意度。
预测器有一个 predict() 方法,可以用新实例的数据集做出相应的预测。
预测器还有一个 score() 方法,可以根据测试集(和相应的标签,如果是监督学习算法的话) 对预测进行衡器。
可检验
所有估计器的超参数都可以通过实例的public变量直接访问(比如, imputer.strategy ),
并且所有估计器学习到的参数也可以通过在实例变量名后加下划线来访问(比如, imputer.statistics_ )。
类不可扩散
数据集被表示成 NumPy 数组或 SciPy 稀疏矩阵,而不是自制的类。
超参数只是普通的 Python 字符串或数字。
可组合
尽可能使用现存的模块。
例如,用任意的转换器序列加上一个估计器,就可以做成一个流水线,后面会看到例子。
合理的默认值
Scikit-Learn 给大多数参数提供了合理的默认值,很容易就能创建一个系统。
机器学习-概览
根据训练时监督的量和类型进行分类
监督学习
之所以称为监督学习,是因为这类算法必须知道预测什么,即目标变量的分类信息。(分类、回归)
- K近邻算法
- 线性回归
- 逻辑回归
- 支持向量机
- 决策树和随机森林
神经网络
无监督学习
此时数据没有类别信息,也不会给定目标值。(聚类)
聚类
- K均值
- 层次聚类分析(HCA)
- 期望最大值
- 可视化和降维
- 主成分分析(PCA)
- 核主成分分析
- 局部线性嵌入(LLE)
- t-分布领域嵌入算法(t-SNE)
- 关联性规则学习
- Apriori算法
- Eclat算法
半监督学习
一些算法可以处理部分带标签的训练数据,通常是大量不带标签数据加上小部分带标签数据。
- 深度信念网络
- 受限玻尔兹曼机(RBM)
强化学习
学习系统在这里被称为(agent),可以对环境进行观察,选择和执行动作,获得奖励(惩罚)。然后它必须自己学习哪个是最佳方法(策略),
以得到长久的最大奖励。策略决定了智能体在给定情况下应该采取的行动。
根据是否能从导入的数据流进行持续学习
在线学习
在线学习中,使用数据实例持续地进行训练,可以一次一个或一次几个实例(小批量),且自动对改变做出调整。
在线学习系统的一个重要参数是,它们可以多快地适应数据的改变:这被称为学习速率。
在线学习的挑战之一是,如果坏数据被用来进行训练,系统的性能就会逐渐下滑。
例如,坏数据可能来自失灵的传感器或机器人,或某人向搜索引擎传入垃圾信息以提高搜索排名。要减小这种风险,你需要密集监测,
如果检测到性能下降,要快速关闭(或是滚回到一个之前的状态) 。
你可能还要监测输入数据,对反常数据做出反应(比如,使用异常检测算法) 。
批量学习
在批量学习中,系统不能进行持续学习:必须用所有可用数据进行训练。首先是进行训练,然后部署在生产环境且停止学习,
它只是使用已经学到的策略。这称为离线学习。
如何进行归纳推广
大多机器学习任务是关于预测的。这意味着给定一定数量的训练样本,系统需要能推广到之前没见到过的样本。
对训练数据集有很好的性能还不够,真正的目标是对新实例预测的性能。
基于实例学习
系统先用记忆学习案例,然后使用相似度测量推广到新的例子
如果用这种方法做一个垃圾邮件检测器,只需标记所有和用户标记的垃圾邮件相同的邮件 。
一个(简单的) 相似度测量方法是统计两封邮件包含的相同单词的数量。如果一封邮件含有许多垃圾邮件中的词,就会被标记为垃圾邮件。
基于模型学习
另一种从样本集进行归纳的方法是建立这些样本的模型,然后使用这个模型进行预测。这称作基于模型学习。
首先,选一个线性模型。
接下来,就是线性回归算法,你用训练样本训练算法,算法找到使线性模型最拟合数据的参数。这称作模型训练。
最后,可以准备运行模型进行预测了。
机器学习算法应用程序开发步骤:
1.收集数据
2.准备输入数据
3.分析输入数据
4.训练算法(无监督学习除外,由于不存在目标变量,故而也不需要训练算法)
5.测试算法
6.使用算法
机器学习的主要挑战
训练数据量不足
需要大量数据,才能让多数机器学习算法正常工作。即便对于非常简单的问题,一般也需要数千的样本,
对于复杂的问题,比如图像或语音识别,你可能需要数百万的样本
没有代表性的训练数据
为了更好地进行归纳推广,让训练数据对新数据具有代表性是非常重要的。无论你用的是基于实例学习或基于模型学习,这点都很重要。
如果样本太小,就会有样本噪声(即,会有一定概率包含没有代表性的数据),
但是即使是非常大的样本也可能没有代表性,如果取样方法错误的话。这叫做样本偏差。
低质量数据
如果训练集中的错误、异常值和噪声(错误测量引入的) 太多,系统检测出潜在规律的难度就会变大,性能就会降低。
不相关的特征
进来的是垃圾,出去的也是垃圾。你的系统只有在训练数据包含足够相关特征、非相关特征不多的情况下,才能进行学习。
机器学习项目成功的关键之一是用好的特征进行训练。
过拟合训练数据
模型在训练数据上表现很好,但是推广效果不好。
复杂的模型,比如深度神经网络,可以检测数据中的细微规律,但是如果训练集有噪声,或
者训练集太小(太小会引入样本噪声) ,模型就会去检测噪声本身的规律。很明显,这些规
律不能推广到新实例。
欠拟合训练数据
当你的模型过于简单时就会发生。例如,生活满意度的线性模型倾向于欠拟合;现实要比这个模型复杂的多,所以预测很难准确,
即使在训练样本上也很难准确。