Форум программистов, компьютерный форум, киберфорум
Наши страницы
Искусственный интеллект
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Darkos
8 / 8 / 12
Регистрация: 16.05.2014
Сообщений: 149
Завершенные тесты: 1
1

Странное поведение при классификации изображений

15.02.2019, 22:37. Просмотров 1290. Ответов 47
Метки нет (Все метки)

Здравствуйте. Пробую сейчас себя в задачах классификации. Наткнулся на видео с CS50 о классификации изображений, попытался повторить. Суть в том что на изображениях размером 8*8 пикселей работает алгоритм, а на 64*64 нет. При чем это одни и те же изображения просто разного размера.

Код:
Кликните здесь для просмотра всего текста

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
 
def dist(x,y):
    return np.sqrt(np.sum((x-y)**2))
 
def printFigure(figure):
    plt.figure()
    plt.imshow(figure, cmap = plt.cm.gray_r, interpolation = 'nearest')
    plt.show()
 
imgCircle = Image.open('circle1.png')
arrCircle = np.asarray(imgCircle, dtype='uint8')
 
imgTriangle = Image.open('triangle1.png')
arrTriangle = np.asarray(imgTriangle, dtype='uint8')
 
imgRectangle = Image.open('rectangle1.png')
arrRectangle = np.asarray(imgRectangle, dtype='uint8')
 
imgControl = Image.open('control.png')
arrControl = np.asarray(imgControl, dtype='uint8')
 
aCircle = (255 - arrCircle)
aTriangle = (255 - arrTriangle)
aRect = (255 - arrRectangle)
 
figures = np.array([aCircle, aTriangle, aRect])
labels = np.array(['circle', 'truangle', 'rect'])
 
aControl = (255 - arrControl)
 
 
 
num = len(figures)
distance = np.zeros(num)
for i in range(num):
    distance[i] = dist(figures[i], aControl)
    print(distance[i])
minIndex = np.argmin(distance)
 
print(labels[minIndex])


Обучающая выборка:
Кликните здесь для просмотра всего текста

Название: circle1.png
Просмотров: 59

Размер: 562 байт
Название: rectangle1.png
Просмотров: 58

Размер: 390 байт
Название: triangle1.png
Просмотров: 58

Размер: 588 байт


Контрольное изображение:
Кликните здесь для просмотра всего текста

Название: control.png
Просмотров: 58

Размер: 508 байт


Кто может подсказать из за чего проблема и как вообще подходить к решению задачи подобного рода?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2019, 22:37
Ответы с готовыми решениями:

Странное поведение при отладке
Здравствуйте. Решил написать небольшую тулзу и столкнулся с проблемой: скомпилированный код...

Странное поведение при делегировании
Доброй ночи, Господа. Пишу некую доп. функциональность к календарю, но дело, собственно, не в...

Странное поведение при буте
помогите разобраться. комп старенький достаточно, при включение питания пишет cmos checksum...

Странное поведение при загрузке
Доброго времени суток! Ситуация такая,Имеется материнка ASUS P8P67 rev. B3 четыре планки памяти...

Странное поведение при добавлении dll
Доброго времени суток. Столкнулся со странной вещью и понимаю, что что-о делаю не так. В проект...

47
Darkos
8 / 8 / 12
Регистрация: 16.05.2014
Сообщений: 149
Завершенные тесты: 1
16.02.2019, 00:40  [ТС] 2
Немного модифицировал код, добавил тестовых данных. Все равно алгоритм склоняется к изображениям на которых изображены прямоугольники а не круги при контрольном оценивании.

Кликните здесь для просмотра всего текста

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
 
def dist(x,y):
    return np.sqrt(np.sum((x-y)**2))
 
def printFigure(figure):
    plt.figure()
    plt.imshow(figure, cmap = plt.cm.gray_r, interpolation = 'nearest')
    plt.show()
    
def loadFiles(count, start, dotType):
    res = np.empty(count, dtype=object)
    for i in range(0, count):
        path = start + str(i+1) + dotType
        img = Image.open(path)
        res[i] = np.asarray(img, dtype='uint8')
    return res
 
