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

substandard rank
Забаненный
Статус
Оффлайн
Регистрация
21 Янв 2019
Сообщения
424
Реакции[?]
113
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Продолжение темы.


Для начала импортируем библиотеки, включая модель нейросети.
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]])
 
Сверху Снизу