Exemplo n.º 1
0
 def get_score(self):
     """盘面打分"""
     try:
         return self.info_handler.info['score'][1].cp
     except Exception as e:
         logging.warning(utils.get_trace())
         return -1
Exemplo n.º 2
0
 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))
Exemplo n.º 3
0
    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
            }
        }
Exemplo n.º 4
0
 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
Exemplo n.º 5
0
 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
Exemplo n.º 6
0
 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
Exemplo n.º 7
0
 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
Exemplo n.º 8
0
    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}
Exemplo n.º 9
0
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()
Exemplo n.º 10
0
    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}