#!/usr/bin/env python
#-*- coding: utf-8 -*-
#code:myhaspl@qq.com
#9-14.py
import numpy as np
import mlpy
import cv2
print 'loading ...'
def getnumc(fn):
'''返回数字特征'''
fnimg = cv2.imread(fn)
img=cv2.resize(fnimg,(8,8))
alltz=[]
for now_h in xrange(0,8):
xtz=[]
for now_w in xrange(0,8):
b = img[now_h,now_w,0]
g = img[now_h,now_w,1]
r = img[now_h,now_w,2]
btz=255-b
gtz=255-g
rtz=255-r
if btz>0 or gtz>0 or rtz>0:
nowtz=1
else:
nowtz=0
xtz.append(nowtz)
alltz+=xtz
return alltz
#读取样本数字
x=[]
y=[]
for numi in xrange(1,3):
for numj in xrange(1,5):
fn='nums/'+str(numi)+'-'+str(numj)+'.png'
x.append(getnumc(fn))
y.append(numi)
x=np.array(x)
#以下分别为目标输出数字1-2
d =np.array([0,0,0,0,1,1,1,1])
y=np.array(y)
a=0.1
expect_e=0.0005
maxtrycount=200
def sgn(v):
if v>0:
return 1
else:
return 0
def get_v(myw,myx):
return sgn(np.dot(myw,myx.T))
def neww(oldw,myd,myx,a):
mye=get_e(oldw,myx,myd)
return (oldw+2*a*mye*myx,mye)
def get_e(myw,myx,myd):
return myd-get_v(myw,myx.T)
w=zeros((1,64),dtype=float64)
mycount=0
while True:
mye=0
i=0
for xn in x:
w,e=neww(w,d[i],xn,a)
i+=1
mye+=pow(e,2)
mye/=float(i)
mycount+=1
#print u"第 %d 次调整后的权值:"%mycount
#print w
print u"误差:%f"%mye
if mye<expect_e or mycount>maxtrycount:break
for xn in x:
print get_v(w,xn.T)
svm = mlpy.LibSvm(svm_type='c_svc', kernel_type='poly',gamma=10)
svm.learn(x, y)
print u"训练样本测试"
print svm.pred(x)
print u"未知图像测试"
for iii in xrange (1,3):
testfn= 'nums/test/'+str(iii)+'-test.png'
#testfn='nums/'+str(iii)+'-'+'2'+'.png'
testx=[]
testx.append(getnumc(testfn))
print
print testfn+":",
print svm.pred(testx)
#-*- coding: utf-8 -*-
#code:myhaspl@qq.com
#9-14.py
import numpy as np
import mlpy
import cv2
print 'loading ...'
def getnumc(fn):
'''返回数字特征'''
fnimg = cv2.imread(fn)
img=cv2.resize(fnimg,(8,8))
alltz=[]
for now_h in xrange(0,8):
xtz=[]
for now_w in xrange(0,8):
b = img[now_h,now_w,0]
g = img[now_h,now_w,1]
r = img[now_h,now_w,2]
btz=255-b
gtz=255-g
rtz=255-r
if btz>0 or gtz>0 or rtz>0:
nowtz=1
else:
nowtz=0
xtz.append(nowtz)
alltz+=xtz
return alltz
#读取样本数字
x=[]
y=[]
for numi in xrange(1,3):
for numj in xrange(1,5):
fn='nums/'+str(numi)+'-'+str(numj)+'.png'
x.append(getnumc(fn))
y.append(numi)
x=np.array(x)
#以下分别为目标输出数字1-2
d =np.array([0,0,0,0,1,1,1,1])
y=np.array(y)
a=0.1
expect_e=0.0005
maxtrycount=200
def sgn(v):
if v>0:
return 1
else:
return 0
def get_v(myw,myx):
return sgn(np.dot(myw,myx.T))
def neww(oldw,myd,myx,a):
mye=get_e(oldw,myx,myd)
return (oldw+2*a*mye*myx,mye)
def get_e(myw,myx,myd):
return myd-get_v(myw,myx.T)
w=zeros((1,64),dtype=float64)
mycount=0
while True:
mye=0
i=0
for xn in x:
w,e=neww(w,d[i],xn,a)
i+=1
mye+=pow(e,2)
mye/=float(i)
mycount+=1
#print u"第 %d 次调整后的权值:"%mycount
#print w
print u"误差:%f"%mye
if mye<expect_e or mycount>maxtrycount:break
for xn in x:
print get_v(w,xn.T)
svm = mlpy.LibSvm(svm_type='c_svc', kernel_type='poly',gamma=10)
svm.learn(x, y)
print u"训练样本测试"
print svm.pred(x)
print u"未知图像测试"
for iii in xrange (1,3):
testfn= 'nums/test/'+str(iii)+'-test.png'
#testfn='nums/'+str(iii)+'-'+'2'+'.png'
testx=[]
testx.append(getnumc(testfn))
print testfn+":",
print svm.pred(testx)
print get_v(w,np.array(testx))+1
因为这里只用了一个神经元,所以只能产生一个判别边界,故只能对两个数字进行识别。每个数字都有4个样本,结果证明,用其它的测试样三进行测试,效果很好。程序中部分是参考别人写的或门程序,刚开始没有用sgn函数,发现对样本进行训练时,都能很快达到误差为0,但是用测试样本测试时,不是输出精确的-1或1的近似值,所以改就加了一个sgn函数程序中也带了SVM的代码,暂时我也没有看,没有学到那里去,好晚了突然好想睡觉,哈哈!!!