Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/104: Рейтинг темы: голосов - 104, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 17

Найти некоторый объект на изображении

18.08.2014, 11:49. Показов 20678. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне требуется написать подобную программу на Python, но я очень слабо представляю что и как делать(я новичок). Времени у меня неделя и я надеюсь хоть что-либо сделать, но нужна помощь. Образец того, что искать, есть.
Может кто скинуть образец кода, который я могу оптимизировать, либо ссылку на хороший разбор подобных программ(именно на питоне).
Заранее Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.08.2014, 11:49
Ответы с готовыми решениями:

Как найти объект на изображении (openCV)?
Добрый день всем. возможно ли найти объект на изображение который находится ближе всего с помощью openCV. предварительно можно узнать...

Разработать класс, описывающий некоторый объект питон
Здравствуйте, из-за нехватки опыта и времени не могу понять, как сделать эту программу. Помогите пожалуйста Разработать класс,...

Разработать класс, описывающий некоторый объект из заданной предметной области
Сведения о компьютерах Класс должен содержать: строку документации; не менее 6 атрибутов (переменных); не менее 4 методов,...

11
40 / 37 / 15
Регистрация: 25.10.2012
Сообщений: 112
18.08.2014, 18:05
Для таких штук используют машинное обучение. В конкретном случае, скорее всего, подойдёт связка SVM и HOG. Что касается реализации, то имеет смысл воспользоваться, например, OpenCV.
Если будет больше информации и какая-то обучающая выборка, можно будет говорить о коде
0
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 17
18.08.2014, 18:27  [ТС]
xanderfomin, подборка фотографий имеется, это не проблема, про opencv, по ее описанию, додумался давно. Но вот реализацию в упор не понимаю.
0
40 / 37 / 15
Регистрация: 25.10.2012
Сообщений: 112
18.08.2014, 18:56
Sacerdos, тогда попробую набросать последовательность действий, чтобы Вам было проще формулировать конкретные вопросы.
  • Обучающая выборка должна представлять из себя картинки (patches) со сторонами, кратными 2. На каждом патче может быть либо искомый объект (и только он, т.е. минимум "лишнего" по бокам), либо нечто не являющееся искомым объектом.
  • Для каждого патча с помощью OpenCV создаётся HOG-дескриптор.
  • Поскольку заранее известно, какие патчи соответствуют объектам, а какие — их отсутствию, то, фактически, получаем два массива (вектора, списка), в первом из которых хранятся HOG-дескрипторы, а во втором — истина или ложь (True или False, 1 или 0) в зависимости от того, что изображено на соответствующем патче.
  • Используя полученные векторы, с помощью OpenCV обучается SVM.
После этого можно скармливать обученному классификатору произвольные изображения и подгонять точность.
Простейший способ оценки качества — разделить выборку на 2 части. На одной производить обучение, на другой — оценку качества.
0
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 17
19.08.2014, 10:14  [ТС]
xanderfomin, примерно в этом и вопросы. Я сейчас нахожусь в состоянии, что должен все это узнать/понять/сделать.
1) Есть подборка, изменить размеры, если что не проблема, но эти "patches" наверняка надо свести в каком-то файле и определенном формате?
2) Я сейчас только пытаюсь понять дескрипторы, поэтому пока вопросов нет ибо их много.
3) Тобишь будет создано два файла где во втором, грубо скажем, будет каждая строка соответствовать определенному изображению и на ней будет написано (True или False, 1 или 0)?
4) По этому пока вопроса нет, ибо надо хотя бы создать HOG-дескриптор

