Программа которая читает цифры

Распознавание рукописных цифр на P­ython + GUI

Разработчики используют машинное обучение и глубокое обучение, чтобы делать компьютеры более умными. Человек учится, выполняя определенную задачу, практикуясь и повторяя ее раз за разом, запоминая, как именно это делается. После этого нейроны в мозге срабатывают автоматически и могут быстро выполнить выученную задачу.

Глубокое обучение работает по похожему принципу. В нем используются разные типы архитектуры нейронной сети в зависимости от типов проблем. Например, распознавание объектов, классификация изображений и звуков, определение объектов, сегментация изображений и так далее.

Что такое распознавание рукописных цифр?

Распознавание рукописных цифр — это способность компьютера узнавать написанные от руки цифры. Для машины это не самая простая задача, ведь каждая написанная цифра может отличаться от эталонного написания. В случае с распознаванием решением является то, что машина способна узнавать цифру на изображении.

«Удивительные люди». 5 сезон. 7 выпуск. Мария Шаболтаева. Сложные вычисления в уме

О Python-проекте

Распознавание рукописных цифр на P­ython + GUI

В этом материале реализуем приложение для распознавания написанных от руки цифр с помощью набора данных MNIST. Используем специальный тип глубокой нейронной сети, которая называется сверточной нейронной сетью. А в конце создадим графический интерфейс, в котором можно будет рисовать цифру и тут же ее узнавать.

Требования

Для этого проекта нужны базовые знания программирования на Python, библиотеки Keras для глубокого обучения и библиотеки Tkinter для создания графического интерфейса.

Установим требуемые библиотеки для проекта с помощью pip install .

Набор данных MNIST

Это, наверное, один из самых популярных наборов данных среди энтузиастов, работающих в сфера машинного обучения и глубокого обучения. Он содержит 60 000 тренировочных изображений написанных от руки цифр от 0 до 9, а также 10 000 картинок для тестирования. В наборе есть 10 разных классов. Изображения с цифрами представлены в виде матриц 28 х 28, где каждая ячейка содержит определенный оттенок серого.

Создание проекта на Python для распознавания рукописных цифр

1. Импорт библиотек и загрузка набор данных

Сначала нужно импортировать все модули, которые потребуются для тренировки модели. Библиотека Keras уже включает некоторые из них. В их числе и MNIST. Таким образом можно запросто импортировать набор и начать работать с ним. Метод mnist.load_data() возвращает тренировочные данные, их метки и тестовые данные с метками.

import keras from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten from keras.layers import Conv2D, MaxPooling2D from keras import backend as K # скачиваем данные и разделяем на надор для обучения и тесовый (x_train, y_train), (x_test, y_test) = mnist.load_data() print(x_train.shape, y_train.shape)

2. Предварительная обработка данных

Данные с изображения нельзя прямо передать в модель, поэтому сперва нужно выполнить определенные операции, обработав данные, чтобы нейронная сеть с ними работала. Размерность тренировочных данных — (60000, 28, 28) . Модель сверточной нейронной сети требует одну размерность, поэтому потребуется перестроить форму (60000, 28, 28, 1) .

Читайте также:
Как открыть программу Яндекс диск

Гениальная девочка, которая считает быстрее калькулятора — Мирослава Щербина | Круче всех


num_classes = 10 x_train = x_train.reshape(x_train.shape[0], 28, 28, 1) x_test = x_test.reshape(x_test.shape[0], 28, 28, 1) input_shape = (28, 28, 1) # преобразование векторных классов в бинарные матрицы y_train = keras.utils.to_categorical(y_train, num_classes) y_test = keras.utils.to_categorical(y_test, num_classes) x_train = x_train.astype(‘float32’) x_test = x_test.astype(‘float32’) x_train /= 255 x_test /= 255 print(‘Размерность x_train:’, x_train.shape) print(x_train.shape[0], ‘Размер train’) print(x_test.shape[0], ‘Размер test’)

3.

Создание модели

Следующий этап – создание модели сверточной нейронной сети. Она преимущественно состоит из сверточных и слоев подвыборки. Модель лучше работает с данными, представленными в качестве сеточных структур. Вот почему такая сеть отлично подходит для задач с классификацией изображений.

