Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Python. Нейросеть Tensorflow+Keras

Дима Ученик (108), на голосовании 3 недели назад
Подскажите пожалуйста, решил побаловаться с нейросетями для распознавания объектов на изображениях. Нашел множество примеров реализации классификатора изображений. Немного не понимаю как добиться того, чтобы находился именно необходимый объект. То есть, если я ищу на большом изображении стола кружку, а в обучающем датасете были, например, кружка, ручка и книга, то даже просто кусок стола он обозначит не "-" или "non", а как один из этих объектов.
 # Считывание изображения
img = Image.open(path)

# Загрузка модели
model = tf.keras.models.load_model("model.h5")

# Размеры матрицы
widthMatr = 100
heightMatr = 100

# Шаг смещения матрицы
widthSmeshenie = widthMatr/3
heightSmeshenie = heightMatr/3

# Количество проходов по ширине
widthNumMatr = int(img.size[0]/widthSmeshenie)
# По высоте
heightNumMatr = int(img.size[1]/heightSmeshenie)
# Итоговое количество проходов
allPhoto = widthNumMatr*heightNumMatr

array_img = []
array_result = []
array_search = []
# Проходим по большому изображению
for y in range(0, heightNumMatr):
for x in range(0, widthNumMatr):
img_crop = img.crop((widthSmeshenie*x,
heightSmeshenie*y,
widthSmeshenie*x+widthMatr,
heightSmeshenie*y+widthMatr))
array_img.append(img_crop)
img = img.convert('L')
img = (np.expand_dims (img, 0))
predictions = model.predict(img)
Class_Names = Read_Class_Names()
Result = Class_Names[np.argmax(predictions[0])]
array_result.append(Result)

# Отображение массива изображений с решением нейросети
plt.figure(figsize=(widthNumMatr, heightNumMatr))
for i in range(0, allPhoto):
plt.subplot(heightNumMatr, widthNumMatr, i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(array_img[i], cmap=plt.cm.binary)
plt.xlabel(array_result[i])
plt.show()
Голосование за лучший ответ
Алекс Куха Высший разум (460116) 1 месяц назад
Обучаемая выборка обязательно нормируется. В данном случае входные картинки приводится к одинаковому размеру. Что-то накручено много для простого решения resample (Pillow). В качестве гипотезы: мабудь в этом ошибка. Там зачем-то crop задействован.
100х100 пикселов для распознавания таких сложных объектов по мне мало будет
ДимаУченик (108) 1 месяц назад
Код да, накручен. Но какой нашел, такой и скопировал. Не вижу смысла щас упрощать. 100х100 вроде как вполне хватает. Возможно не совсем понятно объяснил суть проблемы. Допустим, есть изображение 1000х1000. Проходимся по нему 100 раз матрицей 100х100 и вырезаем. Для каждого вырезанного используем нейронку для распознавания. Те, что нужно он находит и распознает. Но также, на всех остальных изображениях 100х100 тоже выводится результат обработки(кружка, ручка или книга). А он не нужен. Нужно чтобы те изображения, на которых правда есть что-то из искомого, например, выводились на экран, а все остальные нет.
Алекс Куха Высший разум (460116) Танки Форевер, а, если кружка занимает 80% картинки? Однозначно такой подход ни к чему не приведёт
ДимаУченик (108) 1 месяц назад
Ну тут проблема даже не в подходе. Если просто в нейронку для распознавания изображений(опять же кружка, ручка или книга) загрузить изображение собаки, то она все ровно выдаст, что это либо кружка, либо ручка, либо книга. А нужно, чтобы в этом случае нейронка выдала что-ти типа "non" или "-", или что угодно, обозначающее, что это изображение не содержит ни одного объекта из обучающего множества. Вот я и не понимаю как это сделать.
Алекс Куха Высший разум (460116) Танки Форевер, так это решается анализом коэфф-то корреляции (ошибки)
Похожие вопросы