Добавлено через 10 минут
UPD. Насчет первого, это создать sample.vec? С помощью opencv_createsamples.exe?
Если да, то дескриптор создается, с помощью python(В смысле кода) или еще с помощью одного приложения?
0
40 / 37 / 15
Регистрация: 25.10.2012
Сообщений: 112
19.08.2014, 11:56
Sacerdos,
  1. Нет, сводить в какой-то отдельный файл их не нужно. Одна картинка — один патч. И будет у Вас, к примеру, 500 патчей с объектами, каждый из которых имеет размер 64 x 128. Что касается использования OpenCV — вот тут есть неплохой пример. Класс так и называется — HOGDescriptor.
  2. Под спойлером находится краткое описание HOG. Плюс в том, что OpenCV всё за Вас сделает сам. Ему нужны только патчи.
    Кликните здесь для просмотра всего текста
    Что касается HOG, то идея заключается в следующем. Человеческий глаз определяет объекты прежде всего по их границам. Границы, по сути, являются переходами между интенсивностью в чёрно-белом изображении. Именно эта идея лежит в основе HOG-дескрипторов. Возьмём патч размером 64 x 128. Пусть у нас есть окно размера 8 x 8, т.е. содержащее 64 пикселя. Будем двигать окно по нашему патчу с определённым шагом (например, с шагом 4 по горизонтали и шагом 4 по вертикали). При таких значениях нам придётся сдвигать окно на 64 / 4 - 1 = 15 шагов по горизонтали и на 128 / 4 - 1 = 63 шага по вертикали. В каждом положении окно "покрывает" 64 пикселя исходного патча, и для каждого положения окна на основании интенсивности "покрытых" 64 пикселей вычисляется направление градиента (т.е. направление, двигаясь в котором, мы быстрее всего достигнем границы объекта). Несложно подсчитать, что при указанных выше числах мы можем получить 15 * 63 = 945 таких значений. После этого значения квантуются на определённое кол-во направлений, и строится HOG для обрабатываемого патча.
  3. Да, именно так. Но учитывая, что у нас тут Python, это может быть список кортежей вида (HOG, bool).

Если мне удастся выкроить немного времени, я постараюсь написать небольшой пример кода.
0
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 17
19.08.2014, 17:40  [ТС]
xanderfomin,
1) Попытался по образу и подобию того, что в ссылке,
2) Ну и пока застопорился...
0
40 / 37 / 15
Регистрация: 25.10.2012
Сообщений: 112
19.08.2014, 17:52
Sacerdos, я успел поизучать это дело подробнее, вот что могу сказать: OpenCV прекрасно строит HOG, но по имеющемуся набору HOG обучить классификатор не умеет. Нужно использовать другие библиотеки — SVMLight, liblinear или что-то подобное, а затем реализовывать скользящее окно для распознавания. Попозже смогу дать более развёрнутый комментарий, а пока небольшой пример получения HOG для имеющейся картинки.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
import cv2 as cv
 
def main(filename='image.png'):
    image = cv.imread(filename, cv.IMREAD_GRAYSCALE)
    hog = cv.HOGDescriptor()
    features = hog.compute(image)
    print(features)
    pass
 
if __name__ == '__main__':
    main()
else:
    pass
0
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 17
20.08.2014, 12:22  [ТС]
Для создания своего классификатора подойдет вот это и вот это?(это одно и то же на разных языках)
Чтобы потом вставить, к примеру, в стандартную программу определения лица вместо "haarcascade_frontalface_alt.xml"

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import numpy as np
import cv2
cascade = cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")
cap = cv2.VideoCapture(0)
cv2.namedWindow("camera")
#ret = cap.set(3,320)
ret = cap.set(4,240)
#ret = cap.set(5,15)
while(True):
    ret, frame = cap.read()
    cv2.imshow("camera", frame)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces = cascade.detectMultiScale(gray, 1.3, 4, cv2.cv.CV_HAAR_SCALE_IMAGE, (20,20))
    if len(faces) > 0:
        for (x,y,w,h) in faces:
            cv2.rectangle(frame, (x,y), (x+w,y+h), (255, 0, 0))
    cv2.imshow("camera", frame)
    if cv2.waitKey(20) == 27:
        break
cap.release()
cv2.destroyAllWindows()
0
40 / 37 / 15
Регистрация: 25.10.2012
Сообщений: 112
20.08.2014, 19:55
Не зная конкретной области, сложно сказать, подойдут ли вам каскады Хаара. Но думаю, что начинать в любом случае лучше с SVM.
Я набросал пример классификатора для распознавания пешеходов. Попробуйте поизучать его и задать вопросы.
Чтобы код заработал, требуются:Дерево файлов можно подсмотреть под спойлером.
Кликните здесь для просмотра всего текста
+--- svm.py
|
+--- test.data
|
+--- train.data
|
+--- test
|
+--- train
|
+--- positive
|
+--- negative

Если будете запускать в Linux, то в файле train.dat необходимо заменить все обратные слэши на прямые.
Получающийся классификатор имеет accuracy (использую англоязычный термин, т.к. есть проблемы с переводом) чуть меньше 90%. Precision, recall, f-measure и т.д. не считал (подробнее обо всём этом можно почитать здесь).
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#! /usr/bin/env plabelsthon2
 
import cv2 as cv
import sys
from contextlib import contextmanager
from multiprocessing.pool import ThreadPool
from StringIO import StringIO
from svmutil import *
 
