from PyQt5.QtCore import Qt, QDir, QFile, QPoint, QRect, QSize from PyQt5.QtWidgets import QWidget, QPushButton, QLineEdit, QLabel, QGridLayout from PyQt5.QtGui import QImage, QImageWriter, QPainter, QPen, qRgb, QPixmap import os #import matplotlib.pyplot as plt # Import datasets, classifiers and performance metrics from sklearn import datasets, svm, metrics from PIL import Image import numpy as np import math from sklearn.metrics import accuracy_score from sklearn.externals import joblib class Button(QWidget): def __init__(self,parent=None, label="Button", on_click=None): super(Button,self).__init__(parent) button = QPushButton(label, self) button.move(220,0) button.clicked.connect(on_click) grid = QGridLayout() grid.addWidget(button,1,0,1,2) self.setLayout(grid) class ComboWidget(QWidget): def __init__(self, parent=None, text_on_label="Label", text_on_button="button", on_click=None, readOnly=False): super(ComboWidget,self).__init__(parent) button = QPushButton(text_on_button, self) lbl = QLabel(self) lbl.setText(text_on_label) self.qle = QLineEdit(self) self.qle.setReadOnly(readOnly) self.qle.setAlignment(Qt.AlignCenter) button.clicked.connect(on_click) grid = QGridLayout() grid.addWidget(lbl,1,0) grid.addWidget(self.qle,1,1) grid.addWidget(button,1,2) self.setLayout(grid) def text(self): return self.qle.text() def set_text(self, text=""): self.qle.setText(text) class Board(QWidget): def __init__(self,parent=None): super(Board,self).__init__(parent) self.setAttribute(Qt.WA_StaticContents) self.penWidth = 50 self.writing = False self.penColor = Qt.black self.image = QImage() self.lastPoint = QPoint() self.setFixedSize(512,512) def saveImage(self,label): import os visibleImage = self.image self.resizeImage(visibleImage,self.size()) if QDir('Image').exists() == False: QDir().mkdir('Image') label = 'Image/'+label if QDir(label).exists() == False: QDir().mkdir(label) cnt = 0 maxf = 0 for file in os.listdir(label): if file.endswith('.png'): cnt += 1 tmpN = int(file[:-4:]) maxf = max(maxf,tmpN) visibleImage.save('tmp.png') pixmap = QPixmap('tmp.png').scaled(64,64) pixmap.save(label+'/'+str(max(cnt,maxf)+1)+'.png') QFile.remove('tmp.png') def saveImageTest(self): import os visibleImage = self.image self.resizeImage(visibleImage,self.size()) if QDir('Test').exists() == False: QDir().mkdir('Test') visibleImage.save('tmp.png') pixmap = QPixmap('tmp.png').scaled(64,64) pixmap.save('Test/temp.png') QFile.remove('tmp.png') def paintEvent(self, event): painter = QPainter(self) dirtyRect = event.rect() painter.drawImage(dirtyRect, self.image, dirtyRect) def clearImage(self): self.image.fill(qRgb(255,255,255)) self.update() def mousePressEvent(self,event): if event.button() == Qt.LeftButton: self.lastPoint = event.pos() self.writing = True def mouseMoveEvent(self,event): if (event.buttons() & Qt.LeftButton) and self.writing: self.drawLineTo(event.pos()) def mouseReleaseEvent(self,event): if event.button() == Qt.LeftButton and self.writing: self.drawLineTo(event.pos()) self.writing = False def resizeEvent(self,event): self.resizeImage(self.image,self.size()) self.update() super(Board,self).resizeEvent(event) def drawLineTo(self, endPoint): painter = QPainter(self.image) painter.setPen(QPen(self.penColor, self.penWidth, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin)) painter.drawLine(self.lastPoint, endPoint) self.writing = True rad = self.penWidth/2 + 2 self.update(QRect(self.lastPoint, endPoint).normalized().adjusted(-rad, -rad, +rad, +rad)) self.lastPoint = QPoint(endPoint) def resizeImage(self,image, newSize): if image.size() == newSize: return newImage = QImage(newSize, QImage.Format_RGB32) newImage.fill(qRgb(255,255,255)) painter = QPainter(newImage) painter.drawImage(QPoint(0,0), image) self.image = newImage def data_prep_test(self): self.saveImageTest() im = Image.open('Test/temp.png') iar = np.array(im) width, height = im.size test_data = np.zeros(width*height) test_data = np.zeros(64*64) count = 0 for i in range(len(iar)): for j in range(len(iar[i])): test_data[count] = math.floor(((np.sum(iar[i][j][:3]/765)))) #print(test_data[count]) count+=1 return [test_data] def data_prep_train(self): print('preporcessing..') folder_name = 'Image/' list_of_label = os.listdir(folder_name) digit_data = list() digit_label = list() for label in list_of_label: label_path = folder_name+str(label)+'/' list_of_data = os.listdir(label_path) #print(list_of_data) for data in list_of_data: im = Image.open(label_path+'/'+data) arr_im = np.array(im) width, height = im.size gen_data = np.zeros(width*height) count = 0 for i in range(len(arr_im)): for j in range(len(arr_im[i])): #ทำ Normalize ด้วยการ (R+G+B) หาร 765 มาจาก (255+255+255) gen_data[count] = math.floor(((np.sum(arr_im[i][j][:3]/765)))) count+=1 digit_data.append( gen_data ) digit_label.append( label ) digit_data = np.array(digit_data) #ข้อมูล digit_label = np.array(digit_label) # label ของข้อมูล return digit_data,digit_label def evaluation(self, digit_data, digit_label, classifier): predicted = classifier.predict(digit_data) print("Classification report for classifier %s:\n%s\n" % (classifier, metrics.classification_report(digit_label, predicted))) print("Confusion matrix:\n%s" % metrics.confusion_matrix(digit_label, predicted)) print("\naccuracy = ",accuracy_score(digit_label, predicted))