From 417538d76862324e27e13ba3f330d60366848e4c Mon Sep 17 00:00:00 2001 From: "Casper V. Kristensen" Date: Wed, 17 Apr 2019 19:58:03 +0200 Subject: [PATCH] Now we works and we still have type hints so thats nice --- README.md | 2 +- adapter.py | 14 +++- .../white_piece_on_black_square.pkl | Bin 15051 -> 15309 bytes .../white_piece_on_white_square.pkl | Bin 32715 -> 39597 bytes main.py | 13 +-- opencv_video.py | 10 +-- runner.py | 7 +- tensor_classifier.py | 74 ++++-------------- tmp/tensor.py | 53 +++++-------- util.py | 26 +++--- 10 files changed, 75 insertions(+), 124 deletions(-) diff --git a/README.md b/README.md index 18b383a1..dc1c4c5d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ## Test Adapter: ```bash -base64 --wrap=0 < whole_boards/board_118_1554110522.620303_.png| python3 adapter.py +base64 --wrap=0 < whole_boards/boards_for_empty/board_1554285167.655788_rank_5.png | python3 adapter.py ``` ## Build OpenCV diff --git a/adapter.py b/adapter.py index 199471a6..f2282ea1 100644 --- a/adapter.py +++ b/adapter.py @@ -5,21 +5,29 @@ import sys import cv2 import numpy as np -from runner import find_homography - +from main import find_occupied_squares +from runner import find_homography, warp_board # Load base64 encoded image from stdin +from tensor_classifier import predict_board + stdin = sys.stdin.readline() stdin_decoded = base64.b64decode(stdin) img_array = np.frombuffer(stdin_decoded, dtype=np.uint8) camera_img = cv2.imdecode(img_array, flags=cv2.COLOR_BGR2RGB) camera_img = cv2.cvtColor(camera_img, cv2.COLOR_BGR2RGB) -# Find keypoints in image and pass them back to unity + +# def do_everything: homography = find_homography(camera_img) +warped_board = warp_board(camera_img, homography) +occupied_squares = find_occupied_squares(warped_board) +board = predict_board(occupied_squares) + # Finally, output to stdout for unity to read result = { "homography": homography.tolist(), + "board": board.to_array, } print(json.dumps(result)) diff --git a/classifiers/classifier_empty/white_piece_on_black_square.pkl b/classifiers/classifier_empty/white_piece_on_black_square.pkl index 7cbdd741104c61502f5a116c8083b7ba04392cbe..ca569b8c19e98c96fae99a0a682968a3e6502763 100644 GIT binary patch literal 15309 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 U=`N0JOl|BOTrr+%f0c{>3_LlZ$)|R$r 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 literal 32715 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 C{-%xq diff --git a/main.py b/main.py index f5f80e3c..6db9d81e 100644 --- a/main.py +++ b/main.py @@ -102,6 +102,7 @@ def predict_empty(square: np.ndarray, position: POSITION) -> PIECE: return None + def remove_most_empties(warped): empty = 0 non_empties = [] @@ -123,12 +124,6 @@ def remove_most_empties(warped): y, x = np.where(segment == i) - - if position == POSITION.E8: - print(np.max(segment)) - print(len(y)) - - pls.append(len(y)) top, bottom, left, right = min(y), max(y), min(x), max(x) @@ -146,13 +141,13 @@ def remove_most_empties(warped): return non_empties -def find_occupied_squares(warped: np.ndarray) -> List[Tuple[POSITION, np.ndarray]]: +def find_occupied_squares(warped: np.ndarray) -> Squares: non_empties = remove_most_empties(warped) - completely_non_empties = [] + completely_non_empties = {} for position, square in non_empties: if predict_empty(square, position) != PIECE.EMPTY: - completely_non_empties.append((position, square)) + completely_non_empties[position] = square return completely_non_empties diff --git a/opencv_video.py b/opencv_video.py index 64bef30b..94eaf711 100644 --- a/opencv_video.py +++ b/opencv_video.py @@ -10,11 +10,11 @@ cap = cv2.VideoCapture(0) color = COLOR.BLACK rank = RANK.EIGHT pieces = { - PIECE.rook: [POSITION(FILE.A, rank), POSITION(FILE.F, rank)], - PIECE.knight: [POSITION(FILE.E, rank), POSITION(FILE.H, rank)], - PIECE.bishop: [POSITION(FILE.C, rank), POSITION(FILE.D, rank)], - PIECE.queen: [POSITION(FILE.B, rank)], - PIECE.king: [POSITION(FILE.G, rank)], + PIECE.rook: [POSITION((FILE.A, rank)), POSITION((FILE.F, rank))], + PIECE.knight: [POSITION((FILE.E, rank)), POSITION((FILE.H, rank))], + PIECE.bishop: [POSITION((FILE.C, rank)), POSITION((FILE.D, rank))], + PIECE.queen: [POSITION((FILE.B, rank))], + PIECE.king: [POSITION((FILE.G, rank))], } while True: diff --git a/runner.py b/runner.py index a71c7f28..9ff20a50 100644 --- a/runner.py +++ b/runner.py @@ -89,6 +89,7 @@ def train_empty_or_piece_hist() -> None: X = [] Y = [] for piece in OUR_PIECES + (PIECE.EMPTY,): + print(f"training training_images/{piece}/{square_color}_square/*.png") for filename in glob.glob(f"training_images/{piece}/{square_color}_square/*.png"): img = cv2.imread(filename) y, x = np.histogram(img.ravel(), bins=32, range=[0, 256]) @@ -209,7 +210,8 @@ def find_homography(camera_image: np.ndarray, def warp_board(camera_image: np.ndarray, homography: np.ndarray = None, debug=False) -> np.ndarray: baseline = cv2.imread(str(here.joinpath("new_baseline_board.png"))) - homography = homography or find_homography(camera_image, baseline, debug=debug) + if homography is None: + homography = find_homography(camera_image, baseline, debug=debug) height, width, channels = baseline.shape return cv2.warpPerspective(camera_image, homography, (width, height)) @@ -289,4 +291,5 @@ def train_nn(): if __name__ == '__main__': - train_nn() + #train_nn() + train_empty_or_piece_hist() diff --git a/tensor_classifier.py b/tensor_classifier.py index f86fa945..dad7c7ad 100644 --- a/tensor_classifier.py +++ b/tensor_classifier.py @@ -1,71 +1,27 @@ -#from __future__ import absolute_import, division, print_function, unicode_literals - -import tensorflow as tf -from tensorflow.python.keras import datasets, layers, models -import glob -import numpy as np import cv2 +import numpy as np +from tensorflow.python.keras import models -import runner -from main import find_occupied_squares -from util import POSITION +from util import PIECE, Squares, Board new_model = models.load_model('chess_model_3_pieces.h5') -new_model.summary() +#new_model.summary() #board = cv2.imread("whole_boards/boards_for_empty/board_1554286488.605142_rank_3.png") #board = cv2.imread("whole_boards/boards_for_empty/board_1554285167.655788_rank_5.png") board = cv2.imread("whole_boards/boards_for_empty/board_1554288891.129901_rank_8.png") -warped = runner.warp_board(board) - -occupied = find_occupied_squares(warped) - -pos_1 = POSITION.C5 -pos_2 = POSITION.D5 -pos_3 = POSITION.G5 -pos_4 = POSITION.H5 - -square_1 = runner.get_square(warped, pos_1) -square_2 = runner.get_square(warped, pos_2) -square_3 = runner.get_square(warped, pos_3) -square_4 = runner.get_square(warped, pos_4) - -square_1 = cv2.cvtColor(square_1, cv2.COLOR_BGR2GRAY) -square_2 = cv2.cvtColor(square_2, cv2.COLOR_BGR2GRAY) -square_3 = cv2.cvtColor(square_3, cv2.COLOR_BGR2GRAY) -square_4 = cv2.cvtColor(square_4, cv2.COLOR_BGR2GRAY) - -width, height = square_1.shape -square_1 = square_1 / 255.0 -square_2 = square_2 / 255.0 -square_3 = square_3 / 255.0 -square_4 = square_4 / 255.0 - - -pieces = ['knight', 'rook', 'bishop'] - -for pos, square in occupied: - square = cv2.cvtColor(square, cv2.COLOR_BGR2GRAY) - width, height = square.shape - square = square / 255.0 - test = new_model.predict(np.array(square).reshape((-1, width, height, 1))) - text_color = 255 - cv2.putText(square, f"{pos} {pieces[int(np.argmax(test))]}", (0, 50), cv2.FONT_HERSHEY_SIMPLEX, fontScale=1, - color=(text_color,) * 3, thickness=3) - cv2.imwrite("lel", square) - -cv2.waitKey(0) - -""" -for pos, square in [(pos_1, square_1), (pos_2, square_2), (pos_3, square_3), (pos_4, square_4)]: - test = new_model.predict(np.array(square).reshape((-1, width, height, 1))) - print(f"{pos}: {np.argmax(test)}") - text_color = 255 - cv2.putText(square, f"{pos} {pieces[int(np.argmax(test))]}", (0, 50), cv2.FONT_HERSHEY_SIMPLEX, fontScale=1, - color=(text_color,) * 3, thickness=3) - cv2.imshow(f"{pos}", square) - """ +def predict_board(occupied_squares: Squares) -> Board: + board = Board() + for pos, square in occupied_squares.items(): + square = cv2.cvtColor(square, cv2.COLOR_BGR2GRAY) + width, height = square.shape + square = square / 255.0 + test = new_model.predict(np.array(square).reshape((-1, width, height, 1))) + #cv2.putText(square, f"{pos} {PIECE(int(np.argmax(test)))}", (0, 50), cv2.FONT_HERSHEY_SIMPLEX, fontScale=1, color=(255,) * 3, thickness=3) + #cv2.imwrite("lel", square) + board[pos] = PIECE(int(np.argmax(test))) + return board diff --git a/tmp/tensor.py b/tmp/tensor.py index 3ef49a3d..7d7afdc9 100644 --- a/tmp/tensor.py +++ b/tmp/tensor.py @@ -1,52 +1,35 @@ from __future__ import absolute_import, division, print_function, unicode_literals -import tensorflow as tf import glob -import numpy as np + import cv2 +import numpy as np +import tensorflow as tf -#(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data() +# exit() +from util import OUR_PIECES -#print(train_images[0]) +# (train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data() +# print(train_images[0]) -#exit() training_img = [] training_labels = [] test_img = [] test_labels_ = [] +for piece in OUR_PIECES: + # training set + for _ in range(10): + for filename in glob.glob(f"../training_images/{piece}/*_square/*.png")[:-50]: + training_img.append(cv2.cvtColor(cv2.imread(filename), cv2.COLOR_BGR2GRAY)) + training_labels.append(piece) -for _ in range(10): - for filename in glob.glob(f"../training_images/rook/*_square/*.png")[:-50]: - training_img.append(cv2.cvtColor(cv2.imread(filename), cv2.COLOR_BGR2GRAY)) - training_labels.append(1) - - -for _ in range(10): - for filename in glob.glob(f"../training_images/knight/*_square/*.png")[:-50]: - training_img.append(cv2.cvtColor(cv2.imread(filename), cv2.COLOR_BGR2GRAY)) - training_labels.append(0) - -for _ in range(10): - for filename in glob.glob(f"../training_images/bishop/*_square/*.png")[:-50]: - training_img.append(cv2.cvtColor(cv2.imread(filename), cv2.COLOR_BGR2GRAY)) - training_labels.append(2) - -for _ in range(5): - for filename in glob.glob(f"../training_images/rook/*_square/*.png")[-50:]: - test_img.append(cv2.cvtColor(cv2.imread(filename), cv2.COLOR_BGR2GRAY)) - test_labels_.append(1) - -for _ in range(5): - for filename in glob.glob(f"../training_images/bishop/*_square/*.png")[-50:]: - test_img.append(cv2.cvtColor(cv2.imread(filename), cv2.COLOR_BGR2GRAY)) - test_labels_.append(2) - -for _ in range(5): - for filename in glob.glob(f"../training_images/knight/*_square/*.png")[-50:]: - test_img.append(cv2.cvtColor(cv2.imread(filename), cv2.COLOR_BGR2GRAY)) - test_labels_.append(0) + # test set + for _ in range(5): + for filename in glob.glob(f"../training_images/{piece}/*_square/*.png")[-50:]: + test_img.append(cv2.cvtColor(cv2.imread(filename), cv2.COLOR_BGR2GRAY)) + test_labels_.append(piece) width, height = training_img[0].shape diff --git a/util.py b/util.py index 263a2447..3d6e442c 100644 --- a/util.py +++ b/util.py @@ -3,7 +3,7 @@ from __future__ import annotations from enum import Enum from functools import lru_cache from pathlib import Path -from typing import NamedTuple, Dict, Tuple +from typing import NamedTuple, Dict, Tuple, List import cv2 import numpy as np @@ -19,23 +19,24 @@ class COLOR(Enum): class PIECE(Enum): - PAWN = "pawn" - ROOK = "rook" - KNIGHT = "knight" - BISHOP = "bishop" - QUEEN = "queen" - KING = "king" - EMPTY = "empty" + KNIGHT = 0 + ROOK = 1 + BISHOP = 2 + PAWN = 3 + QUEEN = 4 + KING = 5 + EMPTY = 6 def __str__(self) -> str: - return self.value + return self.name.lower() PieceAndColor = Tuple[PIECE, COLOR] OUR_PIECES = ( - PIECE.ROOK, PIECE.KNIGHT, + PIECE.ROOK, + PIECE.BISHOP, ) @@ -85,6 +86,11 @@ Squares = Dict[POSITION, np.ndarray] class Board(Dict[POSITION, PIECE]): """Board is a dict mapping positions to a piece, i.e. a board configuration after all image processing""" + @property + def to_array(self) -> List[List[int]]: + return [[self.get(POSITION((file, rank)), PIECE.EMPTY).value for file in FILE] + for rank in RANK] + def imwrite(*args, **kwargs): Path(args[0]).parent.mkdir(parents=True, exist_ok=True)