def test_se_tardata_sudokus(file_path_base): try: image_file_name = file_path_base + '.jpg' image = load_image(image_file_name) except: image_file_name = file_path_base + '.png' image = load_image(image_file_name) with open(file_path_base + '.txt', 'rt') as f: correct_parsing = f.read().strip() predictions, sudoku, subimage = extract_sudoku(image, classifier(), force=True) parsed_sudoku = predictions_to_suduko_string(predictions, oneliner=False) if parsed_sudoku != correct_parsing: predictions, sudoku, subimage = extract_sudoku(image.rotate(-90), classifier(), force=True) parsed_sudoku = predictions_to_suduko_string(predictions, oneliner=False) assert parsed_sudoku == correct_parsing try: os.remove(image_file_name) os.remove(file_path_base + '.txt') print("Deleted temporary test dir.") os.removedirs(os.path.dirname(file_path_base)) except: pass
def test_xanadoku_sudokus(sudoku_doc): if not sudoku_doc.get('verified'): assert True else: print(sudoku_doc.get('_id')) image = download_image(sudoku_doc.get('raw_image_url')) predictions, sudoku, subimage = extract_sudoku(image, classifier(), force=True) parsed_sudoku = predictions_to_suduko_string(predictions, oneliner=True) if parsed_sudoku != sudoku_doc.get('parsed_sudoku'): predictions, sudoku, subimage = extract_sudoku(image.rotate(-90), classifier(), force=True) parsed_sudoku = predictions_to_suduko_string(predictions, oneliner=True) assert parsed_sudoku == sudoku_doc.get('parsed_sudoku')
def test_image_1_with_trained_classifier(): image = _get_img(1) c = fit.KNeighborsClassifier(n_neighbors=5) c = fit.fit_sudokuextract_classifier(c) predictions, sudoku, subimage = extract_sudoku(image, c) parsed_sudoku = predictions_to_suduko_string(predictions) assert parsed_sudoku == _get_parsed_img(1)
def test_image_2_with_trained_classifier(): image = _get_img(2) c = fit.KNeighborsClassifier(n_neighbors=10) c = fit.fit_combined_classifier(c) predictions, sudoku, subimage = extract_sudoku(image, c) parsed_sudoku = predictions_to_suduko_string(predictions) assert parsed_sudoku == _get_parsed_img(2)
def extract_sudoku(imagePath): fd = urlopen(imagePath) imagePath = io.BytesIO(fd.read()) img = load_image(imagePath) predictions, sudoku_box_images, whole_sudoku_image = extract_sudoku( img) result = predictions_to_suduko_string(predictions) print(result)
#data.fetch_all_xanadoku_images('~/Documents/SudokuExtract_Test', 'bjornbar') #image_url = "https://static-secure.guim.co.uk/sys-images/Guardian/Pix/pictures/2013/2/27/1361977880123/Sudoku2437easy.jpg" the_image = download_image( "https://res.cloudinary.com/hzlcxa6rf/image/upload/56d9d0df9f94ac0009519152" ) #the_image = load_image('~/Documents/SudokuExtract_Test/56d9aad9ae834500099af4da.jpg') #the_image = load_image('~/Documents/SudokuExtract_Test/56e006a63e921a0009d40071.jpg') #the_image = load_image('~/Documents/SudokuExtract_Test/56e0053e3e921a0009d40070.jpg') #the_image = load_image('~/Documents/SudokuExtract_Test/56e0a6237303ae0009e9a994.jpg') #the_image = load_image('~/Documents/SudokuExtract_Train/i1.png') #the_image = load_image('tests/img18.jpg') #the_image = the_image.rotate(-90) preds, sudoku, subimage = extract_sudoku(the_image, force=True) import matplotlib.pyplot as plt ax = plt.subplot2grid((9, 9 + 9), (0, 0), colspan=9, rowspan=9) ax.imshow(subimage, plt.cm.gray) ax.axis('off') for k in range(len(sudoku)): for kk in range(len(sudoku[k])): ax = plt.subplot2grid((9, 9 + 9), (k, 9 + kk)) ax.imshow(sudoku[k][kk], plt.cm.gray) ax.set_title(str(preds[k, kk])) ax.axis('off') plt.show()
#data.fetch_all_xanadoku_images('~/Documents/SudokuExtract_Test', 'bjornbar') #image_url = "https://static-secure.guim.co.uk/sys-images/Guardian/Pix/pictures/2013/2/27/1361977880123/Sudoku2437easy.jpg" the_image = download_image("https://res.cloudinary.com/hzlcxa6rf/image/upload/56d9d0df9f94ac0009519152") #the_image = load_image('~/Documents/SudokuExtract_Test/56d9aad9ae834500099af4da.jpg') #the_image = load_image('~/Documents/SudokuExtract_Test/56e006a63e921a0009d40071.jpg') #the_image = load_image('~/Documents/SudokuExtract_Test/56e0053e3e921a0009d40070.jpg') #the_image = load_image('~/Documents/SudokuExtract_Test/56e0a6237303ae0009e9a994.jpg') #the_image = load_image('~/Documents/SudokuExtract_Train/i1.png') #the_image = load_image('tests/img18.jpg') #the_image = the_image.rotate(-90) preds, sudoku, subimage = extract_sudoku(the_image, force=True) import matplotlib.pyplot as plt ax = plt.subplot2grid((9, 9+9), (0, 0), colspan=9, rowspan=9) ax.imshow(subimage, plt.cm.gray) ax.axis('off') for k in range(len(sudoku)): for kk in range(len(sudoku[k])): ax = plt.subplot2grid((9, 9 + 9), (k, 9+kk)) ax.imshow(sudoku[k][kk], plt.cm.gray) ax.set_title(str(preds[k, kk])) ax.axis('off') plt.show()
def _process_an_image(image, correct_sudoku): predictions, sudoku, subimage = extract_sudoku(image, classifier()) parsed_sudoku = predictions_to_suduko_string(predictions) assert parsed_sudoku == correct_sudoku
json_file = open('model.json', 'r') loaded_model_json = json_file.read() json_file.close() loaded_model = model_from_json(loaded_model_json) # load weights into new model loaded_model.load_weights("model.h5") print("Loaded model from disk") loaded_model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) from os import sys from sudokuextract.extract import extract_sudoku, load_image, predictions_to_suduko_string img = load_image(sys.argv[1]) predictions, sudoku_box_images, whole_sudoku_image = extract_sudoku(img) numbers = predictions_to_suduko_string(predictions) numbers = numbers.replace('\n', '') numbers = np.array(list((numbers))) #numbers_float = np.array(numbers).astype(np.float32).reshape(-1,9,9) numbers_int = np.array(numbers).astype(np.int32).reshape(9, 9) print(numbers_int) numbers = numbers_int.reshape(-1, 9, 9) #numbers = numbers.reshape(-1,9,9) numbers = to_categorical(numbers).astype('float32') smart_guesses = batch_smart_solve(numbers.argmax(3), loaded_model) print(smart_guesses)
def main(image=None): HARDEST = """ +-------+-------+-------+ | 8 0 0 | 0 0 0 | 0 0 0 | | 0 0 3 | 6 0 0 | 0 0 0 | | 0 7 0 | 0 9 0 | 2 0 0 | +-------+-------+-------+ | 0 5 0 | 0 0 7 | 0 0 0 | | 0 0 0 | 0 4 5 | 7 0 0 | | 0 0 0 | 1 0 0 | 0 3 0 | +-------+-------+-------+ | 0 0 1 | 0 0 0 | 0 6 8 | | 0 0 8 | 5 0 0 | 0 1 0 | | 0 9 0 | 0 0 0 | 4 0 0 | +-------+-------+-------+ """ PROBLEM_GRID = """ +-------+-------+-------+ | 0 0 0 | 0 0 0 | 0 0 1 | | 0 1 2 | 0 0 0 | 0 0 0 | | 0 0 0 | 0 0 0 | 2 0 0 | +-------+-------+-------+ | 0 0 0 | 0 0 0 | 0 0 2 | | 0 2 0 | 0 0 0 | 0 0 0 | | 0 0 0 | 0 0 0 | 0 0 0 | +-------+-------+-------+ | 0 0 0 | 0 0 0 | 1 2 0 | | 1 0 0 | 0 0 2 | 0 0 0 | | 0 0 0 | 1 0 0 | 0 0 0 | +-------+-------+-------+ """ CONST = """ B9+B8+C1+H4+H4=23 A5+D7+I5+G8+B3+A5=19 I2+I3+F2+E9=15 I7+H8+C2+D9=26 I6+A5+I3+B8+C3=20 I7+D9+B6+A8+A3+C4=27 C7+H9+I7+B2+H8+G3=31 D3+I8+A4+I6=27 F5+B8+F8+I7+F1=33 A2+A8+D7+E4=21 C1+I4+C2+I1+A4=20 F8+C1+F6+D3+B6=25 """ if image != None: try: print("\n[+] Extracting sudoku puzzle from: {}".format(image)) img = load_image(image) predictions, sudoku_box_images, whole_sudoku_image = extract_sudoku( img) problem = predictions_to_suduko_string(predictions) except SudokuExtractError: print("[!] Could not extract Sudoku grid from the image: {}\n". format(image)) exit(0) else: problem = HARDEST s = Sudoku(problem=problem) print("[+] Problem Puzzle:\n{}".format(s.get_grid(s.problem))) s.solve_z3() print("Solved: {}\n".format(s.is_solved())) print(s.get_side_by_side(s.problem, s.solution))