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

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


Для начала импортируем библиотеки, включая модель нейросети.
Python:
Expand Collapse Copy
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:
Expand Collapse Copy
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:
Expand Collapse Copy
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:
Expand Collapse Copy
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:
Expand Collapse Copy
#импорт классов
from tensorflow.keras.models import load_model #загрузка нашей модели
from PIL import Image #работа с изображением через PIL
from os import listdir #получение и открытие директории
import numpy as np #математическая библиотека

Для повышения точности распознования букв, мы переводим ее в черно-белое изображение, а после распознаем как букву.

Python:
Expand Collapse Copy
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:
Expand Collapse Copy
def dark(image):
    image = image.resize((145, 145))
    image = image.convert('L')
    
    return image

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


Python:
Expand Collapse Copy
a = ord('а')
alphabet = []
for i in range(a,a+32):
    alphabet.append(chr(i))

Ну и наконец используем модель.


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