-----------------------------------------------------------------------
-- An example of Actor Prolog program. --
-- (c) 2014 IRE RAS Alexei A. Morozov --
-----------------------------------------------------------------------
import .. from "morozov/Java2D";
import .. from "morozov/Vision";
-----------------------------------------------------------------------
class 'Main' (specialized 'Alpha'):
--
constant:
--
data_directory = "data";
target_directory = "Fight_RunAway1";
--
-- Warning: This matrix corresponds to the CAVIAR data set,
-- clips from INRIA (1st Set) only!
--
inverse_transformation_matrix = [
[0.3945,0.0468,0.0168],
[0.0996,-0.1625,0.0056],
[-34.0116,28.5636,1.0000]];
--
sampling_rate = 25.0;
--
stage_one = (('ImagePreprocessor',
data_directory,
target_directory,
sampling_rate,
low_level_analyzer,
stage_two));
stage_two = (('ImageAnalyser',
low_level_analyzer,
sampling_rate));
--
internal:
--
low_level_analyzer = ('ImageSubtractor',
extract_blobs= 'yes',
track_blobs= 'yes',
minimal_training_interval= 7,
maximal_training_interval= -1,
use_grayscale_colors= 'yes',
apply_gaussian_filtering_to_background= 'yes',
background_gaussian_filter_radius= 1,
apply_median_filtering_to_background= 'yes',
background_median_filter_threshold= 3,
background_standard_deviation_factor= 1.2,
horizontal_blob_border= 3,
vertical_blob_border= 3,
minimal_blob_intersection_area= 1,
minimal_blob_size= 10,
minimal_track_duration= 5,
maximal_blob_invisibility_interval= 3,
maximal_track_retention_interval= 4500,
inverse_transformation_matrix,
sampling_rate,
apply_median_filtering_to_velocity= 'yes',
velocity_median_filter_halfwidth= 3,
refuse_slow_tracks= 'yes',
fuzzy_velocity_threshold= 0.3,
fuzzy_distance_threshold= 40.0,
fuzzy_threshold_border= 0.50,
synthesized_image_transparency= 64,
make_rectangular_blobs_in_synthesized_image= 'no');
--
[
]
-----------------------------------------------------------------------
class 'ImagePreprocessor' (specialized 'Timer'):
--
constant:
--
data_directory;
target_directory;
sampling_rate;
--
low_level_analyzer;
stage_two;
--
internal:
--
subtractor = ('SynchronizedImageSubtractor',
image_subtractor= low_level_analyzer);
--
text = ('Text');
image = ('BufferedImage');
state = ('ProgramState');
--
[
goal:-!,
Time0== ?milliseconds(),
state ? set_beginning_time(Time0),
set_period(1/sampling_rate,0),
activate.
--
tick:-
T2== ?milliseconds(),
state ? get_beginning_time(T1),
Delta== (T2 - T1) / 1000.0 * sampling_rate,
N== ?convert_to_integer(?round(Delta)),!,
load_figure(N,T2).
--
load_figure(N2,_):-
state ? get_current_frame(N1),
N1 == N2,!.
load_figure(N,_):-
state ? set_current_frame(N),
ShortFileName== text?format("%03d",N) + ".jpg",
ImageToBeLoaded==
"jar:" + data_directory + "/" +
target_directory + "_jpg" + "/JPEGS/" +
target_directory +
ShortFileName,
image ? does_exist(ImageToBeLoaded),!,
image ? load(ImageToBeLoaded),
subtractor ? subtract(N,image),
stage_two [<<] draw_scene().
load_figure(_,T2):-
state ? set_beginning_time(T2),
subtractor ? reset_results.
]
-----------------------------------------------------------------------
class 'ImageAnalyser' (specialized 'Alpha'):
--
constant:
--
sampling_rate;
--
low_level_analyzer;
--
internal:
--
subtractor = ('SynchronizedImageSubtractor',
image_subtractor= low_level_analyzer);
--
constant:
--
walking_speed_threshold_value = 0.5;
walking_speed_threshold_halfwidth = 0.5;
running_speed_threshold_value = 1.0;
running_speed_threshold_halfwidth = 0.5;
movement_duration_threshold_value = 0.75;
movement_duration_threshold_halfwidth = 0.5;
--
velocity_bound_1 = 0.5;
velocity_bound_2 = 0.75;
velocity_bound_3 = 1.0;
velocity_bound_4 = 1.25;
velocity_bound_5 = 1.5;
velocity_bound_6 = 2.0;
velocity_bound_7 = 2.5;
velocity_bound_8 = 3.0;
--
velocity_color_1 = 'Violet';
velocity_color_2 = 'Magenta';
velocity_color_3 = 'Cyan';
velocity_color_4 = 'Emerald';
velocity_color_5 = 'Lime';
velocity_color_6 = 'Yellow';
velocity_color_7 = 'Orange';
velocity_color_8 = 'Pink';
velocity_color_9 = 'Red';
--
maximal_depth_of_search = 15;
--
circle_radius = 0.005;
--
internal:
--
graphic_window = ('Canvas2D',
y= 0,
height= 22.3);
prompt_window = ('Report',
y= 22.3,
height= 2.7,
font_size= 14,
font_style= 'bold');
text = ('Text');
image = ('BufferedImage');
timer = ('Timer');
--
[
goal:-!,
timer ? set_priority('MIN_PRIORITY'),
graphic_window ? show,
prompt_window ? write(
"The project is supported by RFBR, Russia, "
"RFBR-DST 13-07-92694, "
"and Govt. of India, DST-RFBR P-159.\n",
"The data are coming from the EC Funded CAVIAR "
"project / IST 2001 37540 "
"(https://homepages.inf.ed.ac.uk/rbf/CAVIAR/).").
--
draw_scene:-
subtractor ? commit,
subtractor ? get_recent_frame_number(FrameN),
graphic_window ? suspend_redrawing,
graphic_window ? clear,
draw_target_image,
draw_target_objects(FrameN),
report_time(FrameN),
graphic_window ? draw_now.
--
draw_target_image:-
subtractor ? get_recent_image(image),
graphic_window ? draw_image(image,0,0,1,1).
--
draw_target_objects(FrameN):-
subtractor ? get_connected_graphs(Graphs),
image ? get_size(IW,IH),
-- draw_legend,
draw_graphs(IW,IH,Graphs,1,'method_two',FrameN).
--
draw_graphs(IW,IH,[Graph|Rest],N,AnalysisMethod,FrameN):-
do_analyse_graph(AnalysisMethod),
is_a_kind_of_a_lam(
AnalysisMethod,Graph,1,Graph,_,_,_,_,_,_),!,
draw_graph(IW,IH,Graph,Graph,'yes',AnalysisMethod,N,FrameN),
graphic_window ? set_font({size:48,weight:'WEIGHT_BOLD'}),
graphic_window ? set_pen({color:'Red'}),
graphic_window ? set_text_alignment('CENTER','CENTER'),
graphic_window ? draw_text(0.5,0.5,"Attention!"),
draw_graphs(IW,IH,Rest,N+1,AnalysisMethod,FrameN).
draw_graphs(IW,IH,[Graph|Rest],N,AnalysisMethod,FrameN):-!,
draw_graph(IW,IH,Graph,Graph,'no',AnalysisMethod,N,FrameN),
draw_graphs(IW,IH,Rest,N+1,AnalysisMethod,FrameN).
draw_graphs(_,_,_,_,_,_).
--
do_analyse_graph('off'):-!,
fail.
do_analyse_graph(_).
--
is_a_kind_of_a_lam(
'method_one',
[Edge|_],EN,Graph,
WalkingPerson,N1,Edge,EN,RunningPerson,N3):-
Edge == {inputs:Origins,outputs:Branches|_},
Branches == [_,_|_],
contains_a_walking_person(
Origins,Graph,[],WalkingPerson,_,_,0,N1,0),
contains_a_running_person(
Branches,Graph,[],RunningPerson,_,_,0,N3,0),!.
is_a_kind_of_a_lam(
'method_two',
[ForkEdge|_],EN,Graph,
JoiningEdge,N1,ForkEdge,EN,RunningPerson,N3):-
ForkEdge == {inputs:Origins,outputs:Branches|_},
Branches == [_,_|_],
contains_a_running_person(
Branches,Graph,[],RunningPerson,_,_,0,N3,0),
is_a_meeting(
Origins,Graph,[],ForkEdge,EN,JoiningEdge,N1,0),!.
is_a_kind_of_a_lam(
AnalysisMethod,
[_|Rest],EN,Graph,
Person1,N1,CommonEdge,N2,Person2,N3):-
is_a_kind_of_a_lam(
AnalysisMethod,
Rest,EN+1,Graph,
Person1,N1,CommonEdge,N2,Person2,N3).
--
contains_a_running_person([N1|_],Graph,Stack,Person,M1,M2,_,N2,D):-
is_not_element(N1,Stack),
get_edge(N1,Graph,Edge),
is_a_running_person(
Edge,Graph,[N1|Stack],Person,M1,M2,N1,N2,D),!.
contains_a_running_person([_|Rest],Graph,Stack,Person,M1,M2,N1,N2,D):-
D <= maximal_depth_of_search,
contains_a_running_person(
Rest,Graph,Stack,Person,M1,M2,N1,N2,D+1).
--
is_a_running_person(Edge,_,_,Edge,M1,M2,N,N,_):-
Edge == {
mean_velocity:Velocity,
frame1:Beginning,
frame2:End|_},
M1== ?fuzzy_metrics(
Velocity,
running_speed_threshold_value,
running_speed_threshold_halfwidth),
Duration== (End - Beginning) / sampling_rate,
M2== ?fuzzy_metrics(
Duration,
movement_duration_threshold_value,
movement_duration_threshold_halfwidth),
M1 * M2 >= 0.5,!.
is_a_running_person(Edge,Graph,Stack,Person,M1,M2,N1,N2,D):-
Edge == {outputs:Branches|_},
D <= maximal_depth_of_search,
contains_a_running_person(
Branches,Graph,Stack,Person,M1,M2,N1,N2,D+1).
--
contains_a_walking_person([N1|_],Graph,Stack,Person,M1,M2,_,N2,D):-
is_not_element(N1,Stack),
get_edge(N1,Graph,Edge),
is_a_walking_person(
Edge,Graph,[N1|Stack],Person,M1,M2,N1,N2,D),!.
contains_a_walking_person([_|Rest],Graph,Stack,Person,M1,M2,N1,N2,D):-
D <= maximal_depth_of_search,
contains_a_walking_person(
Rest,Graph,Stack,Person,M1,M2,N1,N2,D+1).
--
is_a_walking_person(Edge,_,_,Edge,M1,M2,N,N,_):-
Edge == {
mean_velocity:Velocity,
frame1:Beginning,
frame2:End|_},
M1== 1 - ?fuzzy_metrics(
Velocity,
walking_speed_threshold_value,
walking_speed_threshold_halfwidth),
Duration== (End - Beginning) / sampling_rate,
M2== ?fuzzy_metrics(
Duration,
movement_duration_threshold_value,
movement_duration_threshold_halfwidth),
M1 * M2 >= 0.5,!.
is_a_walking_person(Edge,Graph,Stack,Person,M1,M2,N1,N2,D):-
Edge == {inputs:Origins|_},
D <= maximal_depth_of_search,
contains_a_walking_person(
Origins,Graph,Stack,Person,M1,M2,N1,N2,D+1).
--
is_a_meeting(Origins,_,_,JoiningEdge,N0,JoiningEdge,N0,_):-
Origins == [_,_|_],!.
is_a_meeting([N1|_],Graph,Stack,_,_,JoiningEdge,N2,D):-
D <= maximal_depth_of_search,
is_not_element(N1,Stack),
get_edge(N1,Graph,Edge),
Edge == {inputs:Origins|_},
is_a_meeting(
Origins,Graph,[N1|Stack],Edge,N1,JoiningEdge,N2,D+1).
--
is_not_element(N1,[N2|Rest]):-
N1 <> N2,
is_not_element(N1,Rest).
is_not_element(_,[]).
--
fuzzy_metrics(X,Threshold,Halfwidth) = 1.0 :-
X >= Threshold + Halfwidth,!.
fuzzy_metrics(X,Threshold,Halfwidth) = 0.0 :-
X <= Threshold - Halfwidth,!.
fuzzy_metrics(X,Threshold,Halfwidth) = Value :-
Value== (X-Threshold+Halfwidth) * (1 / (2*Halfwidth)).
--
draw_graph(IW,IH,[Edge|Rest],Graph,IsALam,AnalyseGraph,N,FrameN):-!,
draw_edge(IW,IH,Edge,Graph,IsALam,AnalyseGraph,N,FrameN),
draw_graph(IW,IH,Rest,Graph,IsALam,AnalyseGraph,N,FrameN).
draw_graph(_,_,_,_,_,_,_,_).
--
draw_edge( IW,IH,
{ x1:X1a,y1:Y1a,x2:X2a,y2:Y2a,
inputs:Origins,
outputs:Branches,
coordinates:TrackOfBlobs,
mean_velocity:Velocity|_},
Graph,IsALam,AnalyseGraphs,N,FrameN):-
X1r== X1a / IW,
Y1r== Y1a / IH,
X2r== X2a / IW,
Y2r== Y2a / IH,
graphic_window ? set_pen({color:'Blue',lineWidth:1}),
draw_origins(X1a,Y1a,IW,IH,Origins,Graph),
draw_track_of_blobs(IW,IH,TrackOfBlobs,IsALam,Velocity),
draw_rectangle(IsALam,Branches,TrackOfBlobs,IW,IH,FrameN),
graphic_window ? set_brush('on'),
graphic_window ? set_pen({color:'Green',lineWidth:1}),
-- graphic_window ? draw_line(X1r,Y1r,X2r,Y2r),
draw_circle(X1r,Y1r),
draw_circle(X2r,Y2r),
draw_graph_identifier(AnalyseGraphs,X1r,Y1r,X2r,Y2r,N),
fail.
draw_edge(_,_,_,_,_,_,_,_).
--
draw_circle(X0,Y0):-
X1== X0 - circle_radius,
Y1== Y0 - circle_radius,
Width== circle_radius * 2,
Height== circle_radius * 2,
graphic_window ? draw_ellipse(X1,Y1,Width,Height).
--
draw_graph_identifier('off',X1,Y1,X2,Y2,Id):-!,
Text== text?format("%d",Id),
graphic_window ? set_font({size:18}),
graphic_window ? set_text_alignment('CENTER','CENTER'),
graphic_window ? draw_text((X1+X2)/2,(Y1+Y2)/2,Text).
draw_graph_identifier(_,_,_,_,_,_).
--
draw_origins(Sx,Sy,IW,IH,[Origin|Rest],Graph):-!,
draw_origin(Sx,Sy,IW,IH,Origin,Graph),
draw_origins(Sx,Sy,IW,IH,Rest,Graph).
draw_origins(_,_,_,_,_,_).
--
draw_origin(SxA,SyA,IW,IH,N,Graph):-
get_edge(N,Graph,Edge),
Edge == {x2:Nx2a,y2:Ny2a|_},!,
draw_origin_arrow(SxA,SyA,Nx2a,Ny2a,IW,IH).
draw_origin(_,_,_,_,_,_).
--
draw_origin_arrow(X,Y,X,Y,_,_):-!.
draw_origin_arrow(SxA,SyA,Nx2a,Ny2a,IW,IH):-
SxR== SxA / IW,
SyR== SyA / IH,
Nx2r== Nx2a / IW,
Ny2r== Ny2a / IH,
graphic_window ? draw_line(SxR,SyR,Nx2r,Ny2r).
--
get_edge(1,[Edge|_],Edge):-!.
get_edge(N,[_|Rest],Edge):-
N > 0,
get_edge(N-1,Rest,Edge).
--
draw_track_of_blobs(IW,IH,[Blob|Rest],IsALam,Velocity):-
Blob== {x:Xa,y:Ya|_},!,
Xr== Xa / IW,
Yr== Ya / IH,
draw_track_of_blobs(IW,IH,Xr,Yr,Rest,IsALam,Velocity).
draw_track_of_blobs(_,_,_,_,_).
--
draw_track_of_blobs(IW,IH,X1,Y1,[Blob|Rest],IsALam,_/*Velocity*/):-
Blob== {x:Xa,y:Ya,velocity:Velocity|_},!,
X2== Xa / IW,
Y2== Ya / IH,
select_line_color(IsALam,Velocity,Color,LW),
graphic_window ? set_pen({color:Color,lineWidth:LW}),
graphic_window ? draw_line(X1,Y1,X2,Y2),
draw_track_of_blobs(IW,IH,X2,Y2,Rest,IsALam,Velocity).
draw_track_of_blobs(_,_,_,_,_,_,_).
--
select_line_color('yes',_,'Red',5):-!.
select_line_color(_,_,'Cyan',2):-!.
select_line_color(_,Velocity,Color,2):-
select_line_color(Velocity,Color).
--
select_line_color(Velocity,velocity_color_1):-
Velocity <= velocity_bound_1,!.
select_line_color(Velocity,velocity_color_2):-
Velocity > velocity_bound_1,
Velocity <= velocity_bound_2,!.
select_line_color(Velocity,velocity_color_3):-
Velocity > velocity_bound_2,
Velocity <= velocity_bound_3,!.
select_line_color(Velocity,velocity_color_4):-
Velocity > velocity_bound_3,
Velocity <= velocity_bound_4,!.
select_line_color(Velocity,velocity_color_5):-
Velocity > velocity_bound_4,
Velocity <= velocity_bound_5,!.
select_line_color(Velocity,velocity_color_6):-
Velocity > velocity_bound_5,
Velocity <= velocity_bound_6,!.
select_line_color(Velocity,velocity_color_7):-
Velocity > velocity_bound_6,
Velocity <= velocity_bound_7,!.
select_line_color(Velocity,velocity_color_8):-
Velocity > velocity_bound_7,
Velocity <= velocity_bound_8,!.
select_line_color(_,velocity_color_9).
--
draw_rectangle('yes',[],Track,IW,IH,FrameN):-!,
draw_colored_rectangle(Track,IW,IH,FrameN,'Yellow',3).
-- draw_rectangle('no',[],Track,IW,IH,FrameN):-!,
-- draw_colored_rectangle(Track,IW,IH,FrameN,'Cyan',1).
draw_rectangle(_,_,_,_,_,_).
--
draw_colored_rectangle([Blob],IW,IH,FrameN,Color,LW):-
Blob == {frame:FrameN,x:X0,y:Y0,width:W1,height:H1|_},!,
graphic_window ? set_brush('off'),
graphic_window ? set_pen({color:Color,lineWidth:LW}),
X2== (X0 - W1 / 2) / IW,
Y2== (Y0 - H1 / 2) / IH,
W2== W1 / IW,
H2== H1 / IH,
graphic_window ? draw_rectangle(X2,Y2,W2,H2).
draw_colored_rectangle([_|Rest],IW,IH,FrameN,Color,LW):-!,
draw_colored_rectangle(Rest,IW,IH,FrameN,Color,LW).
draw_colored_rectangle(_,_,_,_,_,_).
--
draw_legend:-
graphic_window ? set_brush('off'),
graphic_window ? set_font({size:12,weight:'WEIGHT_BOLD'}),
graphic_window ? set_text_alignment('LEFT','CENTER'),
X0r== 0.82,
Y0r== 0.05,
X1r== X0r + 0.02,
Y1r== Y0r + 0.03,
Y2r== Y1r + 0.03,
Y3r== Y2r + 0.03,
Y4r== Y3r + 0.03,
Y5r== Y4r + 0.03,
Y6r== Y5r + 0.03,
Y7r== Y6r + 0.03,
Y8r== Y7r + 0.03,
Y9r== Y8r + 0.03,
T1== text?format("Velocity <= %1.2f",velocity_bound_1),
T2== text?format("Velocity > %1.2f",velocity_bound_1),
T3== text?format("Velocity > %1.2f",velocity_bound_2),
T4== text?format("Velocity > %1.2f",velocity_bound_3),
T5== text?format("Velocity > %1.2f",velocity_bound_4),
T6== text?format("Velocity > %1.2f",velocity_bound_5),
T7== text?format("Velocity > %1.2f",velocity_bound_6),
T8== text?format("Velocity > %1.2f",velocity_bound_7),
T9== text?format("Velocity > %1.2f",velocity_bound_8),
graphic_window ? set_pen({color:velocity_color_1}),
graphic_window ? draw_text(X1r,Y1r,T1),
graphic_window ? set_pen({color:velocity_color_2}),
graphic_window ? draw_text(X1r,Y2r,T2),
graphic_window ? set_pen({color:velocity_color_3}),
graphic_window ? draw_text(X1r,Y3r,T3),
graphic_window ? set_pen({color:velocity_color_4}),
graphic_window ? draw_text(X1r,Y4r,T4),
graphic_window ? set_pen({color:velocity_color_5}),
graphic_window ? draw_text(X1r,Y5r,T5),
graphic_window ? set_pen({color:velocity_color_6}),
graphic_window ? draw_text(X1r,Y6r,T6),
graphic_window ? set_pen({color:velocity_color_7}),
graphic_window ? draw_text(X1r,Y7r,T7),
graphic_window ? set_pen({color:velocity_color_8}),
graphic_window ? draw_text(X1r,Y8r,T8),
graphic_window ? set_pen({color:velocity_color_9}),
graphic_window ? draw_text(X1r,Y9r,T9),
graphic_window ? set_pen({color:'Green',lineWidth:1}),
Wr== 0.17,
Hr== Y9r - Y0r + 0.025,
graphic_window ? draw_rectangle(X0r,Y0r,Wr,Hr).
--
report_time(_):-
graphic_window ? set_brush('Green'),
graphic_window ? set_font({size:18}),
graphic_window ? set_text_alignment('LEFT','TOP'),
fail.
report_time(FrameN):-
FrameN >= 0,!,
graphic_window ? draw_text(
0.02, 0.02,
text?format(
"Time: %3.2f [sec]; Frame: %s",
FrameN/sampling_rate,FrameN)).
report_time(_):-
graphic_window ? draw_text(
0.02, 0.02,
"Training... Please wait a minute...").
]
-----------------------------------------------------------------------
class 'ProgramState' (specialized 'Database'):
[
CLAUSES:
--
get_beginning_time(T):-
Item== ?match(beginning_time(_)),
Item == beginning_time(T),!.
--
set_beginning_time(T):-
retract_all(beginning_time(_)),
append(beginning_time(T)).
--
get_current_frame(N):-
Item== ?match(current_frame(_)),
Item == current_frame(N),!.
--
set_current_frame(N):-
retract_all(current_frame(_)),
append(current_frame(N)).
]
-----------------------------------------------------------------------
|