Разбор букав Python

Статус
В этой теме нельзя размещать новые ответы.
  • 80
  • 4
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Продолжение темы.


Для начала импортируем библиотеки, включая модель нейросети.
Python:
from tensorflow.keras.utils import Sequence
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, Flatten, Dense, MaxPool2D, GlobalAveragePooling2D
from tensorflow.keras.callbacks import ModelCheckpoint
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from skimage.util import random_noise
from os import listdir
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
После задаем константы для обучения.
Python:
train_data = 'C:/...' #наши рукописные буквы
valid_data = 'C:/...' #наши валиды
check_data = 'C:/...' #наши данные для теста модели
CLASS = 32 # Количество классов
EPOCH = 100 # Количество эпох
COUNT_TRAIN_IMAGE = 1000 # картинки для тренеровки
COUNT_VALID_IMAGE = 100 # валиды
COUNT_CHECK_IMAGE = 100 # тест
Создаем класс для выдачи рандомной картинки с переводом в array.

Python:
class RandGen(Sequence):
def __init__(self):
self.Y = np.eye(COUNT_CLASS)

def __len__(self):
return COUNT_TRAIN_IMAGE

def __getitem__(self, index):
index += 1
list_array_images = []
list_file = listdir(train_data)
for file in list_file:
im = Image.open(f'{train_data}\\{file}\\{file} ({index}).png')
list_array_images.append(np.array(im))
return np.array(list_array_images, dtype=np.float32)[..., None], self.Y
#Тоже самое для валида

class RandGenVal(Sequence):
def __init__(self):
self.Y = np.eye(COUNT_CLASS)

def __len__(self):

return COUNT_VALID_IMAGE

def __getitem__(self, index):
index += 1
list_array_images = []
list_file = listdir(valid_data)
for file in list_file:
im = Image.open(f'{tvalid_data}\\{file}\\{file} ({index}).png')
list_array_images.append(np.array(im))
return np.array(list_array_images, dtype=np.float32)[..., None], self.Y

#Ну и для тестирования

class RandGenCheck(Sequence):
def __init__(self):
self.Y = np.eye(COUNT_CLASS)

def __len__(self):
return COUNT_CHECK_IMAGE

def __getitem__(self, index):
index += 1
list_array_images = []
list_file = listdir(check_data)
for file in list_file:
im = Image.open(f'{check_data}\\{file}\\{file} ({index}).png')
list_array_images.append(np.array(im))
return np.array(list_array_images, dtype=np.float32)[..., None], self.Y[/CODE]


После делаем функцию для создания моделей с разной "обучаемостью"

Python:
def ModelCreator():

# создание модели
model = Sequential()

# добавляем слои
model.add(Conv2D(32, kernel_size=3, strides=3, activation='relu', input_shape=(145, 145, 1)))
model.add(Conv2D(128, kernel_size=3, strides=3, activation='relu'))

model.add(MaxPool2D((2, 2)))

model.add(Conv2D(512, kernel_size=3, activation='relu'))

model.add(Flatten())
model.add(Dense(32, activation='softmax'))

# вывод информации архитектуры
model.summary()

# компиляция
model.compile('adam', 'categorical_crossentropy', metrics=['accuracy'])

# ген изображений
gen = RandGen()

valgen = RandGenVal()

# Загрузка данных для обучения
model.fit_generator(gen, epochs=EPOCH, validation_data=valgen, steps_per_epoch=COUNT_TRAIN_IMAGE,
shuffle=True, callbacks=[ModelCheckpoint('models\\Model1.h5', save_best_only=True)])

return model
После вызываем создание модели.
proper =ModelCreator()

На этом создание нашей модели окончено.
Перейдем к использованию.

Python:
#импорт классов
from tensorflow.keras.models import load_model #загрузка нашей модели
from PIL import Image #работа с изображением через PIL
from os import listdir #получение и открытие директории
import numpy as np #математическая библиотека
Для повышения точности распознования букв, мы переводим ее в черно-белое изображение, а после распознаем как букву.

Python:
def detect(path):

image = Image.open(path) #получаем картинку
image = convert_image(image) #конвертируем
array_image = np.asarray(image) #разбиваем* картинку
array_image = np.array(array_image, dtype=np.float32)[..., None] #^
array_image = array_image.reshape(-1, 145, 145, 1)
letter = model.predict(array_image) #предсказываем букву с помощью нашей модели.

return letter #возвращаем букву
Черно-белый

Python:
def dark(image):
image = image.resize((145, 145))
image = image.convert('L')

return image
Получаем весь русский алфавит


Python:
a = ord('а')
alphabet = []
for i in range(a,a+32):
alphabet.append(chr(i))
Ну и наконец используем модель.


Python:
#загрузка модели
model = load_model('models\\Model1.h5')
link = input("Введите ссылку на букву: ")
print(alphabet[detect(link).argmax(1)[0]])
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу