第6关:彩色图像识别模型(拓展)
任务描述
本关任务:现有1元、5元、10元、20元、50元、100元共6种面额的纸币彩色图像数据集(每种纸币按正、反面和两个不同的方向,分别采集10张图片,累计每个币种采集40张图片,6种币种合计240张图片),请计算每张图片R、G、B三个颜色通道的一阶、二阶、三阶颜色矩阵,共9个特征指标数据,记为自变量X,同时构造纸币面额标签数据集,记为因变量Y。利用所得的自变量X和因变量Y,数据集按照80%训练、20%测试进行随机划分,构建纸币面额识别模型。
编程要求
根据提示,在右侧编辑器补充代码,完成建模、代码编写和分析。
'''
任务:
现有1元、5元、10元、20元、50元、100元共6种面额的纸币彩色图像,储存在"图片"文件夹内,相关信息及要求如下:
1)每种纸币均从正、反两面及两个不同的方向,进行采集图像各10张,即每种纸币采集40张,6种货币,则总图片有240张。
2)图片的命名为:面额值_采集序号.png,比如1元纸币40张依次命名为:1_1.png~1_40.png,其他同理。
3)读取图片文件夹,计算每张图片的R、G、B三个颜色通道的一阶、二阶、三阶颜色矩特征,共9个特征指标数据,记为自变量X,
4)同时构造纸币面额标签数据集,记为因变量Y。
5)按80%训练和20%测试进行随机划分数据集,构建支持向量机分类模型,
6)返回模型的准确率rv和测试集的预测准确率rs。
'''
from PIL import Image
import numpy as np
import os
def return_values():
import os
path='图片/'
fname=os.listdir(path)
X=np.zeros((len(fname),9)) #预定义自变量,即9个颜色矩阵特征指标
Y=np.zeros(len(fname)) #预定义因变量
for i in range(len(fname)):
img=Image.open(path+fname[i]) #读取第i张图片
im=img.split()
R=np.array(im[0])/255 #R通道
row_1=int(R.shape[0]/2)-50
row_2=int(R.shape[0]/2)+50
con_1=int(R.shape[1]/2)-50
con_2=int(R.shape[1]/2)+50
R=R[row_1:row_2,con_1:con_2]
G=np.array(im[1])/255 #G通道
G=G[row_1:row_2,con_1:con_2]
B=np.array(im[2])/255 #B通道
B=B[row_1:row_2,con_1:con_2]
#构造X
png_name=fname[i]
X[i]=png_name.split("_")[0]
#构造Y
png_name=fname[i]
Y[i]=png_name.split("_")[0]
#建模及计算
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.2,random_state=4)
import sklearn.svm as svm
from sklearn.svm import SVC
clf = svm.SVC(kernel='linear')
clf.fit(x_train,y_train)
rv=clf.score(x_train, y_train);
y1=clf.predict(x_test)
r=y1-y_test
rs=len(r[r==0])/len(y1)
return (rv,rs)