GLOBAL_MODEL_FILENAME = 'model.dat'
GLOBAL_TRAINING_DATA_FILENAME = 'train.dat'
GLOBAL_TEST_DATA_FILENAME = 'test.dat'
GLOBAL_PATCH_WIDTH = 80
GLOBAL_PATCH_HEIGHT = 200
GLOBAL_WINDOW_WIDTH = 64
GLOBAL_WINDOW_HEIGHT = 128
GLOBAL_MAX_THREADS_COUNT = 8
 
 
@contextmanager
def nooutput():
    """Suppresses stdout."""
    saved_stdout = sys.stdout
    sys.stdout = StringIO()
    yield
    sys.stdout = saved_stdout
 
 
def build_hog(args):
    """Builds HOG for image given."""
    filename, label = args
    image = cv.imread(filename, cv.IMREAD_GRAYSCALE)
    image = cv.resize(image[:GLOBAL_PATCH_HEIGHT, :GLOBAL_PATCH_WIDTH],
                      (GLOBAL_WINDOW_WIDTH, GLOBAL_WINDOW_HEIGHT))
    hog = cv.HOGDescriptor()
    return float(label), [e for s in hog.compute(image) for e in s]
 
 
def train(filename=GLOBAL_TRAINING_DATA_FILENAME):
    """Performs classifier training."""
    with open(filename, 'r') as f:
        data = [tuple(e.split()) for e in f.read().split('\n')][:-1]
    print('Processing images...')
    pool = ThreadPool(GLOBAL_MAX_THREADS_COUNT)
    result = pool.map_async(build_hog, data)
    data = result.get()
    y = [y for y, _ in data]
    x = [x for _, x in data]
    assert(len(y) == len(x))
    print('Training SVM...')
    model = svm_train(y, x, '-t 0 -c 2 -e 0.001')
    return model
 
 
def test(model, filename=GLOBAL_TEST_DATA_FILENAME):
    """Performs classifier test using model and test data given."""
    y, x = svm_read_problem(filename)
    print('Testing model...')
    svm_predict(y, x, model)
    pass
 
 
def load_model(filename=GLOBAL_MODEL_FILENAME):
    """Loads model from file."""
    with nooutput():
        model = svm_load_model(filename)
    assert model is not None
    return model
 
 
def save_model(model, filename=GLOBAL_MODEL_FILENAME):
    """Saves model to file."""
    svm_save_model(filename, model)
    pass
 
 
def main():
    """Entry point."""
    try:
        model = load_model()
    except:
        print("Model not found, training required.")
        model = train()
        save_model(model)
    else:
        print("Model loaded.")
    test(model)
    pass
 
if __name__ == '__main__':
    main()
else:
    pass
Жду Ваших вопросов.
Вложения
Тип файла: zip files.zip (999.5 Кб, 89 просмотров)
0
40 / 37 / 15
Регистрация: 25.10.2012
Сообщений: 112
20.08.2014, 21:53
UPD: тестовая выборка не нужна, достаточно файла test.dat.
0
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 17
22.08.2014, 10:11  [ТС]
xanderfomin, вроде чуточку понял.
Мне вот надо находить и распознавать порядка 40 разных объектов(как пример мне даны ярлыки на одежде , и все это с вэб-камеры(хотя это не так важно, просто захват кадра) с выводом какой-либо информации(в моем случае расшифровки) В итоге нужны будут порядка 40 таких кодов? С разными входными данными.
И как использовать файл "model"?(надеюсь я верно понял, что в нем хранится информация об искомом объекте?)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.08.2014, 10:11
Помогаю со студенческими работами здесь

Разработать класс, описывающий некоторый объект из заданной предметной области
Задание: Сведения о водных ресурсах. Класс должен содержать: строку документации; не менее 6 атрибутов (переменных); не...

В некоторый момент программы нужно узнать, к какому классу принадлежит объект
В некоторый момент программы мне нужно узнать, к какому классу принадлежит объект. Вот допустим, у меня есть объект Object. И 2 потомка:...

Как сравнить некоторый объект вектора тип данных которого является структурой ?
Сама структура struct coordinate { int h; int w; }; Вектор этой структуры vector <coordinate> poi; Некоторое...

Выделить объект мышкой на изображении. EMGU
У меня есть изображение яблока. Я хочу выделить мышкой нужные мне пиксели. То есть, например, у меня есть яблоко, на котором есть порченные...

Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект?
Собственно назрел такой вопрос: Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект? ...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru