|
import gradio as gr |
|
|
|
import os |
|
from core.chessboard_detector import ChessboardDetector |
|
|
|
detector = ChessboardDetector( |
|
pose_model_path="onnx/pose/4_v3.onnx", |
|
full_classifier_model_path="onnx/layout_recognition/nano_v1.onnx" |
|
) |
|
|
|
|
|
dict_cate_names = { |
|
'.': '.', |
|
'x': 'x', |
|
'红帅': 'K', |
|
'红士': 'A', |
|
'红相': 'B', |
|
'红马': 'N', |
|
'红车': 'R', |
|
'红炮': 'C', |
|
'红兵': 'P', |
|
|
|
'黑将': 'k', |
|
'黑仕': 'a', |
|
'黑象': 'b', |
|
'黑傌': 'n', |
|
'黑車': 'r', |
|
'黑砲': 'c', |
|
'黑卒': 'p', |
|
} |
|
|
|
dict_cate_names_reverse = {v: k for k, v in dict_cate_names.items()} |
|
|
|
|
|
|
|
|
|
def build_examples(): |
|
examples = [] |
|
|
|
for file in os.listdir("examples"): |
|
if file.endswith(".jpg") or file.endswith(".png"): |
|
image_path = os.path.join("examples", file) |
|
examples.append([image_path]) |
|
|
|
return examples |
|
|
|
|
|
full_examples = build_examples() |
|
|
|
|
|
with gr.Blocks(css=""" |
|
.image img { |
|
max-height: 512px; |
|
} |
|
""" |
|
) as demo: |
|
gr.Markdown(""" |
|
## 棋盘检测, 棋子识别 |
|
|
|
features: 轻量化模型 |
|
|
|
x 表示 有遮挡位置 |
|
. 表示 棋盘上的普通交叉点 |
|
|
|
步骤: |
|
1. 流程分成两步,第一步 keypoints 检测 |
|
2. 拉伸棋盘,并预测棋子 |
|
""" |
|
) |
|
with gr.Row(): |
|
with gr.Column(): |
|
image_input = gr.Image(label="上传棋盘图片", type="numpy", elem_classes="image") |
|
|
|
with gr.Column(): |
|
original_image_with_keypoints = gr.Image( |
|
label="step1: 原图带关键点", |
|
interactive=False, |
|
visible=True, |
|
elem_classes="image" |
|
) |
|
|
|
|
|
with gr.Row(): |
|
with gr.Column(): |
|
transformed_image = gr.Image( |
|
label="step2: 拉伸棋盘", |
|
interactive=False, |
|
visible=True, |
|
elem_classes="image" |
|
) |
|
|
|
with gr.Column(): |
|
use_time = gr.Textbox( |
|
label="用时", |
|
interactive=False, |
|
visible=True, |
|
) |
|
layout_pred_info = gr.Dataframe( |
|
label="棋子识别", |
|
interactive=False, |
|
visible=True, |
|
) |
|
|
|
with gr.Row(): |
|
with gr.Column(): |
|
gr.Examples( |
|
full_examples, inputs=[image_input], label="示例图片", examples_per_page=15,) |
|
|
|
|
|
def detect_chessboard(image): |
|
if image is None: |
|
return None, None, None, None |
|
|
|
try: |
|
original_image_with_keypoints, transformed_image, cells_labels_str, scores, time_info = detector.pred_detect_board_and_classifier(image) |
|
|
|
|
|
|
|
annotation_10_rows = [item for item in cells_labels_str.split("\n")] |
|
|
|
annotation_arr_10_9 = [list(item) for item in annotation_10_rows] |
|
|
|
|
|
annotation_arr_10_9 = [[dict_cate_names_reverse[item] for item in row] for row in annotation_arr_10_9] |
|
|
|
except Exception as e: |
|
gr.Warning(f"检测失败 图片或者视频布局错误") |
|
return None, None, None, None |
|
|
|
|
|
return original_image_with_keypoints, transformed_image, annotation_arr_10_9, time_info |
|
|
|
image_input.change(fn=detect_chessboard, |
|
inputs=[image_input], |
|
outputs=[original_image_with_keypoints, transformed_image, layout_pred_info, use_time]) |
|
|
|
if __name__ == "__main__": |
|
demo.launch() |
|
|