diff --git a/.gitignore b/.gitignore index 488f5fe..743428a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,8 @@ # Created by https://www.toptal.com/developers/gitignore/api/c++,visualstudio,visualstudiocode,opencv # Edit at https://www.toptal.com/developers/gitignore?templates=c++,visualstudio,visualstudiocode,opencv +res/** + ### C++ ### # Prerequisites *.d diff --git a/res/House.obj b/res/House.obj deleted file mode 100644 index 220eb01..0000000 --- a/res/House.obj +++ /dev/null @@ -1,4495 +0,0 @@ -# Blender v2.91.0 OBJ File: '' -# www.blender.org -mtllib House.mtl -o ObjObject -v -12.800000 0.199998 9.900000 -v -12.800000 -0.000002 9.900000 -v -12.800000 -0.000002 10.000000 -v -12.800000 0.000002 -9.900000 -v -12.800000 0.200001 -8.500000 -v -12.800000 0.300001 -8.500000 -v -12.800000 0.300002 -9.900000 -v -12.800000 0.000002 -10.000000 -v -12.800000 19.899998 9.900002 -v -12.800000 19.900002 -9.899997 -v -12.800000 19.999998 10.000003 -v -12.800000 19.999998 9.900002 -v -12.800000 20.000002 -9.899997 -v -12.800000 20.000002 -9.999997 -v -12.700000 0.400001 -9.200000 -v -12.700000 0.300002 -9.300000 -v -12.700000 0.300002 -9.200000 -v -12.700000 0.400002 -9.300000 -v -9.900000 0.300001 -7.800000 -v -9.900000 0.200001 -7.900000 -v -9.900000 0.200001 -7.800000 -v -9.900000 0.300001 -7.900000 -v -9.600000 0.300001 -7.200000 -v -9.600000 0.200001 -8.500000 -v -9.600000 0.200001 -7.200000 -v -9.600000 0.300001 -8.500000 -v -9.400000 0.400001 -7.800000 -v -9.400000 0.300001 -7.900000 -v -9.400000 0.300001 -7.800000 -v -9.400000 0.400001 -7.900000 -v -8.400000 13.199998 9.900002 -v -8.400000 6.799999 9.800001 -v -8.400000 6.799999 9.900001 -v -8.400000 13.199998 9.800002 -v -8.400000 13.200002 -9.799998 -v -8.400000 6.800002 -9.899999 -v -8.400000 6.800002 -9.799999 -v -8.400000 13.200002 -9.899998 -v -6.400000 9.899998 10.000002 -v -6.400000 6.999999 9.900001 -v -6.400000 6.999999 10.000001 -v -6.400000 6.999999 9.800001 -v -6.400000 9.899998 9.800002 -v -6.400000 9.900002 -9.799998 -v -6.400000 7.000001 -9.999999 -v -6.400000 7.000001 -9.899999 -v -6.400000 7.000001 -9.799999 -v -6.400000 9.900002 -9.999998 -v -6.400000 12.999998 10.000002 -v -6.400000 10.099998 9.800002 -v -6.400000 10.099998 10.000002 -v -6.400000 12.999998 9.900002 -v -6.400000 12.999998 9.800002 -v -6.400000 13.000002 -9.799998 -v -6.400000 10.100002 -9.999998 -v -6.400000 10.100002 -9.799998 -v -6.400000 13.000002 -9.899998 -v -6.400000 13.000002 -9.999998 -v -5.700000 0.400001 -9.200000 -v -5.700000 0.300002 -9.300000 -v -5.700000 0.300002 -9.200000 -v -5.700000 0.400002 -9.300000 -v -4.600000 9.899998 10.000002 -v -4.600000 6.999999 9.900001 -v -4.600000 6.999999 10.000001 -v -4.600000 9.899998 9.900002 -v -4.600000 6.999999 9.800001 -v -4.600000 9.899998 9.800002 -v -4.600000 9.900002 -9.799998 -v -4.600000 7.000001 -9.899999 -v -4.600000 7.000001 -9.799999 -v -4.600000 9.900002 -9.899998 -v -4.600000 7.000001 -9.999999 -v -4.600000 9.900002 -9.999998 -v -4.600000 12.999998 10.000002 -v -4.600000 10.099998 9.900002 -v -4.600000 10.099998 10.000002 -v -4.600000 12.999998 9.900002 -v -4.600000 10.099998 9.800002 -v -4.600000 12.999998 9.800002 -v -4.600000 13.000002 -9.799998 -v -4.600000 10.100002 -9.899998 -v -4.600000 10.100002 -9.799998 -v -4.600000 13.000002 -9.899998 -v -4.600000 10.100002 -9.999998 -v -4.600000 13.000002 -9.999998 -v -2.000000 0.400001 -7.800000 -v -2.000000 0.300001 -7.900000 -v -2.000000 0.300001 -7.800000 -v -2.000000 0.400001 -7.900000 -v 4.400000 13.199998 9.900002 -v 4.400000 6.799999 9.800001 -v 4.400000 6.799999 9.900001 -v 4.400000 13.199998 9.800002 -v 4.400000 13.200002 -9.799998 -v 4.400000 6.800002 -9.899999 -v 4.400000 6.800002 -9.799999 -v 4.400000 13.200002 -9.899998 -v 6.200000 9.899998 10.000002 -v 6.200000 6.999999 9.900001 -v 6.200000 6.999999 10.000001 -v 6.200000 6.999999 9.800001 -v 6.200000 9.899998 9.800002 -v 6.200000 9.900002 -9.799998 -v 6.200000 7.000001 -9.999999 -v 6.200000 7.000001 -9.899999 -v 6.200000 7.000001 -9.799999 -v 6.200000 9.900002 -9.999998 -v 6.200000 12.999998 10.000002 -v 6.200000 10.099998 9.800002 -v 6.200000 10.099998 10.000002 -v 6.200000 12.999998 9.900002 -v 6.200000 12.999998 9.800002 -v 6.200000 13.000002 -9.799998 -v 6.200000 10.100002 -9.999998 -v 6.200000 10.100002 -9.799998 -v 6.200000 13.000002 -9.899998 -v 6.200000 13.000002 -9.999998 -v 8.200000 9.899998 10.000002 -v 8.200000 6.999999 9.900001 -v 8.200000 6.999999 10.000001 -v 8.200000 9.899998 9.900002 -v 8.200000 6.999999 9.800001 -v 8.200000 9.899998 9.800002 -v 8.200000 9.900002 -9.799998 -v 8.200000 7.000001 -9.899999 -v 8.200000 7.000001 -9.799999 -v 8.200000 9.900002 -9.899998 -v 8.200000 7.000001 -9.999999 -v 8.200000 9.900002 -9.999998 -v 8.200000 12.999998 10.000002 -v 8.200000 10.099998 9.900002 -v 8.200000 10.099998 10.000002 -v 8.200000 12.999998 9.900002 -v 8.200000 10.099998 9.800002 -v 8.200000 12.999998 9.800002 -v 8.200000 13.000002 -9.799998 -v 8.200000 10.100002 -9.899998 -v 8.200000 10.100002 -9.799998 -v 8.200000 13.000002 -9.899998 -v 8.200000 10.100002 -9.999998 -v 8.200000 13.000002 -9.999998 -v -12.600000 0.300002 -9.200000 -v -12.600000 0.300002 -9.300000 -v -12.600000 0.400001 -9.200000 -v -12.600000 0.400002 -9.300000 -v -9.800000 0.200001 -7.800000 -v -9.800000 0.200001 -7.900000 -v -9.800000 0.300001 -7.800000 -v -9.800000 0.300001 -7.900000 -v -9.300000 0.300001 -7.800000 -v -9.300000 0.300001 -7.900000 -v -9.300000 0.400001 -7.800000 -v -9.300000 0.400001 -7.900000 -v -8.200000 6.999999 10.000001 -v -8.200000 6.999999 9.900001 -v -8.200000 9.899998 10.000002 -v -8.200000 6.999999 9.800001 -v -8.200000 9.899998 9.900002 -v -8.200000 9.899998 9.800002 -v -8.200000 7.000001 -9.799999 -v -8.200000 7.000001 -9.899999 -v -8.200000 9.900002 -9.799998 -v -8.200000 7.000001 -9.999999 -v -8.200000 9.900002 -9.899998 -v -8.200000 9.900002 -9.999998 -v -8.200000 10.099998 10.000002 -v -8.200000 10.099998 9.900002 -v -8.200000 12.999998 10.000002 -v -8.200000 10.099998 9.800002 -v -8.200000 12.999998 9.900002 -v -8.200000 12.999998 9.800002 -v -8.200000 10.100002 -9.799998 -v -8.200000 10.100002 -9.899998 -v -8.200000 13.000002 -9.799998 -v -8.200000 10.100002 -9.999998 -v -8.200000 13.000002 -9.899998 -v -8.200000 13.000002 -9.999998 -v -6.200000 6.999999 10.000001 -v -6.200000 6.999999 9.900001 -v -6.200000 9.899998 10.000002 -v -6.200000 6.999999 9.800001 -v -6.200000 9.899998 9.800002 -v -6.200000 7.000001 -9.899999 -v -6.200000 7.000001 -9.999999 -v -6.200000 9.900002 -9.799998 -v -6.200000 7.000001 -9.799999 -v -6.200000 9.900002 -9.999998 -v -6.200000 10.099998 10.000002 -v -6.200000 10.099998 9.800002 -v -6.200000 12.999998 10.000002 -v -6.200000 12.999998 9.900002 -v -6.200000 12.999998 9.800002 -v -6.200000 10.100002 -9.799998 -v -6.200000 10.100002 -9.999998 -v -6.200000 13.000002 -9.799998 -v -6.200000 13.000002 -9.899998 -v -6.200000 13.000002 -9.999998 -v -5.600000 0.300002 -9.200000 -v -5.600000 0.300002 -9.300000 -v -5.600000 0.400001 -9.200000 -v -5.600000 0.400002 -9.300000 -v -5.400000 0.200001 -8.500000 -v -5.400000 0.200002 -9.900000 -v -5.400000 0.300001 -8.500000 -v -5.400000 0.300002 -9.900000 -v -4.400000 6.799999 9.900001 -v -4.400000 6.799999 9.800001 -v -4.400000 13.199998 9.900002 -v -4.400000 13.199998 9.800002 -v -4.400000 6.800002 -9.799999 -v -4.400000 6.800002 -9.899999 -v -4.400000 13.200002 -9.799998 -v -4.400000 13.200002 -9.899998 -v -1.900000 0.300001 -7.800000 -v -1.900000 0.300001 -7.900000 -v -1.900000 0.400001 -7.800000 -v -1.900000 0.400001 -7.900000 -v -1.600000 0.200001 -7.200000 -v -1.600000 0.200001 -8.500000 -v -1.600000 0.300001 -7.200000 -v -1.600000 0.300001 -8.500000 -v 4.600000 6.999999 10.000001 -v 4.600000 6.999999 9.900001 -v 4.600000 9.899998 10.000002 -v 4.600000 6.999999 9.800001 -v 4.600000 9.899998 9.900002 -v 4.600000 9.899998 9.800002 -v 4.600000 7.000001 -9.799999 -v 4.600000 7.000001 -9.899999 -v 4.600000 9.900002 -9.799998 -v 4.600000 7.000001 -9.999999 -v 4.600000 9.900002 -9.899998 -v 4.600000 9.900002 -9.999998 -v 4.600000 10.099998 10.000002 -v 4.600000 10.099998 9.900002 -v 4.600000 12.999998 10.000002 -v 4.600000 10.099998 9.800002 -v 4.600000 12.999998 9.900002 -v 4.600000 12.999998 9.800002 -v 4.600000 10.100002 -9.799998 -v 4.600000 10.100002 -9.899998 -v 4.600000 13.000002 -9.799998 -v 4.600000 10.100002 -9.999998 -v 4.600000 13.000002 -9.899998 -v 4.600000 13.000002 -9.999998 -v 6.400000 6.999999 10.000001 -v 6.400000 6.999999 9.900001 -v 6.400000 9.899998 10.000002 -v 6.400000 6.999999 9.800001 -v 6.400000 9.899998 9.800002 -v 6.400000 7.000001 -9.899999 -v 6.400000 7.000001 -9.999999 -v 6.400000 9.900002 -9.799998 -v 6.400000 7.000001 -9.799999 -v 6.400000 9.900002 -9.999998 -v 6.400000 10.099998 10.000002 -v 6.400000 10.099998 9.800002 -v 6.400000 12.999998 10.000002 -v 6.400000 12.999998 9.900002 -v 6.400000 12.999998 9.800002 -v 6.400000 10.100002 -9.799998 -v 6.400000 10.100002 -9.999998 -v 6.400000 13.000002 -9.799998 -v 6.400000 13.000002 -9.899998 -v 6.400000 13.000002 -9.999998 -v 8.400000 6.799999 9.900001 -v 8.400000 6.799999 9.800001 -v 8.400000 13.199998 9.900002 -v 8.400000 13.199998 9.800002 -v 8.400000 6.800002 -9.799999 -v 8.400000 6.800002 -9.899999 -v 8.400000 13.200002 -9.799998 -v 8.400000 13.200002 -9.899998 -v 12.700000 -0.000002 9.900000 -v 12.700000 0.000002 -9.900000 -v 12.700000 0.199998 9.900000 -v 12.700000 0.200002 -9.900000 -v 12.800000 -0.000002 10.000000 -v 12.800000 -0.000002 9.900000 -v 12.800000 19.899998 9.900002 -v 12.800000 0.000002 -9.900000 -v 12.800000 0.000002 -10.000000 -v 12.800000 19.900002 -9.899997 -v 12.800000 19.999998 10.000003 -v 12.800000 19.999998 9.900002 -v 12.800000 20.000002 -9.899997 -v 12.800000 20.000002 -9.999997 -v -8.200000 6.999999 10.000001 -v -12.800000 19.999998 10.000003 -v -12.800000 -0.000002 10.000000 -v -8.200000 9.899998 10.000002 -v -8.200000 10.099998 10.000002 -v -8.200000 12.999998 10.000002 -v -6.400000 6.999999 10.000001 -v -6.400000 9.899998 10.000002 -v -6.400000 10.099998 10.000002 -v -6.400000 12.999998 10.000002 -v -6.200000 6.999999 10.000001 -v -6.200000 9.899998 10.000002 -v -6.200000 10.099998 10.000002 -v -6.200000 12.999998 10.000002 -v -4.600000 6.999999 10.000001 -v -4.600000 9.899998 10.000002 -v -4.600000 10.099998 10.000002 -v -4.600000 12.999998 10.000002 -v 4.600000 6.999999 10.000001 -v 4.600000 9.899998 10.000002 -v 4.600000 10.099998 10.000002 -v 4.600000 12.999998 10.000002 -v 6.200000 6.999999 10.000001 -v 6.200000 9.899998 10.000002 -v 6.200000 10.099998 10.000002 -v 6.200000 12.999998 10.000002 -v 6.400000 6.999999 10.000001 -v 6.400000 9.899998 10.000002 -v 6.400000 10.099998 10.000002 -v 6.400000 12.999998 10.000002 -v 8.200000 6.999999 10.000001 -v 8.200000 9.899998 10.000002 -v 8.200000 10.099998 10.000002 -v 8.200000 12.999998 10.000002 -v 12.800000 -0.000002 10.000000 -v 12.800000 19.999998 10.000003 -v -1.600000 0.200001 -7.200000 -v -9.600000 0.300001 -7.200000 -v -9.600000 0.200001 -7.200000 -v -1.600000 0.300001 -7.200000 -v -9.800000 0.200001 -7.800000 -v -9.900000 0.300001 -7.800000 -v -9.900000 0.200001 -7.800000 -v -9.800000 0.300001 -7.800000 -v -9.300000 0.300001 -7.800000 -v -9.400000 0.400001 -7.800000 -v -9.400000 0.300001 -7.800000 -v -9.300000 0.400001 -7.800000 -v -1.900000 0.300001 -7.800000 -v -2.000000 0.400001 -7.800000 -v -2.000000 0.300001 -7.800000 -v -1.900000 0.400001 -7.800000 -v -9.600000 0.200001 -8.500000 -v -12.800000 0.300001 -8.500000 -v -12.800000 0.200001 -8.500000 -v -9.600000 0.300001 -8.500000 -v -12.600000 0.300002 -9.200000 -v -12.700000 0.400001 -9.200000 -v -12.700000 0.300002 -9.200000 -v -12.600000 0.400001 -9.200000 -v -5.600000 0.300002 -9.200000 -v -5.700000 0.400001 -9.200000 -v -5.700000 0.300002 -9.200000 -v -5.600000 0.400001 -9.200000 -v -8.200000 7.000001 -9.799999 -v -8.400000 13.200002 -9.799998 -v -8.400000 6.800002 -9.799999 -v -8.200000 9.900002 -9.799998 -v -8.200000 10.100002 -9.799998 -v -8.200000 13.000002 -9.799998 -v -6.400000 7.000001 -9.799999 -v -6.400000 9.900002 -9.799998 -v -6.400000 10.100002 -9.799998 -v -6.400000 13.000002 -9.799998 -v -6.200000 7.000001 -9.799999 -v -6.200000 9.900002 -9.799998 -v -6.200000 10.100002 -9.799998 -v -6.200000 13.000002 -9.799998 -v -4.600000 7.000001 -9.799999 -v -4.600000 9.900002 -9.799998 -v -4.600000 10.100002 -9.799998 -v -4.600000 13.000002 -9.799998 -v -4.400000 6.800002 -9.799999 -v -4.400000 13.200002 -9.799998 -v 4.600000 7.000001 -9.799999 -v 4.400000 13.200002 -9.799998 -v 4.400000 6.800002 -9.799999 -v 4.600000 9.900002 -9.799998 -v 4.600000 10.100002 -9.799998 -v 4.600000 13.000002 -9.799998 -v 6.200000 7.000001 -9.799999 -v 6.200000 9.900002 -9.799998 -v 6.200000 10.100002 -9.799998 -v 6.200000 13.000002 -9.799998 -v 6.400000 7.000001 -9.799999 -v 6.400000 9.900002 -9.799998 -v 6.400000 10.100002 -9.799998 -v 6.400000 13.000002 -9.799998 -v 8.200000 7.000001 -9.799999 -v 8.200000 9.900002 -9.799998 -v 8.200000 10.100002 -9.799998 -v 8.200000 13.000002 -9.799998 -v 8.400000 6.800002 -9.799999 -v 8.400000 13.200002 -9.799998 -v -8.400000 6.800002 -9.899999 -v -12.800000 19.900002 -9.899997 -v -12.800000 0.300002 -9.900000 -v -8.400000 13.200002 -9.899998 -v -5.400000 0.300002 -9.900000 -v -4.400000 6.800002 -9.899999 -v -5.400000 0.200002 -9.900000 -v -4.400000 13.200002 -9.899998 -v 4.400000 6.800002 -9.899999 -v 4.400000 13.200002 -9.899998 -v 8.400000 6.800002 -9.899999 -v 8.400000 13.200002 -9.899998 -v 12.700000 0.200002 -9.900000 -v 12.800000 0.000002 -9.900000 -v 12.700000 0.000002 -9.900000 -v 12.800000 19.900002 -9.899997 -v -12.800000 0.199998 9.900000 -v -12.800000 19.899998 9.900002 -v -8.400000 6.799999 9.900001 -v -8.400000 13.199998 9.900002 -v -4.400000 6.799999 9.900001 -v -4.400000 13.199998 9.900002 -v 4.400000 6.799999 9.900001 -v 4.400000 13.199998 9.900002 -v 8.400000 6.799999 9.900001 -v 8.400000 13.199998 9.900002 -v 12.700000 0.199998 9.900000 -v 12.700000 -0.000002 9.900000 -v 12.800000 -0.000002 9.900000 -v 12.800000 19.899998 9.900002 -v -8.400000 6.799999 9.800001 -v -8.400000 13.199998 9.800002 -v -8.200000 6.999999 9.800001 -v -8.200000 9.899998 9.800002 -v -8.200000 10.099998 9.800002 -v -8.200000 12.999998 9.800002 -v -6.400000 6.999999 9.800001 -v -6.400000 9.899998 9.800002 -v -6.400000 10.099998 9.800002 -v -6.400000 12.999998 9.800002 -v -6.200000 6.999999 9.800001 -v -6.200000 9.899998 9.800002 -v -6.200000 10.099998 9.800002 -v -6.200000 12.999998 9.800002 -v -4.600000 6.999999 9.800001 -v -4.600000 9.899998 9.800002 -v -4.600000 10.099998 9.800002 -v -4.600000 12.999998 9.800002 -v -4.400000 6.799999 9.800001 -v -4.400000 13.199998 9.800002 -v 4.400000 6.799999 9.800001 -v 4.400000 13.199998 9.800002 -v 4.600000 6.999999 9.800001 -v 4.600000 9.899998 9.800002 -v 4.600000 10.099998 9.800002 -v 4.600000 12.999998 9.800002 -v 6.200000 6.999999 9.800001 -v 6.200000 9.899998 9.800002 -v 6.200000 10.099998 9.800002 -v 6.200000 12.999998 9.800002 -v 6.400000 6.999999 9.800001 -v 6.400000 9.899998 9.800002 -v 6.400000 10.099998 9.800002 -v 6.400000 12.999998 9.800002 -v 8.200000 6.999999 9.800001 -v 8.200000 9.899998 9.800002 -v 8.200000 10.099998 9.800002 -v 8.200000 12.999998 9.800002 -v 8.400000 6.799999 9.800001 -v 8.400000 13.199998 9.800002 -v -9.900000 0.200001 -7.900000 -v -9.900000 0.300001 -7.900000 -v -9.800000 0.200001 -7.900000 -v -9.800000 0.300001 -7.900000 -v -9.400000 0.300001 -7.900000 -v -9.400000 0.400001 -7.900000 -v -9.300000 0.300001 -7.900000 -v -9.300000 0.400001 -7.900000 -v -2.000000 0.300001 -7.900000 -v -2.000000 0.400001 -7.900000 -v -1.900000 0.300001 -7.900000 -v -1.900000 0.400001 -7.900000 -v -5.400000 0.200001 -8.500000 -v -5.400000 0.300001 -8.500000 -v -1.600000 0.200001 -8.500000 -v -1.600000 0.300001 -8.500000 -v -12.700000 0.300002 -9.300000 -v -12.700000 0.400002 -9.300000 -v -12.600000 0.300002 -9.300000 -v -12.600000 0.400002 -9.300000 -v -5.700000 0.300002 -9.300000 -v -5.700000 0.400002 -9.300000 -v -5.600000 0.300002 -9.300000 -v -5.600000 0.400002 -9.300000 -v -12.800000 0.000002 -10.000000 -v -12.800000 20.000002 -9.999997 -v -8.200000 7.000001 -9.999999 -v -8.200000 9.900002 -9.999998 -v -8.200000 10.100002 -9.999998 -v -8.200000 13.000002 -9.999998 -v -6.400000 7.000001 -9.999999 -v -6.400000 9.900002 -9.999998 -v -6.400000 10.100002 -9.999998 -v -6.400000 13.000002 -9.999998 -v -6.200000 7.000001 -9.999999 -v -6.200000 9.900002 -9.999998 -v -6.200000 10.100002 -9.999998 -v -6.200000 13.000002 -9.999998 -v -4.600000 7.000001 -9.999999 -v -4.600000 9.900002 -9.999998 -v -4.600000 10.100002 -9.999998 -v -4.600000 13.000002 -9.999998 -v 4.600000 7.000001 -9.999999 -v 4.600000 9.900002 -9.999998 -v 4.600000 10.100002 -9.999998 -v 4.600000 13.000002 -9.999998 -v 6.200000 7.000001 -9.999999 -v 6.200000 9.900002 -9.999998 -v 6.200000 10.100002 -9.999998 -v 6.200000 13.000002 -9.999998 -v 6.400000 7.000001 -9.999999 -v 6.400000 9.900002 -9.999998 -v 6.400000 10.100002 -9.999998 -v 6.400000 13.000002 -9.999998 -v 8.200000 7.000001 -9.999999 -v 8.200000 9.900002 -9.999998 -v 8.200000 10.100002 -9.999998 -v 8.200000 13.000002 -9.999998 -v 12.800000 0.000002 -10.000000 -v 12.800000 20.000002 -9.999997 -v -12.800000 -0.000002 9.900000 -v 12.800000 -0.000002 10.000000 -v -12.800000 -0.000002 10.000000 -v 12.700000 -0.000002 9.900000 -v 12.800000 -0.000002 9.900000 -v -12.800000 0.000002 -9.900000 -v 12.700000 0.000002 -9.900000 -v -12.800000 0.000002 -10.000000 -v 12.800000 0.000002 -9.900000 -v 12.800000 0.000002 -10.000000 -v -8.400000 6.799999 9.800001 -v -4.400000 6.799999 9.900001 -v -8.400000 6.799999 9.900001 -v -4.400000 6.799999 9.800001 -v 4.400000 6.799999 9.800001 -v 8.400000 6.799999 9.900001 -v 4.400000 6.799999 9.900001 -v 8.400000 6.799999 9.800001 -v -8.400000 6.800002 -9.899999 -v -4.400000 6.800002 -9.799999 -v -8.400000 6.800002 -9.799999 -v -4.400000 6.800002 -9.899999 -v 4.400000 6.800002 -9.899999 -v 8.400000 6.800002 -9.799999 -v 4.400000 6.800002 -9.799999 -v 8.400000 6.800002 -9.899999 -v -8.200000 9.899998 9.900002 -v -6.400000 9.899998 10.000002 -v -8.200000 9.899998 10.000002 -v -4.600000 9.899998 9.900002 -v -4.600000 9.899998 10.000002 -v -6.200000 9.899998 10.000002 -v 4.600000 9.899998 9.900002 -v 6.200000 9.899998 10.000002 -v 4.600000 9.899998 10.000002 -v 8.200000 9.899998 9.900002 -v 8.200000 9.899998 10.000002 -v 6.400000 9.899998 10.000002 -v -8.200000 9.899998 9.800002 -v -6.400000 9.899998 9.800002 -v -6.200000 9.899998 9.800002 -v -4.600000 9.899998 9.800002 -v 4.600000 9.899998 9.800002 -v 6.200000 9.899998 9.800002 -v 6.400000 9.899998 9.800002 -v 8.200000 9.899998 9.800002 -v -8.200000 9.900002 -9.899998 -v -6.400000 9.900002 -9.799998 -v -8.200000 9.900002 -9.799998 -v -4.600000 9.900002 -9.899998 -v -4.600000 9.900002 -9.799998 -v -6.200000 9.900002 -9.799998 -v 4.600000 9.900002 -9.899998 -v 6.200000 9.900002 -9.799998 -v 4.600000 9.900002 -9.799998 -v 8.200000 9.900002 -9.899998 -v 8.200000 9.900002 -9.799998 -v 6.400000 9.900002 -9.799998 -v -8.200000 9.900002 -9.999998 -v -6.400000 9.900002 -9.999998 -v -6.200000 9.900002 -9.999998 -v -4.600000 9.900002 -9.999998 -v 4.600000 9.900002 -9.999998 -v 6.200000 9.900002 -9.999998 -v 6.400000 9.900002 -9.999998 -v 8.200000 9.900002 -9.999998 -v -8.200000 12.999998 9.900002 -v -6.400000 12.999998 10.000002 -v -8.200000 12.999998 10.000002 -v -6.400000 12.999998 9.900002 -v -6.200000 12.999998 9.900002 -v -4.600000 12.999998 10.000002 -v -6.200000 12.999998 10.000002 -v -4.600000 12.999998 9.900002 -v 4.600000 12.999998 9.900002 -v 6.200000 12.999998 10.000002 -v 4.600000 12.999998 10.000002 -v 6.200000 12.999998 9.900002 -v 6.400000 12.999998 9.900002 -v 8.200000 12.999998 10.000002 -v 6.400000 12.999998 10.000002 -v 8.200000 12.999998 9.900002 -v -8.200000 12.999998 9.800002 -v -6.400000 12.999998 9.800002 -v -6.200000 12.999998 9.800002 -v -4.600000 12.999998 9.800002 -v 4.600000 12.999998 9.800002 -v 6.200000 12.999998 9.800002 -v 6.400000 12.999998 9.800002 -v 8.200000 12.999998 9.800002 -v -8.200000 13.000002 -9.899998 -v -6.400000 13.000002 -9.799998 -v -8.200000 13.000002 -9.799998 -v -6.400000 13.000002 -9.899998 -v -6.200000 13.000002 -9.899998 -v -4.600000 13.000002 -9.799998 -v -6.200000 13.000002 -9.799998 -v -4.600000 13.000002 -9.899998 -v 4.600000 13.000002 -9.899998 -v 6.200000 13.000002 -9.799998 -v 4.600000 13.000002 -9.799998 -v 6.200000 13.000002 -9.899998 -v 6.400000 13.000002 -9.899998 -v 8.200000 13.000002 -9.799998 -v 6.400000 13.000002 -9.799998 -v 8.200000 13.000002 -9.899998 -v -8.200000 13.000002 -9.999998 -v -6.400000 13.000002 -9.999998 -v -6.200000 13.000002 -9.999998 -v -4.600000 13.000002 -9.999998 -v 4.600000 13.000002 -9.999998 -v 6.200000 13.000002 -9.999998 -v 6.400000 13.000002 -9.999998 -v 8.200000 13.000002 -9.999998 -v -12.800000 19.900002 -9.899997 -v 12.800000 19.899998 9.900002 -v -12.800000 19.899998 9.900002 -v 12.800000 19.900002 -9.899997 -v -12.800000 0.199998 9.900000 -v 12.700000 0.199998 9.900000 -v -9.600000 0.200001 -7.200000 -v -1.600000 0.200001 -7.200000 -v -9.900000 0.200001 -7.800000 -v -9.800000 0.200001 -7.800000 -v -9.900000 0.200001 -7.900000 -v -9.800000 0.200001 -7.900000 -v -12.800000 0.200001 -8.500000 -v -9.600000 0.200001 -8.500000 -v -1.600000 0.200001 -8.500000 -v -5.400000 0.200001 -8.500000 -v -5.400000 0.200002 -9.900000 -v 12.700000 0.200002 -9.900000 -v -9.600000 0.300001 -7.200000 -v -1.600000 0.300001 -7.200000 -v -9.400000 0.300001 -7.800000 -v -9.300000 0.300001 -7.800000 -v -2.000000 0.300001 -7.800000 -v -1.900000 0.300001 -7.800000 -v -9.900000 0.300001 -7.800000 -v -9.800000 0.300001 -7.800000 -v -9.900000 0.300001 -7.900000 -v -9.800000 0.300001 -7.900000 -v -9.400000 0.300001 -7.900000 -v -9.300000 0.300001 -7.900000 -v -2.000000 0.300001 -7.900000 -v -1.900000 0.300001 -7.900000 -v -9.600000 0.300001 -8.500000 -v -5.400000 0.300001 -8.500000 -v -1.600000 0.300001 -8.500000 -v -12.700000 0.300002 -9.200000 -v -12.800000 0.300001 -8.500000 -v -12.600000 0.300002 -9.200000 -v -5.700000 0.300002 -9.200000 -v -5.600000 0.300002 -9.200000 -v -12.700000 0.300002 -9.300000 -v -12.600000 0.300002 -9.300000 -v -5.700000 0.300002 -9.300000 -v -5.600000 0.300002 -9.300000 -v -12.800000 0.300002 -9.900000 -v -5.400000 0.300002 -9.900000 -v -9.400000 0.400001 -7.800000 -v -9.300000 0.400001 -7.800000 -v -9.400000 0.400001 -7.900000 -v -9.300000 0.400001 -7.900000 -v -2.000000 0.400001 -7.800000 -v -1.900000 0.400001 -7.800000 -v -2.000000 0.400001 -7.900000 -v -1.900000 0.400001 -7.900000 -v -12.700000 0.400001 -9.200000 -v -12.600000 0.400001 -9.200000 -v -12.700000 0.400002 -9.300000 -v -12.600000 0.400002 -9.300000 -v -5.700000 0.400001 -9.200000 -v -5.600000 0.400001 -9.200000 -v -5.700000 0.400002 -9.300000 -v -5.600000 0.400002 -9.300000 -v -8.200000 6.999999 10.000001 -v -6.400000 6.999999 10.000001 -v -8.200000 6.999999 9.900001 -v -6.400000 6.999999 9.900001 -v -6.200000 6.999999 10.000001 -v -4.600000 6.999999 10.000001 -v -6.200000 6.999999 9.900001 -v -4.600000 6.999999 9.900001 -v 4.600000 6.999999 10.000001 -v 6.200000 6.999999 10.000001 -v 4.600000 6.999999 9.900001 -v 6.200000 6.999999 9.900001 -v 6.400000 6.999999 10.000001 -v 8.200000 6.999999 10.000001 -v 6.400000 6.999999 9.900001 -v 8.200000 6.999999 9.900001 -v -8.200000 6.999999 9.800001 -v -6.400000 6.999999 9.800001 -v -6.200000 6.999999 9.800001 -v -4.600000 6.999999 9.800001 -v 4.600000 6.999999 9.800001 -v 6.200000 6.999999 9.800001 -v 6.400000 6.999999 9.800001 -v 8.200000 6.999999 9.800001 -v -8.200000 7.000001 -9.799999 -v -6.400000 7.000001 -9.799999 -v -8.200000 7.000001 -9.899999 -v -6.400000 7.000001 -9.899999 -v -6.200000 7.000001 -9.799999 -v -4.600000 7.000001 -9.799999 -v -6.200000 7.000001 -9.899999 -v -4.600000 7.000001 -9.899999 -v 4.600000 7.000001 -9.799999 -v 6.200000 7.000001 -9.799999 -v 4.600000 7.000001 -9.899999 -v 6.200000 7.000001 -9.899999 -v 6.400000 7.000001 -9.799999 -v 8.200000 7.000001 -9.799999 -v 6.400000 7.000001 -9.899999 -v 8.200000 7.000001 -9.899999 -v -8.200000 7.000001 -9.999999 -v -6.400000 7.000001 -9.999999 -v -6.200000 7.000001 -9.999999 -v -4.600000 7.000001 -9.999999 -v 4.600000 7.000001 -9.999999 -v 6.200000 7.000001 -9.999999 -v 6.400000 7.000001 -9.999999 -v 8.200000 7.000001 -9.999999 -v -8.200000 10.099998 10.000002 -v -6.400000 10.099998 10.000002 -v -8.200000 10.099998 9.900002 -v -6.200000 10.099998 10.000002 -v -4.600000 10.099998 10.000002 -v -4.600000 10.099998 9.900002 -v 4.600000 10.099998 10.000002 -v 6.200000 10.099998 10.000002 -v 4.600000 10.099998 9.900002 -v 6.400000 10.099998 10.000002 -v 8.200000 10.099998 10.000002 -v 8.200000 10.099998 9.900002 -v -8.200000 10.099998 9.800002 -v -6.400000 10.099998 9.800002 -v -6.200000 10.099998 9.800002 -v -4.600000 10.099998 9.800002 -v 4.600000 10.099998 9.800002 -v 6.200000 10.099998 9.800002 -v 6.400000 10.099998 9.800002 -v 8.200000 10.099998 9.800002 -v -8.200000 10.100002 -9.799998 -v -6.400000 10.100002 -9.799998 -v -8.200000 10.100002 -9.899998 -v -6.200000 10.100002 -9.799998 -v -4.600000 10.100002 -9.799998 -v -4.600000 10.100002 -9.899998 -v 4.600000 10.100002 -9.799998 -v 6.200000 10.100002 -9.799998 -v 4.600000 10.100002 -9.899998 -v 6.400000 10.100002 -9.799998 -v 8.200000 10.100002 -9.799998 -v 8.200000 10.100002 -9.899998 -v -8.200000 10.100002 -9.999998 -v -6.400000 10.100002 -9.999998 -v -6.200000 10.100002 -9.999998 -v -4.600000 10.100002 -9.999998 -v 4.600000 10.100002 -9.999998 -v 6.200000 10.100002 -9.999998 -v 6.400000 10.100002 -9.999998 -v 8.200000 10.100002 -9.999998 -v -8.400000 13.199998 9.900002 -v -4.400000 13.199998 9.900002 -v -8.400000 13.199998 9.800002 -v -4.400000 13.199998 9.800002 -v 4.400000 13.199998 9.900002 -v 8.400000 13.199998 9.900002 -v 4.400000 13.199998 9.800002 -v 8.400000 13.199998 9.800002 -v -8.400000 13.200002 -9.799998 -v -4.400000 13.200002 -9.799998 -v -8.400000 13.200002 -9.899998 -v -4.400000 13.200002 -9.899998 -v 4.400000 13.200002 -9.799998 -v 8.400000 13.200002 -9.799998 -v 4.400000 13.200002 -9.899998 -v 8.400000 13.200002 -9.899998 -v -12.800000 19.999998 10.000003 -v 12.800000 19.999998 10.000003 -v -12.800000 19.999998 9.900002 -v 12.800000 19.999998 9.900002 -v -12.800000 20.000002 -9.899997 -v 12.800000 20.000002 -9.899997 -v -12.800000 20.000002 -9.999997 -v 12.800000 20.000002 -9.999997 -v -12.800000 0.199998 9.900000 -v -12.800000 0.199998 9.900000 -v -12.800000 0.199998 9.900000 -v -12.800000 -0.000002 9.900000 -v -12.800000 -0.000002 10.000000 -v -12.800000 -0.000002 10.000000 -v -12.800000 0.000002 -9.900000 -v -12.800000 0.000002 -9.900000 -v -12.800000 0.000002 -9.900000 -v -12.800000 0.000002 -9.900000 -v 6.400000 10.100002 -9.999998 -v 6.400000 10.100002 -9.999998 -v 6.400000 10.100002 -9.999998 -v 8.200000 9.900002 -9.999998 -v 8.200000 9.900002 -9.999998 -v 8.200000 9.900002 -9.999998 -v -4.600000 10.100002 -9.899998 -v -4.600000 10.100002 -9.899998 -v -6.200000 10.100002 -9.999998 -v -6.400000 9.900002 -9.999998 -v -6.400000 9.900002 -9.999998 -v -6.400000 9.900002 -9.999998 -v -6.400000 10.100002 -9.999998 -v -6.400000 10.100002 -9.999998 -v -4.400000 13.199998 9.900002 -v -8.400000 13.199998 9.800002 -v -12.800000 19.999998 10.000003 -v -12.800000 19.999998 10.000003 -v -12.800000 19.999998 10.000003 -v -12.800000 19.999998 10.000003 -v -12.800000 19.999998 10.000003 -v -12.800000 19.999998 10.000003 -v -12.800000 19.999998 10.000003 -v -12.800000 19.999998 10.000003 -v -12.800000 19.999998 10.000003 -v -12.800000 19.999998 10.000003 -v -12.800000 19.999998 10.000003 -v -8.200000 9.899998 10.000002 -v -8.200000 9.899998 10.000002 -v -8.200000 10.099998 10.000002 -v -8.200000 10.099998 10.000002 -v -8.200000 10.099998 10.000002 -v -8.200000 12.999998 10.000002 -v -6.200000 10.099998 9.800002 -v -6.200000 10.099998 9.800002 -v -6.200000 10.099998 9.800002 -v -4.600000 9.899998 9.800002 -v -4.600000 9.899998 9.800002 -v -4.600000 9.899998 9.800002 -v -6.400000 12.999998 10.000002 -v -6.400000 12.999998 10.000002 -v -6.400000 12.999998 10.000002 -v -6.400000 12.999998 10.000002 -v -6.400000 12.999998 10.000002 -v -6.200000 12.999998 10.000002 -v -6.200000 12.999998 10.000002 -v 8.400000 13.199998 9.900002 -v 8.400000 13.199998 9.900002 -v 8.400000 13.199998 9.900002 -v 12.700000 0.199998 9.900000 -v 12.700000 0.199998 9.900000 -v 12.700000 0.199998 9.900000 -v 12.700000 0.199998 9.900000 -v -6.400000 12.999998 10.000002 -v -6.400000 10.099998 9.800002 -v -6.400000 10.099998 9.800002 -v -4.600000 12.999998 10.000002 -v -4.600000 12.999998 10.000002 -v -4.600000 12.999998 10.000002 -v -4.600000 12.999998 10.000002 -v -4.600000 12.999998 10.000002 -v 4.600000 10.099998 10.000002 -v 4.600000 10.099998 10.000002 -v 4.600000 10.099998 10.000002 -v 4.600000 12.999998 10.000002 -v 4.600000 12.999998 10.000002 -v 6.200000 12.999998 10.000002 -v 6.200000 12.999998 10.000002 -v 6.200000 12.999998 10.000002 -v 6.200000 12.999998 10.000002 -v 6.200000 12.999998 10.000002 -v 6.400000 12.999998 10.000002 -v 6.400000 12.999998 10.000002 -v 6.200000 9.900002 -9.799998 -v 6.200000 9.900002 -9.799998 -v 6.200000 9.900002 -9.799998 -v 6.200000 10.100002 -9.799998 -v 6.200000 10.100002 -9.799998 -v 8.200000 12.999998 10.000002 -v 8.200000 12.999998 10.000002 -v 8.200000 12.999998 10.000002 -v 12.800000 -0.000002 10.000000 -v 12.800000 -0.000002 10.000000 -v 12.800000 -0.000002 10.000000 -v 12.800000 -0.000002 10.000000 -v 12.800000 19.999998 10.000003 -v -6.400000 7.000001 -9.799999 -v -6.400000 7.000001 -9.799999 -v -6.200000 7.000001 -9.799999 -v -6.200000 7.000001 -9.799999 -v -6.200000 7.000001 -9.799999 -v -6.200000 7.000001 -9.799999 -v -6.200000 7.000001 -9.799999 -v -4.600000 13.000002 -9.799998 -v -4.600000 10.100002 -9.899998 -v -4.600000 10.100002 -9.899998 -v 8.200000 10.099998 10.000002 -v 8.200000 10.099998 10.000002 -v -8.400000 13.200002 -9.799998 -v -8.400000 13.200002 -9.799998 -v -8.400000 13.200002 -9.799998 -v -8.400000 13.200002 -9.799998 -v -8.400000 13.200002 -9.799998 -v -8.400000 13.200002 -9.799998 -v -8.400000 13.200002 -9.799998 -v -8.200000 9.900002 -9.799998 -v -8.200000 9.900002 -9.799998 -v -8.200000 10.100002 -9.799998 -v -8.200000 10.100002 -9.799998 -v -8.200000 10.100002 -9.799998 -v -8.200000 13.000002 -9.799998 -v -6.400000 13.000002 -9.799998 -v -6.400000 13.000002 -9.799998 -v -6.400000 13.000002 -9.799998 -v -6.400000 13.000002 -9.799998 -v -6.400000 13.000002 -9.799998 -v -6.200000 13.000002 -9.799998 -v -6.200000 13.000002 -9.799998 -v -4.600000 13.000002 -9.799998 -v -4.600000 13.000002 -9.799998 -v -4.600000 13.000002 -9.799998 -v -4.400000 6.800002 -9.799999 -v -4.400000 6.800002 -9.799999 -v -4.400000 6.800002 -9.799999 -v -4.400000 6.800002 -9.799999 -v -4.400000 13.200002 -9.799998 -v -9.600000 0.200001 -7.200000 -v -9.600000 0.200001 -7.200000 -v -9.600000 0.200001 -7.200000 -v -9.600000 0.200001 -7.200000 -v -9.600000 0.200001 -7.200000 -v -9.900000 0.200001 -7.800000 -v -9.900000 0.200001 -7.800000 -v -9.800000 0.200001 -7.900000 -v -9.800000 0.200001 -7.900000 -v -9.800000 0.200001 -7.900000 -v -2.000000 0.300001 -7.800000 -v -2.000000 0.300001 -7.800000 -v -2.000000 0.300001 -7.800000 -v -9.300000 0.300001 -7.900000 -v -9.300000 0.300001 -7.900000 -v -9.300000 0.300001 -7.900000 -v 12.800000 19.899998 9.900002 -v 12.800000 19.899998 9.900002 -v -12.800000 0.199998 9.900000 -v -12.800000 0.199998 9.900000 -v -12.800000 0.199998 9.900000 -v -9.600000 0.300001 -7.200000 -v -9.600000 0.300001 -7.200000 -v -9.400000 0.300001 -7.800000 -v -9.400000 0.300001 -7.800000 -v -6.200000 9.899998 9.800002 -v -6.200000 9.899998 9.800002 -v -9.900000 0.200001 -7.900000 -v -9.900000 0.200001 -7.900000 -v 6.200000 9.899998 9.800002 -v 6.200000 9.899998 9.800002 -v 6.200000 9.899998 9.800002 -v 6.200000 10.099998 9.800002 -v 6.200000 10.099998 9.800002 -v 6.400000 6.999999 9.800001 -v 6.400000 6.999999 9.800001 -v 6.400000 6.999999 9.800001 -v 6.400000 6.999999 9.800001 -v 6.400000 6.999999 9.800001 -v 6.200000 9.900002 -9.999998 -v 6.200000 9.900002 -9.999998 -v 6.200000 9.900002 -9.999998 -v 6.200000 10.100002 -9.999998 -v 6.200000 10.100002 -9.999998 -v -2.000000 0.400001 -7.900000 -v -1.900000 0.300001 -7.900000 -v 4.400000 6.800002 -9.799999 -v 4.400000 6.800002 -9.799999 -v 4.400000 6.800002 -9.799999 -v 4.400000 6.800002 -9.799999 -v 6.200000 7.000001 -9.799999 -v 6.200000 7.000001 -9.799999 -v -8.200000 6.999999 10.000001 -v -8.200000 6.999999 10.000001 -v -12.800000 -0.000002 10.000000 -v -12.800000 -0.000002 10.000000 -v -12.800000 -0.000002 10.000000 -v -12.800000 -0.000002 10.000000 -v -12.800000 -0.000002 10.000000 -v -12.800000 -0.000002 10.000000 -v -12.800000 -0.000002 10.000000 -v -12.800000 -0.000002 10.000000 -v -6.400000 12.999998 9.900002 -v -4.600000 9.899998 9.900002 -v -4.600000 9.899998 9.900002 -v -4.600000 6.999999 9.800001 -v -1.900000 0.300001 -7.800000 -v -2.000000 0.400001 -7.800000 -v -4.600000 13.000002 -9.899998 -v -4.600000 13.000002 -9.899998 -v -4.600000 12.999998 9.900002 -v -4.600000 12.999998 9.900002 -v -6.200000 12.999998 9.800002 -v -8.200000 7.000001 -9.799999 -v -8.200000 7.000001 -9.799999 -v -8.400000 6.800002 -9.799999 -v -8.400000 6.800002 -9.799999 -v -8.400000 6.800002 -9.799999 -v -8.400000 6.800002 -9.799999 -v 6.200000 13.000002 -9.799998 -v 6.200000 10.100002 -9.999998 -v 6.200000 10.100002 -9.999998 -v 8.200000 13.000002 -9.899998 -v 8.200000 13.000002 -9.899998 -v 6.400000 13.000002 -9.999998 -v 6.400000 10.100002 -9.799998 -v 6.400000 10.100002 -9.799998 -v 6.400000 10.100002 -9.799998 -v 8.200000 9.900002 -9.799998 -v 8.200000 9.900002 -9.799998 -v 8.200000 9.900002 -9.799998 -v -8.200000 7.000001 -9.899999 -v -8.200000 7.000001 -9.899999 -v -8.200000 9.900002 -9.799998 -v -8.200000 9.900002 -9.899998 -v -8.200000 9.900002 -9.899998 -v -12.800000 20.000002 -9.999997 -v -12.800000 20.000002 -9.999997 -v -12.800000 20.000002 -9.999997 -v -12.800000 20.000002 -9.999997 -v -12.800000 20.000002 -9.999997 -v -12.800000 20.000002 -9.999997 -v -12.800000 20.000002 -9.999997 -v -12.800000 20.000002 -9.999997 -v -12.800000 20.000002 -9.999997 -v -12.800000 20.000002 -9.999997 -v -12.800000 20.000002 -9.999997 -v -8.200000 7.000001 -9.999999 -v -8.200000 7.000001 -9.999999 -v 6.200000 6.999999 9.800001 -v 6.200000 6.999999 9.800001 -v -8.200000 9.900002 -9.999998 -v -8.200000 9.900002 -9.999998 -v -6.400000 7.000001 -9.799999 -v -8.200000 7.000001 -9.899999 -v -8.200000 7.000001 -9.899999 -v -6.400000 6.999999 9.800001 -v -6.400000 6.999999 9.800001 -v -6.200000 6.999999 9.800001 -v -6.200000 6.999999 9.800001 -v -6.200000 6.999999 9.800001 -v -6.200000 6.999999 9.800001 -v -6.200000 6.999999 9.800001 -v 4.600000 6.999999 9.800001 -v 4.600000 9.899998 9.900002 -v 4.600000 9.899998 9.900002 -v 4.600000 10.100002 -9.899998 -v 4.600000 10.100002 -9.899998 -v 4.600000 13.000002 -9.799998 -v 4.600000 13.000002 -9.899998 -v 4.600000 13.000002 -9.899998 -v 6.400000 10.099998 10.000002 -v 8.200000 10.099998 9.900002 -v 8.200000 10.099998 9.900002 -v -6.200000 10.100002 -9.799998 -v -12.800000 19.899998 9.900002 -v -12.800000 19.899998 9.900002 -v -12.800000 19.899998 9.900002 -v -4.600000 13.000002 -9.999998 -v -4.600000 13.000002 -9.999998 -v -4.600000 13.000002 -9.999998 -v -4.600000 13.000002 -9.999998 -v -4.600000 13.000002 -9.999998 -v 12.700000 0.000002 -9.900000 -v 12.700000 0.000002 -9.900000 -v -12.800000 0.000002 -10.000000 -v -12.800000 0.000002 -10.000000 -v -9.900000 0.300001 -7.800000 -v -9.900000 0.200001 -7.900000 -v 4.600000 13.000002 -9.999998 -v 4.600000 13.000002 -9.999998 -v 4.400000 6.800002 -9.899999 -v 8.400000 6.800002 -9.799999 -v -8.400000 13.200002 -9.799998 -v -8.400000 6.800002 -9.899999 -v 4.600000 9.899998 10.000002 -v 4.600000 9.899998 10.000002 -v -5.600000 0.400001 -9.200000 -v -5.700000 0.400002 -9.300000 -v -12.800000 0.300001 -8.500000 -v -12.800000 0.300001 -8.500000 -v -12.700000 0.300002 -9.300000 -v -12.700000 0.300002 -9.300000 -v -6.200000 12.999998 9.900002 -v -6.200000 12.999998 9.900002 -v -4.600000 12.999998 10.000002 -v -12.800000 0.000002 -10.000000 -v -12.800000 0.000002 -10.000000 -v -12.800000 0.000002 -10.000000 -v -12.800000 0.000002 -10.000000 -v -12.800000 0.000002 -10.000000 -v -12.800000 0.000002 -10.000000 -v -12.800000 0.000002 -10.000000 -v -12.800000 0.000002 -10.000000 -v 6.200000 9.899998 10.000002 -v 6.200000 9.899998 10.000002 -v 6.200000 6.999999 9.900001 -v 6.200000 6.999999 9.800001 -v 8.200000 9.900002 -9.899998 -v 8.200000 9.900002 -9.899998 -v 6.400000 9.900002 -9.799998 -v 6.400000 13.000002 -9.899998 -v 6.400000 13.000002 -9.899998 -v 8.200000 13.000002 -9.799998 -v 6.200000 13.000002 -9.899998 -v 8.200000 12.999998 10.000002 -v 8.200000 10.099998 9.900002 -v 8.200000 10.099998 9.900002 -v 8.400000 6.800002 -9.799999 -v 8.400000 6.800002 -9.799999 -v 8.400000 6.800002 -9.799999 -v 8.400000 6.800002 -9.799999 -v 4.600000 7.000001 -9.999999 -v 4.600000 7.000001 -9.999999 -v 4.600000 7.000001 -9.999999 -v 4.600000 7.000001 -9.999999 -v 4.600000 7.000001 -9.999999 -v 8.400000 13.200002 -9.899998 -v 8.400000 13.200002 -9.899998 -v 8.400000 13.200002 -9.899998 -v 12.800000 19.900002 -9.899997 -v 12.800000 19.900002 -9.899997 -v -6.200000 6.999999 9.900001 -v -6.200000 6.999999 9.900001 -v -4.600000 6.999999 9.900001 -v -4.600000 6.999999 9.900001 -v -6.200000 10.100002 -9.999998 -v -6.200000 10.100002 -9.999998 -v -6.200000 13.000002 -9.799998 -v -6.200000 13.000002 -9.899998 -v -4.600000 10.100002 -9.799998 -v -4.600000 10.100002 -9.799998 -v 6.200000 12.999998 9.800002 -v 6.200000 12.999998 9.800002 -v 6.200000 12.999998 9.800002 -v 6.200000 12.999998 9.800002 -v 6.200000 12.999998 9.800002 -v 6.400000 12.999998 9.800002 -v 6.400000 12.999998 9.800002 -v -8.400000 6.799999 9.800001 -v -8.400000 6.799999 9.800001 -v -8.400000 6.799999 9.800001 -v -8.400000 6.799999 9.800001 -v -8.200000 6.999999 9.800001 -v -8.200000 6.999999 9.800001 -v -9.600000 0.300001 -8.500000 -v -9.600000 0.300001 -8.500000 -v -9.600000 0.300001 -8.500000 -v -9.600000 0.300001 -8.500000 -v -9.600000 0.300001 -8.500000 -v -9.600000 0.300001 -8.500000 -v -12.700000 0.300002 -9.200000 -v -12.700000 0.300002 -9.200000 -v -12.700000 0.300002 -9.200000 -v 6.400000 7.000001 -9.899999 -v 6.400000 7.000001 -9.899999 -v 8.200000 7.000001 -9.899999 -v 8.200000 7.000001 -9.899999 -v -5.700000 0.400002 -9.300000 -v -5.600000 0.300002 -9.300000 -v -12.800000 20.000002 -9.899997 -v -12.800000 20.000002 -9.899997 -v 12.800000 20.000002 -9.899997 -v 12.800000 20.000002 -9.899997 -v 12.700000 0.000002 -9.900000 -v 12.700000 0.199998 9.900000 -v 6.400000 9.900002 -9.999998 -v 6.400000 9.900002 -9.999998 -v -12.800000 0.200001 -8.500000 -v -12.800000 0.300001 -8.500000 -v -12.800000 0.300002 -9.900000 -v -12.800000 0.300002 -9.900000 -v 4.600000 9.899998 9.900002 -v 6.200000 9.899998 10.000002 -v 6.200000 9.899998 10.000002 -v 12.800000 0.000002 -9.900000 -v 8.200000 6.999999 10.000001 -v 6.400000 6.999999 9.900001 -v 6.400000 6.999999 9.900001 -v -5.400000 0.300001 -8.500000 -v -5.400000 0.300001 -8.500000 -v -5.400000 0.300001 -8.500000 -v -5.400000 0.300001 -8.500000 -v -5.400000 0.300001 -8.500000 -v -5.400000 0.300001 -8.500000 -v -5.400000 0.300001 -8.500000 -v -6.400000 6.999999 10.000001 -v -6.400000 6.999999 10.000001 -v -6.200000 6.999999 10.000001 -v -6.200000 6.999999 10.000001 -v -6.200000 6.999999 10.000001 -v -6.200000 6.999999 10.000001 -v -6.200000 6.999999 10.000001 -v -4.600000 6.999999 10.000001 -v -4.600000 6.999999 10.000001 -v 4.600000 6.999999 10.000001 -v 4.600000 6.999999 10.000001 -v 4.600000 6.999999 10.000001 -v 4.600000 6.999999 10.000001 -v 4.600000 6.999999 10.000001 -v 6.200000 6.999999 10.000001 -v 6.200000 6.999999 10.000001 -v 6.400000 6.999999 10.000001 -v 6.400000 6.999999 10.000001 -v 6.400000 6.999999 10.000001 -v 6.400000 6.999999 10.000001 -v 6.400000 6.999999 10.000001 -v 8.200000 6.999999 10.000001 -v 8.200000 6.999999 10.000001 -v 6.400000 9.900002 -9.999998 -v -4.600000 10.100002 -9.999998 -v 12.800000 0.000002 -10.000000 -v 12.800000 0.000002 -10.000000 -v 12.800000 0.000002 -10.000000 -v 12.800000 0.000002 -10.000000 -v -6.200000 10.100002 -9.999998 -v -6.200000 10.100002 -9.999998 -v -6.200000 10.100002 -9.999998 -v -4.600000 9.900002 -9.999998 -v -4.600000 9.900002 -9.999998 -v -4.600000 9.900002 -9.999998 -v -4.600000 7.000001 -9.799999 -v -4.600000 7.000001 -9.799999 -v 12.700000 0.199998 9.900000 -v 12.700000 0.199998 9.900000 -v 12.700000 0.199998 9.900000 -v 8.200000 12.999998 9.900002 -v 8.200000 12.999998 9.900002 -v 4.400000 13.199998 9.800002 -v 4.400000 13.199998 9.800002 -v 4.400000 13.199998 9.800002 -v 4.400000 13.199998 9.800002 -v 4.400000 13.199998 9.800002 -v 4.400000 13.199998 9.800002 -v 4.400000 13.199998 9.800002 -v 4.600000 9.899998 9.800002 -v 4.600000 9.899998 9.800002 -v -1.600000 0.200001 -8.500000 -v -1.600000 0.200001 -8.500000 -v -1.600000 0.200001 -8.500000 -v -9.300000 0.300001 -7.800000 -v -9.300000 0.300001 -7.800000 -v -9.800000 0.200001 -7.900000 -v -9.800000 0.300001 -7.800000 -v -12.600000 0.300002 -9.200000 -v -12.600000 0.300002 -9.200000 -v -5.700000 0.300002 -9.200000 -v -5.700000 0.300002 -9.200000 -v -5.700000 0.300002 -9.200000 -v -8.200000 7.000001 -9.999999 -v -6.200000 6.999999 9.900001 -v -6.200000 9.899998 10.000002 -v -6.200000 9.899998 10.000002 -v 6.200000 9.899998 10.000002 -v 6.200000 9.899998 10.000002 -v 6.200000 9.899998 10.000002 -v -6.200000 6.999999 9.800001 -v 8.200000 12.999998 9.800002 -v 8.200000 12.999998 9.800002 -v 8.200000 12.999998 9.800002 -v -4.400000 6.800002 -9.899999 -v -4.400000 13.200002 -9.799998 -v -6.400000 10.099998 10.000002 -v -6.400000 10.099998 10.000002 -v -6.400000 10.100002 -9.799998 -v -6.400000 10.100002 -9.799998 -v -8.200000 10.100002 -9.899998 -v -5.400000 0.200002 -9.900000 -v -5.400000 0.200002 -9.900000 -v -5.400000 0.200002 -9.900000 -v 4.400000 6.800002 -9.899999 -v 4.400000 6.800002 -9.899999 -v 4.400000 6.800002 -9.899999 -v 6.400000 7.000001 -9.999999 -v 4.600000 10.100002 -9.999998 -v 6.200000 10.099998 10.000002 -v 6.200000 10.099998 10.000002 -v 4.600000 10.099998 9.800002 -v 6.400000 7.000001 -9.999999 -v 6.400000 7.000001 -9.999999 -v 6.400000 7.000001 -9.999999 -v 6.400000 7.000001 -9.999999 -v 6.400000 7.000001 -9.999999 -v 8.200000 7.000001 -9.999999 -v 8.200000 7.000001 -9.999999 -v 8.400000 13.199998 9.900002 -v 4.400000 13.199998 9.800002 -v -12.800000 20.000002 -9.999997 -v -6.200000 9.900002 -9.999998 -v -6.200000 9.900002 -9.999998 -v -4.600000 9.900002 -9.799998 -v -4.600000 7.000001 -9.899999 -v -4.600000 7.000001 -9.899999 -v 8.200000 10.100002 -9.999998 -v 8.200000 10.100002 -9.999998 -v 8.400000 6.799999 9.800001 -v 8.400000 6.799999 9.800001 -v 8.400000 6.799999 9.800001 -v 8.400000 6.799999 9.800001 -v 4.400000 13.200002 -9.799998 -v 4.400000 13.200002 -9.799998 -v 4.400000 13.200002 -9.799998 -v 4.400000 13.200002 -9.799998 -v 4.400000 13.200002 -9.799998 -v 4.400000 13.200002 -9.799998 -v 4.400000 13.200002 -9.799998 -v 4.600000 9.900002 -9.799998 -v 4.600000 9.900002 -9.799998 -v 4.600000 10.100002 -9.799998 -v 4.600000 10.100002 -9.799998 -v 4.600000 10.100002 -9.799998 -v 4.600000 13.000002 -9.799998 -v 6.200000 13.000002 -9.799998 -v 6.200000 13.000002 -9.799998 -v 6.200000 13.000002 -9.799998 -v 6.200000 13.000002 -9.799998 -v 6.200000 13.000002 -9.799998 -v 6.400000 13.000002 -9.799998 -v 6.400000 13.000002 -9.799998 -v 8.200000 13.000002 -9.799998 -v 8.200000 13.000002 -9.799998 -v 8.200000 13.000002 -9.799998 -v 8.400000 13.200002 -9.799998 -v -12.800000 0.200001 -8.500000 -v -12.800000 0.200001 -8.500000 -v -5.700000 0.300002 -9.300000 -v -5.700000 0.300002 -9.300000 -v -12.800000 0.300002 -9.900000 -v -12.800000 0.300002 -9.900000 -v -12.800000 0.300002 -9.900000 -v -12.800000 0.300002 -9.900000 -v -6.200000 6.999999 9.800001 -v -4.400000 6.799999 9.800001 -v -4.400000 6.799999 9.800001 -v -4.400000 6.799999 9.800001 -v -4.400000 6.799999 9.800001 -v 6.400000 9.899998 9.800002 -v 6.400000 9.899998 9.800002 -v 6.400000 10.099998 9.800002 -v 6.400000 10.099998 9.800002 -v 6.400000 10.099998 9.800002 -v -1.900000 0.300001 -7.900000 -v -1.900000 0.300001 -7.900000 -v -1.900000 0.300001 -7.900000 -v -1.900000 0.300001 -7.900000 -v -1.600000 0.300001 -8.500000 -v -8.200000 9.900002 -9.899998 -v -6.400000 9.900002 -9.799998 -v -6.400000 9.900002 -9.799998 -v -4.600000 10.100002 -9.999998 -v -4.600000 10.100002 -9.999998 -v 6.400000 13.000002 -9.999998 -v 6.400000 13.000002 -9.999998 -v 8.200000 13.000002 -9.999998 -v 8.200000 13.000002 -9.999998 -v 8.200000 13.000002 -9.999998 -v 12.800000 20.000002 -9.999997 -v -5.400000 0.300001 -8.500000 -v -1.600000 0.200001 -8.500000 -v -6.400000 9.899998 10.000002 -v -6.400000 9.899998 10.000002 -v -6.400000 9.899998 10.000002 -v -4.600000 9.899998 9.900002 -v -4.600000 9.899998 9.900002 -v -6.200000 9.899998 10.000002 -v 8.200000 9.899998 9.800002 -v 8.200000 9.899998 9.800002 -v 8.200000 9.899998 9.800002 -v -6.200000 9.899998 9.800002 -v -4.600000 10.099998 9.800002 -v -4.600000 10.099998 9.800002 -v -6.400000 13.000002 -9.799998 -v -6.400000 10.100002 -9.999998 -v -6.400000 10.100002 -9.999998 -v -1.600000 0.200001 -7.200000 -v -9.600000 0.300001 -7.200000 -v -4.600000 9.900002 -9.899998 -v -4.600000 9.900002 -9.899998 -v -9.600000 0.200001 -8.500000 -v -12.800000 0.300001 -8.500000 -v -6.200000 9.900002 -9.799998 -v -6.200000 9.900002 -9.799998 -v 6.200000 12.999998 9.900002 -v 6.200000 12.999998 9.900002 -v 4.600000 12.999998 9.800002 -v -6.400000 9.900002 -9.799998 -v -6.400000 9.900002 -9.799998 -v -6.400000 9.900002 -9.799998 -v -6.400000 13.000002 -9.899998 -v -6.400000 13.000002 -9.899998 -v -8.200000 13.000002 -9.999998 -v 4.600000 7.000001 -9.799999 -v 4.600000 7.000001 -9.799999 -v 8.200000 10.099998 9.800002 -v -9.600000 0.200001 -8.500000 -v 12.700000 0.200002 -9.900000 -v 12.700000 0.200002 -9.900000 -v 12.700000 0.200002 -9.900000 -v 12.700000 0.200002 -9.900000 -v 12.800000 0.000002 -9.900000 -v -5.600000 0.300002 -9.300000 -v -5.600000 0.300002 -9.300000 -v -5.600000 0.300002 -9.300000 -v -5.400000 0.300002 -9.900000 -v -9.300000 0.400001 -7.800000 -v -9.400000 0.400001 -7.900000 -v -1.600000 0.200001 -7.200000 -v -4.600000 6.999999 9.800001 -v -4.600000 6.999999 9.800001 -v -4.600000 7.000001 -9.799999 -v -6.200000 7.000001 -9.899999 -v -6.200000 7.000001 -9.899999 -v 4.600000 7.000001 -9.899999 -v 4.600000 7.000001 -9.899999 -v 4.600000 9.900002 -9.799998 -v 4.600000 9.900002 -9.899998 -v 4.600000 9.900002 -9.899998 -v -4.600000 7.000001 -9.999999 -v -4.600000 7.000001 -9.999999 -v 6.200000 10.100002 -9.799998 -v 6.200000 10.100002 -9.799998 -v 4.600000 10.100002 -9.899998 -v -12.800000 0.000002 -10.000000 -v -12.800000 0.000002 -10.000000 -v -12.800000 0.000002 -10.000000 -v 4.600000 10.100002 -9.999998 -v -8.400000 6.799999 9.800001 -v -4.400000 6.799999 9.900001 -v -9.600000 0.300001 -7.200000 -v -9.600000 0.200001 -8.500000 -v -4.600000 6.999999 10.000001 -v -8.200000 9.899998 9.900002 -v -6.400000 9.899998 10.000002 -v -6.400000 9.899998 10.000002 -v -6.400000 9.899998 10.000002 -v -6.400000 9.899998 10.000002 -v -6.400000 6.999999 9.900001 -v -6.400000 6.999999 9.800001 -v -6.400000 13.000002 -9.899998 -v -12.800000 -0.000002 9.900000 -v -12.800000 -0.000002 9.900000 -v 12.800000 -0.000002 10.000000 -v 12.800000 -0.000002 10.000000 -v 8.200000 9.899998 10.000002 -v 8.200000 9.899998 10.000002 -v 8.200000 9.899998 10.000002 -v 4.600000 12.999998 9.900002 -v 4.600000 12.999998 9.900002 -v 6.200000 12.999998 10.000002 -v -2.000000 0.400001 -7.800000 -v -2.000000 0.300001 -7.900000 -v -8.200000 13.000002 -9.899998 -v -8.200000 13.000002 -9.899998 -v -6.400000 13.000002 -9.799998 -v -6.400000 10.100002 -9.799998 -v -6.400000 10.100002 -9.799998 -v 8.200000 9.899998 10.000002 -v 8.200000 6.999999 9.900001 -v 8.200000 6.999999 9.900001 -v 6.400000 12.999998 9.900002 -v 6.400000 12.999998 9.900002 -v 8.200000 12.999998 9.900002 -v 8.200000 12.999998 9.900002 -v -9.800000 0.200001 -7.800000 -v -8.400000 13.199998 9.800002 -v -8.400000 13.199998 9.800002 -v -8.400000 13.199998 9.800002 -v -8.400000 13.199998 9.800002 -v -8.400000 13.199998 9.800002 -v -8.400000 13.199998 9.800002 -v -8.400000 13.199998 9.800002 -v -8.200000 9.899998 9.800002 -v -8.200000 9.899998 9.800002 -v -8.200000 10.099998 9.800002 -v -8.200000 10.099998 9.800002 -v -8.200000 10.099998 9.800002 -v -8.200000 12.999998 9.800002 -v 8.400000 6.799999 9.900001 -v 8.400000 6.799999 9.900001 -v -6.400000 12.999998 9.800002 -v -6.400000 12.999998 9.800002 -v -6.400000 12.999998 9.800002 -v -6.400000 12.999998 9.800002 -v -6.400000 12.999998 9.800002 -v -6.200000 12.999998 9.800002 -v -6.200000 12.999998 9.800002 -v -4.600000 12.999998 9.800002 -v -4.600000 12.999998 9.800002 -v -4.600000 12.999998 9.800002 -v -4.400000 13.199998 9.800002 -v 4.600000 6.999999 9.900001 -v 4.600000 6.999999 9.900001 -v 6.200000 6.999999 9.900001 -v 6.200000 6.999999 9.900001 -v -6.400000 7.000001 -9.899999 -v -6.400000 7.000001 -9.899999 -v -8.200000 10.100002 -9.999998 -v -8.200000 10.100002 -9.999998 -v -8.200000 10.100002 -9.999998 -v -8.200000 13.000002 -9.999998 -v -6.400000 13.000002 -9.999998 -v -6.400000 13.000002 -9.999998 -v -6.400000 13.000002 -9.999998 -v -6.400000 13.000002 -9.999998 -v -6.400000 13.000002 -9.999998 -v -6.200000 13.000002 -9.999998 -v -6.200000 13.000002 -9.999998 -v 4.600000 9.900002 -9.999998 -v 4.600000 9.900002 -9.999998 -v 4.600000 10.100002 -9.999998 -v 4.600000 10.100002 -9.999998 -v 4.600000 10.100002 -9.999998 -v -12.800000 19.900002 -9.899997 -v -12.800000 19.900002 -9.899997 -v -12.800000 19.900002 -9.899997 -v -12.800000 19.900002 -9.899997 -v -12.800000 19.900002 -9.899997 -v -8.400000 13.200002 -9.899998 -v 6.200000 13.000002 -9.999998 -v 6.200000 13.000002 -9.999998 -v 6.200000 13.000002 -9.999998 -v 6.200000 13.000002 -9.999998 -v 6.200000 13.000002 -9.999998 -v 6.400000 10.100002 -9.999998 -v 6.400000 10.100002 -9.999998 -v 6.400000 13.000002 -9.799998 -v 6.400000 13.000002 -9.899998 -v -12.800000 19.900002 -9.899997 -v -12.800000 19.900002 -9.899997 -v -12.800000 19.900002 -9.899997 -v -12.800000 20.000002 -9.899997 -v -12.800000 20.000002 -9.899997 -v -12.800000 19.999998 9.900002 -v -12.800000 19.999998 9.900002 -v 12.800000 19.999998 9.900002 -v 12.800000 19.999998 9.900002 -v -6.200000 10.099998 10.000002 -v -4.600000 10.099998 9.900002 -v -4.600000 10.099998 9.900002 -v -8.200000 9.899998 9.800002 -v -4.600000 7.000001 -9.999999 -v 6.200000 9.900002 -9.799998 -v 6.200000 9.900002 -9.799998 -v 6.200000 7.000001 -9.999999 -v 6.200000 7.000001 -9.899999 -v 8.200000 9.899998 9.900002 -v 8.200000 9.899998 9.900002 -v 6.400000 7.000001 -9.799999 -v 6.400000 7.000001 -9.799999 -v 6.400000 7.000001 -9.799999 -v 6.400000 7.000001 -9.799999 -v 6.400000 7.000001 -9.799999 -v 8.200000 7.000001 -9.799999 -v 8.200000 7.000001 -9.799999 -v -9.800000 0.300001 -7.800000 -v -9.900000 0.300001 -7.900000 -v -9.300000 0.300001 -7.900000 -v -9.300000 0.400001 -7.800000 -v -12.600000 0.300002 -9.300000 -v -12.600000 0.300002 -9.300000 -v -12.600000 0.300002 -9.300000 -v -8.200000 10.099998 9.900002 -v -8.200000 10.099998 9.900002 -v -8.200000 12.999998 10.000002 -v -8.200000 12.999998 9.900002 -v -8.200000 12.999998 9.900002 -v -6.200000 7.000001 -9.899999 -v -6.200000 9.900002 -9.799998 -v -6.200000 9.900002 -9.799998 -v -5.600000 0.300002 -9.300000 -v -5.600000 0.400001 -9.200000 -v 8.200000 10.100002 -9.799998 -v 8.200000 10.100002 -9.799998 -v 4.600000 6.999999 9.800001 -v -1.900000 0.300001 -7.900000 -v -1.900000 0.400001 -7.800000 -v -8.200000 7.000001 -9.999999 -v 4.600000 7.000001 -9.999999 -v -6.400000 7.000001 -9.999999 -v -6.400000 7.000001 -9.999999 -v -6.200000 7.000001 -9.999999 -v -6.200000 7.000001 -9.999999 -v -6.200000 7.000001 -9.999999 -v -6.200000 7.000001 -9.999999 -v -6.200000 7.000001 -9.999999 -v 6.400000 6.999999 9.900001 -v 6.400000 9.899998 10.000002 -v 6.400000 9.899998 10.000002 -v 6.200000 7.000001 -9.999999 -v 6.200000 7.000001 -9.999999 -v -12.800000 19.999998 10.000003 -v -12.800000 19.999998 9.900002 -v -12.800000 19.999998 9.900002 -v 12.700000 -0.000002 9.900000 -v 12.700000 -0.000002 9.900000 -v 12.700000 -0.000002 9.900000 -v 6.400000 10.099998 9.800002 -v 6.400000 10.099998 9.800002 -v 6.400000 12.999998 9.900002 -v -4.400000 13.200002 -9.799998 -v -8.400000 13.200002 -9.899998 -v -6.200000 9.899998 10.000002 -v -6.200000 9.899998 10.000002 -v -6.200000 10.099998 10.000002 -v -6.200000 10.099998 10.000002 -v -6.200000 10.099998 10.000002 -v 6.400000 9.899998 10.000002 -v 6.400000 9.899998 10.000002 -v 6.400000 10.099998 10.000002 -v 6.400000 10.099998 10.000002 -v 6.400000 10.099998 10.000002 -v -6.200000 10.100002 -9.799998 -v -6.200000 10.100002 -9.799998 -v -6.200000 10.100002 -9.799998 -v 6.400000 12.999998 10.000002 -v -9.900000 0.300001 -7.900000 -v -9.800000 0.200001 -7.900000 -v 8.200000 13.000002 -9.799998 -v 8.200000 10.100002 -9.899998 -v 8.200000 10.100002 -9.899998 -v -5.400000 0.200002 -9.900000 -v 12.700000 0.200002 -9.900000 -v -4.400000 13.200002 -9.899998 -v -4.400000 13.200002 -9.899998 -v -4.400000 13.200002 -9.899998 -v 4.400000 13.200002 -9.899998 -v 4.400000 13.200002 -9.899998 -v -12.800000 19.899998 9.900002 -v -12.800000 19.899998 9.900002 -v -12.800000 19.899998 9.900002 -v -12.800000 19.899998 9.900002 -v -12.800000 19.899998 9.900002 -v -8.400000 6.799999 9.900001 -v -8.400000 6.799999 9.900001 -v -8.400000 13.199998 9.900002 -v -2.000000 0.300001 -7.900000 -v -2.000000 0.300001 -7.900000 -v -4.400000 13.199998 9.900002 -v -4.400000 13.199998 9.900002 -v -4.400000 13.199998 9.900002 -v 4.400000 13.199998 9.900002 -v 4.400000 13.199998 9.900002 -v -6.200000 7.000001 -9.999999 -v 6.200000 10.099998 10.000002 -v 6.200000 10.099998 10.000002 -v 6.400000 6.999999 9.800001 -v 12.800000 19.899998 9.900002 -v 12.800000 19.899998 9.900002 -v 12.800000 19.899998 9.900002 -v 12.800000 19.999998 10.000003 -v 12.800000 19.999998 9.900002 -v 12.800000 19.999998 9.900002 -v 4.600000 9.899998 9.800002 -v -4.600000 9.900002 -9.899998 -v -4.600000 9.900002 -9.899998 -v -6.200000 9.900002 -9.799998 -v -6.200000 9.900002 -9.999998 -v -9.800000 0.200001 -7.800000 -v -9.900000 0.300001 -7.800000 -v -12.700000 0.400002 -9.300000 -v -12.600000 0.300002 -9.300000 -v -12.600000 0.300002 -9.200000 -v -12.700000 0.400001 -9.200000 -v 6.400000 12.999998 9.800002 -v -4.600000 13.000002 -9.899998 -v -4.600000 13.000002 -9.899998 -v -6.200000 13.000002 -9.999998 -v 8.200000 6.999999 9.800001 -v 4.600000 10.099998 9.900002 -v -8.400000 6.800002 -9.899999 -v -8.400000 6.800002 -9.899999 -v -8.400000 6.800002 -9.899999 -v 8.200000 13.000002 -9.899998 -v 8.200000 13.000002 -9.899998 -v -12.800000 0.199998 9.900000 -v -12.800000 0.199998 9.900000 -v -12.800000 0.199998 9.900000 -v -12.800000 0.199998 9.900000 -v -4.400000 6.799999 9.900001 -v -4.400000 6.799999 9.900001 -v 4.400000 6.799999 9.900001 -v 4.400000 6.799999 9.900001 -v 4.400000 6.799999 9.900001 -v -8.200000 10.099998 9.800002 -v 12.800000 19.999998 10.000003 -v -6.400000 6.999999 10.000001 -v -8.200000 6.999999 9.900001 -v -8.200000 6.999999 9.900001 -v 8.200000 6.999999 9.800001 -v 8.200000 6.999999 9.800001 -v 6.200000 7.000001 -9.799999 -v 4.600000 7.000001 -9.899999 -v 4.600000 7.000001 -9.899999 -v -1.900000 0.400001 -7.800000 -v -2.000000 0.400001 -7.900000 -v -9.400000 0.300001 -7.900000 -v -9.400000 0.300001 -7.900000 -v -8.200000 12.999998 9.900002 -v -8.200000 12.999998 9.900002 -v -6.400000 12.999998 10.000002 -v -6.400000 10.099998 10.000002 -v -6.400000 10.099998 10.000002 -v -8.200000 10.099998 9.800002 -v -6.400000 12.999998 9.900002 -v -6.400000 12.999998 9.900002 -v 8.400000 6.799999 9.800001 -v 8.400000 13.199998 9.900002 -v 8.200000 10.100002 -9.899998 -v 8.200000 10.100002 -9.899998 -v 6.400000 10.100002 -9.999998 -v 4.400000 6.799999 9.800001 -v 8.400000 6.799999 9.900001 -v -9.400000 0.400001 -7.800000 -v -9.400000 0.300001 -7.900000 -v 12.800000 19.900002 -9.899997 -v 12.800000 19.900002 -9.899997 -v 12.800000 19.900002 -9.899997 -v 12.800000 20.000002 -9.899997 -v 12.800000 20.000002 -9.899997 -v 8.200000 10.099998 9.800002 -v 8.200000 10.099998 9.800002 -v -5.700000 0.400001 -9.200000 -v -5.700000 0.300002 -9.300000 -v -4.600000 12.999998 10.000002 -v -4.600000 10.099998 9.900002 -v -4.600000 10.099998 9.900002 -v 8.200000 12.999998 10.000002 -v 4.400000 13.199998 9.900002 -v 4.400000 6.799999 9.800001 -v 6.400000 9.900002 -9.799998 -v 6.400000 9.900002 -9.799998 -v -6.200000 13.000002 -9.899998 -v -6.200000 13.000002 -9.899998 -v -4.600000 13.000002 -9.799998 -v 4.600000 6.999999 9.800001 -v 4.600000 6.999999 9.800001 -v 4.600000 10.099998 9.800002 -v 4.600000 10.099998 9.800002 -v 4.600000 10.099998 9.800002 -v 4.600000 12.999998 9.800002 -v 8.200000 6.999999 9.900001 -v 8.200000 6.999999 9.900001 -v 8.400000 13.199998 9.800002 -v -4.600000 7.000001 -9.899999 -v -4.600000 7.000001 -9.899999 -v 12.800000 0.000002 -10.000000 -v 12.800000 0.000002 -10.000000 -v -6.400000 9.900002 -9.799998 -v -6.400000 9.900002 -9.799998 -v -6.400000 7.000001 -9.999999 -v -6.400000 7.000001 -9.899999 -v -8.200000 9.900002 -9.999998 -v -4.600000 12.999998 9.900002 -v -4.600000 12.999998 9.900002 -v -12.800000 0.000002 -9.900000 -v -12.800000 0.000002 -9.900000 -v 8.200000 10.100002 -9.999998 -v -8.200000 6.999999 9.900001 -v -8.200000 6.999999 9.900001 -v -8.200000 9.899998 10.000002 -v -8.200000 9.899998 9.900002 -v -8.200000 9.899998 9.900002 -v -6.400000 9.899998 9.800002 -v -6.400000 9.899998 9.800002 -v -6.400000 9.899998 9.800002 -v 4.400000 6.799999 9.800001 -v 4.400000 6.799999 9.800001 -v 4.400000 6.799999 9.800001 -v 4.400000 6.799999 9.800001 -v -5.400000 0.200002 -9.900000 -v -5.400000 0.300001 -8.500000 -v 6.400000 6.999999 9.800001 -v -1.600000 0.200001 -8.500000 -v -1.600000 0.300001 -7.200000 -v -6.200000 7.000001 -9.999999 -v 4.600000 10.099998 9.900002 -v 4.600000 10.099998 9.900002 -v 4.600000 12.999998 10.000002 -v 4.600000 12.999998 9.900002 -v 4.600000 12.999998 9.900002 -v 6.400000 7.000001 -9.899999 -v 6.400000 9.900002 -9.799998 -v 6.400000 9.900002 -9.799998 -v -12.800000 0.300002 -9.900000 -v -5.400000 0.300002 -9.900000 -v -5.400000 0.300002 -9.900000 -v -8.200000 10.100002 -9.999998 -v -6.400000 10.099998 9.800002 -v -6.400000 10.099998 9.800002 -v 8.400000 13.200002 -9.799998 -v 4.400000 13.200002 -9.899998 -v 12.800000 -0.000002 10.000000 -v 4.600000 9.900002 -9.899998 -v 6.200000 9.900002 -9.799998 -v 6.200000 9.900002 -9.799998 -v 6.200000 12.999998 10.000002 -v 6.200000 10.099998 9.800002 -v 6.200000 10.099998 9.800002 -v 8.200000 9.900002 -9.799998 -v 8.200000 7.000001 -9.899999 -v 8.200000 7.000001 -9.899999 -v -4.400000 6.800002 -9.899999 -v -4.400000 6.800002 -9.899999 -v -4.400000 6.800002 -9.899999 -v -9.400000 0.400001 -7.900000 -v -9.300000 0.300001 -7.900000 -v 6.400000 7.000001 -9.999999 -v -4.600000 9.899998 10.000002 -v -4.600000 9.899998 10.000002 -v -4.600000 9.899998 10.000002 -v 4.600000 9.900002 -9.999998 -v -9.300000 0.300001 -7.800000 -v -9.400000 0.400001 -7.800000 -v -4.600000 10.099998 9.800002 -v -8.200000 10.099998 9.900002 -v -8.200000 12.999998 9.800002 -v -5.600000 0.300002 -9.200000 -v -5.700000 0.400001 -9.200000 -v 8.200000 9.899998 9.900002 -v 8.200000 9.899998 9.900002 -v 6.400000 9.899998 10.000002 -v 6.200000 12.999998 9.900002 -v 6.200000 13.000002 -9.899998 -v 6.200000 13.000002 -9.899998 -v 4.600000 13.000002 -9.999998 -v 8.200000 9.900002 -9.899998 -v 8.200000 9.900002 -9.899998 -v -1.600000 0.300001 -7.200000 -v -1.600000 0.300001 -7.200000 -v -1.600000 0.300001 -7.200000 -v -1.600000 0.300001 -7.200000 -v -1.600000 0.300001 -7.200000 -v -1.900000 0.300001 -7.800000 -v -8.200000 6.999999 9.800001 -v -8.200000 10.100002 -9.899998 -v -8.200000 10.100002 -9.899998 -v -8.200000 13.000002 -9.799998 -v -8.200000 13.000002 -9.899998 -v -8.200000 13.000002 -9.899998 -v -6.200000 10.099998 9.800002 -v -6.200000 10.099998 9.800002 -v -6.200000 12.999998 10.000002 -v -6.200000 12.999998 9.900002 -v 8.200000 7.000001 -9.799999 -v 4.600000 10.099998 9.800002 -v -6.200000 10.099998 9.800002 -v -12.700000 0.400001 -9.200000 -v -12.700000 0.300002 -9.300000 -v -12.600000 0.400001 -9.200000 -v -12.700000 0.400002 -9.300000 -v -8.400000 6.800002 -9.899999 -v -4.400000 6.800002 -9.799999 -v -8.400000 13.199998 9.900002 -v -8.400000 6.799999 9.800001 -v -4.600000 10.099998 10.000002 -v -4.600000 10.099998 10.000002 -v -4.600000 9.899998 10.000002 -v -4.600000 6.999999 9.900001 -v -4.600000 6.999999 9.900001 -v 6.400000 10.100002 -9.799998 -v 4.400000 13.200002 -9.799998 -v 4.400000 6.800002 -9.899999 -v 4.600000 13.000002 -9.899998 -v 4.600000 13.000002 -9.899998 -v 6.200000 13.000002 -9.799998 -v -4.600000 9.900002 -9.799998 -v -4.600000 9.900002 -9.799998 -v -4.600000 9.900002 -9.799998 -v -12.800000 19.900002 -9.899997 -v 12.800000 19.899998 9.900002 -v 8.400000 6.800002 -9.899999 -v 8.400000 6.800002 -9.899999 -v -6.400000 6.999999 9.900001 -v -6.400000 6.999999 9.900001 -v 8.400000 6.800002 -9.899999 -v 8.400000 13.200002 -9.799998 -v 6.200000 7.000001 -9.899999 -v 6.200000 7.000001 -9.899999 -v 6.200000 6.999999 10.000001 -v 6.400000 9.899998 9.800002 -v 12.800000 -0.000002 9.900000 -v 8.200000 7.000001 -9.999999 -v -12.600000 0.300002 -9.300000 -v -12.600000 0.400001 -9.200000 -v -5.600000 0.300002 -9.200000 -v 6.400000 10.099998 9.800002 -v -8.200000 10.100002 -9.999998 -v -8.200000 6.999999 9.800001 -v -4.400000 6.799999 9.800001 -v -4.400000 13.199998 9.900002 -v 4.600000 6.999999 9.900001 -v 4.600000 6.999999 9.900001 -v 4.600000 9.899998 10.000002 -v 4.600000 7.000001 -9.999999 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vn -1.0000 0.0000 0.0000 -vn 1.0000 0.0000 0.0000 -vn 0.0000 -0.0000 1.0000 -vn -0.0001 0.0000 1.0000 -vn 0.0001 0.0000 1.0000 -vn 0.0000 0.0000 -1.0000 -vn 0.0001 0.0000 -1.0000 -vn 0.0000 -1.0000 -0.0000 -vn 0.0000 1.0000 0.0000 -usemtl palette -s 1 -f 811/1/1 814/2/1 815/3/1 -f 812/4/1 817/5/1 2/6/1 -f 1195/7/1 818/8/1 813/9/1 -f 1196/10/1 819/11/1 5/12/1 -f 1197/13/1 1449/14/1 820/15/1 -f 1198/16/1 4/17/1 6/18/1 -f 1082/19/1 1/20/1 816/21/1 -f 1554/22/1 1450/23/1 7/24/1 -f 1617/25/1 1084/26/1 3/27/1 -f 1618/28/1 1555/29/1 1083/30/1 -f 1619/31/1 9/32/1 11/33/1 -f 1557/34/1 1451/35/1 1556/36/1 -f 1558/37/1 10/38/1 12/39/1 -f 14/40/1 8/41/1 13/42/1 -f 1873/43/1 1874/44/1 17/45/1 -f 18/46/1 16/47/1 15/48/1 -f 1094/49/1 1095/50/1 21/51/1 -f 22/52/1 20/53/1 19/54/1 -f 1455/55/1 1456/56/1 25/57/1 -f 26/58/1 24/59/1 23/60/1 -f 1739/61/1 1740/62/1 29/63/1 -f 30/64/1 28/65/1 27/66/1 -f 1879/67/1 1880/68/1 33/69/1 -f 34/70/1 32/71/1 31/72/1 -f 1100/73/1 1101/74/1 37/75/1 -f 38/76/1 36/77/1 35/78/1 -f 1461/79/1 1463/80/1 41/81/1 -f 1462/82/1 1464/83/1 40/84/1 -f 43/85/1 42/86/1 39/87/1 -f 1774/88/1 1776/89/1 1777/90/1 -f 1775/91/1 46/92/1 47/93/1 -f 48/94/1 45/95/1 44/96/1 -f 874/97/1 875/98/1 51/99/1 -f 1009/100/1 876/101/1 49/102/1 -f 53/103/1 50/104/1 52/105/1 -f 1398/106/1 1399/107/1 56/108/1 -f 1465/109/1 1400/110/1 54/111/1 -f 58/112/1 55/113/1 57/114/1 -f 1748/115/1 1749/116/1 61/117/1 -f 62/118/1 60/119/1 59/120/1 -f 1883/121/1 1884/122/1 65/123/1 -f 1010/124/1 1012/125/1 1885/126/1 -f 66/127/1 64/128/1 63/129/1 -f 68/130/1 67/131/1 1011/132/1 -f 1317/133/1 1318/134/1 71/135/1 -f 1404/136/1 1567/137/1 1319/138/1 -f 1403/139/1 70/140/1 69/141/1 -f 74/142/1 73/143/1 72/144/1 -f 1750/145/1 1751/146/1 77/147/1 -f 1780/148/1 1840/149/1 1752/150/1 -f 1779/151/1 76/152/1 75/153/1 -f 80/154/1 79/155/1 78/156/1 -f 914/157/1 915/158/1 83/159/1 -f 1016/160/1 1237/161/1 916/162/1 -f 1015/163/1 82/164/1 81/165/1 -f 86/166/1 85/167/1 84/168/1 -f 1476/169/1 1477/170/1 89/171/1 -f 90/172/1 88/173/1 87/174/1 -f 1754/175/1 1755/176/1 93/177/1 -f 94/178/1 92/179/1 91/180/1 -f 1887/181/1 1888/182/1 97/183/1 -f 98/184/1 96/185/1 95/186/1 -f 1121/187/1 1123/188/1 101/189/1 -f 1122/190/1 1124/191/1 100/192/1 -f 103/193/1 102/194/1 99/195/1 -f 1568/196/1 1570/197/1 1571/198/1 -f 1569/199/1 106/200/1 107/201/1 -f 108/202/1 105/203/1 104/204/1 -f 1822/205/1 1823/206/1 111/207/1 -f 1848/208/1 1824/209/1 109/210/1 -f 113/211/1 110/212/1 112/213/1 -f 1026/214/1 1027/215/1 116/216/1 -f 1131/217/1 1028/218/1 114/219/1 -f 118/220/1 115/221/1 117/222/1 -f 1483/223/1 1484/224/1 121/225/1 -f 1573/226/1 1694/227/1 1485/228/1 -f 1572/229/1 120/230/1 119/231/1 -f 124/232/1 123/233/1 122/234/1 -f 1825/235/1 1826/236/1 127/237/1 -f 1853/238/1 129/239/1 1827/240/1 -f 1852/241/1 126/242/1 125/243/1 -f 130/244/1 1908/245/1 128/246/1 -f 1132/247/1 1133/248/1 133/249/1 -f 1254/250/1 1420/251/1 1134/252/1 -f 1253/253/1 132/254/1 131/255/1 -f 136/256/1 135/257/1 134/258/1 -f 1644/259/1 1645/260/1 139/261/1 -f 1700/262/1 1783/263/1 1646/264/1 -f 1699/265/1 138/266/1 137/267/1 -f 142/268/1 141/269/1 140/270/1 -f 143/271/2 1909/272/2 145/273/2 -f 1910/274/2 144/275/2 146/276/2 -f 147/277/2 1269/278/2 1270/279/2 -f 149/280/2 148/281/2 150/282/2 -f 151/283/2 1583/284/2 1584/285/2 -f 153/286/2 152/287/2 154/288/2 -f 155/289/2 1784/290/2 1786/291/2 -f 1785/292/2 1860/293/2 1787/294/2 -f 157/295/2 156/296/2 1788/297/2 -f 159/298/2 158/299/2 160/300/2 -f 161/301/2 1038/302/2 1040/303/2 -f 1039/304/2 1276/305/2 1041/306/2 -f 163/307/2 162/308/2 1042/309/2 -f 165/310/2 164/311/2 166/312/2 -f 167/313/2 1588/314/2 1590/315/2 -f 1589/316/2 1710/317/2 1591/318/2 -f 169/319/2 168/320/2 1592/321/2 -f 171/322/2 170/323/2 172/324/2 -f 173/325/2 1861/326/2 1863/327/2 -f 1862/328/2 1913/329/2 1865/330/2 -f 175/331/2 174/332/2 177/333/2 -f 1864/334/2 176/335/2 178/336/2 -f 179/337/2 1277/338/2 1278/339/2 -f 180/340/2 1358/341/2 1279/342/2 -f 181/343/2 182/344/2 183/345/2 -f 1593/346/2 1669/347/2 1594/348/2 -f 187/349/2 184/350/2 1595/351/2 -f 186/352/2 185/353/2 188/354/2 -f 189/355/2 1866/356/2 1868/357/2 -f 191/358/2 1867/359/2 1869/360/2 -f 192/361/2 190/362/2 193/363/2 -f 194/364/2 1153/365/2 1155/366/2 -f 196/367/2 1154/368/2 1156/369/2 -f 197/370/2 195/371/2 198/372/2 -f 199/373/2 1596/374/2 1597/375/2 -f 201/376/2 200/377/2 202/378/2 -f 203/379/2 1796/380/2 1797/381/2 -f 205/382/2 204/383/2 206/384/2 -f 207/385/2 1915/386/2 209/387/2 -f 1916/388/2 208/389/2 210/390/2 -f 211/391/2 1287/392/2 1288/393/2 -f 213/394/2 212/395/2 214/396/2 -f 215/397/2 1601/398/2 1602/399/2 -f 217/400/2 216/401/2 218/402/2 -f 219/403/2 1799/404/2 1800/405/2 -f 221/406/2 220/407/2 222/408/2 -f 223/409/2 1917/410/2 225/411/2 -f 1918/412/2 1070/413/2 1072/414/2 -f 1919/415/2 224/416/2 1071/417/2 -f 227/418/2 226/419/2 228/420/2 -f 229/421/2 1439/422/2 1441/423/2 -f 1440/424/2 1604/425/2 1442/426/2 -f 231/427/2 230/428/2 1443/429/2 -f 233/430/2 232/431/2 234/432/2 -f 235/433/2 1802/434/2 1804/435/2 -f 1803/436/2 1871/437/2 1805/438/2 -f 237/439/2 236/440/2 1806/441/2 -f 239/442/2 238/443/2 240/444/2 -f 241/445/2 1073/446/2 1075/447/2 -f 1074/448/2 1301/449/2 1076/450/2 -f 243/451/2 242/452/2 1077/453/2 -f 245/454/2 244/455/2 246/456/2 -f 247/457/2 1612/458/2 1613/459/2 -f 248/460/2 1672/461/2 1614/462/2 -f 249/463/2 250/464/2 251/465/2 -f 1807/466/2 1833/467/2 1808/468/2 -f 255/469/2 252/470/2 1809/471/2 -f 254/472/2 253/473/2 256/474/2 -f 257/475/2 1623/476/2 259/477/2 -f 1641/478/2 1624/479/2 260/480/2 -f 1625/481/2 258/482/2 261/483/2 -f 262/484/2 1550/485/2 1552/486/2 -f 264/487/2 1551/488/2 1553/489/2 -f 265/490/2 263/491/2 266/492/2 -f 267/493/2 1732/494/2 1733/495/2 -f 269/496/2 268/497/2 270/498/2 -f 271/499/2 1901/500/2 273/501/2 -f 1902/502/2 272/503/2 274/504/2 -f 275/505/2 1191/506/2 1192/507/2 -f 277/508/2 276/509/2 278/510/2 -f 1818/511/2 280/512/2 1673/513/2 -f 282/514/2 1772/515/2 1741/516/2 -f 279/517/2 1675/518/2 1676/519/2 -f 1674/520/2 1742/521/2 1677/522/2 -f 285/523/2 281/524/2 286/525/2 -f 1743/526/2 1773/527/2 1744/528/2 -f 1678/529/2 284/530/2 1745/531/2 -f 287/532/2 283/533/2 288/534/2 -f 999/535/3 837/536/3 1001/537/3 -f 848/538/3 838/539/3 1000/540/3 -f 850/541/3 839/542/3 292/543/3 -f 853/544/3 840/545/3 851/546/3 -f 1213/547/3 289/548/3 1002/549/3 -f 1386/550/3 852/551/3 849/552/3 -f 1290/553/3 293/554/3 1388/555/3 -f 860/556/3 841/557/3 294/558/3 -f 1217/559/4 1289/560/4 296/561/4 -f 1218/562/3 861/563/3 297/564/3 -f 1216/565/3 295/566/3 1003/567/3 -f 299/568/3 1387/569/3 1214/570/3 -f 1628/571/3 862/572/3 1219/573/3 -f 1630/574/3 863/575/3 1629/576/3 -f 865/577/3 842/578/3 864/579/3 -f 866/580/3 298/581/3 1631/582/3 -f 1220/583/3 1215/584/3 1004/585/3 -f 1834/586/3 1632/587/3 300/588/3 -f 1882/589/3 301/590/3 1835/591/3 -f 880/592/3 847/593/3 302/594/3 -f 1222/595/3 303/596/3 1005/597/3 -f 1225/598/3 879/599/3 1881/600/3 -f 1226/601/3 305/602/3 1836/603/3 -f 307/604/3 304/605/3 1221/606/3 -f 308/607/3 881/608/3 1223/609/3 -f 882/610/3 877/611/3 1102/612/3 -f 885/613/3 846/614/3 878/615/3 -f 310/616/3 306/617/3 309/618/3 -f 1227/619/3 1224/620/3 1006/621/3 -f 1280/622/3 883/623/3 1103/624/3 -f 1670/625/3 884/626/3 312/627/3 -f 887/628/3 843/629/3 886/630/3 -f 1229/631/3 311/632/3 1007/633/3 -f 1231/634/3 888/635/3 1671/636/3 -f 1230/637/4 313/638/4 1281/639/4 -f 315/640/3 1282/641/3 1228/642/3 -f 1633/643/3 889/644/3 1232/645/3 -f 1635/646/3 890/647/3 316/648/3 -f 892/649/3 844/650/3 891/651/3 -f 318/652/3 314/653/3 1636/654/3 -f 1234/655/3 1233/656/3 1008/657/3 -f 1471/658/3 1637/659/3 1634/660/3 -f 918/661/3 317/662/3 1470/663/3 -f 899/664/3 845/665/3 893/666/3 -f 903/667/3 1235/668/3 291/669/3 -f 902/670/3 900/671/3 917/672/3 -f 905/673/3 321/674/3 1472/675/3 -f 323/676/3 320/677/3 319/678/3 -f 906/679/3 290/680/3 901/681/3 -f 324/682/3 322/683/3 904/684/3 -f 1401/685/3 1402/686/3 327/687/3 -f 328/688/3 326/689/3 325/690/3 -f 1684/691/3 1685/692/3 331/693/3 -f 332/694/3 330/695/3 329/696/3 -f 1838/697/3 1839/698/3 335/699/3 -f 336/700/3 334/701/3 333/702/3 -f 1013/703/3 1014/704/3 339/705/3 -f 340/706/3 338/707/3 337/708/3 -f 1405/709/3 1406/710/3 343/711/3 -f 344/712/3 342/713/3 341/714/3 -f 1688/715/3 1689/716/3 347/717/3 -f 348/718/3 346/719/3 345/720/3 -f 1843/721/3 1844/722/3 351/723/3 -f 352/724/3 350/725/3 349/726/3 -f 1020/727/3 919/728/3 1022/729/3 -f 926/730/3 920/731/3 1021/732/3 -f 928/733/3 921/734/3 356/735/3 -f 931/736/3 922/737/3 929/738/3 -f 908/739/3 353/740/3 1023/741/3 -f 1412/742/3 930/743/3 927/744/3 -f 1481/745/3 357/746/3 1413/747/3 -f 932/748/3 923/749/3 358/750/3 -f 910/751/5 361/752/5 1414/753/5 -f 911/754/3 934/755/3 1482/756/3 -f 909/757/3 907/758/3 1024/759/3 -f 363/760/3 360/761/3 359/762/3 -f 1407/763/3 933/764/3 912/765/3 -f 1638/766/4 935/767/4 1408/768/4 -f 937/769/3 924/770/3 936/771/3 -f 366/772/3 362/773/3 1639/774/3 -f 1248/775/3 913/776/3 1025/777/3 -f 1892/778/3 1640/779/3 364/780/3 -f 1158/781/3 365/782/3 1893/783/3 -f 939/784/3 925/785/3 938/786/3 -f 943/787/3 367/788/3 355/789/3 -f 942/790/3 940/791/3 1157/792/3 -f 945/793/3 369/794/3 1894/795/3 -f 371/796/3 368/797/3 1249/798/3 -f 946/799/3 354/800/3 941/801/3 -f 372/802/3 370/803/3 944/804/3 -f 1418/805/3 1327/806/3 994/807/3 -f 1333/808/3 1328/809/3 1419/810/3 -f 1335/811/3 1329/812/3 376/813/3 -f 1338/814/3 1330/815/3 1336/816/3 -f 997/817/3 373/818/3 993/819/3 -f 895/820/3 377/821/3 1334/822/3 -f 897/823/3 1337/824/3 894/825/3 -f 1339/826/3 1331/827/3 378/828/3 -f 1576/829/5 381/830/5 896/831/5 -f 1575/832/3 1340/833/3 898/834/3 -f 1574/835/3 379/836/3 995/837/3 -f 383/838/3 380/839/3 998/840/3 -f 1756/841/3 1341/842/3 1577/843/3 -f 385/844/4 1342/845/4 1757/846/4 -f 386/847/3 1332/848/3 1343/849/3 -f 1345/850/3 382/851/3 1032/852/3 -f 1580/853/3 1578/854/3 996/855/3 -f 1035/856/3 1033/857/3 384/858/3 -f 1598/859/3 1034/860/3 388/861/3 -f 1346/862/3 374/863/3 1344/864/3 -f 1137/865/3 387/866/3 375/867/3 -f 1136/868/3 1347/869/3 1599/870/3 -f 1135/871/3 389/872/3 1036/873/3 -f 391/874/3 1037/875/3 1579/876/3 -f 1349/877/3 1326/878/3 1348/879/3 -f 392/880/3 390/881/3 1138/882/3 -f 1696/883/3 1539/884/3 1810/885/3 -f 1544/886/3 1540/887/3 1698/888/3 -f 1811/889/3 393/890/3 395/891/3 -f 1828/892/3 1697/893/3 1812/894/3 -f 1829/895/3 397/896/3 1295/897/3 -f 1649/898/3 1541/899/3 396/900/3 -f 1299/901/3 398/902/3 1294/903/3 -f 401/904/3 1650/905/3 1830/906/3 -f 402/907/3 1542/908/3 1651/909/3 -f 1653/910/3 400/911/3 1297/912/3 -f 1897/913/3 1298/914/3 1296/915/3 -f 1144/916/3 1543/917/3 1652/918/3 -f 1424/919/3 403/920/3 399/921/3 -f 1425/922/3 1146/923/3 1898/924/3 -f 1426/925/3 1422/926/3 407/927/3 -f 1147/928/3 394/929/3 1145/930/3 -f 1148/931/3 1423/932/3 406/933/3 -f 408/934/3 404/935/3 405/936/3 -f 1701/937/6 1654/938/6 1660/939/6 -f 411/940/6 1655/941/6 1661/942/6 -f 1702/943/6 1659/944/6 1705/945/6 -f 412/946/6 1656/947/6 1664/948/6 -f 1703/949/6 1706/950/6 1707/951/6 -f 413/952/6 1665/953/6 1708/954/6 -f 1666/955/6 1657/956/6 1667/957/6 -f 1709/958/6 414/959/6 416/960/6 -f 1704/961/6 415/962/6 417/963/6 -f 1668/964/6 1658/965/6 869/966/6 -f 409/967/6 1505/968/6 872/969/6 -f 1504/970/6 867/971/6 870/972/6 -f 420/973/6 871/974/6 421/975/6 -f 868/976/6 410/977/6 963/978/6 -f 1907/979/6 873/980/6 964/981/6 -f 419/982/6 418/983/6 422/984/6 -f 1166/985/6 1497/986/6 1170/987/6 -f 1171/988/6 1491/989/6 1498/990/6 -f 1499/991/7 1492/992/7 1500/993/7 -f 1501/994/6 1493/995/6 1503/996/6 -f 1168/997/6 425/998/6 1064/999/6 -f 426/1000/6 1502/1001/6 1789/1002/6 -f 1791/1003/6 427/1004/6 1814/1005/6 -f 428/1006/6 1494/1007/6 1506/1008/6 -f 1790/1009/6 1815/1010/6 1069/1011/6 -f 431/1012/6 1507/1013/6 1068/1014/6 -f 1169/1015/6 1063/1016/6 1067/1017/6 -f 429/1018/6 430/1019/6 433/1020/6 -f 1065/1021/6 1508/1022/6 434/1023/6 -f 972/1024/6 1509/1025/6 855/1026/6 -f 1510/1027/6 1495/1028/6 436/1029/6 -f 856/1030/6 432/1031/6 1512/1032/6 -f 423/1033/6 1066/1034/6 1434/1035/6 -f 973/1036/6 854/1037/6 857/1038/6 -f 859/1039/6 435/1040/6 1396/1041/6 -f 1511/1042/6 1496/1043/6 1513/1044/6 -f 1167/1045/6 437/1046/6 1359/1047/6 -f 1397/1048/6 1514/1049/6 1361/1050/6 -f 858/1051/6 439/1052/6 1360/1053/6 -f 1435/1054/6 438/1055/6 441/1056/6 -f 1515/1057/6 424/1058/6 1516/1059/6 -f 1362/1060/6 440/1061/6 442/1062/6 -f 1793/1063/6 1258/1064/6 1762/1065/6 -f 445/1066/6 1255/1067/6 1262/1068/6 -f 446/1069/7 1259/1070/7 1763/1071/7 -f 1765/1072/6 1260/1073/6 1766/1074/6 -f 1794/1075/6 1761/1076/6 449/1077/6 -f 1263/1078/6 447/1079/6 450/1080/6 -f 976/1081/6 1764/1082/6 979/1083/6 -f 448/1084/6 1261/1085/6 1161/1086/6 -f 977/1087/6 980/1088/6 981/1089/6 -f 451/1090/6 1160/1091/6 985/1092/6 -f 1795/1093/6 1057/1094/6 982/1095/6 -f 1056/1096/6 978/1097/6 453/1098/6 -f 983/1099/6 1162/1100/6 454/1101/6 -f 1363/1102/6 1163/1103/6 1365/1104/6 -f 1159/1105/6 444/1106/6 1164/1107/6 -f 1367/1108/6 452/1109/6 456/1110/6 -f 443/1111/6 984/1112/6 1715/1113/6 -f 1364/1114/6 1366/1115/6 1392/1116/6 -f 458/1117/6 455/1118/6 1746/1119/6 -f 1165/1120/6 1256/1121/6 1284/1122/6 -f 1792/1123/6 457/1124/6 1324/1125/6 -f 1747/1126/6 1285/1127/6 1322/1128/6 -f 1393/1129/6 459/1130/6 1323/1131/6 -f 1716/1132/6 1394/1133/6 461/1134/6 -f 1286/1135/6 1257/1136/6 1769/1137/6 -f 1325/1138/6 460/1139/6 462/1140/6 -f 463/1141/6 1642/1142/6 465/1143/6 -f 1643/1144/6 464/1145/6 466/1146/6 -f 467/1147/6 468/1148/6 469/1149/6 -f 1832/1150/6 1831/1151/6 470/1152/6 -f 471/1153/6 991/1154/6 992/1155/6 -f 473/1156/6 472/1157/6 474/1158/6 -f 475/1159/6 1384/1160/6 1385/1161/6 -f 477/1162/6 476/1163/6 478/1164/6 -f 479/1165/6 1686/1166/6 481/1167/6 -f 1687/1168/6 480/1169/6 482/1170/6 -f 483/1171/6 1185/1172/6 1186/1173/6 -f 485/1174/6 484/1175/6 486/1176/6 -f 1113/1177/6 1043/1178/6 1054/1179/6 -f 1055/1180/6 1044/1181/6 1058/1182/6 -f 1059/1183/6 1049/1184/6 1523/1185/6 -f 1524/1186/6 1050/1187/6 1526/1188/6 -f 1118/1189/6 489/1190/6 1605/1191/6 -f 490/1192/6 1525/1193/6 831/1194/6 -f 830/1195/6 491/1196/6 833/1197/6 -f 492/1198/6 1051/1199/6 1527/1200/6 -f 832/1201/7 495/1202/7 1610/1203/7 -f 834/1204/6 1528/1205/6 1611/1206/6 -f 1119/1207/6 493/1208/6 1608/1209/6 -f 1606/1210/6 494/1211/6 497/1212/6 -f 1607/1213/6 1529/1214/6 1316/1215/6 -f 498/1216/6 1530/1217/6 499/1218/6 -f 1531/1219/6 1052/1220/6 500/1221/6 -f 1243/1222/6 496/1223/6 1533/1224/6 -f 1120/1225/6 1609/1226/6 501/1227/6 -f 1315/1228/6 1242/1229/6 1245/1230/6 -f 1246/1231/6 1244/1232/6 1376/1233/6 -f 1532/1234/6 1045/1235/6 1085/1236/6 -f 1114/1237/6 1445/1238/6 1140/1239/6 -f 1377/1240/6 1086/1241/6 1139/1242/6 -f 1247/1243/6 503/1244/6 1141/1245/6 -f 1444/1246/6 502/1247/6 505/1248/6 -f 1142/1249/6 1087/1250/6 1534/1251/6 -f 506/1252/6 1088/1253/6 1536/1254/6 -f 1089/1255/6 1046/1256/6 1096/1257/6 -f 1537/1258/6 504/1259/6 508/1260/6 -f 487/1261/6 1143/1262/6 1615/1263/6 -f 1535/1264/6 1538/1265/6 987/1266/6 -f 986/1267/6 507/1268/6 989/1269/6 -f 1097/1270/6 1053/1271/6 1545/1272/6 -f 1115/1273/6 509/1274/6 1306/1275/6 -f 990/1276/6 1546/1277/6 1308/1278/6 -f 510/1279/7 511/1280/7 1309/1281/7 -f 1616/1282/6 988/1283/6 513/1284/6 -f 1305/1285/6 1547/1286/6 1193/1287/6 -f 1194/1288/6 1548/1289/6 515/1290/6 -f 1549/1291/6 1047/1292/6 516/1293/6 -f 823/1294/6 512/1295/6 1378/1296/6 -f 1116/1297/6 1307/1298/6 1310/1299/6 -f 514/1300/6 821/1301/6 824/1302/6 -f 518/1303/6 822/1304/6 1320/1305/6 -f 1379/1306/6 1048/1307/6 1380/1308/6 -f 1117/1309/6 517/1310/6 1239/1311/6 -f 1321/1312/6 1381/1313/6 1240/1314/6 -f 825/1315/6 519/1316/6 1238/1317/6 -f 1311/1318/6 826/1319/6 521/1320/6 -f 1382/1321/6 488/1322/6 1383/1323/6 -f 1241/1324/6 520/1325/6 522/1326/6 -f 1466/1327/8 1468/1328/8 525/1329/8 -f 1620/1330/8 1469/1331/8 1467/1332/8 -f 527/1333/8 524/1334/8 526/1335/8 -f 1781/1336/8 1621/1337/8 523/1338/8 -f 529/1339/8 1622/1340/8 1782/1341/8 -f 1092/1342/8 1090/1343/8 528/1344/8 -f 1093/1345/8 531/1346/8 1091/1347/8 -f 532/1348/8 1202/1349/8 530/1350/8 -f 1453/1351/8 534/1352/8 535/1353/8 -f 536/1354/8 1454/1355/8 533/1356/8 -f 537/1357/8 538/1358/8 539/1359/8 -f 540/1360/8 1738/1361/8 1737/1362/8 -f 541/1363/8 542/1364/8 543/1365/8 -f 544/1366/8 1878/1367/8 1877/1368/8 -f 1098/1369/8 1099/1370/8 547/1371/8 -f 548/1372/8 546/1373/8 545/1374/8 -f 1458/1375/8 1459/1376/8 551/1377/8 -f 1389/1378/8 553/1379/8 1391/1380/8 -f 1199/1381/8 1200/1382/8 557/1383/8 -f 1845/1384/8 559/1385/8 560/1386/8 -f 561/1387/8 1460/1388/8 549/1389/8 -f 562/1390/8 550/1391/8 1566/1392/8 -f 563/1393/8 1390/1394/8 554/1395/8 -f 564/1396/8 552/1397/8 1395/1398/8 -f 565/1399/8 1201/1400/8 555/1401/8 -f 566/1402/8 556/1403/8 1679/1404/8 -f 567/1405/8 1846/1406/8 1847/1407/8 -f 568/1408/8 558/1409/8 1906/1410/8 -f 1373/1411/8 1374/1412/8 571/1413/8 -f 1680/1414/8 573/1415/8 1682/1416/8 -f 1819/1417/8 1820/1418/8 577/1419/8 -f 1125/1420/8 579/1421/8 580/1422/8 -f 581/1423/8 1375/1424/8 569/1425/8 -f 582/1426/8 570/1427/8 1778/1428/8 -f 1683/1429/8 1681/1430/8 574/1431/8 -f 584/1432/8 572/1433/8 583/1434/8 -f 585/1435/8 1821/1436/8 575/1437/8 -f 586/1438/8 576/1439/8 1837/1440/8 -f 1236/1441/8 1126/1442/8 1127/1443/8 -f 588/1444/8 578/1445/8 587/1446/8 -f 1724/1447/8 1726/1448/8 591/1449/8 -f 1731/1450/8 590/1451/8 1725/1452/8 -f 1110/1453/8 1112/1454/8 595/1455/8 -f 596/1456/8 594/1457/8 1111/1458/8 -f 1473/1459/8 1475/1460/8 599/1461/8 -f 600/1462/8 598/1463/8 597/1464/8 -f 1486/1465/8 1753/1466/8 603/1467/8 -f 1488/1468/8 602/1469/8 1487/1470/8 -f 1842/1471/8 592/1472/8 589/1473/8 -f 606/1474/8 1730/1475/8 605/1476/8 -f 607/1477/8 1017/1478/8 593/1479/8 -f 608/1480/8 1018/1481/8 1019/1482/8 -f 609/1483/8 1409/1484/8 1474/1485/8 -f 610/1486/8 1410/1487/8 1411/1488/8 -f 611/1489/8 1489/1490/8 601/1491/8 -f 612/1492/8 604/1493/8 1690/1494/8 -f 1478/1495/8 1480/1496/8 615/1497/8 -f 1416/1498/8 614/1499/8 1479/1500/8 -f 1758/1501/8 1760/1502/8 619/1503/8 -f 620/1504/8 618/1505/8 1759/1506/8 -f 1889/1507/8 622/1508/8 623/1509/8 -f 1849/1510/8 1891/1511/8 1890/1512/8 -f 1128/1513/8 1130/1514/8 627/1515/8 -f 628/1516/8 626/1517/8 625/1518/8 -f 1417/1519/8 1415/1520/8 613/1521/8 -f 630/1522/8 616/1523/8 629/1524/8 -f 1693/1525/8 1691/1526/8 617/1527/8 -f 632/1528/8 1692/1529/8 631/1530/8 -f 633/1531/8 1850/1532/8 621/1533/8 -f 634/1534/8 624/1535/8 1851/1536/8 -f 1031/1537/8 1029/1538/8 1129/1539/8 -f 636/1540/8 1030/1541/8 635/1542/8 -f 1895/1543/8 638/1544/8 639/1545/8 -f 640/1546/8 1896/1547/8 637/1548/8 -f 965/1549/9 1250/1550/9 951/1551/9 -f 947/1552/9 642/1553/9 1433/1554/9 -f 966/1555/9 948/1556/9 952/1557/9 -f 953/1558/9 643/1559/9 1490/1560/9 -f 967/1561/9 645/1562/9 974/1563/9 -f 646/1564/9 949/1565/9 954/1566/9 -f 641/1567/9 975/1568/9 1350/1569/9 -f 647/1570/9 955/1571/9 1351/1572/9 -f 956/1573/9 950/1574/9 1421/1575/9 -f 649/1576/9 648/1577/9 650/1578/9 -f 644/1579/9 1251/1580/9 1264/1581/9 -f 652/1582/9 1265/1583/9 1647/1584/9 -f 1266/1585/9 1252/1586/9 1648/1587/9 -f 653/1588/9 651/1589/9 654/1590/9 -f 968/1591/9 1854/1592/9 970/1593/9 -f 971/1594/9 1856/1595/9 1267/1596/9 -f 1268/1597/9 1857/1598/9 958/1599/9 -f 659/1600/9 1858/1601/9 660/1602/9 -f 661/1603/9 1581/1604/9 1582/1605/9 -f 663/1606/9 662/1607/9 664/1608/9 -f 969/1609/9 657/1610/9 1722/1611/9 -f 658/1612/9 957/1613/9 960/1614/9 -f 666/1615/9 959/1616/9 1662/1617/9 -f 1859/1618/9 656/1619/9 1368/1620/9 -f 962/1621/9 1663/1622/9 1174/1623/9 -f 667/1624/9 1369/1625/9 1173/1626/9 -f 655/1627/9 1723/1628/9 1175/1629/9 -f 665/1630/9 961/1631/9 669/1632/9 -f 1176/1633/9 1371/1634/9 1207/1635/9 -f 1370/1636/9 1855/1637/9 1372/1638/9 -f 1208/1639/9 668/1640/9 671/1641/9 -f 1172/1642/9 1206/1643/9 1178/1644/9 -f 673/1645/9 1177/1646/9 1179/1647/9 -f 1180/1648/9 1209/1649/9 674/1650/9 -f 1271/1651/9 1210/1652/9 1275/1653/9 -f 1273/1654/9 1211/1655/9 1911/1656/9 -f 1106/1657/9 672/1658/9 1108/1659/9 -f 1272/1660/9 675/1661/9 1585/1662/9 -f 1587/1663/9 1274/1664/9 1352/1665/9 -f 676/1666/9 1212/1667/9 1427/1668/9 -f 678/1669/9 679/1670/9 1355/1671/9 -f 1353/1672/9 1428/1673/9 1356/1674/9 -f 1107/1675/9 1109/1676/9 1354/1677/9 -f 677/1678/9 1586/1679/9 681/1680/9 -f 1429/1681/9 670/1682/9 1430/1683/9 -f 1357/1684/9 680/1685/9 682/1686/9 -f 683/1687/9 1431/1688/9 1432/1689/9 -f 685/1690/9 684/1691/9 686/1692/9 -f 687/1693/9 1720/1694/9 689/1695/9 -f 1721/1696/9 688/1697/9 690/1698/9 -f 691/1699/9 692/1700/9 1876/1701/9 -f 693/1702/9 1875/1703/9 694/1704/9 -f 695/1705/9 1104/1706/9 1105/1707/9 -f 697/1708/9 696/1709/9 698/1710/9 -f 699/1711/9 1712/1712/9 1713/1713/9 -f 1714/1714/9 700/1715/9 1899/1716/9 -f 703/1717/9 1457/1718/9 705/1719/9 -f 1149/1720/9 704/1721/9 1151/1722/9 -f 707/1723/9 1905/1724/9 709/1725/9 -f 1517/1726/9 708/1727/9 1519/1728/9 -f 711/1729/9 1203/1730/9 1204/1731/9 -f 1205/1732/9 712/1733/9 1767/1734/9 -f 701/1735/9 1900/1736/9 715/1737/9 -f 1914/1738/9 702/1739/9 716/1740/9 -f 1150/1741/9 1152/1742/9 1283/1743/9 -f 717/1744/9 706/1745/9 718/1746/9 -f 1518/1747/9 1520/1748/9 1600/1749/9 -f 719/1750/9 710/1751/9 720/1752/9 -f 713/1753/9 714/1754/9 721/1755/9 -f 1798/1756/9 1768/1757/9 722/1758/9 -f 723/1759/9 1060/1760/9 1061/1761/9 -f 1062/1762/9 724/1763/9 1521/1764/9 -f 727/1765/9 1436/1766/9 1437/1767/9 -f 1438/1768/9 728/1769/9 1770/1770/9 -f 731/1771/9 1717/1772/9 1718/1773/9 -f 1719/1774/9 732/1775/9 1903/1776/9 -f 735/1777/9 1870/1778/9 737/1779/9 -f 1181/1780/9 736/1781/9 1183/1782/9 -f 725/1783/9 1522/1784/9 739/1785/9 -f 1603/1786/9 726/1787/9 740/1788/9 -f 729/1789/9 1771/1790/9 741/1791/9 -f 1801/1792/9 730/1793/9 742/1794/9 -f 733/1795/9 1904/1796/9 743/1797/9 -f 1920/1798/9 734/1799/9 744/1800/9 -f 1182/1801/9 1184/1802/9 1300/1803/9 -f 745/1804/9 738/1805/9 746/1806/9 -f 747/1807/9 1727/1808/9 1841/1809/9 -f 1563/1810/9 751/1811/9 1564/1812/9 -f 753/1813/9 1302/1814/9 755/1815/9 -f 1078/1816/9 757/1817/9 1079/1818/9 -f 749/1819/9 748/1820/9 759/1821/9 -f 1729/1822/9 1728/1823/9 760/1824/9 -f 750/1825/9 1565/1826/9 761/1827/9 -f 1872/1828/9 752/1829/9 762/1830/9 -f 1695/1831/9 1303/1832/9 1304/1833/9 -f 763/1834/9 754/1835/9 764/1836/9 -f 756/1837/9 758/1838/9 1912/1839/9 -f 765/1840/9 1080/1841/9 766/1842/9 -f 767/1843/9 1291/1844/9 1293/1845/9 -f 1081/1846/9 771/1847/9 772/1848/9 -f 773/1849/9 1446/1850/9 775/1851/9 -f 776/1852/9 777/1853/9 778/1854/9 -f 769/1855/9 1292/1856/9 1813/1857/9 -f 779/1858/9 768/1859/9 780/1860/9 -f 770/1861/9 827/1862/9 829/1863/9 -f 781/1864/9 828/1865/9 782/1866/9 -f 1448/1867/9 1447/1868/9 1452/1869/9 -f 783/1870/9 774/1871/9 784/1872/9 -f 1886/1873/9 1734/1874/9 785/1875/9 -f 1736/1876/9 1735/1877/9 786/1878/9 -f 787/1879/9 835/1880/9 836/1881/9 -f 789/1882/9 788/1883/9 790/1884/9 -f 791/1885/9 1312/1886/9 1313/1887/9 -f 793/1888/9 792/1889/9 794/1890/9 -f 795/1891/9 1626/1892/9 1627/1893/9 -f 797/1894/9 796/1895/9 798/1896/9 -f 799/1897/9 1816/1898/9 801/1899/9 -f 1817/1900/9 800/1901/9 802/1902/9 -f 803/1903/9 804/1904/9 1559/1905/9 -f 1560/1906/9 1711/1907/9 1561/1908/9 -f 805/1909/9 806/1910/9 807/1911/9 -f 1187/1912/9 1562/1913/9 1190/1914/9 -f 1188/1915/9 808/1916/9 1314/1917/9 -f 809/1918/9 1189/1919/9 810/1920/9 diff --git a/res/pose/coco/pose_deploy_linevec.prototxt b/res/pose/coco/pose_deploy_linevec.prototxt new file mode 100644 index 0000000..90a54fd --- /dev/null +++ b/res/pose/coco/pose_deploy_linevec.prototxt @@ -0,0 +1,2976 @@ +input: "image" +input_dim: 1 +input_dim: 3 +input_dim: 1 # This value will be defined at runtime +input_dim: 1 # This value will be defined at runtime +layer { + name: "conv1_1" + type: "Convolution" + bottom: "image" + top: "conv1_1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu1_1" + type: "ReLU" + bottom: "conv1_1" + top: "conv1_1" +} +layer { + name: "conv1_2" + type: "Convolution" + bottom: "conv1_1" + top: "conv1_2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu1_2" + type: "ReLU" + bottom: "conv1_2" + top: "conv1_2" +} +layer { + name: "pool1_stage1" + type: "Pooling" + bottom: "conv1_2" + top: "pool1_stage1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv2_1" + type: "Convolution" + bottom: "pool1_stage1" + top: "conv2_1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu2_1" + type: "ReLU" + bottom: "conv2_1" + top: "conv2_1" +} +layer { + name: "conv2_2" + type: "Convolution" + bottom: "conv2_1" + top: "conv2_2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu2_2" + type: "ReLU" + bottom: "conv2_2" + top: "conv2_2" +} +layer { + name: "pool2_stage1" + type: "Pooling" + bottom: "conv2_2" + top: "pool2_stage1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv3_1" + type: "Convolution" + bottom: "pool2_stage1" + top: "conv3_1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu3_1" + type: "ReLU" + bottom: "conv3_1" + top: "conv3_1" +} +layer { + name: "conv3_2" + type: "Convolution" + bottom: "conv3_1" + top: "conv3_2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu3_2" + type: "ReLU" + bottom: "conv3_2" + top: "conv3_2" +} +layer { + name: "conv3_3" + type: "Convolution" + bottom: "conv3_2" + top: "conv3_3" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu3_3" + type: "ReLU" + bottom: "conv3_3" + top: "conv3_3" +} +layer { + name: "conv3_4" + type: "Convolution" + bottom: "conv3_3" + top: "conv3_4" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu3_4" + type: "ReLU" + bottom: "conv3_4" + top: "conv3_4" +} +layer { + name: "pool3_stage1" + type: "Pooling" + bottom: "conv3_4" + top: "pool3_stage1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv4_1" + type: "Convolution" + bottom: "pool3_stage1" + top: "conv4_1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu4_1" + type: "ReLU" + bottom: "conv4_1" + top: "conv4_1" +} +layer { + name: "conv4_2" + type: "Convolution" + bottom: "conv4_1" + top: "conv4_2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu4_2" + type: "ReLU" + bottom: "conv4_2" + top: "conv4_2" +} +layer { + name: "conv4_3_CPM" + type: "Convolution" + bottom: "conv4_2" + top: "conv4_3_CPM" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu4_3_CPM" + type: "ReLU" + bottom: "conv4_3_CPM" + top: "conv4_3_CPM" +} +layer { + name: "conv4_4_CPM" + type: "Convolution" + bottom: "conv4_3_CPM" + top: "conv4_4_CPM" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu4_4_CPM" + type: "ReLU" + bottom: "conv4_4_CPM" + top: "conv4_4_CPM" +} +layer { + name: "conv5_1_CPM_L1" + type: "Convolution" + bottom: "conv4_4_CPM" + top: "conv5_1_CPM_L1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_1_CPM_L1" + type: "ReLU" + bottom: "conv5_1_CPM_L1" + top: "conv5_1_CPM_L1" +} +layer { + name: "conv5_1_CPM_L2" + type: "Convolution" + bottom: "conv4_4_CPM" + top: "conv5_1_CPM_L2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_1_CPM_L2" + type: "ReLU" + bottom: "conv5_1_CPM_L2" + top: "conv5_1_CPM_L2" +} +layer { + name: "conv5_2_CPM_L1" + type: "Convolution" + bottom: "conv5_1_CPM_L1" + top: "conv5_2_CPM_L1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_2_CPM_L1" + type: "ReLU" + bottom: "conv5_2_CPM_L1" + top: "conv5_2_CPM_L1" +} +layer { + name: "conv5_2_CPM_L2" + type: "Convolution" + bottom: "conv5_1_CPM_L2" + top: "conv5_2_CPM_L2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_2_CPM_L2" + type: "ReLU" + bottom: "conv5_2_CPM_L2" + top: "conv5_2_CPM_L2" +} +layer { + name: "conv5_3_CPM_L1" + type: "Convolution" + bottom: "conv5_2_CPM_L1" + top: "conv5_3_CPM_L1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_3_CPM_L1" + type: "ReLU" + bottom: "conv5_3_CPM_L1" + top: "conv5_3_CPM_L1" +} +layer { + name: "conv5_3_CPM_L2" + type: "Convolution" + bottom: "conv5_2_CPM_L2" + top: "conv5_3_CPM_L2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_3_CPM_L2" + type: "ReLU" + bottom: "conv5_3_CPM_L2" + top: "conv5_3_CPM_L2" +} +layer { + name: "conv5_4_CPM_L1" + type: "Convolution" + bottom: "conv5_3_CPM_L1" + top: "conv5_4_CPM_L1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_4_CPM_L1" + type: "ReLU" + bottom: "conv5_4_CPM_L1" + top: "conv5_4_CPM_L1" +} +layer { + name: "conv5_4_CPM_L2" + type: "Convolution" + bottom: "conv5_3_CPM_L2" + top: "conv5_4_CPM_L2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_4_CPM_L2" + type: "ReLU" + bottom: "conv5_4_CPM_L2" + top: "conv5_4_CPM_L2" +} +layer { + name: "conv5_5_CPM_L1" + type: "Convolution" + bottom: "conv5_4_CPM_L1" + top: "conv5_5_CPM_L1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 38 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "conv5_5_CPM_L2" + type: "Convolution" + bottom: "conv5_4_CPM_L2" + top: "conv5_5_CPM_L2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 19 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "concat_stage2" + type: "Concat" + bottom: "conv5_5_CPM_L1" + bottom: "conv5_5_CPM_L2" + bottom: "conv4_4_CPM" + top: "concat_stage2" + concat_param { + axis: 1 + } +} +layer { + name: "Mconv1_stage2_L1" + type: "Convolution" + bottom: "concat_stage2" + top: "Mconv1_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage2_L1" + type: "ReLU" + bottom: "Mconv1_stage2_L1" + top: "Mconv1_stage2_L1" +} +layer { + name: "Mconv1_stage2_L2" + type: "Convolution" + bottom: "concat_stage2" + top: "Mconv1_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage2_L2" + type: "ReLU" + bottom: "Mconv1_stage2_L2" + top: "Mconv1_stage2_L2" +} +layer { + name: "Mconv2_stage2_L1" + type: "Convolution" + bottom: "Mconv1_stage2_L1" + top: "Mconv2_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage2_L1" + type: "ReLU" + bottom: "Mconv2_stage2_L1" + top: "Mconv2_stage2_L1" +} +layer { + name: "Mconv2_stage2_L2" + type: "Convolution" + bottom: "Mconv1_stage2_L2" + top: "Mconv2_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage2_L2" + type: "ReLU" + bottom: "Mconv2_stage2_L2" + top: "Mconv2_stage2_L2" +} +layer { + name: "Mconv3_stage2_L1" + type: "Convolution" + bottom: "Mconv2_stage2_L1" + top: "Mconv3_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage2_L1" + type: "ReLU" + bottom: "Mconv3_stage2_L1" + top: "Mconv3_stage2_L1" +} +layer { + name: "Mconv3_stage2_L2" + type: "Convolution" + bottom: "Mconv2_stage2_L2" + top: "Mconv3_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage2_L2" + type: "ReLU" + bottom: "Mconv3_stage2_L2" + top: "Mconv3_stage2_L2" +} +layer { + name: "Mconv4_stage2_L1" + type: "Convolution" + bottom: "Mconv3_stage2_L1" + top: "Mconv4_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage2_L1" + type: "ReLU" + bottom: "Mconv4_stage2_L1" + top: "Mconv4_stage2_L1" +} +layer { + name: "Mconv4_stage2_L2" + type: "Convolution" + bottom: "Mconv3_stage2_L2" + top: "Mconv4_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage2_L2" + type: "ReLU" + bottom: "Mconv4_stage2_L2" + top: "Mconv4_stage2_L2" +} +layer { + name: "Mconv5_stage2_L1" + type: "Convolution" + bottom: "Mconv4_stage2_L1" + top: "Mconv5_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage2_L1" + type: "ReLU" + bottom: "Mconv5_stage2_L1" + top: "Mconv5_stage2_L1" +} +layer { + name: "Mconv5_stage2_L2" + type: "Convolution" + bottom: "Mconv4_stage2_L2" + top: "Mconv5_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage2_L2" + type: "ReLU" + bottom: "Mconv5_stage2_L2" + top: "Mconv5_stage2_L2" +} +layer { + name: "Mconv6_stage2_L1" + type: "Convolution" + bottom: "Mconv5_stage2_L1" + top: "Mconv6_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage2_L1" + type: "ReLU" + bottom: "Mconv6_stage2_L1" + top: "Mconv6_stage2_L1" +} +layer { + name: "Mconv6_stage2_L2" + type: "Convolution" + bottom: "Mconv5_stage2_L2" + top: "Mconv6_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage2_L2" + type: "ReLU" + bottom: "Mconv6_stage2_L2" + top: "Mconv6_stage2_L2" +} +layer { + name: "Mconv7_stage2_L1" + type: "Convolution" + bottom: "Mconv6_stage2_L1" + top: "Mconv7_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 38 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mconv7_stage2_L2" + type: "Convolution" + bottom: "Mconv6_stage2_L2" + top: "Mconv7_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 19 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "concat_stage3" + type: "Concat" + bottom: "Mconv7_stage2_L1" + bottom: "Mconv7_stage2_L2" + bottom: "conv4_4_CPM" + top: "concat_stage3" + concat_param { + axis: 1 + } +} +layer { + name: "Mconv1_stage3_L1" + type: "Convolution" + bottom: "concat_stage3" + top: "Mconv1_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage3_L1" + type: "ReLU" + bottom: "Mconv1_stage3_L1" + top: "Mconv1_stage3_L1" +} +layer { + name: "Mconv1_stage3_L2" + type: "Convolution" + bottom: "concat_stage3" + top: "Mconv1_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage3_L2" + type: "ReLU" + bottom: "Mconv1_stage3_L2" + top: "Mconv1_stage3_L2" +} +layer { + name: "Mconv2_stage3_L1" + type: "Convolution" + bottom: "Mconv1_stage3_L1" + top: "Mconv2_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage3_L1" + type: "ReLU" + bottom: "Mconv2_stage3_L1" + top: "Mconv2_stage3_L1" +} +layer { + name: "Mconv2_stage3_L2" + type: "Convolution" + bottom: "Mconv1_stage3_L2" + top: "Mconv2_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage3_L2" + type: "ReLU" + bottom: "Mconv2_stage3_L2" + top: "Mconv2_stage3_L2" +} +layer { + name: "Mconv3_stage3_L1" + type: "Convolution" + bottom: "Mconv2_stage3_L1" + top: "Mconv3_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage3_L1" + type: "ReLU" + bottom: "Mconv3_stage3_L1" + top: "Mconv3_stage3_L1" +} +layer { + name: "Mconv3_stage3_L2" + type: "Convolution" + bottom: "Mconv2_stage3_L2" + top: "Mconv3_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage3_L2" + type: "ReLU" + bottom: "Mconv3_stage3_L2" + top: "Mconv3_stage3_L2" +} +layer { + name: "Mconv4_stage3_L1" + type: "Convolution" + bottom: "Mconv3_stage3_L1" + top: "Mconv4_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage3_L1" + type: "ReLU" + bottom: "Mconv4_stage3_L1" + top: "Mconv4_stage3_L1" +} +layer { + name: "Mconv4_stage3_L2" + type: "Convolution" + bottom: "Mconv3_stage3_L2" + top: "Mconv4_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage3_L2" + type: "ReLU" + bottom: "Mconv4_stage3_L2" + top: "Mconv4_stage3_L2" +} +layer { + name: "Mconv5_stage3_L1" + type: "Convolution" + bottom: "Mconv4_stage3_L1" + top: "Mconv5_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage3_L1" + type: "ReLU" + bottom: "Mconv5_stage3_L1" + top: "Mconv5_stage3_L1" +} +layer { + name: "Mconv5_stage3_L2" + type: "Convolution" + bottom: "Mconv4_stage3_L2" + top: "Mconv5_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage3_L2" + type: "ReLU" + bottom: "Mconv5_stage3_L2" + top: "Mconv5_stage3_L2" +} +layer { + name: "Mconv6_stage3_L1" + type: "Convolution" + bottom: "Mconv5_stage3_L1" + top: "Mconv6_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage3_L1" + type: "ReLU" + bottom: "Mconv6_stage3_L1" + top: "Mconv6_stage3_L1" +} +layer { + name: "Mconv6_stage3_L2" + type: "Convolution" + bottom: "Mconv5_stage3_L2" + top: "Mconv6_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage3_L2" + type: "ReLU" + bottom: "Mconv6_stage3_L2" + top: "Mconv6_stage3_L2" +} +layer { + name: "Mconv7_stage3_L1" + type: "Convolution" + bottom: "Mconv6_stage3_L1" + top: "Mconv7_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 38 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mconv7_stage3_L2" + type: "Convolution" + bottom: "Mconv6_stage3_L2" + top: "Mconv7_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 19 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "concat_stage4" + type: "Concat" + bottom: "Mconv7_stage3_L1" + bottom: "Mconv7_stage3_L2" + bottom: "conv4_4_CPM" + top: "concat_stage4" + concat_param { + axis: 1 + } +} +layer { + name: "Mconv1_stage4_L1" + type: "Convolution" + bottom: "concat_stage4" + top: "Mconv1_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage4_L1" + type: "ReLU" + bottom: "Mconv1_stage4_L1" + top: "Mconv1_stage4_L1" +} +layer { + name: "Mconv1_stage4_L2" + type: "Convolution" + bottom: "concat_stage4" + top: "Mconv1_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage4_L2" + type: "ReLU" + bottom: "Mconv1_stage4_L2" + top: "Mconv1_stage4_L2" +} +layer { + name: "Mconv2_stage4_L1" + type: "Convolution" + bottom: "Mconv1_stage4_L1" + top: "Mconv2_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage4_L1" + type: "ReLU" + bottom: "Mconv2_stage4_L1" + top: "Mconv2_stage4_L1" +} +layer { + name: "Mconv2_stage4_L2" + type: "Convolution" + bottom: "Mconv1_stage4_L2" + top: "Mconv2_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage4_L2" + type: "ReLU" + bottom: "Mconv2_stage4_L2" + top: "Mconv2_stage4_L2" +} +layer { + name: "Mconv3_stage4_L1" + type: "Convolution" + bottom: "Mconv2_stage4_L1" + top: "Mconv3_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage4_L1" + type: "ReLU" + bottom: "Mconv3_stage4_L1" + top: "Mconv3_stage4_L1" +} +layer { + name: "Mconv3_stage4_L2" + type: "Convolution" + bottom: "Mconv2_stage4_L2" + top: "Mconv3_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage4_L2" + type: "ReLU" + bottom: "Mconv3_stage4_L2" + top: "Mconv3_stage4_L2" +} +layer { + name: "Mconv4_stage4_L1" + type: "Convolution" + bottom: "Mconv3_stage4_L1" + top: "Mconv4_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage4_L1" + type: "ReLU" + bottom: "Mconv4_stage4_L1" + top: "Mconv4_stage4_L1" +} +layer { + name: "Mconv4_stage4_L2" + type: "Convolution" + bottom: "Mconv3_stage4_L2" + top: "Mconv4_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage4_L2" + type: "ReLU" + bottom: "Mconv4_stage4_L2" + top: "Mconv4_stage4_L2" +} +layer { + name: "Mconv5_stage4_L1" + type: "Convolution" + bottom: "Mconv4_stage4_L1" + top: "Mconv5_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage4_L1" + type: "ReLU" + bottom: "Mconv5_stage4_L1" + top: "Mconv5_stage4_L1" +} +layer { + name: "Mconv5_stage4_L2" + type: "Convolution" + bottom: "Mconv4_stage4_L2" + top: "Mconv5_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage4_L2" + type: "ReLU" + bottom: "Mconv5_stage4_L2" + top: "Mconv5_stage4_L2" +} +layer { + name: "Mconv6_stage4_L1" + type: "Convolution" + bottom: "Mconv5_stage4_L1" + top: "Mconv6_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage4_L1" + type: "ReLU" + bottom: "Mconv6_stage4_L1" + top: "Mconv6_stage4_L1" +} +layer { + name: "Mconv6_stage4_L2" + type: "Convolution" + bottom: "Mconv5_stage4_L2" + top: "Mconv6_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage4_L2" + type: "ReLU" + bottom: "Mconv6_stage4_L2" + top: "Mconv6_stage4_L2" +} +layer { + name: "Mconv7_stage4_L1" + type: "Convolution" + bottom: "Mconv6_stage4_L1" + top: "Mconv7_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 38 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mconv7_stage4_L2" + type: "Convolution" + bottom: "Mconv6_stage4_L2" + top: "Mconv7_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 19 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "concat_stage5" + type: "Concat" + bottom: "Mconv7_stage4_L1" + bottom: "Mconv7_stage4_L2" + bottom: "conv4_4_CPM" + top: "concat_stage5" + concat_param { + axis: 1 + } +} +layer { + name: "Mconv1_stage5_L1" + type: "Convolution" + bottom: "concat_stage5" + top: "Mconv1_stage5_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage5_L1" + type: "ReLU" + bottom: "Mconv1_stage5_L1" + top: "Mconv1_stage5_L1" +} +layer { + name: "Mconv1_stage5_L2" + type: "Convolution" + bottom: "concat_stage5" + top: "Mconv1_stage5_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage5_L2" + type: "ReLU" + bottom: "Mconv1_stage5_L2" + top: "Mconv1_stage5_L2" +} +layer { + name: "Mconv2_stage5_L1" + type: "Convolution" + bottom: "Mconv1_stage5_L1" + top: "Mconv2_stage5_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage5_L1" + type: "ReLU" + bottom: "Mconv2_stage5_L1" + top: "Mconv2_stage5_L1" +} +layer { + name: "Mconv2_stage5_L2" + type: "Convolution" + bottom: "Mconv1_stage5_L2" + top: "Mconv2_stage5_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage5_L2" + type: "ReLU" + bottom: "Mconv2_stage5_L2" + top: "Mconv2_stage5_L2" +} +layer { + name: "Mconv3_stage5_L1" + type: "Convolution" + bottom: "Mconv2_stage5_L1" + top: "Mconv3_stage5_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage5_L1" + type: "ReLU" + bottom: "Mconv3_stage5_L1" + top: "Mconv3_stage5_L1" +} +layer { + name: "Mconv3_stage5_L2" + type: "Convolution" + bottom: "Mconv2_stage5_L2" + top: "Mconv3_stage5_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage5_L2" + type: "ReLU" + bottom: "Mconv3_stage5_L2" + top: "Mconv3_stage5_L2" +} +layer { + name: "Mconv4_stage5_L1" + type: "Convolution" + bottom: "Mconv3_stage5_L1" + top: "Mconv4_stage5_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage5_L1" + type: "ReLU" + bottom: "Mconv4_stage5_L1" + top: "Mconv4_stage5_L1" +} +layer { + name: "Mconv4_stage5_L2" + type: "Convolution" + bottom: "Mconv3_stage5_L2" + top: "Mconv4_stage5_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage5_L2" + type: "ReLU" + bottom: "Mconv4_stage5_L2" + top: "Mconv4_stage5_L2" +} +layer { + name: "Mconv5_stage5_L1" + type: "Convolution" + bottom: "Mconv4_stage5_L1" + top: "Mconv5_stage5_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage5_L1" + type: "ReLU" + bottom: "Mconv5_stage5_L1" + top: "Mconv5_stage5_L1" +} +layer { + name: "Mconv5_stage5_L2" + type: "Convolution" + bottom: "Mconv4_stage5_L2" + top: "Mconv5_stage5_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage5_L2" + type: "ReLU" + bottom: "Mconv5_stage5_L2" + top: "Mconv5_stage5_L2" +} +layer { + name: "Mconv6_stage5_L1" + type: "Convolution" + bottom: "Mconv5_stage5_L1" + top: "Mconv6_stage5_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage5_L1" + type: "ReLU" + bottom: "Mconv6_stage5_L1" + top: "Mconv6_stage5_L1" +} +layer { + name: "Mconv6_stage5_L2" + type: "Convolution" + bottom: "Mconv5_stage5_L2" + top: "Mconv6_stage5_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage5_L2" + type: "ReLU" + bottom: "Mconv6_stage5_L2" + top: "Mconv6_stage5_L2" +} +layer { + name: "Mconv7_stage5_L1" + type: "Convolution" + bottom: "Mconv6_stage5_L1" + top: "Mconv7_stage5_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 38 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mconv7_stage5_L2" + type: "Convolution" + bottom: "Mconv6_stage5_L2" + top: "Mconv7_stage5_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 19 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "concat_stage6" + type: "Concat" + bottom: "Mconv7_stage5_L1" + bottom: "Mconv7_stage5_L2" + bottom: "conv4_4_CPM" + top: "concat_stage6" + concat_param { + axis: 1 + } +} +layer { + name: "Mconv1_stage6_L1" + type: "Convolution" + bottom: "concat_stage6" + top: "Mconv1_stage6_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage6_L1" + type: "ReLU" + bottom: "Mconv1_stage6_L1" + top: "Mconv1_stage6_L1" +} +layer { + name: "Mconv1_stage6_L2" + type: "Convolution" + bottom: "concat_stage6" + top: "Mconv1_stage6_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage6_L2" + type: "ReLU" + bottom: "Mconv1_stage6_L2" + top: "Mconv1_stage6_L2" +} +layer { + name: "Mconv2_stage6_L1" + type: "Convolution" + bottom: "Mconv1_stage6_L1" + top: "Mconv2_stage6_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage6_L1" + type: "ReLU" + bottom: "Mconv2_stage6_L1" + top: "Mconv2_stage6_L1" +} +layer { + name: "Mconv2_stage6_L2" + type: "Convolution" + bottom: "Mconv1_stage6_L2" + top: "Mconv2_stage6_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage6_L2" + type: "ReLU" + bottom: "Mconv2_stage6_L2" + top: "Mconv2_stage6_L2" +} +layer { + name: "Mconv3_stage6_L1" + type: "Convolution" + bottom: "Mconv2_stage6_L1" + top: "Mconv3_stage6_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage6_L1" + type: "ReLU" + bottom: "Mconv3_stage6_L1" + top: "Mconv3_stage6_L1" +} +layer { + name: "Mconv3_stage6_L2" + type: "Convolution" + bottom: "Mconv2_stage6_L2" + top: "Mconv3_stage6_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage6_L2" + type: "ReLU" + bottom: "Mconv3_stage6_L2" + top: "Mconv3_stage6_L2" +} +layer { + name: "Mconv4_stage6_L1" + type: "Convolution" + bottom: "Mconv3_stage6_L1" + top: "Mconv4_stage6_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage6_L1" + type: "ReLU" + bottom: "Mconv4_stage6_L1" + top: "Mconv4_stage6_L1" +} +layer { + name: "Mconv4_stage6_L2" + type: "Convolution" + bottom: "Mconv3_stage6_L2" + top: "Mconv4_stage6_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage6_L2" + type: "ReLU" + bottom: "Mconv4_stage6_L2" + top: "Mconv4_stage6_L2" +} +layer { + name: "Mconv5_stage6_L1" + type: "Convolution" + bottom: "Mconv4_stage6_L1" + top: "Mconv5_stage6_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage6_L1" + type: "ReLU" + bottom: "Mconv5_stage6_L1" + top: "Mconv5_stage6_L1" +} +layer { + name: "Mconv5_stage6_L2" + type: "Convolution" + bottom: "Mconv4_stage6_L2" + top: "Mconv5_stage6_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage6_L2" + type: "ReLU" + bottom: "Mconv5_stage6_L2" + top: "Mconv5_stage6_L2" +} +layer { + name: "Mconv6_stage6_L1" + type: "Convolution" + bottom: "Mconv5_stage6_L1" + top: "Mconv6_stage6_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage6_L1" + type: "ReLU" + bottom: "Mconv6_stage6_L1" + top: "Mconv6_stage6_L1" +} +layer { + name: "Mconv6_stage6_L2" + type: "Convolution" + bottom: "Mconv5_stage6_L2" + top: "Mconv6_stage6_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage6_L2" + type: "ReLU" + bottom: "Mconv6_stage6_L2" + top: "Mconv6_stage6_L2" +} +layer { + name: "Mconv7_stage6_L1" + type: "Convolution" + bottom: "Mconv6_stage6_L1" + top: "Mconv7_stage6_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 38 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mconv7_stage6_L2" + type: "Convolution" + bottom: "Mconv6_stage6_L2" + top: "Mconv7_stage6_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 19 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "concat_stage7" + type: "Concat" + bottom: "Mconv7_stage6_L2" + bottom: "Mconv7_stage6_L1" + # top: "concat_stage7" + top: "net_output" + concat_param { + axis: 1 + } +} \ No newline at end of file diff --git a/res/pose/mpi/pose_deploy_linevec_faster_4_stages.prototxt b/res/pose/mpi/pose_deploy_linevec_faster_4_stages.prototxt new file mode 100644 index 0000000..02ec183 --- /dev/null +++ b/res/pose/mpi/pose_deploy_linevec_faster_4_stages.prototxt @@ -0,0 +1,2081 @@ +input: "image" +input_dim: 1 +input_dim: 3 +input_dim: 1 # This value will be defined at runtime +input_dim: 1 # This value will be defined at runtime +layer { + name: "conv1_1" + type: "Convolution" + bottom: "image" + top: "conv1_1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu1_1" + type: "ReLU" + bottom: "conv1_1" + top: "conv1_1" +} +layer { + name: "conv1_2" + type: "Convolution" + bottom: "conv1_1" + top: "conv1_2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu1_2" + type: "ReLU" + bottom: "conv1_2" + top: "conv1_2" +} +layer { + name: "pool1_stage1" + type: "Pooling" + bottom: "conv1_2" + top: "pool1_stage1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv2_1" + type: "Convolution" + bottom: "pool1_stage1" + top: "conv2_1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu2_1" + type: "ReLU" + bottom: "conv2_1" + top: "conv2_1" +} +layer { + name: "conv2_2" + type: "Convolution" + bottom: "conv2_1" + top: "conv2_2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu2_2" + type: "ReLU" + bottom: "conv2_2" + top: "conv2_2" +} +layer { + name: "pool2_stage1" + type: "Pooling" + bottom: "conv2_2" + top: "pool2_stage1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv3_1" + type: "Convolution" + bottom: "pool2_stage1" + top: "conv3_1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu3_1" + type: "ReLU" + bottom: "conv3_1" + top: "conv3_1" +} +layer { + name: "conv3_2" + type: "Convolution" + bottom: "conv3_1" + top: "conv3_2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu3_2" + type: "ReLU" + bottom: "conv3_2" + top: "conv3_2" +} +layer { + name: "conv3_3" + type: "Convolution" + bottom: "conv3_2" + top: "conv3_3" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu3_3" + type: "ReLU" + bottom: "conv3_3" + top: "conv3_3" +} +layer { + name: "conv3_4" + type: "Convolution" + bottom: "conv3_3" + top: "conv3_4" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu3_4" + type: "ReLU" + bottom: "conv3_4" + top: "conv3_4" +} +layer { + name: "pool3_stage1" + type: "Pooling" + bottom: "conv3_4" + top: "pool3_stage1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv4_1" + type: "Convolution" + bottom: "pool3_stage1" + top: "conv4_1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu4_1" + type: "ReLU" + bottom: "conv4_1" + top: "conv4_1" +} +layer { + name: "conv4_2" + type: "Convolution" + bottom: "conv4_1" + top: "conv4_2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu4_2" + type: "ReLU" + bottom: "conv4_2" + top: "conv4_2" +} +layer { + name: "conv4_3_CPM" + type: "Convolution" + bottom: "conv4_2" + top: "conv4_3_CPM" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu4_3_CPM" + type: "ReLU" + bottom: "conv4_3_CPM" + top: "conv4_3_CPM" +} +layer { + name: "conv4_4_CPM" + type: "Convolution" + bottom: "conv4_3_CPM" + top: "conv4_4_CPM" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu4_4_CPM" + type: "ReLU" + bottom: "conv4_4_CPM" + top: "conv4_4_CPM" +} +layer { + name: "conv5_1_CPM_L1" + type: "Convolution" + bottom: "conv4_4_CPM" + top: "conv5_1_CPM_L1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_1_CPM_L1" + type: "ReLU" + bottom: "conv5_1_CPM_L1" + top: "conv5_1_CPM_L1" +} +layer { + name: "conv5_1_CPM_L2" + type: "Convolution" + bottom: "conv4_4_CPM" + top: "conv5_1_CPM_L2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_1_CPM_L2" + type: "ReLU" + bottom: "conv5_1_CPM_L2" + top: "conv5_1_CPM_L2" +} +layer { + name: "conv5_2_CPM_L1" + type: "Convolution" + bottom: "conv5_1_CPM_L1" + top: "conv5_2_CPM_L1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_2_CPM_L1" + type: "ReLU" + bottom: "conv5_2_CPM_L1" + top: "conv5_2_CPM_L1" +} +layer { + name: "conv5_2_CPM_L2" + type: "Convolution" + bottom: "conv5_1_CPM_L2" + top: "conv5_2_CPM_L2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_2_CPM_L2" + type: "ReLU" + bottom: "conv5_2_CPM_L2" + top: "conv5_2_CPM_L2" +} +layer { + name: "conv5_3_CPM_L1" + type: "Convolution" + bottom: "conv5_2_CPM_L1" + top: "conv5_3_CPM_L1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_3_CPM_L1" + type: "ReLU" + bottom: "conv5_3_CPM_L1" + top: "conv5_3_CPM_L1" +} +layer { + name: "conv5_3_CPM_L2" + type: "Convolution" + bottom: "conv5_2_CPM_L2" + top: "conv5_3_CPM_L2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_3_CPM_L2" + type: "ReLU" + bottom: "conv5_3_CPM_L2" + top: "conv5_3_CPM_L2" +} +layer { + name: "conv5_4_CPM_L1" + type: "Convolution" + bottom: "conv5_3_CPM_L1" + top: "conv5_4_CPM_L1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_4_CPM_L1" + type: "ReLU" + bottom: "conv5_4_CPM_L1" + top: "conv5_4_CPM_L1" +} +layer { + name: "conv5_4_CPM_L2" + type: "Convolution" + bottom: "conv5_3_CPM_L2" + top: "conv5_4_CPM_L2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_4_CPM_L2" + type: "ReLU" + bottom: "conv5_4_CPM_L2" + top: "conv5_4_CPM_L2" +} +layer { + name: "conv5_5_CPM_L1" + type: "Convolution" + bottom: "conv5_4_CPM_L1" + top: "conv5_5_CPM_L1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 28 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "conv5_5_CPM_L2" + type: "Convolution" + bottom: "conv5_4_CPM_L2" + top: "conv5_5_CPM_L2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 16 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "concat_stage2" + type: "Concat" + bottom: "conv5_5_CPM_L1" + bottom: "conv5_5_CPM_L2" + bottom: "conv4_4_CPM" + top: "concat_stage2" + concat_param { + axis: 1 + } +} +layer { + name: "Mconv1_stage2_L1" + type: "Convolution" + bottom: "concat_stage2" + top: "Mconv1_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage2_L1" + type: "ReLU" + bottom: "Mconv1_stage2_L1" + top: "Mconv1_stage2_L1" +} +layer { + name: "Mconv1_stage2_L2" + type: "Convolution" + bottom: "concat_stage2" + top: "Mconv1_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage2_L2" + type: "ReLU" + bottom: "Mconv1_stage2_L2" + top: "Mconv1_stage2_L2" +} +layer { + name: "Mconv2_stage2_L1" + type: "Convolution" + bottom: "Mconv1_stage2_L1" + top: "Mconv2_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage2_L1" + type: "ReLU" + bottom: "Mconv2_stage2_L1" + top: "Mconv2_stage2_L1" +} +layer { + name: "Mconv2_stage2_L2" + type: "Convolution" + bottom: "Mconv1_stage2_L2" + top: "Mconv2_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage2_L2" + type: "ReLU" + bottom: "Mconv2_stage2_L2" + top: "Mconv2_stage2_L2" +} +layer { + name: "Mconv3_stage2_L1" + type: "Convolution" + bottom: "Mconv2_stage2_L1" + top: "Mconv3_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage2_L1" + type: "ReLU" + bottom: "Mconv3_stage2_L1" + top: "Mconv3_stage2_L1" +} +layer { + name: "Mconv3_stage2_L2" + type: "Convolution" + bottom: "Mconv2_stage2_L2" + top: "Mconv3_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage2_L2" + type: "ReLU" + bottom: "Mconv3_stage2_L2" + top: "Mconv3_stage2_L2" +} +layer { + name: "Mconv4_stage2_L1" + type: "Convolution" + bottom: "Mconv3_stage2_L1" + top: "Mconv4_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage2_L1" + type: "ReLU" + bottom: "Mconv4_stage2_L1" + top: "Mconv4_stage2_L1" +} +layer { + name: "Mconv4_stage2_L2" + type: "Convolution" + bottom: "Mconv3_stage2_L2" + top: "Mconv4_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage2_L2" + type: "ReLU" + bottom: "Mconv4_stage2_L2" + top: "Mconv4_stage2_L2" +} +layer { + name: "Mconv5_stage2_L1" + type: "Convolution" + bottom: "Mconv4_stage2_L1" + top: "Mconv5_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage2_L1" + type: "ReLU" + bottom: "Mconv5_stage2_L1" + top: "Mconv5_stage2_L1" +} +layer { + name: "Mconv5_stage2_L2" + type: "Convolution" + bottom: "Mconv4_stage2_L2" + top: "Mconv5_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage2_L2" + type: "ReLU" + bottom: "Mconv5_stage2_L2" + top: "Mconv5_stage2_L2" +} +layer { + name: "Mconv6_stage2_L1" + type: "Convolution" + bottom: "Mconv5_stage2_L1" + top: "Mconv6_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage2_L1" + type: "ReLU" + bottom: "Mconv6_stage2_L1" + top: "Mconv6_stage2_L1" +} +layer { + name: "Mconv6_stage2_L2" + type: "Convolution" + bottom: "Mconv5_stage2_L2" + top: "Mconv6_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage2_L2" + type: "ReLU" + bottom: "Mconv6_stage2_L2" + top: "Mconv6_stage2_L2" +} +layer { + name: "Mconv7_stage2_L1" + type: "Convolution" + bottom: "Mconv6_stage2_L1" + top: "Mconv7_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 28 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mconv7_stage2_L2" + type: "Convolution" + bottom: "Mconv6_stage2_L2" + top: "Mconv7_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 16 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "concat_stage3" + type: "Concat" + bottom: "Mconv7_stage2_L1" + bottom: "Mconv7_stage2_L2" + bottom: "conv4_4_CPM" + top: "concat_stage3" + concat_param { + axis: 1 + } +} +layer { + name: "Mconv1_stage3_L1" + type: "Convolution" + bottom: "concat_stage3" + top: "Mconv1_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage3_L1" + type: "ReLU" + bottom: "Mconv1_stage3_L1" + top: "Mconv1_stage3_L1" +} +layer { + name: "Mconv1_stage3_L2" + type: "Convolution" + bottom: "concat_stage3" + top: "Mconv1_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage3_L2" + type: "ReLU" + bottom: "Mconv1_stage3_L2" + top: "Mconv1_stage3_L2" +} +layer { + name: "Mconv2_stage3_L1" + type: "Convolution" + bottom: "Mconv1_stage3_L1" + top: "Mconv2_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage3_L1" + type: "ReLU" + bottom: "Mconv2_stage3_L1" + top: "Mconv2_stage3_L1" +} +layer { + name: "Mconv2_stage3_L2" + type: "Convolution" + bottom: "Mconv1_stage3_L2" + top: "Mconv2_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage3_L2" + type: "ReLU" + bottom: "Mconv2_stage3_L2" + top: "Mconv2_stage3_L2" +} +layer { + name: "Mconv3_stage3_L1" + type: "Convolution" + bottom: "Mconv2_stage3_L1" + top: "Mconv3_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage3_L1" + type: "ReLU" + bottom: "Mconv3_stage3_L1" + top: "Mconv3_stage3_L1" +} +layer { + name: "Mconv3_stage3_L2" + type: "Convolution" + bottom: "Mconv2_stage3_L2" + top: "Mconv3_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage3_L2" + type: "ReLU" + bottom: "Mconv3_stage3_L2" + top: "Mconv3_stage3_L2" +} +layer { + name: "Mconv4_stage3_L1" + type: "Convolution" + bottom: "Mconv3_stage3_L1" + top: "Mconv4_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage3_L1" + type: "ReLU" + bottom: "Mconv4_stage3_L1" + top: "Mconv4_stage3_L1" +} +layer { + name: "Mconv4_stage3_L2" + type: "Convolution" + bottom: "Mconv3_stage3_L2" + top: "Mconv4_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage3_L2" + type: "ReLU" + bottom: "Mconv4_stage3_L2" + top: "Mconv4_stage3_L2" +} +layer { + name: "Mconv5_stage3_L1" + type: "Convolution" + bottom: "Mconv4_stage3_L1" + top: "Mconv5_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage3_L1" + type: "ReLU" + bottom: "Mconv5_stage3_L1" + top: "Mconv5_stage3_L1" +} +layer { + name: "Mconv5_stage3_L2" + type: "Convolution" + bottom: "Mconv4_stage3_L2" + top: "Mconv5_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage3_L2" + type: "ReLU" + bottom: "Mconv5_stage3_L2" + top: "Mconv5_stage3_L2" +} +layer { + name: "Mconv6_stage3_L1" + type: "Convolution" + bottom: "Mconv5_stage3_L1" + top: "Mconv6_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage3_L1" + type: "ReLU" + bottom: "Mconv6_stage3_L1" + top: "Mconv6_stage3_L1" +} +layer { + name: "Mconv6_stage3_L2" + type: "Convolution" + bottom: "Mconv5_stage3_L2" + top: "Mconv6_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage3_L2" + type: "ReLU" + bottom: "Mconv6_stage3_L2" + top: "Mconv6_stage3_L2" +} +layer { + name: "Mconv7_stage3_L1" + type: "Convolution" + bottom: "Mconv6_stage3_L1" + top: "Mconv7_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 28 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mconv7_stage3_L2" + type: "Convolution" + bottom: "Mconv6_stage3_L2" + top: "Mconv7_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 16 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "concat_stage4" + type: "Concat" + bottom: "Mconv7_stage3_L1" + bottom: "Mconv7_stage3_L2" + bottom: "conv4_4_CPM" + top: "concat_stage4" + concat_param { + axis: 1 + } +} +layer { + name: "Mconv1_stage4_L1" + type: "Convolution" + bottom: "concat_stage4" + top: "Mconv1_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage4_L1" + type: "ReLU" + bottom: "Mconv1_stage4_L1" + top: "Mconv1_stage4_L1" +} +layer { + name: "Mconv1_stage4_L2" + type: "Convolution" + bottom: "concat_stage4" + top: "Mconv1_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage4_L2" + type: "ReLU" + bottom: "Mconv1_stage4_L2" + top: "Mconv1_stage4_L2" +} +layer { + name: "Mconv2_stage4_L1" + type: "Convolution" + bottom: "Mconv1_stage4_L1" + top: "Mconv2_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage4_L1" + type: "ReLU" + bottom: "Mconv2_stage4_L1" + top: "Mconv2_stage4_L1" +} +layer { + name: "Mconv2_stage4_L2" + type: "Convolution" + bottom: "Mconv1_stage4_L2" + top: "Mconv2_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage4_L2" + type: "ReLU" + bottom: "Mconv2_stage4_L2" + top: "Mconv2_stage4_L2" +} +layer { + name: "Mconv3_stage4_L1" + type: "Convolution" + bottom: "Mconv2_stage4_L1" + top: "Mconv3_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage4_L1" + type: "ReLU" + bottom: "Mconv3_stage4_L1" + top: "Mconv3_stage4_L1" +} +layer { + name: "Mconv3_stage4_L2" + type: "Convolution" + bottom: "Mconv2_stage4_L2" + top: "Mconv3_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage4_L2" + type: "ReLU" + bottom: "Mconv3_stage4_L2" + top: "Mconv3_stage4_L2" +} +layer { + name: "Mconv4_stage4_L1" + type: "Convolution" + bottom: "Mconv3_stage4_L1" + top: "Mconv4_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage4_L1" + type: "ReLU" + bottom: "Mconv4_stage4_L1" + top: "Mconv4_stage4_L1" +} +layer { + name: "Mconv4_stage4_L2" + type: "Convolution" + bottom: "Mconv3_stage4_L2" + top: "Mconv4_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage4_L2" + type: "ReLU" + bottom: "Mconv4_stage4_L2" + top: "Mconv4_stage4_L2" +} +layer { + name: "Mconv5_stage4_L1" + type: "Convolution" + bottom: "Mconv4_stage4_L1" + top: "Mconv5_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage4_L1" + type: "ReLU" + bottom: "Mconv5_stage4_L1" + top: "Mconv5_stage4_L1" +} +layer { + name: "Mconv5_stage4_L2" + type: "Convolution" + bottom: "Mconv4_stage4_L2" + top: "Mconv5_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage4_L2" + type: "ReLU" + bottom: "Mconv5_stage4_L2" + top: "Mconv5_stage4_L2" +} +layer { + name: "Mconv6_stage4_L1" + type: "Convolution" + bottom: "Mconv5_stage4_L1" + top: "Mconv6_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage4_L1" + type: "ReLU" + bottom: "Mconv6_stage4_L1" + top: "Mconv6_stage4_L1" +} +layer { + name: "Mconv6_stage4_L2" + type: "Convolution" + bottom: "Mconv5_stage4_L2" + top: "Mconv6_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage4_L2" + type: "ReLU" + bottom: "Mconv6_stage4_L2" + top: "Mconv6_stage4_L2" +} +layer { + name: "Mconv7_stage4_L1" + type: "Convolution" + bottom: "Mconv6_stage4_L1" + top: "Mconv7_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 28 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mconv7_stage4_L2" + type: "Convolution" + bottom: "Mconv6_stage4_L2" + top: "Mconv7_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 16 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "concat_stage7" + type: "Concat" + bottom: "Mconv7_stage4_L2" + bottom: "Mconv7_stage4_L1" + top: "net_output" + concat_param { + axis: 1 + } +} diff --git a/src/collision/collision.h b/src/collision/collision.h index d04f974..dadb11f 100644 --- a/src/collision/collision.h +++ b/src/collision/collision.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include "../entities/entity.h" @@ -15,6 +16,18 @@ namespace collision { glm::vec3 center_pos; glm::vec3 size; + + void SetRotation(float angle) + { + double sinTheta = glm::sin(glm::radians(angle)); + double cosTheta = glm::cos(glm::radians(angle)); + + float x = size.x * cosTheta + size.z * sinTheta; + float z = size.z * cosTheta - size.x * sinTheta; + + size.x = x < 0 ? -x : x; + size.z = z < 0 ? -z : z; + } }; /* diff --git a/src/computervision/FaceDetector.cpp b/src/computervision/FaceDetector.cpp deleted file mode 100644 index a628983..0000000 --- a/src/computervision/FaceDetector.cpp +++ /dev/null @@ -1,53 +0,0 @@ -#include "FaceDetector.h" - - -/* - Author: Pierfrancesco Soffritti https://github.com/PierfrancescoSoffritti -*/ -namespace computervision -{ - Rect getFaceRect(Mat input); - - String faceClassifierFileName = "res/haarcascade_frontalface_alt.xml"; - CascadeClassifier faceCascadeClassifier; - - FaceDetector::FaceDetector(void) { - if (!faceCascadeClassifier.load(faceClassifierFileName)) - throw runtime_error("can't load file " + faceClassifierFileName); - } - - void FaceDetector::removeFaces(Mat input, Mat output) { - vector faces; - Mat frameGray; - - cvtColor(input, frameGray, CV_BGR2GRAY); - equalizeHist(frameGray, frameGray); - - faceCascadeClassifier.detectMultiScale(frameGray, faces, 1.1, 2, 0 | 2, Size(120, 120)); // HAAR_SCALE_IMAGE is 2 - - for (size_t i = 0; i < faces.size(); i++) { - rectangle( - output, - Point(faces[i].x, faces[i].y), - Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), - Scalar(0, 0, 0), - -1 - ); - } - } - - Rect getFaceRect(Mat input) { - vector faceRectangles; - Mat inputGray; - - cvtColor(input, inputGray, CV_BGR2GRAY); - equalizeHist(inputGray, inputGray); - - faceCascadeClassifier.detectMultiScale(inputGray, faceRectangles, 1.1, 2, 0 | 2, Size(120, 120)); // HAAR_SCALE_IMAGE is 2 - - if (faceRectangles.size() > 0) - return faceRectangles[0]; - else - return Rect(0, 0, 1, 1); - } -} \ No newline at end of file diff --git a/src/computervision/FaceDetector.h b/src/computervision/FaceDetector.h deleted file mode 100644 index 208e051..0000000 --- a/src/computervision/FaceDetector.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include -/* - Author: Pierfrancesco Soffritti https://github.com/PierfrancescoSoffritti -*/ - -using namespace cv; -using namespace std; - -namespace computervision -{ - class FaceDetector { - public: - /** - * @brief Constructor for the class FaceDetector, loads training data from a file - * - */ - FaceDetector(void); - /** - * @brief Detects faces on an image and blocks them with a black rectangle - * - * @param input Input image - * @param output Output image - */ - void removeFaces(Mat input, Mat output); - }; -} \ No newline at end of file diff --git a/src/computervision/FingerCount.cpp b/src/computervision/FingerCount.cpp index 590e2a2..bdd1938 100644 --- a/src/computervision/FingerCount.cpp +++ b/src/computervision/FingerCount.cpp @@ -14,6 +14,7 @@ namespace computervision { + FingerCount::FingerCount(void) { color_blue = Scalar(255, 0, 0); color_green = Scalar(0, 255, 0); @@ -35,9 +36,6 @@ namespace computervision if (input_image.channels() != 1) return contours_image; - vector> contours; - vector hierarchy; - findContours(input_image, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); // we need at least one contour to work @@ -45,7 +43,7 @@ namespace computervision return contours_image; // find the biggest contour (let's suppose it's our hand) - int biggest_contour_index = -1; + biggest_contour_index = -1; double biggest_area = 0.0; for (int i = 0; i < contours.size(); i++) { @@ -156,6 +154,11 @@ namespace computervision return contours_image; } + void FingerCount::DrawHandContours(Mat& image) + { + drawContours(image, contours, biggest_contour_index, color_green, 2, 8, hierarchy); + } + int FingerCount::getAmountOfFingers() { return amount_of_fingers; diff --git a/src/computervision/FingerCount.h b/src/computervision/FingerCount.h index 3319150..4b31c92 100644 --- a/src/computervision/FingerCount.h +++ b/src/computervision/FingerCount.h @@ -31,7 +31,15 @@ namespace computervision */ int getAmountOfFingers(); + void DrawHandContours(Mat& image); + private: + + int biggest_contour_index; + vector> contours; + vector hierarchy; + + // colors to use Scalar color_blue; Scalar color_green; @@ -115,5 +123,7 @@ namespace computervision * @param with_numbers if the numbers should be drawn with the points */ void drawVectorPoints(Mat image, vector points, Scalar color, bool with_numbers); + + }; } \ No newline at end of file diff --git a/src/computervision/HandDetectRegion.cpp b/src/computervision/HandDetectRegion.cpp new file mode 100644 index 0000000..87f3538 --- /dev/null +++ b/src/computervision/HandDetectRegion.cpp @@ -0,0 +1,105 @@ + +#include "HandDetectRegion.h" + +namespace computervision +{ + + HandDetectRegion::HandDetectRegion(std::string id,int x_pos, int y_pos, int width, int height) + { + region_id = id; + start_x_pos = x_pos; + start_y_pos = y_pos; + region_width = width; + region_height = height; + hand_mask_generated = false; + hand_present = false; + } + + void HandDetectRegion::DetectHand(cv::Mat& camera_frame) + { + Mat input_frame = GenerateHandMaskSquare(camera_frame); + frame_out = input_frame.clone(); + + // detect skin color + skin_detector.drawSkinColorSampler(camera_frame,start_x_pos,start_y_pos,region_width,region_height); + + // remove background from image + foreground = background_remover.getForeground(input_frame); + + // detect the hand contours + handMask = skin_detector.getSkinMask(foreground); + + // draw the hand rectangle on the camera input, and draw text showing if the hand is open or closed. + DrawHandMask(&camera_frame); + + //imshow("output" + region_id, frame_out); + //imshow("foreground" + region_id, foreground); + //imshow("handMask" + region_id, handMask); + /*imshow("handDetection", fingerCountDebug);*/ + + hand_present = hand_calibrator.CheckIfHandPresent(handMask,handcalibration::HandDetectionType::GAME); + //std::string text = (hand_present ? "hand" : "no"); + //cv::putText(camera_frame, text, cv::Point(start_x_pos, start_y_pos), cv::FONT_HERSHEY_COMPLEX, 2.0, cv::Scalar(0, 255, 255), 2); + hand_calibrator.SetHandPresent(hand_present); + + //draw black rectangle behind calibration information text + cv::rectangle(camera_frame, cv::Rect(0, camera_frame.rows - 55, 450, camera_frame.cols), cv::Scalar(0, 0, 0), -1); + + hand_calibrator.DrawBackgroundSkinCalibrated(camera_frame); + + + + } + + cv::Mat HandDetectRegion::GenerateHandMaskSquare(cv::Mat img) + { + cv::Mat mask = cv::Mat::zeros(img.size(), img.type()); + cv::Mat distance_img = cv::Mat::zeros(img.size(), img.type()); + + cv::rectangle(mask, cv::Rect(start_x_pos, start_y_pos, region_width, region_height), cv::Scalar(255, 255, 255), -1); + + img.copyTo(distance_img, mask); + + hand_mask_generated = true; + return distance_img; + } + + bool HandDetectRegion::DrawHandMask(cv::Mat* input) + { + if (!hand_mask_generated) return false; + rectangle(*input, Rect(start_x_pos, start_y_pos, region_width, region_height), (hand_present ? Scalar(0, 255, 0) : Scalar(0,0,255)),2); + return true; + } + + bool HandDetectRegion::IsHandPresent() + { + return hand_present; + } + + void HandDetectRegion::CalibrateBackground() + { + std::cout << "calibrating background " << region_id << std::endl; + background_remover.calibrate(frame_out); + hand_calibrator.SetBackGroundCalibrated(true); + } + void HandDetectRegion::CalibrateSkin() + { + skin_detector.calibrate(frame_out); + hand_calibrator.SetSkinCalibration(true); + } + + std::vector HandDetectRegion::CalculateSkinTresholds() + { + std::cout << "calibrating skin " << region_id << std::endl; + hand_calibrator.SetSkinCalibration(true); + return skin_detector.calibrateAndReturn(frame_out); + } + + void HandDetectRegion::setSkinTresholds(std::vector& tresholds) + { + std::cout << "setting skin " << region_id << std::endl; + skin_detector.setTresholds(tresholds); + hand_calibrator.SetSkinCalibration(true); + } + +} diff --git a/src/computervision/HandDetectRegion.h b/src/computervision/HandDetectRegion.h new file mode 100644 index 0000000..7cc1a9a --- /dev/null +++ b/src/computervision/HandDetectRegion.h @@ -0,0 +1,56 @@ +#pragma once + +#include +#include +#include "async/StaticCameraInstance.h" +#include "calibration/HandCalibrator.h" +#include "BackgroundRemover.h" +#include "SkinDetector.h" +#include "FingerCount.h" +namespace computervision +{ + class HandDetectRegion + { + public: + HandDetectRegion(std::string id,int x_pos, int y_pos, int width, int height); + + void SetXPos(int x) { start_x_pos = x; } + void SetYPos(int y) { start_y_pos = y; } + int GetXPos() { return start_x_pos; } + int GetYPos() { return start_y_pos; } + + void SetWidth(int width) { region_width = width; } + void SetHeigth(int height) { region_height = height; } + int GetWidth() { return region_width; } + int GetHeight() { return region_height; } + + cv::Mat GenerateHandMaskSquare(cv::Mat img); + + void DetectHand(cv::Mat& camera_frame); + + bool IsHandPresent(); + + void CalibrateBackground(); + void CalibrateSkin(); + + std::vector CalculateSkinTresholds(); + + void setSkinTresholds(std::vector& tresholds); + + private: + int start_x_pos; + int start_y_pos; + int region_height; + int region_width; + bool hand_mask_generated; + bool hand_present; + cv::Mat frame, frame_out, handMask, foreground, fingerCountDebug; + BackgroundRemover background_remover; + SkinDetector skin_detector; + handcalibration::HandCalibrator hand_calibrator; + std::string region_id; + + bool DrawHandMask(cv::Mat* input); + }; + +} diff --git a/src/computervision/ObjectDetection.cpp b/src/computervision/ObjectDetection.cpp index 62236d2..829953c 100644 --- a/src/computervision/ObjectDetection.cpp +++ b/src/computervision/ObjectDetection.cpp @@ -6,117 +6,142 @@ #include "ObjectDetection.h" #include "BackgroundRemover.h" #include "SkinDetector.h" -#include "FaceDetector.h" #include "FingerCount.h" +#include "async/StaticCameraInstance.h" +#include "calibration/HandCalibrator.h" namespace computervision { - cv::VideoCapture cap(0); - cv::Mat img, imgGray, img2, img2Gray, img3, img4; + cv::Mat img, img_gray, img2, img2_gray, img3, img4; - int handMaskStartXPos, handMaskStartYPos, handMaskWidth, handMaskHeight; - bool handMaskGenerated = false; + int hand_mask_start_x_pos, hand_mask_start_y_pos, hand_mask_width, hand_mask_height; + bool hand_mask_generated = false; - Mat frame, frameOut, handMask, foreground, fingerCountDebug; - BackgroundRemover backgroundRemover; - SkinDetector skinDetector; - FaceDetector faceDetector; - FingerCount fingerCount; + Mat frame, frame_out, handMask, foreground, fingerCountDebug; + BackgroundRemover background_remover; + SkinDetector skin_detector; + FingerCount finger_count; + handcalibration::HandCalibrator hand_calibrator; + + cv::VideoCapture cap = static_camera::getCap(); ObjectDetection::ObjectDetection() { } - cv::Mat ObjectDetection::readCamera() { + cv::Mat ObjectDetection::ReadCamera() { cap.read(img); return img; } - bool ObjectDetection::detectHand(Mat cameraFrame) + cv::VideoCapture ObjectDetection::GetCap() { - Mat inputFrame = generateHandMaskSquare(cameraFrame); - frameOut = inputFrame.clone(); + return cap; + } + + bool ObjectDetection::DetectHand(Mat camera_frame, bool& hand_present) + { + Mat input_frame = GenerateHandMaskSquare(camera_frame); + frame_out = input_frame.clone(); // detect skin color - skinDetector.drawSkinColorSampler(frameOut); + skin_detector.drawSkinColorSampler(camera_frame); // remove background from image - foreground = backgroundRemover.getForeground(inputFrame); + foreground = background_remover.getForeground(input_frame); // detect the hand contours - handMask = skinDetector.getSkinMask(foreground); + handMask = skin_detector.getSkinMask(foreground); // count the amount of fingers and put the info on the matrix - fingerCountDebug = fingerCount.findFingersCount(handMask, frameOut); + fingerCountDebug = finger_count.findFingersCount(handMask, frame_out); // get the amount of fingers - int fingers_amount = fingerCount.getAmountOfFingers(); + int fingers_amount = finger_count.getAmountOfFingers(); // draw the hand rectangle on the camera input, and draw text showing if the hand is open or closed. - drawHandMaskRect(&cameraFrame); - string hand_text = fingers_amount > 0 ? "open" : "closed"; - putText(cameraFrame,hand_text, Point(10, 75), FONT_HERSHEY_PLAIN, 2.0, Scalar(255, 0, 255),3); - imshow("camera", cameraFrame); + DrawHandMask(&camera_frame); + - /* imshow("output", frameOut); + hand_calibrator.SetAmountOfFingers(fingers_amount); + finger_count.DrawHandContours(camera_frame); + hand_calibrator.DrawHandCalibrationText(camera_frame); + imshow("camera", camera_frame); + + + + /*imshow("output", frame_out); imshow("foreground", foreground); imshow("handMask", handMask); imshow("handDetection", fingerCountDebug);*/ + hand_present = hand_calibrator.CheckIfHandPresent(handMask,handcalibration::HandDetectionType::MENU); + hand_calibrator.SetHandPresent(hand_present); + + + int key = waitKey(1); if (key == 98) // b, calibrate the background - backgroundRemover.calibrate(inputFrame); + { + background_remover.calibrate(input_frame); + hand_calibrator.SetBackGroundCalibrated(true); + } else if (key == 115) // s, calibrate the skin color - skinDetector.calibrate(inputFrame); + { + skin_detector.calibrate(input_frame); + hand_calibrator.SetSkinCalibration(true); + + } + return fingers_amount > 0; } - void ObjectDetection::calculateDifference() + void ObjectDetection::CalculateDifference() { cap.read(img); cap.read(img2); - cv::cvtColor(img, imgGray, cv::COLOR_RGBA2GRAY); - cv::cvtColor(img2, img2Gray, cv::COLOR_RGBA2GRAY); + cv::cvtColor(img, img_gray, cv::COLOR_RGBA2GRAY); + cv::cvtColor(img2, img2_gray, cv::COLOR_RGBA2GRAY); - cv::absdiff(imgGray, img2Gray, img3); + cv::absdiff(img_gray, img2_gray, img3); cv::threshold(img3, img4, 50, 170, cv::THRESH_BINARY); imshow("threshold", img4); } - cv::Mat ObjectDetection::generateHandMaskSquare(cv::Mat img) + cv::Mat ObjectDetection::GenerateHandMaskSquare(cv::Mat img) { - handMaskStartXPos = 20; - handMaskStartYPos = img.rows / 5; - handMaskWidth = img.cols / 3; - handMaskHeight = img.cols / 3; + hand_mask_start_x_pos = 20; + hand_mask_start_y_pos = img.rows / 5; + hand_mask_width = img.cols / 3; + hand_mask_height = img.cols / 3; cv::Mat mask = cv::Mat::zeros(img.size(), img.type()); - cv::Mat dstImg = cv::Mat::zeros(img.size(), img.type()); + cv::Mat distance_img = cv::Mat::zeros(img.size(), img.type()); - cv::rectangle(mask, Rect(handMaskStartXPos, handMaskStartYPos, handMaskWidth, handMaskHeight), Scalar(255, 255, 255), -1); + cv::rectangle(mask, Rect(hand_mask_start_x_pos, hand_mask_start_y_pos, hand_mask_width, hand_mask_height), Scalar(255, 255, 255), -1); - img.copyTo(dstImg, mask); + img.copyTo(distance_img, mask); - handMaskGenerated = true; - return dstImg; + hand_mask_generated = true; + return distance_img; } - bool ObjectDetection::drawHandMaskRect(cv::Mat* input) + bool ObjectDetection::DrawHandMask(cv::Mat* input) { - if (!handMaskGenerated) return false; - rectangle(*input, Rect(handMaskStartXPos, handMaskStartYPos, handMaskWidth, handMaskHeight), Scalar(255, 255, 255)); + if (!hand_mask_generated) return false; + rectangle(*input, Rect(hand_mask_start_x_pos, hand_mask_start_y_pos, hand_mask_width, hand_mask_height), Scalar(255, 255, 255)); return true; } - void ObjectDetection::showWebcam() + void ObjectDetection::ShowWebcam() { imshow("Webcam image", img); } diff --git a/src/computervision/ObjectDetection.h b/src/computervision/ObjectDetection.h index bddf4ba..92fc335 100644 --- a/src/computervision/ObjectDetection.h +++ b/src/computervision/ObjectDetection.h @@ -27,13 +27,13 @@ namespace computervision * @brief Displays an image of the current webcam-footage * */ - void showWebcam(); + void ShowWebcam(); /** * @brief Calculates the difference between two images * and outputs an image that only shows the difference * */ - void calculateDifference(); + void CalculateDifference(); /** * @brief generates the square that will hold the mask in which the hand will be detected. @@ -41,29 +41,51 @@ namespace computervision * @param img the current camear frame * @return a matrix containing the mask */ - cv::Mat generateHandMaskSquare(cv::Mat img); + cv::Mat GenerateHandMaskSquare(cv::Mat img); /** * @brief reads the camera and returns it in a matrix. * * @return the camera frame in a matrix */ - cv::Mat readCamera(); + cv::Mat ReadCamera(); /** * @brief detects a hand based on the given hand mask input frame. * * @param inputFrame the input frame from the camera + * @param hand_present boolean that will hold true if the hand is detected, false if not. * @return true if hand is open, false if hand is closed */ - bool detectHand(cv::Mat cameraFrame); + bool DetectHand(cv::Mat camera_frame, bool& hand_present); /** * @brief draws the hand mask rectangle on the given input matrix. * * @param input the input matrix to draw the rectangle on */ - bool drawHandMaskRect(cv::Mat *input); + bool DrawHandMask(cv::Mat *input); + + /** + * @brief checks if the hand of the user is open. + * + * @return true if the hand is open, false if not. + */ + bool IsHandOpen(); + + + /** + * @brief checks whether the hand is held within the detection square. + * + * @return true if the hand is in the detection square, false if not. + */ + bool IsHandPresent(); + + cv::VideoCapture GetCap(); + + private: + bool is_hand_open; + bool is_hand_present; }; diff --git a/src/computervision/OpenPoseVideo.cpp b/src/computervision/OpenPoseVideo.cpp new file mode 100644 index 0000000..33527a1 --- /dev/null +++ b/src/computervision/OpenPoseVideo.cpp @@ -0,0 +1,108 @@ +#include "OpenPoseVideo.h" + +using namespace std; +using namespace cv; +using namespace cv::dnn; + +namespace computervision +{ +#define MPI + +#ifdef MPI + const int POSE_PAIRS[7][2] = + { + {0,1}, {1,2}, {2,3}, + {3,4}, {1,5}, {5,6}, + {6,7} + }; + + string protoFile = "res/pose/mpi/pose_deploy_linevec_faster_4_stages.prototxt"; + string weightsFile = "res/pose/mpi/pose_iter_160000.caffemodel"; + + int nPoints = 8; +#endif + +#ifdef COCO + const int POSE_PAIRS[17][2] = + { + {1,2}, {1,5}, {2,3}, + {3,4}, {5,6}, {6,7}, + {1,8}, {8,9}, {9,10}, + {1,11}, {11,12}, {12,13}, + {1,0}, {0,14}, + {14,16}, {0,15}, {15,17} + }; + + string protoFile = "pose/coco/pose_deploy_linevec.prototxt"; + string weightsFile = "pose/coco/pose_iter_440000.caffemodel"; + + int nPoints = 18; +#endif + Net net; + + void OpenPoseVideo::setup() { + net = readNetFromCaffe(protoFile, weightsFile); + + net.setPreferableBackend(DNN_TARGET_CPU); + } + + void OpenPoseVideo::movementSkeleton(Mat& inputImage, std::function&, cv::Mat& poinst_on_image)> f) { + std::cout << "movement skeleton start" << std::endl; + + int inWidth = 368; + int inHeight = 368; + float thresh = 0.01; + + Mat frame; + int frameWidth = inputImage.size().width; + int frameHeight = inputImage.size().height; + + double t = (double)cv::getTickCount(); + std::cout << "reading input image and blob" << std::endl; + + frame = inputImage; + Mat inpBlob = blobFromImage(frame, 1.0 / 255, Size(inWidth, inHeight), Scalar(0, 0, 0), false, false); + + std::cout << "done reading image and blob" << std::endl; + + net.setInput(inpBlob); + + std::cout << "done setting input to net" << std::endl; + Mat output = net.forward(); + std::cout << "time took to set input and forward: " << t << std::endl; + + int H = output.size[2]; + int W = output.size[3]; + + std::cout << "about to find position of boxy parts" << std::endl; + // find the position of the body parts + vector points(nPoints); + for (int n = 0; n < nPoints; n++) + { + // Probability map of corresponding body's part. + Mat probMap(H, W, CV_32F, output.ptr(0, n)); + + Point2f p(-1, -1); + Point maxLoc; + double prob; + minMaxLoc(probMap, 0, &prob, 0, &maxLoc); + if (prob > thresh) + { + p = maxLoc; + p.x *= (float)frameWidth / W; + p.y *= (float)frameHeight / H; + + circle(frame, cv::Point((int)p.x, (int)p.y), 8, Scalar(0, 255, 255), -1); + cv::putText(frame, cv::format("%d", n), cv::Point((int)p.x, (int)p.y), cv::FONT_HERSHEY_COMPLEX, 1.1, cv::Scalar(0, 0, 255), 2); + } + points[n] = p; + } + + cv::putText(frame, cv::format("time taken = %.2f sec", t), cv::Point(50, 50), cv::FONT_HERSHEY_COMPLEX, .8, cv::Scalar(255, 50, 0), 2); + std::cout << "time taken: " << t << std::endl; + //imshow("Output-Keypoints", frame); + //imshow("Output-Skeleton", frame); + std::cout << "about to call points receiving method" << std::endl; + f(points,frame); + } +} \ No newline at end of file diff --git a/src/computervision/OpenPoseVideo.h b/src/computervision/OpenPoseVideo.h new file mode 100644 index 0000000..e05737d --- /dev/null +++ b/src/computervision/OpenPoseVideo.h @@ -0,0 +1,19 @@ +#pragma once + +#include +#include +#include +#include + +using namespace cv; + +namespace computervision +{ + class OpenPoseVideo{ + private: + + public: + void movementSkeleton(Mat& inputImage, std::function&, cv::Mat& poinst_on_image)> f); + void setup(); + }; +} diff --git a/src/computervision/SkinDetector.cpp b/src/computervision/SkinDetector.cpp index 088cce0..100f25f 100644 --- a/src/computervision/SkinDetector.cpp +++ b/src/computervision/SkinDetector.cpp @@ -1,4 +1,5 @@ #include "SkinDetector.h" +#include /* Author: Pierfrancesco Soffritti https://github.com/PierfrancescoSoffritti @@ -23,7 +24,7 @@ namespace computervision int frameWidth = input.size().width, frameHeight = input.size().height; int rectangleSize = 25; - Scalar rectangleColor = Scalar(255, 0, 255); + Scalar rectangleColor = Scalar(0, 255, 255); skinColorSamplerRectangle1 = Rect(frameWidth / 5, frameHeight / 2, rectangleSize, rectangleSize); skinColorSamplerRectangle2 = Rect(frameWidth / 5, frameHeight / 3, rectangleSize, rectangleSize); @@ -41,6 +42,29 @@ namespace computervision ); } + void SkinDetector::drawSkinColorSampler(Mat input,int x, int y,int width, int height) { + int frameWidth = width, frameHeight = height; + + int rectangleSize = 25; + Scalar rectangleColor = Scalar(0, 255, 255); + + skinColorSamplerRectangle1 = Rect(frameWidth / 5 + x, frameHeight / 2 + y, rectangleSize, rectangleSize); + skinColorSamplerRectangle2 = Rect(frameWidth / 5 + x, frameHeight / 3 + y, rectangleSize, rectangleSize); + + rectangle( + input, + skinColorSamplerRectangle1, + rectangleColor + ); + + rectangle( + input, + skinColorSamplerRectangle2, + rectangleColor + ); + } + + void SkinDetector::calibrate(Mat input) { Mat hsvInput; @@ -54,6 +78,19 @@ namespace computervision calibrated = true; } + std::vector SkinDetector::calibrateAndReturn(Mat input) + { + Mat hsvInput; + cvtColor(input, hsvInput, CV_BGR2HSV); + + Mat sample1 = Mat(hsvInput, skinColorSamplerRectangle1); + Mat sample2 = Mat(hsvInput, skinColorSamplerRectangle2); + + calibrated = true; + return calculateAndReturnTresholds(sample1, sample2); + + } + void SkinDetector::calculateThresholds(Mat sample1, Mat sample2) { int offsetLowThreshold = 80; int offsetHighThreshold = 30; @@ -75,6 +112,39 @@ namespace computervision //vHighThreshold = 255; } + std::vector SkinDetector::calculateAndReturnTresholds(Mat sample1, Mat sample2) + { + + calculateThresholds(sample1, sample2); + std::vector res; + res.push_back(hLowThreshold); + res.push_back(hHighThreshold); + res.push_back(sLowThreshold); + res.push_back(sHighThreshold); + res.push_back(vLowThreshold); + res.push_back(vHighThreshold); + return res; + } + + void SkinDetector::setTresholds(std::vector& tresholds) + { + if (tresholds.size() != 6) + { + std::cout << "tresholds array not the right size!" << std::endl; + return; + } + + hLowThreshold = tresholds[0]; + hHighThreshold = tresholds[1]; + sLowThreshold = tresholds[2]; + sHighThreshold = tresholds[3]; + vLowThreshold = tresholds[4]; + vHighThreshold = tresholds[5]; + + calibrated = true; + + } + Mat SkinDetector::getSkinMask(Mat input) { Mat skinMask; diff --git a/src/computervision/SkinDetector.h b/src/computervision/SkinDetector.h index c6cf158..02e9dfb 100644 --- a/src/computervision/SkinDetector.h +++ b/src/computervision/SkinDetector.h @@ -24,6 +24,9 @@ namespace computervision */ void drawSkinColorSampler(Mat input); + void drawSkinColorSampler(Mat input, int x, int y, int width, int heigth); + + /* * @brief calibrates the skin color detector with the given input frame * @@ -31,6 +34,10 @@ namespace computervision */ void calibrate(Mat input); + std::vector calibrateAndReturn(Mat input); + + void setTresholds(std::vector& tresholds); + /* * @brief gets the mask for the hand * @@ -63,6 +70,8 @@ namespace computervision */ void calculateThresholds(Mat sample1, Mat sample2); + std::vector calculateAndReturnTresholds(Mat sample1, Mat sample2); + /** * @brief the opening. it generates the structuring element and performs the morphological transformations required to detect the hand. * This needs to be done to get the skin mask. diff --git a/src/computervision/async/StaticCameraInstance.h b/src/computervision/async/StaticCameraInstance.h new file mode 100644 index 0000000..625d478 --- /dev/null +++ b/src/computervision/async/StaticCameraInstance.h @@ -0,0 +1,12 @@ +#pragma once +#include + +namespace static_camera +{ + + static cv::VideoCapture getCap() + { + static cv::VideoCapture cap(0); + return cap; + } +}; diff --git a/src/computervision/async/async_arm_detection.cpp b/src/computervision/async/async_arm_detection.cpp new file mode 100644 index 0000000..a43b7dc --- /dev/null +++ b/src/computervision/async/async_arm_detection.cpp @@ -0,0 +1,46 @@ +#include +#include "async_arm_detection.h" +#include "../OpenPoseVideo.h" +#include +#include "StaticCameraInstance.h" + + +namespace computervision +{ + AsyncArmDetection::AsyncArmDetection() + { + + } + + void AsyncArmDetection::run_arm_detection(std::function, cv::Mat poinst_on_image)> points_ready_func, OpenPoseVideo op) + { + VideoCapture cap = static_camera::getCap(); + + std::cout << "STARTING THREAD LAMBDA" << std::endl; + /*cv::VideoCapture cap = static_camera::GetCap();*/ + + if (!cap.isOpened()) + { + std::cout << "capture was closed, opening..." << std::endl; + cap.open(0); + } + + while (true) + { + Mat img; + cap.read(img); + op.movementSkeleton(img, points_ready_func); + } + } + + void AsyncArmDetection::start(std::function, cv::Mat poinst_on_image)> points_ready_func, OpenPoseVideo op) + { + + std::cout << "starting function" << std::endl; + + + std::thread async_arm_detect_thread(&AsyncArmDetection::run_arm_detection,this, points_ready_func, op); + + async_arm_detect_thread.detach(); // makes sure the thread is detached from the variable. + } +} diff --git a/src/computervision/async/async_arm_detection.h b/src/computervision/async/async_arm_detection.h new file mode 100644 index 0000000..98fd163 --- /dev/null +++ b/src/computervision/async/async_arm_detection.h @@ -0,0 +1,23 @@ +#pragma once +#include +#include +#include +#include +#include "../OpenPoseVideo.h" +#include "StaticCameraInstance.h" + + +namespace computervision +{ + class AsyncArmDetection + { + public: + AsyncArmDetection(void); + + + void start(std::function, cv::Mat poinst_on_image)>, computervision::OpenPoseVideo op); + private: + void run_arm_detection(std::function, cv::Mat poinst_on_image)> points_ready_func, OpenPoseVideo op); + }; + +} diff --git a/src/computervision/calibration/HandCalibrator.cpp b/src/computervision/calibration/HandCalibrator.cpp new file mode 100644 index 0000000..dcf2911 --- /dev/null +++ b/src/computervision/calibration/HandCalibrator.cpp @@ -0,0 +1,92 @@ + +#include "HandCalibrator.h" +#include + +#define MIN_MENU_HAND_SIZE 10000 +#define MIN_GAME_HAND_SIZE 3000 // todo change +namespace computervision +{ + namespace handcalibration + { + + HandCalibrator::HandCalibrator() + { + + } + + void HandCalibrator::DrawHandCalibrationText(cv::Mat& output_frame) + { + cv::rectangle(output_frame, cv::Rect(0, 0, output_frame.cols, 40), cv::Scalar(0, 0, 0), -1); + cv::putText(output_frame, "Hand calibration", cv::Point(output_frame.cols / 2 - 100, 25), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(18, 219, 65), 2); + cv::putText(output_frame, "press 'b' to calibrate background,then press 's' to calibrate skin tone", cv::Point(5, 35), cv::FONT_HERSHEY_PLAIN, 1.0, cv::Scalar(18, 219, 65), 1); + + cv::rectangle(output_frame, cv::Rect(0, output_frame.rows - 80, 450, output_frame.cols), cv::Scalar(0, 0, 0), -1); + + cv::putText(output_frame, "hand in frame:", cv::Point(5, output_frame.rows - 50), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(255, 255, 0), 1); + cv::rectangle(output_frame, cv::Rect(420, output_frame.rows - 67, 15, 15), hand_present ? cv::Scalar(0, 255, 0) : cv::Scalar(0, 0, 255), -1); + + DrawBackgroundSkinCalibrated(output_frame); + + if (hand_present) + { + std::string hand_text = fingers_amount > 0 ? "open" : "closed"; + cv::putText(output_frame, hand_text, cv::Point(10, 75), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(255, 0, 255), 3); + } + } + + void HandCalibrator::DrawBackgroundSkinCalibrated(cv::Mat& output_frame) + { + + cv::putText(output_frame, "background calibrated:", cv::Point(5, output_frame.rows - 30), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(255, 255, 0), 1); + cv::rectangle(output_frame, cv::Rect(420, output_frame.rows - 47, 15, 15), background_calibrated ? cv::Scalar(0, 255, 0) : cv::Scalar(0, 0, 255), -1); + + cv::putText(output_frame, "skin color calibrated:", cv::Point(5, output_frame.rows - 10), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(255, 255, 0), 1); + cv::rectangle(output_frame, cv::Rect(420, output_frame.rows - 27, 15, 15), skintone_calibrated ? cv::Scalar(0, 255, 0) : cv::Scalar(0, 0, 255), -1); + } + + void HandCalibrator::SetSkinCalibration(bool val) + { + skintone_calibrated = val; + } + + void HandCalibrator::SetBackGroundCalibrated(bool val) + { + background_calibrated = val; + } + + void HandCalibrator::SetHandPresent(bool val) + { + hand_present = val; + } + + void HandCalibrator::SetAmountOfFingers(int amount) + { + fingers_amount = amount; + } + + bool HandCalibrator::CheckIfHandPresent(cv::Mat input_image, HandDetectionType type) + { + std::vector> points; + cv::findContours(input_image, points, cv::RetrievalModes::RETR_LIST, cv::ContourApproximationModes::CHAIN_APPROX_SIMPLE); + + if (points.size() == 0) return false; + + for (int p = 0; p < points.size(); p++) + { + int area = cv::contourArea(points[p]); + + if (type == handcalibration::HandDetectionType::MENU) + if (area > MIN_MENU_HAND_SIZE) return true; + + if (type == handcalibration::HandDetectionType::GAME) + if (area > MIN_GAME_HAND_SIZE) return true; + } + + return false; + } + + + + + } +} diff --git a/src/computervision/calibration/HandCalibrator.h b/src/computervision/calibration/HandCalibrator.h new file mode 100644 index 0000000..ca71fde --- /dev/null +++ b/src/computervision/calibration/HandCalibrator.h @@ -0,0 +1,76 @@ +#pragma once +#include +#include +#include + +namespace computervision +{ + namespace handcalibration + { + enum class HandDetectionType + { + MENU, + GAME + }; + + class HandCalibrator + { + public: + HandCalibrator(); + + + + /** + * @brief draws the text to show the status of the calibration on the image + * + * @param output_frame the frame to draw on. + */ + void DrawHandCalibrationText(cv::Mat& output_frame); + + /** + * @brief sets the skin calibration variable. + * + * @param val the value to set + */ + void SetSkinCalibration(bool val); + + /** + * @brief sets the background calibration variable. + * + * @param val the value to set + */ + void SetBackGroundCalibrated(bool val); + + /** + * @brief sets the value for if the hand is present. + * + * @param val the value to set. + */ + void SetHandPresent(bool val); + + /** + * @brief checks if the hand is present in the given image + * + * @param input_image the input image to check. + */ + bool CheckIfHandPresent(cv::Mat input_image, HandDetectionType type); + + /** + * @brief sets the amount of fingers that are currently detected. + * + * @param amount the amount of fingers. + */ + void SetAmountOfFingers(int amount); + + void DrawBackgroundSkinCalibrated(cv::Mat& output_frame); + + private: + + bool background_calibrated; + bool skintone_calibrated; + bool hand_present; + int fingers_amount; + }; + + } +} diff --git a/src/entities/house_generator.cpp b/src/entities/house_generator.cpp new file mode 100644 index 0000000..6573701 --- /dev/null +++ b/src/entities/house_generator.cpp @@ -0,0 +1,258 @@ +#include "house_generator.h" + +#include +#include + +#include "../renderEngine/obj_loader.h" +#include "../renderEngine/Loader.h" +#include "../toolbox/toolbox.h" +#include "collision_entity.h" + +namespace entities +{ + HouseGenerator::HouseGenerator() + { + models::RawModel raw_model = render_engine::LoadObjModel("res/HouseNew.obj"); + default_texture = { render_engine::loader::LoadTexture("res/Texture.png") }; + default_texture.shine_damper = 10; + house_model = { raw_model, default_texture }; + + GenerateFurnitureModels(); + } + + std::deque> HouseGenerator::GenerateHouse(const glm::vec3& position, float y_rotation) + { + std::deque> furniture; + + // Add house + furniture.push_front(std::make_shared(house_model, position, glm::vec3(0, y_rotation, 0), HOUSE_SIZE)); + + for(int i = 0; i(model, model_pos, glm::vec3(0, -90, 0), HOUSE_SIZE * 2, model_box)); + } + + /* + // Add furniture + models::TexturedModel couch = GetFurnitureModel(FurnitureType::COUCH); + glm::vec3 couch_pos = glm::vec3(position.x + 200, position.y, position.z + 10); + collision::Box couch_box = { couch_pos, couch.raw_model.model_size }; + couch_box.SetRotation(-90); + furniture.push_back(std::make_shared(couch, couch_pos, glm::vec3(0, -90, 0), HOUSE_SIZE * 2, couch_box)); + + models::TexturedModel table = GetFurnitureModel(FurnitureType::TABLE); + glm::vec3 table_pos = glm::vec3(position.x - 30, position.y, position.z); + collision::Box table_box = { table_pos, table.raw_model.model_size }; + furniture.push_back(std::make_shared(table, table_pos, glm::vec3(0, 0, 0), HOUSE_SIZE * 1.3, table_box)); + + models::TexturedModel chair = GetFurnitureModel(FurnitureType::CHAIR); + glm::vec3 chair_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + collision::Box chair_box = { chair_pos, chair.raw_model.model_size }; + furniture.push_back(std::make_shared(chair, chair_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, chair_box)); + + models::TexturedModel plant = GetFurnitureModel(FurnitureType::PLANT); + glm::vec3 plant_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + collision::Box plant_box = { plant_pos, plant.raw_model.model_size }; + furniture.push_back(std::make_shared(plant, plant_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, plant_box)); + + models::TexturedModel guitar = GetFurnitureModel(FurnitureType::GUITAR); + glm::vec3 guitar_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + collision::Box guitar_box = { guitar_pos, guitar.raw_model.model_size }; + furniture.push_back(std::make_shared(guitar, guitar_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, guitar_box)); + + models::TexturedModel bookshelf = GetFurnitureModel(FurnitureType::BOOKSHELF); + glm::vec3 bookshelf_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + collision::Box bookshelf_box = { bookshelf_pos, bookshelf.raw_model.model_size }; + furniture.push_back(std::make_shared(bookshelf, bookshelf_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, bookshelf_box)); + + models::TexturedModel lamp = GetFurnitureModel(FurnitureType::LAMP); + glm::vec3 lamp_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + collision::Box lamp_box = { lamp_pos, lamp.raw_model.model_size }; + furniture.push_back(std::make_shared(lamp, lamp_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, lamp_box)); + + models::TexturedModel ceiling_object = GetFurnitureModel(FurnitureType::CEILING_OBJECTS); + glm::vec3 ceiling_object_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + collision::Box ceiling_object_box = { ceiling_object_pos, ceiling_object.raw_model.model_size }; + furniture.push_back(std::make_shared(ceiling_object, ceiling_object_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, ceiling_object_box)); + + models::TexturedModel misc = GetFurnitureModel(FurnitureType::MISC); + glm::vec3 misc_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + collision::Box misc_box = { misc_pos, misc.raw_model.model_size }; + furniture.push_back(std::make_shared(misc, misc_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, misc_box)); + */ + return furniture; + } + + models::TexturedModel HouseGenerator::GetFurnitureModel(FurnitureType furniture) + { + const auto found = furniture_models.find(furniture); + if (found == furniture_models.end()) + { + std::cerr << "OH NEEEEEEEEEEEEEEE"; + } + + auto models = found->second; + + const int modelNumber = toolbox::Random(0, models.size() - 1); + + return models[modelNumber]; + } + + void HouseGenerator::GenerateFurnitureModels() + { + // Couches + std::deque couches; + + models::RawModel couch_inside_model = render_engine::LoadObjModel("res/couchThree.obj"); + models::TexturedModel couch_inside = { couch_inside_model, default_texture }; + couches.push_back(couch_inside); + + models::RawModel couch_inside_model2 = render_engine::LoadObjModel("res/Coach.obj"); + models::TexturedModel couch_inside2 = { couch_inside_model2, default_texture }; + couches.push_back(couch_inside2); + + models::RawModel couch_inside_model3 = render_engine::LoadObjModel("res/lawnBenchOne.obj"); + models::TexturedModel couch_inside3 = { couch_inside_model3, default_texture }; + couches.push_back(couch_inside3); + + furniture_models.insert(std::pair>(FurnitureType::COUCH, couches)); + + // Tables + std::deque tables; + + models::RawModel table_model1 = render_engine::LoadObjModel("res/tableOne.obj"); + models::TexturedModel table1 = { table_model1, default_texture }; + tables.push_back(table1); + + models::RawModel table_model2 = render_engine::LoadObjModel("res/tableTwo.obj"); + models::TexturedModel table2 = { table_model2, default_texture }; + tables.push_back(table2); + + models::RawModel table_model3 = render_engine::LoadObjModel("res/bureauOne.obj"); + models::TexturedModel table3 = { table_model3, default_texture }; + tables.push_back(table3); + + furniture_models.insert(std::pair>(FurnitureType::TABLE, tables)); + + // Chairs + std::deque chairs; + + models::RawModel chair_model1 = render_engine::LoadObjModel("res/launchchair.obj"); + models::TexturedModel chair1 = { chair_model1, default_texture }; + chairs.push_back(chair1); + + models::RawModel chair_model2 = render_engine::LoadObjModel("res/lawnChairOne.obj"); + models::TexturedModel chair2 = { chair_model2, default_texture }; + chairs.push_back(chair2); + + models::RawModel chair_model3 = render_engine::LoadObjModel("res/ugly_chair.obj"); + models::TexturedModel chair3 = { chair_model3, default_texture }; + chairs.push_back(chair3); + + furniture_models.insert(std::pair>(FurnitureType::CHAIR, chairs)); + + + // Plants + std::deque plants; + + models::RawModel plant_model1 = render_engine::LoadObjModel("res/plantOne.obj"); + models::TexturedModel plant1 = { plant_model1, default_texture }; + plants.push_back(plant1); + + models::RawModel plant_model2 = render_engine::LoadObjModel("res/plantTwo.obj"); + models::TexturedModel plant2 = { plant_model2, default_texture }; + plants.push_back(plant2); + + models::RawModel plant_model3 = render_engine::LoadObjModel("res/plantThree.obj"); + models::TexturedModel plant3 = { plant_model3, default_texture }; + plants.push_back(plant3); + + furniture_models.insert(std::pair>(FurnitureType::PLANT, plants)); + + // Guitars + std::deque guitars; + + models::RawModel guitar_model1 = render_engine::LoadObjModel("res/guitarOne.obj"); + models::TexturedModel guitar1 = { guitar_model1, default_texture }; + guitars.push_back(guitar1); + + models::RawModel guitar_model2 = render_engine::LoadObjModel("res/guitarTwo.obj"); + models::TexturedModel guitar2 = { guitar_model2, default_texture }; + guitars.push_back(guitar2); + + furniture_models.insert(std::pair>(FurnitureType::GUITAR, guitars)); + + // Bookshelves + std::deque bookshelves; + + models::RawModel bookshelf_model1 = render_engine::LoadObjModel("res/bookShelfOne.obj"); + models::TexturedModel bookshelf1 = { bookshelf_model1, default_texture }; + bookshelves.push_back(bookshelf1); + + models::RawModel bookshelf_model2 = render_engine::LoadObjModel("res/bookShelfTwo.obj"); + models::TexturedModel bookshelf2 = { bookshelf_model2, default_texture }; + bookshelves.push_back(bookshelf2); + + models::RawModel bookshelf_model3 = render_engine::LoadObjModel("res/bookShelfThree.obj"); + models::TexturedModel bookshelf3 = { bookshelf_model3, default_texture }; + bookshelves.push_back(bookshelf3); + + furniture_models.insert(std::pair>(FurnitureType::BOOKSHELF, bookshelves)); + + // Lamps + std::dequelamps; + + models::RawModel lamp_model1 = render_engine::LoadObjModel("res/lampOne.obj"); + models::TexturedModel lamp1 = { lamp_model1, default_texture }; + lamps.push_back(lamp1); + + models::RawModel lamp_model2 = render_engine::LoadObjModel("res/lampTwo.obj"); + models::TexturedModel lamp2 = { lamp_model2, default_texture }; + lamps.push_back(lamp2); + + furniture_models.insert(std::pair>(FurnitureType::LAMP, lamps)); + + // Ceiling objects + std::dequeceiling_Objects; + + models::RawModel ceiling_Obj_model1 = render_engine::LoadObjModel("res/ceilingFan.obj"); + models::TexturedModel ceiling_Obj1 = { ceiling_Obj_model1, default_texture }; + ceiling_Objects.push_back(ceiling_Obj1); + + models::RawModel ceiling_Obj_model2 = render_engine::LoadObjModel("res/ceilingFanTwo.obj"); + models::TexturedModel ceiling_Obj2 = { ceiling_Obj_model2, default_texture }; + ceiling_Objects.push_back(ceiling_Obj2); + + models::RawModel ceiling_Obj_model3 = render_engine::LoadObjModel("res/ceilingLampOne.obj"); + models::TexturedModel ceiling_Obj3 = { ceiling_Obj_model3, default_texture }; + ceiling_Objects.push_back(ceiling_Obj3); + + models::RawModel ceiling_Obj_model4 = render_engine::LoadObjModel("res/ceilingLampTwo.obj"); + models::TexturedModel ceiling_Obj4 = { ceiling_Obj_model4, default_texture }; + ceiling_Objects.push_back(ceiling_Obj4); + + furniture_models.insert(std::pair>(FurnitureType::CEILING_OBJECTS, ceiling_Objects)); + + // Miscs + std::deque miscs; + + models::RawModel misc_model1 = render_engine::LoadObjModel("res/tv.obj"); + models::TexturedModel misc1 = { misc_model1, default_texture }; + miscs.push_back(misc1); + + models::RawModel misc_model2 = render_engine::LoadObjModel("res/radio.obj"); + models::TexturedModel misc2 = { misc_model2, default_texture }; + miscs.push_back(misc2); + + models::RawModel misc_model3 = render_engine::LoadObjModel("res/Flowerpot.obj"); + models::TexturedModel misc3 = { misc_model3, default_texture }; + miscs.push_back(misc3); + + furniture_models.insert(std::pair>(FurnitureType::MISC, miscs)); + } +} diff --git a/src/entities/house_generator.h b/src/entities/house_generator.h new file mode 100644 index 0000000..12fbfa0 --- /dev/null +++ b/src/entities/house_generator.h @@ -0,0 +1,67 @@ +#pragma once + +#include +#include +#include +#include "../models/Model.h" +#include "../collision/collision.h" + +namespace entities +{ + enum class FurnitureType + { + COUCH, + TABLE, + CHAIR, + PLANT, + GUITAR, + BOOKSHELF, + LAMP, + CEILING_OBJECTS, + MISC + }; + + class HouseGenerator + { + private: + const float HOUSE_SIZE = 30; + + models::TexturedModel house_model; + models::ModelTexture default_texture; + + std::map> furniture_models; + + public: + HouseGenerator(); + + /* + * @brief: This function generates a house with furniture at the given position and rotation + * + * @param position: The position of the house to render + * @param y_rotation: The y rotation the house needs to be rendered with + * + * @return: A list with all the entities of the generated house (the furniture) + */ + std::deque> GenerateHouse(const glm::vec3& position, float y_rotation); + + /* + * @brief: Returns the depth of the house (chunk) + */ + float GetHouseDepth() const { return house_model.raw_model.model_size.x * HOUSE_SIZE; } + + private: + /* + * @brief: This function loads all the 3D furniture models + */ + void GenerateFurnitureModels(); + + /* + * @brief: This funtion chooses and returns a random furniture of the given furniture type + * + * @param furniture: The furniture you want to get + * + * @return: The model of the random furniture of the chosen furniture type + */ + models::TexturedModel GetFurnitureModel(FurnitureType furniture); + }; +} diff --git a/src/main.cpp b/src/main.cpp index cf20294..c93af64 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,8 @@ #include #include #include +#include +#include #define STB_IMAGE_IMPLEMENTATION #include #include @@ -12,6 +14,7 @@ #include #include +#include "collision/collision.h" #include "gui/gui_interactable.h" #include "models/model.h" #include "renderEngine/loader.h" @@ -24,6 +27,10 @@ #include "scenes/startup_Scene.h" #include "computervision/ObjectDetection.h" +//#include "computervision/OpenPoseImage.h" +#include "computervision/OpenPoseVideo.h" + +#include "computervision/async/async_arm_detection.h" #pragma comment(lib, "glfw3.lib") #pragma comment(lib, "glew32s.lib") @@ -31,9 +38,21 @@ static double UpdateDelta(); -static GLFWwindow* window; scene::Scene* current_scene; +static GLFWwindow* window; +bool points_img_available = false; +cv::Mat points_img; + +void retrieve_points(std::vector arm_points, cv::Mat points_on_image) +{ + + std::cout << "got points!!" << std::endl; + std::cout << "points: " << arm_points << std::endl; + points_img = points_on_image; + points_img_available = true; +} + int main(void) { #pragma region OPENGL_SETTINGS diff --git a/src/models/Model.h b/src/models/Model.h index 2df9e94..fa4067c 100644 --- a/src/models/Model.h +++ b/src/models/Model.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace models { diff --git a/src/renderEngine/Renderer.cpp b/src/renderEngine/Renderer.cpp index a91a5ec..984860f 100644 --- a/src/renderEngine/Renderer.cpp +++ b/src/renderEngine/Renderer.cpp @@ -4,7 +4,6 @@ #include "loader.h" #include "../toolbox/toolbox.h" #include "renderer.h" - #include namespace render_engine @@ -51,12 +50,12 @@ namespace render_engine /* This function will Render a Model on the screen. */ - void Render(entities::Entity& entity, shaders::EntityShader& shader) + void Render(std::shared_ptr entity, shaders::EntityShader& shader) { - const models::TexturedModel model = entity.GetModel(); + const models::TexturedModel model = entity.get()->GetModel(); const models::RawModel raw_model = model.raw_model; const models::ModelTexture texture = model.texture; - + // Enable the model (VAO) glBindVertexArray(raw_model.vao_id); @@ -66,7 +65,7 @@ namespace render_engine glEnableVertexAttribArray(2); // Load the transformation of the model into the shader - const glm::mat4 modelMatrix = toolbox::CreateModelMatrix(entity.GetPosition(), entity.GetRotation(), entity.GetScale()); + const glm::mat4 modelMatrix = toolbox::CreateModelMatrix(entity.get()->GetPosition(), entity.get()->GetRotation(), entity.get()->GetScale()); shader.LoadModelMatrix(modelMatrix); shader.LoadShineVariables(texture.shine_damper, texture.reflectivity); diff --git a/src/renderEngine/Renderer.h b/src/renderEngine/Renderer.h index 8f4cef3..8a7a473 100644 --- a/src/renderEngine/Renderer.h +++ b/src/renderEngine/Renderer.h @@ -1,5 +1,6 @@ #pragma once +#include #include "../gui/gui_element.h" #include "../entities/entity.h" #include "../shaders/entity_shader.h" @@ -30,7 +31,7 @@ namespace render_engine @param entity: The entity which needs to be rendered @param shader: The shader the entity needs to be rendered with */ - void Render(entities::Entity& entity, shaders::EntityShader& shader); + void Render(std::shared_ptr entity, shaders::EntityShader& shader); /* @brief: Call this function to render gui_textures on the screen diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index b7d0d79..c619122 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -13,30 +13,38 @@ #include "../renderEngine/renderer.h" #include "../shaders/entity_shader.h" #include "../toolbox/toolbox.h" +#include "../entities/house_generator.h" #include +#include +#include +#include +#include +#include "../computervision/HandDetectRegion.h" +#include "../computervision/ObjectDetection.h" #define MAX_MODEL_DEQUE_SIZE 6 // max amount of models to load at the same time #define UPCOMING_MODEL_AMOUNT 4 // how much models should be loaded in front of us + namespace scene { - std::deque house_models; std::shared_ptrmain_character; std::deque lights; - std::deque trees; std::vector> collision_entities; + entities::HouseGenerator* house_generator; + std::deque> house_models; models::RawModel raw_model, raw_model_char; models::ModelTexture texture; shaders::EntityShader* shader; shaders::GuiShader* gui_shader; - entities::Camera camera(glm::vec3(0, 0, 0), glm::vec3(0, 0, 0)); + entities::Camera camera(glm::vec3(0, -50, 0), glm::vec3(0, 0, 0)); std::vector guis; - models::TexturedModel model; - models::TexturedModel tree; + std::vector regions; + computervision::HandDetectRegion reg_left("left", 0, 0, 150, 150), reg_right("right", 0, 0, 150, 150), reg_up("up", 0, 0, 150, 150); In_Game_Scene::In_Game_Scene() { @@ -60,6 +68,11 @@ namespace scene return box; } + In_Game_Scene::~In_Game_Scene() + { + delete house_generator; + } + /** * @brief loads a new chunk in front of the camera, and deletes the chunk behind the camera. * @@ -68,48 +81,48 @@ namespace scene */ void load_chunk(int model_pos) { - std::cout << "loading model chunk" << std::endl; - if (house_models.size() >= MAX_MODEL_DEQUE_SIZE) - { - house_models.pop_back(); - trees.pop_back(); - collision_entities.erase(collision_entities.begin() + 1); - - } - int z_offset = model_pos * (model.raw_model.model_size.x * 20); // how much "in the distance" we should load the model - house_models.push_front(entities::Entity(model, glm::vec3(0, -50, -50 - z_offset), glm::vec3(0, 90, 0), 20)); - collision::Box tree_box = create_bounding_box(tree.raw_model.model_size, glm::vec3(0, 0, -50 - z_offset),3); - std::shared_ptr tree_entity = std::make_shared(tree, glm::vec3(0, 0, -50 - z_offset), glm::vec3(0, 90, 0), 3, tree_box); - trees.push_front(*tree_entity); - collision_entities.push_back(tree_entity); - //std::cout << collision_entities.size() << std::endl; - /*if (collision_entities.size() > 0) { - std::cout << collision_entities[0].get()->GetPosition().z << std::endl; - std::cout << "x: " << main_character->GetPosition().x << "\ny: " << main_character->GetPosition().y << "\nz: " << main_character->GetPosition().z << "\n"; - }*/ + static unsigned int furniture_count = 0; + // set up squares according to size of camera input + cv::Mat camera_frame; + static_camera::getCap().read(camera_frame); // get camera frame to know the width and heigth + reg_left.SetXPos(10); + reg_left.SetYPos(camera_frame.rows / 2 - reg_left.GetHeight()/2); + reg_right.SetXPos(camera_frame.cols - 10 - reg_right.GetWidth()); + reg_right.SetYPos(camera_frame.rows / 2 - reg_right.GetHeight()/2); + reg_up.SetXPos(camera_frame.cols / 2 - reg_up.GetWidth() / 2); + reg_up.SetYPos(10); + std::cout << "loading model chunk" << std::endl; + if (house_models.size() >= MAX_MODEL_DEQUE_SIZE * furniture_count) + { + for (int i = 0; i < furniture_count; i++) + { + house_models.pop_front(); + } + } + int z_offset = model_pos * (house_generator->GetHouseDepth()); // how much "in the distance" we should load the model + + std::deque> furniture = house_generator->GenerateHouse(glm::vec3(0, -75, -50 - z_offset), 90); + furniture_count = furniture.size(); + + house_models.insert(house_models.end(), furniture.begin(), furniture.end()); } scene::Scenes scene::In_Game_Scene::start(GLFWwindow* window) { - raw_model = render_engine::LoadObjModel("res/House.obj"); texture = { render_engine::loader::LoadTexture("res/Texture.png") }; texture.shine_damper = 10; texture.reflectivity = 0; - model = { raw_model, texture }; - - models::RawModel raw_tree_model = render_engine::LoadObjModel("res/Tree.obj"); - models::ModelTexture tree_texture = { render_engine::loader::LoadTexture("res/TreeTexture.png") }; - tree = { raw_tree_model, tree_texture }; + raw_model_char = render_engine::LoadObjModel("res/beeTwo.obj"); models::TexturedModel model_char = { raw_model_char, texture }; collision::Box char_box = create_bounding_box(raw_model_char.model_size, glm::vec3(0, 0, 0), 1); main_character = std::make_shared(model_char, glm::vec3(0, -50, -100), glm::vec3(0, 90, 0), 5, char_box); collision_entities.push_back(main_character); - + house_generator = new entities::HouseGenerator(); // load the first few house models for (int i = 0; i <= UPCOMING_MODEL_AMOUNT; i++) { @@ -156,15 +169,10 @@ namespace scene shader->LoadLightsDeque(lights); shader->LoadViewMatrix(camera); - for (entities::Entity& model_entity : house_models) + for (std::shared_ptr model_entity : house_models) { render_engine::renderer::Render(model_entity, *shader); } - - for (entities::Entity& tree_entity : trees) - { - render_engine::renderer::Render(tree_entity, *shader); - } render_engine::renderer::Render(*main_character, *shader); @@ -186,9 +194,7 @@ namespace scene // calculate where the next house model should be loaded static int last_model_pos = 0; - int model_pos = -round(camera.GetPosition().z / (model.raw_model.model_size.x * 20)); // how much models we have passed, minus because we are moving in the negative z axis - //std::cout << collision_entities.size() << std::endl; - + int model_pos = -round(camera.GetPosition().z / (house_generator->GetHouseDepth())); // how much models we have passed, minus because we are moving in the negative z axis // if we have passed a model, load a new one and delete the one behind us if (last_model_pos != model_pos) @@ -198,14 +204,40 @@ namespace scene // remember the position at which the new model was added last_model_pos = model_pos; collision::CheckCollisions(collision_entities); + update_hand_detection(); } void scene::In_Game_Scene::onKey(GLFWwindow* window, int key, int scancode, int action, int mods) { if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) { + cv::destroyWindow("camera"); return_value = scene::Scenes::STOP; } + + if (glfwGetKey(window, GLFW_KEY_B) == GLFW_PRESS) + { + reg_left.CalibrateBackground(); + reg_right.CalibrateBackground(); + reg_up.CalibrateBackground(); + } + + if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) + { + std::vector tresholds = reg_left.CalculateSkinTresholds(); + reg_right.setSkinTresholds(tresholds); + reg_up.setSkinTresholds(tresholds); + } } + void scene::In_Game_Scene::update_hand_detection() + { + cv::Mat camera_frame; + static_camera::getCap().read(camera_frame); + reg_left.DetectHand(camera_frame); + reg_right.DetectHand(camera_frame); + reg_up.DetectHand(camera_frame); + + cv::imshow("camera", camera_frame); + } } diff --git a/src/scenes/in_Game_Scene.h b/src/scenes/in_Game_Scene.h index 4581855..e4dea16 100644 --- a/src/scenes/in_Game_Scene.h +++ b/src/scenes/in_Game_Scene.h @@ -8,9 +8,11 @@ namespace scene { private: scene::Scenes return_value = scene::Scenes::INGAME; + void update_hand_detection(); public: In_Game_Scene(); + ~In_Game_Scene(); Scenes start(GLFWwindow* window) override; void render() override; diff --git a/src/scenes/startup_Scene.cpp b/src/scenes/startup_Scene.cpp index fe67b0f..a492c18 100644 --- a/src/scenes/startup_Scene.cpp +++ b/src/scenes/startup_Scene.cpp @@ -2,10 +2,13 @@ #include #include #include "startup_Scene.h" +#include "../computervision/ObjectDetection.h" +#include "../computervision/HandDetectRegion.h" +#include namespace scene { - + computervision::ObjectDetection objDetect; scene::Scenes scene::Startup_Scene::start(GLFWwindow *window) { while (return_value == scene::Scenes::STARTUP) @@ -27,7 +30,8 @@ namespace scene void scene::Startup_Scene::update(GLFWwindow* window) { - + bool hand_present; + objDetect.DetectHand(objDetect.ReadCamera(),hand_present); } void scene::Startup_Scene::onKey(GLFWwindow* window, int key, int scancode, int action, int mods) @@ -35,6 +39,7 @@ namespace scene if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) { return_value = scene::Scenes::INGAME; + cv::destroyWindow("camera"); } } } diff --git a/src/shaders/entity_shader.cpp b/src/shaders/entity_shader.cpp index 973d7c4..d0a9ba2 100644 --- a/src/shaders/entity_shader.cpp +++ b/src/shaders/entity_shader.cpp @@ -29,7 +29,7 @@ namespace shaders uniform vec3 light_position[4]; const float density = 0.0017; - const float gradient = 4; + const float gradient = 3; void main(void) { diff --git a/src/toolbox/toolbox.cpp b/src/toolbox/toolbox.cpp index dbfc3dc..a12cdc5 100644 --- a/src/toolbox/toolbox.cpp +++ b/src/toolbox/toolbox.cpp @@ -1,3 +1,4 @@ +#include #include "toolbox.h" namespace toolbox @@ -43,5 +44,16 @@ namespace toolbox final.y = Lerp(from.y, to.y, amount); final.z = Lerp(from.z, to.z, amount); return final; + } + + int Random(const int min, const int max) + { + static bool first = true; + if (first) + { + srand(time(0)); + first = false; + } + return min + rand() % ((max + 1) - min); } } diff --git a/src/toolbox/toolbox.h b/src/toolbox/toolbox.h index d7d6a1f..49de76e 100644 --- a/src/toolbox/toolbox.h +++ b/src/toolbox/toolbox.h @@ -68,4 +68,14 @@ namespace toolbox * @return position of where to go */ glm::vec3 Lerp(glm::vec3 from, glm::vec3 to, float amount); + + /* + * @brief: This function will return a value between min and max + * + * @param min: The min value + * @param max: The max value + * + * @return: The random number + */ + int Random(const int min, const int max); } diff --git a/wk2_fps.vcxproj b/wk2_fps.vcxproj index ed68371..9d54ea8 100644 --- a/wk2_fps.vcxproj +++ b/wk2_fps.vcxproj @@ -21,9 +21,13 @@ + + + - + + @@ -45,11 +49,17 @@ + + + + - + + + @@ -73,6 +83,12 @@ + + + + + + 16.0 {A7ECF1BE-DB22-4BF7-BFF6-E3BF72691EE6} @@ -141,6 +157,8 @@ false $(VC_IncludePath);$(WindowsSDK_IncludePath);;C:\opencv\opencv\build\include;C:\opencv\build\include $(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);C:\opencv\opencv\build\x64\vc15\lib;C:\opencv\build\x64\vc15\lib + C:\opencv\build\include\;$(VC_IncludePath);$(WindowsSDK_IncludePath);C:\opencv\opencv\build\include + C:\opencv\build\x64\vc15\lib;$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);C:\opencv\opencv\build\x64\vc15\lib @@ -214,6 +232,7 @@ true $(SolutionDir)lib\glfw-3.3.2\$(Platform);$(SolutionDir)lib\glew-2.1.0\lib\Release\$(Platform);%(AdditionalLibraryDirectories) kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies); opencv_world452.lib;opencv_world452d.lib + opencv_world452.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) diff --git a/wk2_fps.vcxproj.filters b/wk2_fps.vcxproj.filters index 3dc1142..6f20dba 100644 --- a/wk2_fps.vcxproj.filters +++ b/wk2_fps.vcxproj.filters @@ -1,18 +1,29 @@  - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;c++;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - + + + + + + + + + + + + + + + + + + + + + + + @@ -75,6 +86,9 @@ Source Files + + Source Files + @@ -155,8 +169,48 @@ Header Files + + Header Files + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file