Практическая работа:
Распознавание объектов на своих изображениях с помощью предобученной
CNN (ResNet50 + CIFAR-10)
Цель
Научиться применять обученную нейронную сеть для классификации своих
изображений, загружаемых из файла или камеры. Уметь интерпретировать
результаты и оценивать уверенность модели.
Требования:
Google Colab (бесплатно)
GPU (включить в настройках)
Несколько изображений (можно скачать из интернета или сделать
фото)
Загрузка и подготовка модели
Загружаем предобученную модель ResNet50, дообученную на CIFAR-10, и
готовим её к работе с новыми изображениями.
Пошагово:
Откройте Google Colab
Перейдите на https://colab.research.google.com/ → Новый блокнот
Подключите GPU
Меню: Среда выполнения → Изменить тип среды → GPU
Импорт библиотек
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import numpy as np
import matplotlib.pyplot as plt
import cv2
import os
from google.colab import files
print("TensorFlow:", tf.__version__)
print("GPU доступен:", tf.config.list_physical_devices('GPU'))
Загрузка данных CIFAR-10 (для обучения модели — если не делали
ранее)
(x_train, y_train), (x_test, y_test) = keras.datasets.cifar10.load_data()
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0
y_train = y_train.flatten()
y_test = y_test.flatten()
class_names = ['самолёт', 'автомобиль', 'птица', 'кот', 'олень',
'собака', 'лягушка', 'лошадь', 'корабль', 'грузовик']
Создание и обучение модели (если ещё не сделано)
# Функция изменения размера
def resize_images(images):
return tf.image.resize(images, (224, 224))
# Загрузка ResNet50
base_model = keras.applications.ResNet50(
weights='imagenet',
include_top=False,
input_shape=(224, 224, 3)
)
base_model.trainable = False
model = keras.Sequential([
base_model,
layers.GlobalAveragePooling2D(),
layers.Dense(128, activation='relu'),
layers.Dropout(0.5),
layers.Dense(10, activation='softmax')
])
model.compile(optimizer=keras.optimizers.Adam(1e-4),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# Создание датасета
train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
train_dataset = train_dataset.map(lambda x, y: (resize_images(x),
y)).batch(32).prefetch(tf.data.AUTOTUNE)
test_dataset = tf.data.Dataset.from_tensor_slices((x_test, y_test))
test_dataset = test_dataset.map(lambda x, y: (resize_images(x),
y)).batch(32).prefetch(tf.data.AUTOTUNE)
# Обучение (если нужно — можно пропустить, если модель уже обучена)
print("Обучение модели...")
history = model.fit(train_dataset, epochs=5, validation_data=test_dataset,
verbose=1)
Если вы уже обучали модель ранее — можно пропустить этот шаг и
использовать сохранённую версию (см. ниже).
Загрузка и классификация своих изображений
Загружаем свои изображения, изменяем их размер, подаём на вход модели и
получаем предсказания.
Загрузка изображения из файла
# Загрузка одного файла
uploaded = files.upload() # выберите изображение (jpg/png)
# Получаем имя файла
filename = list(uploaded.keys())[0]
print(f"Загружен файл: {filename}")
Загрузка и предобработка изображения
# Загрузка через OpenCV (или PIL)
img = cv2.imread(filename)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # BGR → RGB
# Изменение размера до 224x224
img_resized = cv2.resize(img, (224, 224))
img_normalized = img_resized.astype('float32') / 255.0
# Добавляем размерность батча (1, 224, 224, 3)
img_batch = np.expand_dims(img_normalized, axis=0)
print("Форма обработанного изображения:", img_batch.shape)
Предсказание модели
# Получаем вероятности по классам
predictions = model.predict(img_batch)
# Определяем класс с максимальной вероятностью
predicted_class = np.argmax(predictions[0])
predicted_label = class_names[predicted_class]
confidence = predictions[0][predicted_class] * 100
print(f"\n Предсказанный класс: {predicted_label}")
print(f"Уверенность модели: {confidence:.2f}%")
# Визуализация
plt.figure(figsize=(6, 3))
plt.imshow(img)
plt.title(f"{predicted_label} ({confidence:.1f}%)")
plt.axis('off')
plt.show()
Автоматически классифицировать несколько изображений за один запуск.
Загрузка нескольких изображений
# Загрузка нескольких файлов
uploaded_files = files.upload()
# Список файлов
image_files = list(uploaded_files.keys())
print(f"Загружено {len(image_files)} изображений")
Цикл по всем изображениям
for filename in image_files:
print(f"\n--- Обработка: {filename} ---")
# Загрузка и обработка
img = cv2.imread(filename)
if img is None:
print(" Не удалось загрузить изображение")
continue
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_resized = cv2.resize(img, (224, 224))
img_normalized = img_resized.astype('float32') / 255.0
img_batch = np.expand_dims(img_normalized, axis=0)
# Предсказание
predictions = model.predict(img_batch)
predicted_class = np.argmax(predictions[0])
predicted_label = class_names[predicted_class]
confidence = predictions[0][predicted_class] * 100
print(f"Предсказание: {predicted_label} ({confidence:.2f}%)")
# Визуализация
plt.figure(figsize=(4, 3))
plt.imshow(img)
plt.title(f"{predicted_label}\n({confidence:.1f}%)")
plt.axis('off')
plt.show()
Пример ответа:
Загружен файл: cat.jpg
Предсказанный класс: кот
Уверенность модели: 92.7%
[Выводится изображение с подписью "кот (92.7%)"]
Контрольные вопросы :
1. Почему мы используем tf.image.resize или cv2.resize?
2. Зачем нормализуем пиксели (/255.0)?
3. Как работает np.expand_dims(..., axis=0)?
4. Что означает np.argmax(predictions[0])?
5. Почему модель может ошибаться? Какие ограничения у CIFAR-10?
Отчёт должен содержать:
Цель работы
Скриншоты загруженных изображений и результатов классификации
Таблицу с результатами (файл → предсказанный класс → уверенность)
Ответы на контрольные вопросы