Обучение расшифровке captcha
Я создал код для расшифровки капчи на примере этой картинки:
Разделил каждую букву и цифру на единицы, создал генератор таких капч, создал больше 30 тысяч изображений в разных вариациях. Начал обучать нейронку для распознавания каждого символа, на что начал получать ошибку по изображениям. Дальше и остановился потому, что перестал понимать, как реализовать обучение и вывод готового результата в текст
Использовал библиотеку keras
- Деление на буквы и цифры по 1
from tensorflow.keras.models import load_model from tensorflow.keras.preprocessing.image import load_img, img_to_array import numpy as np
def recognize_captcha(model_path, image_path):
model = load_model(model_path)
img = load_img(image_path, target_size=(150, 150))
img_array = img_to_array(img)
img_array = np.expand_dims(img_array, axis=0) / 255.0
predictions = model.predict(img_array)
predicted_class = np.argmax(predictions, axis=1)[0] # Для демонстрации, используем индекс класса как строку
class_labels = {i: f'char_{i}' for i in range(36)} # Подставьте правильные метки классов
predicted_label = class_labels.get(predicted_class, 'Unknown')
return predicted_label
if __name__ == "__main__":
model_path = 'captcha_model.h5'
test_image_path = '4RCCCK.png'
result = recognize_captcha(model_path, test_image_path)
print(f'Recognized captcha: {result}')
- сама генерация изображений
from captcha.image import ImageCaptcha
import random
import os
def generate_captchas(output_dir, num_samples):
if not os.path.exists(output_dir):
os.makedirs(output_dir)
image = ImageCaptcha(width=160, height=60)
characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
for i in range(num_samples):
code = ''.join([random.choice(characters) for _ in range(6)]) # Генерация кода капчи
image_file = os.path.join(output_dir, f'{code}.png')
image.generate_image(code).save(image_file)
print(f'Generated {image_file}')
if __name__ == "__main__":
output_dir = 'captcha_images'
num_samples = 1000
generate_captchas(output_dir, num_samples)
- обучалка
import os
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
from tensorflow.keras.optimizers import Adam
def build_model():
model = Sequential([
Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)),
MaxPooling2D(pool_size=(2, 2)),
Conv2D(64, (3, 3), activation='relu'),
MaxPooling2D(pool_size=(2, 2)),
Conv2D(128, (3, 3), activation='relu'),
MaxPooling2D(pool_size=(2, 2)),
Flatten(),
Dense(128, activation='relu'),
Dense(36, activation='softmax') # 36 классов для символов и дефисов
])
model.compile(optimizer=Adam(), loss='categorical_crossentropy', metrics=['accuracy'])
return model
def train_model(model):
datagen = ImageDataGenerator(rescale=1./255)
train_generator = datagen.flow_from_directory(
'preprocessed_images/parts',
target_size=(150, 150),
batch_size=32,
class_mode='categorical'
)
# Выводим информацию для отладки
print(f'Found {train_generator.samples} samples belonging to {train_generator.num_classes} classes.')
if train_generator.samples == 0:
raise ValueError("No images found in the specified directory.")
model.fit(train_generator, epochs=10)
model.save('captcha_model.h5')
if __name__ == "__main__":
model = build_model()
train_model(model)