← Вернуться к списку

Обучение модели для выявления определенных различий между изображениями?

Краткое содержание

Новичок в области CV, извините, если это базовый вопрос. Вот суть: у меня есть программа, которую я запускаю много раз, и после каждого запуска я делаю скриншот. Мне нужно сравнить скриншоты N-1 и N запусков и убедиться, что они не отличаются существенно. Конечно, есть незначительные изменения, такие как обновление логотипов и изображений и т.д. До сих пор я использовал простую функцию absdiff из OpenCV для выделения областей различий и затем применял некоторый порог для определения, проходит ли что-то или нет. Но я хочу сделать это чуть более умным, но не уверен, как продолжить. Гугл не дал лучших ответов. Вот возможные подходы: 1. Обучите модель на множестве пар изображений и сделайте вывод бинарным: да или нет в зависимости от того, проходит ли что-то или нет. 2. В теории, я должен быть able to plug in 2 images and based on previous training, it should be able to tell me whether there is a significant difference or not. Вот некоторые способы, которыми можно подойти к этой задаче, особенно: 1. Использовать сверточные нейронные сети (CNN) для обучения на парах изображений. 2. Применить методы сегментации изображений и сравнения текстур для более точного выявления различий. 3. Ввести в модель механизм attention, чтобы она могла фокусироваться на ключевых областях изменений. 4. Использовать метрики, такие как Structural Similarity Index (SSIM) или Mean Squared Error (MSE), для количественной оценки различий между изображениями. 5. Рассмотреть возможность использования алгоритмов машинного обучения, таких как Random Forest или Support Vector Machines (SVM), для классификации изображений. 6. Провести предварительную обработку изображений с использованием фильтров и методов уменьшения шума перед сравнением. 7. Обучить модель на разнообразных данных, чтобы она могла адаптироваться к различным типам изменений. 8. Использовать Transfer Learning для использования предварительно обученных моделей, таких как VGG или ResNet, и адаптировать их под вашу задачу. 9. Применить методы ансамбля моделей для повышения точности классификации. 10. Провести эксперименты с различными архитектурами CNN, чтобы найти наиболее подходящую для вашего случая.

Полный текст

Обучение модели для выявления определенных различий между изображениями? Задать вопрос

Задано 5 лет назад Изменено сегодня Просмотрено 3k раз

0 $\begingroup$ Новичок в области компьютерного зрения, поэтому прошу простить за то, что это может быть базовым вопросом. Вот суть: у меня есть программа, которую я запускаю много раз, и каждый раз я получаю скриншот. Мне нужно сравнивать скриншоты из N-1 и N запусков и убедиться, что они не отличаются драматическим образом. Конечно, есть некоторые незначительные изменения, такие как обновление логотипов и картинок, и т.д. До сих пор я использовал что-то простое, например `absdiff` из OpenCV для выделения областей различий, а затем применял некоторый порог для определения того, проходит ли это или нет. Но я хочу сделать это немного более интеллектуальным, но не уверен, как продолжить. Гугл не дал лучших ответов. В сущности, я хочу обучить модель на множестве различных пар изображений и получить бинарный вывод: да или нет в зависимости от того, проходит ли это или нет. Теоретически, я должен быть able to plug in 2 images and based on previous training, it should be able to tell me whether there is a significant difference or not. Какие способы я могу использовать для этого, особенно с точки зрения каких моделей использовать? Требования здесь могут казаться нечеткими, но это и есть природа проблемы. Различия могут быть, в теории, чем угодно. Я надеюсь, что между разными изображениями будут обнаруживаться шаблоны, и модель их заметит. Например, название документа может быть 045 вместо 056 или логотип немного обновлен. neural-networks convolutional-neural-networks computer-vision image-recognition image-processing

0 $\begingroup$ Перекрестная публикация: ai.stackexchange.com/q/24957/1794, cs.stackexchange.com/q/132831/755. Пожалуйста, не публикуйте один и тот же вопрос на нескольких сайтах.

Ответы:

