机器学习决策树算法解决图像识别

来源:互联网 发布:java培训出来没底气 编辑:程序博客网 时间:2024/06/04 19:31

算法介绍

 什么是决策树算法

决策树又称判定树,是一个类似于流程图的树结构:其中,每个内部结点表示在一个属性上的测试,每个分支代表一个属性输出,而每个树叶结点代表类或类分布。树的最顶层是根结点。

构造决策树的基本算法

主要评估标准,准确率,速度,健壮性,可规模性,可解释性

样例:研究某人今天会不会出去玩?

历史数据:


从图片中可以看出来,此人前14天中9天出去玩,5天没有出去玩,其中由于天气情况原因,晴天2天出去玩,3天没有出去玩,阴天4天出去玩,0天没有出去玩,雨天3天出去玩,2天没有出去玩,然后由于湿度和风力影响,又有了下一轮决策是否出去玩的情况。以此类推分析分类此人是否会出去玩。

 

2.1.3 熵

  例子:猜世界杯冠军,假如一无所知,假如每个队夺冠的几率都是相等的,那么需要猜多少次?

 过程:是否是在前16只队伍中,32/2,用二分法可知,需要猜5次。

熵的单位是bit

info(D) = -(1/32*log(1/32)+1/32*log(1/32)+1/32*log(1/32) +1/32*log(1/32)+1/32*log(1/32)...)累加32次


info(D)= 5bit

结论:数据量越大,熵值越大,不准确率越高

 


熵的差值则为有条件后的概率优化程度,以前面的案例分析,如果直接猜测某人会不会出去玩。结果为:


如果加上天气情况分析,结果为:

所以在已知天气情况的条件下,数据准确率优化了0.246

 

2.1.4 算法优缺点

优点:直观,便于理解,小规模数据集有效

缺点:处理连续变量不好,类别较多时,错误增加的比较快,可规模性一般

 

 

2.2 逻辑分析

此时不得不让我非常开心,那如何利用决策树来做图像识别呢?对此还是让很多人无法理解,现在就慢慢向大家阐述。

再次对上述案例进行分析

天气

湿度

风力

是否出去玩

sunny

<=70

sunny

<=70

sunny

>70

不玩

sunny

>70

不玩

sunny

>70

不玩

overcast

overcast

overcast

overcast

rain

不玩

rain

不玩

rain

没风

rain

没风

rain

没风

然后程序化上述程序:

天气为三维,设置晴天为[1,0,0],那么多云为[0,1,0],雨天为[0,0,1]

湿度为三维,设置<=70为[1,0,0],那么>70为[0,1,0],无为[0,0,1]

风力为三维,设置有风为[1,0,0],那么无风为[0,1,0],无为[0,0,1]

是否出去玩为二维,设置玩为[1],不玩为[0]

由此可知第一项则为 [1,0,0,1,0,0,0,0,1],结果为[1]

以此类推。

    之后得出矩阵的计算其最优单位向量个数,

[1,0,0,1,0,0,0,0,1

 1,0,0,1,0,0,0,0,1

 1,0,0,0,1,0,0,0,0]

每三列则为一个特征向量,然后进行计算熵值最小情况下哪些向量所占权重最大。

但是如何去分析图像相似还是有很大距离,在图像中会有很大像素,例如60*60像素的图片,每个像素点会转换为类似[255,200,10]RGB类型,本报告进行简单分析,首先将图片进行灰度图化,转化为例如[245],然后对下个像素点大小与之比较,大则为0,小则为1,由于图像像素点大,之后会转换为复杂矩阵,之后再对矩阵进行特征向量切割,例如:

[1,0,0,1,0,0,0,0,1

 1,0,1,1,0,1,0,0,1

 1,0,0,0,1,0,0,0,0]

此矩阵特征向量则为2,1,2,3,1分列,然后在进行熵值计算,权重比对,计算出最合理向量权重占比,之后再对测试图像中的向量进行比对,就可以进算出其相似度。

图像分析结果相当出众,可以对动态相似图片与其他图片有比较大的区分。

 

6.3 代码实现

 

编程语言为python ,利用Anaconda2环境编写,测试图片见附录

# -*- coding: utf-8 -*-
import os
from PILimportImage
from PILimportImageFilter
from PILimportImageOps
from sklearnimporttree

def getCode(img,size):
    pixel_Y = []
    featurelist = []

   
for xinrange(0,size[0]):
       
global tmp
        pixel_X = []
       
for yinrange(0,size[1]):
            pixel = img.getpixel((x
, y))
            pixel_next = img.getpixel((x
, y+1))ify < size[1]-1elseNone
           
if pixel_nextis notNone:
                feature =
0 ifpixel < pixel_nextelse1
               
pixel_X.append(feature)
           
else:
                featurelist.append(tmp)
                pixel_X.pop()
                feature =
0
           
tmp = feature
        pixel_Y.append(pixel_X)

   
return pixel_Y,featurelist


def OrginCode(dummyX,dummyY):
    clf = tree.DecisionTreeClassifier(
criterion='entropy')
    clf.fit(dummyX
, dummyY)
   
return clf


def Cmpcode(cls,dummyX,dummyY):
    equal =
0
   
predictedY = cls.predict(dummyX)
   
for n,yinenumerate(predictedY):
       
if y == dummyY[n]:
            equal +=
1
   
return equal


class imageOragin(object):

   
def __init__(self,size=(1366,768),*image):
        dummyX = []
        dummyY = []
       
for iinimage:
            i = i.resize(size).convert(
'L')
            i = ImageOps.equalize(i)
            code1 = getCode(i
, size)
            dummyX += code1[
0]
            dummyY += code1[
1]
       
self.size = size
       
self.cls = OrginCode(dummyX,dummyY)

   
def cmp(self,image):
       
# image.resize(self.size).convert('L').filter(ImageFilter.BLUR)图像模糊化 filter为图像增强手段,不建议使用
        # 更多关于ImageFilter推荐博客http://blog.csdn.net/icamera0/article/details/50708888
        # resize重新定义图片大小
        image = image.resize(self.size).convert('L')
       
# ImageOps.equalize均衡图像的直方图。该函数使用一个非线性映射到输入图像,为了产生灰色值均匀分布的输出图像。
        #
更多关于ImageOps推荐博客http://blog.csdn.net/icamera0/article/details/50785776
        image = ImageOps.equalize(image)
        code2 = getCode(image
, self.size)
        equal = Cmpcode(
self.cls,*code2)
       
return equal *1.00/ self.size[0]


if __name__ =='__main__':
    image = []
    image1 = Image.open(
r'C:\ML\imagetest\a1.png',"r")
    image2 = Image.open(
r'C:\ML\imagetest\a3.png',"r")
    image3 = Image.open(
r'C:\ML\imagetest\24.png',"r")
    image4 = Image.open(
r'C:\ML\imagetest\a8.png',"r")
    image.append(image4)
    image5 = Image.open(
r'C:\ML\imagetest\a12.png',"r")
    image.append(image5)
    image6 = Image.open(
r'C:\ML\imagetest\1.png',"r")
    image.append(image6)
    image7 = Image.open(
r'C:\ML\imagetest\3.png',"r")
    image.append(image7)
    image.append(image1)
    image.append(image2)
    image.append(image3)
    size = (
1366,768)
    ora = imageOragin(size
, *image)
    path =
'C:\\ML\\imagetest\\'
   
files = os.listdir(path)
   
for iinfiles:
       
print path+i
        imaged = Image.open(path+i
, "r")
       
print ora.cmp(imaged)

 

1 0
原创粉丝点击