- Статус
- Оффлайн
- Регистрация
- 21 Янв 2019
- Сообщения
- 429
- Реакции
- 113
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Продолжение темы.
Для начала импортируем библиотеки, включая модель нейросети.
После задаем константы для обучения.
Создаем класс для выдачи рандомной картинки с переводом в array.
#Тоже самое для валида
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]
После делаем функцию для создания моделей с разной "обучаемостью"
После вызываем создание модели.
proper =ModelCreator()
На этом создание нашей модели окончено.
Перейдем к использованию.
Для повышения точности распознования букв, мы переводим ее в черно-белое изображение, а после распознаем как букву.
Черно-белый
Получаем весь русский алфавит
Ну и наконец используем модель.
Для начала импортируем библиотеки, включая модель нейросети.
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]])