mirror of
https://github.com/NanjingForestryUniversity/supermachine-wood.git
synced 2025-11-08 10:13:53 +00:00
改掉了很多bug(zhenye.li修改)
This commit is contained in:
parent
fd9e31cea8
commit
13c413e7a7
@ -5,6 +5,7 @@ Created on Nov 3 21:18:26 2020
|
|||||||
@author: l.z.y
|
@author: l.z.y
|
||||||
@e-mail: li.zhenye@qq.com
|
@e-mail: li.zhenye@qq.com
|
||||||
"""
|
"""
|
||||||
|
import logging
|
||||||
import sys
|
import sys
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import cv2
|
import cv2
|
||||||
@ -220,6 +221,12 @@ class WoodClass(object):
|
|||||||
latest_model = model_files[int(np.argmax(file_times))]
|
latest_model = model_files[int(np.argmax(file_times))]
|
||||||
self.log.log("└--Using the latest model: "+str(latest_model))
|
self.log.log("└--Using the latest model: "+str(latest_model))
|
||||||
path = os.path.join(ROOT_DIR, "models", str(latest_model))
|
path = os.path.join(ROOT_DIR, "models", str(latest_model))
|
||||||
|
if not os.path.isabs(path):
|
||||||
|
logging.warning('给的是相对路径')
|
||||||
|
return -1
|
||||||
|
if not os.path.exists(path):
|
||||||
|
logging.warning('文件不存在')
|
||||||
|
return -1
|
||||||
with open(path, "rb") as f:
|
with open(path, "rb") as f:
|
||||||
model_dic = pickle.load(f)
|
model_dic = pickle.load(f)
|
||||||
self.n, self.k, self.p1, self.pur = model_dic["n"], model_dic["k"], model_dic["p1"], model_dic["pur"]
|
self.n, self.k, self.p1, self.pur = model_dic["n"], model_dic["k"], model_dic["p1"], model_dic["pur"]
|
||||||
|
|||||||
@ -4,40 +4,83 @@ import cv2
|
|||||||
from classifer import WoodClass
|
from classifer import WoodClass
|
||||||
import time
|
import time
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
from root_dir import ROOT_DIR
|
||||||
from utils import PreSocket, receive_sock, parse_protocol, ack_sock, done_sock
|
from utils import PreSocket, receive_sock, parse_protocol, ack_sock, done_sock
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
|
||||||
def process_cmd(recv_sock: PreSocket, send_sock: PreSocket):
|
def try_connect(is_repeat: bool = False, max_reconnect_times: int = 50) -> (bool, socket.socket):
|
||||||
model_path = "models/model_2022-09-06_13-08.p"
|
"""
|
||||||
detector = WoodClass(w=4096, h=1200, n=3000, debug_mode=False)
|
尝试连接.
|
||||||
detector.load(path=model_path)
|
|
||||||
while True:
|
:param is_repeat: 是否是重新连接
|
||||||
pack, next_pack = receive_sock(recv_sock)
|
:param max_reconnect_times:最大重连次数
|
||||||
recv_sock.set_prepack(next_pack)
|
:return: (连接状态True为成功, Socket / None)
|
||||||
cmd, data = parse_protocol(pack)
|
"""
|
||||||
ack_sock(send_sock, cmd_type=cmd)
|
reconnect_time = 0
|
||||||
if cmd == 'IM':
|
while reconnect_time < max_reconnect_times:
|
||||||
wood_color = detector.predict(data)
|
logging.warning(f'尝试{"重新" if is_repeat else ""}发起第{reconnect_time+1}次连接...')
|
||||||
done_sock(send_sock, cmd_type=cmd, result=wood_color)
|
try:
|
||||||
elif cmd == 'TR':
|
connected_sock = PreSocket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
detector.fit_pictures(data_path=r"C:\Users\FEIJINTI\PycharmProjects\wood_color")
|
connected_sock.connect(('127.0.0.1', 23456))
|
||||||
done_sock(send_sock, cmd_type=cmd)
|
except Exception as e:
|
||||||
elif cmd == 'MD':
|
reconnect_time += 1
|
||||||
model_path = os.path.join("models", data)
|
logging.error(f'第{reconnect_time}次连接失败\n {e}')
|
||||||
detector.load(path=model_path)
|
continue
|
||||||
done_sock(send_sock, cmd_type=cmd)
|
logging.warning(f'{"重新" if is_repeat else ""}连接成功')
|
||||||
print(model_path)
|
return True, connected_sock
|
||||||
else:
|
return False, None
|
||||||
logging.error(f'错误指令,指令为{cmd}')
|
|
||||||
|
|
||||||
|
def process_cmd(cmd: str, data: any, connected_sock: PreSocket, detector: WoodClass) -> bool:
|
||||||
|
"""
|
||||||
|
处理指令
|
||||||
|
|
||||||
|
:param cmd: 指令类型
|
||||||
|
:param data: 指令内容
|
||||||
|
:param connected_sock: socket
|
||||||
|
:param detector: 模型
|
||||||
|
:return: 是否处理成功
|
||||||
|
"""
|
||||||
|
|
||||||
|
if cmd == 'IM':
|
||||||
|
wood_color = detector.predict(data)
|
||||||
|
response = done_sock(connected_sock, cmd_type=cmd, result=wood_color)
|
||||||
|
elif cmd == 'TR':
|
||||||
|
detector = WoodClass(w=4096, h=1200, n=3000, debug_mode=False)
|
||||||
|
detector.fit_pictures(data_path=data)
|
||||||
|
response = done_sock(connected_sock, cmd_type=cmd)
|
||||||
|
elif cmd == 'MD':
|
||||||
|
detector.load(path=data)
|
||||||
|
response = done_sock(connected_sock, cmd_type=cmd)
|
||||||
|
else:
|
||||||
|
logging.error(f'错误指令,指令为{cmd}')
|
||||||
|
response = False
|
||||||
|
return response
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
socket_receive = PreSocket(socket.AF_INET, socket.SOCK_STREAM)
|
status, connected_sock = False, None
|
||||||
socket_receive.connect(('127.0.0.1', 23456))
|
while not status:
|
||||||
|
status, connected_sock = try_connect()
|
||||||
# socket_send = PreSocket(socket.AF_INET, socket.SOCK_STREAM)
|
# socket_send = PreSocket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
# socket_send.connect(('127.0.0.1', 21123))
|
# socket_send.connect(('127.0.0.1', 21123))
|
||||||
process_cmd(recv_sock=socket_receive, send_sock=socket_receive)
|
# a = b'\xaa\x00\x00\x00\x05\x20\x44\x54\x52\xff\xff\xff\xbb'
|
||||||
|
# connected_sock.send(a)
|
||||||
|
model_path = os.path.join(ROOT_DIR, "models/model_2022-09-06_13-08.p")
|
||||||
|
detector = WoodClass(w=4096, h=1200, n=3000, debug_mode=False)
|
||||||
|
detector.load(path=model_path)
|
||||||
|
while True:
|
||||||
|
pack, next_pack = receive_sock(connected_sock)
|
||||||
|
if pack == b"":
|
||||||
|
status, connected_sock = try_connect()
|
||||||
|
continue
|
||||||
|
connected_sock.set_prepack(next_pack)
|
||||||
|
|
||||||
|
cmd, data = parse_protocol(pack)
|
||||||
|
ack_sock(connected_sock, cmd_type=cmd)
|
||||||
|
process_cmd(cmd=cmd, data=data, connected_sock=connected_sock, detector=detector)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|||||||
15
utils.py
15
utils.py
@ -70,8 +70,8 @@ class Logger(object):
|
|||||||
|
|
||||||
|
|
||||||
class PreSocket(socket.socket):
|
class PreSocket(socket.socket):
|
||||||
def __int__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(socket.socket, self).__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
self.pre_pack = b''
|
self.pre_pack = b''
|
||||||
|
|
||||||
def receive(self, *args, **kwargs):
|
def receive(self, *args, **kwargs):
|
||||||
@ -84,7 +84,8 @@ class PreSocket(socket.socket):
|
|||||||
return required
|
return required
|
||||||
|
|
||||||
def set_prepack(self, pre_pack: bytes):
|
def set_prepack(self, pre_pack: bytes):
|
||||||
self.pre_pack = pre_pack
|
temp = self.pre_pack
|
||||||
|
self.pre_pack = temp + pre_pack
|
||||||
|
|
||||||
|
|
||||||
def receive_sock(recv_sock: PreSocket, pre_pack: bytes = b'') -> (bytes, bytes):
|
def receive_sock(recv_sock: PreSocket, pre_pack: bytes = b'') -> (bytes, bytes):
|
||||||
@ -102,13 +103,13 @@ def receive_sock(recv_sock: PreSocket, pre_pack: bytes = b'') -> (bytes, bytes):
|
|||||||
temp = recv_sock.receive(1)
|
temp = recv_sock.receive(1)
|
||||||
except ConnectionError as e:
|
except ConnectionError as e:
|
||||||
logging.error(f'连接出错, 错误代码:\n{e}')
|
logging.error(f'连接出错, 错误代码:\n{e}')
|
||||||
return '', None
|
return b'', b''
|
||||||
except TimeoutError as e:
|
except TimeoutError as e:
|
||||||
logging.error(f'超时了,错误代码: \n{e}')
|
logging.error(f'超时了,错误代码: \n{e}')
|
||||||
return '', None
|
return b'', b''
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error(f'遇见未知错误,错误代码: \n{e}')
|
logging.error(f'遇见未知错误,错误代码: \n{e}')
|
||||||
return '', None
|
return b'', b''
|
||||||
if temp == b'\xaa':
|
if temp == b'\xaa':
|
||||||
break
|
break
|
||||||
|
|
||||||
@ -118,7 +119,7 @@ def receive_sock(recv_sock: PreSocket, pre_pack: bytes = b'') -> (bytes, bytes):
|
|||||||
try:
|
try:
|
||||||
temp += recv_sock.receive(1)
|
temp += recv_sock.receive(1)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error(f'接收报文长度失败, 错误代码: \n{e}')
|
logging.error(f'接收报文的长度不正确, 错误代码: \n{e}')
|
||||||
return b'', b''
|
return b'', b''
|
||||||
try:
|
try:
|
||||||
data_len = int.from_bytes(temp, byteorder='big')
|
data_len = int.from_bytes(temp, byteorder='big')
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user