前两周的作业主要是关于Factor以及有向图的构造,但是概率图模型中还有一种更强大的武器——双向图(无向图、Markov Network)。与有向图不同,双向图可以描述两个var之间相互作用以及联系。描述的方式依旧是factor.本周的作业非常有实际意义——基于马尔科夫模型的图像文字识别系统(OCR)
图像文字识别系统(OCR)在人工智能中有着非常重要的应用。但是受到图像噪声,手写体变形,连笔等影响基于图像的文字识别系统比较复杂。PGM的重要作用就是解决那些测量过程复杂,测量结果不一定对,连续测量的情况(单次测量,前后比对,反复斟酌,寻找最优)。而英文文字往往由字母组成单词,所以适合利用概率图模型来进行建模。
概率图模型 OCR SLAM
单次测量——对单个字母的图像识别不准确;单次配准,转移矩阵求取不准确;
前后比对——结合单词字母组合规律 ;结合上一帧或前几帧的观测;
反复斟酌—— 图模型中更复杂的联系
寻找最优—— MAP估计
在文字识别系统中,文字的图像(var:I)总是被观测到,而所需要求得的字母(var(C))总是无法被观测到。所以我们建模的是P(C|I),此时的马尔科夫模型更为特殊,被称为条件随机场。
在构建复杂的概率图模型之前,应该先从简单的入手。尽管单次不准,也应该先对单次观测进行推测。所以,对于给定图像,获取其与字母之间关系的factor是必要的。此时的图模型如图所示。
此时,每个字母都是单独的一个图,我们也只需要指定每个字母与图像之间的factor——phi(I,C).由于图像总是被观测到了,所以这个factor里的变量只有C。但是,对于每个不同的小图而言,factor的val是不一样的,因为val代表了var取card中每个值的概率。factor的var应为字母的序号。card=26代表var的取值范围。val则由computeImageFactor给出。
由于图片不同会导致var的取值分布不同,所以这不能像之前那样构造好一个factor然后批量复制,而需要单独计算。在factor.val的计算中,使用了以下函数
1 function P = ComputeImageFactor (img, imgModel) 2 % This function computes the singleton OCR factor values for a single 3 % image. 4 % 5 % Input: 6 % img: The 16x8 matrix of the image 7 % imgModel: The provided, trained image model 8 % 9 % Output: 10 % P: A K-by-1 array of the factor values for each of the K possible 11 % character assignments to the given image 12 % 13 % Copyright (C) Daphne Koller, Stanford University, 2012 14 15 X = img(:); 16 N = length(X); 17 K = imgModel.K; 18 19 theta = reshape(imgModel.params(1:N*(K-1)), K-1, N); 20 bias = reshape(imgModel.params((1+N*(K-1)):end), K-1, 1); 21 22 W = [ bsxfun(@plus, theta * X, bias) ; 0 ]; 23 W = bsxfun(@minus, W, max(W)); 24 W = exp(W); 25 26 P=bsxfun(@rdivide, W, sum(W)); 27 28 29 end