Skip to content

Commit b631b3b

Browse files
committed
Initial commit
0 parents  commit b631b3b

14 files changed

+957
-0
lines changed

.idea/misc.xml

+4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/modules.xml

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/pyServerPailio.iml

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/vcs.xml

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

main.py

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import sys
2+
import serverWindow
3+
from PyQt5.QtWidgets import QApplication
4+
5+
if __name__ == '__main__':
6+
app = QApplication(sys.argv)
7+
8+
server = serverWindow.serverWindow()
9+
server.show()
10+
11+
sys.exit(app.exec())
+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
大紅紋鳳蝶
2+
無尾鳳蝶
3+
柑橘鳳蝶
4+
青斑鳳蝶
5+
無尾白紋鳳蝶
6+
大鳳蝶(雄)
7+
白紋鳳蝶
8+
紅紋鳳蝶
9+
青帶鳳蝶
10+
玉帶鳳蝶(雄)
11+
黑鳳蝶
12+
大鳳蝶(雌)
13+
玉帶鳳蝶(雌)
14+
烏鴉鳳蝶
15+
綠斑鳳蝶
16+
大琉璃紋鳳蝶

models/papilionidae_graph_4000.pb

83.5 MB
Binary file not shown.

models/papilionidae_labels.txt

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
byasa polyeuctes termessus
2+
papilio demoleus
3+
papilio xuthus
4+
graphium doson postianus
5+
papilio castor formosanus
6+
papilio memnon heronus male
7+
papilio helenus fortunius
8+
pachliopta aristolochiae interpositus
9+
graphium sarpedon connectens
10+
papilio polytes polytes male
11+
papilio protenor
12+
papilio memnon heronus female
13+
papilio polytes polytes female
14+
papilio bianor thrasymedes
15+
graphium agamemnon
16+
papilio paris nakaharai

pailio_recognition.py

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import tensorflow as tf
2+
3+
class PailioRecog(object):
4+
def __init__(self):
5+
self.graph_file = 'models/papilionidae_graph_4000.pb'
6+
self.label_file = 'models/papilionidae_chinese_labels.txt'
7+
8+
def load_model(self):
9+
# Load label data
10+
self.labels = []
11+
for label in tf.gfile.GFile(self.label_file):
12+
self.labels.append(label.rstrip())
13+
14+
# Load cnn model
15+
with tf.gfile.FastGFile(self.graph_file, 'rb') as f:
16+
graph_def = tf.GraphDef()
17+
graph_def.ParseFromString(f.read())
18+
tf.import_graph_def(graph_def, name='')
19+
20+
def start_recognition(self, image_file):
21+
22+
self.image = tf.gfile.FastGFile(image_file, 'rb').read() # read image
23+
24+
with tf.Session() as sess:
25+
softmax_tensor = sess.graph.get_tensor_by_name('final_result:0')
26+
predict = sess.run(softmax_tensor, {'DecodeJpeg/contents:0': self.image})
27+
28+
# Sort the label by probability
29+
top = predict[0].argsort()[-len(predict[0]):][::-1]
30+
31+
# for index in top:
32+
# human_string = labels[index]
33+
# score = predict[0][index]
34+
# print(human_string, score)
35+
36+
self.recogClass = self.labels[top[0]]
37+
self.top_score = predict[0][top[0]]
38+
# second_score = predict[0][1]
39+

recieve/2017-11-09_13-16-34.jpg

118 KB
Loading

recieve/2017-11-09_14-04-26.jpg

1010 KB
Loading

serverWindow.py