Слой исключения используется для отключения отдельных нейронов и во время тренировки. Он уменьшает вероятность переобучения. Затем происходит компиляция модели с помощью оптимизатора Adadelta .

batch_size = 128 epochs = 10 model = Sequential() model.add(Conv2D(32, kernel_size=(3, 3),activation=’relu’,input_shape=input_shape)) model.add(Conv2D(64, (3, 3), activation=’relu’)) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(256, activation=’relu’)) model.add(Dropout(0.5)) model.add(Dense(num_classes, activation=’softmax’)) model.compile(loss=keras.losses.categorical_crossentropy,optimizer=keras.optimizers.Adadelta(),metrics=[‘accuracy’])

4. Тренировка модели

Функция model.fit() в Keras начнет тренировку модели. Она принимает тренировочные, валидационные данные, эпохи ( epoch ) и размер батча ( batch ).

Тренировка модели занимает некоторое время. После этого веса и определение модели сохраняются в файле mnist.h5 .

hist = model.fit(x_train, y_train, batch_size = batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test)) print(«Модель успешно обучена») model.save(‘mnist.h5’) print(«Модель сохранена как mnist.h5»)

5.

Оценка модели

В наборе данных есть 10 000 изображений, которые используются для оценки качества работы модели. Тестовые данные не используются во время тренировки, поэтому являются новыми для модели. Набор MNIST хорошо сбалансирован, поэтому можно рассчитывать на точность около 99%.

score = model.evaluate(x_test, y_test, verbose=0) print(‘Потери на тесте:’, score[0]) print(‘Точность на тесте:’, score[1])

6. Создание графического интерфейса для предсказания цифр

Для графического интерфейса создадим новый файл, в котором будет интерактивное окно для рисования цифр на полотне и кнопка, отвечающая за процесс распознавания. Библиотека Tkinter является частью стандартной библиотеки Python. Функция predict_digit() принимает входящее изображение и затем использует натренированную сеть для предсказания.

Затем создаем класс App , который будет отвечать за построение графического интерфейса приложения. Создаем полотно, на котором можно рисовать, захватывая события мыши. Кнопка же будет активировать функцию predict_digit() и отображать результат.

Дальше весь код из файла gui_digit_recognizer.py :

from keras.models import load_model from tkinter import * import tkinter as tk import win32gui from PIL import ImageGrab, Image import numpy as np model = load_model(‘mnist.h5’) def predict_digit(img): # изменение рзмера изобржений на 28×28 img = img.resize((28,28)) # конвертируем rgb в grayscale img = img.convert(‘L’) img = np.array(img) # изменение размерности для поддержки модели ввода и нормализации img = img.reshape(1,28,28,1) img = img/255.0 # предстказание цифры res = model.predict([img])[0] return np.argmax(res), max(res) class App(tk.Tk): def __init__(self): tk.Tk.__init__(self) self.x = self.y = 0 # Создание элементов self.canvas = tk.Canvas(self, width=300, height=300, bg = «white», cursor=»cross») self.label = tk.Label(self, text=»Думаю..», font=(«Helvetica», 48)) self.classify_btn = tk.Button(self, text = «Распознать», command = self.classify_handwriting) self.button_clear = tk.Button(self, text = «Очистить», command = self.clear_all) # Сетка окна self.canvas.grid(row=0, column=0, pady=2, sticky=W, ) self.label.grid(row=0, column=1,pady=2, padx=2) self.classify_btn.grid(row=1, column=1, pady=2, padx=2) self.button_clear.grid(row=1, column=0, pady=2) # self.canvas.bind(«», self.start_pos) self.canvas.bind(«», self.draw_lines) def clear_all(self): self.canvas.delete(«all») def classify_handwriting(self): HWND = self.canvas.winfo_id() rect = win32gui.GetWindowRect(HWND) # получаем координату холста im = ImageGrab.grab(rect) digit, acc = predict_digit(im) self.label.configure(text= str(digit)+’, ‘+ str(int(acc*100))+’%’) def draw_lines(self, event): self.x = event.x self.y = event.y r=8 self.canvas.create_oval(self.x-r, self.y-r, self.x + r, self.y + r, fill=’black’) app = App() mainloop()

