Форум сайта python.su
Задача:
В видео потоке выделить лица людей и идентифицировать их по базе образцов. При чем неизвестные лица не должны приниматься за свои.
Первая часть решается просто: OpenCV HaarDetectObjects,
А вот идентификацию как сделать?
В этом проекте используется алгоритм SVM, что значит такого понятия как “неизвестные” в нем нет. Любое лицо идентифицируется как одно из образцов.
Нейронные сети? Какие использовать?
Офлайн
sp3В такой постановке задача скорее всего неразрешима, как впрочем и безошибочная идентификация своих лиц.
неизвестные лица не должны приниматься за свои
Офлайн
doza_andДенег просят :(
см например http://www.dissercat.com/content/razrabotka-algoritmov-identifikatsii-sostoyaniya-reaktornoi-ustanovki-vver-1000-s-ispolzovan
Офлайн
Я могу у автора диссер взять. Но вы определитесь. Тут можно пробовать собрать все из кирпичиков, особо не заморачиваясь, или сделать все как надо при этом вгрызаясь в гранит науки. Диссер имеет смысл брать если вы идете по второму пути.
Офлайн
Скорее первый вариант. Об науку я же пару зубов сломал, теперь нет желания и времени это продолжать :)
Проект больше фановый, чем научный. Если из 10 образцов 6 определится правильно, то это будет отлично.
ps. Диссертация вряд ли мне поможет, я скорее всего залипну на первой странице.
Отредактировано sp3 (Окт. 22, 2012 22:34:31)
Офлайн
sp3Оки я спрошу человека который сейчас делает проект оценка состояния оператора - это детектирование лица и по параметрам изображения оценивает состояние человека. Если он будет не против кину в личку его email. Вместе обычно веселее такие штуки делать.
Диссертация вряд ли мне поможет
Офлайн
Было бы не плохо.
Офлайн
SVM там скорее используют для отделения лиц и не лиц, а не для разделения самих лиц, хотя интересно как SVM будет работать для кол-во классов = кол-во человек.
Обычно используют PCA и евклидову метрику, но всё равно там получается что надо выбирать порог.
Отредактировано mrgloom (Март 26, 2013 08:33:28)
Офлайн
Приветствую всех ГУРУ и тех кому не безразлична данная тема.
Пытаюсь сделать трекер лица Python+OpenCV –> Arduino+Servo
Для Ардуино написал скетч который по СОМ порту принимает команду в формате X:Y (0:0 , 180:180 , 23:56 и т.д.)
#include <Servo.h>
Servo servo; // объект серво для 2х моторов
void setup() {
Serial.begin(9600); // открыть порт для связи
servo.attach(7, 400, 2400);
servo.attach(8, 400, 2400);
servo.write(90); //выводим серво в центр
servo.write(90); //выводим серво в центр
}
void loop() { // Основной цикл
if (Serial.available() > 0) { // если что то прислали
String bufString = Serial.readString(); // читаем как строку
byte dividerIndex = bufString.indexOf(':'); // ищем индекс разделителя
String buf_1 = bufString.substring(0, dividerIndex); // создаём строку с первым числом
String buf_2 = bufString.substring(dividerIndex + 1); // создаём строку со вторым числом
int val_1 = buf_1.toInt(); // преобразуем угол горизонталм
int val_2 = buf_2.toInt(); // преобразуем угол вертикали
servo.write(val_1); // поворот по X
servo.write(val_2); // поворот по Y
delay(100);
}
}
Написал на Python проверочный код и все повороты 100% отрабатывают но с какой то задержкой…
import time
import serial
# Configure the COM port
port = “COM8” # Replace with the appropriate COM port name
baudrate = 9600
# Open the COM port
ser = serial.Serial(port, baudrate=baudrate)
print(“Serial connection established.”)
try:
# Send commands to the Arduino
while True:
command = input(“Enter a command ('0:0', ‘180:180’): ”)
ser.write(command.encode())
except KeyboardInterrupt:
pass
finally:
# Close the serial connection
if ser.is_open:
command = ‘0:0’ # zero position
ser.write(command.encode())
ser.close()
print(“Serial connection closed.”)
А вот код на Python который через OpenCV определяет центр лица и смещения по X Y отправляет через СОМ порт на Arduino в формате как в тестовом коде…..
import numpy as np
import cv2
import serial
port = “COM8” # Replace with the appropriate COM port name
baudrate = 9600
# Open the COM port
arduino = serial.Serial(port, baudrate=baudrate)
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + ‘haarcascade_frontalface_default.xml’)
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + ‘haarcascade_eye.xml’)
capture = cv2.VideoCapture(0,cv2.CAP_DSHOW)
#capture.set(cv2.CAP_PROP_FRAME_WIDTH, 1024)
#capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
Tim=0
xi = int(capture.get(3))
cxi = int(xi/2)
yi = int(capture.get(4))
cyi = int(yi/2)
while True:
ret, frame = capture.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
eyes = eye_cascade.detectMultiScale(gray, 1.3, 5)
cv2.line(frame, (cxi,0),(cxi,yi),(120,120,120),1)
cv2.line(frame, (0,cyi),(xi,cyi),(120,120,120),1)
ct = ‘'
for (x, y, w, h) in faces:
frame = cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 255), 2)
cx=int(x+w/2)
cy=int(y+h/2)
dx=int(90+cxi-cx)
dy=int(90+cyi-cy)
ct=str(dx)+’:'+str(dy) # Send to COM port
cv2.circle(frame, (cx,cy), 5, (0, 0, 255) , -1) #-1
cv2.line(frame, (cxi,cyi), (cx,cy),(0, 0, 255), 3)
cv2.putText(frame, ct, (0, 20), cv2.FONT_HERSHEY_DUPLEX, 0.9, (0, 0, 250), 1)
# Send commands to the Arduino
# ser.write(f“{angle}n”.encode())
command = ct #input('Enter a command (e.g., ‘ON’, ‘OFF’): ‘)
arduino.write(command.encode())
#print(command)
cv2.imshow(’From Camera', frame)
k = cv2.waitKey(30) & 0xFF
if k == 27:
if arduino.is_open:
command = ‘0:0’
arduino.write(command.encode())
arduino.close()
print(“Serial connection closed.”)
break
capture.release()
cv2.destroyAllWindows()
Видео отображает, смещения вычисляются…
Но Servo на Arduino не отрабатывает практически НИ КАК…
Бывают иногда какието дергания Servo , Но это не то что я хотел (отслеживать движение лица и поворачивать камеру)
Подскажите , где у меня ошибка и куда копать ???
Заранее благодарю за помощь…
Офлайн