def get_score(self): """盘面打分""" try: return self.info_handler.info['score'][1].cp except Exception as e: logging.warning(utils.get_trace()) return -1
def post(self): """post请求处理""" try: result = self.execute() except: logging.error('execute fail ' + utils.get_trace()) result = {'code': 1, 'msg': '查询失败'} logging.info('API RES[' + self.request.path + '][' + self.request.method + '][' + str(result['code']) + '][' + str(result['msg']) + ']') self.write(json.dumps(result))
def execute(self): """执行业务逻辑""" logging.info('API REQUEST INFO[' + self.request.path + '][' + self.request.method + '][' + self.request.remote_ip + '][' + str(self.request.arguments) + ']') img_file = self.get_argument('img_file', '') tag_img = int(self.get_argument('tag_img', 0)) # 是否在图片上标记目标位置 detect_face = int(self.get_argument('detect_face', 0)) # 是否识别人脸 tts_caption = self.get_argument('tts_caption', '') # 是否为图像描述合成语音 if img_file == '': return {'code': 2, 'msg': 'img_file不能为空', 'data': {}} res = [] caption = '' try: # 图像目标检测 res = darknet.detect(img_file, tag_img=tag_img, detect_face=detect_face) #print(res) # 图像描述 caption = darknet.caption(res) # 图像描述语音合成 tts_url = '' if tts_caption: s = caption[tts_caption] voice_file = _tts._get_cache(s) if not voice_file: voice_file = _tts.get_speech(s) cache_file = _tts._set_cache(s, voice_file) if cache_file: voice_file = cache_file tts_url = voice_file.replace(IMG_PATH, IMG_URL) except: logging.error('execute fail [' + img_file + '] ' + utils.get_trace()) return {'code': 5, 'msg': 'detect fail', 'data': {}} # 组织返回格式 url = img_file.replace(IMG_PATH, IMG_URL) return { 'code': 0, 'msg': 'success', 'data': { 'url': url, 'objects': res, 'caption': caption, 'tts_caption': tts_url } }
def get_action(self, board): action = 0 while True: san = input("Your move: ") try: action = board.san_to_action(san) except Exception as e: logging.warning(utils.get_trace()) action = -1 logging.info("Human action: %s %d,%s" % (board.current_player_name.upper(), action, board.action_to_move(action))) if action in board.availables: # action legal check break else: print("invalid action ! [{}] [{}]".format(action, board.actions_to_sans(board.availables))) return action
def load_model(self, model_file): """重新加载模型(仅用于selfplay时load new model)""" try: #net_params = utils.pickle_load(model_file) self.saver.restore(self.session, model_file) self.load_model_done = True except: logging.error("load_model fail! {}\t{}".format( model_file, utils.get_trace())) self.load_model_done = False if os.path.exists( model_file ) and self.load_model_done is False: #鏂囦欢瀛樺湪鍗村鍦ㄥけ璐ユ椂缁堟杩愯 exit(-1) return self.load_model_done
def load_model(self, model_file): """重新加载模型(仅用于selfplay时load new model)""" try: #net_params = pickle.load(open(model_file, 'rb'), encoding='bytes') #iso-8859-1') net_params = utils.pickle_load(model_file) self.model.set_weights(net_params) self.load_model_done = True except: logging.error("load_model fail! {}\t{}".format( model_file, utils.get_trace())) self.load_model_done = False if os.path.exists( model_file ) and self.load_model_done is False: #鏂囦欢瀛樺湪鍗村鍦ㄥけ璐ユ椂缁堟杩愯 exit(-1) return self.load_model_done
def get_action(self, board, return_prob=0, return_ponder=0, return_score=0): logging.info("__get_action__ {}".format(len(board.book_variations['all']))) action = -1 ponder = -1 score = -1 try: self.engine.position(board.base) res = self.engine.go(movetime=2000) # print(res, self.info_handler.info) action = board.move_to_action(res.bestmove) ponder = board.move_to_action(res.ponder) score = self.get_score() except Exception as e: logging.warning(utils.get_trace()) logging.info("Stockfish action: %s %d,%s ponder: %s" % (board.current_player_name.upper(), action, board.action_to_move(action), board.action_to_move(ponder))) probs = np.zeros(board.action_ids_size) probs[action] = 1.0 if return_prob and return_ponder and return_score: return action, probs, ponder, score if return_prob: return action, probs return action
def execute(self): """执行业务逻辑""" logging.info('API REQUEST INFO[' + self.request.path + '][' + self.request.method + '][' + self.request.remote_ip + '][' + str(self.request.arguments) + ']') img_file = self.get_argument('img_file', '') if img_file == '': return {'code': 2, 'msg': 'img_file不能为空'} res = {} try: ret, msg, res = dogcat_infer.infer(img_file) if ret != 0: logging.error('execute fail [' + img_file + '] ' + msg) return {'code': 4, 'msg': '查询失败'} except: logging.error('execute fail [' + img_file + '] ' + utils.get_trace()) return {'code': 5, 'msg': '查询失败'} # 组织返回格式 return {'code': 0, 'msg': 'success', 'data': res}
def show_camera_face_window(camera_data, warning_faceids=['mjs', 'zhu', 'yjy', 'zn']): """创建视频人脸监控windows窗口""" # create window face_imgs, face_labels = [], [] for i in range(MAX_FACE): face_imgs.append( sg.Image(filename=CUR_PATH + '/../data/image/kuang.png', size=(80, 80), key='face' + str(i))) face_labels.append(sg.Text('', size=(14, 1), key='label' + str(i))) layout = [[ sg.Image(filename=CUR_PATH + '/../data/image/pic.png', size=(600, 400), key='camera') ], face_imgs, face_labels, [sg.Text('filename', size=(100, 1), key='filename')]] window = sg.Window('视频人脸监控', return_keyboard_events=True, default_element_size=(30, 2), location=(0, 0), use_default_focus=False).Layout(layout).Finalize() # window.FindElement('filename').Update(str(time.time())) # show camera_data while True: event, values = window.Read(timeout=5) # wait 5ms for a GUI event if event is None or event == 'Exit': # exit break while True: # 刷新页面数据 logging.debug('___show_camera_face_window__') if camera_data['camera']['filename']: # print(camera_data['camera']['filename']) window.FindElement('camera').Update( filename=camera_data['camera']['filename']) window.FindElement('filename').Update( camera_data['camera']['filename']) try: # show face for i in range(len(camera_data['face']['list'])): face = camera_data['face']['list'][i] window.FindElement('face' + str(i)).Update( face['filename']) window.FindElement('label' + str(i)).Update( face['faceid'] + ' ' + str(round(face['weight'] / face['cnt'], 3))) except: # will get exception when Queue is empty logging.warning('refresh window fail! {}'.format( utils.get_trace())) break window.Refresh() # 重要人物刚出现时报警 if len(camera_data['face']['list'] ) > 0 and time.time() - camera_data['face']['list'][-1][ 'lasttime'] < 2.0 and camera_data['face']['list'][ -1]['faceid'] in warning_faceids: # utils.play_sound('warning0.wav') Thread(target=utils.play_sound, daemon=True).start() logging.debug('___show_camera_face_window__ done') # close window window.Close()
def execute(self): """执行业务逻辑""" logging.info('API REQUEST INFO[' + self.request.path + '][' + self.request.method + '][' + self.request.remote_ip + '][' + str(self.request.arguments) + ']') session_id = self.get_argument('session_id', '') res = { 'session_id': session_id, 'player': -1, 'step': 0, 'move': '', 'san': '', 'end': False, 'winner': -1, 'curr_player': 0, 'state': {}, 'ponder': '', 'score': -1 } move = self.get_argument('move', '') if session_id == '': return {'code': 2, 'msg': 'session_id不能为空', 'data': res} try: # 1.新的对局 session = {} if session_id not in self.games: logging.info("[{}] init new game!".format(session_id)) # plays id session['human_player_id'] = int( self.get_argument('human_player_id', '1')) # human默认执黑 session['ai_player_id'] = (session['human_player_id'] + 1) % 2 # ai与human相反 session['players'] = { session['human_player_id']: 'Human', session['ai_player_id']: 'AI' } session['step'] = 0 session['actions'], session['mcts_probs'] = [], [] # 初始化棋盘 session['game'] = Game() session['game'].board.init_board() # 初始化AI棋手 #session['ai_player'] = AIPlayer(self.best_policy.policy_value_fn, n_playout=50) session['ai_player'] = StockfishPlayer() self.games[session_id] = session else: session = self.games[session_id] # clear old games for k in list(self.games.keys()): if int(time.time() ) - int(k) / 1000 > 60 * 40: # 超过40分钟的session清理 del (self.games[k]) logging.warning("[{}] timeout clear!".format(k)) # 2.get ai move res['players'], res['human_player_id'], res[ 'ai_player_id'] = session['players'], session[ 'human_player_id'], session['ai_player_id'] res['curr_player'] = session['game'].board.current_player_id res['availables'] = [ session['game'].board.action_to_move(act) for act in session['game'].board.availables ] res['state'] = session['game'].board.state() action = -1 if res['curr_player'] == session[ 'ai_player_id']: # 轮到ai时,忽略传入的move参数 action, probs, ponder, res['score'] = session[ 'ai_player'].get_action(session['game'].board, return_prob=1, return_ponder=1, return_score=1) move = session['game'].board.action_to_move(action) res['ponder'] = session['game'].board.action_to_move(ponder) logging.info( "[{}] {} AI move: {} Score: {} Ponder: {}".format( session_id, res['curr_player'], move, res['score'], res['ponder'])) # save state session['actions'].append( session['game'].board.current_actions()) session['mcts_probs'].append(probs) else: # 轮到human走 if len(move) < 4: # 没有传入move logging.info("[{}] {} Human need give move !".format( session_id, res['curr_player'])) return {'code': 2, 'msg': '轮到人类走子', 'data': res} logging.info("[{}] {} Human move: {}".format( session_id, res['curr_player'], move)) action = session['game'].board.move_to_action(move) if action not in session[ 'game'].board.availables: # human action不合法 logging.info( "[{}] {} Human action ({},{}) invalid !".format( session_id, res['curr_player'], move, action)) return { 'code': 3, 'msg': '错误的落子位置:{}'.format(move), 'data': res } # save state session['actions'].append( session['game'].board.current_actions()) probs = np.zeros(session['game'].board.action_ids_size) probs[action] = 0.01 session['mcts_probs'].append(probs) # 3.do move if len(move) >= 4 and action != -1: # do move res['san'] = session['game'].board.move_to_san(move) session['game'].board.do_move(action) # do move try: if len(res['ponder']) > 2: res['ponder'] = session['game'].board.move_to_san( res['ponder']) except: logging.warning(utils.get_trace()) session['step'] += 1 res['player'], res['move'], res['step'] = res[ 'curr_player'], move, session['step'] res['end'], res['winner'] = session['game'].board.game_end() res['curr_player'] = session['game'].board.current_player_id res['availables'] = [ session['game'].board.action_to_move(act) for act in session['game'].board.availables ] res['state'] = session['game'].board.state( ) # res['state'][move[:2]] + move[:2] # save state -> databuffer if res['end']: # 从当前玩家视角确定winner winners_z = np.zeros( len(session['game'].board.book_variations['all'])) if res['winner'] != -1: # 不是和棋 for i in range(len(winners_z)): if (i + res['winner']) % 2 == 0: winners_z[i] = 1.0 # 更新赢家步骤位置=1 else: winners_z[i] = -1.0 # 更新输家步骤位置=-1 play_data = list( zip(session['actions'], session['mcts_probs'], winners_z))[:] data_file = session['game']._get_databuffer_file( event='vs', winner=res['winner'], white=session['players'][0], black=session['players'][1], step_num=len(play_data)) utils.pickle_dump(play_data, data_file) logging.info( "api vs play save to databuffer: {}".format(data_file)) return {'code': 0, 'msg': 'success', 'data': res} except: logging.error('execute fail [' + str(move) + '][' + session_id + '] ' + utils.get_trace()) return {'code': 5, 'msg': '请求失败', 'data': res} # 组织返回格式 return {'code': 0, 'msg': 'success', 'data': res}