Как отличить треугольник от круга на изображении
Что проверяют
Выберете ли вы простое решение под простую задачу или сразу потащите нейросеть. Хорошие кандидаты сначала решают задачу геометрией в OpenCV, а потом объясняют, при каких условиях без обучения уже не обойтись. Следом обычно спрашивают, что делать с шумом, размытием и частично закрытыми фигурами.
Как отвечать
Классический пайплайн на OpenCV:
- предобработка: перевод в оттенки серого, лёгкое размытие
cv2.GaussianBlur, бинаризация черезcv2.thresholdс методом Оцу или поиск границ черезcv2.Canny; - контуры:
cv2.findContoursсRETR_EXTERNAL, чтобы не получать внутренние контуры, и отсев мелких поcv2.contourArea, это шум; - аппроксимация:
cv2.approxPolyDPс точностью порядка 2% от периметра (cv2.arcLength). Три вершины означают треугольник, у круга после аппроксимации вершин заметно больше; - круглость как второй признак:
4πS / P², где S это площадь, а P периметр. У идеального круга значение равно 1, у равностороннего треугольника около 0,6. Этот признак устойчивее счёта вершин к зазубренным границам; - проверка на круг напрямую:
cv2.HoughCirclesнаходит окружности даже при разрывах контура.
На реальных фото с перспективой, тенями и перекрытиями правила начинают ломаться. Тогда два пути: признаки (число вершин, круглость, моменты Ху через cv2.HuMoments) плюс простой классификатор, либо небольшая свёрточная сеть на размеченных примерах с аугментациями поворота, масштаба и шума. Качество проверяют на отложенной выборке и смотрят матрицу ошибок, а не только accuracy.
Где спотыкаются
Отдают в классификатор список вершин всех найденных контуров. Длина вектора получается разной для разных картинок, и модель на таком входе не обучится. Признаки считают для одного контура и фиксированным набором чисел.
Подбирают порог approxPolyDP в пикселях на одной картинке. Для маленьких и крупных фигур нужен epsilon относительно периметра, иначе мелкий треугольник превратится в точку, а крупный круг в многоугольник с десятками вершин.
Обучают нейросеть на паре примеров. Для чистых синтетических фигур хватает десятка строк геометрии, а для сложной сцены нужны сотни размеченных изображений.