Читайте также:
Программа исправляет dll ошибки

Получится:
GUI для предсказания цифр
GUI для предсказания цифр

Выводы

Проект для распознавания рукописных цифр на Python готов. Была создана и натренирована сверточная нейронная сеть, которая идеально подходит для классификации изображений. Наконец, был реализован графический интерфейс, который используется для рисования и представления результата предсказания цифры.

Источник: pythonru.com

Как читать числа из файла в Python?

Я хотел бы прочитать числа из файла в двухмерный массив.

  • строка, содержащая w, h
  • h строк, содержащих w целых чисел, разделенных пробелом

4 3 1 2 3 4 2 3 4 5 6 7 8 9
kravemir 5 Июл 2011 в 17:40

5 ответов

Лучший ответ

Предполагая, что у вас нет посторонних пробелов:

with open(‘file’) as f: w, h = [int(x) for x in next(f).split()] # read first line array = [] for line in f: # read rest of lines array.append([int(x) for x in line.split()])

Вы можете сжать последний цикл for для понимания вложенного списка:

with open(‘file’) as f: w, h = [int(x) for x in next(f).split()] array = [[int(x) for x in line.split()] for line in f]
zeekay 8 Апр 2016 в 11:55

Чтобы сделать ответ простым, вот программа, которая читает целые числа из файла и сортирует их

f = open(«input.txt», ‘r’) nums = f.readlines() nums = [int(i) for i in nums]

После прочтения каждой строки файла конвертируем каждую строку в цифру

nums.sort()
f.close() f = open(«input.txt», ‘w’) for num in nums: f.write(«%dn» %num) f.close()

Писать их так просто, надеюсь, это поможет

Stale Noobs 9 Дек 2019 в 07:00

Для меня эта, казалось бы, простая проблема — вот что такое Python. Особенно, если вы работаете с таким языком, как C ++, где простой анализ текста может быть проблемой, вы по-настоящему оцените функционально-модульное решение, которое Python может дать вам. Я бы сделал это по-настоящему простым с помощью пары встроенных функций и некоторых выражений генератора.

Вам понадобятся open(name, mode) , myfile.readlines() , mystring.split() , int(myval) , а затем, возможно, вы захотите использовать пару генераторов, чтобы собрать их все вместе с помощью питона ,

# This opens a handle to your file, in ‘r’ read mode file_handle = open(‘mynumbers.txt’, ‘r’) # Read in all the lines of your file into a list of lines lines_list = file_handle.readlines() # Extract dimensions from first line. Cast values to integers from strings. cols, rows = (int(val) for val in lines_list[0].split()) # Do a double-nested list comprehension to get the rest of the data into your matrix my_data = [[int(val) for val in line.split()] for line in lines_list[1:]]

Посмотрите выражения генератора здесь.

Они могут действительно упростить ваш код в отдельные функциональные блоки! Представьте, что вы делаете то же самое в 4 строки в C ++ . Это было бы чудовищем. Особенно генераторы списков, когда я был парнем C ++, мне всегда хотелось, чтобы у меня было что-то подобное, и я часто заканчивал тем, что создавал пользовательские функции для создания каждого вида массива, который хотел.

Читайте также:
Лучшая программа для принтера на Андроид

machine yearning 5 Июл 2011 в 14:14

Не уверен, зачем тебе ш, ч. Если эти значения действительно необходимы и означают, что должно быть прочитано только указанное количество строк и столбцов, попробуйте следующее:

output = [] with open(r’c:file.txt’, ‘r’) as f: w, h = map(int, f.readline().split()) tmp = [] for i, line in enumerate(f): if i == h: break tmp.append(map(int, line.split()[:w])) output.append(tmp)
Artsiom Rudzenka 5 Июл 2011 в 14:19

Работает как с python2 (например, Python 2.7.10), так и с python3 (например, Python 3.6.4)

with open(‘in.txt’) as f: rows,cols=np.fromfile(f, dtype=int, count=2, sep=» «) data = np.fromfile(f, dtype=int, count=cols*rows, sep=» «).reshape((rows,cols))

