/sudoky_solver

Hello! Can neural networks solve sudoku?//Привет! Могут ли нейросети решать судоку?

Primary LanguagePythonGNU General Public License v3.0GPL-3.0

Я использовал python3, тестировал скрипты на:

kali_linux(VERSION = "2020.1", версия ядра = 5.4.0-kali4-amd64; процессор = Intel® Pentium(R) CPU G4560 @ 3.50GHz × 4; графика = Intel® HD Graphics 610 (Kaby Lake GT1))

ubuntu(VERSION = 18.04.3 LTS (Bionic Beaver); версия ядра = 5.3.0-28-generic; процессор = AMD® Ryzen 7 1800x eight-core processor × 16; графика = GeForce GTX 1080 Ti, NVIDIA-SMI 440.64, Driver Version: 440.64, CUDA Version: 10.2)

Как происходит процесс?:

Смотрим видео:

Могут ли нейронные сети решать судоку? + гайд по установке

или читаем инструкцию:

Т.К. распознование цифр с помощью нейронной сети я сделал именно для этого сайта, для других - работать не будет Image alt

  • нажимаем Shift + Print Screen(linux) и выделяем квадрат с судокой, должно получиться следующее: Image alt

  • копируем наше изображение с судокой в папку data по следующей директории .../sudoky_solver/data. Внимательно: Путь до папки data не должен содержать русских букв! Image alt

  • запускаем скрипт sudoku_solver.py(python3 sudoku_solver.py), он выполняет несколько этапов:

    • этап_1: с помощью cv2 обрежет изображение до квадрата, выделит линии, отрисует цифры. Это сделано для того, чтобы нейросеть лучше воспринимала изображения с цифрами. Image alt

    • этап_2: так же, с помощью cv2, разбиваем картинку на мелкие квадраты, изображений в папке станет - 81, ровно столько, сколько квадратов. Image alt

    • этап_3: далее начнется распознавание картинок (.png) и превращение их в тексотовый файл (numb_regocnition.txt). Image alt Image alt

    • этап_4: сдесь происходит решение судоку и вывод решения в терминал. Image alt

Описание файлов:

- оСНОВНЫЕ ФАЙЛЫ:

	data - папка, в которую необходимо закинуть скрин как показано выше

	digit_recognition.hdf5 - веса нейросети, которая распознаёт цифры на изображениях.

	install.py - установочник для linux(kali, ubuntu)
	
	reqairement.txt - зависимости для python3
	
	sudoku_solver.hdf5 - веса нейронки, которая решает судоку. (Т.К. github ограничил загрузку файлов до 25MB, я закину нейронку на google_disk)
	
	sudoku_solver.py - основной скрипт
	
- ВСПОМОГАТЕЛЬНЫЕ ФАЙЛЫ В ПАПКЕ other(ФАЙЛЫ, КОТОРОЫЕ НЕ УЧАСТВУЮТ В РАСПОЗНОВАНИИ И РЕШЕНИИ СУДОКУ, О НИХ Я РАССКАЖУ НИЖЕ):

	colab_train_pict.py - файл, как я создавал н.сеть digit_recognition.hdf5

	colab_train_solver_keras_tuner.py - файл, как я искал лучшую модель для решения судоку с использованием kerastuner

	colab_train_sudoku_solver.py - самая простая сеть для решения судоку

	data.tar.gz.bz2 - архив с изображениями для обучения н.сети

	script_copy.py - скрипт, который создаст папки test, train, val и переместит в эти папки необходимое кол-во изображений для обучения н.сети

Как установить?:

Внимание: Путь не должен содержать русских букв!!

Как пользоваться:

python3 sudoku_solver.py (Если папки data нет, то скрипт ее создаст, закидываем .png в папку data и запускаем еще раз)

Создаем сами нейронки:

Этот пункт не обязателен. Если сами хотим создать нейронные сети - выполняем инструкцию ниже.

  • Обучаем нейронную сеть для распознования цифр:

      1. Переходим в папку other:
    
      	cd other/
    
      2. Запускаем скрипт script_copy.py:
    
      	python3 script_copy.py
    
      3. Архив data_pict.tar закидываем в корень своего google_disk
    
      4. Переходим в google colab(https://colab.research.google.com), не забываем включть GPU(Runtime - Change runtime type - Hardware accelerator - GPU - Save)
    
      5. Вставляем в google colab весь код, который находится в **colab_train_pict.py**, в итоге получим сеть у которой аккуратность на тестовых данных составит: 99.77%(+-)
    
      6. Остается только скачать её себе с google_disk
    
  • Обучаем нейронную сеть для решения судоку:

      1. Качаем отсюда https://www.kaggle.com/bryanpark/sudoku/data данные для обучения(тут один миллион примеров с судокой)
    
      2. Закидываем скаченный файл(sudoku.zip) себе на google_disk
    
      3. Переходим в google colab(https://colab.research.google.com), не забываем включть GPU(Runtime - Change runtime type - Hardware accelerator - GPU - Save)
    
      4. Тут два пути:
    
      	а) создаем простую сеть, но аккуратность на тестовых данных составит: 80% - 83%, для этого вставляем в google colab весь код из **colab_train_sudoku_solver.py**
    
      	б) хотим больше, keras-tuner в помощь)! Вставляем в google colab весь код из **colab_train_solver_keras_tuner.py**. У меня аккуратность на тестовых данных составляла: 90% - 91%(функция активации - "tanh", оптимизатор - "rmsprop" или "SGD", точно не помню!)
    

    P.S.: Размер мини-выборки(batch_size) меняем, по умолчанию - 64(сделал для быстроты обучения, хотим, что бы нейронка обучалась на всех данных для обучения - ставим 1)

P.S.S.: Это самая простая реализация нейронной сети по решению судоку. Если есть вопросы или идеи по улучшению просьба писать на почту hulumulu801@gmail.com