diff --git a/BeardColor/Black/bandholz-beard.jpg b/BeardColor/Black/bandholz-beard.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a1240c3d2b780d9dfd5d7b890a0fb4c2f0a8a22a Binary files /dev/null and b/BeardColor/Black/bandholz-beard.jpg differ diff --git a/BeardColor/Black/download (1).jpg b/BeardColor/Black/download (1).jpg new file mode 100644 index 0000000000000000000000000000000000000000..a5102cbedbba291e7b8c16369862b0e92dd42dbb Binary files /dev/null and b/BeardColor/Black/download (1).jpg differ diff --git a/BeardColor/Black/download (10).jpg b/BeardColor/Black/download (10).jpg new file mode 100644 index 0000000000000000000000000000000000000000..d888f7903ee8a2e8338ca52541f26ffd2ccf75ae Binary files /dev/null and b/BeardColor/Black/download (10).jpg differ diff --git a/BeardColor/Black/download (11).jpg b/BeardColor/Black/download (11).jpg new file mode 100644 index 0000000000000000000000000000000000000000..a637da75cdcd2947238c602e87242f6a77205e36 Binary files /dev/null and b/BeardColor/Black/download (11).jpg differ diff --git a/BeardColor/Black/download (12).jpg b/BeardColor/Black/download (12).jpg new file mode 100644 index 0000000000000000000000000000000000000000..fdb653f2b71b0b12bdf8131e151daa48efb166c2 Binary files /dev/null and b/BeardColor/Black/download (12).jpg differ diff --git a/BeardColor/Black/download (13).jpg b/BeardColor/Black/download (13).jpg new file mode 100644 index 0000000000000000000000000000000000000000..16098ff5a1fb55130207dbb452befed9dfef719c Binary files /dev/null and b/BeardColor/Black/download (13).jpg differ diff --git a/BeardColor/Black/download (14).jpg b/BeardColor/Black/download (14).jpg new file mode 100644 index 0000000000000000000000000000000000000000..0f288fcdf5862c44a91806532499bb266c7f2352 Binary files /dev/null and b/BeardColor/Black/download (14).jpg differ diff --git a/BeardColor/Black/download (15).jpg b/BeardColor/Black/download (15).jpg new file mode 100644 index 0000000000000000000000000000000000000000..70f956cf4a249c3be79dcb848d4d78f137d6fc22 Binary files /dev/null and b/BeardColor/Black/download (15).jpg differ diff --git a/BeardColor/Black/download (16).jpg b/BeardColor/Black/download (16).jpg new file mode 100644 index 0000000000000000000000000000000000000000..5aab3b824357188aca5b7d37f17c22f01e020fc7 Binary files /dev/null and b/BeardColor/Black/download (16).jpg differ diff --git a/BeardColor/Black/download (2).jpg b/BeardColor/Black/download (2).jpg new file mode 100644 index 0000000000000000000000000000000000000000..e94ce63a89c53e1febebb7f6b860e9bf29513477 Binary files /dev/null and b/BeardColor/Black/download (2).jpg differ diff --git a/BeardColor/Black/download (3).jpg b/BeardColor/Black/download (3).jpg new file mode 100644 index 0000000000000000000000000000000000000000..b206978aee3c2cf736f063d799c6808e02b6bc30 Binary files /dev/null and b/BeardColor/Black/download (3).jpg differ diff --git a/BeardColor/Black/download (4).jpg b/BeardColor/Black/download (4).jpg new file mode 100644 index 0000000000000000000000000000000000000000..b33485a580a3a828fc149798d70a4052dcd5ad4a Binary files /dev/null and b/BeardColor/Black/download (4).jpg differ diff --git a/BeardColor/Black/download (5).jpg b/BeardColor/Black/download (5).jpg new file mode 100644 index 0000000000000000000000000000000000000000..04c1352fc59389556fc9f31b70988e3b900f9609 Binary files /dev/null and b/BeardColor/Black/download (5).jpg differ diff --git a/BeardColor/Black/download (6).jpg b/BeardColor/Black/download (6).jpg new file mode 100644 index 0000000000000000000000000000000000000000..1e36e1241ab4a4dc7dc3d3a3f36359911c18a802 Binary files /dev/null and b/BeardColor/Black/download (6).jpg differ diff --git a/BeardColor/Black/download (7).jpg b/BeardColor/Black/download (7).jpg new file mode 100644 index 0000000000000000000000000000000000000000..c967856a3d41403baa699b82dc9c26c18bc7d809 Binary files /dev/null and b/BeardColor/Black/download (7).jpg differ diff --git a/BeardColor/Black/download (8).jpg b/BeardColor/Black/download (8).jpg new file mode 100644 index 0000000000000000000000000000000000000000..28f14ccce15107d448dd48a229642f6599f16bac Binary files /dev/null and b/BeardColor/Black/download (8).jpg differ diff --git a/BeardColor/Black/download (9).jpg b/BeardColor/Black/download (9).jpg new file mode 100644 index 0000000000000000000000000000000000000000..f58e0543ec9b72a10f939dabfc85c4dcbfee7178 Binary files /dev/null and b/BeardColor/Black/download (9).jpg differ diff --git a/BeardColor/Black/download.jpg b/BeardColor/Black/download.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2f0d59733d583cb4763c8b3ad327e3be41045bee Binary files /dev/null and b/BeardColor/Black/download.jpg differ diff --git a/BeardColor/Black/images (1).jpg b/BeardColor/Black/images (1).jpg new file mode 100644 index 0000000000000000000000000000000000000000..b184e8aa8564eaecae6e38943a1a11e4bc976743 Binary files /dev/null and b/BeardColor/Black/images (1).jpg differ diff --git a/BeardColor/Black/images (10).jpg b/BeardColor/Black/images (10).jpg new file mode 100644 index 0000000000000000000000000000000000000000..b883309c6a1ca702d50492fbd5d5a9594a8d3051 Binary files /dev/null and b/BeardColor/Black/images (10).jpg differ diff --git a/BeardColor/Black/images (11).jpg b/BeardColor/Black/images (11).jpg new file mode 100644 index 0000000000000000000000000000000000000000..525d68e8aaba45ee7c8b150bf5da9380030031f0 Binary files /dev/null and b/BeardColor/Black/images (11).jpg differ diff --git a/BeardColor/Black/images (12).jpg b/BeardColor/Black/images (12).jpg new file mode 100644 index 0000000000000000000000000000000000000000..e18a7ca86cfe344bf3e52c3b4aefb5fe18f74c57 Binary files /dev/null and b/BeardColor/Black/images (12).jpg differ diff --git a/BeardColor/Black/images (13).jpg b/BeardColor/Black/images (13).jpg new file mode 100644 index 0000000000000000000000000000000000000000..634aaa9c7806e713e70984f53d779641f6e18192 Binary files /dev/null and b/BeardColor/Black/images (13).jpg differ diff --git a/BeardColor/Black/images (14).jpg b/BeardColor/Black/images (14).jpg new file mode 100644 index 0000000000000000000000000000000000000000..7aaf1b24c97a26ec4c113aaf8c2e2e2c1339aad3 Binary files /dev/null and b/BeardColor/Black/images (14).jpg differ diff --git a/BeardColor/Black/images (15).jpg b/BeardColor/Black/images (15).jpg new file mode 100644 index 0000000000000000000000000000000000000000..3bb063c98b39680b0c3208b1845e2695cb872d33 Binary files /dev/null and b/BeardColor/Black/images (15).jpg differ diff --git a/BeardColor/Black/images (16).jpg b/BeardColor/Black/images (16).jpg new file mode 100644 index 0000000000000000000000000000000000000000..fffd48bdb22f2a5e39e6e6ce14ff994b4959ae50 Binary files /dev/null and b/BeardColor/Black/images (16).jpg differ diff --git a/BeardColor/Black/images (17).jpg b/BeardColor/Black/images (17).jpg new file mode 100644 index 0000000000000000000000000000000000000000..382a59e68e2b69aa4bf5cd4beb155634efc79e43 Binary files /dev/null and b/BeardColor/Black/images (17).jpg differ diff --git a/BeardColor/Black/images (18).jpg b/BeardColor/Black/images (18).jpg new file mode 100644 index 0000000000000000000000000000000000000000..3abcd75861ec035d8e533eb4ba4fd2f56355a784 Binary files /dev/null and b/BeardColor/Black/images (18).jpg differ diff --git a/BeardColor/Black/images (19).jpg b/BeardColor/Black/images (19).jpg new file mode 100644 index 0000000000000000000000000000000000000000..433d252d0386acd391523003a2ee485a33afa736 Binary files /dev/null and b/BeardColor/Black/images (19).jpg differ diff --git a/BeardColor/Black/images (2).jpg b/BeardColor/Black/images (2).jpg new file mode 100644 index 0000000000000000000000000000000000000000..7ed258a8ef919ba1d2b26e5bbde394fbc17c5279 Binary files /dev/null and b/BeardColor/Black/images (2).jpg differ diff --git a/BeardColor/Black/images (20).jpg b/BeardColor/Black/images (20).jpg new file mode 100644 index 0000000000000000000000000000000000000000..95fe351415cffd9b6ad2ed7e7a01387048afa319 Binary files /dev/null and b/BeardColor/Black/images (20).jpg differ diff --git a/BeardColor/Black/images (21).jpg b/BeardColor/Black/images (21).jpg new file mode 100644 index 0000000000000000000000000000000000000000..44f36157145e64b222c1929009ed5f45e31f9825 Binary files /dev/null and b/BeardColor/Black/images (21).jpg differ diff --git a/BeardColor/Black/images (22).jpg b/BeardColor/Black/images (22).jpg new file mode 100644 index 0000000000000000000000000000000000000000..78ff4e693987c05b802473d4fd2e46455a17c786 Binary files /dev/null and b/BeardColor/Black/images (22).jpg differ diff --git a/BeardColor/Black/images (23).jpg b/BeardColor/Black/images (23).jpg new file mode 100644 index 0000000000000000000000000000000000000000..ccbba1b826d83b5efd1ea23bf66ed64ab0a3e71f Binary files /dev/null and b/BeardColor/Black/images (23).jpg differ diff --git a/BeardColor/Black/images (24).jpg b/BeardColor/Black/images (24).jpg new file mode 100644 index 0000000000000000000000000000000000000000..9c8ae5f4f62328747cf857888ec20ab67aa42739 Binary files /dev/null and b/BeardColor/Black/images (24).jpg differ diff --git a/BeardColor/Black/images (25).jpg b/BeardColor/Black/images (25).jpg new file mode 100644 index 0000000000000000000000000000000000000000..b1513baf4ad364b5de4fe31cd43328b80e577140 Binary files /dev/null and b/BeardColor/Black/images (25).jpg differ diff --git a/BeardColor/Black/images (26).jpg b/BeardColor/Black/images (26).jpg new file mode 100644 index 0000000000000000000000000000000000000000..4c60984b0fc1e6c2f47a61ae360634b86ab3d1b3 Binary files /dev/null and b/BeardColor/Black/images (26).jpg differ diff --git a/BeardColor/Black/images (27).jpg b/BeardColor/Black/images (27).jpg new file mode 100644 index 0000000000000000000000000000000000000000..c1542efa9e6cb13c9758c07e1c55c22ce924542e Binary files /dev/null and b/BeardColor/Black/images (27).jpg differ diff --git a/BeardColor/Black/images (28).jpg b/BeardColor/Black/images (28).jpg new file mode 100644 index 0000000000000000000000000000000000000000..6f15beb9ade728eee805d23ffb5099a4c674d5c1 Binary files /dev/null and b/BeardColor/Black/images (28).jpg differ diff --git a/BeardColor/Black/images (29).jpg b/BeardColor/Black/images (29).jpg new file mode 100644 index 0000000000000000000000000000000000000000..be70db310a9d3072b0ce0850637228bc55ffd46b Binary files /dev/null and b/BeardColor/Black/images (29).jpg differ diff --git a/BeardColor/Black/images (3).jpg b/BeardColor/Black/images (3).jpg new file mode 100644 index 0000000000000000000000000000000000000000..0ac68e46d9f0d22ce90d25f2ffd344495fe2738b Binary files /dev/null and b/BeardColor/Black/images (3).jpg differ diff --git a/BeardColor/Black/images (30).jpg b/BeardColor/Black/images (30).jpg new file mode 100644 index 0000000000000000000000000000000000000000..2ff4930c45887cba14f91a52f8fc912638240551 Binary files /dev/null and b/BeardColor/Black/images (30).jpg differ diff --git a/BeardColor/Black/images (31).jpg b/BeardColor/Black/images (31).jpg new file mode 100644 index 0000000000000000000000000000000000000000..79a38b0f79a312d263e51658ff069e0fcc9fcdbd Binary files /dev/null and b/BeardColor/Black/images (31).jpg differ diff --git a/BeardColor/Black/images (32).jpg b/BeardColor/Black/images (32).jpg new file mode 100644 index 0000000000000000000000000000000000000000..a5e4f07800ac6a8fcdc2807968cd49a46f8d47e0 Binary files /dev/null and b/BeardColor/Black/images (32).jpg differ diff --git a/BeardColor/Black/images (33).jpg b/BeardColor/Black/images (33).jpg new file mode 100644 index 0000000000000000000000000000000000000000..a89d55e695359b10bd05709a1f749323170f1f69 Binary files /dev/null and b/BeardColor/Black/images (33).jpg differ diff --git a/BeardColor/Black/images (34).jpg b/BeardColor/Black/images (34).jpg new file mode 100644 index 0000000000000000000000000000000000000000..574ea6450fdf3a0f4d907ae14417208d6a32a81e Binary files /dev/null and b/BeardColor/Black/images (34).jpg differ diff --git a/BeardColor/Black/images (35).jpg b/BeardColor/Black/images (35).jpg new file mode 100644 index 0000000000000000000000000000000000000000..057c722f54b12167f5051ff2f26b1ab31586cd00 Binary files /dev/null and b/BeardColor/Black/images (35).jpg differ diff --git a/BeardColor/Black/images (36).jpg b/BeardColor/Black/images (36).jpg new file mode 100644 index 0000000000000000000000000000000000000000..9afb4d79a89248621c15629b1d061e71bb81baa0 Binary files /dev/null and b/BeardColor/Black/images (36).jpg differ diff --git a/BeardColor/Black/images (37).jpg b/BeardColor/Black/images (37).jpg new file mode 100644 index 0000000000000000000000000000000000000000..09dd691643e3036c0768b7f285c57cac0d4e05e2 Binary files /dev/null and b/BeardColor/Black/images (37).jpg differ diff --git a/BeardColor/Black/images (38).jpg b/BeardColor/Black/images (38).jpg new file mode 100644 index 0000000000000000000000000000000000000000..aa7a8f4ee896efd5e300003c47afc9cf7190c39d Binary files /dev/null and b/BeardColor/Black/images (38).jpg differ diff --git a/BeardColor/Black/images (39).jpg b/BeardColor/Black/images (39).jpg new file mode 100644 index 0000000000000000000000000000000000000000..d3d7385a14e55704ca590bae25e2e3214ee1cfd7 Binary files /dev/null and b/BeardColor/Black/images (39).jpg differ diff --git a/BeardColor/Black/images (4).jpg b/BeardColor/Black/images (4).jpg new file mode 100644 index 0000000000000000000000000000000000000000..ad6a4e01c174ac528011f95ea3374661a521ae6e Binary files /dev/null and b/BeardColor/Black/images (4).jpg differ diff --git a/BeardColor/Black/images (5).jpg b/BeardColor/Black/images (5).jpg new file mode 100644 index 0000000000000000000000000000000000000000..19d7c4dcc8ff70b19a07c513c721f86ad55a067d Binary files /dev/null and b/BeardColor/Black/images (5).jpg differ diff --git a/BeardColor/Black/images (6).jpg b/BeardColor/Black/images (6).jpg new file mode 100644 index 0000000000000000000000000000000000000000..20931e418f107a8ee22733a36bd774005a38e23f Binary files /dev/null and b/BeardColor/Black/images (6).jpg differ diff --git a/BeardColor/Black/images (7).jpg b/BeardColor/Black/images (7).jpg new file mode 100644 index 0000000000000000000000000000000000000000..bdfa412764e0ef3a01a7b3f90248cf5d82a3554d Binary files /dev/null and b/BeardColor/Black/images (7).jpg differ diff --git a/BeardColor/Black/images (8).jpg b/BeardColor/Black/images (8).jpg new file mode 100644 index 0000000000000000000000000000000000000000..36828c13a9229a44ecc4112cc7c97eb772d3705d Binary files /dev/null and b/BeardColor/Black/images (8).jpg differ diff --git a/BeardColor/Black/images (9).jpg b/BeardColor/Black/images (9).jpg new file mode 100644 index 0000000000000000000000000000000000000000..0e97390ad187400ffdc94cefe37a9a5e601076c4 Binary files /dev/null and b/BeardColor/Black/images (9).jpg differ diff --git a/BeardColor/Black/images.jpg b/BeardColor/Black/images.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c97d4a47bf116ad39a8549a303a9accc4da84dd7 Binary files /dev/null and b/BeardColor/Black/images.jpg differ diff --git a/Data/AdobeColorFunko/Bandholz/Black.png b/Data/AdobeColorFunko/Bandholz/Black.png new file mode 100644 index 0000000000000000000000000000000000000000..412075876a6051a9d722bf7899bdad1e6f6ad7e2 Binary files /dev/null and b/Data/AdobeColorFunko/Bandholz/Black.png differ diff --git a/Data/AdobeColorFunko/Bandholz/DarkBrown.png b/Data/AdobeColorFunko/Bandholz/DarkBrown.png new file mode 100644 index 0000000000000000000000000000000000000000..8b86b0ea3bdc855804296ddbd62244078bf56be4 Binary files /dev/null and b/Data/AdobeColorFunko/Bandholz/DarkBrown.png differ diff --git a/Data/AdobeColorFunko/Bandholz/Ginger.png b/Data/AdobeColorFunko/Bandholz/Ginger.png new file mode 100644 index 0000000000000000000000000000000000000000..e312201c0560d21667d6a1ac64f35e3bdfda7b43 Binary files /dev/null and b/Data/AdobeColorFunko/Bandholz/Ginger.png differ diff --git a/Data/AdobeColorFunko/Bandholz/LightBrown.png b/Data/AdobeColorFunko/Bandholz/LightBrown.png new file mode 100644 index 0000000000000000000000000000000000000000..0297787f4fa3e3696fa453a9b6dc4f5cfbda95ed Binary files /dev/null and b/Data/AdobeColorFunko/Bandholz/LightBrown.png differ diff --git a/Data/AdobeColorFunko/Bandholz/SaltAndPepper.png b/Data/AdobeColorFunko/Bandholz/SaltAndPepper.png new file mode 100644 index 0000000000000000000000000000000000000000..eceddbae8973e1b6aa5b2ef921d0f84d2b16cb47 Binary files /dev/null and b/Data/AdobeColorFunko/Bandholz/SaltAndPepper.png differ diff --git a/Data/AdobeColorFunko/Bandholz/White.png b/Data/AdobeColorFunko/Bandholz/White.png new file mode 100644 index 0000000000000000000000000000000000000000..7e98009b5969d479fcd412c0b07ad18276239979 Binary files /dev/null and b/Data/AdobeColorFunko/Bandholz/White.png differ diff --git a/Data/AdobeColorFunko/DummyDress2.png b/Data/AdobeColorFunko/DummyDress2.png new file mode 100644 index 0000000000000000000000000000000000000000..90ea2b6ae40863f674c84c035a3e3007aa7de9ad Binary files /dev/null and b/Data/AdobeColorFunko/DummyDress2.png differ diff --git a/Data/AdobeColorFunko/EyezBrowz/Eyebrow.png b/Data/AdobeColorFunko/EyezBrowz/Eyebrow.png new file mode 100644 index 0000000000000000000000000000000000000000..db059d45bfe9b35faf546358c075549afce4547b Binary files /dev/null and b/Data/AdobeColorFunko/EyezBrowz/Eyebrow.png differ diff --git a/Data/AdobeColorFunko/EyezBrowz/FemEye.png b/Data/AdobeColorFunko/EyezBrowz/FemEye.png new file mode 100644 index 0000000000000000000000000000000000000000..accb056b5b1db344fcfcdf381e6d095bf3f817b4 Binary files /dev/null and b/Data/AdobeColorFunko/EyezBrowz/FemEye.png differ diff --git a/Data/AdobeColorFunko/EyezBrowz/MaleEye.png b/Data/AdobeColorFunko/EyezBrowz/MaleEye.png new file mode 100644 index 0000000000000000000000000000000000000000..6fd7fb2197c6b37c9a9937f251e140bf5169e0c6 Binary files /dev/null and b/Data/AdobeColorFunko/EyezBrowz/MaleEye.png differ diff --git a/Data/AdobeColorFunko/Glasses/Glasses.png b/Data/AdobeColorFunko/Glasses/Glasses.png new file mode 100644 index 0000000000000000000000000000000000000000..c7350db8d91fc0f08df3fd24c4704f81ee41107c Binary files /dev/null and b/Data/AdobeColorFunko/Glasses/Glasses.png differ diff --git a/Data/AdobeColorFunko/Goatee/Black.png b/Data/AdobeColorFunko/Goatee/Black.png new file mode 100644 index 0000000000000000000000000000000000000000..595bf886b6c868fd4ef7484450ea199447706586 Binary files /dev/null and b/Data/AdobeColorFunko/Goatee/Black.png differ diff --git a/Data/AdobeColorFunko/Goatee/Cream.png b/Data/AdobeColorFunko/Goatee/Cream.png new file mode 100644 index 0000000000000000000000000000000000000000..b3a6814e268d883baa5e5d3cd54855f71ab8a983 Binary files /dev/null and b/Data/AdobeColorFunko/Goatee/Cream.png differ diff --git a/Data/AdobeColorFunko/Goatee/DarkBrown.png b/Data/AdobeColorFunko/Goatee/DarkBrown.png new file mode 100644 index 0000000000000000000000000000000000000000..5392c329d9df6ea8c1eaa010fdd86365ab7fe5ee Binary files /dev/null and b/Data/AdobeColorFunko/Goatee/DarkBrown.png differ diff --git a/Data/AdobeColorFunko/Goatee/Ginger.png b/Data/AdobeColorFunko/Goatee/Ginger.png new file mode 100644 index 0000000000000000000000000000000000000000..fa8da1390bcef8bab15d89ad71d87916e03c2b64 Binary files /dev/null and b/Data/AdobeColorFunko/Goatee/Ginger.png differ diff --git a/Data/AdobeColorFunko/Goatee/LightBrown.png b/Data/AdobeColorFunko/Goatee/LightBrown.png new file mode 100644 index 0000000000000000000000000000000000000000..276057dd641bae970990f74eed56293fdde198ac Binary files /dev/null and b/Data/AdobeColorFunko/Goatee/LightBrown.png differ diff --git a/Data/AdobeColorFunko/Goatee/SaltAndPepper.png b/Data/AdobeColorFunko/Goatee/SaltAndPepper.png new file mode 100644 index 0000000000000000000000000000000000000000..5f914053be74c95252208809d3b9c94ed0f237f6 Binary files /dev/null and b/Data/AdobeColorFunko/Goatee/SaltAndPepper.png differ diff --git a/Data/AdobeColorFunko/Goatee/White.png b/Data/AdobeColorFunko/Goatee/White.png new file mode 100644 index 0000000000000000000000000000000000000000..1779c1378812a89c458dbb99b00dcbf86816d9fc Binary files /dev/null and b/Data/AdobeColorFunko/Goatee/White.png differ diff --git a/Data/AdobeColorFunko/Moustache/Black.png b/Data/AdobeColorFunko/Moustache/Black.png new file mode 100644 index 0000000000000000000000000000000000000000..9b4c07008c9d4e4cb1375a9bdb2ca8e2a5afa0eb Binary files /dev/null and b/Data/AdobeColorFunko/Moustache/Black.png differ diff --git a/Data/AdobeColorFunko/Moustache/Cream.png b/Data/AdobeColorFunko/Moustache/Cream.png new file mode 100644 index 0000000000000000000000000000000000000000..b0cb63749baa284be7c4030c574a891ed3895ffa Binary files /dev/null and b/Data/AdobeColorFunko/Moustache/Cream.png differ diff --git a/Data/AdobeColorFunko/Moustache/DarkBrown.png b/Data/AdobeColorFunko/Moustache/DarkBrown.png new file mode 100644 index 0000000000000000000000000000000000000000..c6e5c458df054f2596cae94b8a7aec9ee97eb329 Binary files /dev/null and b/Data/AdobeColorFunko/Moustache/DarkBrown.png differ diff --git a/Data/AdobeColorFunko/Moustache/Ginger.png b/Data/AdobeColorFunko/Moustache/Ginger.png new file mode 100644 index 0000000000000000000000000000000000000000..d8560f4ec74e107f6a065d40647f884d6dcf9743 Binary files /dev/null and b/Data/AdobeColorFunko/Moustache/Ginger.png differ diff --git a/Data/AdobeColorFunko/Moustache/LightBrown.png b/Data/AdobeColorFunko/Moustache/LightBrown.png new file mode 100644 index 0000000000000000000000000000000000000000..2b078111786dd68f1ef7156abd5ad8d39e0abc1d Binary files /dev/null and b/Data/AdobeColorFunko/Moustache/LightBrown.png differ diff --git a/Data/AdobeColorFunko/Moustache/SaltAndPepper.png b/Data/AdobeColorFunko/Moustache/SaltAndPepper.png new file mode 100644 index 0000000000000000000000000000000000000000..a230705880deb53cc75138c4d642e030f96d43ef Binary files /dev/null and b/Data/AdobeColorFunko/Moustache/SaltAndPepper.png differ diff --git a/Data/AdobeColorFunko/Moustache/White.png b/Data/AdobeColorFunko/Moustache/White.png new file mode 100644 index 0000000000000000000000000000000000000000..bb5e2e61106dca40db04c5ee2f4cf87704f0aaf6 Binary files /dev/null and b/Data/AdobeColorFunko/Moustache/White.png differ diff --git a/Data/AdobeColorFunko/Outfits/DummyDress1.png b/Data/AdobeColorFunko/Outfits/DummyDress1.png new file mode 100644 index 0000000000000000000000000000000000000000..4868cd80a50fa51331b41e31717944a6b2c00448 Binary files /dev/null and b/Data/AdobeColorFunko/Outfits/DummyDress1.png differ diff --git a/Data/AdobeColorFunko/Outfits/DummyDress3.png b/Data/AdobeColorFunko/Outfits/DummyDress3.png new file mode 100644 index 0000000000000000000000000000000000000000..32f328ed08904aa62126919a17bfc76dae6ce9d7 Binary files /dev/null and b/Data/AdobeColorFunko/Outfits/DummyDress3.png differ diff --git a/Data/AdobeColorFunko/Outfits/GlassesDummy.png b/Data/AdobeColorFunko/Outfits/GlassesDummy.png new file mode 100644 index 0000000000000000000000000000000000000000..738b21a909ccd9c97db3726579a8ffe314f63e2d Binary files /dev/null and b/Data/AdobeColorFunko/Outfits/GlassesDummy.png differ diff --git a/Data/AdobeColorFunko/RapIndustry/Black.png b/Data/AdobeColorFunko/RapIndustry/Black.png new file mode 100644 index 0000000000000000000000000000000000000000..cb807cfe851043f33fcc5bb13ddf7a37343422bb Binary files /dev/null and b/Data/AdobeColorFunko/RapIndustry/Black.png differ diff --git a/Data/AdobeColorFunko/RapIndustry/Cream.png b/Data/AdobeColorFunko/RapIndustry/Cream.png new file mode 100644 index 0000000000000000000000000000000000000000..d0a9bc45320b9c6e3eb07bea7d71f81a78d53d70 Binary files /dev/null and b/Data/AdobeColorFunko/RapIndustry/Cream.png differ diff --git a/Data/AdobeColorFunko/RapIndustry/DarkBrown.png b/Data/AdobeColorFunko/RapIndustry/DarkBrown.png new file mode 100644 index 0000000000000000000000000000000000000000..41211717fdf002d7bd8b6e9d36a32b205daf948a Binary files /dev/null and b/Data/AdobeColorFunko/RapIndustry/DarkBrown.png differ diff --git a/Data/AdobeColorFunko/RapIndustry/Ginger.png b/Data/AdobeColorFunko/RapIndustry/Ginger.png new file mode 100644 index 0000000000000000000000000000000000000000..ce9e119e198f08221ae95fb91922254caf612c51 Binary files /dev/null and b/Data/AdobeColorFunko/RapIndustry/Ginger.png differ diff --git a/Data/AdobeColorFunko/RapIndustry/LightBrown.png b/Data/AdobeColorFunko/RapIndustry/LightBrown.png new file mode 100644 index 0000000000000000000000000000000000000000..4de6320fd288c26a7be1a2abb0eae66787d9b549 Binary files /dev/null and b/Data/AdobeColorFunko/RapIndustry/LightBrown.png differ diff --git a/Data/AdobeColorFunko/RapIndustry/SaltAndPepper.png b/Data/AdobeColorFunko/RapIndustry/SaltAndPepper.png new file mode 100644 index 0000000000000000000000000000000000000000..914ed3c0a2b0e805e1b75637aa02874acd176d67 Binary files /dev/null and b/Data/AdobeColorFunko/RapIndustry/SaltAndPepper.png differ diff --git a/Data/AdobeColorFunko/RapIndustry/White.png b/Data/AdobeColorFunko/RapIndustry/White.png new file mode 100644 index 0000000000000000000000000000000000000000..b417d8cc116597b42946a4483123256dd95301b6 Binary files /dev/null and b/Data/AdobeColorFunko/RapIndustry/White.png differ diff --git a/Data/AdobeColorFunko/ShortBeard/Black.png b/Data/AdobeColorFunko/ShortBeard/Black.png new file mode 100644 index 0000000000000000000000000000000000000000..db1ba4ce1ae112a7451fe71f2876369fc6426bd1 Binary files /dev/null and b/Data/AdobeColorFunko/ShortBeard/Black.png differ diff --git a/Data/AdobeColorFunko/ShortBeard/Cream.png b/Data/AdobeColorFunko/ShortBeard/Cream.png new file mode 100644 index 0000000000000000000000000000000000000000..029cff8160ce2db209088a0785a8f364f105b28d Binary files /dev/null and b/Data/AdobeColorFunko/ShortBeard/Cream.png differ diff --git a/Data/AdobeColorFunko/ShortBeard/DarkBrown.png b/Data/AdobeColorFunko/ShortBeard/DarkBrown.png new file mode 100644 index 0000000000000000000000000000000000000000..3b2265c3e15a8885d220683c7a75fc8ad1dd12f5 Binary files /dev/null and b/Data/AdobeColorFunko/ShortBeard/DarkBrown.png differ diff --git a/Data/AdobeColorFunko/ShortBeard/Ginger.png b/Data/AdobeColorFunko/ShortBeard/Ginger.png new file mode 100644 index 0000000000000000000000000000000000000000..6bcc7fc56fcb8b495ecd107aefbc261c9ad1a73d Binary files /dev/null and b/Data/AdobeColorFunko/ShortBeard/Ginger.png differ diff --git a/Data/AdobeColorFunko/ShortBeard/LightBrown.png b/Data/AdobeColorFunko/ShortBeard/LightBrown.png new file mode 100644 index 0000000000000000000000000000000000000000..046a25f2a09e33131c6b50a627f7890db6d209c3 Binary files /dev/null and b/Data/AdobeColorFunko/ShortBeard/LightBrown.png differ diff --git a/Data/AdobeColorFunko/ShortBeard/SaltAndPepper.png b/Data/AdobeColorFunko/ShortBeard/SaltAndPepper.png new file mode 100644 index 0000000000000000000000000000000000000000..acc8b49217c4dd225704c39ba6af9d4610602cc6 Binary files /dev/null and b/Data/AdobeColorFunko/ShortBeard/SaltAndPepper.png differ diff --git a/Data/AdobeColorFunko/ShortBeard/White.png b/Data/AdobeColorFunko/ShortBeard/White.png new file mode 100644 index 0000000000000000000000000000000000000000..263e6c5f5fdd65d1080995c2e3aaffa2d3663c67 Binary files /dev/null and b/Data/AdobeColorFunko/ShortBeard/White.png differ diff --git a/Data/FunkoSavedModels/FunkoResnet18Color.pt b/Data/FunkoSavedModels/FunkoResnet18Color.pt new file mode 100644 index 0000000000000000000000000000000000000000..5042f5f334a5a27dbe1c74c7c28e54cb44c071d7 --- /dev/null +++ b/Data/FunkoSavedModels/FunkoResnet18Color.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:502413582c4c1eea5b58b777b1d8172d7b20697d86c8667b0787c7ec361291a4 +size 44797121 diff --git a/Data/FunkoSavedModels/FunkoResnet18Style.pt b/Data/FunkoSavedModels/FunkoResnet18Style.pt new file mode 100644 index 0000000000000000000000000000000000000000..2c743c1553354f9f36489cd691da80aa4613aa5b --- /dev/null +++ b/Data/FunkoSavedModels/FunkoResnet18Style.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ddbea28427f000d28f656a53bac4d89fc9b577904e20cb50ed029dbaf8fa6d7b +size 44795073 diff --git a/Data/ImagePlaceholding/BestDummy.png b/Data/ImagePlaceholding/BestDummy.png new file mode 100644 index 0000000000000000000000000000000000000000..60082f6ab8bd5dba64c43b9e08068561ed9144df Binary files /dev/null and b/Data/ImagePlaceholding/BestDummy.png differ diff --git a/Data/ImagePlaceholding/CustomDummy.png b/Data/ImagePlaceholding/CustomDummy.png new file mode 100644 index 0000000000000000000000000000000000000000..0cfc94812d7fd820cf36c5470ae9563621d1dc55 Binary files /dev/null and b/Data/ImagePlaceholding/CustomDummy.png differ diff --git a/Data/ImagePlaceholding/DummyHead.png b/Data/ImagePlaceholding/DummyHead.png new file mode 100644 index 0000000000000000000000000000000000000000..7447a5224c324686aa989b851e8a67b62516ec09 Binary files /dev/null and b/Data/ImagePlaceholding/DummyHead.png differ diff --git a/Data/ImagePlaceholding/LightSkinDummy.png b/Data/ImagePlaceholding/LightSkinDummy.png new file mode 100644 index 0000000000000000000000000000000000000000..2b56b0b10efe5cc04cb7d19125d336ad614c966e Binary files /dev/null and b/Data/ImagePlaceholding/LightSkinDummy.png differ diff --git a/Data/ImagePlaceholding/NewCustomDummy.png b/Data/ImagePlaceholding/NewCustomDummy.png new file mode 100644 index 0000000000000000000000000000000000000000..e3ec3b21c502c72e867d9b5bbb4b366e3d6d4aba Binary files /dev/null and b/Data/ImagePlaceholding/NewCustomDummy.png differ diff --git a/backend/__init__.py b/backend/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/backend/funko.py b/backend/funko.py new file mode 100644 index 0000000000000000000000000000000000000000..187ccff3724b5df076581da86c4df7d221a31e00 --- /dev/null +++ b/backend/funko.py @@ -0,0 +1,363 @@ +# !pip install -q ultralytics gradio +# from google.colab import files + +from io import BytesIO +import base64 + +import numpy as np +import torch +import torch.nn as nn +import torch.optim as optim +from torchvision import transforms, models +from PIL import Image +import gradio as gr + +# DRIVE_ROOT_PATH = "/content/drive/MyDrive/Colab Notebooks" +DRIVE_ROOT_PATH = "D:\OneDrive\OneDrive - Mastek Limited\My_PC\Projects\Demos_and_Poc\FunkoDemo\Data" + +# List of background image paths +background_image_paths = [ + # "/ImagePlaceholding/BestDummy.png" + "\AdobeColorFunko\Outfits\DummyDress1.png", + "\AdobeColorFunko\Outfits\GlassesDummy.png", + "\AdobeColorFunko\Outfits\DummyDress3.png" +] + + +### For Beard Style +class BeardClassifier: + def __init__(self, model_path, class_names): + self.model = models.resnet18(pretrained=False) + num_ftrs = self.model.fc.in_features + self.model.fc = nn.Linear(num_ftrs, len(class_names)) + self.load_model(model_path) # Load model based on CUDA availability + self.model.eval() + self.data_transforms = transforms.Compose([ + transforms.Resize((224, 224)), + transforms.ToTensor(), + transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) + ]) + self.class_names = class_names + + def preprocess_image(self, image_path): + image = Image.open(image_path).convert("RGB") + image = self.data_transforms(image) + image = image.unsqueeze(0) + return image + + def load_model(self, model_path): + if torch.cuda.is_available(): + # Load model on CUDA if available + self.model.load_state_dict(torch.load(model_path)) + else: + # Load model on CPU + self.model.load_state_dict(torch.load(model_path, map_location=torch.device('cpu'))) + + def classify_beard(self, image_path): + input_image = self.preprocess_image(image_path) + + with torch.no_grad(): + predictions = self.model(input_image) + + probabilities = torch.nn.functional.softmax(predictions[0], dim=0) + predicted_class = torch.argmax(probabilities).item() + predicted_label = self.class_names[predicted_class] + + return predicted_label + +# For Beard Color +class BeardColorClassifier: + def __init__(self, model_path, class_names): + self.model = models.resnet18(pretrained=False) + num_ftrs = self.model.fc.in_features + self.model.fc = nn.Linear(num_ftrs, len(class_names)) + self.load_model(model_path) # Load model based on CUDA availability + self.model.eval() + self.data_transforms = transforms.Compose([ + transforms.Resize((224, 224)), + transforms.ToTensor(), + transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) + ]) + self.class_names = class_names + + def preprocess_image(self, image_path): + image = Image.open(image_path).convert("RGB") + image = self.data_transforms(image) + image = image.unsqueeze(0) + return image + + def load_model(self, model_path): + if torch.cuda.is_available(): + # Load model on CUDA if available + self.model.load_state_dict(torch.load(model_path)) + else: + # Load model on CPU + self.model.load_state_dict(torch.load(model_path, map_location=torch.device('cpu'))) + + def classify_beard_color(self, image_path): + input_image = self.preprocess_image(image_path) + + with torch.no_grad(): + predictions = self.model(input_image) + + probabilities = torch.nn.functional.softmax(predictions[0], dim=0) + predicted_class = torch.argmax(probabilities).item() + predicted_label = self.class_names[predicted_class] + + return predicted_label + + + +# ===================for beard style========================== +def predict_beard_style(image_path): + + # Provide the path to your trained model and the list of class names + model_path = DRIVE_ROOT_PATH + '/FunkoSavedModels/FunkoResnet18Style.pt' + class_names = ['Bandholz', 'FullGoatee', 'Moustache', 'RapIndustryStandards', 'ShortBeard'] + + beard_classifier = BeardClassifier(model_path, class_names) + + input_image = beard_classifier.preprocess_image(image_path) # Corrected line + + with torch.no_grad(): + predictions = beard_classifier.model(input_image) # Use beard_classifier.model here + + probabilities = torch.nn.functional.softmax(predictions[0], dim=0) + predicted_class = torch.argmax(probabilities).item() + + predicted_style_label = beard_classifier.class_names[predicted_class] # Use beard_classifier.class_names here + + print(f"The predicted beard style is: {predicted_style_label}") + + return predicted_style_label + +# ======================================================================== + + +# ===================for beard color========================== +def predict_beard_color(image_path): + + # Provide the path to your trained model and the list of class names + color_model_path = DRIVE_ROOT_PATH + '/FunkoSavedModels/FunkoResnet18Color.pt' # Replace with the actual path to your model + class_names = ['Black', 'DarkBrown', 'Ginger', 'LightBrown', 'SaltAndPepper', 'White'] + + beard_color_classifier = BeardColorClassifier(color_model_path, class_names) + + input_image = beard_color_classifier.preprocess_image(image_path) + + with torch.no_grad(): + predictions = beard_color_classifier.model(input_image) + + probabilities = torch.nn.functional.softmax(predictions[0], dim=0) + predicted_class = torch.argmax(probabilities).item() + + predicted_color_label = beard_color_classifier.class_names[predicted_class] + + print(f"The predicted beard color is: {predicted_color_label}") + + return predicted_color_label + +# ======================================================================== + + +# to set dummy eyes +def dummy_eye(background_image, x,y, placeholder_image_path, x_coordinate, y_coordinate): + placeholder_image = Image.open(placeholder_image_path) + target_size = (x, y) + placeholder_image = placeholder_image.resize(target_size, Image.LANCZOS) + # placeholder_array = np.array(placeholder_image) + placeholder_width, placeholder_height = placeholder_image.size + region_box = (x_coordinate, y_coordinate, x_coordinate + placeholder_width, y_coordinate + placeholder_height) + placeholder_mask = placeholder_image.split()[3] if placeholder_image.mode == 'RGBA' else None + background_image.paste(placeholder_image, region_box, mask=placeholder_mask) + # background_array = np.array(background_image) + # placeholder_alpha = placeholder_image.split()[3] if placeholder_image.mode == 'RGBA' else None + #display(background_image) + + return background_image + +# funtion which process and set's the beard on the dummy +def process_image_Beard(background_image, x, placeholder_image_path, x_coordinate, y_coordinate): + placeholder_image = Image.open(placeholder_image_path) + target_size = (x, x) + placeholder_image = placeholder_image.resize(target_size, Image.LANCZOS) + # placeholder_array = np.array(placeholder_image) + placeholder_width, placeholder_height = placeholder_image.size + region_box = (x_coordinate, y_coordinate, x_coordinate + placeholder_width, y_coordinate + placeholder_height) + placeholder_mask = placeholder_image.split()[3] if placeholder_image.mode == 'RGBA' else None + background_image.paste(placeholder_image, region_box, mask=placeholder_mask) + background_array = np.array(background_image) + # placeholder_alpha = placeholder_image.split()[3] if placeholder_image.mode == 'RGBA' else None + # display(background_image) + # Convert the resulting image to base64 + # buffered = BytesIO() + # background_image.save(buffered, format="PNG") + # base64_image = base64.b64encode(buffered.getvalue()).decode("utf-8") + # print(base64_image) + + return background_array + + +def getDummyBackgroundImage(background_image): + # dummy with a suite = BestDummy + background_image = Image.open(DRIVE_ROOT_PATH + background_image) + # dummy eyebrow + placeholder_image_eyebro = Image.open(DRIVE_ROOT_PATH + '/AdobeColorFunko/EyezBrowz/Eyebrow.png') + placeholder_image_eyebro = placeholder_image_eyebro.resize((200,200),Image.LANCZOS) + # placeholder_array_eyebro = np.array(placeholder_image_eyebro) + # Define the coordinates of the region to paste the placeholder image + x_coordinate = 115 + y_coordinate = 80 + # Get the width and height of the placeholder image + placeholder_width, placeholder_height = placeholder_image_eyebro.size + # Define the region box as a tuple (x1, y1, x2, y2) + region_box = (x_coordinate, y_coordinate, x_coordinate + placeholder_width, y_coordinate + placeholder_height) + placeholder_mask = placeholder_image_eyebro.split()[3] if placeholder_image_eyebro.mode == 'RGBA' else None + # Paste the placeholder image onto the background image + background_image.paste(placeholder_image_eyebro, region_box, mask=placeholder_mask) + # background_array = np.array(background_image) + + return background_image + + +def setEyesOnTheDummy(background_image): + # Genders = ['Male','Female'] + predicted_gender = 'Male' + image_with_eyes = None + + # First function call + if predicted_gender == 'Male': + x=245 + y=345 + placeholder_image_path = DRIVE_ROOT_PATH + f'/AdobeColorFunko/EyezBrowz/{predicted_gender}Eye.png' + x_coordinate = 90 + y_coordinate = 50 + + print("++++",type(background_image)) + image_with_eyes = dummy_eye(background_image,x,y, placeholder_image_path, x_coordinate, y_coordinate) + + return image_with_eyes + +def setGlassesonDummy(background_image): + #for glasses + placeholder_image_glasses = Image.open(DRIVE_ROOT_PATH + '/AdobeColorFunko/Glasses/Glasses.png') + # placeholder_image_glasses = Image.open("/content/drive/MyDrive/AdobeColorFunko/Glasses/Glasses.png") + placeholder_image_glasses = placeholder_image_glasses.resize((280,380),Image.LANCZOS) + placeholder_array_glasses = np.array(placeholder_image_glasses) + # Define the coordinates of the region to paste the placeholder image + x_coordinate = 72 + y_coordinate = 30 + # Get the width and height of the placeholder image + placeholder_width, placeholder_height = placeholder_image_glasses.size + # Define the region box as a tuple (x1, y1, x2, y2) + region_box = (x_coordinate, y_coordinate, x_coordinate + placeholder_width, y_coordinate + placeholder_height) + placeholder_mask = placeholder_image_glasses.split()[3] if placeholder_image_glasses.mode == 'RGBA' else None + + print(">>>>>",type(background_image)) + background_image.paste(placeholder_image_glasses, region_box, mask=placeholder_mask) + background_array = np.array(background_image) + + return background_image + +def generatePopFigure(background_image, predicted_style_label, predicted_color_label): + + match predicted_style_label: + case "Bandholz": + x=320 + placeholder_image_path = DRIVE_ROOT_PATH + f'/AdobeColorFunko/Bandholz/{predicted_color_label}.png' + x_coordinate = 50 + y_coordinate = 132 + + case "ShortBeard": + x=300 + placeholder_image_path = DRIVE_ROOT_PATH + f'/AdobeColorFunko/ShortBeard/{predicted_color_label}.png' + x_coordinate = 62 + y_coordinate = 118 + + case "FullGoatee": + x=230 + placeholder_image_path = DRIVE_ROOT_PATH + f'/AdobeColorFunko/Goatee/{predicted_color_label}.png' + x_coordinate = 96 + y_coordinate = 162 + + case "RapIndustryStandards": + x=290 + placeholder_image_path = DRIVE_ROOT_PATH + f'/AdobeColorFunko/RapIndustry/{predicted_color_label}.png' + x_coordinate = 67 + y_coordinate = 120 + + case "Moustache": + x=220 + placeholder_image_path = DRIVE_ROOT_PATH + f'/AdobeColorFunko/Moustache/{predicted_color_label}.png' + x_coordinate = 100 + y_coordinate = 160 + case _: + print("Sorry, I still don't know how to recognize this!") + + final_pop_image = process_image_Beard(background_image.copy(),x, placeholder_image_path, x_coordinate, y_coordinate) + + return final_pop_image + + +def getFunkoPOPFigure(image): + + print("Input Image: ", image) + beard_style = predict_beard_style(image) + beard_color = predict_beard_color(image) + + final_img_list = [] + + # fetch base funko dummy with a suite & eyebrows + for dummy in background_image_paths: + print("bg_img_path: ", dummy) + funkoPopDummy = getDummyBackgroundImage(dummy) + + # set eyes on the dummy + funkoPopDummyWithEyes = setEyesOnTheDummy(funkoPopDummy) + + #set glassed on the dummy + # funkoPopDummyWithGlasses = setGlassesonDummy(funkoPopDummyWithEyes) + + # get a POP Figure + pop_image = generatePopFigure(funkoPopDummyWithEyes, beard_style, beard_color) + final_img_list.append(pop_image) + + # set glasses on 1st the dummy + # final_img_list[0] = setGlassesonDummy(final_img_list[0]) + + print("final result: ", final_img_list) + return final_img_list + + +if __name__ == "__main__": + + theme = gr.themes.Base().set( + body_background_fill="linear-gradient(180deg,#0e5c99,#017cec)", + body_background_fill_dark="linear-gradient(180deg,#0e5c99,#017cec)", + body_text_color="white", + body_text_color_dark="white", + button_primary_background_fill="#fbc051", + button_primary_background_fill_dark="#fbc051", + button_primary_text_color="black", + button_primary_text_color_dark="black" + ) + + imageComponent = gr.Image(type="filepath") + with gr.Blocks(theme=theme, title="POP! Yourself", css="footer {visibility: hidden}") as demo: + + gr.Markdown(""" + logo + + ### Get your Funko Pop Today. Get started with our Pop Figure generator tool & generate your Funko avatar quickly by just uploading your image. + ---""") + gr.Interface( + fn=getFunkoPOPFigure, + inputs=imageComponent, + outputs=["image", "image", "image"], + title="The new AI powered POP! Generator", + description="Upload a clear image with clear background which shows your face completely. The image should not be blurry.", + allow_flagging="never", + # examples=[DRIVE_ROOT_PATH+i for i in background_image_paths] + ) + + demo.launch() \ No newline at end of file