Другой путь: работает как с python2 (например, Python 2.7.10), так и с python3 (например, Python 3.6.4), а также для комплексных матриц см. пример ниже (только измените int на complex )

with open(‘in.txt’) as f: data = [] cols,rows=list(map(int, f.readline().split())) for i in range(0, rows): data.append(list(map(int, f.readline().split()[:cols]))) print (data)

Я обновил код, этот метод работает для любого числа матриц и любых видов матриц ( int , complex , float ) в исходном файле in.txt .

Эта программа дает матричное умножение как приложение. Работает с python2, для работы с python3 внесите следующие изменения

print to print()
print «%7g» %a[i,j], to print («%7g» %a[i,j],end=»»)
import numpy as np def printMatrix(a): print («Matrix[«+(«%d» %a.shape[0])+»][«+(«%d» %a.shape[1])+»]») rows = a.shape[0] cols = a.shape[1] for i in range(0,rows): for j in range(0,cols): print «%7g» %a[i,j], print print def readMatrixFile(FileName): rows,cols=np.fromfile(FileName, dtype=int, count=2, sep=» «) a = np.fromfile(FileName, dtype=float, count=rows*cols, sep=» «).reshape((rows,cols)) return a def readMatrixFileComplex(FileName): data = [] rows,cols=list(map(int, FileName.readline().split())) for i in range(0, rows): data.append(list(map(complex, FileName.readline().split()[:cols]))) a = np.array(data) return a f = open(‘in.txt’) a=readMatrixFile(f) printMatrix(a) b=readMatrixFile(f) printMatrix(b) a1=readMatrixFile(f) printMatrix(a1) b1=readMatrixFile(f) printMatrix(b1) f.close() print («matrix multiplication») c = np.dot(a,b) printMatrix(c) c1 = np.dot(a1,b1) printMatrix(c1) with open(‘complex_in.txt’) as fid: a2=readMatrixFileComplex(fid) print(a2) b2=readMatrixFileComplex(fid) print(b2) print («complex matrix multiplication») c2 = np.dot(a2,b2) print(c2) print («real part of complex matrix») printMatrix(c2.real) print («imaginary part of complex matrix») printMatrix(c2.imag)

В качестве входного файла я беру in.txt :

4 4 1 1 1 1 2 4 8 16 3 9 27 81 4 16 64 256 4 3 4.02 -3.0 4.0 -13.0 19.0 -7.0 3.0 -2.0 7.0 -1.0 1.0 -1.0 3 4 1 2 -2 0 -3 4 7 2 6 0 3 1 4 2 -1 3 0 9 1 -11 4 -5
3 4 1+1j 2+2j -2-2j 0+0j -3-3j 4+4j 7+7j 2+2j 6+6j 0+0j 3+3j 1+1j 4 2 -1-1j 3+3j 0+0j 9+9j 1+1j -11-11j 4+4j -5-5j

И результат выглядит так:

Matrix[4][4] 1 1 1 1 2 4 8 16 3 9 27 81 4 16 64 256 Matrix[4][3] 4.02 -3 4 -13 19 -7 3 -2 7 -1 1 -1 Matrix[3][4] 1 2 -2 0 -3 4 7 2 6 0 3 1 Matrix[4][2] -1 3 0 9 1 -11 4 -5 matrix multiplication Matrix[4][3] -6.98 15 3 -35.96 70 20 -104.94 189 57 -255.92 420 96 Matrix[3][2] -3 43 18 -60 1 -20 [[ 1.+1.j 2.+2.j -2.-2.j 0.+0.j] [-3.-3.j 4.+4.j 7.+7.j 2.+2.j] [ 6.+6.j 0.+0.j 3.+3.j 1.+1.j]] [[ -1. -1.j 3. +3.j] [ 0. +0.j 9. +9.j] [ 1. +1.j -11.-11.j] [ 4. +4.j -5. -5.j]] complex matrix multiplication [[ 0. -6.j 0. +86.j] [ 0. +36.j 0.-120.j] [ 0. +2.j 0. -40.j]] real part of complex matrix Matrix[3][2] 0 0 0 0 0 0 imaginary part of complex matrix Matrix[3][2] -6 86 36 -120 2 -40

Источник: question-it.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru