Лучшая модель для классификации качества изображения (отделяйте резкие и хорошо освещенные изображения от размытых / не в фокусе / зернистых изображений)
У меня есть набор данных из около 20К изображений, помеченных людьми. Метки имеют следующий вид: Label = 1, если изображение резкое и хорошо освещенное, и Label = 0 для размытых / не в фокусе / зернистых изображений.
Изображения относятся к таким документам, как удостоверения личности.
Я хочу создать модель компьютерного зрения, которая может выполнять задачу классификации.
Я пробовал использовать VGG-16 для трансферного обучения для этой задачи, но это не дало хороших результатов (точность 0,65 и отзыв = 0,73). Мне кажется, что VGG-16 не подходит для этой задачи. Он обучен на ImageNet и имеет очень разные низкоуровневые функции. Интересно, что модель недостаточно подогнана.
Мы также попробовали EfficientNet 7. Хотя модель смогла достойно работать при обучении и проверке, производительность тестов остается низкой.
Может ли кто-нибудь предложить более подходящую модель для этой задачи?
3 ответа
Я думаю, что ваша проблема с VGG и другими NN заключается в изменении размера изображений:
VGG ожидает в качестве входного изображения размер 224x224. Я предполагаю, что ваш набор данных имеет гораздо большее разрешение, и, следовательно, вы значительно уменьшаете масштаб входных изображений, прежде чем передавать их в свою сеть.
Что происходит с размытием / шумом при уменьшении масштаба изображения?
Размытые и зашумленные изображения становятся четче и чище при уменьшении разрешения. Поэтому во многих ваших обучающих примерах сеть видит совершенно хорошие изображения, в то время как вы маркируете их как "коррумпированные". Это не подходит для тренировок.
Интересным экспериментом было бы посмотреть, какие типы деградаций ваша сеть может правильно классифицировать, а какие - нет: вы сообщаете о 65% точности при 73% полноте. Можете ли вы посмотреть на классифицированные изображения в этот момент и сгруппировать их по типу ухудшения?
То есть, что такое точность / отзыв только для размытых изображений? что это за шумные изображения? А как насчет зернистых изображений?
Что ты можешь сделать?
- Ни в коем случае не изменяйте размер изображений! если для сети требуется ввод фиксированного размера - то обрезайте, а не изменяйте размер.
- Воспользовавшись эффектом "изменения размера", вы можете подойти к проблеме с помощью "дискриминатора". Обучите сеть, которая "распознает" изображение и его уменьшенную версию. Если изображение четкое и чистое - этому дискриминатору будет сложно добиться успеха. Однако для размытых / зашумленных изображений задача должна быть довольно простой.
Я бы посмотрел на изменение цвета между пикселями, затем оценил фотографии по средней дельте между пикселями... резкое изменение от RGB (0,0,0) до (255,255,255) на каждом из соседних пикселей было бы максимальным возможный счет, чем больше размытости, тем ниже оценка.
Я делал это в прошлом, пытаясь с успехом оценить площади полей.
Я думаю, что для решения этой задачи достаточно использовать opencv. Фактически, сравнивая дисперсию Lablacien изображения с порогом (cv2.Laplacian(image, cv2.CV_64F).var()
) сгенерирует решение, является ли изображение синим или нет.
Вы можете найти объяснение метода и кода в следующем руководстве: обнаружение с помощью opencv
Я думаю, что обучение классификатора, который принимает выходные данные одной из ваших моделей нейронной сети и дисперсию Лапласиена в качестве признаков, улучшит результаты классификации.
Я также рекомендую поэкспериментировать с ResNet и DenseNet.