circles = loadFiles(10, 'D:\\figure\\learn\\circle\\c', '.png')
rects = loadFiles(10, 'D:\\figure\\learn\\rect\\r', '.png')
triangles = loadFiles(10, 'D:\\figure\\learn\\triangle\\t', '.png')
 
labels = np.empty(30, dtype=object)
for i in range(0, 10):
    labels[i] = 'circle'
for i in range(10, 20):
    labels[i] = 'rect'
for i in range(20, 30):
    labels[i] = 'triangle'
 
figures = np.concatenate((circles, rects, triangles))
 
 
 
 
img = Image.open('D:\\figure\\learn\\co1.png')
arrControl = np.asarray(img, dtype='uint8')
 
printFigure(arrControl)
 
num = len(figures)
distance = np.zeros(num)
for i in range(num):
    distance[i] = dist(figures[i], arrControl)
    print( distance[i])
minIndex = np.argmin(distance)
 
print(labels[minIndex])
print(distance[minIndex])
0
Mikhaylo
205 / 192 / 24
Регистрация: 20.09.2014
Сообщений: 1,384
16.02.2019, 09:52 3
Где собственно код классификации?

Вы же должны понимать, что небольшой сдвиг изображения на несколько пикселей в сторону приведет к трудности его классификации. В изображениях 8х8 этот сдвиг маленький и какой-нибудь CNN это проглотит. А в изображениях 64х64 сдвиг может быть все 8 пикселей. С этим трудно.
0
Darkos
8 / 8 / 12
Регистрация: 16.05.2014
Сообщений: 149
Завершенные тесты: 1
16.02.2019, 13:58  [ТС] 4
Mikhaylo, так что, необходимо сжимать изображения?
0
Mikhaylo
205 / 192 / 24
Регистрация: 20.09.2014
Сообщений: 1,384
16.02.2019, 15:02 5
Изображения бывают всякие, задачи бывают всякие, решения бывают всякие... Ну с вашими кружочками вроде ответ очевиден: вы сожмите все мыслимые и немыслимые кружочки-квадратики-треугольнички, ухудшится ли результат распознавания?
0
Darkos
8 / 8 / 12
Регистрация: 16.05.2014
Сообщений: 149
Завершенные тесты: 1
16.02.2019, 21:30  [ТС] 6
Результат распознавания не ухудшился, наоборот он начал давать какую то положительную динамику, но все равно еще не удовлетворительно. Я сжимаю все изображения до размера 8*8 пикселей. При большем размере вообще распознать не получается.
К тому же при таком сжатии изображения бывает превращаются в нечитаемую кашу и в таком виде по моему невозможно с ними уже работать.

Цитата Сообщение от Mikhaylo Посмотреть сообщение
Изображения бывают всякие, задачи бывают всякие, решения бывают всякие...
Для данной задачи, отнести нарисованную фигуру к одному из трех классов, какое решение было бы оптимальным?
0
Excalibur921
789 / 480 / 84
Регистрация: 12.10.2013
Сообщений: 3,185
16.02.2019, 23:44 7
Цитата Сообщение от Darkos Посмотреть сообщение
таком сжатии изображения бывает превращаются в нечитаемую кашу
Пробуйте задавать в векторном формате фигуры+шум форме фигуры и положению. Например кривыми Безье или другими параметрическими кривыми задать фигуру и шуметь координатами контрольных точек для имитации дрожания руки при рисовании. Затем растеризация в формат 8 на 8.

Добавлено через 9 минут
Цитата Сообщение от Darkos Посмотреть сообщение
как вообще подходить к решению задачи подобного рода?
В гугле “распознавание фигур на изображении”?
0
Mikhaylo
205 / 192 / 24
Регистрация: 20.09.2014
Сообщений: 1,384
17.02.2019, 06:12 8
Цитата Сообщение от Darkos Посмотреть сообщение
Для данной задачи, отнести нарисованную фигуру к одному из трех классов, какое решение было бы оптимальным?
Включите мозги: 1. разрешение должно быть близко к минимальному для данной задачи, 2. минимальное разрешение - это такое, при котором есть возможность различать углы, сглаживания по радиусу, величину углов, их направленность.

Добавлено через 5 минут
Разрешения для распознавания обычно очень небольшие: начиная от 8х8, заканчивая 64х64, очень редко распознают HD-качество, так как там уже значительные вычислительные затраты. Все зависит от контента изображения. Например, установлено, что для распознавания предметов мебели в интерьере комнат достаточно изображения 32х32. Однако, если пытаться распознавать в тех же изображениях наличие книг или карандашей, то 32х32 не хватит.
Универсального ответа на ваш вопрос нет. Задачи ОЧЕНЬ разнообразны.
0
Excalibur921
789 / 480 / 84
Регистрация: 12.10.2013
Сообщений: 3,185
17.02.2019, 16:06 9
Самое очевидное “обучение с учителем”: посмотрите как решали другие вашу задачу.
Посмотрите сколько архитектур нейросетей решает mnist.
https://ru.wikipedia.org/wiki/MNIST_(база_данных)
http://yann.lecun.com/exdb/mnist/index.html

Можно сделать экспертную систему она же фильтры глубокого обучения
“использует многослойную систему нелинейных фильтров для извлечения признаков с преобразованиями.”
Название: ScreenShot00440.jpg
Просмотров: 35

Размер: 2.6 Кб
1)бинаризация
Название: ScreenShot00441.jpg
Просмотров: 35

Размер: 3.3 Кб
2)скелетизация
Название: ScreenShot00442.jpg
Просмотров: 34

Размер: 2.3 Кб
3)векторизация
Название: ScreenShot00445.jpg
Просмотров: 35

Размер: 4.7 Кб
4)аппроксимация
Название: ScreenShot00446.jpg
Просмотров: 35

Размер: 3.0 Кб
Даже нейросеть тут не нужна, хватит пары “если то” т.к. формализация задачи простая.
Если палки 3 то это треугольник…Круто? HD разрешение? Всеравно… В реальном времени? Легко… Даже больше, можно подшаманить так фильтры чтобы даже треугольник выложенный из орнамента в виде растений был понят как треугольник.
1
Darkos
8 / 8 / 12
Регистрация: 16.05.2014
Сообщений: 149
Завершенные тесты: 1
17.02.2019, 18:48  [ТС] 10
Спасибо, весьма исчерпывающе ответили. Что делать понятно, осталось разобраться как.
С бинаризацией понятно. А вот дальше не совсем. Морфологическая скелетизация.. это оно?
0
Excalibur921
789 / 480 / 84
Регистрация: 12.10.2013
Сообщений: 3,185
17.02.2019, 19:46 11
Цитата Сообщение от Darkos Посмотреть сообщение
Морфологическая скелетизация.. это оно?
Хз. Этот пример для наглядности. Какой смысл их делать когда даже 10 чисел распознает столько разных архитектур нейросетей?
0
Darkos
8 / 8 / 12
Регистрация: 16.05.2014
Сообщений: 149
Завершенные тесты: 1
17.02.2019, 20:54  [ТС] 12
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Какой смысл их делать
Для обучения, с чего то же надо начинать. Мне задача показалась достаточно интересной.
0
Excalibur921
789 / 480 / 84
Регистрация: 12.10.2013
Сообщений: 3,185
17.02.2019, 22:27 13
Цитата Сообщение от Darkos Посмотреть сообщение
изображения бывает превращаются в нечитаемую кашу и в таком виде по моему невозможно с ними уже работать.
Покажите хоть пару преобразований 64х64 в 8х8 растр до и после.

Почему не сгенерировать самому обучающую выборку? Чтобы применять готовые нейросети 8х8.
Цитата Сообщение от Excalibur921 Посмотреть сообщение
задавать в векторном формате фигуры+шум форме фигуры и положению.
В обучающих примерах во всех растрах в центре пустота? Поставить там точку A, вторую B вести по окружности с шагом 20 градусов. Вдоль отрезка начиная из центра искать черный пиксель. Получить ломанную. Сразу не нужна бинаризация и скелетизация.
Название: ScreenShot00451.jpg
Просмотров: 33

Размер: 18.4 Кб
0
Excalibur921
789 / 480 / 84
Регистрация: 12.10.2013
Сообщений: 3,185
18.02.2019, 09:51 14
Вообще непонятно. У вас 64 на 64 растр, делаем свертку растра самым простым методом Ordered Grid SuperSampling (OGSS) ядром 8 на 8.
Получаем растр 8 на 8.
0
NO_
18.02.2019, 10:34
  #15

Не по теме:

Нейросети прекрасно подходят для чтения лекций. Когда нам поставили задачу занять студентов на несколько часов. А распознавание изображений совсем другая задача.

0
Darkos
8 / 8 / 12
Регистрация: 16.05.2014
Сообщений: 149
Завершенные тесты: 1
18.02.2019, 23:02  [ТС] 16
Хорошо, с растрами я загнул, не вник достаточно в тему. Я разобрался с этапами бинаризации и скелетизации. С векторизацией разбираюсь. Пишут про какой то алгоритм "жука", где делается обход контура фигуры с индексированием порядка обхода,
к примеру если 1 - вверх, 2 - вправо, 3 - вниз, 4 - влево,
Название: 2019-02-18_21-31-50.png
Просмотров: 27

Размер: 6.9 Кб
тогда такой контур будет описан как 11223344

с треугольниками там получается что то вроде 2322323232655565656568881888888, тут добавляются диагональные пути. вопрос стоит в том как упростить эту последовательность корректно до конечного числа векторов.

вообще это подходящий метод? как эту задачу можно решать(векторизацию)?
0
Excalibur921
789 / 480 / 84
Регистрация: 12.10.2013
Сообщений: 3,185
19.02.2019, 00:01 17
Цитата Сообщение от Darkos Посмотреть сообщение
как эту задачу можно решать(векторизацию)?
А как же пост 13 и 14?
0
Darkos
8 / 8 / 12
Регистрация: 16.05.2014
Сообщений: 149
Завершенные тесты: 1
19.02.2019, 07:21  [ТС] 18
Цитата Сообщение от Excalibur921 Посмотреть сообщение
А как же пост 13 и 14?
Так это же дает тот же скелет по сути, только точек в нем меньше, все равно нужно их еще как то обработать.
0
Excalibur921
789 / 480 / 84
Регистрация: 12.10.2013
Сообщений: 3,185
19.02.2019, 10:31 19
Цитата Сообщение от Darkos Посмотреть сообщение
ает тот же скелет по сути
Ага…с вычислениями в 100 раз проще морфологической скелетизации и алгоритма какого-то там жука? Уже замкнутая ломанная аппроксимация фигуры.

Цитата Сообщение от Darkos Посмотреть сообщение
нужно их еще как то обработать.
Максимально аппроксимировать ломанную.
Может так? Берем 3 точки подряд. Строим два отрезка, если угол меньше Порог удаляем среднюю точку. Пробегаем все. У треугольника порог углов между сторонами порядка 60 градусов? Пару итераций такого фильтра что останется от сложной ломанной?

Если палок 3 то треугольник, если 4 прямоугольник(наверно правильней смотреть углы при вершинах).Если палок будет ноль то это окружность?
0
NO_
19.02.2019, 13:04     Странное поведение при классификации изображений
  #20

Не по теме:

В теме распознавания изображений что любопытно - иногда в популярных статьях журналисты пишут о нем толковее, чем специалисты в научных. Разработчики так не хотят подумать о задаче, просто пытаются применить известные приемы. Это напоминает как в детстве в мультиках я видел как какой-нибудь герой приходит к пещере дракона, а вокруг лежат скелеты. Мне всегда про скелеты было интереснее. Про героя и так ясно, что победит. Как они тут оказались, на что надеялись. Наверно на удачу или хотели продемонстрировать квалификацию. И в отличие от машобуча неудачные попытки тут не приближают к решению, дракон становится только толще :)

0
19.02.2019, 13:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2019, 13:04
Привет! Вот еще темы с ответами:

Странное поведение при переходе по гиперссылке
не пойму, почему при переходе по гиперссылке на сайт результат не тот как если ту же ссылку...

Странное поведение при включение компьютера
Тут такая странная проблема - имеются два компьютера одинаковой конфигурации, купленные и собранные...

Странное поведение при открытии файлов
Странность вот в чём, в модель добавляется родитель(папки) и его дети(файлы). Добавляю 1 папку,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru