-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathrecord_to_head.rb
More file actions
156 lines (132 loc) · 4.1 KB
/
Copy pathrecord_to_head.rb
File metadata and controls
156 lines (132 loc) · 4.1 KB
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
require 'set'
require 'rmagick'
require 'fileutils'
require_relative 'record'
require_relative 'transform_old'
require 'optparse'
require 'parallel'
options = {}
OptionParser.new do |opts|
opts.banner = 'Usage: example.rb [options]'
opts.on('-s', '--source DIRNAME', 'Image Directory') do |v|
options[:source] = v
end
opts.on('-r', '--record FILENAME', 'record file') do |v|
options[:record] = v
end
opts.on('-n', '--node FILENAME', 'head node list file') do |v|
options[:node] = v
end
opts.on('--corenode [FILENAME]', 'core head node list file') do |v|
options[:corenode] = v
end
opts.on('-t', '--transform FILENAME', 'transform file') do |v|
options[:transform] = v
end
opts.on('--anchor-transform [FILENAME]', 'anchor transform file') do |v|
options[:anchor] = v
end
opts.on('-o', '--output FILENAME', 'output file') do |v|
options[:output] = v
end
opts.on('--gfilter FILTER', String, 'group filtering strategy') do |v|
options[:gfilter] = v # options are: bywords, complex, strict
end
opts.on('--group_threshold INTEGER', Integer, 'assessing group by number of visual words') do |v|
options[:group_threshold] = v
end
opts.on('--margin INTEGER', Integer, 'rect margins when grouping, 1=0.1*width or height') do |v|
options[:margin] = v
end
opts.on('--bias', 'torso bias applied or not') do
options[:bias] = true
end
opts.on('-h', '--help', 'Prints this help') do
puts opts
exit
end
end.parse!
src = options[:source]
lcdat = options[:record]
headdat = options[:node]
transfn = options[:transform]
exportfn = options[:output]
table = LCTransformTable.loadMap(transfn, 1006) # hard coded cluster number, should be changed later
if options.key?(:anchor)
puts 'anchor table provided '
anchor_table = LCTransformTable.loadMap(options[:anchor], 1006) # hard coded cluster number, should be changed later
else
anchor_table = table
end
head = IO.readlines(headdat).map(&:to_i).to_set
if options.key?(:corenode)
puts 'core nodes defined'
corehead = IO.readlines(options[:corenode]).map(&:to_i).to_set
end
if options.key?(:margin)
margin = options[:margin].to_f / 10
puts "rect margin #{margin} specified"
else
margin = 0
end
rec_list = Record.seperate_records(src, IO.foreach(lcdat), Record.parsers[:origin])
pred_list = Parallel.map(rec_list) do |r|
[!r.rects.nil? &&
begin
r.pick_good_set head
r.group_rects table, anchor_table, margin
!r.groups.values.to_set.empty?
end, r]
end.select { |criteria, _r| criteria }.map { |_c, r| r }
lcrecords = Hash[pred_list.map { |r| [r.filename, r] }]
puts "there are #{lcrecords.length} records"
puts 'torso bias applied' if options.key?(:bias)
if options.key?(:group_threshold)
gpt = options[:group_threshold]
else
puts 'group threshold missing'
exit
end
File.open(exportfn, 'w') do |f|
res = Parallel.map(lcrecords) do |k, v|
# group_set = v.groups.values.to_set.select{|y|y.rects.length>1}
if options.key?(:gfilter) # bywords > gpt or > gpt-1 while have a corenode in it.
case options[:gfilter]
when 'complex'
group_set = v.groups.values.to_set.select do |y|
ns = y.rects.map(&:type).to_set
nsc = ns & corehead
ns.length > gpt || ns.length > gpt - 1 && !nsc.empty?
end
when 'bywords'
group_set = v.groups.values.to_set.select do |y|
y.rects.map(&:type).to_set.length > gpt
end
when 'byrects'
group_set = v.groups.values.to_set.select do |y|
y.rects.length > gpt
end
else
puts 'filter not found'
exit
end
else # default, by number of rects in the group
group_set = v.groups.values.to_set.select do |y|
y.rects.length > gpt
end
end
[k, group_set]
end
res.each do |k, group_set|
f.puts(k) unless group_set.empty?
group_set.each do |g|
g.aggregate
g.aggregated_rect.type = g.rects.map(&:type)
if options.key?(:bias)
g.aggregated_rect.shift!(0, -0.5) # group bias
end
# f.puts g.aggregated_rect.to_short_s
f.puts g.aggregated_rect.to_s
end
end
end