Lépcső- és ajtófelismerés videófelvételeken
Az áttekintett szakirodalom alapján az egyik lehetséges választott módszer folyamatábrája a következő:
A hatékonyabb gépi tanulás elősegítésére az eredeti RGB képen elvégzünk bizonyos előfeldolgozó műveleteket, előkészítve ezzel a szegmentálásra. Ezek egyszerű képfeldolgozó műveletek, szűrők. Fontos, hogy a képen található fölösleges információkat eldobjuk, ezzel is hatékonyabbá téve az algoritmusunkat.
A színes képet minden esetben szürkeárnyalatossá alakítjuk, mivel a képpontok színe nem hordoz számunkra lényegi információt. A szürkeárnyalatos képen alkalmaznunk kell továbbá hisztogram-széthúzást is. Az egy ponton átmenő egyeneseket legegyszerűbben a Hough térben a trigonometrikus görbék metszéspontjából nyerhetjük ki, ami tulajdonképpen nem is egy pont, hanem egy adott sugarú kör.
Az általunk végzett előfeldolgozás algoritmusa:
I = rgb2gray(imread('door.6.jpg'));
rotI = imrotate(I,0,'crop');
% binráis kép előállítása
BW = edge(rotI,'prewitt');
st1 = strel('diamond',5);
st2 = strel('diamond',3);
BW = imdilate(BW, st1);
BW = imerode(BW, st2);
figure;
imshow(BW);
figure;
%%
% Hough-transzformáció elvégzése a bináris képen
[H,T,R] = hough(BW);
imshow(H,[],'XData',T,'YData',R,...
'InitialMagnification','fit');
xlabel('\theta'), ylabel('\rho');
axis on, axis normal, hold on;
%%
% sarokpontok detektálása a kép Hough-transzformáltján
P = houghpeaks(H,4,'threshold',ceil(0.3*max(H(:))));
x = T(P(:,2)); y = R(P(:,1));
plot(x,y,'s','color','white');
%%
% Élek detektálása és kirajzolása
lines = houghlines(BW,T,R,P,'FillGap',1000,'MinLength',1100);
figure, imshow(rotI), hold on
max_len = 0;
for k = 1:length(lines)
xy = [lines(k).point1; lines(k).point2];
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');
len = norm(lines(k).point1 - lines(k).point2);
if ( len > max_len)
max_len = len;
xy_long = xy;
end
end
Az algoritmus végrehajtva tesztképeken az alábbi ábrán látható:
Az előfeldolgozott képet már átadhatjuk egy előre betanított neurális hálónak.
Megoldásunk egyik alapját az Object Detection Using Deep Learning MATLAB-os példa adta [13]. Ebben be van mutatva, hogyan lehet egy konvolúciós neurális hálót megtanítani stop tábla felismerésére, ezt próbáltuk úgy átalakítani, hogy ajtó és lépcső detektálására is alkalmas legyen.
A tanításhoz R-CNN-t (Regions with Convolutional Neural Network) használ, amivel meg tudja tanulni, hogy a kép egyes régióin milyen objektum van. Ehhez olyan képek szükségesek, melyeken előre bejelölték, hogy az adott régión milyen objektum szerepel.
A példa úgynevezett transfer learning módszert használ, amelynek lényege, hogy a neurális hálót egy sok képet tartalmazó adatbázison tanítják, majd ezt finomhangolják a kívánt objektum megtalálásához. Ezzel a módszerrel sokkal kevesebb tanítóképre van szükség, mintha nem lenne egy előre betanított hálónk. Az előre betanítás a CIFAR-10 képgyűjteménnyel történik [14]. Ezután saját képekkel tanítva lehet finomhangolni a hálót.
Esetünkben 20, ajtót tartalmazó képpel finomhangoltuk a hálót, mely képekhez megadtuk az ajtót befoglaló téglalapok pozícióját és méretét. A tesztelés során gyenge eredmények születtek, nem igazán sikerült megtalálnia a képen levő ajtókat. Ennek miértjére egyelőre még nem sikerült rájönnünk, de dolgozunk a probléma kiküszöbölésén.
A tanuló algoritmus alkalmazása az előfeldolgozott „door.jpg” képen:
clc
load('DoorsRcnn.mat','rcnn');
testImage = imread('door.jpg');
[bboxes, score, label] = detect(rcnn, testImage, 'MiniBatchSize', 32);
annotation = cell(size(label,1),1);
for i=1:size(label,1)
annotation{i} = sprintf('%s: (Confidence = %f)', label(i), score(i));
end
bbox = bboxes(:,:);
outputImage = insertObjectAnnotation(testImage, 'rectangle', bbox, annotation,
'LineWidth', 30,'FontSize', 72);
figure;
imshow(outputImage);
A neurális háló által elért eremények:
A lépcsők detektálásához nem szükséges teljes 3D rekonstrukciót készítenünk.
A legegyszerűbb módja a mélységi információ kinyerésének az optical flow alkalmazása, kihasználva, hogy több frameből álló videófelvételen kell detektálnunk a lépcsőket. Ennek lényege az egymást követő frameken történő pontmegfeleltetésen alapszik.