commit 54f4f730407df9e56521c42d2a156e2da727eba7 Author: Laureηt Date: Sat Jun 10 21:16:28 2023 +0200 init diff --git a/Data/.DS_Store b/Data/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Data/.DS_Store differ diff --git a/Data/f01v1e1-300x400.gif b/Data/f01v1e1-300x400.gif new file mode 100644 index 0000000..f8b8f7c Binary files /dev/null and b/Data/f01v1e1-300x400.gif differ diff --git a/Data/f01v1e2-300x400.gif b/Data/f01v1e2-300x400.gif new file mode 100644 index 0000000..aa09199 Binary files /dev/null and b/Data/f01v1e2-300x400.gif differ diff --git a/Data/f01v1e3-300x400.gif b/Data/f01v1e3-300x400.gif new file mode 100644 index 0000000..913a971 Binary files /dev/null and b/Data/f01v1e3-300x400.gif differ diff --git a/Data/f01v3e1-300x400.gif b/Data/f01v3e1-300x400.gif new file mode 100644 index 0000000..fa3ef9d Binary files /dev/null and b/Data/f01v3e1-300x400.gif differ diff --git a/Data/f01v3e2-300x400.gif b/Data/f01v3e2-300x400.gif new file mode 100644 index 0000000..217efba Binary files /dev/null and b/Data/f01v3e2-300x400.gif differ diff --git a/Data/f01v3e3-300x400.gif b/Data/f01v3e3-300x400.gif new file mode 100644 index 0000000..63ac5bc Binary files /dev/null and b/Data/f01v3e3-300x400.gif differ diff --git a/Data/f02v1e1-300x400.gif b/Data/f02v1e1-300x400.gif new file mode 100644 index 0000000..89fe553 Binary files /dev/null and b/Data/f02v1e1-300x400.gif differ diff --git a/Data/f02v1e2-300x400.gif b/Data/f02v1e2-300x400.gif new file mode 100644 index 0000000..2b14448 Binary files /dev/null and b/Data/f02v1e2-300x400.gif differ diff --git a/Data/f02v1e3-300x400.gif b/Data/f02v1e3-300x400.gif new file mode 100644 index 0000000..327cdb2 Binary files /dev/null and b/Data/f02v1e3-300x400.gif differ diff --git a/Data/f02v3e1-300x400.gif b/Data/f02v3e1-300x400.gif new file mode 100644 index 0000000..6cfef81 Binary files /dev/null and b/Data/f02v3e1-300x400.gif differ diff --git a/Data/f02v3e2-300x400.gif b/Data/f02v3e2-300x400.gif new file mode 100644 index 0000000..6cfef81 Binary files /dev/null and b/Data/f02v3e2-300x400.gif differ diff --git a/Data/f02v3e3-300x400.gif b/Data/f02v3e3-300x400.gif new file mode 100644 index 0000000..a8e2247 Binary files /dev/null and b/Data/f02v3e3-300x400.gif differ diff --git a/Data/f03v1e1-300x400.gif b/Data/f03v1e1-300x400.gif new file mode 100644 index 0000000..842f100 Binary files /dev/null and b/Data/f03v1e1-300x400.gif differ diff --git a/Data/f03v1e2-300x400.gif b/Data/f03v1e2-300x400.gif new file mode 100644 index 0000000..b468f6b Binary files /dev/null and b/Data/f03v1e2-300x400.gif differ diff --git a/Data/f03v1e3-300x400.gif b/Data/f03v1e3-300x400.gif new file mode 100644 index 0000000..0ca811d Binary files /dev/null and b/Data/f03v1e3-300x400.gif differ diff --git a/Data/f03v3e1-300x400.gif b/Data/f03v3e1-300x400.gif new file mode 100644 index 0000000..e5570b9 Binary files /dev/null and b/Data/f03v3e1-300x400.gif differ diff --git a/Data/f03v3e2-300x400.gif b/Data/f03v3e2-300x400.gif new file mode 100644 index 0000000..5ea6dd9 Binary files /dev/null and b/Data/f03v3e2-300x400.gif differ diff --git a/Data/f03v3e3-300x400.gif b/Data/f03v3e3-300x400.gif new file mode 100644 index 0000000..fc2614d Binary files /dev/null and b/Data/f03v3e3-300x400.gif differ diff --git a/Data/f04v1e1-300x400.gif b/Data/f04v1e1-300x400.gif new file mode 100644 index 0000000..309b0ac Binary files /dev/null and b/Data/f04v1e1-300x400.gif differ diff --git a/Data/f04v1e2-300x400.gif b/Data/f04v1e2-300x400.gif new file mode 100644 index 0000000..25c07e1 Binary files /dev/null and b/Data/f04v1e2-300x400.gif differ diff --git a/Data/f04v1e3-300x400.gif b/Data/f04v1e3-300x400.gif new file mode 100644 index 0000000..4df24b6 Binary files /dev/null and b/Data/f04v1e3-300x400.gif differ diff --git a/Data/f04v3e1-300x400.gif b/Data/f04v3e1-300x400.gif new file mode 100644 index 0000000..901b057 Binary files /dev/null and b/Data/f04v3e1-300x400.gif differ diff --git a/Data/f04v3e2-300x400.gif b/Data/f04v3e2-300x400.gif new file mode 100644 index 0000000..47611da Binary files /dev/null and b/Data/f04v3e2-300x400.gif differ diff --git a/Data/f04v3e3-300x400.gif b/Data/f04v3e3-300x400.gif new file mode 100644 index 0000000..8f2bf94 Binary files /dev/null and b/Data/f04v3e3-300x400.gif differ diff --git a/Data/f05v1e1-300x400.gif b/Data/f05v1e1-300x400.gif new file mode 100644 index 0000000..27fbc91 Binary files /dev/null and b/Data/f05v1e1-300x400.gif differ diff --git a/Data/f05v1e2-300x400.gif b/Data/f05v1e2-300x400.gif new file mode 100644 index 0000000..8568775 Binary files /dev/null and b/Data/f05v1e2-300x400.gif differ diff --git a/Data/f05v1e3-300x400.gif b/Data/f05v1e3-300x400.gif new file mode 100644 index 0000000..de18378 Binary files /dev/null and b/Data/f05v1e3-300x400.gif differ diff --git a/Data/f05v3e1-300x400.gif b/Data/f05v3e1-300x400.gif new file mode 100644 index 0000000..3ea1301 Binary files /dev/null and b/Data/f05v3e1-300x400.gif differ diff --git a/Data/f05v3e2-300x400.gif b/Data/f05v3e2-300x400.gif new file mode 100644 index 0000000..4d14898 Binary files /dev/null and b/Data/f05v3e2-300x400.gif differ diff --git a/Data/f05v3e3-300x400.gif b/Data/f05v3e3-300x400.gif new file mode 100644 index 0000000..0e0c124 Binary files /dev/null and b/Data/f05v3e3-300x400.gif differ diff --git a/Data/f06v1e1-300x400.gif b/Data/f06v1e1-300x400.gif new file mode 100644 index 0000000..991b4a5 Binary files /dev/null and b/Data/f06v1e1-300x400.gif differ diff --git a/Data/f06v1e2-300x400.gif b/Data/f06v1e2-300x400.gif new file mode 100644 index 0000000..eba9743 Binary files /dev/null and b/Data/f06v1e2-300x400.gif differ diff --git a/Data/f06v1e3-300x400.gif b/Data/f06v1e3-300x400.gif new file mode 100644 index 0000000..9f4453c Binary files /dev/null and b/Data/f06v1e3-300x400.gif differ diff --git a/Data/f06v3e1-300x400.gif b/Data/f06v3e1-300x400.gif new file mode 100644 index 0000000..11eb5da Binary files /dev/null and b/Data/f06v3e1-300x400.gif differ diff --git a/Data/f06v3e2-300x400.gif b/Data/f06v3e2-300x400.gif new file mode 100644 index 0000000..f65e1a8 Binary files /dev/null and b/Data/f06v3e2-300x400.gif differ diff --git a/Data/f06v3e3-300x400.gif b/Data/f06v3e3-300x400.gif new file mode 100644 index 0000000..ab50e2f Binary files /dev/null and b/Data/f06v3e3-300x400.gif differ diff --git a/Data/f07v1e1-300x400.gif b/Data/f07v1e1-300x400.gif new file mode 100644 index 0000000..d864711 Binary files /dev/null and b/Data/f07v1e1-300x400.gif differ diff --git a/Data/f07v1e2-300x400.gif b/Data/f07v1e2-300x400.gif new file mode 100644 index 0000000..b18f2ff Binary files /dev/null and b/Data/f07v1e2-300x400.gif differ diff --git a/Data/f07v1e3-300x400.gif b/Data/f07v1e3-300x400.gif new file mode 100644 index 0000000..107f5ff Binary files /dev/null and b/Data/f07v1e3-300x400.gif differ diff --git a/Data/f07v3e1-300x400.gif b/Data/f07v3e1-300x400.gif new file mode 100644 index 0000000..fa2449a Binary files /dev/null and b/Data/f07v3e1-300x400.gif differ diff --git a/Data/f07v3e2-300x400.gif b/Data/f07v3e2-300x400.gif new file mode 100644 index 0000000..c66e2bb Binary files /dev/null and b/Data/f07v3e2-300x400.gif differ diff --git a/Data/f07v3e3-300x400.gif b/Data/f07v3e3-300x400.gif new file mode 100644 index 0000000..fbf1966 Binary files /dev/null and b/Data/f07v3e3-300x400.gif differ diff --git a/Data/f08v1e1-300x400.gif b/Data/f08v1e1-300x400.gif new file mode 100644 index 0000000..57e1757 Binary files /dev/null and b/Data/f08v1e1-300x400.gif differ diff --git a/Data/f08v1e2-300x400.gif b/Data/f08v1e2-300x400.gif new file mode 100644 index 0000000..e383b29 Binary files /dev/null and b/Data/f08v1e2-300x400.gif differ diff --git a/Data/f08v1e3-300x400.gif b/Data/f08v1e3-300x400.gif new file mode 100644 index 0000000..f93c0d4 Binary files /dev/null and b/Data/f08v1e3-300x400.gif differ diff --git a/Data/f08v3e1-300x400.gif b/Data/f08v3e1-300x400.gif new file mode 100644 index 0000000..d4a8981 Binary files /dev/null and b/Data/f08v3e1-300x400.gif differ diff --git a/Data/f08v3e2-300x400.gif b/Data/f08v3e2-300x400.gif new file mode 100644 index 0000000..16af246 Binary files /dev/null and b/Data/f08v3e2-300x400.gif differ diff --git a/Data/f08v3e3-300x400.gif b/Data/f08v3e3-300x400.gif new file mode 100644 index 0000000..ce21b7e Binary files /dev/null and b/Data/f08v3e3-300x400.gif differ diff --git a/Data/f09v1e1-300x400.gif b/Data/f09v1e1-300x400.gif new file mode 100644 index 0000000..fd96618 Binary files /dev/null and b/Data/f09v1e1-300x400.gif differ diff --git a/Data/f09v1e2-300x400.gif b/Data/f09v1e2-300x400.gif new file mode 100644 index 0000000..6dc32d2 Binary files /dev/null and b/Data/f09v1e2-300x400.gif differ diff --git a/Data/f09v1e3-300x400.gif b/Data/f09v1e3-300x400.gif new file mode 100644 index 0000000..93552ab Binary files /dev/null and b/Data/f09v1e3-300x400.gif differ diff --git a/Data/f09v3e1-300x400.gif b/Data/f09v3e1-300x400.gif new file mode 100644 index 0000000..2056412 Binary files /dev/null and b/Data/f09v3e1-300x400.gif differ diff --git a/Data/f09v3e2-300x400.gif b/Data/f09v3e2-300x400.gif new file mode 100644 index 0000000..dbc58fb Binary files /dev/null and b/Data/f09v3e2-300x400.gif differ diff --git a/Data/f09v3e3-300x400.gif b/Data/f09v3e3-300x400.gif new file mode 100644 index 0000000..f85c0de Binary files /dev/null and b/Data/f09v3e3-300x400.gif differ diff --git a/Data/f10v1e1-300x400.gif b/Data/f10v1e1-300x400.gif new file mode 100644 index 0000000..f98c2e0 Binary files /dev/null and b/Data/f10v1e1-300x400.gif differ diff --git a/Data/f10v1e2-300x400.gif b/Data/f10v1e2-300x400.gif new file mode 100644 index 0000000..7c8d04f Binary files /dev/null and b/Data/f10v1e2-300x400.gif differ diff --git a/Data/f10v1e3-300x400.gif b/Data/f10v1e3-300x400.gif new file mode 100644 index 0000000..bd21052 Binary files /dev/null and b/Data/f10v1e3-300x400.gif differ diff --git a/Data/f10v3e1-300x400.gif b/Data/f10v3e1-300x400.gif new file mode 100644 index 0000000..b14e608 Binary files /dev/null and b/Data/f10v3e1-300x400.gif differ diff --git a/Data/f10v3e2-300x400.gif b/Data/f10v3e2-300x400.gif new file mode 100644 index 0000000..37fa5e8 Binary files /dev/null and b/Data/f10v3e2-300x400.gif differ diff --git a/Data/f10v3e3-300x400.gif b/Data/f10v3e3-300x400.gif new file mode 100644 index 0000000..7418c9c Binary files /dev/null and b/Data/f10v3e3-300x400.gif differ diff --git a/Data/f11v1e1-300x400.gif b/Data/f11v1e1-300x400.gif new file mode 100644 index 0000000..8a64252 Binary files /dev/null and b/Data/f11v1e1-300x400.gif differ diff --git a/Data/f11v1e2-300x400.gif b/Data/f11v1e2-300x400.gif new file mode 100644 index 0000000..ccb5627 Binary files /dev/null and b/Data/f11v1e2-300x400.gif differ diff --git a/Data/f11v1e3-300x400.gif b/Data/f11v1e3-300x400.gif new file mode 100644 index 0000000..0404cb1 Binary files /dev/null and b/Data/f11v1e3-300x400.gif differ diff --git a/Data/f11v3e1-300x400.gif b/Data/f11v3e1-300x400.gif new file mode 100644 index 0000000..0aff842 Binary files /dev/null and b/Data/f11v3e1-300x400.gif differ diff --git a/Data/f11v3e2-300x400.gif b/Data/f11v3e2-300x400.gif new file mode 100644 index 0000000..9de1cf7 Binary files /dev/null and b/Data/f11v3e2-300x400.gif differ diff --git a/Data/f11v3e3-300x400.gif b/Data/f11v3e3-300x400.gif new file mode 100644 index 0000000..a810669 Binary files /dev/null and b/Data/f11v3e3-300x400.gif differ diff --git a/Data/f12v1e1-300x400.gif b/Data/f12v1e1-300x400.gif new file mode 100644 index 0000000..20e1777 Binary files /dev/null and b/Data/f12v1e1-300x400.gif differ diff --git a/Data/f12v1e2-300x400.gif b/Data/f12v1e2-300x400.gif new file mode 100644 index 0000000..222c994 Binary files /dev/null and b/Data/f12v1e2-300x400.gif differ diff --git a/Data/f12v1e3-300x400.gif b/Data/f12v1e3-300x400.gif new file mode 100644 index 0000000..a9b7173 Binary files /dev/null and b/Data/f12v1e3-300x400.gif differ diff --git a/Data/f12v3e1-300x400.gif b/Data/f12v3e1-300x400.gif new file mode 100644 index 0000000..f44d254 Binary files /dev/null and b/Data/f12v3e1-300x400.gif differ diff --git a/Data/f12v3e2-300x400.gif b/Data/f12v3e2-300x400.gif new file mode 100644 index 0000000..f778035 Binary files /dev/null and b/Data/f12v3e2-300x400.gif differ diff --git a/Data/f12v3e3-300x400.gif b/Data/f12v3e3-300x400.gif new file mode 100644 index 0000000..ff56620 Binary files /dev/null and b/Data/f12v3e3-300x400.gif differ diff --git a/Data/f13v1e1-300x400.gif b/Data/f13v1e1-300x400.gif new file mode 100644 index 0000000..39ec69e Binary files /dev/null and b/Data/f13v1e1-300x400.gif differ diff --git a/Data/f13v1e2-300x400.gif b/Data/f13v1e2-300x400.gif new file mode 100644 index 0000000..469af88 Binary files /dev/null and b/Data/f13v1e2-300x400.gif differ diff --git a/Data/f13v1e3-300x400.gif b/Data/f13v1e3-300x400.gif new file mode 100644 index 0000000..e26b122 Binary files /dev/null and b/Data/f13v1e3-300x400.gif differ diff --git a/Data/f13v3e1-300x400.gif b/Data/f13v3e1-300x400.gif new file mode 100644 index 0000000..65079d3 Binary files /dev/null and b/Data/f13v3e1-300x400.gif differ diff --git a/Data/f13v3e2-300x400.gif b/Data/f13v3e2-300x400.gif new file mode 100644 index 0000000..f719360 Binary files /dev/null and b/Data/f13v3e2-300x400.gif differ diff --git a/Data/f13v3e3-300x400.gif b/Data/f13v3e3-300x400.gif new file mode 100644 index 0000000..4b201c8 Binary files /dev/null and b/Data/f13v3e3-300x400.gif differ diff --git a/Data/f14v1e1-300x400.gif b/Data/f14v1e1-300x400.gif new file mode 100644 index 0000000..47aa460 Binary files /dev/null and b/Data/f14v1e1-300x400.gif differ diff --git a/Data/f14v1e2-300x400.gif b/Data/f14v1e2-300x400.gif new file mode 100644 index 0000000..908b94a Binary files /dev/null and b/Data/f14v1e2-300x400.gif differ diff --git a/Data/f14v1e3-300x400.gif b/Data/f14v1e3-300x400.gif new file mode 100644 index 0000000..9569064 Binary files /dev/null and b/Data/f14v1e3-300x400.gif differ diff --git a/Data/f14v3e1-300x400.gif b/Data/f14v3e1-300x400.gif new file mode 100644 index 0000000..0e396eb Binary files /dev/null and b/Data/f14v3e1-300x400.gif differ diff --git a/Data/f14v3e2-300x400.gif b/Data/f14v3e2-300x400.gif new file mode 100644 index 0000000..a8cf25f Binary files /dev/null and b/Data/f14v3e2-300x400.gif differ diff --git a/Data/f14v3e3-300x400.gif b/Data/f14v3e3-300x400.gif new file mode 100644 index 0000000..8c4d6db Binary files /dev/null and b/Data/f14v3e3-300x400.gif differ diff --git a/Data/f15v1e1-300x400.gif b/Data/f15v1e1-300x400.gif new file mode 100644 index 0000000..a15060e Binary files /dev/null and b/Data/f15v1e1-300x400.gif differ diff --git a/Data/f15v1e2-300x400.gif b/Data/f15v1e2-300x400.gif new file mode 100644 index 0000000..b4a0236 Binary files /dev/null and b/Data/f15v1e2-300x400.gif differ diff --git a/Data/f15v1e3-300x400.gif b/Data/f15v1e3-300x400.gif new file mode 100644 index 0000000..a7c6fec Binary files /dev/null and b/Data/f15v1e3-300x400.gif differ diff --git a/Data/f15v3e1-300x400.gif b/Data/f15v3e1-300x400.gif new file mode 100644 index 0000000..9800663 Binary files /dev/null and b/Data/f15v3e1-300x400.gif differ diff --git a/Data/f15v3e2-300x400.gif b/Data/f15v3e2-300x400.gif new file mode 100644 index 0000000..b816e36 Binary files /dev/null and b/Data/f15v3e2-300x400.gif differ diff --git a/Data/f15v3e3-300x400.gif b/Data/f15v3e3-300x400.gif new file mode 100644 index 0000000..5a9c296 Binary files /dev/null and b/Data/f15v3e3-300x400.gif differ diff --git a/Data/f16v1e1-300x400.gif b/Data/f16v1e1-300x400.gif new file mode 100644 index 0000000..9691505 Binary files /dev/null and b/Data/f16v1e1-300x400.gif differ diff --git a/Data/f16v1e2-300x400.gif b/Data/f16v1e2-300x400.gif new file mode 100644 index 0000000..36190b7 Binary files /dev/null and b/Data/f16v1e2-300x400.gif differ diff --git a/Data/f16v1e3-300x400.gif b/Data/f16v1e3-300x400.gif new file mode 100644 index 0000000..c4740a2 Binary files /dev/null and b/Data/f16v1e3-300x400.gif differ diff --git a/Data/f16v3e1-300x400.gif b/Data/f16v3e1-300x400.gif new file mode 100644 index 0000000..493de29 Binary files /dev/null and b/Data/f16v3e1-300x400.gif differ diff --git a/Data/f16v3e2-300x400.gif b/Data/f16v3e2-300x400.gif new file mode 100644 index 0000000..b519920 Binary files /dev/null and b/Data/f16v3e2-300x400.gif differ diff --git a/Data/f16v3e3-300x400.gif b/Data/f16v3e3-300x400.gif new file mode 100644 index 0000000..6edcd03 Binary files /dev/null and b/Data/f16v3e3-300x400.gif differ diff --git a/Data/m01v1e1-300x400.gif b/Data/m01v1e1-300x400.gif new file mode 100644 index 0000000..bdbd9b5 Binary files /dev/null and b/Data/m01v1e1-300x400.gif differ diff --git a/Data/m01v1e2-300x400.gif b/Data/m01v1e2-300x400.gif new file mode 100644 index 0000000..26c08b4 Binary files /dev/null and b/Data/m01v1e2-300x400.gif differ diff --git a/Data/m01v1e3-300x400.gif b/Data/m01v1e3-300x400.gif new file mode 100644 index 0000000..4ee2450 Binary files /dev/null and b/Data/m01v1e3-300x400.gif differ diff --git a/Data/m01v3e1-300x400.gif b/Data/m01v3e1-300x400.gif new file mode 100644 index 0000000..acaadc1 Binary files /dev/null and b/Data/m01v3e1-300x400.gif differ diff --git a/Data/m01v3e2-300x400.gif b/Data/m01v3e2-300x400.gif new file mode 100644 index 0000000..fae2661 Binary files /dev/null and b/Data/m01v3e2-300x400.gif differ diff --git a/Data/m01v3e3-300x400.gif b/Data/m01v3e3-300x400.gif new file mode 100644 index 0000000..b5a86e4 Binary files /dev/null and b/Data/m01v3e3-300x400.gif differ diff --git a/Data/m02v1e1-300x400.gif b/Data/m02v1e1-300x400.gif new file mode 100644 index 0000000..f16b68d Binary files /dev/null and b/Data/m02v1e1-300x400.gif differ diff --git a/Data/m02v1e2-300x400.gif b/Data/m02v1e2-300x400.gif new file mode 100644 index 0000000..259962e Binary files /dev/null and b/Data/m02v1e2-300x400.gif differ diff --git a/Data/m02v1e3-300x400.gif b/Data/m02v1e3-300x400.gif new file mode 100644 index 0000000..6377b9f Binary files /dev/null and b/Data/m02v1e3-300x400.gif differ diff --git a/Data/m02v3e1-300x400.gif b/Data/m02v3e1-300x400.gif new file mode 100644 index 0000000..81a2249 Binary files /dev/null and b/Data/m02v3e1-300x400.gif differ diff --git a/Data/m02v3e2-300x400.gif b/Data/m02v3e2-300x400.gif new file mode 100644 index 0000000..1f469e5 Binary files /dev/null and b/Data/m02v3e2-300x400.gif differ diff --git a/Data/m02v3e3-300x400.gif b/Data/m02v3e3-300x400.gif new file mode 100644 index 0000000..c8bc296 Binary files /dev/null and b/Data/m02v3e3-300x400.gif differ diff --git a/Data/m03v1e1-300x400.gif b/Data/m03v1e1-300x400.gif new file mode 100644 index 0000000..bff2c68 Binary files /dev/null and b/Data/m03v1e1-300x400.gif differ diff --git a/Data/m03v1e2-300x400.gif b/Data/m03v1e2-300x400.gif new file mode 100644 index 0000000..32ea67c Binary files /dev/null and b/Data/m03v1e2-300x400.gif differ diff --git a/Data/m03v1e3-300x400.gif b/Data/m03v1e3-300x400.gif new file mode 100644 index 0000000..222b262 Binary files /dev/null and b/Data/m03v1e3-300x400.gif differ diff --git a/Data/m03v3e1-300x400.gif b/Data/m03v3e1-300x400.gif new file mode 100644 index 0000000..cded371 Binary files /dev/null and b/Data/m03v3e1-300x400.gif differ diff --git a/Data/m03v3e2-300x400.gif b/Data/m03v3e2-300x400.gif new file mode 100644 index 0000000..6f65ece Binary files /dev/null and b/Data/m03v3e2-300x400.gif differ diff --git a/Data/m03v3e3-300x400.gif b/Data/m03v3e3-300x400.gif new file mode 100644 index 0000000..d5043d4 Binary files /dev/null and b/Data/m03v3e3-300x400.gif differ diff --git a/Data/m04v1e1-300x400.gif b/Data/m04v1e1-300x400.gif new file mode 100644 index 0000000..a01c23f Binary files /dev/null and b/Data/m04v1e1-300x400.gif differ diff --git a/Data/m04v1e2-300x400.gif b/Data/m04v1e2-300x400.gif new file mode 100644 index 0000000..b0c4616 Binary files /dev/null and b/Data/m04v1e2-300x400.gif differ diff --git a/Data/m04v1e3-300x400.gif b/Data/m04v1e3-300x400.gif new file mode 100644 index 0000000..d0c51eb Binary files /dev/null and b/Data/m04v1e3-300x400.gif differ diff --git a/Data/m04v3e1-300x400.gif b/Data/m04v3e1-300x400.gif new file mode 100644 index 0000000..b46e997 Binary files /dev/null and b/Data/m04v3e1-300x400.gif differ diff --git a/Data/m04v3e2-300x400.gif b/Data/m04v3e2-300x400.gif new file mode 100644 index 0000000..6d03100 Binary files /dev/null and b/Data/m04v3e2-300x400.gif differ diff --git a/Data/m04v3e3-300x400.gif b/Data/m04v3e3-300x400.gif new file mode 100644 index 0000000..5309d5b Binary files /dev/null and b/Data/m04v3e3-300x400.gif differ diff --git a/Data/m05v1e1-300x400.gif b/Data/m05v1e1-300x400.gif new file mode 100644 index 0000000..5101251 Binary files /dev/null and b/Data/m05v1e1-300x400.gif differ diff --git a/Data/m05v1e2-300x400.gif b/Data/m05v1e2-300x400.gif new file mode 100644 index 0000000..15fb168 Binary files /dev/null and b/Data/m05v1e2-300x400.gif differ diff --git a/Data/m05v1e3-300x400.gif b/Data/m05v1e3-300x400.gif new file mode 100644 index 0000000..0d6f15e Binary files /dev/null and b/Data/m05v1e3-300x400.gif differ diff --git a/Data/m05v3e1-300x400.gif b/Data/m05v3e1-300x400.gif new file mode 100644 index 0000000..0bf3637 Binary files /dev/null and b/Data/m05v3e1-300x400.gif differ diff --git a/Data/m05v3e2-300x400.gif b/Data/m05v3e2-300x400.gif new file mode 100644 index 0000000..b2f55ec Binary files /dev/null and b/Data/m05v3e2-300x400.gif differ diff --git a/Data/m05v3e3-300x400.gif b/Data/m05v3e3-300x400.gif new file mode 100644 index 0000000..018c25a Binary files /dev/null and b/Data/m05v3e3-300x400.gif differ diff --git a/Data/m06v1e1-300x400.gif b/Data/m06v1e1-300x400.gif new file mode 100644 index 0000000..9aa6c1a Binary files /dev/null and b/Data/m06v1e1-300x400.gif differ diff --git a/Data/m06v1e2-300x400.gif b/Data/m06v1e2-300x400.gif new file mode 100644 index 0000000..4832547 Binary files /dev/null and b/Data/m06v1e2-300x400.gif differ diff --git a/Data/m06v1e3-300x400.gif b/Data/m06v1e3-300x400.gif new file mode 100644 index 0000000..b5acdf6 Binary files /dev/null and b/Data/m06v1e3-300x400.gif differ diff --git a/Data/m06v3e1-300x400.gif b/Data/m06v3e1-300x400.gif new file mode 100644 index 0000000..d5780a8 Binary files /dev/null and b/Data/m06v3e1-300x400.gif differ diff --git a/Data/m06v3e2-300x400.gif b/Data/m06v3e2-300x400.gif new file mode 100644 index 0000000..21324b8 Binary files /dev/null and b/Data/m06v3e2-300x400.gif differ diff --git a/Data/m06v3e3-300x400.gif b/Data/m06v3e3-300x400.gif new file mode 100644 index 0000000..b09dca9 Binary files /dev/null and b/Data/m06v3e3-300x400.gif differ diff --git a/Data/m07v1e1-300x400.gif b/Data/m07v1e1-300x400.gif new file mode 100644 index 0000000..7343566 Binary files /dev/null and b/Data/m07v1e1-300x400.gif differ diff --git a/Data/m07v1e2-300x400.gif b/Data/m07v1e2-300x400.gif new file mode 100644 index 0000000..8e5cf3c Binary files /dev/null and b/Data/m07v1e2-300x400.gif differ diff --git a/Data/m07v1e3-300x400.gif b/Data/m07v1e3-300x400.gif new file mode 100644 index 0000000..510f434 Binary files /dev/null and b/Data/m07v1e3-300x400.gif differ diff --git a/Data/m07v3e1-300x400.gif b/Data/m07v3e1-300x400.gif new file mode 100644 index 0000000..89cdd33 Binary files /dev/null and b/Data/m07v3e1-300x400.gif differ diff --git a/Data/m07v3e2-300x400.gif b/Data/m07v3e2-300x400.gif new file mode 100644 index 0000000..cb1b892 Binary files /dev/null and b/Data/m07v3e2-300x400.gif differ diff --git a/Data/m07v3e3-300x400.gif b/Data/m07v3e3-300x400.gif new file mode 100644 index 0000000..f4d03fd Binary files /dev/null and b/Data/m07v3e3-300x400.gif differ diff --git a/Data/m08v1e1-300x400.gif b/Data/m08v1e1-300x400.gif new file mode 100644 index 0000000..e7437f9 Binary files /dev/null and b/Data/m08v1e1-300x400.gif differ diff --git a/Data/m08v1e2-300x400.gif b/Data/m08v1e2-300x400.gif new file mode 100644 index 0000000..06a0119 Binary files /dev/null and b/Data/m08v1e2-300x400.gif differ diff --git a/Data/m08v1e3-300x400.gif b/Data/m08v1e3-300x400.gif new file mode 100644 index 0000000..78f5c5f Binary files /dev/null and b/Data/m08v1e3-300x400.gif differ diff --git a/Data/m08v3e1-300x400.gif b/Data/m08v3e1-300x400.gif new file mode 100644 index 0000000..90043ac Binary files /dev/null and b/Data/m08v3e1-300x400.gif differ diff --git a/Data/m08v3e2-300x400.gif b/Data/m08v3e2-300x400.gif new file mode 100644 index 0000000..057d14e Binary files /dev/null and b/Data/m08v3e2-300x400.gif differ diff --git a/Data/m08v3e3-300x400.gif b/Data/m08v3e3-300x400.gif new file mode 100644 index 0000000..b1e8f8a Binary files /dev/null and b/Data/m08v3e3-300x400.gif differ diff --git a/Data/m09v1e1-300x400.gif b/Data/m09v1e1-300x400.gif new file mode 100644 index 0000000..0c44446 Binary files /dev/null and b/Data/m09v1e1-300x400.gif differ diff --git a/Data/m09v1e2-300x400.gif b/Data/m09v1e2-300x400.gif new file mode 100644 index 0000000..c6595c9 Binary files /dev/null and b/Data/m09v1e2-300x400.gif differ diff --git a/Data/m09v1e3-300x400.gif b/Data/m09v1e3-300x400.gif new file mode 100644 index 0000000..8ee04ad Binary files /dev/null and b/Data/m09v1e3-300x400.gif differ diff --git a/Data/m09v3e1-300x400.gif b/Data/m09v3e1-300x400.gif new file mode 100644 index 0000000..251b600 Binary files /dev/null and b/Data/m09v3e1-300x400.gif differ diff --git a/Data/m09v3e2-300x400.gif b/Data/m09v3e2-300x400.gif new file mode 100644 index 0000000..20aad60 Binary files /dev/null and b/Data/m09v3e2-300x400.gif differ diff --git a/Data/m09v3e3-300x400.gif b/Data/m09v3e3-300x400.gif new file mode 100644 index 0000000..34c4ac4 Binary files /dev/null and b/Data/m09v3e3-300x400.gif differ diff --git a/Data/m10v1e1-300x400.gif b/Data/m10v1e1-300x400.gif new file mode 100644 index 0000000..144f1b1 Binary files /dev/null and b/Data/m10v1e1-300x400.gif differ diff --git a/Data/m10v1e2-300x400.gif b/Data/m10v1e2-300x400.gif new file mode 100644 index 0000000..3a560af Binary files /dev/null and b/Data/m10v1e2-300x400.gif differ diff --git a/Data/m10v1e3-300x400.gif b/Data/m10v1e3-300x400.gif new file mode 100644 index 0000000..bfb9c74 Binary files /dev/null and b/Data/m10v1e3-300x400.gif differ diff --git a/Data/m10v3e1-300x400.gif b/Data/m10v3e1-300x400.gif new file mode 100644 index 0000000..d1d64a6 Binary files /dev/null and b/Data/m10v3e1-300x400.gif differ diff --git a/Data/m10v3e2-300x400.gif b/Data/m10v3e2-300x400.gif new file mode 100644 index 0000000..3d05558 Binary files /dev/null and b/Data/m10v3e2-300x400.gif differ diff --git a/Data/m10v3e3-300x400.gif b/Data/m10v3e3-300x400.gif new file mode 100644 index 0000000..f2013e5 Binary files /dev/null and b/Data/m10v3e3-300x400.gif differ diff --git a/Data/m11v1e1-300x400.gif b/Data/m11v1e1-300x400.gif new file mode 100644 index 0000000..28adf93 Binary files /dev/null and b/Data/m11v1e1-300x400.gif differ diff --git a/Data/m11v1e2-300x400.gif b/Data/m11v1e2-300x400.gif new file mode 100644 index 0000000..637004d Binary files /dev/null and b/Data/m11v1e2-300x400.gif differ diff --git a/Data/m11v1e3-300x400.gif b/Data/m11v1e3-300x400.gif new file mode 100644 index 0000000..01df387 Binary files /dev/null and b/Data/m11v1e3-300x400.gif differ diff --git a/Data/m11v3e1-300x400.gif b/Data/m11v3e1-300x400.gif new file mode 100644 index 0000000..87437e2 Binary files /dev/null and b/Data/m11v3e1-300x400.gif differ diff --git a/Data/m11v3e2-300x400.gif b/Data/m11v3e2-300x400.gif new file mode 100644 index 0000000..be59cba Binary files /dev/null and b/Data/m11v3e2-300x400.gif differ diff --git a/Data/m11v3e3-300x400.gif b/Data/m11v3e3-300x400.gif new file mode 100644 index 0000000..e486976 Binary files /dev/null and b/Data/m11v3e3-300x400.gif differ diff --git a/Data/m12v1e1-300x400.gif b/Data/m12v1e1-300x400.gif new file mode 100644 index 0000000..6c003eb Binary files /dev/null and b/Data/m12v1e1-300x400.gif differ diff --git a/Data/m12v1e2-300x400.gif b/Data/m12v1e2-300x400.gif new file mode 100644 index 0000000..9d76cb1 Binary files /dev/null and b/Data/m12v1e2-300x400.gif differ diff --git a/Data/m12v1e3-300x400.gif b/Data/m12v1e3-300x400.gif new file mode 100644 index 0000000..8ea3f02 Binary files /dev/null and b/Data/m12v1e3-300x400.gif differ diff --git a/Data/m12v3e1-300x400.gif b/Data/m12v3e1-300x400.gif new file mode 100644 index 0000000..07b8bd0 Binary files /dev/null and b/Data/m12v3e1-300x400.gif differ diff --git a/Data/m12v3e2-300x400.gif b/Data/m12v3e2-300x400.gif new file mode 100644 index 0000000..5e9a465 Binary files /dev/null and b/Data/m12v3e2-300x400.gif differ diff --git a/Data/m12v3e3-300x400.gif b/Data/m12v3e3-300x400.gif new file mode 100644 index 0000000..2b2376f Binary files /dev/null and b/Data/m12v3e3-300x400.gif differ diff --git a/Data/m13v1e1-300x400.gif b/Data/m13v1e1-300x400.gif new file mode 100644 index 0000000..f4e2a9c Binary files /dev/null and b/Data/m13v1e1-300x400.gif differ diff --git a/Data/m13v1e2-300x400.gif b/Data/m13v1e2-300x400.gif new file mode 100644 index 0000000..82bc453 Binary files /dev/null and b/Data/m13v1e2-300x400.gif differ diff --git a/Data/m13v1e3-300x400.gif b/Data/m13v1e3-300x400.gif new file mode 100644 index 0000000..0a53e4c Binary files /dev/null and b/Data/m13v1e3-300x400.gif differ diff --git a/Data/m13v3e1-300x400.gif b/Data/m13v3e1-300x400.gif new file mode 100644 index 0000000..2e1f871 Binary files /dev/null and b/Data/m13v3e1-300x400.gif differ diff --git a/Data/m13v3e2-300x400.gif b/Data/m13v3e2-300x400.gif new file mode 100644 index 0000000..7492158 Binary files /dev/null and b/Data/m13v3e2-300x400.gif differ diff --git a/Data/m13v3e3-300x400.gif b/Data/m13v3e3-300x400.gif new file mode 100644 index 0000000..c97d37d Binary files /dev/null and b/Data/m13v3e3-300x400.gif differ diff --git a/Data/m14v1e1-300x400.gif b/Data/m14v1e1-300x400.gif new file mode 100644 index 0000000..60920d1 Binary files /dev/null and b/Data/m14v1e1-300x400.gif differ diff --git a/Data/m14v1e2-300x400.gif b/Data/m14v1e2-300x400.gif new file mode 100644 index 0000000..c112363 Binary files /dev/null and b/Data/m14v1e2-300x400.gif differ diff --git a/Data/m14v1e3-300x400.gif b/Data/m14v1e3-300x400.gif new file mode 100644 index 0000000..bb3901e Binary files /dev/null and b/Data/m14v1e3-300x400.gif differ diff --git a/Data/m14v3e1-300x400.gif b/Data/m14v3e1-300x400.gif new file mode 100644 index 0000000..c5841f6 Binary files /dev/null and b/Data/m14v3e1-300x400.gif differ diff --git a/Data/m14v3e2-300x400.gif b/Data/m14v3e2-300x400.gif new file mode 100644 index 0000000..bba7483 Binary files /dev/null and b/Data/m14v3e2-300x400.gif differ diff --git a/Data/m14v3e3-300x400.gif b/Data/m14v3e3-300x400.gif new file mode 100644 index 0000000..c77e279 Binary files /dev/null and b/Data/m14v3e3-300x400.gif differ diff --git a/Data/m15v1e1-300x400.gif b/Data/m15v1e1-300x400.gif new file mode 100644 index 0000000..0c44446 Binary files /dev/null and b/Data/m15v1e1-300x400.gif differ diff --git a/Data/m15v1e2-300x400.gif b/Data/m15v1e2-300x400.gif new file mode 100644 index 0000000..c6595c9 Binary files /dev/null and b/Data/m15v1e2-300x400.gif differ diff --git a/Data/m15v1e3-300x400.gif b/Data/m15v1e3-300x400.gif new file mode 100644 index 0000000..8ee04ad Binary files /dev/null and b/Data/m15v1e3-300x400.gif differ diff --git a/Data/m15v3e1-300x400.gif b/Data/m15v3e1-300x400.gif new file mode 100644 index 0000000..251b600 Binary files /dev/null and b/Data/m15v3e1-300x400.gif differ diff --git a/Data/m15v3e2-300x400.gif b/Data/m15v3e2-300x400.gif new file mode 100644 index 0000000..20aad60 Binary files /dev/null and b/Data/m15v3e2-300x400.gif differ diff --git a/Data/m15v3e3-300x400.gif b/Data/m15v3e3-300x400.gif new file mode 100644 index 0000000..34c4ac4 Binary files /dev/null and b/Data/m15v3e3-300x400.gif differ diff --git a/Data/m16v1e1-300x400.gif b/Data/m16v1e1-300x400.gif new file mode 100644 index 0000000..3f08eb5 Binary files /dev/null and b/Data/m16v1e1-300x400.gif differ diff --git a/Data/m16v1e2-300x400.gif b/Data/m16v1e2-300x400.gif new file mode 100644 index 0000000..7dc6a52 Binary files /dev/null and b/Data/m16v1e2-300x400.gif differ diff --git a/Data/m16v1e3-300x400.gif b/Data/m16v1e3-300x400.gif new file mode 100644 index 0000000..0838d53 Binary files /dev/null and b/Data/m16v1e3-300x400.gif differ diff --git a/Data/m16v3e1-300x400.gif b/Data/m16v3e1-300x400.gif new file mode 100644 index 0000000..0616bec Binary files /dev/null and b/Data/m16v3e1-300x400.gif differ diff --git a/Data/m16v3e2-300x400.gif b/Data/m16v3e2-300x400.gif new file mode 100644 index 0000000..8513f63 Binary files /dev/null and b/Data/m16v3e2-300x400.gif differ diff --git a/Data/m16v3e3-300x400.gif b/Data/m16v3e3-300x400.gif new file mode 100644 index 0000000..7d8dcdd Binary files /dev/null and b/Data/m16v3e3-300x400.gif differ diff --git a/ProjetADCS3.pdf b/ProjetADCS3.pdf new file mode 100644 index 0000000..26c7dbf Binary files /dev/null and b/ProjetADCS3.pdf differ diff --git a/cluster_mask.png b/cluster_mask.png new file mode 100644 index 0000000..7afd79e Binary files /dev/null and b/cluster_mask.png differ diff --git a/cluster_mask_3D.png b/cluster_mask_3D.png new file mode 100644 index 0000000..33e60b4 Binary files /dev/null and b/cluster_mask_3D.png differ diff --git a/cluster_nomask.png b/cluster_nomask.png new file mode 100644 index 0000000..5a62bd8 Binary files /dev/null and b/cluster_nomask.png differ diff --git a/cluster_nomask_3D.png b/cluster_nomask_3D.png new file mode 100644 index 0000000..1c8064d Binary files /dev/null and b/cluster_nomask_3D.png differ diff --git a/cluster_reco_eval.png b/cluster_reco_eval.png new file mode 100644 index 0000000..7088502 Binary files /dev/null and b/cluster_reco_eval.png differ diff --git a/cluster_reco_mask.png b/cluster_reco_mask.png new file mode 100644 index 0000000..c4404d0 Binary files /dev/null and b/cluster_reco_mask.png differ diff --git a/cluster_reco_nomask.png b/cluster_reco_nomask.png new file mode 100644 index 0000000..bf040e2 Binary files /dev/null and b/cluster_reco_nomask.png differ diff --git a/cluster_reco_predi.png b/cluster_reco_predi.png new file mode 100644 index 0000000..2f9c9c1 Binary files /dev/null and b/cluster_reco_predi.png differ diff --git a/clusters_avec_masque.m b/clusters_avec_masque.m new file mode 100644 index 0000000..079b43e --- /dev/null +++ b/clusters_avec_masque.m @@ -0,0 +1,46 @@ +clear; +close all; +load eigenfaces; + +% Composantes principales des donnees d'apprentissage +C = X_centre_masque*W_masque; + +% Affichage des deux premieres composantes principales des donnees d'apprentissage : +% dx = 250; +% dy = 250; +% figure('Name',['Plan des deux premieres composantes principales (avec masque)'],'Position',[0,0,0.67*L,0.67*H]); +% hold on; +% for i = 1:4 +% lignes = (i-1)*nb_postures_base+1:i*nb_postures_base; +% plot(C(lignes,1),C(lignes,2),['*' 0.5*(rand(1,3)+1)],'MarkerSize',10,'LineWidth',2); +% text(C(lignes,1) + dx, C(lignes,2) + dy, liste_personnes_base(i) + "p" + string([1 2 3 4])); +% end + +% Affichage des trois premieres composantes principales des donnees d'apprentissage : +% figure; +% hold on; +% for i = 1:nb_personnes_base +% lignes = (i-1)*nb_postures_base+1:i*nb_postures_base; +% scatter3(C(lignes,1), C(lignes,2), C(lignes,3)); +% end +% view(30, 20); +% grid; + +proportion = 0.5; +ecart_x = max(C(:,1))-min(C(:,1)); +min_x = min(C(:,1))-proportion*ecart_x; +max_x = max(C(:,1))+proportion*ecart_x; +ecart_y = max(C(:,2))-min(C(:,2)); +min_y = min(C(:,2))-proportion*ecart_y; +max_y = max(C(:,2))+proportion*ecart_y; +axis([min_x max_x min_y max_y]); +axis equal; +set(gca,'FontSize',20); +xlabel('$C_1$','FontSize',30,'Interpreter','Latex'); +ylabel('$C_2$','FontSize',30,'Interpreter','Latex'); + +figure; +plot(lambda_masque/sum(lambda_masque)*100); +ylabel('Contraste (%)'); +xlabel('Composante'); +ylim([0 30]) \ No newline at end of file diff --git a/clusters_sans_masque.m b/clusters_sans_masque.m new file mode 100644 index 0000000..76ff4d0 --- /dev/null +++ b/clusters_sans_masque.m @@ -0,0 +1,47 @@ +clear; +close all; +load eigenfaces; + +% Composantes principales des donnees d'apprentissage +C = X_centre*W; + +% Affichage des deux premieres composantes principales des donnees d'apprentissage : +% dx = 250; +% dy = 250; +% figure('Name',['Plan des deux premieres composantes principales (sans masque)'],'Position',[0,0,0.67*L,0.67*H]); +% hold on; +% for i = 1:nb_personnes_base +% lignes = (i-1)*nb_postures_base+1:i*nb_postures_base; +% plot(C(lignes,1),C(lignes,2),['*' 0.5*(rand(1,3)+1)],'MarkerSize',10,'LineWidth',2); +% text(C(lignes,1) + dx, C(lignes,2) + dy, liste_personnes_base(i) + "p" + string([1 2 3 4])); +% end + +% Affichage des trois premieres composantes principales des donnees d'apprentissage : +figure; +hold on; +for i = 1:nb_personnes_base + lignes = (i-1)*nb_postures_base+1:i*nb_postures_base; + scatter3(C(lignes,1), C(lignes,2), C(lignes,3)); +end +view(30, 20); +grid; + +proportion = 0.5; +ecart_x = max(C(:,1))-min(C(:,1)); +min_x = min(C(:,1))-proportion*ecart_x; +max_x = max(C(:,1))+proportion*ecart_x; +ecart_y = max(C(:,2))-min(C(:,2)); +min_y = min(C(:,2))-proportion*ecart_y; +max_y = max(C(:,2))+proportion*ecart_y; +axis([min_x max_x min_y max_y]); +%axis equal; +set(gca,'FontSize',20); +xlabel('$C_1$','FontSize',30,'Interpreter','Latex'); +ylabel('$C_2$','FontSize',30,'Interpreter','Latex'); +zlabel('$C_3$','FontSize',30,'Interpreter','Latex'); + +figure; +plot(lambda/sum(lambda)*100); +ylabel('Contraste (%)'); +xlabel('Composante'); +ylim([0 30]) diff --git a/contrast_mask.png b/contrast_mask.png new file mode 100644 index 0000000..c75679e Binary files /dev/null and b/contrast_mask.png differ diff --git a/contrast_nomask.png b/contrast_nomask.png new file mode 100644 index 0000000..47c6581 Binary files /dev/null and b/contrast_nomask.png differ diff --git a/eigenfaces_mask.png b/eigenfaces_mask.png new file mode 100644 index 0000000..405b960 Binary files /dev/null and b/eigenfaces_mask.png differ diff --git a/eigenfaces_mask_subspace.png b/eigenfaces_mask_subspace.png new file mode 100644 index 0000000..3a8e4a5 Binary files /dev/null and b/eigenfaces_mask_subspace.png differ diff --git a/eigenfaces_nomask.png b/eigenfaces_nomask.png new file mode 100644 index 0000000..d620b88 Binary files /dev/null and b/eigenfaces_nomask.png differ diff --git a/eigenfaces_nomask_subspace.png b/eigenfaces_nomask_subspace.png new file mode 100644 index 0000000..259cbde Binary files /dev/null and b/eigenfaces_nomask_subspace.png differ diff --git a/eigenfaces_part3.m b/eigenfaces_part3.m new file mode 100644 index 0000000..5f033d4 --- /dev/null +++ b/eigenfaces_part3.m @@ -0,0 +1,246 @@ +clear all; +close all; + +%%%%%%%% CHOIX DES DONNEES +%%%%%%%%%%%%%%%%%%%%%%%%%% + +% liste des differentes personnes +liste_personnes = { + 'f01', 'f02', 'f03', 'f04', 'f05', 'f06', 'f07', 'f08', 'f09', 'f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16'... + 'm01', 'm02', 'm03', 'm04', 'm05', 'm06', 'm07', 'm08', 'm09', 'm10', 'm11', 'm12', 'm13', 'm14', 'm15', 'm16' + }; +nb_personnes = length(liste_personnes); + +% liste des differentes postures +liste_postures = {'v1e1','v3e1','v1e2','v3e2','v1e3','v3e3'}; +nb_postures = length(liste_postures); + +nb_lignes = 400; +nb_colonnes = 300; + +% personnes constituant la base d'apprentissage (A FAIRE EVOLUER) +%liste_personnes_base = {'f01', 'f10', 'm01', 'm08'}; +liste_personnes_base = {'f01', 'f10', 'm10', 'm08'}; % clusters mieux séparés +%liste_personnes_base = liste_personnes; % --> eigenfaces_all_4posture +nb_personnes_base = length(liste_personnes_base); + +% postures de la base d'apprentissage (A FAIRE EVOLUER) +liste_postures_base = [1 2 3 4]; +nb_postures_base = length(liste_postures_base); + +%%%%%%%% LECTURE DES DONNES SANS MASQUE +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +X = []; +liste_base = []; + +taille_ecran = get(0,'ScreenSize'); +L = taille_ecran(3); +H = taille_ecran(4); +figure('Name','Personnes','Position',[0,0,0.67*L,0.67*H]); +colormap(gray(256)); + +% Affichage des images sous forme de planche-contact +% (une personne par ligne, une posture par colonne) : +for j = 1:nb_personnes_base, + no_posture = 0; + for k = liste_postures_base, + no_posture = no_posture + 1; + + ficF = strcat('./Data/', liste_personnes_base{j}, liste_postures{k}, '-300x400.gif'); + liste_base = [liste_base ; ficF]; + img = imread(ficF); + % Remplissage de la matrice X : + X = [X ; double(transpose(img(:)))]; + + % Affichage + subplot(nb_personnes_base, nb_postures_base, (j-1)*nb_postures_base + no_posture); + imagesc(img); + hold on; + axis image; + title(['Personne ' liste_personnes_base{j} ', posture ' num2str(k)]); + + end +end + +%%%%%%%% CALCUL ET AFFICHAGE DES EIGENFACES SANS MASQUE +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Calcul de l'individu moyen : +n = size(X,1); +individu_moyen = ones(1,n)*X/n; + +% Calcul de la matrice X_moyen de meme taille que X, +% telle que chaque ligne contienne l'individu moyen : +X_moyen = ones(n,1)*individu_moyen; + +% Centrage de la matrice X : +X_centre = X - X_moyen; + +% Calcul de la matrice de covariance (impossible a calculer ainsi a cause de sa taille) : +% Sigma = transpose(X_centre)*X_centre/n; + +% Calcul de la matrice resultant du calcul inverse : +Sigma2 = X_centre*transpose(X_centre)/n; + +% Calcul des vecteurs/valeurs propres de la matrice Sigma2 : +%%%%%%%%%%%%%%% +% VERSION EIG +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +[V_2, D] = eig(Sigma2); + +% Les vecteurs propres de Sigma (les eigenfaces) se deduisent de ceux de Sigma2 : +V = transpose(X_centre)*V_2; + +% Tri par ordre decroissant des valeurs propres de Sigma_barre : +[lambda, ind] = sort(diag(D),'descend'); + +% Tri des eigenfaces dans le meme ordre +% (on enleve la derniere eigenface, qui appartient au noyau de Sigma) : +W = V(:, ind); +W = W(:, 1:size(W,2)-1); + +% Normalisation des eigenfaces : +normes_eigenfaces = ones(size(W,1), 1)*sqrt(sum(W.*W)); +W = W./normes_eigenfaces; + +%%%%%%%%%%%%%%% +% version subspace +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [D, V] = subspace_iter_v2(Sigma2, 16, 1, 1, 0.001, 100000); +% +% % Les vecteurs propres de Sigma (les eigenfaces) se deduisent de ceux de Sigma2 : +% W = transpose(X_centre)*V; + +% Affichage de l'individu moyen et des eigenfaces sous la forme de "pseudo-images" +% (leurs coordonnees sont interpretees comme des niveaux de gris) : +figure('Name','Individu moyen et eigenfaces', 'Position', [0,0,0.67*L,0.67*H]); +colormap(gray(256)); +img = reshape(individu_moyen, nb_lignes, nb_colonnes); +subplot(nb_personnes_base, nb_postures_base, 1) +imagesc(img); +hold on; +axis image; +title(['Individu moyen']); +for k = 1:n-1, + img = reshape(W(:,k), nb_lignes, nb_colonnes); + subplot(nb_personnes_base, nb_postures_base,k+1); + imagesc(img); + hold on; + axis image; + title(['Eigenface ', num2str(k)]); +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% AVEC MASQUE +%%%%%%%%%%%%% + + +% Dimensions du masque +ligne_min = 200; +ligne_max = 350; +colonne_min = 60; +colonne_max = 290; + +%%%%%%%% LECTURE DES DONNES ET AJOUT DU MASQUE +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +X_masque = []; + +figure('Name','Personnes avec Masque','Position',[0,0,0.67*L,0.67*H]); +colormap(gray(256)); + +for j = 1:nb_personnes_base, + no_posture = 0; + for k = liste_postures_base, + no_posture = no_posture + 1; + + ficF = strcat('./Data/', liste_personnes_base{j}, liste_postures{k}, '-300x400.gif'); + img = imread(ficF); + + % Degradation de l'image + img(ligne_min:ligne_max,colonne_min:colonne_max) = 0; + % Remplissage de la matrice X_masque : + X_masque = [X_masque; double(transpose(img(:)))]; + + % Affichage + subplot(nb_personnes_base, nb_postures_base, (j-1)*nb_postures_base + no_posture); + imagesc(img); + hold on; + axis image; + title(['Personne ' liste_personnes_base{j} ', posture ' num2str(k)]); + + end +end + + + +%%%%%%%% CALCUL ET AFFICHAGE DES EIGENFACES AVEC MASQUE +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Calcul de l'individu moyen : +n = size(X_masque,1); +individu_moyen_masque = ones(1,n)*X_masque/n; + +% Calcul de la matrice X_moyen de meme taille que X, +% telle que chaque ligne contienne l'individu moyen : +X_moyen_masque = ones(n,1)*individu_moyen_masque; + +% Centrage de la matrice X : +X_centre_masque = X_masque - X_moyen_masque; + +% Calcul de la matrice de covariance (impossible a calculer ainsi a cause de sa taille) : +% Sigma = transpose(X_centre)*X_centre/n; + +% Calcul de la matrice resultant du calcul inverse : +Sigma2_masque = X_centre_masque*transpose(X_centre_masque)/n; + +% Calcul des vecteurs/valeurs propres de la matrice Sigma2 : +%%%%%%%%%%%%%%% +% version EIG +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +[V_2_masque, D_masque] = eig(Sigma2_masque); + +% Les vecteurs propres de Sigma (les eigenfaces) se deduisent de ceux de Sigma2 : +V_masque = transpose(X_centre_masque)*V_2_masque; + +% Tri par ordre decroissant des valeurs propres de Sigma_barre : +[lambda_masque, ind_masque] = sort(diag(D_masque),'descend'); + +% Tri des eigenfaces dans le meme ordre +% (on enleve la derniere eigenface, qui appartient au noyau de Sigma) : +W_masque = V_masque(:, ind_masque); +W_masque = W_masque(:, 1:size(W_masque,2)-1); + +% Normalisation des eigenfaces : +normes_eigenfaces_masque = ones(size(W_masque,1), 1)*sqrt(sum(W_masque.*W_masque)); +W_masque = W_masque./normes_eigenfaces_masque; + +%%%%%%%%%%%%%%% +% version subspace +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [D, V] = subspace_iter_v2(Sigma2_masque, 16, 1, 1, 0.001, 100000); +% +% % Les vecteurs propres de Sigma (les eigenfaces) se deduisent de ceux de Sigma2 : +% W_masque = transpose(X_centre_masque)*V; + +% Affichage de l'individu moyen et des eigenfaces sous la forme de "pseudo-images" +% (leurs coordonnees sont interpretees comme des niveaux de gris) : +figure('Name','Individu moyen masqué et eigenfaces', 'Position', [0,0,0.67*L,0.67*H]); +colormap(gray(256)); +img = reshape(individu_moyen_masque, nb_lignes, nb_colonnes); +subplot(nb_personnes_base, nb_postures_base, 1) +imagesc(img); +hold on; +axis image; +title(['Individu moyen masqué']); +for k = 1:n-1, + img = reshape(W_masque(:,k), nb_lignes,nb_colonnes); + subplot(nb_personnes_base, nb_postures_base,k+1); + imagesc(img); + hold on; + axis image; + title(['Eigenface (masqué) ', num2str(k)]); +end + +save eigenfaces; +%save eigenfaces_all_4posture; diff --git a/indiv_mask.png b/indiv_mask.png new file mode 100644 index 0000000..ab858c9 Binary files /dev/null and b/indiv_mask.png differ diff --git a/indiv_nomask.png b/indiv_nomask.png new file mode 100644 index 0000000..1bc4f0f Binary files /dev/null and b/indiv_nomask.png differ diff --git a/indiv_reco_mask.png b/indiv_reco_mask.png new file mode 100644 index 0000000..dc1ee98 Binary files /dev/null and b/indiv_reco_mask.png differ diff --git a/indiv_reco_nomask.png b/indiv_reco_nomask.png new file mode 100644 index 0000000..3d43917 Binary files /dev/null and b/indiv_reco_nomask.png differ diff --git a/indiv_reco_predi.png b/indiv_reco_predi.png new file mode 100644 index 0000000..5f5d862 Binary files /dev/null and b/indiv_reco_predi.png differ diff --git a/inp_n7.png b/inp_n7.png new file mode 100644 index 0000000..840e942 Binary files /dev/null and b/inp_n7.png differ diff --git a/mgs.m b/mgs.m new file mode 100644 index 0000000..1036c1e --- /dev/null +++ b/mgs.m @@ -0,0 +1,15 @@ +function Q = mgs(A) + +[n, m] = size(A); +Q = A; + +for i = 1:m + for j = 1:i-1 + h = Q(:,j)'*Q(:,i); + Q(:,i) = Q(:,i) - h*Q(:,j); + end + Q(:,i) = Q(:,i)/norm(Q(:,i)); +end + + +end diff --git a/mgs_block.m b/mgs_block.m new file mode 100644 index 0000000..52fd7e0 --- /dev/null +++ b/mgs_block.m @@ -0,0 +1,20 @@ +% procédé d'orthogonalisation de Gram-Schmidt (modifié) +% où les p premières colonnes de A sont déjà orthonormales +% on n'orthonormalise que les m-p dernières colonnes +% (par rapport aux p premières et à elles-même) + +function Q = mgs_block(A, p) + +[n, m] = size(A); +Q = A; + +for i = p+1:m + for j = 1:i-1 + h = Q(:,j)'*Q(:,i); + Q(:,i) = Q(:,i) - h*Q(:,j); + end + Q(:,i) = Q(:,i)/norm(Q(:,i)); +end + + +end diff --git a/rapport.pdf b/rapport.pdf new file mode 100644 index 0000000..4d13621 Binary files /dev/null and b/rapport.pdf differ diff --git a/rapport.tex b/rapport.tex new file mode 100644 index 0000000..e2c2b43 --- /dev/null +++ b/rapport.tex @@ -0,0 +1,223 @@ +\documentclass[a4paper]{article} +\usepackage[T1]{fontenc} +\usepackage[utf8]{inputenc} +\usepackage{graphicx} +\usepackage{amsmath} +\usepackage{amsfonts} +\usepackage{amssymb} +\usepackage{color} +\usepackage{array} +\usepackage{caption} +\usepackage[french]{babel} +\usepackage[hidelinks=true]{hyperref} +\usepackage{mathtools} +\usepackage[nottoc, numbib]{tocbibind} +\usepackage{minted} + +\renewcommand\thesection{} + +\newcommand{\R}{\mathbb{R}} + +\usepackage[ + top=1.5cm, + bottom=1.5cm, + left=1.5cm, + right=1.5cm +]{geometry} + +\graphicspath{ + {./img/} +} + +\setlength{\parskip}{0.2cm} +\setlength{\parindent}{0pt} + +\begin{document} + +\begin{figure}[t] +\centering +\includegraphics[width=5cm]{inp_n7.png} +\end{figure} + +\title{ + \vspace{4cm} + \textbf{Compte-rendu 3 de Projet} \\ + Reconnaissance et reconstruction de visages +} +\author{ + Laurent Fainsin \\ + Florian Guilloux \\ + Lisa Larger +} +\date{ + \vspace{7cm} + Département Sciences du Numérique \\ + Première année \\ + 2020 — 2021 +} + +\maketitle + +\newpage + +\tableofcontents + +\newpage + +\section{Question 1} + +En utilisant le script matlab\ eigenfaces\_part3.m, on peut ainsi calculer les eigenfaces d'individus masqués et non masqués (en utilisant dans un premier temps la fonction eig): + +\begin{figure}[ht!] + \centering + \includegraphics[width=16cm]{trim_indiv_nomask.png} + \caption{Individus (non masqués) utilisés pour la création des eigenfaces \label{indiv_nomask}} +\end{figure} +\begin{figure}[ht!] + \centering + \includegraphics[width=16cm]{trim_eigenfaces_nomask.png} + \caption{Eigenfaces (non masquées) \label{eig_nomask}} +\end{figure} + +\newpage + +\begin{figure}[ht!] + \centering + \includegraphics[width=16cm]{trim_indiv_mask.png} + \caption{Individus (masqués) utilisés pour la création des eigenfaces \label{indiv_mask}} +\end{figure} +\begin{figure}[ht!] + \centering + \includegraphics[width=16cm]{trim_eigenfaces_mask.png} + \caption{Eigenfaces (masquées) \label{eig_mask}} +\end{figure} + +\newpage + +On peut de même si l'on le souhaite utiliser les fonctions que nous avons créées lors de la partie 2 du projet à la place de eig. On retrouve ainsi les mêmes eigenfaces, à l'exception de certaines dont les niveaux de gris sont inversés. + +\begin{figure}[ht!] + \centering + \includegraphics[width=16cm]{trim_eigenfaces_nomask_subspace.png} + \caption{Eigenfaces (non masquées) générées par subspace iteration \label{eig_nomask_sub}} +\end{figure} +\begin{figure}[ht!] + \centering + \includegraphics[width=16cm]{trim_eigenfaces_mask_subspace.png} + \caption{Eigenfaces (masquées) générées par subspace iteration \label{eig_mask_sub}} +\end{figure} + +\newpage + +\section{Question 2} + +À partir de ces eigenfaces on peut tracer la représentation des images dans la base des composantes principales. Ici pour des raisons évidentes de visualisation, seules les deux premières composantes sont utilisées. + +\begin{figure}[ht!] + \centering + \includegraphics[width=16cm]{trim_cluster_nomask.png} + \caption{ACP 2D des individus (non masqués) \label{cluster_nomask}} +\end{figure} +\begin{figure}[ht!] + \centering + \includegraphics[width=16cm]{trim_cluster_mask.png} + \caption{ACP 2D des individus (masqués) \label{cluster_mask}} +\end{figure} + +\newpage + +Cependant, on observe en traçant les contrastes de nos valeurs propres, que les deux premières dimensions regroupent 43\% de l'information dans nos images. Ainsi si l'on souhaite par exemple 95\% de l'information, il faudrait utiliser 12 composantes. Or un tracé en 12D est plutôt complexe à réaliser. + +\begin{figure}[ht!] + \centering + \includegraphics[width=16cm]{trim_contrast_nomask.png} + \caption{Contraste des eigenvalues (non masquées) \label{contrast_nomask}} +\end{figure} +\begin{figure}[ht!] + \centering + \includegraphics[width=16cm]{trim_contrast_mask.png} + \caption{Contraste des eigenvalues (masquées) \label{contrast_mask}} +\end{figure} + +\newpage + +Voici tout de même deux figures représentant nos données dans les trois premières composantes principales. Nous invitons le lecteur à utiliser les scripts fournis pour tracer et explorer lui-même ces figures 3D. + +\begin{figure}[ht!] + \centering + \includegraphics[width=19cm]{trim_cluster_nomask_3D.png} + \caption{ACP 3D des individus (non masqués) \label{cluster_nomask_3D}} +\end{figure} +\begin{figure}[ht!] + \centering + \includegraphics[width=19cm]{trim_cluster_mask_3D.png} + \caption{ACP 3D des individus (masqués) \label{cluster_mask_3D}} +\end{figure} + +\newpage + +\section{Question 3} + +En utilisant la méthode du 1 plus proche voisin, il est ainsi facile de classifier une nouvelle image, il suffit de la centrer, de la projeter sur les axes principaux et de trouver le point (associé à une image projetée) le plus proche de la projection. L'image de test est représentée sur la figure \ref{cluster_nomask_reconst} par une croix verte et reliée à son plus proche voisin par une ligne bleue. + +\begin{figure}[ht!] + \centering + \includegraphics[width=14.5cm]{trim_indiv_reco_nomask.png} + \caption{Plus proche voisin (non masqué) \label{indiv_nomask_reconst}} +\end{figure} +\begin{figure}[ht!] + \centering + \hspace*{-1.8cm} + \includegraphics[width=16cm]{trim_cluster_reco_nomask.png} + \caption{ACP de l'individu de test (non masqué) \label{cluster_nomask_reconst}} +\end{figure} + +\newpage + +Pour reconnaitre un individu masqué, seuls les images et notre modèle (nos eigenfaces) changent dans la méthode précédente, on obtient donc: + +\begin{figure}[ht!] + \centering + \includegraphics[width=16cm]{trim_indiv_reco_mask.png} + \caption{Plus proche voisin (masqué) \label{indiv_mask_reconst}} +\end{figure} +\begin{figure}[ht!] + \centering + \hspace*{-1.8cm} + \includegraphics[width=16cm]{trim_cluster_reco_mask.png} + \caption{ACP de l'individu de test (masqué) \label{cluster_mask_reconst}} +\end{figure} + +\newpage + +\section{Question 4} + +Finalement en utilisant l'image du plus proche voisin on peut ainsi essayer de reconstituer le visage de notre individu de test. On obtient généralement des résultats satisfaisant (et parfois très cursed). + +\begin{figure}[ht!] + \centering + \includegraphics[width=18cm]{trim_indiv_reco_predi.png} + \caption{Reconstitution de l'individu de test \label{indiv_reconst}} +\end{figure} +\begin{figure}[ht!] + \centering + \hspace*{-1.8cm} + \includegraphics[width=16cm]{trim_cluster_reco_predi.png} + \caption{ACP de l'individu de test (masqué) \label{cluster_reconst}} +\end{figure} + +\newpage + +\section{Question 5} + +Pour s'assurer que nous avons une reconstruction correcte de notre individu, on peut projeter l'image reconstruite sur les composantes principales et observer si l'image reconstituée est proche (ou non) de l'image non masquée d'origine. + +\begin{figure}[ht!] + \centering + \includegraphics[width=19cm]{trim_cluster_reco_eval.png} + \caption{Évaluation de la reconstitution par ACP \label{eval_reconst}} +\end{figure} + +Au vue de la figure \ref{eval_reconst} l'évalution semble mauvaise, mais n'est tracé ici que les deux premières composantes principales. En effet, dans une dimension supérieure à 2, les deux points sont plus proches, on peut l'observer légèrement en traçant le cluster en 3D. +Cette observation rejoint alors la question 3.3, puisque l'efficacité de cette évaluation dépend des paramètres que nous choisissons. Ici le paramètre le plus important est probablement le nombre de composantes à prendre en compte pour la sélection du plus proche voisin, ainsi que la norme choisie pour calculer la distance aux voisins. +\end{document} \ No newline at end of file diff --git a/rayleigh_ritz_projection.m b/rayleigh_ritz_projection.m new file mode 100644 index 0000000..60fc0cf --- /dev/null +++ b/rayleigh_ritz_projection.m @@ -0,0 +1,18 @@ +% projection de Rayleigh-Ritz +% Données +% A : matrice dont on cherche des couples propres +% V : ensemble de m vecteurs orthonormés + +% Résultats +% W : vecteur contenant les approximations des valeurs propres +% V : matrice des vecteurs propres correspondant +function [ W, V ] = rayleigh_ritz_projection( A, V ) + +H = V'*(A*V); + +[VH, DH] = eig(H); +[W, indice] = sort(diag(DH), 'descend'); + +V = V*VH(:, indice); + +end diff --git a/reconnaissance_avec_masque.m b/reconnaissance_avec_masque.m new file mode 100644 index 0000000..a8200b5 --- /dev/null +++ b/reconnaissance_avec_masque.m @@ -0,0 +1,81 @@ +clear; +close all; + +load eigenfaces; + +% Tirage aleatoire d'une image de test : +% personne = randi(nb_personnes); +% posture = randi(nb_postures); +% si on veut tester/mettre au point, on fixe l'individu +personne = 1; +posture = 5; + +ficF = strcat('./Data/', liste_personnes{personne}, liste_postures{posture}, '-300x400.gif'); +img = imread(ficF); +img(ligne_min:ligne_max,colonne_min:colonne_max) = 0; +image_test = double(transpose(img(:))); + + +% Pourcentage d'information +per = 0.95; + +% Nombre N de composantes principales a prendre en compte +% [dans un second temps, N peut etre calcule pour atteindre le pourcentage +% d'information avec N valeurs propres (contraste)] : +cumul = cumsum(lambda/sum(lambda)); +N = find( cumul >= per, 1 ); + +%%% plus proche voisin, k = 1 + +% Composantes principales des donnees d'apprentissage +C = X_centre_masque * W_masque; + +% Composantes principales de l'image de test +C_test = (image_test - individu_moyen_masque ) * W_masque; + +% on calcule les distances entre l'individu test et ceux des données +% d'apprentissage +distance = vecnorm(transpose(C(:,1:N) - C_test(:,1:N))); + +% on trouve le plus proche voisin +[~, I] = min(distance); + + +% on trouve le plus proche à partir de I +personne_proche = floor( (I-1) / nb_postures_base ) + 1; +posture_proche = mod(I-1, nb_postures_base) + 1; + +dx = 150; +dy = 150; +hold on; +for i = 1:nb_personnes_base + lignes = (i-1)*nb_postures_base+1:i*nb_postures_base; + plot(C(lignes,1), C(lignes,2), '*'); + text(C(lignes,1) + dx, C(lignes,2) + dy, liste_personnes_base(i) + "p" + string([1 2 3 4])); +end + +plot(C_test(1),C_test(2), '+', 'MarkerSize',10, 'LineWidth',2); % visage de test +line([C_test(1) C(I, 1)], [C_test(2) C(I, 2)]); +axis equal; +set(gca,'FontSize',20); +xlabel('$C_1$','FontSize',30,'Interpreter','Latex'); +ylabel('$C_2$','FontSize',30,'Interpreter','Latex'); + +figure('Name','Image tiree aleatoirement','Position',[0.2*L,0.2*H,0.8*L,0.5*H]); + +subplot(1, 2, 1); +% Affichage de l'image de test : +colormap gray; +imagesc(img); +title({'Individu de test' ; ['posture ' num2str(posture) ' de ', liste_personnes{personne}]}, 'FontSize', 20); +axis image; + + +ficF = strcat('./Data/', liste_personnes_base{personne_proche}, liste_postures{posture_proche}, '-300x400.gif'); +img = imread(ficF); +img(ligne_min:ligne_max,colonne_min:colonne_max) = 0; + +subplot(1, 2, 2); +imagesc(img); +title({'Individu le plus proche' ; ['posture ' num2str(posture_proche) ' de ', liste_personnes_base{personne_proche}]}, 'FontSize', 20); +axis image; diff --git a/reconnaissance_reconstruction.m b/reconnaissance_reconstruction.m new file mode 100644 index 0000000..9e6c9c9 --- /dev/null +++ b/reconnaissance_reconstruction.m @@ -0,0 +1,121 @@ +clear; +close all; + +load eigenfaces; + +% Tirage aleatoire d'une image de test : +% personne = randi(nb_personnes); +% posture = randi(nb_postures); +% si on veut tester/mettre au point, on fixe l'individu +personne = 1; +posture = 6; + +ficF = strcat('./Data/', liste_personnes{personne}, liste_postures{posture}, '-300x400.gif'); +img = imread(ficF); +img(ligne_min:ligne_max,colonne_min:colonne_max) = 0; +image_test = double(transpose(img(:))); + + +% Pourcentage d'information +per = 0.95; + +% Nombre N de composantes principales a prendre en compte +% [dans un second temps, N peut etre calcule pour atteindre le pourcentage +% d'information avec N valeurs propres (contraste)] : +cumul = cumsum(lambda/sum(lambda)); +N = find( cumul >= per, 1 ); +%N = 2; + +%%% plus proche voisin, k = 1 + +% Composantes principales des donnees d'apprentissage +C = X_centre_masque * W_masque; + +% Composantes principales de l'image de test +C_test = (image_test - individu_moyen_masque ) * W_masque; + +% on calcule les distances entre l'individu test et ceux des données +% d'apprentissage +distance = vecnorm(transpose(C(:,1:N) - C_test(:,1:N))); + +% on trouve le plus proche voisin +[~, I] = min(distance); + +% on trouve le plus proche à partir de I +personne_proche = floor( (I-1) / nb_postures_base ) + 1; +posture_proche = mod(I-1, nb_postures_base) + 1; + +dx = 150; +dy = 150; +hold on; +for i = 1:nb_personnes_base + lignes = (i-1)*nb_postures_base+1:i*nb_postures_base; + plot(C(lignes,1), C(lignes,2), '*'); + text(C(lignes,1) + dx, C(lignes,2) + dy, liste_personnes_base(i) + "p" + string([1 2 3 4])); +end + +plot(C_test(1),C_test(2), '+', 'MarkerSize',10, 'LineWidth',2); % visage de test +line([C_test(1) C(I, 1)], [C_test(2) C(I, 2)]); +axis equal; +set(gca,'FontSize',20); +xlabel('$C_1$','FontSize',30,'Interpreter','Latex'); +ylabel('$C_2$','FontSize',30,'Interpreter','Latex'); + +figure('Name','Image tiree aleatoirement','Position',[0.2*L,0.2*H,0.8*L,0.5*H]); + +subplot(1, 3, 1); +% Affichage de l'image de test : +colormap gray; +imagesc(img); +title({'Individu de test' ; ['posture ' num2str(posture) ' de ', liste_personnes{personne}]}, 'FontSize', 20); +axis image; + + +ficF = strcat('./Data/', liste_personnes_base{personne_proche}, liste_postures{posture_proche}, '-300x400.gif'); +img = imread(ficF); +img(ligne_min:ligne_max,colonne_min:colonne_max) = 0; + +subplot(1, 3, 2); +imagesc(img); +title({'Individu le plus proche' ; ['posture ' num2str(posture_proche) ' de ', liste_personnes_base{personne_proche}]}, 'FontSize', 20); +axis image; + +subplot(1, 3, 3); +img_demasq = reshape(image_test, nb_lignes, nb_colonnes); +ficF = strcat('./Data/', liste_personnes_base{personne_proche}, liste_postures{posture_proche}, '-300x400.gif'); +img = imread(ficF); +img_demasq(ligne_min:ligne_max,colonne_min:colonne_max) = img(ligne_min:ligne_max,colonne_min:colonne_max); +imagesc(img_demasq); +title('Individu démasqué', 'FontSize', 20); +axis image; + +%% évaluation +% on cherche les composantes principales de notre nouvelle image et la +% compare à ce que l'on cherche. + +load eigenfaces_all_4posture; + +figure; + +image_demasq = double(transpose(img_demasq(:))); + +C_demasq = (image_demasq - individu_moyen) * W; +C_nomasq = X_centre * W; + +dx = 50; +dy = 50; +hold on; +for i = 1:nb_personnes_base + lignes = (i-1)*nb_postures_base+1:i*nb_postures_base; + plot(C_nomasq(lignes,1), C_nomasq(lignes,2), '*'); + text(C_nomasq(lignes,1) + dx, C_nomasq(lignes,2) + dy, liste_personnes_base(i) + "p" + string([1 2 3 4])); +end + +plot(C_demasq(1),C_demasq(2), 'x', 'MarkerSize',10, 'LineWidth',2); % visage de test + +ligne = (personne-1)*nb_postures_base + posture; +line([C_demasq(1) C_nomasq(ligne, 1)], [C_demasq(2) C_nomasq(ligne, 2)]); +axis equal; +set(gca,'FontSize',20); +xlabel('$C_1$','FontSize',30,'Interpreter','Latex'); +ylabel('$C_2$','FontSize',30,'Interpreter','Latex'); \ No newline at end of file diff --git a/reconnaissance_sans_masque.m b/reconnaissance_sans_masque.m new file mode 100644 index 0000000..be515e8 --- /dev/null +++ b/reconnaissance_sans_masque.m @@ -0,0 +1,79 @@ +clear; +close all; + +load eigenfaces; + +% Tirage aleatoire d'une image de test : +% personne = randi(nb_personnes); +% posture = randi(nb_postures); +% si on veut tester/mettre au point, on fixe l'individu +personne = 26; +posture = 6; + +ficF = strcat('./Data/', liste_personnes{personne}, liste_postures{posture}, '-300x400.gif'); +img = imread(ficF); +image_test = double(transpose(img(:))); + + +% Pourcentage d'information +per = 0.95; + +% Nombre N de composantes principales a prendre en compte +% [dans un second temps, N peut etre calcule pour atteindre le pourcentage +% d'information avec N valeurs propres (contraste)] : +N = 15; + +%%% plus proche voisin, k = 1 + +% Composantes principales des donnees d'apprentissage +C = X_centre * W; + +% Composantes principales de l'image de test +C_test = (image_test - individu_moyen ) * W; + +% on calcule les distances entre l'individu test et ceux des données +% d'apprentissage +distance = vecnorm(transpose(C(:,1:N) - C_test(:,1:N))); + +% on trouve le plus proche voisin +[~, I] = min(distance); + + +% on trouve le plus proche à partir de I +personne_proche = floor( (I-1) / nb_postures_base ) + 1; +posture_proche = mod(I-1, nb_postures_base) + 1; + +dx = 150; +dy = 150; +hold on; +for i = 1:nb_personnes_base + lignes = (i-1)*nb_postures_base+1:i*nb_postures_base; + plot(C(lignes,1), C(lignes,2), '*'); + text(C(lignes,1) + dx, C(lignes,2) + dy, liste_personnes_base(i) + "p" + string([1 2 3 4])); +end + +plot(C_test(1),C_test(2), '+', 'MarkerSize',10, 'LineWidth',2); % visage de test +line([C_test(1) C(I, 1)], [C_test(2) C(I, 2)]); +axis equal; +set(gca,'FontSize',20); +xlabel('$C_1$','FontSize',30,'Interpreter','Latex'); +ylabel('$C_2$','FontSize',30,'Interpreter','Latex'); + + +figure('Name','Image tiree aleatoirement','Position',[0.2*L,0.2*H,0.8*L,0.5*H]); + +subplot(1, 2, 1); +% Affichage de l'image de test : +colormap gray; +imagesc(img); +title({'Individu de test' ; ['posture ' num2str(posture) ' de ', liste_personnes{personne}]}, 'FontSize', 20); +axis image; + + +ficF = strcat('./Data/', liste_personnes_base{personne_proche}, liste_postures{posture_proche}, '-300x400.gif'); +img = imread(ficF); + +subplot(1, 2, 2); +imagesc(img); +title({'Individu le plus proche ' ; ['posture ' num2str(posture_proche) ' de ', liste_personnes_base{personne_proche}]}, 'FontSize', 20); +axis image; diff --git a/subspace_iter_v2.m b/subspace_iter_v2.m new file mode 100644 index 0000000..d5bbd75 --- /dev/null +++ b/subspace_iter_v2.m @@ -0,0 +1,125 @@ +function [ W, V, n_ev, it, itv, flag ] = subspace_iter_v2( A, m, percentage, p, eps, maxit ) + + % calcul de la norme de A (pour le critère de convergence d'un vecteur (gamma)) + normA = norm(A, 'fro'); + + % trace de A + traceA = trace(A); + + % valeur correspondnat au pourcentage de la trace à atteindre + vtrace = percentage*traceA; + + n = size(A,1); + W = zeros(m,1); + itv = zeros(m,1); + + % numéro de l'itération courante + k = 0; + % somme courante des valeurs propres + eigsum = 0.0; + % nombre de vecteurs ayant convergés + nb_c = 0; + + % indicateur de la convergence + conv = 0; + + % on génère un ensemble initial de m vecteurs orthogonaux + Vr = randn(n, m); + Vr = mgs(Vr); + + % rappel : conv = (eigsum >= trace) | (nb_c == m) + while (~conv & k < maxit), + + k = k+1; + %% Y <- A^p * V + Y = Vr; + for i=1:p + Y = A*Y; + end; + + %% orthogonalisation + Vr = mgs(Y); + + %% Projection de Rayleigh-Ritz + [Wr, Vr] = rayleigh_ritz_projection(A, Vr); + + %% Quels vecteurs ont convergé à cette itération + analyse_cvg_finie = 0; + % nombre de vecteurs ayant convergé à cette itération + nbc_k = 0; + % nb_c est le dernier vecteur à avoir convergé à l'itération précédente + i = nb_c + 1; + + while(~analyse_cvg_finie), + % tous les vecteurs de notre sous-espace ont convergé + % on a fini (sans avoir obtenu le pourcentage) + if(i > m) + analyse_cvg_finie = 1; + else + % est-ce que le vecteur i a convergé + + % calcul de la norme du résidu + aux = A*Vr(:,i) - Wr(i)*Vr(:,i); + res = sqrt(aux'*aux); + + if(res >= eps*normA) + % le vecteur i n'a pas convergé, + % on sait que les vecteurs suivants n'auront pas convergé non plus + % => itération finie + analyse_cvg_finie = 1; + else + % le_vecteur i a convergé + % un de plus + nbc_k = nbc_k + 1; + % on le stocke ainsi que sa valeur propre + W(i) = Wr(i); + + itv(i) = k; + + % on met à jour la somme des valeurs propres + eigsum = eigsum + W(i); + + % si cette valeur propre permet d'atteindre le pourcentage + % on a fini + if(eigsum >= vtrace) + analyse_cvg_finie = 1; + else + % on passe au vecteur suivant + i = i + 1; + end + end + end + end + + % on met à jour le nombre de vecteurs ayant convergés + nb_c = nb_c + nbc_k; + + % on a convergé dans l'un de ces deux cas + conv = (nb_c == m) | (eigsum >= vtrace); + + end + + if(conv) + % mise à jour des résultats + n_ev = nb_c; + V = Vr(:, 1:n_ev); + W = W(1:n_ev); + it = k; + else + % on n'a pas convergé + W = zeros(1,1); + V = zeros(1,1); + n_ev = 0; + it = k; + end + + % on indique comment on a fini + if(eigsum >= vtrace) + flag = 0; + else if (n_ev == m) + flag = 1; + else + flag = -3; + end + end +end \ No newline at end of file diff --git a/subspace_iter_v3.m b/subspace_iter_v3.m new file mode 100644 index 0000000..5b3a541 --- /dev/null +++ b/subspace_iter_v3.m @@ -0,0 +1,155 @@ +% version améliorée de la méthode de l'espace invariant (v2) +% avec utilisation de la projection de Raleigh-Ritz +% avec une accélération bloc + +% Données +% A : matrice dont on cherche des couples propres +% m : taille maximale de l'espace invariant que l'on va utiliser +% percentage : pourcentage recherché de la trace +% p : nombre de produits Y = A^p . V +% eps : seuil pour déterminer si un vecteur de l'espace invariant a convergé +% maxit : nombre maximum d'itérations de la méthode + +% Résultats +% W : vecteur contenant les valeurs propres (ordre décroissant) +% V : matrice des vecteurs propres correspondant +% n_ev : nombre de couples propres calculées +% it : nombre d'itérations de la méthode +% itv : nombre d'itérations pour chaque couple propre +% flag : indicateur sur la terminaison de l'algorithme + % flag = 0 : on converge en ayant atteint le pourcentage de la trace recherché + % flag = 1 : on converge en ayant atteint la taille maximale de l'espace + % flag = -3 : on n'a pas convergé en maxit itérations + +function [ W, V, n_ev, it, itv, flag ] = subspace_iter_v3( A, m, percentage, p, eps, maxit ) + + % calcul de la norme de A (pour le critère de convergence d'un vecteur (gamma)) + normA = norm(A, 'fro'); + + % trace de A + traceA = trace(A); + + % valeur correspondnat au pourcentage de la trace à atteindre + vtrace = percentage*traceA; + + n = size(A,1); + W = zeros(m,1); + Wr = zeros(m,1); + itv = zeros(m,1); + + % numéro de l'itération courante + k = 0; + % somme courante des valeurs propres + eigsum = 0.0; + % nombre de vecteurs ayant convergés + nb_c = 0; + + % indicateur de la convergence + conv = 0; + + % on génère un ensemble initial de m vecteurs orthogonaux + Vr = randn(n, m); + Vr = mgs(Vr); + + % rappel : conv = (eigsum >= trace) | (nb_c == m) + while (~conv & k < maxit), + + V_nc = Vr(:,nb_c+1:end); + + k = k+1; + + %% Y <- A^p * V + Y = V_nc; + for i=1:p + Y = A*Y; + end + + %% orthogonalisation + Vr(:,nb_c+1:end) = Y; + Vr = mgs(Vr); + + %% Projection de Rayleigh-Ritz + [W_nc, V_nc] = rayleigh_ritz_projection(A, Vr(:,nb_c+1:end)); + Wr(nb_c+1:end) = W_nc; + Vr(:,nb_c+1:end) = V_nc; + + %% Quels vecteurs ont convergé à cette itération + analyse_cvg_finie = 0; + % nombre de vecteurs ayant convergé à cette itération + nbc_k = 0; + % nb_c est le dernier vecteur à avoir convergé à l'itération précédente + i = nb_c + 1; + + while(~analyse_cvg_finie), + % tous les vecteurs de notre sous-espace ont convergé + % on a fini (sans avoir obtenu le pourcentage) + if(i > m) + analyse_cvg_finie = 1; + else + % est-ce que le vecteur i a convergé + + % calcul de la norme du résidu + aux = A*Vr(:,i) - Wr(i)*Vr(:,i); + res = sqrt(aux'*aux); + + if(res >= eps*normA) + % le vecteur i n'a pas convergé, + % on sait que les vecteurs suivants n'auront pas convergé non plus + % => itération finie + analyse_cvg_finie = 1; + else + % le_vecteur i a convergé + % un de plus + nbc_k = nbc_k + 1; + % on le stocke ainsi que sa valeur propre + W(i) = Wr(i); + + itv(i) = k; + + % on met à jour la somme des valeurs propres + eigsum = eigsum + W(i); + + % si cette valeur propre permet d'atteindre le pourcentage + % on a fini + if(eigsum >= vtrace) + analyse_cvg_finie = 1; + else + % on passe au vecteur suivant + i = i + 1; + end + end + end + end + + % on met à jour le nombre de vecteurs ayant convergés + nb_c = nb_c + nbc_k; + + % on a convergé dans l'un de ces deux cas + conv = (nb_c == m) | (eigsum >= vtrace); + + end + + if(conv) + % mise à jour des résultats + n_ev = nb_c; + V = Vr(:, 1:n_ev); + W = W(1:n_ev); + it = k; + else + % on n'a pas convergé + W = zeros(1,1); + V = zeros(1,1); + n_ev = 0; + it = k; + end + + % on indique comment on a fini + if(eigsum >= vtrace) + flag = 0; + else if (n_ev == m) + flag = 1; + else + flag = -3; + end + end +end diff --git a/trim_cluster_mask.png b/trim_cluster_mask.png new file mode 100644 index 0000000..297eac0 Binary files /dev/null and b/trim_cluster_mask.png differ diff --git a/trim_cluster_mask_3D.png b/trim_cluster_mask_3D.png new file mode 100644 index 0000000..e465cf9 Binary files /dev/null and b/trim_cluster_mask_3D.png differ diff --git a/trim_cluster_nomask.png b/trim_cluster_nomask.png new file mode 100644 index 0000000..0f860ba Binary files /dev/null and b/trim_cluster_nomask.png differ diff --git a/trim_cluster_nomask_3D.png b/trim_cluster_nomask_3D.png new file mode 100644 index 0000000..1bb6e8c Binary files /dev/null and b/trim_cluster_nomask_3D.png differ diff --git a/trim_cluster_reco_eval.png b/trim_cluster_reco_eval.png new file mode 100644 index 0000000..a031a55 Binary files /dev/null and b/trim_cluster_reco_eval.png differ diff --git a/trim_cluster_reco_mask.png b/trim_cluster_reco_mask.png new file mode 100644 index 0000000..4831dba Binary files /dev/null and b/trim_cluster_reco_mask.png differ diff --git a/trim_cluster_reco_nomask.png b/trim_cluster_reco_nomask.png new file mode 100644 index 0000000..c2b40fe Binary files /dev/null and b/trim_cluster_reco_nomask.png differ diff --git a/trim_cluster_reco_predi.png b/trim_cluster_reco_predi.png new file mode 100644 index 0000000..529c83d Binary files /dev/null and b/trim_cluster_reco_predi.png differ diff --git a/trim_contrast_mask.png b/trim_contrast_mask.png new file mode 100644 index 0000000..6404348 Binary files /dev/null and b/trim_contrast_mask.png differ diff --git a/trim_contrast_nomask.png b/trim_contrast_nomask.png new file mode 100644 index 0000000..3363e01 Binary files /dev/null and b/trim_contrast_nomask.png differ diff --git a/trim_eigenfaces_mask.png b/trim_eigenfaces_mask.png new file mode 100644 index 0000000..8fe2702 Binary files /dev/null and b/trim_eigenfaces_mask.png differ diff --git a/trim_eigenfaces_mask_subspace.png b/trim_eigenfaces_mask_subspace.png new file mode 100644 index 0000000..c9459d5 Binary files /dev/null and b/trim_eigenfaces_mask_subspace.png differ diff --git a/trim_eigenfaces_nomask.png b/trim_eigenfaces_nomask.png new file mode 100644 index 0000000..5a5c3cd Binary files /dev/null and b/trim_eigenfaces_nomask.png differ diff --git a/trim_eigenfaces_nomask_subspace.png b/trim_eigenfaces_nomask_subspace.png new file mode 100644 index 0000000..d908cec Binary files /dev/null and b/trim_eigenfaces_nomask_subspace.png differ diff --git a/trim_indiv_mask.png b/trim_indiv_mask.png new file mode 100644 index 0000000..5500478 Binary files /dev/null and b/trim_indiv_mask.png differ diff --git a/trim_indiv_nomask.png b/trim_indiv_nomask.png new file mode 100644 index 0000000..e8ab86e Binary files /dev/null and b/trim_indiv_nomask.png differ diff --git a/trim_indiv_reco_mask.png b/trim_indiv_reco_mask.png new file mode 100644 index 0000000..c7e7301 Binary files /dev/null and b/trim_indiv_reco_mask.png differ diff --git a/trim_indiv_reco_nomask.png b/trim_indiv_reco_nomask.png new file mode 100644 index 0000000..f12478c Binary files /dev/null and b/trim_indiv_reco_nomask.png differ diff --git a/trim_indiv_reco_predi.png b/trim_indiv_reco_predi.png new file mode 100644 index 0000000..7b62e1e Binary files /dev/null and b/trim_indiv_reco_predi.png differ diff --git a/trim_inp_n7.png b/trim_inp_n7.png new file mode 100644 index 0000000..4afe373 Binary files /dev/null and b/trim_inp_n7.png differ