diff --git a/bob/ip/qualitymeasure/data/real_client001_android_SD_scene01.face b/bob/ip/qualitymeasure/data/real_client001_android_SD_scene01.face new file mode 100755 index 0000000000000000000000000000000000000000..bce523310f9fc6f467173d0f3880e0aa11f14455 --- /dev/null +++ b/bob/ip/qualitymeasure/data/real_client001_android_SD_scene01.face @@ -0,0 +1,301 @@ +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 diff --git a/bob/ip/qualitymeasure/data/real_client001_android_SD_scene01.mp4 b/bob/ip/qualitymeasure/data/real_client001_android_SD_scene01.mp4 new file mode 100755 index 0000000000000000000000000000000000000000..26f44879c3eea7638dd0d7d90189130c9f643cda Binary files /dev/null and b/bob/ip/qualitymeasure/data/real_client001_android_SD_scene01.mp4 differ diff --git a/bob/ip/qualitymeasure/galbally_iqm_features.py b/bob/ip/qualitymeasure/galbally_iqm_features.py index a1aaa7bcc5d9a147e29ab914fffd2a481e91d9de..e91fb8ee0eb3b886b296094079b5d65bd33e3859 100644 --- a/bob/ip/qualitymeasure/galbally_iqm_features.py +++ b/bob/ip/qualitymeasure/galbally_iqm_features.py @@ -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 diff --git a/bob/ip/qualitymeasure/msu_iqa_features.py b/bob/ip/qualitymeasure/msu_iqa_features.py index d776a97d521283dab59fe8d9dac2f1e4de4eac55..1c485efe95c3ca2a8c1e55005e05c99c70050796 100644 --- a/bob/ip/qualitymeasure/msu_iqa_features.py +++ b/bob/ip/qualitymeasure/msu_iqa_features.py @@ -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) diff --git a/bob/ip/qualitymeasure/script/compute_iqm_features.py b/bob/ip/qualitymeasure/script/compute_iqm_features.py deleted file mode 100644 index 92904d71a42af1628159a1c827f0d9ee81b1cdef..0000000000000000000000000000000000000000 --- a/bob/ip/qualitymeasure/script/compute_iqm_features.py +++ /dev/null @@ -1,128 +0,0 @@ -#!/usr/bin/env python -# vim: set fileencoding=utf-8 : - -''' -Created on 13 Oct 2015 - -@author: sbhatta -''' - -import os, sys -import argparse - -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 - - -#''' -#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. - @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 computeVideoIQM(video4d): - numframes = video4d.shape[0] - - #process first frame separately, to get the no. of iqm features - f=0 - rgbFrame = video4d[f,:,:,:] - grayFrame = matlab_rgb2gray(rgbFrame) #compute gray-level image for input color-frame - iqmSet = iqm.compute_quality_features(grayFrame) - numIQMs = len(iqmSet) - #now initialize fset to store iqm features for all frames of input video. - fset = np.zeros([numframes, numIQMs]) - bobQFeats = np.asarray(iqmSet) # computeQualityFeatures() returns a tuple - fset[f,:] = bobQFeats - - for f in range(1,numframes): - rgbFrame = video4d[f,:,:,:] -# grayFrame = matlab_rgb2gray(rgbFrame) #compute gray-level image for input color-frame -# bobQFeats = np.asarray(iqm.compute_quality_features(grayFrame)) # computeQualityFeatures() returns a tuple - bobQFeats = np.asarray(iqm.compute_quality_features(rgbFrame)) # computeQualityFeatures() returns a tuple - fset[f,:] = bobQFeats - - return fset - - -''' -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() - return computeVideoIQM(vin) - - - -def main(command_line_parameters=None): - - #code for parsing command line args. - argParser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) - argParser.add_argument('-f', '--print_num_files', action='store_true', dest='printNumFiles', - default=False, help='Option to print no. of files that will be processed. (Default: %(default)s)') - - argParser.add_argument('-i', '--input_videofile', dest='inpFile', default = None, - help='filename of video to be processed (including complete path). Video expected in .mov format.') - - argParser.add_argument('-o', '--output_featurefile', dest='outFile', default = None, - help='filename where computed features will be stored. Output file will be in hdf5 format.') - - args = argParser.parse_args(command_line_parameters) - #make sure the user specifies a folder where feature-files exist - if not args.inpFile: argParser.error('Specify parameter --input_videofile') - if not args.outFile: argParser.error('Specify parameter --output_featurefile') - - #1. load video file - infile = args.inpFile #k.make_path(videoRoot, '.mov') - #2. compute features, 1 vector per frame of input video. - bobIqmFeats = computeIQM_1video(infile) - #3. save features in file - outfile = args.outFile #k.make_path(featRoot, '.h5') - ohf = bob.io.base.HDF5File(outfile, 'w') - ohf.set('bobiqm', bobIqmFeats) - del ohf - - -if __name__ == '__main__': - main(sys.argv[1:]) diff --git a/bob/ip/qualitymeasure/script/compute_msuiqa_features.py b/bob/ip/qualitymeasure/script/compute_msuiqa_features.py deleted file mode 100644 index 6addad0837d2853562d861da37fd6159a81f4e28..0000000000000000000000000000000000000000 --- a/bob/ip/qualitymeasure/script/compute_msuiqa_features.py +++ /dev/null @@ -1,240 +0,0 @@ -''' -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:]) diff --git a/bob/ip/qualitymeasure/script/compute_qualitymeasures.py b/bob/ip/qualitymeasure/script/compute_qualitymeasures.py new file mode 100644 index 0000000000000000000000000000000000000000..29b1cea260540deb1e05e8fa8a9aa4f50c5a2f0b --- /dev/null +++ b/bob/ip/qualitymeasure/script/compute_qualitymeasures.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python +# vim: set fileencoding=utf-8 : + +''' +Created on 08 Mar 2017 + +@author: sbhatta +''' + +import os, sys +import argparse + +import bob.io.base +import bob.io.video +import bob.ip.color +import numpy as np +from bob.ip.qualitymeasure import galbally_iqm_features as iqm +from bob.ip.qualitymeasure import msu_iqa_features as iqa + + +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 + ''' + numframes = video4d.shape[0] + numframes=3 + #print(numframes) + + #process first frame separately, to get the no. of iqm features + f=0 + #rgbFrame = video4d[f,:,:,:] + rgbFrame = video4d[f] + print(rgbFrame.shape) + iqmSet = iqm.compute_quality_features(rgbFrame) #iqmSet = iqm.compute_quality_features(grayFrame) + numIQM = len(iqmSet) + iqaSet = iqa.compute_msu_iqa_features(rgbFrame) + numIQA = len(iqaSet) + + #now initialize fset to store iqm features for all frames of input video. + bobfset = np.zeros([numframes, numIQM]) + bobQFeats = np.asarray(iqmSet) # compute_quality_features() returns a tuple + bobfset[f] = bobQFeats + msufset = np.zeros([numframes, numIQA]) + msuQFeats = np.asarray(iqaSet) + msufset[f] = msuQFeats + + for f in range(1,numframes): + print('frame #: %d' %f) + rgbFrame = video4d[f] + print(rgbFrame.shape) +# grayFrame = matlab_rgb2gray(rgbFrame) #compute gray-level image for input color-frame +# bobQFeats = np.asarray(iqm.compute_quality_features(grayFrame)) # computeQualityFeatures() returns a tuple + bobQFeats = np.asarray(iqm.compute_quality_features(rgbFrame)) # computeQualityFeatures() returns a tuple + msuQFeats = iqa.compute_msu_iqa_features(rgbFrame) + bobfset[f] = bobQFeats + msufset[f] = msuQFeats + + return (bobfset, msufset) + + +def computeIQM_1video(vidPath): + """ loads a video, and returns 2 arrays of feature-vectors -- one per feature-family. + Each array contains one feature-vector per frame + """ + #1. load video from input path + inputVideo = bob.io.video.reader(vidPath) + vin = inputVideo.load() + #2. compute and return feature-sets + return computeVideoIQM(vin) + + + +def main(command_line_parameters=None): + """Computes image-quality features for specified video-file, and stores the feature-arrays in specified output hdf5 file""" + + argParser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + argParser.add_argument('-i', '--input_videofile', dest='inpVidFile', default = None, + help='filename of video to be processed (including complete path). ') + + argParser.add_argument('-o', '--output_featurefile', dest='outFile', default = None, + help='filename where computed features will be stored. Output file will be in hdf5 format.') + + args = argParser.parse_args(command_line_parameters) + #make sure the user specifies a folder where feature-files exist + if not args.inpVidFile: argParser.error('Specify parameter --input_videofile') + if not args.outFile: argParser.error('Specify parameter --output_featurefile') + + #1. compute features, 1 vector per frame of input video, per feature-family (galbally,msu). + infile = args.inpVidFile + (bobIqmFeats, msuIqaFeats) = computeIQM_1video(infile) + #2. save features in file + outfile = args.outFile + ohf = bob.io.base.HDF5File(outfile, 'w') + ohf.set('bobiqm', bobIqmFeats) + ohf.set('msuiqa', msuIqaFeats) + del ohf + + +if __name__ == '__main__': + main(sys.argv[1:]) diff --git a/setup.py b/setup.py index 9a1298443a0d0f79b8af195393ec55f0e3674eee..e0151508df78a90e3667454e0aea21750a5f0134 100644 --- a/setup.py +++ b/setup.py @@ -34,7 +34,7 @@ setup( entry_points={ # scripts should be declared using this entry: 'console_scripts': [ - 'detect_landmarks.py = bob.ip.facelandmarks.script.detect_landmarks:main', + 'compute_qualityfeatures.py = bob.ip.qualitymeasure.script.compute_qualitymeasures:main', ], },