+130
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
# TcpServer
2+
from PyQt5.QtWidgets import QMainWindow
3+
from PyQt5.QtCore import QObject, QFile, QDateTime, QDataStream, QDir, Qt, QIODevice, QByteArray
4+
from PyQt5.QtGui import QImage, QPixmap
5+
from PyQt5.QtNetwork import QTcpServer, QTcpSocket, QHostAddress
6+
7+
from ui_serverWindow import Ui_serverWindow
8+
from pailio_recognition import PailioRecog
9+
10+
class serverWindow(QMainWindow):
11+
def __init__(self, parent = None):
12+
super(serverWindow, self).__init__(parent)
13+
self.ui = Ui_serverWindow()
14+
15+
# Server & Client
16+
self.client = QTcpSocket(self)
17+
self.server = QTcpServer(self)
18+
19+
# Recieve File
20+
self.curTime = QDateTime()
21+
self.file = QFile()
22+
self.image = QImage()
23+
self.bytesReceived = 0
24+
self.fileSize = 0
25+
self.filePath = ''
26+
self.savePath = ''
27+
28+
self.ui.setupUi(self)
29+
self.dirSetting()
30+
31+
# Pailio Recognition
32+
self.ui.stateBrowser.append('準備辨識系統模型...')
33+
self.recogPailio = PailioRecog()
34+
self.recogPailio.load_model()
35+
self.ui.stateBrowser.append('模型準備完成...\n')
36+
37+
38+
# Connect Signal & Slot
39+
self.ui.startBtn.clicked.connect(self.startServer)
40+
self.ui.stopBtn.clicked.connect(self.stopServer)
41+
self.server.newConnection.connect(self.acceptConnection, Qt.QueuedConnection)
42+
43+
def dirSetting(self):
44+
dir = QDir()
45+
self.savePath = dir.currentPath() + '/recieve/'
46+
self.ui.savePath.setText(self.savePath)
47+
48+
def startServer(self):
49+
self.server.listen(QHostAddress.Any, 37)
50+
self.ui.stateBrowser.append('伺服器啟動...')
51+
self.ui.startBtn.setEnabled(False)
52+
self.ui.stopBtn.setEnabled(True)
53+
54+
def stopServer(self):
55+
self.server.close()
56+
self.ui.stateBrowser.append('伺服器關閉...')
57+
self.ui.startBtn.setEnabled(True)
58+
self.ui.stopBtn.setEnabled(False)
59+
60+
def acceptConnection(self):
61+
self.curTime = QDateTime.currentDateTime()
62+
self.filePath = self.savePath + self.curTime.toString('yyyy-MM-dd_hh-mm-ss') + '.jpg'
63+
self.file = QFile(self.filePath)
64+
65+
# Check File
66+
if self.file.open(QIODevice.WriteOnly) == 0:
67+
self.ui.stateBrowser.append('無法開啟檔案: ' + self.filePath)
68+
return
69+
70+
self.bytesReceived = 0
71+
self.fileSize = 0
72+
self.client = self.server.nextPendingConnection()
73+
74+
# Connect Signal & Slot
75+
self.client.readyRead.connect(self.updateProgress)
76+
self.client.error.connect(self.displayError)
77+
78+
def updateProgress(self):
79+
stream = QDataStream(self.client)
80+
81+
# bytesAvailable > sizeof(qint64) = 8
82+
if self.client.bytesAvailable() > 8 and self.fileSize == 0:
83+
self.fileSize = int(stream.readInt64()) # stream >> self.fileSize
84+
self.bytesReceived += 8
85+
self.ui.stateBrowser.append('檔案大小: ' + str(self.fileSize / 1024) + 'KB')
86+
self.ui.recvProsBar.setMaximum(self.fileSize)
87+
else:
88+
self.bytesReceived += int(self.client.bytesAvailable())
89+
self.ui.recvProsBar.setValue(self.bytesReceived)
90+
self.file.write(self.client.readAll())
91+
92+
# Finish Receive
93+
if self.fileSize == self.bytesReceived:
94+
self.file.close()
95+
self.ui.stateBrowser.append('檔案已儲存: ' + self.file.fileName())
96+
97+
self.displayImage()
98+
self.sendProsResult()
99+
100+
def displayImage(self):
101+
if self.image.load(self.filePath) == 0:
102+
self.ui.imageDisplay.setText('無法顯示圖片')
103+
else:
104+
self.ui.imageDisplay.setPixmap(QPixmap.fromImage(self.image.scaled(300,300)))
105+
106+
def sendProsResult(self):
107+
self.ui.stateBrowser.append('開始辨識...')
108+
self.recogPailio.start_recognition(self.filePath)
109+
self.ui.stateBrowser.append('辨識完成...')
110+
111+
self.prosResult = str(self.recogPailio.recogClass) + ' (相似度' + str(self.recogPailio.top_score * 100) + '%)'
112+
self.ui.stateBrowser.append('辨識結果: ' + self.prosResult)
113+
114+
# Send result
115+
byteArray = QByteArray()
116+
byteArray.append(bytes(self.prosResult, encoding = 'UTF-8'))
117+
# sendStream = QDataStream(byteArray, QIODevice.WriteOnly)
118+
# sendStream.writeString(bytes(self.prosResult, encoding = 'UTF-8'))
119+
self.client.write(byteArray)
120+
self.ui.stateBrowser.append('送出辨識結果...')
121+
122+
123+
def displayError(self, socketError):
124+
if socketError == QTcpSocket.RemoteHostClosedError:
125+
self.ui.stateBrowser.append('連結中斷...')
126+
self.ui.stateBrowser.append('-------------------------\n')
127+
else:
128+
self.ui.stateBrowser.append('Network error: ' + self.client.errorString())
129+
self.ui.stateBrowser.append('-------------------------\n')
130+
self.file = 0

0 commit comments

Comments
 (0)