Commit 8559a22f authored by Sushil BHATTACHARJEE's avatar Sushil BHATTACHARJEE

code update; added example script

parent 9988d042
0, 283, 107, 500, 375, 330.62, 235.40, 437.58, 232.54
1, 292, 109, 520, 367, 334.61, 233.83, 436.75, 232.13
2, 283, 104, 512, 376, 329.54, 235.68, 436.84, 232.43
3, 284, 109, 499, 374, 330.47, 235.79, 436.46, 232.24
4, 281, 108, 497, 373, 330.09, 235.71, 436.66, 232.40
5, 283, 100, 510, 371, 329.64, 235.59, 436.94, 231.64
6, 287, 102, 519, 378, 330.88, 234.92, 437.30, 232.08
7, 279, 105, 500, 376, 330.70, 235.84, 437.60, 232.44
8, 285, 107, 508, 374, 329.97, 235.24, 437.23, 232.31
9, 282, 105, 501, 375, 329.31, 235.91, 436.97, 232.52
10, 290, 108, 512, 373, 330.55, 234.90, 436.83, 232.57
11, 281, 102, 504, 379, 330.83, 235.72, 438.06, 232.53
12, 278, 106, 498, 376, 331.35, 235.27, 437.81, 231.96
13, 278, 104, 501, 379, 330.75, 235.30, 438.48, 231.51
14, 284, 106, 504, 376, 330.70, 234.71, 437.98, 232.21
15, 283, 105, 502, 375, 330.68, 235.36, 437.02, 232.38
16, 288, 102, 517, 378, 330.70, 235.23, 437.32, 232.34
17, 281, 105, 499, 375, 330.97, 235.02, 438.15, 231.67
18, 283, 104, 505, 380, 331.14, 235.15, 437.72, 231.99
19, 283, 105, 505, 376, 332.25, 236.46, 437.40, 232.29
20, 283, 105, 500, 373, 332.27, 236.47, 437.33, 232.70
21, 292, 104, 515, 373, 332.19, 235.57, 437.55, 232.82
22, 281, 105, 499, 375, 331.53, 235.84, 438.90, 232.99
23, 286, 109, 502, 374, 331.09, 236.09, 438.55, 232.85
24, 281, 102, 504, 376, 330.62, 235.67, 438.13, 231.49
25, 278, 104, 501, 377, 330.74, 235.11, 437.57, 231.56
26, 283, 106, 501, 376, 330.56, 234.71, 438.14, 232.10
27, 286, 102, 508, 377, 330.56, 234.68, 437.65, 231.32
28, 286, 104, 508, 378, 331.22, 234.85, 438.08, 231.08
29, 281, 102, 507, 379, 331.45, 234.83, 438.94, 230.85
30, 281, 98, 510, 380, 331.54, 234.70, 439.48, 230.66
31, 285, 103, 503, 374, 331.22, 234.81, 441.71, 232.00
32, 283, 104, 503, 374, 331.39, 234.67, 439.82, 230.47
33, 282, 105, 505, 378, 332.56, 235.14, 440.82, 231.67
34, 282, 103, 507, 380, 332.86, 234.75, 440.81, 231.19
35, 286, 103, 508, 377, 332.49, 234.76, 439.94, 231.12
36, 283, 101, 511, 380, 332.06, 234.45, 439.63, 230.75
37, 286, 103, 508, 376, 332.15, 234.62, 439.91, 231.76
38, 289, 105, 505, 373, 332.26, 234.77, 439.79, 231.98
39, 284, 100, 512, 381, 332.67, 234.76, 439.93, 230.63
40, 290, 102, 518, 378, 332.92, 234.20, 440.21, 230.33
41, 284, 101, 510, 379, 332.33, 234.40, 440.49, 230.80
42, 286, 104, 507, 374, 331.13, 234.26, 438.62, 230.15
43, 280, 105, 501, 376, 330.96, 234.01, 438.67, 230.06
44, 282, 102, 504, 376, 331.59, 234.18, 438.91, 230.06
45, 281, 102, 507, 378, 331.89, 234.53, 439.76, 230.65
46, 282, 102, 504, 375, 331.75, 234.60, 438.71, 230.37
47, 277, 102, 499, 374, 330.81, 233.35, 438.17, 229.72
48, 281, 103, 504, 377, 331.47, 233.32, 438.86, 229.33
49, 284, 102, 506, 376, 331.35, 233.47, 439.52, 229.56
50, 282, 100, 505, 376, 331.34, 232.89, 439.23, 228.81
51, 280, 100, 506, 377, 331.80, 233.33, 439.18, 228.95
52, 284, 101, 506, 375, 331.31, 233.35, 439.00, 229.05
53, 280, 100, 504, 377, 331.44, 233.62, 439.12, 229.45
54, 285, 103, 506, 374, 332.13, 233.30, 440.20, 229.38
55, 282, 101, 508, 378, 332.65, 232.48, 440.17, 228.42
56, 284, 104, 505, 375, 332.34, 233.33, 439.93, 229.58
57, 284, 103, 506, 375, 332.16, 233.61, 439.57, 229.27
58, 283, 103, 505, 376, 332.32, 234.01, 440.63, 229.85
59, 281, 103, 507, 380, 332.60, 234.32, 440.83, 230.66
60, 280, 100, 509, 383, 333.15, 234.40, 441.21, 230.32
61, 288, 103, 511, 378, 332.18, 234.02, 439.92, 230.38
62, 288, 103, 511, 379, 332.26, 234.26, 440.05, 230.14
63, 284, 104, 507, 379, 332.73, 234.55, 440.96, 230.21
64, 284, 104, 507, 379, 332.73, 234.55, 440.96, 230.21
65, 287, 105, 509, 378, 331.90, 234.24, 440.04, 230.74
66, 291, 105, 516, 377, 331.55, 233.88, 438.97, 230.87
67, 286, 105, 509, 378, 331.80, 234.27, 439.18, 231.02
68, 291, 106, 516, 378, 331.64, 233.98, 438.98, 230.53
69, 294, 109, 511, 373, 331.22, 234.12, 438.57, 230.43
70, 283, 105, 502, 374, 331.46, 234.48, 439.19, 229.93
71, 284, 105, 506, 379, 332.08, 234.02, 440.07, 230.33
72, 280, 98, 514, 385, 332.43, 233.82, 439.56, 229.75
73, 278, 101, 508, 383, 332.16, 234.61, 440.67, 230.40
74, 279, 104, 507, 381, 332.41, 234.82, 440.26, 230.06
75, 278, 101, 509, 384, 332.78, 234.45, 440.90, 230.22
76, 281, 102, 509, 381, 333.03, 234.23, 441.39, 230.33
77, 283, 103, 507, 380, 332.42, 234.14, 440.92, 230.16
78, 283, 102, 511, 384, 333.30, 233.75, 440.71, 230.07
79, 286, 104, 509, 379, 332.65, 234.48, 441.37, 230.48
80, 284, 105, 506, 379, 333.44, 234.62, 442.29, 230.70
81, 281, 105, 504, 380, 333.25, 234.87, 442.09, 230.66
82, 287, 106, 509, 378, 332.44, 234.81, 441.20, 231.14
83, 291, 102, 519, 379, 332.68, 235.43, 440.00, 231.27
84, 288, 106, 509, 376, 333.92, 235.13, 441.70, 231.23
85, 288, 102, 520, 381, 333.74, 234.46, 442.11, 230.91
86, 277, 102, 506, 385, 333.62, 235.92, 441.69, 231.83
87, 279, 107, 501, 381, 333.01, 235.89, 440.19, 231.39
88, 279, 105, 505, 382, 332.29, 236.11, 440.12, 232.22
89, 285, 108, 501, 375, 333.43, 235.72, 441.83, 231.86
90, 287, 101, 517, 381, 334.12, 235.85, 441.43, 231.70
91, 277, 103, 506, 382, 333.67, 234.88, 441.51, 230.92
92, 282, 104, 508, 381, 333.10, 234.71, 441.14, 230.92
93, 282, 104, 509, 382, 333.47, 234.68, 441.90, 230.69
94, 287, 103, 516, 382, 334.72, 234.63, 443.94, 230.67
95, 285, 105, 508, 379, 334.65, 234.46, 442.31, 231.09
96, 287, 104, 512, 380, 333.70, 233.68, 441.33, 230.45
97, 289, 106, 510, 377, 334.18, 234.70, 442.05, 231.06
98, 289, 103, 515, 380, 334.30, 235.18, 443.32, 231.51
99, 278, 89, 531, 392, 333.53, 235.30, 441.89, 231.39
100, 283, 102, 511, 381, 332.87, 235.61, 441.77, 231.61
101, 274, 98, 508, 387, 334.27, 235.26, 442.38, 231.60
102, 291, 100, 509, 369, 334.16, 235.41, 442.79, 231.69
103, 285, 106, 508, 379, 334.40, 234.95, 442.68, 231.08
104, 292, 108, 513, 374, 333.61, 235.19, 442.32, 231.37
105, 292, 109, 513, 375, 334.61, 234.97, 443.08, 231.26
106, 280, 101, 508, 382, 334.25, 235.89, 441.91, 231.48
107, 293, 109, 512, 373, 334.10, 235.13, 442.97, 231.06
108, 298, 109, 510, 373, 333.81, 235.40, 442.41, 231.09
109, 285, 98, 519, 385, 333.67, 235.40, 442.04, 231.70
110, 286, 96, 538, 384, 335.81, 234.28, 441.38, 230.95
111, 288, 99, 537, 384, 335.14, 235.01, 441.20, 231.76
112, 278, 97, 513, 386, 333.38, 235.37, 443.04, 231.42
113, 291, 109, 508, 375, 334.45, 235.19, 443.25, 231.37
114, 287, 107, 504, 375, 334.42, 235.37, 444.04, 231.57
115, 294, 104, 522, 372, 334.23, 235.05, 443.11, 232.14
116, 281, 88, 546, 391, 335.70, 236.18, 441.54, 232.00
117, 285, 95, 522, 388, 333.39, 235.46, 442.39, 231.67
118, 291, 109, 507, 374, 334.52, 235.42, 443.73, 231.72
119, 292, 107, 507, 371, 334.86, 235.25, 443.58, 231.03
120, 294, 108, 511, 373, 334.51, 235.03, 443.81, 231.13
121, 268, 104, 494, 381, 334.16, 234.02, 441.63, 230.45
122, 284, 104, 505, 375, 333.46, 234.41, 441.81, 230.12
123, 281, 105, 503, 376, 332.77, 234.01, 441.94, 230.12
124, 283, 103, 506, 378, 332.67, 233.81, 442.29, 229.96
125, 285, 104, 507, 375, 333.63, 233.40, 442.29, 229.13
126, 284, 103, 506, 375, 333.88, 233.04, 442.28, 228.78
127, 284, 100, 508, 376, 333.30, 232.74, 442.43, 228.72
128, 283, 101, 507, 377, 332.88, 233.31, 442.05, 228.93
129, 287, 105, 506, 374, 333.81, 233.56, 442.43, 229.06
130, 286, 103, 509, 375, 333.88, 233.46, 442.00, 228.71
131, 280, 102, 506, 379, 333.14, 233.15, 442.20, 229.13
132, 285, 104, 508, 375, 334.32, 233.86, 442.59, 229.20
133, 290, 98, 513, 371, 334.23, 232.96, 442.09, 229.28
134, 281, 101, 506, 378, 334.47, 233.15, 442.27, 228.66
135, 281, 101, 505, 377, 334.79, 233.65, 443.28, 228.98
136, 278, 101, 507, 381, 334.93, 233.75, 443.71, 229.44
137, 283, 103, 506, 376, 334.32, 234.20, 442.42, 229.36
138, 282, 102, 506, 378, 334.06, 233.55, 442.18, 229.35
139, 280, 100, 508, 379, 334.56, 233.81, 442.62, 229.42
140, 282, 100, 510, 381, 335.76, 233.69, 444.04, 229.42
141, 283, 102, 510, 379, 335.25, 233.47, 443.86, 229.04
142, 286, 102, 509, 376, 334.03, 233.31, 442.87, 228.96
143, 281, 102, 505, 377, 334.32, 233.81, 442.56, 228.89
144, 283, 99, 511, 380, 335.13, 234.01, 443.02, 229.51
145, 284, 100, 512, 379, 335.00, 234.02, 443.37, 229.09
146, 283, 101, 508, 378, 334.58, 233.76, 443.21, 229.30
147, 281, 99, 509, 378, 334.54, 234.09, 442.80, 228.46
148, 281, 99, 511, 382, 335.59, 233.89, 444.02, 229.32
149, 281, 100, 509, 380, 334.51, 233.69, 443.07, 229.14
150, 291, 101, 515, 378, 334.20, 233.93, 443.49, 228.88
151, 282, 99, 510, 381, 335.40, 233.59, 444.68, 229.12
152, 281, 102, 505, 378, 334.48, 234.26, 442.63, 229.33
153, 281, 96, 514, 379, 334.40, 234.33, 443.27, 228.61
154, 279, 98, 512, 382, 335.58, 233.98, 443.99, 229.10
155, 284, 99, 512, 380, 336.00, 234.30, 444.30, 229.81
156, 282, 101, 510, 382, 335.31, 234.60, 443.87, 230.04
157, 283, 102, 508, 379, 335.52, 234.57, 444.02, 229.81
158, 286, 103, 509, 378, 336.44, 234.66, 445.23, 229.80
159, 285, 101, 512, 377, 336.25, 235.24, 444.43, 230.10
160, 282, 102, 509, 378, 335.68, 234.43, 445.17, 229.99
161, 282, 101, 508, 378, 336.25, 234.19, 444.53, 229.74
162, 283, 101, 511, 379, 335.97, 234.04, 445.75, 229.73
163, 278, 99, 510, 383, 335.77, 234.16, 444.67, 229.24
164, 281, 98, 511, 381, 335.70, 233.81, 444.28, 229.15
165, 291, 100, 520, 378, 335.91, 233.62, 445.09, 229.34
166, 288, 93, 530, 382, 336.46, 233.50, 445.10, 228.53
167, 295, 97, 524, 380, 336.68, 233.33, 445.43, 229.04
168, 284, 98, 513, 380, 336.05, 233.39, 445.72, 228.77
169, 288, 94, 528, 383, 336.27, 232.93, 444.79, 228.72
170, 286, 98, 517, 381, 336.97, 233.66, 445.57, 229.32
171, 289, 93, 529, 384, 336.71, 233.29, 445.48, 228.87
172, 287, 91, 528, 384, 336.12, 233.34, 445.04, 228.51
173, 285, 96, 519, 383, 336.56, 233.40, 445.40, 229.22
174, 291, 96, 525, 382, 337.03, 233.34, 445.93, 228.84
175, 287, 97, 519, 382, 337.54, 233.58, 446.36, 229.27
176, 280, 92, 520, 386, 336.63, 233.24, 445.94, 228.54
177, 284, 98, 515, 381, 336.80, 233.32, 445.88, 228.57
178, 284, 97, 514, 380, 337.09, 233.60, 446.28, 228.94
179, 283, 96, 517, 385, 337.74, 233.40, 447.29, 229.06
180, 277, 92, 517, 387, 337.07, 233.56, 446.05, 228.31
181, 283, 96, 517, 383, 337.25, 233.54, 446.38, 228.84
182, 284, 94, 519, 383, 337.49, 233.57, 446.59, 228.97
183, 280, 98, 514, 385, 337.74, 233.76, 447.16, 229.24
184, 284, 95, 518, 384, 337.91, 233.56, 446.81, 229.14
185, 285, 95, 519, 383, 337.96, 233.11, 446.81, 228.88
186, 285, 98, 515, 381, 337.30, 233.79, 446.75, 229.05
187, 287, 96, 520, 381, 337.64, 233.33, 446.95, 228.90
188, 285, 94, 519, 383, 337.90, 233.51, 446.99, 228.83
189, 285, 95, 519, 383, 337.39, 233.66, 446.89, 228.85
190, 287, 96, 519, 381, 337.38, 233.60, 446.88, 229.32
191, 279, 93, 519, 386, 337.79, 233.96, 446.68, 228.78
192, 289, 94, 530, 382, 336.77, 233.56, 445.88, 228.85
193, 285, 94, 519, 383, 337.74, 233.23, 446.80, 228.64
194, 282, 100, 513, 383, 339.24, 233.62, 448.73, 229.16
195, 294, 97, 526, 380, 339.03, 234.25, 448.39, 229.68
196, 284, 97, 517, 382, 338.77, 233.92, 448.02, 229.07
197, 287, 99, 516, 382, 338.55, 233.81, 447.62, 229.49
198, 287, 101, 515, 379, 337.59, 233.41, 447.21, 228.96
199, 286, 102, 512, 379, 337.57, 234.47, 447.02, 229.76
200, 288, 101, 514, 377, 338.35, 234.15, 448.00, 229.13
201, 302, 100, 526, 374, 338.20, 233.10, 448.23, 227.88
202, 291, 92, 532, 379, 336.52, 232.06, 446.78, 227.12
203, 292, 92, 534, 380, 336.58, 232.53, 446.19, 227.48
204, 297, 99, 522, 375, 336.96, 233.18, 446.60, 228.36
205, 287, 100, 514, 377, 337.51, 233.81, 446.55, 228.40
206, 287, 98, 516, 379, 336.71, 233.54, 445.86, 228.17
207, 295, 96, 526, 379, 336.55, 233.16, 446.12, 227.71
208, 287, 99, 515, 378, 336.68, 233.26, 445.91, 227.93
209, 287, 98, 517, 380, 335.93, 233.45, 444.88, 228.18
210, 284, 98, 514, 380, 335.22, 233.62, 444.24, 228.41
211, 293, 98, 524, 380, 335.93, 233.72, 445.22, 228.62
212, 284, 98, 514, 381, 336.22, 233.56, 445.02, 228.32
213, 284, 97, 515, 380, 335.45, 233.40, 444.38, 227.81
214, 288, 99, 516, 379, 335.42, 233.52, 444.63, 228.32
215, 283, 97, 517, 382, 335.61, 233.83, 445.47, 228.10
216, 291, 96, 526, 385, 336.21, 234.13, 446.08, 228.86
217, 294, 98, 523, 381, 335.75, 234.73, 445.18, 229.24
218, 282, 100, 515, 383, 335.26, 234.45, 445.12, 229.13
219, 293, 98, 523, 381, 334.63, 234.75, 444.11, 229.31
220, 287, 100, 516, 381, 335.19, 234.90, 444.76, 229.61
221, 284, 96, 520, 384, 336.24, 234.26, 445.58, 229.08
222, 284, 96, 519, 384, 336.14, 234.45, 445.27, 229.12
223, 285, 97, 520, 384, 335.72, 234.28, 444.58, 228.98
224, 286, 91, 527, 384, 335.23, 234.52, 444.81, 228.35
225, 282, 96, 519, 385, 335.34, 234.91, 444.89, 229.27
226, 290, 97, 525, 381, 335.25, 234.77, 444.68, 229.22
227, 285, 101, 513, 380, 335.49, 235.24, 444.87, 229.47
228, 278, 99, 513, 386, 336.16, 235.14, 445.82, 229.04
229, 277, 100, 512, 386, 336.98, 235.19, 446.54, 229.40
230, 281, 100, 515, 386, 336.94, 235.16, 446.24, 229.04
231, 281, 98, 516, 387, 336.80, 235.55, 445.96, 229.59
232, 288, 101, 516, 380, 336.23, 235.81, 445.85, 230.04
233, 286, 102, 514, 381, 336.12, 235.99, 445.60, 230.35
234, 290, 100, 522, 382, 335.83, 235.34, 445.02, 229.92
235, 283, 97, 518, 384, 336.15, 235.13, 445.43, 229.28
236, 284, 97, 518, 385, 336.43, 235.00, 445.80, 229.26
237, 288, 101, 516, 381, 337.01, 234.73, 446.14, 229.10
238, 284, 100, 515, 382, 336.29, 235.33, 445.24, 230.08
239, 284, 100, 516, 382, 335.95, 235.45, 444.44, 229.58
240, 288, 99, 519, 381, 337.80, 236.53, 445.87, 229.71
241, 289, 100, 519, 382, 338.46, 235.21, 444.86, 230.69
242, 287, 99, 518, 381, 337.96, 234.76, 447.51, 229.84
243, 286, 98, 521, 386, 337.58, 234.26, 447.05, 229.04
244, 283, 99, 514, 382, 337.59, 234.63, 446.79, 228.77
245, 297, 101, 522, 376, 337.30, 233.81, 447.51, 228.11
246, 295, 96, 528, 378, 337.11, 233.16, 446.71, 227.75
247, 292, 95, 521, 376, 336.54, 233.58, 445.85, 227.84
248, 296, 93, 534, 376, 337.19, 233.52, 446.36, 227.02
249, 295, 98, 524, 378, 337.02, 233.95, 446.39, 227.91
250, 286, 97, 519, 381, 337.00, 233.31, 446.20, 228.07
251, 284, 95, 521, 384, 336.50, 233.66, 445.59, 227.87
252, 298, 98, 526, 380, 337.12, 233.51, 446.90, 228.01
253, 299, 97, 529, 379, 337.36, 233.85, 447.40, 228.10
254, 295, 96, 530, 381, 337.35, 233.66, 447.18, 228.44
255, 287, 97, 521, 382, 337.38, 233.77, 446.19, 228.07
256, 288, 96, 522, 382, 336.90, 233.37, 446.18, 227.72
257, 299, 97, 528, 378, 336.65, 233.52, 446.74, 227.58
258, 291, 97, 523, 380, 337.71, 233.64, 447.50, 228.00
259, 292, 93, 529, 383, 337.59, 233.53, 447.63, 228.33
260, 285, 96, 521, 385, 336.88, 234.35, 446.32, 228.44
261, 284, 95, 520, 383, 336.20, 233.80, 445.83, 228.11
262, 288, 99, 516, 377, 336.89, 233.44, 446.96, 228.20
263, 299, 95, 536, 377, 338.63, 233.45, 447.55, 228.07
264, 287, 100, 516, 378, 337.86, 233.67, 447.26, 228.29
265, 287, 96, 522, 382, 337.24, 233.73, 446.84, 228.16
266, 285, 96, 519, 383, 337.47, 233.98, 446.70, 228.60
267, 297, 95, 533, 381, 338.52, 234.37, 447.65, 228.63
268, 297, 97, 527, 379, 338.31, 233.88, 448.10, 228.23
269, 288, 97, 519, 380, 337.31, 233.61, 446.64, 227.89
270, 290, 96, 522, 380, 336.97, 233.14, 446.85, 227.62
271, 290, 91, 530, 384, 336.93, 233.29, 446.37, 228.02
272, 288, 98, 518, 380, 337.09, 233.50, 446.54, 227.78
273, 288, 98, 520, 380, 337.49, 233.52, 447.02, 228.08
274, 295, 94, 533, 379, 337.55, 233.62, 447.57, 228.06
275, 297, 94, 531, 382, 337.18, 233.49, 446.70, 227.45
276, 287, 98, 516, 379, 336.13, 233.21, 445.36, 227.70
277, 289, 97, 519, 379, 336.29, 232.93, 445.55, 227.58
278, 296, 98, 526, 378, 336.87, 232.99, 446.29, 227.78
279, 300, 98, 529, 377, 337.72, 233.34, 447.67, 227.80
280, 300, 97, 528, 378, 338.07, 233.67, 447.46, 228.43
281, 285, 98, 519, 383, 336.79, 233.70, 446.93, 228.48
282, 284, 96, 519, 384, 336.15, 233.59, 445.54, 228.23
283, 287, 96, 521, 383, 337.14, 233.61, 446.82, 228.44
284, 297, 93, 535, 381, 338.47, 234.11, 448.19, 227.79
285, 298, 92, 538, 380, 338.70, 233.97, 447.77, 227.98
286, 296, 93, 539, 381, 338.27, 234.25, 447.64, 228.10
287, 292, 92, 530, 383, 338.36, 233.50, 446.95, 228.76
288, 290, 98, 521, 380, 337.69, 233.44, 447.08, 228.10
289, 288, 99, 516, 379, 337.42, 233.59, 446.47, 228.16
290, 289, 98, 521, 380, 337.55, 233.71, 447.15, 228.27
291, 299, 98, 528, 377, 337.29, 233.82, 447.31, 228.23
292, 299, 97, 528, 377, 337.39, 233.65, 447.58, 228.37
293, 285, 96, 520, 381, 337.76, 233.45, 446.66, 228.27
294, 296, 96, 530, 379, 337.80, 233.62, 447.33, 228.36
295, 291, 97, 524, 380, 337.97, 233.50, 447.42, 228.16
296, 296, 96, 533, 378, 338.40, 233.49, 447.96, 228.05
297, 293, 94, 530, 382, 337.26, 233.45, 446.51, 228.12
298, 291, 96, 524, 380, 337.16, 233.41, 446.37, 227.91
299, 290, 96, 523, 380, 337.66, 233.26, 447.44, 228.01
300, 301, 97, 529, 376, 337.80, 233.55, 447.97, 227.77
......@@ -38,20 +38,26 @@ def compute_quality_features(image):
"Image Quality Assessment for Fake Biometric Detection: Application to Iris, Fingerprint, and Face Recognition",
IEEE Trans. on Image Processing Vol 23(2), 2014.
"""
gray_image = None
#print("shape of input image:")
#print(image.shape)
if len(image.shape) == 3:
if(image.shape[0]==3):
gray_image = matlab_rgb2gray(rgbFrame) #compute gray-level image for input color-frame
gray_image = matlab_rgb2gray(image) #compute gray-level image for input color-frame
print(gray_image.shape)
else:
print('error. Wrong kind of input image')
else:
if len(image.shape) == 2:
gray_image = image
print(gray_image.shape)
else:
print('error -- wrong kind of input')
gwin = gauss_2d((3,3), 0.5)
if gray_image:
if gray_image is not None:
gwin = gauss_2d((3,3), 0.5) # set up the smoothing-filter
print("computing degraded version of image")
smoothed = ssg.convolve2d(gray_image, gwin, boundary='symm', mode='same')
"""
......@@ -61,6 +67,7 @@ def compute_quality_features(image):
approach is that smoothing degrades a spoof-image more than it does a genuine image
(see Galbally's paper referenced above).
"""
print("computing galbally quality features")
featSet = image_quality_measures(gray_image, smoothed)
return featSet
......
......@@ -91,12 +91,12 @@ def sobelEdgeMap(image, orientation='both'):
refSobelX = refSobel_sep[0,:,:]
refSobelY = refSobel_sep[1,:,:]
if orientation is 'horizontal':
refEdge = iqm.edgeThinning(refSobelX[:,:], refSobelX[:,:], thinning)
refEdge = iqm.edge_thinning(refSobelX[:,:], refSobelX[:,:], thinning)
else:
if orientation is 'vertical':
refEdge = iqm.edgeThinning(refSobelY[:,:], refSobelY[:,:], thinning)
refEdge = iqm.edge_thinning(refSobelY[:,:], refSobelY[:,:], thinning)
else:
refEdge = iqm.edgeThinning(refSobelX[:,:], refSobelY[:,:], thinning)
refEdge = iqm.edge_thinning(refSobelX[:,:], refSobelY[:,:], thinning)
return refEdge
......@@ -106,7 +106,8 @@ def sobelEdgeMap(image, orientation='both'):
'''
'''
#def computeMsuIQAFeatures(rgbImage, printFV=False):
def computeMsuIQAFeatures(rgbImage):
def compute_msu_iqa_features(rgbImage):
print("computing msu iqa features")
assert len(rgbImage.shape)==3, 'computeMsuIQAFeatures():: image should be a 3D array (containing a rgb image)'
# hsv = np.zeros_like(rgbImage)
# bob.ip.color.rgb_to_hsv(rgbImage, hsv)
......@@ -115,7 +116,7 @@ def computeMsuIQAFeatures(rgbImage):
# v = hsv[2,:,:]
h,s,v = matlab_rgb2hsv(rgbImage) #defined above. Calls Bob's rgb_to_hsv() after rescaling the input image.
#print "computeMsuIQAFeatures():: check bob.ip.color.rgb_to_hsv conversion"
#print "compute_msu_iqa_features():: check bob.ip.color.rgb_to_hsv conversion"
grayImage = np.zeros_like(h, dtype='uint8')
bob.ip.color.rgb_to_gray(rgbImage, grayImage)
......@@ -147,7 +148,8 @@ def computeMsuIQAFeatures(rgbImage):
momentFeats = np.hstack((momentFeats, momentFeatsV))
fv = momentFeats.copy()
#print 'moment features:', fv
#print('moment features: ')
#print(fv)
fv = np.hstack((fv, colorHist))
fv = np.hstack((fv, totNumColors))
......@@ -367,7 +369,7 @@ def rgbhist(image, maxval, nBins, normType=0):
for i in range(0, numPix): # for i=1:size(I,1)*size(I,2)
p = (im[i,:]).astype(float) # p = double(im(i,:));
p = np.floor(p/decimator) # p = floor(p/(maxval/nBins))+1;
p = (np.floor(p/decimator)).astype(np.uint32) # p = floor(p/(maxval/nBins))+1;
H[p[0], p[1], p[2]] += 1 # H(p(1),p(2),p(3)) = H(p(1),p(2),p(3)) + 1;
# end
#totalNBins = np.prod(H.shape)
......
'''
Created on 13 Oct 2015
@author: sbhatta
'''
import os, sys
import argparse
import bob.io.base
import bob.io.image #under the hood: loads Bob plugin for image file
import bob.io.video
import bob.ip.color
import numpy as np
import msu_iqa_features as iqa
#import MSU_MaskedIQAFeats as iqa
import antispoofing.utils.db as bobdb
'''
computes image-quality features for a set of frames comprising a video.
@param video4d: a '4d' video (N frames, each frame representing an r-g-b image).
returns a set of feature-vectors, 1 vector per frame of video4d
'''
def computeVideoIQA(video4d, validFrames):
numframes = video4d.shape[0]
#process first frame separately, to get the no. of iqm features
numValidFrames = np.sum(validFrames)
k=0
while validFrames[k] == 0: k+=1
print 'first valid frame: ', k
rgbFrame = video4d[k,:,:,:]
iqmSet = iqa.computeMsuIQAFeatures(rgbFrame)
numIQMs = len(iqmSet)
#now initialize fset to store iqm features for all frames of input video.
fset = np.zeros([numValidFrames, numIQMs])
msuQFeats = np.asarray(iqmSet) # computeQualityFeatures() returns a tuple
fset[0,:] = msuQFeats
print 'fset shape:', fset.shape
j=1
for f in range(k+1,numframes):
if validFrames[f]==1:
rgbFrame = video4d[f,:,:,:]
#grayFrame = matlab_rgb2gray(rgbFrame) #compute gray-level image for input color-frame
msuQFeats = np.asarray(iqa.computeMsuIQAFeatures(rgbFrame)) # computeQualityFeatures() returns a tuple
fset[j,:] = msuQFeats
#print j, f
j += 1
return fset
'''
loads a video, and returns a feature-vector for each frame of video
'''
def computeIQA_1video(videoFile, frameQualFile):
inputVideo = bob.io.video.reader(videoFile)
#load input video
vin = inputVideo.load()
numFrames = vin.shape[0]
if frameQualFile is not None:
f = bob.io.base.HDF5File(frameQualFile) #read only
validFrames = (f.read('/frameQuality')).flatten() #reads list of frame-quality indicators
validFrames[np.where(validFrames <> 1)]=0
else:
validFrames = np.ones(numFrames)
#print validFrames
# print type(validFrames)
numValidFrames = np.sum(validFrames)
print 'valid frames:', numValidFrames, 'of', numFrames
#bob.io.base.save(vin[0,:,:,:].astype('uint8'), '/idiap/temp/sbhatta/msudb_colorImg.png')
import time
startTime = time.time()
fset = computeVideoIQA(vin, validFrames)
print("Time for one video --- %s seconds ---" % (time.time() - startTime))
return fset
'''
'''
def parse_arguments(arguments):
#code for parsing command line args.
argParser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
# # verbose
argParser.add_argument('-v', '--verbose', dest='verbose', metavar='INT', type=int, choices=[0, 1, 2], default=1,
help='Prints (hopefully helpful) messages (Default: %(default)s)')
argParser.add_argument('-db', '--dbase_path', dest='dbPath', default = None, #'/idiap/user/sbhatta/work/Antispoofing/ImageQualityMeasures',
help='path where database videos exist.')
argParser.add_argument('-op', '--output_path', dest='outPath', default = None,
help='path where face-files will be stored.')
argParser.add_argument('-nf', '--numFiles', action='store_true', dest='numFiles',
default=False, help='Option to print no. of files that will be processed. (Default: %(default)s)')
argParser.add_argument('-f', '--singleFile', dest='singleFile', default=None,
help='filename (including complete path) of video to be used to test this code: %(default)s)')
argParser.add_argument('-ve', '--video_ext', dest='vidExtn', default=None, choices = ['avi', 'mov', 'mp4'],
help='filename (including complete path) of video to be used to test this code: %(default)s)')
bobdb.Database.create_parser(argParser, implements_any_of='video')
args = argParser.parse_args(arguments)
database = args.cls(args)
if args.singleFile is None:
#make sure the user specifies a folder where feature-files exist
if not args.dbPath: argParser.error('Specify parameter --dbase_path')
else:
folder = os.path.dirname(args.singleFile)
filename = os.path.basename(args.singleFile)
args.dbPath = folder
args.singleFile = filename
if not args.outPath: argParser.error('Specify parameter --output_path')
return (args, database)
'''
'''
def main(arguments):
args, database = parse_arguments(arguments)
inpDir = args.dbPath
outDir = args.outPath
assert os.path.exists(inpDir), "Input database folder %s does not exist" %inpDir
if args.verbose>0: print 'Loading data from',inpDir
if args.singleFile is None:
tr_realFiles, tr_attackFiles = database.get_train_data()
dv_realFiles, dv_attackFiles = database.get_devel_data()
ts_realFiles, ts_attackFiles = database.get_test_data()
allFiles = tr_realFiles + dv_realFiles + ts_realFiles + tr_attackFiles + dv_attackFiles + ts_attackFiles
del tr_realFiles, tr_attackFiles, dv_realFiles, dv_attackFiles, ts_realFiles, ts_attackFiles
numFiles = len(allFiles)
if args.numFiles:
print 'Number of files to be processed:',numFiles
print 'exiting'
return
# print numFiles
# numFiles = 1 #test
# if we are on a grid environment, just find what I have to process.
fileSet = allFiles[0:numFiles]
if os.environ.has_key('SGE_TASK_ID'):
pos = int(os.environ['SGE_TASK_ID']) - 1
if pos >= numFiles:
raise RuntimeError, "Grid request for job %d on a setup with %d jobs" % (pos, numFiles)
fileSet = [allFiles[pos]] # objects = [objects[pos]]
print 'processing', len(fileSet), ' files'
k1=0
for k in fileSet:
#1. load video file
print 'filenum:', k1
# infile = k.make_path(videoRoot, '.avi')
# outfile = k.make_path(featRoot, '.h5')
print k
if args.vidExtn is None:
inVidFile = k.videofile(inpDir) #k.make_path(inpDir, '.avi')
else:
inVidFile = k.make_path(inpDir, ('.' + args.vidExtn))
inFrameQFile = None #k.make_path(inpDir, '_frameQ.h5')
outFeatFile = k.make_path(outDir, '.h5')
head, tail = os.path.split(outFeatFile)
if not os.path.exists(head): os.makedirs(head) #create output folder, if it doesn't exist
print inFrameQFile
print outFeatFile
# if True: #not os.path.isfile(outFeatFile):
msuIQAFeats = computeIQA_1video(inVidFile, inFrameQFile)
#4. save features in file
ohf = bob.io.base.HDF5File(outFeatFile, 'w')
ohf.set('msuiqa', msuIQAFeats)
del ohf
# assert 0>1, 'stop'
k1 += 1
else:
# test feature-computation with a single file specified as input
filePart = os.path.splitext(args.singleFile)[0]
inVidFile = os.path.join(args.dbPath, filePart)+ '.avi'
inFrameQFile = os.path.join(args.dbPath, filePart)+ '_frameQ.h5'
outFeatFile = os.path.join(outDir, filePart)+ '.h5'
head, tail = os.path.split(outFeatFile)
if not os.path.exists(head): os.makedirs(head) #create output folder, if it doesn't exist
print 'single file:', inVidFile
print inFrameQFile
print outFeatFile
msuIQAFeats = computeIQA_1video(inVidFile, inFrameQFile)
#4. save features in file
ohf = bob.io.base.HDF5File(outFeatFile, 'w')
ohf.set('msuiqa', msuIQAFeats)
del ohf
# special fn to extract first frame from video-file and store it as hdf5
def extractTestFrame():
videoFile = '/idiap/home/sbhatta/work/git/refactoring/bob.db.msu_mfsd_mod/bob/db/msu_mfsd_mod/test_images/real/real_client022_android_SD_scene01.mp4'
inputVideo = bob.io.video.reader(videoFile)
#load input video
vin = inputVideo.load()
numFrames = vin.shape[0]
outframe = vin[0]
outfile = '/idiap/home/sbhatta/work/git/refactoring/bob.db.msu_mfsd_mod/bob/db/msu_mfsd_mod/test_images/real_client022_android_SD_scene01_frame0_correct.hdf5'
ohf = bob.io.base.HDF5File(outfile, 'w')
ohf.set('color_frame', outframe)
del ohf
if __name__ == '__main__':
# extractTestFrame()
main(sys.argv[1:])
......@@ -2,7 +2,7 @@
# vim: set fileencoding=utf-8 :
'''
Created on 13 Oct 2015
Created on 08 Mar 2017
@author: sbhatta
'''
......@@ -14,113 +14,86 @@ import bob.io.base
import bob.io.video
import bob.ip.color
import numpy as np
import galbally_iqm_features as iqm
import antispoofing.utils.db as bobdb
from bob.ip.qualitymeasure import galbally_iqm_features as iqm
from bob.ip.qualitymeasure import msu_iqa_features as iqa
#'''
#Matlab-like RGB to gray...
# @param: rgbImage : numpy array for the form: [3,h,w] where h is the height of the image and w is the width of the image.
# Returns a y-image in floating-point format (range [(16/255) .. (235/255)])
#'''
#def matlab_rgb2gray(rgbImage):
# #g1 = 0.299*rgbFrame[0,:,:] + 0.587*rgbFrame[1,:,:] + 0.114*rgbFrame[2,:,:] #standard coeffs CCIR601
#
# #this is how it's done in matlab...
# rgbImage = rgbImage / 255.0
# C0 = 65.481/255.0
# C1 = 128.553/255.0
# C2 = 24.966/255.0
# scaleMin = 16.0/255.0
# #scaleMax = 235.0/255.0
# gray = scaleMin + (C0*rgbImage[0,:,:] + C1*rgbImage[1,:,:] + C2*rgbImage[2,:,:])
#
# return gray
# """
# loads a video, and returns a feature-vector for each frame of video
# """
# def computeIQM_1video(vidPath):
# inputVideo = bob.io.video.reader(vidPath)
# vin = inputVideo.load()
# numframes = vin.shape[0]
# fset = np.zeros([numframes, 21])
# for f in range(numframes):
# rgbFrame = vin[f,:,:,:]
# grayFrame = matlab_rgb2gray(rgbFrame) #compute gray-level image for input color-frame
# bobQFeats = np.asarray(iqm.computeQualityFeatures(grayFrame)) # computeQualityFeatures() returns a tuple
# fset[f,:] = bobQFeats
#
# return fset
#
'''
computes image-quality features for a set of frames comprising a video.
def computeVideoIQM(video4d):
'''computes image-quality features for a set of frames comprising a video.
@param video4d: a '4d' video (N frames, each frame representing an r-g-b image).
returns a set of feature-vectors, 1 vector per frame of video4d