Вопрос или проблема
Я просто хотел бы получить имена классов предсказаний. Я могу получить имена классов на изображениях, на которых я обучал модель. Но если я предсказываю изображение (например, которое не было обучено, но уже принадлежит предварительно обученной модели (VGG16), я не могу получить его имя класса).
Мой сценарий:
Я использовал предварительно обученную VGG16 и добавил новые наборы данных (например, логотипы, звезды, холмы и т. д., которые не присутствуют в VGG16 (например)).
Теперь я обучил эту модель на этих наборах данных, когда я предсказал изображение, оно выдало правильное имя класса (логотипы, звезды, холмы и т. д.).
Но когда я предсказываю изображение, которое уже было в VGG16 (например, собака, кошка), оно не дает мне правильное имя класса, т.е. собака, кошка и т. д.
Мне нужна помощь в этом сценарии.
Есть ли способ получить имя класса?
В ходе оригинальной учебной сессии была связь между именем класса и числовым идентификатором класса (например, Кошка = 0, Собака = 1 и т. д.). Модель, которую вы используете, будет выдавать только идентификаторы, и вам нужно найти используемое соответствие.
Если ваши новые данные были добавлены в дополнение к старым классам, у каждой из них должен быть новый уникальный идентификатор. Если вы использовали архитектуру VGG, чтобы обучить свои новые классы с нуля, то модель не сможет делать предсказания для оригинальных классов VGG.
Ответ или решение
Чтобы решить проблему с получением названий классов предсказаний для изображений, которые не были частью вашей обучающей выборки, но которые относятся к классовой структуре предобученной модели, такой как VGG16, необходимо учитывать несколько ключевых аспектов. Давайте рассмотрим шаги, которые помогут вам в этом процессе, а также важные детали, которые помогут лучше понять, как взаимодействуют ваши новые данные с предобученной моделью.
Понимание структуры классов
-
Обучение на предобученной модели: Вы использовали модель VGG16 и добавили в неё новые наборы данных (логотипы, звезды, холмы и т.д.), которые отличаются от классов, на которых была предобучена VGG16 (например, кошки и собаки). Когда вы добились правильных предсказаний для этих новых классов, модель могла переобучиться, и теперь её выходная структура классов по умолчанию различается с исходной моделью.
-
Классовая структура: Важно понимать, что VGG16 была обучена на наборе данных ImageNet, состоящем из 1000 классов, включая кошек и собак. Когда вы добавили новые классы, ваша модель смогла их "узнать", но структура классов, возможно, изменилась, что означает, что она не может выдавать предсказания для классов ImageNet, если вы их не учли должным образом.
Проверка выхода вашей модели
- Получение предсказаний: Когда вы делаете предсказания с помощью вашей модели на изображениях, которые могли бы относиться как к вашим новым классам, так и к классам ImageNet, необходимо понять, что ваша модель теперь имеет другой выход — ID классов, который не включает классы ImageNet.
Как вернуть названия классов
-
Создание замены для названий классов: Чтобы получать названия классов, необходимо создать соответствие между ID классов и их названиями. Это можно сделать, следуя этим шагам:
- Сохранение оригинальных названий классов: При обучении модели на собственных наборах данных сохраните соответствие между названиями классов и их идентификаторами. Это можно сделать в виде словаря или CSV-файла.
- Идентификация классов ImageNet: Используйте информацию о классах из предобученной модели VGG16, например, таблицу классов ImageNet. Вы можете найти доступные таблицы или API, которые обеспечивают погруппированную информацию о классах.
-
Код для получения названия класса:
# Предположим, что у вас уже есть модель и функция для предсказания predictions = model.predict(image) # Обратная связь для имен классов class_labels = [ ... ] # заполните это вашими классами (логотипы, звезды и т.д.) imagenet_labels = [ ... ] # 1000 классов из ImageNet # Получение индексов предсказанных классов predicted_indices = np.argmax(predictions, axis=1) # Названия классов predicted_class_names = [class_labels[i] if i < len(class_labels) else imagenet_labels[i - len(class_labels)] for i in predicted_indices]
Заключение
Таким образом, чтобы успешно получать названия классов для изображений, принадлежавших к ли вашим новым классам, ли к классам VGG16, вам нужно будет управлять соответствием между классами и ID, а также гарантировать, что ваша модель функционирует с правильно настроенной выходной структурой. Рекомендуется ведение четкой документации инструкции о классах, чтобы избежать путаницы в будущем. Такой подход не только оптимизирует обработку изображений, но и обеспечивает понимание работы вашей модели.