substandard rank
-
Автор темы
- #1
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Продолжение темы.
Для начала импортируем библиотеки, включая модель нейросети.
После задаем константы для обучения.
Создаем класс для выдачи рандомной картинки с переводом в 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 # тест
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]])