0 $\begingroup$ Если ваше изображение лишь незначительно меняется, вам достаточно простого алгоритма. Найдите ключевое слово "k-Nearest Neighbor" или посмотрите на эту ссылку . Чтобы определить, где находятся различия, вы можете найти разницу, вычитая два изображения с помощью этого скрипта:

```python
def extract_diff(imageA, imageB):
''' Найти различие между двумя изображениями:
+ Вход: два RGB-изображения
+ Выход: бинарное изображение, показывающее различия между двумя изображениями
Предполагается, что различия между двумя изображениями в каждом канале будут больше или равно 30 '''
subtract = imageB.astype(np.float32) - imageA.astype(np.float32)
mask_motion = cv2.inRange(np.abs(subtract), (30, 30, 30), (255, 255, 255))
# mask_motion[mask_motion==255] = 1
# масштабировать до 1 для уменьшения вычислений
return mask_motion

```

И найдите позиции с значением 255 в изображении. В следующий раз, если у вас возникнет подобный вопрос на сообществе Stack Overflow, там более активное сообщество, и они могут предложить вам лучшее решение, чем мое.

Share Improve this answer Follow

Ответ дан: 4 декабря 2020 г. в 1:24 CuCaRot 932 5 5 серебряных значков 16 16 бронзовых значков

$\endgroup$ Добавить комментарий |

Начните с вопроса, чтобы получить ответы. Задайте вопрос Исследуйте связанные вопросы neural-networks convolutional-neural-networks computer-vision image-recognition image-processing Узнайте о похожих вопросах с этими тегами.

0 $\begingroup$ Новичок в области компьютерного зрения, поэтому прошу простить за то, что это может быть базовым вопросом. Вот суть: у меня есть программа, которую я запускаю много раз, и каждый раз я получаю скриншот. Мне нужно сравнивать скриншоты из N-1 и N запусков и убедиться, что они не отличаются драматическим образом. Конечно, есть некоторые незначительные изменения, такие как обновление логотипов и картинок, и т.д. До сих пор я использовал что-то простое, например `absdiff` из OpenCV для выделения областей различий, а затем применял некоторый порог для определения того, проходит ли это или нет.

Вот один из способов подойти к этой задаче:

1. **Использование сверточных нейронных сетей (CNN)**: Сверточные сети хорошо подходят для обработки изображений и могут быть обучены на больших наборах данных, чтобы выявлять различия между изображениями.

2. **Предварительная обработка**: Примените нормализацию и масштабирование к изображениям перед подачей их в модель. Это поможет улучшить производительность модели.

3. **Создание парных данных для обучения**: Соберите множество пар изображений, где одно изображение является измененной версией другого. Используйте эти данные для обучения модели различать незначительные изменения.

4. **Модели с двумя входами**: Создайте модель с двумя входами — один для исходного изображения и другой для измененного изображения. Модель должна выдавать бинарный результат (да/нет), указывающий на наличие значительных различий.

5. **Использование предобученных моделей**: Вы можете использовать предобученные модели, такие как VGG16 или ResNet, и адаптировать их для вашей задачи.

6. **Оценка с использованием метрик**: Используйте метрики, такие как точность (accuracy), F1-score или ROC-AUC, чтобы оценить производительность модели.

7. **Трансферное обучение**: Если у вас нет большого набора данных для обучения, вы можете использовать трансферное обучение на основе предобученных моделей и адаптировать их под вашу задачу.

8. **Оптимизация гиперпараметров**: Используйте методы оптимизации, такие как Grid Search или Random Search, для поиска лучших гиперпараметров модели.

Пример кода на Python с использованием Keras и TensorFlow:

```python
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, Flatten, Dense

def create_model(input_shape):
input1 = Input(shape=input_shape)
input2 = Input(shape=input_shape)

base_model = VGG16(weights='imagenet', include_top=False, input_tensor=input1)
x = base_model.output
x = MaxPooling2D()(x)
x = Flatten()(x)
x = Dense(128, activation='relu')(x)
output = Dense(1, activation='sigmoid')(x)

model = Model(inputs=[input1, input2], outputs=output)
return model

model = create_model((256, 256, 3))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
```

Этот подход поможет вам создать более интеллектуальную систему для сравнения изображений.