├── doc ├── playstoreIcon512.png ├── screenshot-dimred.png ├── screenshot-compare.png ├── screenshot-alignment.png └── playstorePresentationGraphic.png ├── media ├── .gitattributes ├── groups │ ├── G7_in_Biarritz_01.jpg │ ├── G7_in_Biarritz_02.jpg │ ├── Johnson_and_Trump.jpg │ ├── Obama_and_Biden.jpg │ ├── Obama_and_children.jpg │ ├── Biden_and_two_women.jpg │ ├── Barack_Obama_at_town_hall_in_Arnold.jpg │ └── Barack_Obama_and_Klaus_Iohannis_at_the_Blue_Room.jpg ├── portraits │ ├── Barack_Obama_01.jpg │ ├── Barack_Obama_02.jpg │ ├── Barack_Obama_03.jpg │ ├── John_F_Kennedy_01.jpg │ └── Elaine_Chao_at_the_Regional_Media_Day.jpg ├── lfw │ ├── Adam_Sandler │ │ ├── Adam_Sandler_0001.jpg │ │ ├── Adam_Sandler_0002.jpg │ │ ├── Adam_Sandler_0003.jpg │ │ └── Adam_Sandler_0004.jpg │ ├── Fidel_Castro │ │ ├── Fidel_Castro_0001.jpg │ │ ├── Fidel_Castro_0002.jpg │ │ ├── Fidel_Castro_0003.jpg │ │ ├── Fidel_Castro_0004.jpg │ │ ├── Fidel_Castro_0005.jpg │ │ ├── Fidel_Castro_0006.jpg │ │ ├── Fidel_Castro_0007.jpg │ │ ├── Fidel_Castro_0008.jpg │ │ ├── Fidel_Castro_0009.jpg │ │ ├── Fidel_Castro_0010.jpg │ │ ├── Fidel_Castro_0011.jpg │ │ ├── Fidel_Castro_0012.jpg │ │ ├── Fidel_Castro_0013.jpg │ │ ├── Fidel_Castro_0014.jpg │ │ ├── Fidel_Castro_0015.jpg │ │ ├── Fidel_Castro_0016.jpg │ │ ├── Fidel_Castro_0017.jpg │ │ └── Fidel_Castro_0018.jpg │ ├── George_W_Bush │ │ ├── George_W_Bush_0002.jpg │ │ ├── George_W_Bush_0010.jpg │ │ ├── George_W_Bush_0029.jpg │ │ ├── George_W_Bush_0040.jpg │ │ ├── George_W_Bush_0047.jpg │ │ ├── George_W_Bush_0098.jpg │ │ ├── George_W_Bush_0120.jpg │ │ ├── George_W_Bush_0130.jpg │ │ ├── George_W_Bush_0218.jpg │ │ ├── George_W_Bush_0335.jpg │ │ ├── George_W_Bush_0337.jpg │ │ ├── George_W_Bush_0347.jpg │ │ ├── George_W_Bush_0398.jpg │ │ ├── George_W_Bush_0437.jpg │ │ ├── George_W_Bush_0441.jpg │ │ ├── George_W_Bush_0442.jpg │ │ ├── George_W_Bush_0460.jpg │ │ └── George_W_Bush_0500.jpg │ ├── Roger_Moore │ │ ├── Roger_Moore_0001.jpg │ │ ├── Roger_Moore_0002.jpg │ │ ├── Roger_Moore_0003.jpg │ │ ├── Roger_Moore_0004.jpg │ │ └── Roger_Moore_0005.jpg │ ├── Angelina_Jolie │ │ ├── Angelina_Jolie_0001.jpg │ │ ├── Angelina_Jolie_0002.jpg │ │ ├── Angelina_Jolie_0003.jpg │ │ ├── Angelina_Jolie_0004.jpg │ │ ├── Angelina_Jolie_0005.jpg │ │ ├── Angelina_Jolie_0006.jpg │ │ ├── Angelina_Jolie_0007.jpg │ │ ├── Angelina_Jolie_0008.jpg │ │ ├── Angelina_Jolie_0009.jpg │ │ ├── Angelina_Jolie_0010.jpg │ │ ├── Angelina_Jolie_0011.jpg │ │ ├── Angelina_Jolie_0012.jpg │ │ ├── Angelina_Jolie_0013.jpg │ │ ├── Angelina_Jolie_0014.jpg │ │ ├── Angelina_Jolie_0015.jpg │ │ ├── Angelina_Jolie_0016.jpg │ │ ├── Angelina_Jolie_0017.jpg │ │ ├── Angelina_Jolie_0018.jpg │ │ ├── Angelina_Jolie_0019.jpg │ │ └── Angelina_Jolie_0020.jpg │ ├── Charles_Bronson │ │ ├── Charles_Bronson_0001.jpg │ │ ├── Charles_Bronson_0002.jpg │ │ └── Charles_Bronson_0003.jpg │ ├── George_HW_Bush │ │ ├── George_HW_Bush_0001.jpg │ │ ├── George_HW_Bush_0002.jpg │ │ ├── George_HW_Bush_0003.jpg │ │ ├── George_HW_Bush_0004.jpg │ │ ├── George_HW_Bush_0005.jpg │ │ ├── George_HW_Bush_0006.jpg │ │ ├── George_HW_Bush_0007.jpg │ │ ├── George_HW_Bush_0008.jpg │ │ ├── George_HW_Bush_0009.jpg │ │ ├── George_HW_Bush_0010.jpg │ │ ├── George_HW_Bush_0011.jpg │ │ ├── George_HW_Bush_0012.jpg │ │ └── George_HW_Bush_0013.jpg │ ├── Pierce_Brosnan │ │ ├── Pierce_Brosnan_0001.jpg │ │ ├── Pierce_Brosnan_0002.jpg │ │ ├── Pierce_Brosnan_0003.jpg │ │ ├── Pierce_Brosnan_0004.jpg │ │ ├── Pierce_Brosnan_0005.jpg │ │ ├── Pierce_Brosnan_0006.jpg │ │ ├── Pierce_Brosnan_0007.jpg │ │ ├── Pierce_Brosnan_0008.jpg │ │ ├── Pierce_Brosnan_0009.jpg │ │ ├── Pierce_Brosnan_0010.jpg │ │ ├── Pierce_Brosnan_0011.jpg │ │ ├── Pierce_Brosnan_0012.jpg │ │ ├── Pierce_Brosnan_0013.jpg │ │ ├── Pierce_Brosnan_0014.jpg │ │ └── Pierce_Brosnan_0015.jpg │ ├── Prince_Charles │ │ ├── Prince_Charles_0001.jpg │ │ ├── Prince_Charles_0002.jpg │ │ ├── Prince_Charles_0003.jpg │ │ ├── Prince_Charles_0004.jpg │ │ └── Prince_Charles_0005.jpg │ ├── Jennifer_Capriati │ │ ├── Jennifer_Capriati_0001.jpg │ │ ├── Jennifer_Capriati_0005.jpg │ │ ├── Jennifer_Capriati_0006.jpg │ │ ├── Jennifer_Capriati_0008.jpg │ │ ├── Jennifer_Capriati_0010.jpg │ │ ├── Jennifer_Capriati_0011.jpg │ │ ├── Jennifer_Capriati_0012.jpg │ │ ├── Jennifer_Capriati_0014.jpg │ │ ├── Jennifer_Capriati_0017.jpg │ │ ├── Jennifer_Capriati_0020.jpg │ │ ├── Jennifer_Capriati_0022.jpg │ │ ├── Jennifer_Capriati_0024.jpg │ │ ├── Jennifer_Capriati_0029.jpg │ │ ├── Jennifer_Capriati_0030.jpg │ │ ├── Jennifer_Capriati_0031.jpg │ │ ├── Jennifer_Capriati_0032.jpg │ │ ├── Jennifer_Capriati_0033.jpg │ │ ├── Jennifer_Capriati_0034.jpg │ │ ├── Jennifer_Capriati_0035.jpg │ │ ├── Jennifer_Capriati_0036.jpg │ │ ├── Jennifer_Capriati_0037.jpg │ │ ├── Jennifer_Capriati_0039.jpg │ │ ├── Jennifer_Capriati_0040.jpg │ │ └── Jennifer_Capriati_0042.jpg │ ├── Queen_Elizabeth_II │ │ ├── Queen_Elizabeth_II_0001.jpg │ │ ├── Queen_Elizabeth_II_0002.jpg │ │ ├── Queen_Elizabeth_II_0003.jpg │ │ ├── Queen_Elizabeth_II_0004.jpg │ │ ├── Queen_Elizabeth_II_0005.jpg │ │ ├── Queen_Elizabeth_II_0006.jpg │ │ ├── Queen_Elizabeth_II_0007.jpg │ │ ├── Queen_Elizabeth_II_0008.jpg │ │ ├── Queen_Elizabeth_II_0009.jpg │ │ ├── Queen_Elizabeth_II_0010.jpg │ │ ├── Queen_Elizabeth_II_0011.jpg │ │ ├── Queen_Elizabeth_II_0012.jpg │ │ └── Queen_Elizabeth_II_0013.jpg │ └── Dominique_de_Villepin │ │ ├── Dominique_de_Villepin_0001.jpg │ │ ├── Dominique_de_Villepin_0002.jpg │ │ ├── Dominique_de_Villepin_0003.jpg │ │ ├── Dominique_de_Villepin_0004.jpg │ │ ├── Dominique_de_Villepin_0005.jpg │ │ ├── Dominique_de_Villepin_0006.jpg │ │ ├── Dominique_de_Villepin_0007.jpg │ │ ├── Dominique_de_Villepin_0008.jpg │ │ ├── Dominique_de_Villepin_0009.jpg │ │ ├── Dominique_de_Villepin_0010.jpg │ │ ├── Dominique_de_Villepin_0011.jpg │ │ ├── Dominique_de_Villepin_0012.jpg │ │ ├── Dominique_de_Villepin_0013.jpg │ │ ├── Dominique_de_Villepin_0014.jpg │ │ └── Dominique_de_Villepin_0015.jpg ├── badges │ └── google-play │ │ └── en_badge_web_generic.png ├── deepinsight-targetpoints.opt.svg ├── person-fill-perspective-warped.opt.svg ├── logo.svg ├── logo-filled.svg ├── face-alignment.opt.svg ├── image-with-3people.opt.svg ├── person-fill-perspective-warped.svg ├── deepinsight-targetpoints.svg ├── face-alignment.svg └── image-with-3people.svg ├── src ├── BlazorFace.Maui │ ├── wwwroot │ │ ├── favicon.ico │ │ ├── css │ │ │ └── app.css │ │ └── index.html │ ├── Resources │ │ ├── Fonts │ │ │ └── OpenSans-Regular.ttf │ │ ├── AppIcon │ │ │ ├── appicon.svg │ │ │ └── appiconfg.svg │ │ ├── Raw │ │ │ └── AboutAssets.txt │ │ └── Splash │ │ │ └── splash_editable.svg │ ├── Properties │ │ └── launchSettings.json │ ├── Platforms │ │ ├── Android │ │ │ ├── Resources │ │ │ │ └── values │ │ │ │ │ └── colors.xml │ │ │ ├── AndroidManifest.xml │ │ │ ├── MainApplication.cs │ │ │ └── MainActivity.cs │ │ ├── iOS │ │ │ ├── AppDelegate.cs │ │ │ ├── Program.cs │ │ │ └── Info.plist │ │ ├── MacCatalyst │ │ │ ├── AppDelegate.cs │ │ │ ├── Program.cs │ │ │ └── Info.plist │ │ ├── Windows │ │ │ ├── App.xaml │ │ │ ├── app.manifest │ │ │ ├── App.xaml.cs │ │ │ └── Package.appxmanifest │ │ └── Tizen │ │ │ ├── Main.cs │ │ │ └── tizen-manifest.xml │ ├── _Imports.razor │ ├── MainPage.xaml.cs │ ├── MauiResourceOpener.cs │ ├── App.xaml.cs │ ├── MainPage.xaml │ ├── PRIVACY.md │ ├── App.xaml │ └── MauiProgram.cs ├── BlazorFace │ ├── Pages │ │ ├── Credits.razor │ │ ├── Applications │ │ │ ├── ProfilePicture.razor.css │ │ │ ├── Blur.razor │ │ │ └── ProfilePicture.razor │ │ └── Tutorial │ │ │ └── FaceDetection.razor │ ├── Components │ │ ├── DimReductionPlot.razor.css │ │ ├── Spinner.razor │ │ ├── ShowMore.razor │ │ ├── Progress.razor │ │ ├── HighlightedCode.razor │ │ ├── ImageCompareViewer.razor.js │ │ ├── Alert.razor │ │ ├── ShowMore.razor.css │ │ ├── TryOut │ │ │ ├── TryOutSteps.razor │ │ │ ├── AlignmentTryOut.razor │ │ │ ├── DetectionTryOut.razor │ │ │ ├── RecognitionTryOut.razor │ │ │ └── DirectComparisonTryOut.razor │ │ ├── ImageCompareViewer.razor │ │ ├── Bootstrap5Modal.razor │ │ ├── LfwIdentityChooser.razor │ │ ├── ExpandableEmbeddings.razor │ │ ├── Bootstrap5ModalBase.razor │ │ ├── Toc.razor │ │ ├── ChooseGalleryImageModal.razor │ │ ├── DimensionalityReductionDemo.razor │ │ └── EmbeddingGenerationDemo.razor │ ├── Shared │ │ ├── MainLayout.razor.css │ │ ├── LegalLayout.razor │ │ ├── GoBackLayout.razor │ │ ├── MultiChoiceRadio.razor │ │ └── MainLayout.razor │ ├── wwwroot │ │ ├── css │ │ │ └── open-iconic │ │ │ │ ├── font │ │ │ │ └── fonts │ │ │ │ │ ├── open-iconic.eot │ │ │ │ │ ├── open-iconic.otf │ │ │ │ │ ├── open-iconic.ttf │ │ │ │ │ └── open-iconic.woff │ │ │ │ └── ICON-LICENSE │ │ ├── bootstrap-icons-1.10.3 │ │ │ └── fonts │ │ │ │ ├── bootstrap-icons.woff │ │ │ │ └── bootstrap-icons.woff2 │ │ ├── highlight.js-11.7.0 │ │ │ ├── languages │ │ │ │ ├── plaintext.min.js │ │ │ │ ├── shell.min.js │ │ │ │ ├── json.min.js │ │ │ │ ├── diff.min.js │ │ │ │ ├── markdown.min.js │ │ │ │ └── bash.min.js │ │ │ ├── styles │ │ │ │ ├── vs.min.css │ │ │ │ ├── vs2015.min.css │ │ │ │ └── default.min.css │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ └── package.json │ │ ├── Sources.md │ │ └── favicon.svg │ ├── appsettings.json │ ├── appsettings.Development.json │ ├── Services │ │ ├── IFileOpener.cs │ │ ├── IFilenameGrouper.cs │ │ ├── DefaultFileOpener.cs │ │ ├── SvgDrawer.cs │ │ └── CommonPrefixFilenameGrouper.cs │ ├── _Imports.razor │ ├── App.razor │ ├── DIPooledObjectPolicy.cs │ ├── Extensions │ │ ├── CollectionExtensions.cs │ │ └── GeometryExtensions.cs │ ├── Helper │ │ └── ColorEnumerator.cs │ ├── Media.cs │ └── BlazorFace.csproj ├── DirectoryListingSourceGenerator │ ├── DirectoryListingSourceGenerator.csproj │ └── SourceGenerationHelper.cs └── BlazorFace.Web │ ├── BlazorFace.Web.csproj │ ├── Pages │ ├── Error.cshtml.cs │ ├── Error.cshtml │ └── _Host.cshtml │ ├── Dockerfile │ ├── Properties │ └── launchSettings.json │ └── Program.cs ├── global.json ├── .github ├── dependabot.yml └── workflows │ ├── docker-build.yml │ ├── cron-docker-rebuild.yml │ ├── docker-build-and-push.yml │ └── maui.yml ├── version.json ├── .dockerignore ├── Directory.Build.targets ├── stylecop.json ├── nuget.config ├── LICENSE ├── THIRD-PARTY-NOTICES.TXT ├── Directory.Build.props └── .gitattributes /doc/playstoreIcon512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/georg-jung/explain-face-rec/HEAD/doc/playstoreIcon512.png -------------------------------------------------------------------------------- /doc/screenshot-dimred.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/georg-jung/explain-face-rec/HEAD/doc/screenshot-dimred.png -------------------------------------------------------------------------------- /media/.gitattributes: -------------------------------------------------------------------------------- 1 | *.jpg filter=lfs diff=lfs merge=lfs -text 2 | *.png filter=lfs diff=lfs merge=lfs -text 3 | -------------------------------------------------------------------------------- /doc/screenshot-compare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/georg-jung/explain-face-rec/HEAD/doc/screenshot-compare.png -------------------------------------------------------------------------------- /doc/screenshot-alignment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/georg-jung/explain-face-rec/HEAD/doc/screenshot-alignment.png -------------------------------------------------------------------------------- /doc/playstorePresentationGraphic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/georg-jung/explain-face-rec/HEAD/doc/playstorePresentationGraphic.png -------------------------------------------------------------------------------- /src/BlazorFace.Maui/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/georg-jung/explain-face-rec/HEAD/src/BlazorFace.Maui/wwwroot/favicon.ico -------------------------------------------------------------------------------- /global.json: -------------------------------------------------------------------------------- 1 | { 2 | "sdk": { 3 | "version": "7.0.100", 4 | "rollForward": "latestMajor", 5 | "allowPrerelease": true 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/BlazorFace/Pages/Credits.razor: -------------------------------------------------------------------------------- 1 | @page "/Credits" 2 | @layout LegalLayout 3 | 4 |
5 | @((MarkupString)Media.SourcesHtml) 6 |
7 | -------------------------------------------------------------------------------- /src/BlazorFace/Pages/Applications/ProfilePicture.razor.css: -------------------------------------------------------------------------------- 1 | .restrict-child-image-size ::deep > img { 2 | max-height: 75vh; 3 | max-width: min(40vw, 40%); 4 | } 5 | -------------------------------------------------------------------------------- /media/groups/G7_in_Biarritz_01.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b09fca1e7ca7000e7c1b24e47a9f3b2ff95d283f226e415bdcb4c76ca4954848 3 | size 160877 4 | -------------------------------------------------------------------------------- /media/groups/G7_in_Biarritz_02.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:7b34f7c4dd50ed2871736e2237453c3c249fc619399ba8d4feda4d8e39de8050 3 | size 293407 4 | -------------------------------------------------------------------------------- /media/groups/Johnson_and_Trump.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:805114ef7ca4eff50667ce9bc354323f1eeeaaeec9874573ddaa93b9ba7275a6 3 | size 279750 4 | -------------------------------------------------------------------------------- /media/groups/Obama_and_Biden.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b90ffb05cd1377cc7e31ba8190ba93706b93751c23cdfa6af56bea5b12147def 3 | size 65118 4 | -------------------------------------------------------------------------------- /media/groups/Obama_and_children.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:1a25c003eefba206d211d13283a30fda43999ca2931da0d4681d5620e299a228 3 | size 37604 4 | -------------------------------------------------------------------------------- /media/portraits/Barack_Obama_01.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d9d5842abfbd5ac8387cee9e385b29834d791ad660d0dbecdd1e34e883a00be1 3 | size 60035 4 | -------------------------------------------------------------------------------- /media/portraits/Barack_Obama_02.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:111a4609d9b98c5bf0079903d736486118f820f6c4b7ea6b1c01593db21fa163 3 | size 120035 4 | -------------------------------------------------------------------------------- /media/portraits/Barack_Obama_03.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:04ed104de0f3dc800921bb153ec6e8cd1b9769c722570ce145df0b2f8ce17de1 3 | size 97423 4 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/Resources/Fonts/OpenSans-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/georg-jung/explain-face-rec/HEAD/src/BlazorFace.Maui/Resources/Fonts/OpenSans-Regular.ttf -------------------------------------------------------------------------------- /media/groups/Biden_and_two_women.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b4988efa3cbeff658518b3b06e1f7fc1ee2d9e393452e189f40f772e2a920c4c 3 | size 116705 4 | -------------------------------------------------------------------------------- /media/portraits/John_F_Kennedy_01.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b57bc3a3eed0239974f4d17082c472c7c3006f499d66b07173738554dbb98a9d 3 | size 45599 4 | -------------------------------------------------------------------------------- /src/BlazorFace/Components/DimReductionPlot.razor.css: -------------------------------------------------------------------------------- 1 | img.hovered-face-preview { 2 | display: none; 3 | } 4 | 5 | img[src].hovered-face-preview { 6 | display: block; 7 | } 8 | -------------------------------------------------------------------------------- /media/lfw/Adam_Sandler/Adam_Sandler_0001.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c50d0c76cb1943989766f2b28730275d16c9f73c810d9b998d5e744f0b4bcedd 3 | size 10582 4 | -------------------------------------------------------------------------------- /media/lfw/Adam_Sandler/Adam_Sandler_0002.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8b7a755011f92843f341d6cc663d10476798dd668914b1dffb5971c7afa94493 3 | size 14997 4 | -------------------------------------------------------------------------------- /media/lfw/Adam_Sandler/Adam_Sandler_0003.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f40ad933cd84eab975e4b0271902fc8e92a79def7116fc25bfc1fcc4ef6f0bfd 3 | size 14802 4 | -------------------------------------------------------------------------------- /media/lfw/Adam_Sandler/Adam_Sandler_0004.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f38d8077568ed982ad20e2913152b6efa8a72e2ab7a49fd26896fc5d28073abe 3 | size 14745 4 | -------------------------------------------------------------------------------- /media/lfw/Fidel_Castro/Fidel_Castro_0001.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e79c95768f6131bb16db17d2c573a9d9b1dddd902c7e59eb3521a69189272a8c 3 | size 8361 4 | -------------------------------------------------------------------------------- /media/lfw/Fidel_Castro/Fidel_Castro_0002.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:087de116e5287e637e549b1158580ab9335946569e1caaf0cbcde9542a1f8c0d 3 | size 15450 4 | -------------------------------------------------------------------------------- /media/lfw/Fidel_Castro/Fidel_Castro_0003.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c19df382af3e4730c9aeb406360e963872cec6656d4e82f086296d930415849e 3 | size 14895 4 | -------------------------------------------------------------------------------- /media/lfw/Fidel_Castro/Fidel_Castro_0004.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6420647b069cac42ac7bf15c0a96f68d88a1a562ef9be0311f15232c3437fc93 3 | size 14538 4 | -------------------------------------------------------------------------------- /media/lfw/Fidel_Castro/Fidel_Castro_0005.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:cba2f7b715480d4b5f35160a2694ed45bbcad5c178e85741675ab101e7c7df81 3 | size 14053 4 | -------------------------------------------------------------------------------- /media/lfw/Fidel_Castro/Fidel_Castro_0006.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8e0defaf830f89e1bbca19a0497a8834e94358afb17fca82dec86f73f5fbc040 3 | size 13337 4 | -------------------------------------------------------------------------------- /media/lfw/Fidel_Castro/Fidel_Castro_0007.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:aaa9559e4982d52e16da5a7a2f99cdd689d323e59a23889416445b26bd04f285 3 | size 13460 4 | -------------------------------------------------------------------------------- /media/lfw/Fidel_Castro/Fidel_Castro_0008.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:85dca8c88d1f2eaf779a723c5d4ed91a9a3182e12e59ead560f7891b0de19381 3 | size 12551 4 | -------------------------------------------------------------------------------- /media/lfw/Fidel_Castro/Fidel_Castro_0009.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:68db05bf1f4f866258ce4e4c63629fe82c9803a2ba26891fe114df1d66daf2d3 3 | size 15709 4 | -------------------------------------------------------------------------------- /media/lfw/Fidel_Castro/Fidel_Castro_0010.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d3af11121d9891d330851b69a67055cc224e2920472d9764f5d81ca0a88dc176 3 | size 13294 4 | -------------------------------------------------------------------------------- /media/lfw/Fidel_Castro/Fidel_Castro_0011.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:968b9b57bb3799e44eb07bf4d69dd9d9e32b69e877f21a51d7710b13d5cf2cba 3 | size 15700 4 | -------------------------------------------------------------------------------- /media/lfw/Fidel_Castro/Fidel_Castro_0012.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2002312310b1630c089273d1739f401b22ef325c0f14672cd999b24d0f252ded 3 | size 11753 4 | -------------------------------------------------------------------------------- /media/lfw/Fidel_Castro/Fidel_Castro_0013.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:02cc51832248a121e1d38ebd47abdac54d4ed10a04648062aa812a0904677ef6 3 | size 16307 4 | -------------------------------------------------------------------------------- /media/lfw/Fidel_Castro/Fidel_Castro_0014.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2b1c8d497ef501016b7d679acefc3bb75eb57bb92ceca805edf26f36ba8cebac 3 | size 13683 4 | -------------------------------------------------------------------------------- /media/lfw/Fidel_Castro/Fidel_Castro_0015.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:acecfc2799cfcece5b7e1fbbe0e0da30f9477294135a8a4d4b5cad1e82c425b1 3 | size 12041 4 | -------------------------------------------------------------------------------- /media/lfw/Fidel_Castro/Fidel_Castro_0016.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6083e788897bae6326222194fbd1cfc7fef079646b8974500055228ae7eb381c 3 | size 11034 4 | -------------------------------------------------------------------------------- /media/lfw/Fidel_Castro/Fidel_Castro_0017.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b1d3e1c366a418fbeeb9df0bf3d8257c95797df4b55bfc67f12ed3b1ba9f40d2 3 | size 12260 4 | -------------------------------------------------------------------------------- /media/lfw/Fidel_Castro/Fidel_Castro_0018.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:0e4c21baf4ced3e4e5e61c0e71d95daad17e38779edf5779b68f9a8ecc1e4932 3 | size 14200 4 | -------------------------------------------------------------------------------- /media/lfw/George_W_Bush/George_W_Bush_0002.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f04d53698da366ca8562b2d24ad9ed058116621b8fd0d51fcb46a6e5e470e0f3 3 | size 12457 4 | -------------------------------------------------------------------------------- /media/lfw/George_W_Bush/George_W_Bush_0010.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:053fb761f7b27848f343e20a8c687e892d68e8f0d8cc9e80c322f3b880beb40d 3 | size 13234 4 | -------------------------------------------------------------------------------- /media/lfw/George_W_Bush/George_W_Bush_0029.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6cdcb5bda8d5fee1b7d39d787602a592cd29276a13487d07c79129206f94e9e7 3 | size 16741 4 | -------------------------------------------------------------------------------- /media/lfw/George_W_Bush/George_W_Bush_0040.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:82839f950a94bec4ab186462849fe50ee35feeb5f3c4d4421a214604bb74c925 3 | size 11660 4 | -------------------------------------------------------------------------------- /media/lfw/George_W_Bush/George_W_Bush_0047.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ea59e022ad1a6152bd1e175f8331a38e91fe3450d25b2331686e8e4b652e57c3 3 | size 17478 4 | -------------------------------------------------------------------------------- /media/lfw/George_W_Bush/George_W_Bush_0098.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:34ddfb894e82c2dcbbfc9428776133974554b6455635531d55421ece074248ea 3 | size 13518 4 | -------------------------------------------------------------------------------- /media/lfw/George_W_Bush/George_W_Bush_0120.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:469e84bcb2d4aaae620d2c231b6b01ab53f611dd168066db4b760300aa9913fb 3 | size 13315 4 | -------------------------------------------------------------------------------- /media/lfw/George_W_Bush/George_W_Bush_0130.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:91d8d2a09838dc90182606edea5b29864291fb0f69d92166bb12ff2ba650e517 3 | size 15850 4 | -------------------------------------------------------------------------------- /media/lfw/George_W_Bush/George_W_Bush_0218.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ca66f4a342d601e91e21a24b5fe0bb8a04ce361997a854d6e8609cb1447c1307 3 | size 14767 4 | -------------------------------------------------------------------------------- /media/lfw/George_W_Bush/George_W_Bush_0335.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:70dff301e3bb1cd7fd802b7cbc7ac7e4776d9bce8e192c133286058c5daf45ac 3 | size 14935 4 | -------------------------------------------------------------------------------- /media/lfw/George_W_Bush/George_W_Bush_0337.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:081dd2f27a5b11aed9d9108d19bdc03edebe6829d3b0b19bf0092fa56ff3656a 3 | size 12643 4 | -------------------------------------------------------------------------------- /media/lfw/George_W_Bush/George_W_Bush_0347.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:dc8e9061a353e515cd4ca08c94dd921fdfa52a400a03fe957339d17010ebb401 3 | size 15367 4 | -------------------------------------------------------------------------------- /media/lfw/George_W_Bush/George_W_Bush_0398.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:16c4bdfeae4ed9f729181021d50af2a91d145ade14c3f0e3f0ba626ba3c43e68 3 | size 14423 4 | -------------------------------------------------------------------------------- /media/lfw/George_W_Bush/George_W_Bush_0437.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:32998a2a02e7f46f5103c52ebaad273db792addfdee16a5eeb588199b78664aa 3 | size 16720 4 | -------------------------------------------------------------------------------- /media/lfw/George_W_Bush/George_W_Bush_0441.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:941d5e35ea9c8af69fd5207e020b3b229d7d3bf6269559669fdd6d21034396f7 3 | size 17717 4 | -------------------------------------------------------------------------------- /media/lfw/George_W_Bush/George_W_Bush_0442.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:96afa63840dea4d9e8dc4ac5576d0135c1efdaf934797682d415c0dd7573dd71 3 | size 14968 4 | -------------------------------------------------------------------------------- /media/lfw/George_W_Bush/George_W_Bush_0460.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:9f09943ebc46deb8c7c00f4e51bc6d46bfbb0aa6b12cbde940451be3c9946c86 3 | size 13513 4 | -------------------------------------------------------------------------------- /media/lfw/George_W_Bush/George_W_Bush_0500.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e52d98034f035eeb2b008c1250af38374f926f07b165b97b56f03f6d348048d7 3 | size 16226 4 | -------------------------------------------------------------------------------- /media/lfw/Roger_Moore/Roger_Moore_0001.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:dafd8333166d3741ad804fe38e9c7c2b8801a9c9ada3a962b5f055183cda1df2 3 | size 14008 4 | -------------------------------------------------------------------------------- /media/lfw/Roger_Moore/Roger_Moore_0002.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:a168313896be17dcc3032dc8c90b465dc983cc1e22f90d1ad6420ceca488eb96 3 | size 10481 4 | -------------------------------------------------------------------------------- /media/lfw/Roger_Moore/Roger_Moore_0003.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:53d12802630d3a6b97f412515bf9733cc1b06a4ada5bc3e3a7a7ee3651a03f04 3 | size 13662 4 | -------------------------------------------------------------------------------- /media/lfw/Roger_Moore/Roger_Moore_0004.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:62ba9826a9dc6699e13fcb3a7d611dc7b630f45f5a6d2b714cf06ba6f8106546 3 | size 14383 4 | -------------------------------------------------------------------------------- /media/lfw/Roger_Moore/Roger_Moore_0005.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:4fdb3109b63a22ed6eb048b1fe22d485ff9cf978844e2e586426f0c89c694e7b 3 | size 18581 4 | -------------------------------------------------------------------------------- /media/badges/google-play/en_badge_web_generic.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f72611e2df8e88204009fd896d05d5e8e83c77009c63943bbffa169559934849 3 | size 4904 4 | -------------------------------------------------------------------------------- /media/lfw/Angelina_Jolie/Angelina_Jolie_0001.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f101e0fbfef4c8e9c0acfd659b109a7e005eececa6c9f9e6361311358b5b976d 3 | size 12826 4 | -------------------------------------------------------------------------------- /media/lfw/Angelina_Jolie/Angelina_Jolie_0002.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f5f5fde2edc0d4d078a1baf4e9343c977c3fa3ab0e0a394a1e91714e88e97e20 3 | size 17073 4 | -------------------------------------------------------------------------------- /media/lfw/Angelina_Jolie/Angelina_Jolie_0003.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:3aa9b9e4c2b5518ac52f88b2ff9c9e23f1d84140b8036b4fc8d74ec5e870ad89 3 | size 15519 4 | -------------------------------------------------------------------------------- /media/lfw/Angelina_Jolie/Angelina_Jolie_0004.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c323134fa38da0116591c45518caa6fb282f2b794e2a249a248a7de712eaf7c2 3 | size 12484 4 | -------------------------------------------------------------------------------- /media/lfw/Angelina_Jolie/Angelina_Jolie_0005.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c7bef24cb51a2237b7a3fa8c8b45cbe6b50df5b6e4ccfd028851258b1783f644 3 | size 18044 4 | -------------------------------------------------------------------------------- /media/lfw/Angelina_Jolie/Angelina_Jolie_0006.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:31eee606b69491125209a0c9c223b0e707ad3dcd3467b6481e05ea79ad46fe00 3 | size 14928 4 | -------------------------------------------------------------------------------- /media/lfw/Angelina_Jolie/Angelina_Jolie_0007.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:766f68257362eca9feff155dcdaa50cdb96c98168e04c77ffc0a3974b9482600 3 | size 11983 4 | -------------------------------------------------------------------------------- /media/lfw/Angelina_Jolie/Angelina_Jolie_0008.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:bfb40cb6fd61e898682a33e78e24d28788977b005996835ee6e1a288ec16ea15 3 | size 12561 4 | -------------------------------------------------------------------------------- /media/lfw/Angelina_Jolie/Angelina_Jolie_0009.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:11c68bf771feebc14c17252647e9bcb90312ed7b26a264dc8d2f79ebbcf486f6 3 | size 14433 4 | -------------------------------------------------------------------------------- /media/lfw/Angelina_Jolie/Angelina_Jolie_0010.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f8bc4d86bc328aba391074bd8893f4aa892ea175d121045327d9d8debe9ffe83 3 | size 16984 4 | -------------------------------------------------------------------------------- /media/lfw/Angelina_Jolie/Angelina_Jolie_0011.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:5312d8199fa116fc05806476ce035ed801e7575a58b96c7b134efd09a9772d79 3 | size 20099 4 | -------------------------------------------------------------------------------- /media/lfw/Angelina_Jolie/Angelina_Jolie_0012.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:375fd6fa3c0debdb46cf3dcc4c83ad3443c62169eb0e93e1a916327ff3aa4f38 3 | size 18667 4 | -------------------------------------------------------------------------------- /media/lfw/Angelina_Jolie/Angelina_Jolie_0013.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:85225df05a49c573a6cc27ba75fed5f493dea7bc362ec55b7f4b4e26f29b4810 3 | size 17167 4 | -------------------------------------------------------------------------------- /media/lfw/Angelina_Jolie/Angelina_Jolie_0014.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:418ecc672158db7b6e1275083cfb71f0d9e04f009bd83d57b7984dd8375466d1 3 | size 15054 4 | -------------------------------------------------------------------------------- /media/lfw/Angelina_Jolie/Angelina_Jolie_0015.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2c7f27411effa73d27228c20dcfe5e81f5c3774596ee09b967c47eca90270e77 3 | size 14501 4 | -------------------------------------------------------------------------------- /media/lfw/Angelina_Jolie/Angelina_Jolie_0016.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:73e79209f47a6becdd3dcfa98a59cfe28b6b562649d6010f1ce4f39e0ba560fd 3 | size 13235 4 | -------------------------------------------------------------------------------- /media/lfw/Angelina_Jolie/Angelina_Jolie_0017.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6eab332544fa570a2a584937d4446e3ca494c1caaac25adfcf57e83b4c01288e 3 | size 17389 4 | -------------------------------------------------------------------------------- /media/lfw/Angelina_Jolie/Angelina_Jolie_0018.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b3f6a7620e65668c5dee4e68f48c3a08eae7a2f280f515113f8e1022956d27fa 3 | size 15794 4 | -------------------------------------------------------------------------------- /media/lfw/Angelina_Jolie/Angelina_Jolie_0019.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:aeac2fc1bd17a29c24262be3f707eb6dc2e488100e784645b27576b33a8feabc 3 | size 18932 4 | -------------------------------------------------------------------------------- /media/lfw/Angelina_Jolie/Angelina_Jolie_0020.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8224d681608358c8cde81bd90326292e0a8d5da753c526a69070df1d63e326c8 3 | size 15193 4 | -------------------------------------------------------------------------------- /media/lfw/Charles_Bronson/Charles_Bronson_0001.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d076ea72f612ca4722bb1abca3ac45d53d14e7bf788189f437eb758a3ec9963f 3 | size 11059 4 | -------------------------------------------------------------------------------- /media/lfw/Charles_Bronson/Charles_Bronson_0002.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2342f9c32fc405e8c0775478e9c440123702e658fcc4c6d2bc13a09be4011a2c 3 | size 14861 4 | -------------------------------------------------------------------------------- /media/lfw/Charles_Bronson/Charles_Bronson_0003.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:1076589ee273622e7ad9e788df9edb55718030ebfaf7f0482b53248f372dfc51 3 | size 17401 4 | -------------------------------------------------------------------------------- /media/lfw/George_HW_Bush/George_HW_Bush_0001.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2139e04b60205e712bf0769c0917da33252ac2d2c5a0d78088080b8dab987291 3 | size 13094 4 | -------------------------------------------------------------------------------- /media/lfw/George_HW_Bush/George_HW_Bush_0002.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:72cd92edfdbc644258a0e9199d331b51d2d2c0cc07b5de1783fde8207be56b79 3 | size 11780 4 | -------------------------------------------------------------------------------- /media/lfw/George_HW_Bush/George_HW_Bush_0003.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:26e135da11ca7a8274d6c70c9ff9fbc8bad662c7013f124224ddd2802d81eab0 3 | size 13187 4 | -------------------------------------------------------------------------------- /media/lfw/George_HW_Bush/George_HW_Bush_0004.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:58eb04b2a096ad8b02765caef0035ab5b8c6522d6065feb38e0bd56c1d05c2a8 3 | size 12605 4 | -------------------------------------------------------------------------------- /media/lfw/George_HW_Bush/George_HW_Bush_0005.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:033082a6f62fb5e3be55af53e327730ddae81fa69a6cde5ee6a09ab00888a7ac 3 | size 16497 4 | -------------------------------------------------------------------------------- /media/lfw/George_HW_Bush/George_HW_Bush_0006.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2b099193b9c182d9611d9a3c2a3f51c0c9448362521c752c985cc1169d727145 3 | size 12648 4 | -------------------------------------------------------------------------------- /media/lfw/George_HW_Bush/George_HW_Bush_0007.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b1dc69468e028094cffae27844498fd36d93215dc92fb3431407b8c51b2cc5be 3 | size 15536 4 | -------------------------------------------------------------------------------- /media/lfw/George_HW_Bush/George_HW_Bush_0008.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:843fd658b9d79fb5a59829a802416f3e4738a9699a13074dd9a76a5394251543 3 | size 12910 4 | -------------------------------------------------------------------------------- /media/lfw/George_HW_Bush/George_HW_Bush_0009.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:958e99e2590c11d94123bf0de19e9b60d45fed7831d49c8465afddd961ae3176 3 | size 12650 4 | -------------------------------------------------------------------------------- /media/lfw/George_HW_Bush/George_HW_Bush_0010.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:acd098bc6ed9dbae902750559a752ae2d88457fa00f5a78bf47909457ee18b7c 3 | size 15608 4 | -------------------------------------------------------------------------------- /media/lfw/George_HW_Bush/George_HW_Bush_0011.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b1c9e4158faa3be2a18c1d9b9ab4866ec96347f7cfd004d6786acc85a7cbd57e 3 | size 16170 4 | -------------------------------------------------------------------------------- /media/lfw/George_HW_Bush/George_HW_Bush_0012.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:7d163312ca1030e09f50a9df0401a61aad04b646c22e477c9ac556b5581516b7 3 | size 16354 4 | -------------------------------------------------------------------------------- /media/lfw/George_HW_Bush/George_HW_Bush_0013.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:009c760e2b772e5097d226c4691308d122e59a95453973a93463d8aa9e3d3858 3 | size 10011 4 | -------------------------------------------------------------------------------- /media/lfw/Pierce_Brosnan/Pierce_Brosnan_0001.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:49c26708aed7cec08eaca7e5634ed0f4cf9bf18f5755c3aaf55a5707c00a1fd7 3 | size 17942 4 | -------------------------------------------------------------------------------- /media/lfw/Pierce_Brosnan/Pierce_Brosnan_0002.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:fe3fd2e9aedd1d0f64e080793f88b200c4c62c69d64456850da89c88aa68e69f 3 | size 12121 4 | -------------------------------------------------------------------------------- /media/lfw/Pierce_Brosnan/Pierce_Brosnan_0003.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:228f09b3736fa5eb7fd65738e9b0b0131f85938cb054c80e99bd2380f0e8a697 3 | size 15282 4 | -------------------------------------------------------------------------------- /media/lfw/Pierce_Brosnan/Pierce_Brosnan_0004.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:5d9eccbbd905069391dd39decfe65865380e8120db2fa48da9a01eebd7d59456 3 | size 13761 4 | -------------------------------------------------------------------------------- /media/lfw/Pierce_Brosnan/Pierce_Brosnan_0005.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:af969a5ee8a367f7f508bf6ea1cf55ed9aac331632a58e73b683265741ef5515 3 | size 11636 4 | -------------------------------------------------------------------------------- /media/lfw/Pierce_Brosnan/Pierce_Brosnan_0006.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:809ae940cda6884da6d5e72f986c0b4956ec44541b096ca8fa511ec242909573 3 | size 18243 4 | -------------------------------------------------------------------------------- /media/lfw/Pierce_Brosnan/Pierce_Brosnan_0007.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:81ac8d3a4dd319789a911410deab22ad7ecdb6a8ef6234428d9200fb259c9ee4 3 | size 10953 4 | -------------------------------------------------------------------------------- /media/lfw/Pierce_Brosnan/Pierce_Brosnan_0008.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:4133d5f83759c3935bbb3159481df1b3894ba867e730ad455f7813529e55bf05 3 | size 14007 4 | -------------------------------------------------------------------------------- /media/lfw/Pierce_Brosnan/Pierce_Brosnan_0009.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f7863e79ef7487fb5bfbad028ae982399080bb7fdac5ee274ee9d89cdea73f8e 3 | size 13736 4 | -------------------------------------------------------------------------------- /media/lfw/Pierce_Brosnan/Pierce_Brosnan_0010.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:58ab8d81baea7adb93b010207ca1cfbe5238746fa8a8cef4b67e80ae71c5c9e4 3 | size 13362 4 | -------------------------------------------------------------------------------- /media/lfw/Pierce_Brosnan/Pierce_Brosnan_0011.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d66329f6fc100869a86c17fd4878b6c8a563dcd98730cbb6f529f3160d59f4c6 3 | size 12267 4 | -------------------------------------------------------------------------------- /media/lfw/Pierce_Brosnan/Pierce_Brosnan_0012.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b5c3ebc444e83c9d8b41c596e3de3934e4c5e578841aade52760791cec44a9da 3 | size 14292 4 | -------------------------------------------------------------------------------- /media/lfw/Pierce_Brosnan/Pierce_Brosnan_0013.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c992c6f500b3f8aeff2e116f652b5e9cee9e7ccd720355653253c4b0bf7b8ddc 3 | size 14700 4 | -------------------------------------------------------------------------------- /media/lfw/Pierce_Brosnan/Pierce_Brosnan_0014.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:748659296362a2ea842eb9f355c3556014ed25097b9331b248949ca8923cba73 3 | size 13394 4 | -------------------------------------------------------------------------------- /media/lfw/Pierce_Brosnan/Pierce_Brosnan_0015.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:82eda7ebb93d20cd3a8d101eb146d1d516edc488040cf65910feeaf073833a3a 3 | size 17487 4 | -------------------------------------------------------------------------------- /media/lfw/Prince_Charles/Prince_Charles_0001.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:5083048f35de51e9228fa9187b488484b2422345352914fce648e2812746f081 3 | size 12495 4 | -------------------------------------------------------------------------------- /media/lfw/Prince_Charles/Prince_Charles_0002.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:15045045fa09a4487acb420b5b91d9c93ac15d01f1cd02bef353fda06d676257 3 | size 16647 4 | -------------------------------------------------------------------------------- /media/lfw/Prince_Charles/Prince_Charles_0003.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6e66890d1aa7a01fca0102210f234b88583d7032d93ee30614d75bf3045a9be8 3 | size 11345 4 | -------------------------------------------------------------------------------- /media/lfw/Prince_Charles/Prince_Charles_0004.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:37648eb51e65814fe1eed6c14c66c2b7d4974dc6008c461682a140ee552f083f 3 | size 14681 4 | -------------------------------------------------------------------------------- /media/lfw/Prince_Charles/Prince_Charles_0005.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d51ec08d3de9ca8457f7594a5b99a634b6e06755268c9c5de47b50b7088f82f7 3 | size 12850 4 | -------------------------------------------------------------------------------- /src/BlazorFace/Shared/MainLayout.razor.css: -------------------------------------------------------------------------------- 1 | .page { 2 | position: relative; 3 | display: flex; 4 | flex-direction: column; 5 | } 6 | 7 | main { 8 | flex: 1; 9 | } 10 | -------------------------------------------------------------------------------- /src/BlazorFace/wwwroot/css/open-iconic/font/fonts/open-iconic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/georg-jung/explain-face-rec/HEAD/src/BlazorFace/wwwroot/css/open-iconic/font/fonts/open-iconic.eot -------------------------------------------------------------------------------- /src/BlazorFace/wwwroot/css/open-iconic/font/fonts/open-iconic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/georg-jung/explain-face-rec/HEAD/src/BlazorFace/wwwroot/css/open-iconic/font/fonts/open-iconic.otf -------------------------------------------------------------------------------- /src/BlazorFace/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/georg-jung/explain-face-rec/HEAD/src/BlazorFace/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf -------------------------------------------------------------------------------- /media/groups/Barack_Obama_at_town_hall_in_Arnold.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:4b3fb4f11d513f30a6011fa0e31fdb0a71062d70845df8292fd8a4385de4a4a9 3 | size 221791 4 | -------------------------------------------------------------------------------- /media/lfw/Jennifer_Capriati/Jennifer_Capriati_0001.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2c5b85da5ddb102d1f6dc6d08130dd8f33ad33e5021188765ec89a04ec2525c8 3 | size 13879 4 | -------------------------------------------------------------------------------- /media/lfw/Jennifer_Capriati/Jennifer_Capriati_0005.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:4836b74a81e1caa2c74598ac9baef362dbe0be43be16b3128783c75c0f398500 3 | size 13611 4 | -------------------------------------------------------------------------------- /media/lfw/Jennifer_Capriati/Jennifer_Capriati_0006.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:acc4164abf4e47353e3b7f11d7cf88b3b920ba3aa7156586ff2ae80df52a536c 3 | size 14723 4 | -------------------------------------------------------------------------------- /media/lfw/Jennifer_Capriati/Jennifer_Capriati_0008.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:52e35982d4c07b1c89ea8ad778e15ffd536163fa01ac2053bcf1e951e39ac640 3 | size 14930 4 | -------------------------------------------------------------------------------- /media/lfw/Jennifer_Capriati/Jennifer_Capriati_0010.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:37f133359bcb81070bb6738b5392ea1d4b559429550637f8759dc8beb2e4d674 3 | size 17532 4 | -------------------------------------------------------------------------------- /media/lfw/Jennifer_Capriati/Jennifer_Capriati_0011.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:47eac8260f094a75ec8fd2769daf258136f64d181b64085903749a9c30ff2387 3 | size 12797 4 | -------------------------------------------------------------------------------- /media/lfw/Jennifer_Capriati/Jennifer_Capriati_0012.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:224ecb9c2988590ebb7291ca0f74efa2647435a5e7852d8a4d74ff4ff1d39c3e 3 | size 17573 4 | -------------------------------------------------------------------------------- /media/lfw/Jennifer_Capriati/Jennifer_Capriati_0014.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b95055236a76be913369d2d76800a234ceb76cd56a876397dcb577569e059fbb 3 | size 16205 4 | -------------------------------------------------------------------------------- /media/lfw/Jennifer_Capriati/Jennifer_Capriati_0017.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:718d7add9a081f1bfbfb4481cbb451784c49ac52676c627c7e07eef1bef0abc3 3 | size 14438 4 | -------------------------------------------------------------------------------- /media/lfw/Jennifer_Capriati/Jennifer_Capriati_0020.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2de469c776cd0ca4b23bc2e081cb9269fbe5d22a336e8e55ab333d5d20b2fed5 3 | size 14632 4 | -------------------------------------------------------------------------------- /media/lfw/Jennifer_Capriati/Jennifer_Capriati_0022.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6708f85251ba40f1a1428bb3ef5c7466e7e52b2452bd9992787b6bcddca373ac 3 | size 11507 4 | -------------------------------------------------------------------------------- /media/lfw/Jennifer_Capriati/Jennifer_Capriati_0024.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:bb236e80d51d60dc38cb17d8dce427874d1753f5a8d0ad0c85505858df9db51f 3 | size 13235 4 | -------------------------------------------------------------------------------- /media/lfw/Jennifer_Capriati/Jennifer_Capriati_0029.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b4a3042a80b5af23b5da11a70ca1873d88f622d3c4311ae0d570548808bc304d 3 | size 14381 4 | -------------------------------------------------------------------------------- /media/lfw/Jennifer_Capriati/Jennifer_Capriati_0030.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ee3d9c3147907a7a8b4acf9be9d6ca1e485c0c481061fedfcedddede0b3f5a27 3 | size 11713 4 | -------------------------------------------------------------------------------- /media/lfw/Jennifer_Capriati/Jennifer_Capriati_0031.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:59f42b1158a214be9d5d27be6f903a34914c9e946de0980922d647f4aa98fa0d 3 | size 10829 4 | -------------------------------------------------------------------------------- /media/lfw/Jennifer_Capriati/Jennifer_Capriati_0032.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:113de271c0fe3defbee241bfdccc49540eaf9de3be9ae0fb4221deb4353aeb07 3 | size 12660 4 | -------------------------------------------------------------------------------- /media/lfw/Jennifer_Capriati/Jennifer_Capriati_0033.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ea02b2eb85d4153a1f02c52097ef70846b9ae384fb39d2d7f832f0cc9af77c7c 3 | size 16239 4 | -------------------------------------------------------------------------------- /media/lfw/Jennifer_Capriati/Jennifer_Capriati_0034.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2912664d382fb75d4c269837b83c7318c28dbbda7615c407b14989abf5f0e8db 3 | size 18393 4 | -------------------------------------------------------------------------------- /media/lfw/Jennifer_Capriati/Jennifer_Capriati_0035.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:34ac30062101fa74c2687975721fd30f8ae6002d7fa4084ba9e9565d58feb3df 3 | size 15091 4 | -------------------------------------------------------------------------------- /media/lfw/Jennifer_Capriati/Jennifer_Capriati_0036.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8a289a3d675b4746f47f286781c2894c99d8b36f28b563f1881c05ac87a8a24f 3 | size 16990 4 | -------------------------------------------------------------------------------- /media/lfw/Jennifer_Capriati/Jennifer_Capriati_0037.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2a4c0c20a240f6e43eba1ab09dabc9caef9974fa079577fc403b72b9bcbd7218 3 | size 11482 4 | -------------------------------------------------------------------------------- /media/lfw/Jennifer_Capriati/Jennifer_Capriati_0039.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2bd7caf80b09d20d381c09ff7c15048234ab1ab7b59532f66dfb8062c3264ccf 3 | size 14746 4 | -------------------------------------------------------------------------------- /media/lfw/Jennifer_Capriati/Jennifer_Capriati_0040.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:314da1fbfa5ee741732b43c93d99dc039b5ea4917e9ea5ea3f1f969e02670d88 3 | size 17014 4 | -------------------------------------------------------------------------------- /media/lfw/Jennifer_Capriati/Jennifer_Capriati_0042.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:42edfe587889db8ec822111d838c6a5560a5dba3ef583afb619d75f6ebd5abd7 3 | size 17063 4 | -------------------------------------------------------------------------------- /media/lfw/Queen_Elizabeth_II/Queen_Elizabeth_II_0001.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:3a5b76e262b95128f1e391940237a1a264efc825362446b8c1e50253b68b4a22 3 | size 21563 4 | -------------------------------------------------------------------------------- /media/lfw/Queen_Elizabeth_II/Queen_Elizabeth_II_0002.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e1758c213bf035d39425e7b93ba19ec454fe7d73c4939276cf2859183d8d6884 3 | size 13579 4 | -------------------------------------------------------------------------------- /media/lfw/Queen_Elizabeth_II/Queen_Elizabeth_II_0003.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:7936e82a442b6481779d5d5fe2b971063c760e9d42d65448b12e43024e5bd7f7 3 | size 16606 4 | -------------------------------------------------------------------------------- /media/lfw/Queen_Elizabeth_II/Queen_Elizabeth_II_0004.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6286d5a6f1562f2a0c36ce4c2d9013b31b14f5b050ae49173e2378fe06544ba7 3 | size 14469 4 | -------------------------------------------------------------------------------- /media/lfw/Queen_Elizabeth_II/Queen_Elizabeth_II_0005.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:3103f442aba39d9479b97b0e0c3fbbf02f539c3d147103484ad7fe9dd381cecd 3 | size 13070 4 | -------------------------------------------------------------------------------- /media/lfw/Queen_Elizabeth_II/Queen_Elizabeth_II_0006.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c17f8c2fca54c9505c16818822bba5a8b5fe9b87b3f85b46bc627fdb63cff33b 3 | size 17413 4 | -------------------------------------------------------------------------------- /media/lfw/Queen_Elizabeth_II/Queen_Elizabeth_II_0007.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:17c6e9a9f3f525e1cde0e2b0371d5f55a8e6d4e52539e785b005d4cbba94dd30 3 | size 12506 4 | -------------------------------------------------------------------------------- /media/lfw/Queen_Elizabeth_II/Queen_Elizabeth_II_0008.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:832d27e5a2bb8c5e8b30323903057a83d96bcbb2b7df5955a7c76f65da58a4b2 3 | size 15640 4 | -------------------------------------------------------------------------------- /media/lfw/Queen_Elizabeth_II/Queen_Elizabeth_II_0009.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ecbbaad1b17ae14444fdeda53f5943e5658e61c3ce705966469d579d4872c51a 3 | size 13141 4 | -------------------------------------------------------------------------------- /media/lfw/Queen_Elizabeth_II/Queen_Elizabeth_II_0010.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ad535ed518e7a5703581f2bd42785dbed6d1e6bb1a73d332c99c27a4b0ba4e46 3 | size 12307 4 | -------------------------------------------------------------------------------- /media/lfw/Queen_Elizabeth_II/Queen_Elizabeth_II_0011.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:5a343ec78a6731e10eb331e71d0320b5f40662c19fdf50188ccc9d8f5d8b1b75 3 | size 19202 4 | -------------------------------------------------------------------------------- /media/lfw/Queen_Elizabeth_II/Queen_Elizabeth_II_0012.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:221bb6f478ec15c95d5f212c1b21a467bdbb3ada83c9e30df17217b6a5ba4c64 3 | size 17205 4 | -------------------------------------------------------------------------------- /media/lfw/Queen_Elizabeth_II/Queen_Elizabeth_II_0013.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:990ea0c33c4026c10c2c245e19cf5b6ea8391bcd146bcc73d8799e73d58d41c8 3 | size 15989 4 | -------------------------------------------------------------------------------- /src/BlazorFace/wwwroot/css/open-iconic/font/fonts/open-iconic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/georg-jung/explain-face-rec/HEAD/src/BlazorFace/wwwroot/css/open-iconic/font/fonts/open-iconic.woff -------------------------------------------------------------------------------- /media/portraits/Elaine_Chao_at_the_Regional_Media_Day.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6e92dd9006a2f0fab4380af2d364bf7b53badac4b6c8b1169bc15811591d359d 3 | size 127627 4 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "Windows Machine": { 4 | "commandName": "MsixPackage", 5 | "nativeDebugging": false 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /media/groups/Barack_Obama_and_Klaus_Iohannis_at_the_Blue_Room.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:29d1b3ee940839bb3e4153efcabdf5e763e42c6d9e202e4ea5dda7f5829045ea 3 | size 258345 4 | -------------------------------------------------------------------------------- /media/lfw/Dominique_de_Villepin/Dominique_de_Villepin_0001.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:89b1518f02eb667986033f4d549c0c6faf078717945405736272e735bdbd0bdc 3 | size 10271 4 | -------------------------------------------------------------------------------- /media/lfw/Dominique_de_Villepin/Dominique_de_Villepin_0002.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:68bd064cdcb6a1a97e57c3fc76718a43f4dd04e4dce45f564376f9bbd35b861c 3 | size 13541 4 | -------------------------------------------------------------------------------- /media/lfw/Dominique_de_Villepin/Dominique_de_Villepin_0003.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b0ab63b3bef0b2163b674b83ddcb05dbc8bae3769312c5c8fb614e62b59c642f 3 | size 11935 4 | -------------------------------------------------------------------------------- /media/lfw/Dominique_de_Villepin/Dominique_de_Villepin_0004.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f21903b7381eb27903fd27ab00a8da1761837caa066b1aff82eb8553ce92b286 3 | size 13268 4 | -------------------------------------------------------------------------------- /media/lfw/Dominique_de_Villepin/Dominique_de_Villepin_0005.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c7e9a18a971561cd0d43ea490ec46a244a092b1b601db3bebcdf47d66a378dd8 3 | size 15822 4 | -------------------------------------------------------------------------------- /media/lfw/Dominique_de_Villepin/Dominique_de_Villepin_0006.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8efada5c0d4604e6d11d10e6dddc8225bba3eaa9fca332e79b7289757f19f293 3 | size 14661 4 | -------------------------------------------------------------------------------- /media/lfw/Dominique_de_Villepin/Dominique_de_Villepin_0007.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d2f29f58444cbb92f6ca6ea28a88c5d04e342d78427849f42f021748820a4688 3 | size 17400 4 | -------------------------------------------------------------------------------- /media/lfw/Dominique_de_Villepin/Dominique_de_Villepin_0008.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:27d077812b3c3b7da9de04bc1563c3247ae85d8f611a0cc75972f817d5a9c791 3 | size 12552 4 | -------------------------------------------------------------------------------- /media/lfw/Dominique_de_Villepin/Dominique_de_Villepin_0009.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:0b7124d19ddd7edcaa1e6b59d99741936cb0089b677c116f44e3ecaeb895f60a 3 | size 13322 4 | -------------------------------------------------------------------------------- /media/lfw/Dominique_de_Villepin/Dominique_de_Villepin_0010.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:bbc5fc7208e47fc6962588fbeb27d50b6cf894bf7eb2db00f0727833c9309273 3 | size 18898 4 | -------------------------------------------------------------------------------- /media/lfw/Dominique_de_Villepin/Dominique_de_Villepin_0011.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:629f0bff81e1f08b56ca771b8c8e4f6cfd146ad9fc052fcb726ebcc772a4050f 3 | size 13224 4 | -------------------------------------------------------------------------------- /media/lfw/Dominique_de_Villepin/Dominique_de_Villepin_0012.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:77f6ab41018a5243b893b28cc894bb3b055aaff96a931ce961df38b03faba4ee 3 | size 10110 4 | -------------------------------------------------------------------------------- /media/lfw/Dominique_de_Villepin/Dominique_de_Villepin_0013.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:fd36d4a5a207b22ac6638ae76e0d48516fc5d59390aae1ecda6d5a03d05437b0 3 | size 16070 4 | -------------------------------------------------------------------------------- /media/lfw/Dominique_de_Villepin/Dominique_de_Villepin_0014.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:87d451151471bac455d18d4abf1a3d035fa53f720eb2c218065f63c21f0c763f 3 | size 14805 4 | -------------------------------------------------------------------------------- /media/lfw/Dominique_de_Villepin/Dominique_de_Villepin_0015.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f2b5bdd66eae7eca3ecca2b09691af582bf7bd199b0fe8d68c14445d711a6c96 3 | size 14328 4 | -------------------------------------------------------------------------------- /src/BlazorFace/wwwroot/bootstrap-icons-1.10.3/fonts/bootstrap-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/georg-jung/explain-face-rec/HEAD/src/BlazorFace/wwwroot/bootstrap-icons-1.10.3/fonts/bootstrap-icons.woff -------------------------------------------------------------------------------- /src/BlazorFace/wwwroot/bootstrap-icons-1.10.3/fonts/bootstrap-icons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/georg-jung/explain-face-rec/HEAD/src/BlazorFace/wwwroot/bootstrap-icons-1.10.3/fonts/bootstrap-icons.woff2 -------------------------------------------------------------------------------- /src/BlazorFace/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | }, 8 | "AllowedHosts": "*" 9 | } 10 | -------------------------------------------------------------------------------- /src/BlazorFace/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "DetailedErrors": true, 3 | "Logging": { 4 | "LogLevel": { 5 | "Default": "Information", 6 | "Microsoft.AspNetCore": "Warning" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/BlazorFace/Components/Spinner.razor: -------------------------------------------------------------------------------- 1 |
2 | Loading... 3 |
4 | 5 | @code { 6 | [Parameter] 7 | public string Class { get; set; } = ""; 8 | } 9 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/Platforms/Android/Resources/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #961c26 4 | #961c26 5 | #c5313d 6 | 7 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/Resources/AppIcon/appicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/BlazorFace/wwwroot/highlight.js-11.7.0/languages/plaintext.min.js: -------------------------------------------------------------------------------- 1 | /*! `plaintext` grammar compiled for Highlight.js 11.7.0 */ 2 | (()=>{var t=(()=>{"use strict";return t=>({name:"Plain text", 3 | aliases:["text","txt"],disableAutodetect:!0})})() 4 | ;hljs.registerLanguage("plaintext",t)})(); -------------------------------------------------------------------------------- /src/BlazorFace/Shared/LegalLayout.razor: -------------------------------------------------------------------------------- 1 | @inherits LayoutComponentBase 2 | @layout MainLayout 3 | 4 | @Body 5 | 6 |
7 | 8 | Return to home page 9 | 10 |
11 | -------------------------------------------------------------------------------- /media/deepinsight-targetpoints.opt.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/Platforms/iOS/AppDelegate.cs: -------------------------------------------------------------------------------- 1 | using Foundation; 2 | 3 | namespace BlazorFace.Maui 4 | { 5 | [Register("AppDelegate")] 6 | public class AppDelegate : MauiUIApplicationDelegate 7 | { 8 | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); 9 | } 10 | } -------------------------------------------------------------------------------- /src/BlazorFace.Maui/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using System.Net.Http 2 | @using Microsoft.AspNetCore.Components.Forms 3 | @using Microsoft.AspNetCore.Components.Routing 4 | @using Microsoft.AspNetCore.Components.Web 5 | @using Microsoft.AspNetCore.Components.Web.Virtualization 6 | @using Microsoft.JSInterop 7 | @using BlazorFace.Maui 8 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/Platforms/MacCatalyst/AppDelegate.cs: -------------------------------------------------------------------------------- 1 | using Foundation; 2 | 3 | namespace BlazorFace.Maui 4 | { 5 | [Register("AppDelegate")] 6 | public class AppDelegate : MauiUIApplicationDelegate 7 | { 8 | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); 9 | } 10 | } -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: nuget 4 | directory: "/" 5 | schedule: 6 | interval: daily 7 | - package-ecosystem: "github-actions" 8 | directory: "/" 9 | schedule: 10 | interval: daily 11 | - package-ecosystem: "docker" 12 | directory: "/" 13 | schedule: 14 | interval: "daily" 15 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/MainPage.xaml.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Georg Jung. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | namespace BlazorFace.Maui; 5 | 6 | public partial class MainPage : ContentPage 7 | { 8 | public MainPage() 9 | { 10 | InitializeComponent(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/Platforms/Windows/App.xaml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/BlazorFace/Services/IFileOpener.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Georg Jung. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | namespace BlazorFace.Services; 5 | 6 | public interface IFileOpener 7 | { 8 | ValueTask OpenAsync(string path); 9 | 10 | byte[] ReadAllBytes(string path); 11 | } 12 | -------------------------------------------------------------------------------- /src/BlazorFace/Services/IFilenameGrouper.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Georg Jung. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | namespace BlazorFace.Services; 5 | 6 | public interface IFilenameGrouper 7 | { 8 | IEnumerable> GroupFilenames(IReadOnlyCollection filenames); 9 | } 10 | -------------------------------------------------------------------------------- /src/BlazorFace/wwwroot/highlight.js-11.7.0/languages/shell.min.js: -------------------------------------------------------------------------------- 1 | /*! `shell` grammar compiled for Highlight.js 11.7.0 */ 2 | (()=>{var s=(()=>{"use strict";return s=>({name:"Shell Session", 3 | aliases:["console","shellsession"],contains:[{className:"meta.prompt", 4 | begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/, 5 | subLanguage:"bash"}}]})})();hljs.registerLanguage("shell",s)})(); -------------------------------------------------------------------------------- /src/BlazorFace/Components/ShowMore.razor: -------------------------------------------------------------------------------- 1 | @{ 2 | var id = $"collapse-{Guid.NewGuid():n}"; 3 | } 4 | 5 |
6 | @ChildContent 7 |
8 | 9 | 11 | 12 | @code { 13 | [Parameter] 14 | public RenderFragment? ChildContent { get; set; } 15 | } 16 | -------------------------------------------------------------------------------- /version.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json", 3 | "version": "0.2-alpha", 4 | "publicReleaseRefSpec": [ 5 | "^refs/heads/release/v\\d+(?:\\.\\d+)?$" 6 | ], 7 | "cloudBuild": { 8 | "buildNumber": { 9 | "enabled": true 10 | } 11 | }, 12 | "release": { 13 | "branchName": "release/v{version}" 14 | } 15 | } -------------------------------------------------------------------------------- /src/BlazorFace/Shared/GoBackLayout.razor: -------------------------------------------------------------------------------- 1 | @inherits LayoutComponentBase 2 | @layout MainLayout 3 | 4 | @inject IJSRuntime JS 5 | 6 | @Body 7 | 8 |
9 | 12 |
13 | 14 | @code { 15 | async Task GoBack() 16 | { 17 | await JS.InvokeVoidAsync("history.back"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/Platforms/Tizen/Main.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.Maui; 3 | using Microsoft.Maui.Hosting; 4 | 5 | namespace BlazorFace.Maui 6 | { 7 | internal class Program : MauiApplication 8 | { 9 | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); 10 | 11 | static void Main(string[] args) 12 | { 13 | var app = new Program(); 14 | app.Run(args); 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | **/.classpath 2 | **/.dockerignore 3 | **/.env 4 | # **/.git # we currently want .git for nbgv 5 | **/.gitignore 6 | **/.project 7 | **/.settings 8 | **/.toolstarget 9 | **/.vs 10 | **/.vscode 11 | **/*.*proj.user 12 | **/*.dbmdl 13 | **/*.jfm 14 | **/azds.yaml 15 | **/bin 16 | **/charts 17 | **/docker-compose* 18 | **/Dockerfile* 19 | **/node_modules 20 | **/npm-debug.log 21 | **/obj 22 | **/secrets.dev.yaml 23 | **/values.dev.yaml 24 | LICENSE 25 | README.md 26 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/Platforms/Android/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/Platforms/Android/MainApplication.cs: -------------------------------------------------------------------------------- 1 | using Android.App; 2 | using Android.Runtime; 3 | 4 | namespace BlazorFace.Maui 5 | { 6 | [Application] 7 | public class MainApplication : MauiApplication 8 | { 9 | public MainApplication(IntPtr handle, JniHandleOwnership ownership) 10 | : base(handle, ownership) 11 | { 12 | } 13 | 14 | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); 15 | } 16 | } -------------------------------------------------------------------------------- /src/BlazorFace.Maui/Platforms/Android/MainActivity.cs: -------------------------------------------------------------------------------- 1 | using Android.App; 2 | using Android.Content.PM; 3 | using Android.OS; 4 | 5 | namespace BlazorFace.Maui 6 | { 7 | [Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)] 8 | public class MainActivity : MauiAppCompatActivity 9 | { 10 | } 11 | } -------------------------------------------------------------------------------- /src/BlazorFace.Maui/Platforms/iOS/Program.cs: -------------------------------------------------------------------------------- 1 | using ObjCRuntime; 2 | using UIKit; 3 | 4 | namespace BlazorFace.Maui 5 | { 6 | public class Program 7 | { 8 | // This is the main entry point of the application. 9 | static void Main(string[] args) 10 | { 11 | // if you want to use a different Application Delegate class from "AppDelegate" 12 | // you can specify it here. 13 | UIApplication.Main(args, null, typeof(AppDelegate)); 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/BlazorFace.Maui/Platforms/MacCatalyst/Program.cs: -------------------------------------------------------------------------------- 1 | using ObjCRuntime; 2 | using UIKit; 3 | 4 | namespace BlazorFace.Maui 5 | { 6 | public class Program 7 | { 8 | // This is the main entry point of the application. 9 | static void Main(string[] args) 10 | { 11 | // if you want to use a different Application Delegate class from "AppDelegate" 12 | // you can specify it here. 13 | UIApplication.Main(args, null, typeof(AppDelegate)); 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/BlazorFace/Components/Progress.razor: -------------------------------------------------------------------------------- 1 |
2 |
3 | @ChildContent 4 |
5 |
6 | 7 | @code { 8 | [Parameter] 9 | public string Class { get; set; } = ""; 10 | 11 | [Parameter] 12 | public int Percentage { get; set; } = 0; 13 | 14 | [Parameter] 15 | public RenderFragment? ChildContent { get; set; } 16 | } 17 | -------------------------------------------------------------------------------- /src/BlazorFace/wwwroot/Sources.md: -------------------------------------------------------------------------------- 1 | # Sources and Licenses 2 | 3 | Some of the files might not be byte-wise copies of the sources listed but are recompressed or modified/edited in an other way. 4 | 5 | * person-bounding-box.svg 6 | * 7 | * 8 | * [MIT License](https://github.com/twbs/icons/blob/a7c0bc0c8222cbbdfcf5c30a21a7af50cbe77d35/LICENSE.md) 9 | * Copyright (c) 2019-2021 The Bootstrap Authors 10 | * Colors were changed 11 | -------------------------------------------------------------------------------- /.github/workflows/docker-build.yml: -------------------------------------------------------------------------------- 1 | name: Docker Image CI 2 | 3 | on: 4 | push 5 | 6 | jobs: 7 | 8 | build: 9 | runs-on: ubuntu-latest 10 | permissions: 11 | contents: read 12 | steps: 13 | - uses: actions/checkout@v3 14 | with: 15 | fetch-depth: 0 # avoid shallow clone so nbgv can do its work. 16 | lfs: true 17 | - uses: dotnet/nbgv@v0.4 18 | id: nbgv 19 | - name: Build the Docker image 20 | run: docker build . --file src/BlazorFace.Web/Dockerfile --tag blazorface:${{ steps.nbgv.outputs.SemVer2 }} 21 | -------------------------------------------------------------------------------- /src/BlazorFace/wwwroot/highlight.js-11.7.0/languages/json.min.js: -------------------------------------------------------------------------------- 1 | /*! `json` grammar compiled for Highlight.js 11.7.0 */ 2 | (()=>{var e=(()=>{"use strict";return e=>{const a=["true","false","null"],n={ 3 | scope:"literal",beginKeywords:a.join(" ")};return{name:"JSON",keywords:{ 4 | literal:a},contains:[{className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/, 5 | relevance:1.01},{match:/[{}[\],:]/,className:"punctuation",relevance:0 6 | },e.QUOTE_STRING_MODE,n,e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE], 7 | illegal:"\\S"}}})();hljs.registerLanguage("json",e)})(); -------------------------------------------------------------------------------- /src/BlazorFace/Components/HighlightedCode.razor: -------------------------------------------------------------------------------- 1 | @inject IJSRuntime JS 2 | 3 |

 4 |     @ChildContent
 5 | 
6 | 7 | @code { 8 | [Parameter] 9 | public string LanguageClass { get; set; } = ""; 10 | 11 | [Parameter] 12 | public RenderFragment? ChildContent { get; set; } 13 | 14 | private ElementReference _ref; 15 | 16 | protected override async Task OnAfterRenderAsync(bool firstRender) 17 | { 18 | if (firstRender) 19 | { 20 | await JS.InvokeVoidAsync("highlightElement", _ref); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Directory.Build.targets: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | false 5 | 6 | 7 | cobertura 8 | [xunit.*]* 9 | 10 | $(OutputPath)/ 11 | 12 | 13 | -------------------------------------------------------------------------------- /media/person-fill-perspective-warped.opt.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /media/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/BlazorFace/Components/ImageCompareViewer.razor.js: -------------------------------------------------------------------------------- 1 | import "/image-compare-viewer-1.5.0/image-compare-viewer.min.js"; 2 | 3 | export function mount(id, showLabels, leftLabel, rightLabel) { 4 | const options = { 5 | addCircle: true, 6 | addCircleBlur: true, 7 | 8 | // Label Defaults 9 | showLabels: showLabels, 10 | labelOptions: { 11 | before: leftLabel, 12 | after: rightLabel, 13 | onHover: false 14 | }, 15 | 16 | smoothing: false, 17 | }; 18 | 19 | const element = document.getElementById(id); 20 | const viewer = new ImageCompare(element, options).mount(); 21 | } 22 | -------------------------------------------------------------------------------- /src/BlazorFace/wwwroot/highlight.js-11.7.0/styles/vs.min.css: -------------------------------------------------------------------------------- 1 | pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#fff;color:#000}.hljs-comment,.hljs-quote,.hljs-variable{color:green}.hljs-built_in,.hljs-keyword,.hljs-name,.hljs-selector-tag,.hljs-tag{color:#00f}.hljs-addition,.hljs-attribute,.hljs-literal,.hljs-section,.hljs-string,.hljs-template-tag,.hljs-template-variable,.hljs-title,.hljs-type{color:#a31515}.hljs-deletion,.hljs-meta,.hljs-selector-attr,.hljs-selector-pseudo{color:#2b91af}.hljs-doctag{color:grey}.hljs-attr{color:red}.hljs-bullet,.hljs-link,.hljs-symbol{color:#00b0e8}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} -------------------------------------------------------------------------------- /src/BlazorFace.Maui/Resources/AppIcon/appiconfg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/BlazorFace/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using System.Net.Http 2 | @using Microsoft.AspNetCore.Authorization 3 | @using Microsoft.AspNetCore.Components.Forms 4 | @using Microsoft.AspNetCore.Components.Routing 5 | @using Microsoft.AspNetCore.Components.Web 6 | @using Microsoft.AspNetCore.Components.Web.Virtualization 7 | @using Microsoft.Extensions.ObjectPool; 8 | @using Microsoft.JSInterop 9 | @using Blazored.Modal 10 | @using Blazored.Modal.Services 11 | @using BlazorFace 12 | @using BlazorFace.Components 13 | @using BlazorFace.Components.TryOut 14 | @using BlazorFace.Extensions 15 | @using BlazorFace.Services; 16 | @using BlazorFace.Shared 17 | @using NodaTime; 18 | @using SixLabors.ImageSharp; 19 | -------------------------------------------------------------------------------- /src/BlazorFace/wwwroot/highlight.js-11.7.0/languages/diff.min.js: -------------------------------------------------------------------------------- 1 | /*! `diff` grammar compiled for Highlight.js 11.7.0 */ 2 | (()=>{var e=(()=>{"use strict";return e=>{const a=e.regex;return{name:"Diff", 3 | aliases:["patch"],contains:[{className:"meta",relevance:10, 4 | match:a.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/) 5 | },{className:"comment",variants:[{ 6 | begin:a.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/), 7 | end:/$/},{match:/^\*{15}$/}]},{className:"addition",begin:/^\+/,end:/$/},{ 8 | className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/, 9 | end:/$/}]}}})();hljs.registerLanguage("diff",e)})(); -------------------------------------------------------------------------------- /src/BlazorFace/App.razor: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Not found 9 | 10 |

Sorry, there's nothing at this address.

11 |
12 |
13 |
14 |
15 | -------------------------------------------------------------------------------- /media/logo-filled.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/BlazorFace/Components/Alert.razor: -------------------------------------------------------------------------------- 1 | 2 | @if (IsDismissed) { return; } 3 | 4 | 8 | 9 | @code { 10 | [Parameter] 11 | public string Context { get; set; } = "warning"; 12 | 13 | [Parameter] 14 | public string Class { get; set; } = ""; 15 | 16 | [Parameter] 17 | public bool IsDismissed { get; set; } 18 | 19 | [Parameter] 20 | public RenderFragment? ChildContent { get; set; } 21 | 22 | private void Dismiss() 23 | { 24 | IsDismissed = true; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/BlazorFace/wwwroot/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /stylecop.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", 3 | "settings": { 4 | "documentationRules": { 5 | "companyName": "Georg Jung", 6 | "copyrightText": "Copyright (c) {companyName}. All rights reserved.\nLicensed under the {licenseName} license. See {licenseFile} file in the project root for full license information.", 7 | "variables": { 8 | "licenseName": "MIT", 9 | "licenseFile": "LICENSE" 10 | }, 11 | "xmlHeader": false 12 | }, 13 | "orderingRules": { 14 | "usingDirectivesPlacement": "outsideNamespace" 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/BlazorFace/DIPooledObjectPolicy.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Georg Jung. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | using Microsoft.Extensions.ObjectPool; 5 | 6 | namespace BlazorFace; 7 | 8 | internal sealed class DIPooledObjectPolicy : PooledObjectPolicy 9 | where T : notnull 10 | { 11 | private readonly IServiceProvider _serviceProvider; 12 | 13 | public DIPooledObjectPolicy(IServiceProvider serviceProvider) 14 | { 15 | _serviceProvider = serviceProvider; 16 | } 17 | 18 | public override T Create() => _serviceProvider.GetRequiredService(); 19 | 20 | public override bool Return(T obj) => true; 21 | } 22 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/MauiResourceOpener.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Georg Jung. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | using BlazorFace.Services; 5 | 6 | namespace BlazorFace.Maui 7 | { 8 | internal class MauiResourceOpener : IFileOpener 9 | { 10 | public async ValueTask OpenAsync(string path) => await FileSystem.Current.OpenAppPackageFileAsync(path); 11 | 12 | public byte[] ReadAllBytes(string path) 13 | { 14 | using var s = OpenAsync(path).GetAwaiter().GetResult(); 15 | using var ms = new MemoryStream(); 16 | s.CopyTo(ms); 17 | return ms.ToArray(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/Resources/Raw/AboutAssets.txt: -------------------------------------------------------------------------------- 1 | Any raw assets you want to be deployed with your application can be placed in 2 | this directory (and child directories). Deployment of the asset to your application 3 | is automatically handled by the following `MauiAsset` Build Action within your `.csproj`. 4 | 5 | 6 | 7 | These files will be deployed with you package and will be accessible using Essentials: 8 | 9 | async Task LoadMauiAsset() 10 | { 11 | using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt"); 12 | using var reader = new StreamReader(stream); 13 | 14 | var contents = reader.ReadToEnd(); 15 | } 16 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/App.xaml.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Georg Jung. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | namespace BlazorFace.Maui; 5 | 6 | public partial class App : Application 7 | { 8 | public App() 9 | { 10 | InitializeComponent(); 11 | 12 | MainPage = new MainPage(); 13 | } 14 | 15 | protected override Window CreateWindow(IActivationState? activationState) 16 | { 17 | var window = base.CreateWindow(activationState); 18 | if (DeviceInfo.Current.Platform == DevicePlatform.WinUI) 19 | { 20 | window.Title = "Understanding Face Recognition"; 21 | } 22 | 23 | return window; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/MainPage.xaml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/PRIVACY.md: -------------------------------------------------------------------------------- 1 | # Privacy 2 | 3 | This application does not collect or transmit any personal information about users, except for technical information contained in HTTP requests (such as your IP address). No personal information is used, stored, secured or disclosed by the services this application works with. If you wish to report any violations of this policy, please contact us at privacy [ at ] gjung dot com. 4 | 5 | The application may be used to process user-provided images that may contain faces. When using the version of the application obtained from the Microsoft Store or the Google Play Store, these images are not disclosed or transferred to us or any other party. 6 | 7 | The Microsoft Store listing and Google Play Store listing for Understanding Face Recognition link to this privacy statement. 8 | -------------------------------------------------------------------------------- /src/BlazorFace/Components/ShowMore.razor.css: -------------------------------------------------------------------------------- 1 | .collapse:not(.show) { 2 | display: block; 3 | height: 16em !important; 4 | overflow: hidden; 5 | position: relative; 6 | } 7 | 8 | .collapse:not(.show)::after, 9 | .collapsing::after { 10 | content: ""; 11 | position: absolute; 12 | bottom: 0; 13 | left: 0; 14 | width: 100%; 15 | height: 4rem; 16 | background: linear-gradient(transparent, white); 17 | z-index: 1; 18 | } 19 | 20 | .collapsing { 21 | min-height: 16em !important; 22 | position: relative; 23 | } 24 | 25 | .collapser:not(.collapsed)::after { 26 | content: '- Show Less'; 27 | } 28 | 29 | .collapser.collapsed::after, 30 | .collapse:not(.show) + .collapser::after { 31 | content: '+ Show More'; 32 | } 33 | -------------------------------------------------------------------------------- /src/BlazorFace/Components/TryOut/TryOutSteps.razor: -------------------------------------------------------------------------------- 1 |
    2 |
  1. Install a recent version of .NET.
  2. 3 |
  3. 4 | Create a new console app project by running this command in your favorite shell in an empty folder:
    5 | 6 | dotnet new console 7 |
  4. 8 |
  5. 9 | Install two packages providing the relevant code and models:
    10 | 11 | dotnet add package Microsoft.ML.OnnxRuntime 12 | dotnet add package FaceAiSharp.Bundle 13 |
  6. 14 | @ChildContent 15 |
16 | 17 | @code 18 | { 19 | [Parameter] 20 | public RenderFragment? ChildContent { get; set; } 21 | } 22 | -------------------------------------------------------------------------------- /nuget.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/Platforms/Windows/app.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | true/PM 12 | PerMonitorV2, PerMonitor 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/BlazorFace/Extensions/CollectionExtensions.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Georg Jung. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | namespace BlazorFace.Extensions; 5 | 6 | internal static class CollectionExtensions 7 | { 8 | // see https://stackoverflow.com/q/3705950/1200847 9 | public static TValue GetOrAdd(this IDictionary dict, TKey key, Func valueCreator) 10 | { 11 | return dict.TryGetValue(key, out var value) ? value : dict[key] = valueCreator(); 12 | } 13 | 14 | public static TValue GetOrAdd(this IDictionary dictionary, TKey key) 15 | where TValue : new() 16 | { 17 | return dictionary.GetOrAdd(key, () => new TValue()); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/Platforms/Tizen/tizen-manifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | maui-appicon-placeholder 7 | 8 | 9 | 10 | 11 | http://tizen.org/privilege/internet 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/DirectoryListingSourceGenerator/DirectoryListingSourceGenerator.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netstandard2.0 5 | false 6 | true 7 | false 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/Platforms/Windows/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml; 2 | 3 | // To learn more about WinUI, the WinUI project structure, 4 | // and more about our project templates, see: http://aka.ms/winui-project-info. 5 | 6 | namespace BlazorFace.Maui.WinUI 7 | { 8 | /// 9 | /// Provides application-specific behavior to supplement the default Application class. 10 | /// 11 | public partial class App : MauiWinUIApplication 12 | { 13 | /// 14 | /// Initializes the singleton application object. This is the first line of authored code 15 | /// executed, and as such is the logical equivalent of main() or WinMain(). 16 | /// 17 | public App() 18 | { 19 | this.InitializeComponent(); 20 | } 21 | 22 | protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); 23 | } 24 | } -------------------------------------------------------------------------------- /src/BlazorFace/Services/DefaultFileOpener.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Georg Jung. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | using System.Reflection; 5 | 6 | namespace BlazorFace.Services 7 | { 8 | public sealed class DefaultFileOpener : IFileOpener 9 | { 10 | public ValueTask OpenAsync(string path) 11 | { 12 | #if DEBUG 13 | var p = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)!, path); 14 | #else 15 | var p = path; 16 | #endif 17 | return ValueTask.FromResult(File.OpenRead(p)); 18 | } 19 | 20 | public byte[] ReadAllBytes(string path) 21 | { 22 | #if DEBUG 23 | var p = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)!, path); 24 | #else 25 | var p = path; 26 | #endif 27 | return File.ReadAllBytes(p); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/BlazorFace/Components/ImageCompareViewer.razor: -------------------------------------------------------------------------------- 1 | @inject IJSRuntime JS 2 | 3 | 4 |
5 | @ChildContent 6 |
7 | 8 | @code { 9 | [Parameter] 10 | public string Class { get; set; } = ""; 11 | 12 | [Parameter] 13 | public string? LeftLabel { get; set; } 14 | 15 | [Parameter] 16 | public string? RightLabel { get; set; } 17 | 18 | [Parameter] 19 | public RenderFragment? ChildContent { get; set; } 20 | 21 | protected override async Task OnAfterRenderAsync(bool firstRender) 22 | { 23 | if (firstRender) 24 | { 25 | var module = await JS.InvokeAsync("import", "./Components/ImageCompareViewer.razor.js"); 26 | var showLabels = LeftLabel is not null || RightLabel is not null; 27 | await module.InvokeVoidAsync("mount", GetHashCode(), showLabels, LeftLabel, RightLabel); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/BlazorFace/Components/Bootstrap5Modal.razor: -------------------------------------------------------------------------------- 1 | 2 | 6 | @ChildContent 7 | 8 | 9 | @code { 10 | /// 11 | /// Could hold e.g. "modal-xl", "modal-sm", "modal-fullscreen-md-down". 12 | /// 13 | [Parameter] 14 | public string? ModalDialogExtraClass { get; set; } 15 | 16 | [Parameter] 17 | public RenderFragment? ChildContent { get; set; } 18 | 19 | public string? ModalTitle => _modalBase?.ModalTitle; 20 | 21 | private Bootstrap5ModalBase? _modalBase; 22 | 23 | public async Task CloseAsync(ModalResult modalResult) 24 | { 25 | await _modalBase!.CloseAsync(modalResult); 26 | } 27 | 28 | private Task CloseClick() => CloseAsync(ModalResult.Cancel()); 29 | } 30 | -------------------------------------------------------------------------------- /src/BlazorFace/Components/LfwIdentityChooser.razor: -------------------------------------------------------------------------------- 1 | 23 | 24 | @code { 25 | [Parameter] 26 | public EventCallback IdentitySelectedCallback { get; set; } 27 | } 28 | -------------------------------------------------------------------------------- /src/BlazorFace/wwwroot/highlight.js-11.7.0/styles/vs2015.min.css: -------------------------------------------------------------------------------- 1 | pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#1e1e1e;color:#dcdcdc}.hljs-keyword,.hljs-literal,.hljs-name,.hljs-symbol{color:#569cd6}.hljs-link{color:#569cd6;text-decoration:underline}.hljs-built_in,.hljs-type{color:#4ec9b0}.hljs-class,.hljs-number{color:#b8d7a3}.hljs-meta .hljs-string,.hljs-string{color:#d69d85}.hljs-regexp,.hljs-template-tag{color:#9a5334}.hljs-formula,.hljs-function,.hljs-params,.hljs-subst,.hljs-title{color:#dcdcdc}.hljs-comment,.hljs-quote{color:#57a64a;font-style:italic}.hljs-doctag{color:#608b4e}.hljs-meta,.hljs-meta .hljs-keyword,.hljs-tag{color:#9b9b9b}.hljs-template-variable,.hljs-variable{color:#bd63c5}.hljs-attr,.hljs-attribute{color:#9cdcfe}.hljs-section{color:gold}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-bullet,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-selector-pseudo,.hljs-selector-tag{color:#d7ba7d}.hljs-addition{background-color:#144212;display:inline-block;width:100%}.hljs-deletion{background-color:#600;display:inline-block;width:100%} -------------------------------------------------------------------------------- /src/BlazorFace/Helper/ColorEnumerator.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Georg Jung. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | namespace BlazorFace.Helper; 5 | 6 | internal static class ColorEnumerator 7 | { 8 | public static IEnumerable Plotly(bool endlessSequence) 9 | { 10 | // taken from https://stackoverflow.com/a/63460218/1200847 11 | do 12 | { 13 | yield return "#636EF0"; 14 | yield return "#EF5530"; 15 | yield return "#00CC90"; 16 | yield return "#AB63F0"; 17 | yield return "#FFA150"; 18 | yield return "#19D3F0"; 19 | yield return "#FF6690"; 20 | yield return "#B6E880"; 21 | yield return "#FF97F0"; 22 | yield return "#FECB50"; 23 | } 24 | while (endlessSequence); 25 | } 26 | 27 | public static IEnumerable RepeatForever(string value) 28 | { 29 | while (true) 30 | { 31 | yield return value; 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Georg Jung 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /media/face-alignment.opt.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/BlazorFace.Web/BlazorFace.Web.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net7.0 5 | enable 6 | enable 7 | be9d73e1-90f3-4999-9997-bb88dea22bbf 8 | Linux 9 | ../.. 10 | 11 | 12 | Regular 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /src/BlazorFace/Components/ExpandableEmbeddings.razor: -------------------------------------------------------------------------------- 1 | 6 | 7 |
8 |
9 |

10 | 17 |

18 |
19 |
20 | @Embeddings 21 |
22 |
23 |
24 |
25 | 26 | @code { 27 | [Parameter] 28 | public string? Embeddings { get; set; } 29 | 30 | [Parameter] 31 | public string Class { get; set; } = ""; 32 | } 33 | -------------------------------------------------------------------------------- /src/BlazorFace.Web/Pages/Error.cshtml.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Georg Jung. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | using System.Diagnostics; 5 | using Microsoft.AspNetCore.Mvc; 6 | using Microsoft.AspNetCore.Mvc.RazorPages; 7 | 8 | namespace BlazorFace.Pages 9 | { 10 | [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] 11 | [IgnoreAntiforgeryToken] 12 | [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1649:File name should match first type name", Justification = "Reviewed.")] 13 | public class ErrorModel : PageModel 14 | { 15 | private readonly ILogger _logger; 16 | 17 | public ErrorModel(ILogger logger) 18 | { 19 | _logger = logger; 20 | } 21 | 22 | public string? RequestId { get; set; } 23 | 24 | public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); 25 | 26 | public void OnGet() 27 | { 28 | RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/BlazorFace/wwwroot/css/open-iconic/ICON-LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Waybury 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /src/BlazorFace/wwwroot/highlight.js-11.7.0/styles/default.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | Theme: Default 3 | Description: Original highlight.js style 4 | Author: (c) Ivan Sagalaev 5 | Maintainer: @highlightjs/core-team 6 | Website: https://highlightjs.org/ 7 | License: see project LICENSE 8 | Touched: 2021 9 | */pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#f3f3f3;color:#444}.hljs-comment{color:#697070}.hljs-punctuation,.hljs-tag{color:#444a}.hljs-tag .hljs-attr,.hljs-tag .hljs-name{color:#444}.hljs-attribute,.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-name,.hljs-selector-tag{font-weight:700}.hljs-deletion,.hljs-number,.hljs-quote,.hljs-selector-class,.hljs-selector-id,.hljs-string,.hljs-template-tag,.hljs-type{color:#800}.hljs-section,.hljs-title{color:#800;font-weight:700}.hljs-link,.hljs-operator,.hljs-regexp,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-symbol,.hljs-template-variable,.hljs-variable{color:#ab5656}.hljs-literal{color:#695}.hljs-addition,.hljs-built_in,.hljs-bullet,.hljs-code{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} -------------------------------------------------------------------------------- /src/BlazorFace/Shared/MultiChoiceRadio.razor: -------------------------------------------------------------------------------- 1 | @typeparam TItem 2 | 3 |
4 | @foreach (var choice in Choices ?? Array.Empty()) 5 | { 6 | var id = Guid.NewGuid().ToString("n"); 7 | 8 | 11 | } 12 |
13 | 14 | @code { 15 | [Parameter] 16 | public string Class { get; set; } = ""; 17 | 18 | [Parameter] 19 | public IEnumerable Choices { get; set; } = new TItem[] { }; 20 | 21 | [Parameter] 22 | public TItem? SelectedChoice { get; set; } 23 | 24 | [Parameter] 25 | public EventCallback SelectedChoiceChanged { get; set; } 26 | 27 | [Parameter] 28 | public RenderFragment? ChildContent { get; set; } 29 | 30 | private async Task SetChoice(TItem? choice, object? noopIfNotTrue) 31 | { 32 | await SelectedChoiceChanged.InvokeAsync(choice); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/App.xaml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | #512bdf 10 | White 11 | 12 | 16 | 17 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/Platforms/MacCatalyst/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UIDeviceFamily 6 | 7 | 1 8 | 2 9 | 10 | UIRequiredDeviceCapabilities 11 | 12 | arm64 13 | 14 | UISupportedInterfaceOrientations 15 | 16 | UIInterfaceOrientationPortrait 17 | UIInterfaceOrientationLandscapeLeft 18 | UIInterfaceOrientationLandscapeRight 19 | 20 | UISupportedInterfaceOrientations~ipad 21 | 22 | UIInterfaceOrientationPortrait 23 | UIInterfaceOrientationPortraitUpsideDown 24 | UIInterfaceOrientationLandscapeLeft 25 | UIInterfaceOrientationLandscapeRight 26 | 27 | XSAppIconAssets 28 | Assets.xcassets/appicon.appiconset 29 | 30 | 31 | -------------------------------------------------------------------------------- /src/BlazorFace.Web/Dockerfile: -------------------------------------------------------------------------------- 1 | #See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. 2 | 3 | FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base 4 | WORKDIR /app 5 | EXPOSE 80 6 | EXPOSE 443 7 | 8 | FROM mcr.microsoft.com/dotnet/sdk:7.0.203-bullseye-slim AS build 9 | WORKDIR /src 10 | COPY ["BlazorFace.sln", "./"] 11 | COPY ["Directory.Build.props", "./"] 12 | COPY ["Directory.Packages.props", "./"] 13 | COPY ["src/DirectoryListingSourceGenerator/DirectoryListingSourceGenerator.csproj", "src/DirectoryListingSourceGenerator/"] 14 | COPY ["src/BlazorFace/BlazorFace.csproj", "src/BlazorFace/"] 15 | COPY ["src/BlazorFace.Web/BlazorFace.Web.csproj", "src/BlazorFace.Web/"] 16 | RUN dotnet restore "src/BlazorFace.Web/BlazorFace.Web.csproj" -p:NoAndroid=TRUE 17 | COPY . . 18 | RUN dotnet build "src/BlazorFace.Web/BlazorFace.Web.csproj" -p:NoAndroid=TRUE --no-restore -c Release -o /app/build 19 | 20 | FROM build AS publish 21 | RUN dotnet publish "src/BlazorFace.Web/BlazorFace.Web.csproj" -p:NoAndroid=TRUE --no-restore -c Release -o /app/publish /p:UseAppHost=false 22 | 23 | FROM base AS final 24 | WORKDIR /app 25 | COPY --from=publish /app/publish . 26 | ENTRYPOINT ["dotnet", "BlazorFace.Web.dll"] 27 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/Platforms/iOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | LSRequiresIPhoneOS 6 | 7 | UIDeviceFamily 8 | 9 | 1 10 | 2 11 | 12 | UIRequiredDeviceCapabilities 13 | 14 | arm64 15 | 16 | UISupportedInterfaceOrientations 17 | 18 | UIInterfaceOrientationPortrait 19 | UIInterfaceOrientationLandscapeLeft 20 | UIInterfaceOrientationLandscapeRight 21 | 22 | UISupportedInterfaceOrientations~ipad 23 | 24 | UIInterfaceOrientationPortrait 25 | UIInterfaceOrientationPortraitUpsideDown 26 | UIInterfaceOrientationLandscapeLeft 27 | UIInterfaceOrientationLandscapeRight 28 | 29 | XSAppIconAssets 30 | Assets.xcassets/appicon.appiconset 31 | 32 | 33 | -------------------------------------------------------------------------------- /src/BlazorFace/Extensions/GeometryExtensions.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Georg Jung. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | using SixLabors.ImageSharp; 5 | 6 | namespace BlazorFace.Extensions; 7 | 8 | internal static class GeometryExtensions 9 | { 10 | /// 11 | /// Returns a square that contains the given rectangle in it's middle. 12 | /// 13 | /// This rectangle's area should be in the center of the returned square. 14 | /// A square shaped area. 15 | internal static Rectangle GetMinimumSupersetSquare(this Rectangle rectangle) 16 | { 17 | var center = Rectangle.Center(rectangle); 18 | var longerEdge = Math.Max(rectangle.Width, rectangle.Height); 19 | var halfLongerEdge = (longerEdge + 1) / 2; // +1 => Floor 20 | var minSuperSquare = new Rectangle(center.X - halfLongerEdge, center.Y - halfLongerEdge, longerEdge, longerEdge); 21 | return minSuperSquare; 22 | } 23 | 24 | internal static Size Scale(this Size size, double factor) 25 | => new( 26 | (int)Math.Round(size.Width * factor), 27 | (int)Math.Round(size.Height * factor)); 28 | } 29 | -------------------------------------------------------------------------------- /media/image-with-3people.opt.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/BlazorFace.Web/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "http": { 4 | "commandName": "Project", 5 | "launchBrowser": true, 6 | "environmentVariables": { 7 | "ASPNETCORE_ENVIRONMENT": "Development" 8 | }, 9 | "dotnetRunMessages": true, 10 | "applicationUrl": "http://localhost:5268" 11 | }, 12 | "https": { 13 | "commandName": "Project", 14 | "launchBrowser": true, 15 | "environmentVariables": { 16 | "ASPNETCORE_ENVIRONMENT": "Development" 17 | }, 18 | "dotnetRunMessages": true, 19 | "applicationUrl": "https://localhost:7099;http://localhost:5268" 20 | }, 21 | "IIS Express": { 22 | "commandName": "IISExpress", 23 | "launchBrowser": true, 24 | "environmentVariables": { 25 | "ASPNETCORE_ENVIRONMENT": "Development" 26 | } 27 | }, 28 | "Docker": { 29 | "commandName": "Docker", 30 | "launchBrowser": true, 31 | "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}", 32 | "publishAllPorts": true, 33 | "useSSL": true 34 | } 35 | }, 36 | "iisSettings": { 37 | "windowsAuthentication": false, 38 | "anonymousAuthentication": true, 39 | "iisExpress": { 40 | "applicationUrl": "http://localhost:6405", 41 | "sslPort": 44358 42 | } 43 | } 44 | } -------------------------------------------------------------------------------- /src/BlazorFace/Services/SvgDrawer.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Georg Jung. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | using System.Text; 5 | using SixLabors.ImageSharp; 6 | 7 | namespace BlazorFace.Services 8 | { 9 | internal static class SvgDrawer 10 | { 11 | public static string DrawPoints(Rectangle viewbox, double pointSize, IEnumerable points, string additionalSvgAttributes) 12 | { 13 | var halfPointSize = pointSize / 2; 14 | var sb = new StringBuilder(); 15 | foreach (var p in points) 16 | { 17 | sb.Append(FormattableString.Invariant(@$" 18 | ")); 24 | } 25 | 26 | var svg = FormattableString.Invariant(@$" 27 | 33 | 34 | {sb} 35 | 36 | "); 37 | return svg; 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/MauiProgram.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Georg Jung. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | using BlazorFace.Services; 5 | using Microsoft.Extensions.Logging; 6 | 7 | namespace BlazorFace.Maui; 8 | 9 | public static class MauiProgram 10 | { 11 | public static MauiApp CreateMauiApp() 12 | { 13 | var builder = MauiApp.CreateBuilder(); 14 | builder 15 | .UseMauiApp() 16 | .ConfigureFonts(fonts => 17 | { 18 | fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); 19 | }); 20 | 21 | builder.Services.AddMauiBlazorWebView(); 22 | 23 | #if DEBUG 24 | builder.Services.AddBlazorWebViewDeveloperTools(); 25 | builder.Logging.AddDebug(); 26 | #endif 27 | 28 | BlazorFace.Startup.ConfigureBlazorFaceServices(builder.Services, builder.Configuration); 29 | #if ANDROID 30 | builder.Services.AddSingleton(); 31 | BlazorFace.Startup.AddBlazorFaceServices(builder.Services, new MauiResourceOpener()); 32 | #else 33 | builder.Services.AddSingleton(); 34 | BlazorFace.Startup.AddBlazorFaceServices(builder.Services); 35 | #endif 36 | 37 | return builder.Build(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/BlazorFace/Components/Bootstrap5ModalBase.razor: -------------------------------------------------------------------------------- 1 | 10 | 11 | @code { 12 | /// 13 | /// Could hold e.g. "modal-xl", "modal-sm", "modal-fullscreen-md-down". 14 | /// 15 | [Parameter] 16 | public string? ModalDialogExtraClass { get; set; } 17 | 18 | [Parameter] 19 | public RenderFragment? ChildContent { get; set; } 20 | 21 | public string? ModalTitle => BlazoredModal.Title; 22 | 23 | public ModalOptions ModalOptions => BlazoredModal.Options; 24 | 25 | [CascadingParameter] 26 | private BlazoredModalInstance BlazoredModal { get; set; } = default!; 27 | 28 | private bool _show = false; 29 | 30 | public async Task CloseAsync(ModalResult modalResult) 31 | { 32 | _show = false; 33 | await BlazoredModal.CloseAsync(modalResult); 34 | } 35 | 36 | protected override void OnAfterRender(bool firstRender) 37 | { 38 | if (firstRender) 39 | { 40 | _show = true; 41 | StateHasChanged(); 42 | } 43 | } 44 | 45 | protected virtual Task OnBackdropClicked() => CloseAsync(ModalResult.Cancel()); 46 | } 47 | -------------------------------------------------------------------------------- /src/BlazorFace/Shared/MainLayout.razor: -------------------------------------------------------------------------------- 1 | @inherits LayoutComponentBase 2 | 3 | BlazorFace 4 | 5 |
6 |
7 |
8 | @Body 9 |
10 |
11 |
12 | 13 | 40 | -------------------------------------------------------------------------------- /src/BlazorFace/Components/TryOut/AlignmentTryOut.razor: -------------------------------------------------------------------------------- 1 |

2 | If you're writing your own application, you can use the exact same face detection, face landmarks detection and face alignment mechanisms that are used in the demo above from your own code. 3 | The following example uses C# as programming language and leverages the FaceAiSharp library. 4 |

5 | 6 |
  • 7 | Replace the content of the Program.cs file with the following code:
    8 | 9 | using FaceAiSharp; 10 | using SixLabors.ImageSharp; 11 | using SixLabors.ImageSharp.PixelFormats; 12 | 13 | using var hc = new HttpClient(); 14 | var groupPhoto = await hc.GetByteArrayAsync( 15 | "https://raw.githubusercontent.com/georg-jung/FaceAiSharp/master/examples/obama_family.jpg"); 16 | var img = Image.Load<Rgb24>(groupPhoto); 17 | 18 | var det = FaceAiSharpBundleFactory.CreateFaceDetectorWithLandmarks(); 19 | var rec = FaceAiSharpBundleFactory.CreateFaceEmbeddingsGenerator(); 20 | 21 | var face = det.DetectFaces(img).First(); 22 | rec.AlignFaceUsingLandmarks(img, face.Landmarks!); 23 | img.Save("aligned.jpg"); 24 |
  • 25 |
  • 26 | Run the program you just created:
    27 | 28 | dotnet run 29 | 30 | Now you can find an aligned.jpg file in the same folder as the Program.cs file, which contains an aligned version of one of the faces in the photo. 31 |
  • 32 |
    33 | -------------------------------------------------------------------------------- /src/BlazorFace/wwwroot/highlight.js-11.7.0/LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2006, Ivan Sagalaev. 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | * Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | * Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | * Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /src/BlazorFace.Web/Pages/Error.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model BlazorFace.Pages.ErrorModel 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Error 11 | 12 | 13 | 14 | 15 | 16 |
    17 |
    18 |

    Error.

    19 |

    An error occurred while processing your request.

    20 | 21 | @if (Model.ShowRequestId) 22 | { 23 |

    24 | Request ID: @Model.RequestId 25 |

    26 | } 27 | 28 |

    Development Mode

    29 |

    30 | Swapping to the Development environment displays detailed information about the error that occurred. 31 |

    32 |

    33 | The Development environment shouldn't be enabled for deployed applications. 34 | It can result in displaying sensitive information from exceptions to end users. 35 | For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development 36 | and restarting the app. 37 |

    38 |
    39 |
    40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/BlazorFace/Services/CommonPrefixFilenameGrouper.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Georg Jung. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | using System.Collections; 5 | using System.Text.RegularExpressions; 6 | using Accord.Statistics.Filters; 7 | using BlazorFace.Extensions; 8 | 9 | namespace BlazorFace.Services; 10 | 11 | public partial class CommonPrefixFilenameGrouper : IFilenameGrouper 12 | { 13 | public IEnumerable> GroupFilenames(IReadOnlyCollection filenames) 14 | { 15 | var regex = ParseFilename(); 16 | var groups = filenames.GroupBy(x => regex.Match(Path.GetFileNameWithoutExtension(x)) switch 17 | { 18 | { Success: false } => null, 19 | Match m => m.Groups[1].Value, 20 | }); 21 | 22 | var grouped = new Dictionary>(); 23 | var nonGrouped = new List(); 24 | foreach (var g in groups) 25 | { 26 | var lst = g.Key is null || g.Count() <= 1 ? nonGrouped : grouped.GetOrAdd(g.Key); 27 | lst.AddRange(g); 28 | } 29 | 30 | if (nonGrouped.Count > 0) 31 | { 32 | yield return new Grouping(null, nonGrouped); 33 | } 34 | 35 | foreach (var (k, v) in grouped) 36 | { 37 | yield return new Grouping(k, v); 38 | } 39 | } 40 | 41 | [GeneratedRegex("^(.{3,}?)[\\.\\-_ ]?(\\d{1,8})$")] 42 | private static partial Regex ParseFilename(); 43 | 44 | private record Grouping(string? Key, IEnumerable Values) : IGrouping 45 | { 46 | public IEnumerator GetEnumerator() => Values.GetEnumerator(); 47 | 48 | IEnumerator IEnumerable.GetEnumerator() => Values.GetEnumerator(); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /.github/workflows/cron-docker-rebuild.yml: -------------------------------------------------------------------------------- 1 | name: Regular base image update check 2 | 3 | on: 4 | workflow_dispatch: 5 | #schedule: 6 | # - cron: '0 1 * * *' 7 | 8 | env: 9 | REGISTRY: ghcr.io 10 | IMAGE_NAME: ${{ github.repository }} 11 | BASE_IMAGE: mcr.microsoft.com/dotnet/aspnet:7.0 12 | 13 | jobs: 14 | check_base_image_updated: 15 | runs-on: ubuntu-latest 16 | permissions: 17 | contents: read 18 | packages: read 19 | outputs: 20 | image-needs-updating: ${{ steps.check.outputs.needs-updating }} 21 | build-ref: ${{ steps.latestrelease.outputs.releasetag }} 22 | steps: 23 | - name: Docker Image Update Checker 24 | id: check 25 | uses: georg-jung/docker-image-update-checker@main 26 | with: 27 | base-image: ${{ env.BASE_IMAGE }} 28 | image: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest 29 | github_token: ${{ secrets.GITHUB_TOKEN }} 30 | verbose: true 31 | - name: get latest release with tag 32 | id: latestrelease 33 | run: | 34 | echo "releasetag=$(curl --header 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' -s ${{ github.api_url }}/repos/${{ github.repository }}/releases/latest | jq '.tag_name' | sed 's/\"//g')" \ 35 | >> $GITHUB_OUTPUT 36 | if: steps.check.outputs.needs-updating == 'true' 37 | - name: echo release tag 38 | run: | 39 | echo ${{ steps.latestrelease.outputs.releasetag }} 40 | if: steps.check.outputs.needs-updating == 'true' 41 | call_rebuild: 42 | permissions: 43 | contents: read 44 | packages: write 45 | needs: check_base_image_updated 46 | if: ${{ needs.check_base_image_updated.outputs.image-needs-updating == 'true' }} 47 | uses: ./.github/workflows/docker-build-and-push.yml 48 | with: 49 | build-ref: ${{ needs.check_base_image_updated.outputs.build-ref }} 50 | -------------------------------------------------------------------------------- /src/BlazorFace/wwwroot/highlight.js-11.7.0/README.md: -------------------------------------------------------------------------------- 1 | # Highlight.js CDN Assets 2 | 3 | [![install size](https://packagephobia.now.sh/badge?p=highlight.js)](https://packagephobia.now.sh/result?p=highlight.js) 4 | 5 | **This package contains only the CDN build assets of highlight.js.** 6 | 7 | This may be what you want if you'd like to install the pre-built distributable highlight.js client-side assets via NPM. If you're wanting to use highlight.js mainly on the server-side you likely want the [highlight.js][1] package instead. 8 | 9 | To access these files via CDN:
    10 | https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@latest/build/ 11 | 12 | **If you just want a single .js file with the common languages built-in: 13 | ** 14 | 15 | --- 16 | 17 | ## Highlight.js 18 | 19 | Highlight.js is a syntax highlighter written in JavaScript. It works in 20 | the browser as well as on the server. It works with pretty much any 21 | markup, doesn’t depend on any framework, and has automatic language 22 | detection. 23 | 24 | If you'd like to read the full README:
    25 | 26 | 27 | ## License 28 | 29 | Highlight.js is released under the BSD License. See [LICENSE][7] file 30 | for details. 31 | 32 | ## Links 33 | 34 | The official site for the library is at . 35 | 36 | The Github project may be found at: 37 | 38 | Further in-depth documentation for the API and other topics is at 39 | . 40 | 41 | A list of the Core Team and contributors can be found in the [CONTRIBUTORS.md][8] file. 42 | 43 | [1]: https://www.npmjs.com/package/highlight.js 44 | [7]: https://github.com/highlightjs/highlight.js/blob/main/LICENSE 45 | [8]: https://github.com/highlightjs/highlight.js/blob/main/CONTRIBUTORS.md 46 | -------------------------------------------------------------------------------- /media/person-fill-perspective-warped.svg: -------------------------------------------------------------------------------- 1 | 2 | 16 | 18 | 37 | 40 | 41 | -------------------------------------------------------------------------------- /src/BlazorFace/Pages/Applications/Blur.razor: -------------------------------------------------------------------------------- 1 | @inherits ChooseSingleImageBase 2 | @page "/Demos/BlurFaces" 3 | @layout GoBackLayout 4 | 5 | @using FaceAiSharp; 6 | @using SixLabors.ImageSharp.PixelFormats; 7 | @using BlazorFace.Components 8 | 9 | @inject IJSRuntime JS 10 | @inject ObjectPool detectorPool 11 | 12 | Blur All Faces - Understanding Face Recognition 13 | 14 |
    15 |

    Demo: Blur All Faces

    16 |
    17 | 18 | @{ 19 | base.BuildRenderTree(__builder); 20 | } 21 | 22 |
    23 | 24 |
    25 | 26 | 27 |
    28 |
    29 | Non-commercial use only
    30 | The licenses of some of the models that can be used in this application do not allow their use for commercial purposes. The same applies accordingly to the outputs of the interactive demos. 31 |
    32 |
    33 | 34 | @code { 35 | private readonly string imgId = Guid.NewGuid().ToString("n"); 36 | 37 | protected override async Task Clear() 38 | { 39 | await base.Clear(); 40 | await JS.ClearImage(imgId); 41 | } 42 | 43 | protected override async Task OnImageLoadedAsync(Image image) 44 | { 45 | var det = detectorPool.Get(); 46 | 47 | try 48 | { 49 | #if ANDROID 50 | await Task.Run(() => FaceAiSharp.Applications.BlurFaces(det, image)); 51 | #else 52 | FaceAiSharp.Applications.BlurFaces(det, image); 53 | #endif 54 | await JS.SetImageStream(image, imgId); 55 | return null; 56 | } 57 | finally 58 | { 59 | detectorPool.Return(det); 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /.github/workflows/docker-build-and-push.yml: -------------------------------------------------------------------------------- 1 | name: Docker Push 2 | 3 | on: 4 | workflow_call: 5 | inputs: 6 | build-ref: 7 | required: true 8 | type: string 9 | workflow_dispatch: 10 | release: 11 | types: [published] 12 | 13 | env: 14 | REGISTRY: ghcr.io 15 | IMAGE_NAME: ${{ github.repository }} 16 | DOCKERFILE: src/BlazorFace.Web/Dockerfile 17 | 18 | jobs: 19 | 20 | build: 21 | runs-on: ubuntu-latest 22 | permissions: 23 | contents: read 24 | packages: write 25 | steps: 26 | - uses: actions/checkout@v3 27 | with: 28 | fetch-depth: 0 # avoid shallow clone so nbgv can do its work. 29 | ref: ${{ inputs.build-ref }} 30 | lfs: true 31 | - uses: dotnet/nbgv@v0.4 32 | id: nbgv 33 | - name: Set up Docker Buildx 34 | uses: docker/setup-buildx-action@v2 35 | - name: Log in to the Container registry 36 | uses: docker/login-action@v2 37 | with: 38 | registry: ${{ env.REGISTRY }} 39 | username: ${{ github.actor }} 40 | password: ${{ secrets.GITHUB_TOKEN }} 41 | - name: Extract metadata (tags, labels) for Docker 42 | id: meta 43 | uses: docker/metadata-action@v4 44 | with: 45 | images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} 46 | tags: | 47 | type=ref,event=branch 48 | type=semver,pattern={{version}} 49 | type=semver,pattern={{major}}.{{minor}} 50 | type=sha 51 | type=semver,pattern={{version}},value=${{ inputs.build-ref }} 52 | type=semver,pattern={{major}}.{{minor}},value=${{ inputs.build-ref }} 53 | type=raw,value=latest 54 | - name: Build and push Docker image 55 | uses: docker/build-push-action@v4 56 | with: 57 | context: . 58 | file: ${{ env.DOCKERFILE }} 59 | push: true 60 | tags: ${{ steps.meta.outputs.tags }} 61 | labels: ${{ steps.meta.outputs.labels }} 62 | -------------------------------------------------------------------------------- /src/BlazorFace/Components/TryOut/DetectionTryOut.razor: -------------------------------------------------------------------------------- 1 |

    2 | If you're writing your own application, you can use the exact same face detection mechanism that is used in the demo above from your own code. 3 | The following example uses C# as programming language and leverages the FaceAiSharp library. 4 |

    5 | 6 |
  • 7 | Replace the content of the Program.cs file with the following code:
    8 | 9 | using FaceAiSharp; 10 | using SixLabors.ImageSharp; 11 | using SixLabors.ImageSharp.PixelFormats; 12 | 13 | using var hc = new HttpClient(); 14 | var groupPhoto = await hc.GetByteArrayAsync( 15 | "https://raw.githubusercontent.com/georg-jung/FaceAiSharp/master/examples/obama_family.jpg"); 16 | var img = Image.Load<Rgb24>(groupPhoto); 17 | 18 | var det = FaceAiSharpBundleFactory.CreateFaceDetector(); 19 | var faces = det.DetectFaces(img); 20 | foreach (var face in faces) 21 | { 22 | Console.WriteLine($"Found a face with confidence {face.Confidence}: {face.Box}"); 23 | } 24 |
  • 25 |
  • 26 | Run the program you just created:
    27 | 28 | dotnet run 29 | 30 | You should see output similar to:
    31 | 32 | Found a face with confidence 0.89665085: RectangleF [ X=176.05847, Y=79.44571, Width=62.074905, Height=84.46396 ] 33 | Found a face with confidence 0.88412976: RectangleF [ X=454.50806, Y=88.49284, Width=65.97302, Height=78.17378 ] 34 | Found a face with confidence 0.8757608: RectangleF [ X=383.41547, Y=82.51477, Width=63.718292, Height=95.04758 ] 35 | Found a face with confidence 0.87154955: RectangleF [ X=249.2981, Y=103.57684, Width=57.793823, Height=83.17267 ] 36 |
  • 37 |
    38 | -------------------------------------------------------------------------------- /src/BlazorFace/Components/TryOut/RecognitionTryOut.razor: -------------------------------------------------------------------------------- 1 |

    2 | If you're writing your own application, you can use the exact same face recognition mechanism that is used in the demo above from your own code. 3 | The following example uses C# as programming language and leverages the FaceAiSharp library. 4 |

    5 | 6 |
  • 7 | Replace the content of the Program.cs file with the following code:
    8 | 9 | using FaceAiSharp; 10 | using SixLabors.ImageSharp; 11 | using SixLabors.ImageSharp.PixelFormats; 12 | 13 | using var hc = new HttpClient(); 14 | var groupPhoto = await hc.GetByteArrayAsync( 15 | "https://raw.githubusercontent.com/georg-jung/FaceAiSharp/master/examples/obama_family.jpg"); 16 | var img = Image.Load<Rgb24>(groupPhoto); 17 | 18 | var det = FaceAiSharpBundleFactory.CreateFaceDetectorWithLandmarks(); 19 | var rec = FaceAiSharpBundleFactory.CreateFaceEmbeddingsGenerator(); 20 | 21 | var face = det.DetectFaces(img).First(); 22 | rec.AlignFaceUsingLandmarks(img, face.Landmarks!); 23 | var embedding = rec.GenerateEmbedding(img); 24 | Console.WriteLine($"Generated an embedding for one face:\nn{string.Join("\t", embedding)}"); 25 |
  • 26 |
  • 27 | Run the program you just created:
    28 | 29 | dotnet run 30 | 31 | You should see output similar to:
    32 | 33 | Generated an embedding for one face: 34 | -0,029764613 0,13904491 -0,017976629 0,010621089 0,015310788 -0,077746354 35 | 0,026660273 -0,03839961 -0,06403088 0,023788495 -0,1461524 -0,010910285 36 | -0,001902924 -0,07354331 -0,06590692 0,09289711 0,0023482481 0,035271123 37 | <... more numbers between -1 and 1 ...> 38 |
  • 39 |
    40 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/Platforms/Windows/Package.appxmanifest: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 15 | 16 | 17 | $placeholder$ 18 | Georg Jung 19 | $placeholder$.png 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /src/DirectoryListingSourceGenerator/SourceGenerationHelper.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Georg Jung. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Text; 7 | 8 | namespace DirectoryListingSourceGenerator; 9 | 10 | internal static class SourceGenerationHelper 11 | { 12 | public const string AttributeNamespace = "DirectoryListingSourceGenerator"; 13 | 14 | public const string AttributeClass = "DirectoryListingAttribute"; 15 | 16 | public const string AttributeFullName = $"{AttributeNamespace}.{AttributeClass}"; 17 | 18 | public const string Attribute = $@" 19 | // 20 | // Copyright (c) Georg Jung. All rights reserved. 21 | // Licensed under the MIT license. 22 | 23 | using System; 24 | 25 | namespace {AttributeNamespace}; 26 | 27 | /// 28 | /// Use a partial method with as a return type to get a list of the files in the specified directory at compile time. 29 | /// Use a partial method with as a return type to get a list of the files in the subdirectories of the specified directory at compile time. 30 | /// 31 | [AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)] 32 | public class {AttributeClass} : Attribute 33 | {{ 34 | /// 35 | /// Initializes a new instance of the class. Annotate a partial method with this attribute to get a list of the files in the specified directory at compile time. 36 | /// 37 | /// The path to the directory to list. Absolute or relative to the source code file this attribute is used in. 38 | public DirectoryListingAttribute(string path) 39 | {{ 40 | Path = path; 41 | }} 42 | 43 | /// 44 | /// The path to the directory to list. Absolute or relative to the source code file this attribute is used in. 45 | /// 46 | public string Path {{ get; }} 47 | }} 48 | "; 49 | } 50 | -------------------------------------------------------------------------------- /src/BlazorFace/Media.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Georg Jung. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | using System.Reflection; 5 | using DirectoryListingSourceGenerator; 6 | using Markdig; 7 | 8 | namespace BlazorFace; 9 | 10 | public static partial class Media 11 | { 12 | #if ANDROID 13 | public static readonly string MediaDir = "wwwroot/media"; 14 | #else 15 | public static readonly string MediaDir = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)!, "wwwroot", "media"); 16 | #endif 17 | 18 | public static readonly string PortraitsDir = Path.Combine(MediaDir, "portraits"); 19 | 20 | public static readonly string GroupsDir = Path.Combine(MediaDir, "groups"); 21 | 22 | public static readonly string LfwDir = Path.Combine(MediaDir, "lfw"); 23 | 24 | private static readonly Lazy _sourcesHtml = new(() => Markdown.ToHtml(StaticResources.MediaSourcesMd)); 25 | 26 | private static readonly Lazy> _portraits = new(() => new List(PortraitsListing().Select(x => Path.Combine(PortraitsDir, x)))); 27 | 28 | private static readonly Lazy> _groups = new(() => new List(GroupsListing().Select(x => Path.Combine(GroupsDir, x)))); 29 | 30 | private static readonly Lazy> _lfwFaces = new(() => LfwFacesListing().ToDictionary(kvp => kvp.Key, kvp => kvp.Value.Select(x => Path.Combine(LfwDir, kvp.Key, x)).ToArray())); 31 | 32 | public static string SourcesHtml => _sourcesHtml.Value; 33 | 34 | public static IReadOnlyList Portraits => _portraits.Value; 35 | 36 | public static IReadOnlyList Groups => _groups.Value; 37 | 38 | public static IReadOnlyDictionary LfwFaces => _lfwFaces.Value; 39 | 40 | [DirectoryListing(@"../../media/portraits")] 41 | private static partial string[] PortraitsListing(); 42 | 43 | [DirectoryListing(@"../../media/groups")] 44 | private static partial string[] GroupsListing(); 45 | 46 | [DirectoryListing(@"../../media/lfw")] 47 | private static partial IReadOnlyDictionary LfwFacesListing(); 48 | } 49 | -------------------------------------------------------------------------------- /src/BlazorFace/wwwroot/highlight.js-11.7.0/languages/markdown.min.js: -------------------------------------------------------------------------------- 1 | /*! `markdown` grammar compiled for Highlight.js 11.7.0 */ 2 | (()=>{var e=(()=>{"use strict";return e=>{const n={begin:/<\/?[A-Za-z_]/, 3 | end:">",subLanguage:"xml",relevance:0},a={variants:[{begin:/\[.+?\]\[.*?\]/, 4 | relevance:0},{ 5 | begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, 6 | relevance:2},{ 7 | begin:e.regex.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), 8 | relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{ 9 | begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/ 10 | },{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0, 11 | returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)", 12 | excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[", 13 | end:"\\]",excludeBegin:!0,excludeEnd:!0}]},i={className:"strong",contains:[], 14 | variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}] 15 | },s={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{ 16 | begin:/_(?![_\s])/,end:/_/,relevance:0}]},c=e.inherit(i,{contains:[] 17 | }),t=e.inherit(s,{contains:[]});i.contains.push(t),s.contains.push(c) 18 | ;let g=[n,a];return[i,s,c,t].forEach((e=>{e.contains=e.contains.concat(g) 19 | })),g=g.concat(i,s),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ 20 | className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:g},{ 21 | begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", 22 | contains:g}]}]},n,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", 23 | end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:g, 24 | end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{ 25 | begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{ 26 | begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))", 27 | contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{ 28 | begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{ 29 | className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{ 30 | className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}})() 31 | ;hljs.registerLanguage("markdown",e)})(); -------------------------------------------------------------------------------- /src/BlazorFace/Pages/Applications/ProfilePicture.razor: -------------------------------------------------------------------------------- 1 | @inherits ChooseSingleImageBase 2 | @page "/Demos/ProfilePicture" 3 | @layout GoBackLayout 4 | 5 | @using FaceAiSharp; 6 | @using SixLabors.ImageSharp.PixelFormats; 7 | @using BlazorFace.Components 8 | 9 | @inject IJSRuntime JS 10 | @inject ObjectPool detectorPool 11 | 12 | Profile Picture Crop - Understanding Face Recognition 13 | 14 |
    15 |

    Demo: Profile Picture Crop

    16 |
    17 | 18 | @{ 19 | base.BuildRenderTree(__builder); 20 | } 21 | 22 |
    23 | 24 | 25 |
    26 | 27 |
    28 |
    29 | Non-commercial use only
    30 | The licenses of some of the models that can be used in this application do not allow their use for commercial purposes. The same applies accordingly to the outputs of the interactive demos. 31 |
    32 |
    33 | 34 | @code { 35 | private readonly string imgId = Guid.NewGuid().ToString("n"); 36 | private readonly string imgId2 = Guid.NewGuid().ToString("n"); 37 | 38 | protected override async Task Clear() 39 | { 40 | await base.Clear(); 41 | await JS.ClearImage(imgId); 42 | await JS.ClearImage(imgId2); 43 | } 44 | 45 | protected override async Task OnImageLoadedAsync(Image image) 46 | { 47 | var det = detectorPool.Get(); 48 | 49 | try 50 | { 51 | #if ANDROID 52 | await Task.Run(() => FaceAiSharp.Applications.CropProfilePicture(det, image)); 53 | #else 54 | FaceAiSharp.Applications.CropProfilePicture(det, image); 55 | #endif 56 | await JS.SetImageStream(image, imgId); 57 | await JS.SetImageStream(image, imgId2); 58 | return null; 59 | } 60 | catch (ArgumentException arg) 61 | { 62 | return arg.Message; 63 | } 64 | finally 65 | { 66 | detectorPool.Return(det); 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/BlazorFace/Components/Toc.razor: -------------------------------------------------------------------------------- 1 | 49 |
    50 | Chapters 51 |
    52 |
      53 |
    • 54 | What you'll learn 55 |
    • 56 |
    • 57 | Divide and Conquer 58 |
    • 59 |
    • 60 | Face Detection 61 |
    • 62 |
    • 63 | Face Alignment 64 |
    • 65 |
    • 66 | Face Recognition 67 |
    • 68 |
    • 69 | Dimensionality Reduction 70 |
    • 71 |
    • 72 | Comparing Faces 73 |
    • 74 |
    75 |
    76 | Home 77 |
    78 | -------------------------------------------------------------------------------- /src/BlazorFace/Components/TryOut/DirectComparisonTryOut.razor: -------------------------------------------------------------------------------- 1 |

    2 | If you're writing your own application, you can use the exact same face recognition mechanism that is used in the demo above from your own code. 3 | The following example uses C# as programming language and leverages the FaceAiSharp library. 4 |

    5 | 6 |
  • 7 | Replace the content of the Program.cs file with the following code:
    8 | 9 | using FaceAiSharp; 10 | using SixLabors.ImageSharp; 11 | using SixLabors.ImageSharp.PixelFormats; 12 | 13 | using var hc = new HttpClient(); 14 | var groupPhoto = await hc.GetByteArrayAsync( 15 | "https://raw.githubusercontent.com/georg-jung/FaceAiSharp/master/examples/obama_family.jpg"); 16 | var img = Image.Load<Rgb24>(groupPhoto); 17 | 18 | var det = FaceAiSharpBundleFactory.CreateFaceDetectorWithLandmarks(); 19 | var rec = FaceAiSharpBundleFactory.CreateFaceEmbeddingsGenerator(); 20 | 21 | var faces = det.DetectFaces(img); 22 | var first = faces.First(); 23 | var second = faces.Skip(1).First(); 24 | 25 | // AlignFaceUsingLandmarks is an in-place operation so we need to create a clone of img first 26 | var secondImg = img.Clone(); 27 | rec.AlignFaceUsingLandmarks(img, first.Landmarks!); 28 | rec.AlignFaceUsingLandmarks(secondImg, second.Landmarks!); 29 | 30 | var embedding1 = rec.GenerateEmbedding(img); 31 | var embedding2 = rec.GenerateEmbedding(secondImg); 32 | 33 | var dot = FaceAiSharp.Extensions.GeometryExtensions.Dot(embedding1, embedding2); 34 | 35 | Console.WriteLine($"Dot product: {dot}"); 36 | if (dot >= 0.42) 37 | { 38 | Console.WriteLine("Assessment: Both pictures show the same person."); 39 | } 40 | else if (dot > 0.28 && dot < 0.42) 41 | { 42 | Console.WriteLine("Assessment: Hard to tell if the pictures show the same person."); 43 | } 44 | else if (dot <= 0.28) 45 | { 46 | Console.WriteLine("Assessment: These are two different people."); 47 | } 48 |
  • 49 |
  • 50 | Run the program you just created:
    51 | 52 | dotnet run 53 | 54 | You should see output similar to:
    55 | 56 | Dot product: 0,21705234 57 | Assessment: These are two different people. 58 |
  • 59 |
    60 | -------------------------------------------------------------------------------- /src/BlazorFace/Pages/Tutorial/FaceDetection.razor: -------------------------------------------------------------------------------- 1 | @page "/FaceDetection" 2 | Face Detection - Understanding Face Recognition 3 | 4 |
    5 |

    Face Detection

    6 |

    7 | In the beginning, there is an image that we get as input. We know about it only simple parameters like the dimensions. We first have to find out whether there is a face at all or perhaps even several. If we have found faces, we know where they are located in the image, so that we can create appropriate crops. 8 |

    9 |
    10 | 12 |
    13 | 14 |
    15 |
    16 | Live Demo: Face Detection 17 |
    18 |
    19 | 20 |
    21 |
    22 | 23 |

    24 | Now that we've cropped the faces out of our input image, we can move on to face recognition, right? 25 | While we could do that, and it would work to a certain extent, there's one more step in the middle 26 | that will greatly improve our recognition result: Aligning the face. 27 |

    28 | 29 |

    Hands-on examples

    30 |

    31 | Face recognition may be more impressive than just finding faces. Nevertheless, there are quite 32 | some useful practical applications that we can already implement at this point. To see what you 33 | can do with face detection only, check out some of our demos: 34 |

    35 | 36 | 41 | 42 |

    Try this yourself

    43 | 44 | 45 | 46 | 47 | 55 |
    56 | 57 | 58 | -------------------------------------------------------------------------------- /src/BlazorFace/Components/ChooseGalleryImageModal.razor: -------------------------------------------------------------------------------- 1 | 2 | 32 | 38 | 39 | 40 | @code { 41 | private Bootstrap5Modal? _modal; 42 | 43 | private Task Close() => _modal!.CloseAsync(ModalResult.Cancel()); 44 | 45 | private Task Chosen(string file) => _modal!.CloseAsync(ModalResult.Ok(file)); 46 | } 47 | -------------------------------------------------------------------------------- /THIRD-PARTY-NOTICES.TXT: -------------------------------------------------------------------------------- 1 | The attached notices are provided for information only. 2 | 3 | License notice for Microsoft.ML.OnnxRuntime 4 | ------------------------------------------- 5 | 6 | MIT License 7 | 8 | Copyright (c) Microsoft Corporation 9 | 10 | Permission is hereby granted, free of charge, to any person obtaining a copy 11 | of this software and associated documentation files (the "Software"), to deal 12 | in the Software without restriction, including without limitation the rights 13 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | copies of the Software, and to permit persons to whom the Software is 15 | furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be included in all 18 | copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26 | SOFTWARE. 27 | 28 | 29 | License notice for FaceONNX 30 | --------------------------- 31 | 32 | MIT License 33 | 34 | Copyright (c) 2022 FaceONNX 35 | 36 | Permission is hereby granted, free of charge, to any person obtaining a copy 37 | of this software and associated documentation files (the "Software"), to deal 38 | in the Software without restriction, including without limitation the rights 39 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 40 | copies of the Software, and to permit persons to whom the Software is 41 | furnished to do so, subject to the following conditions: 42 | 43 | The above copyright notice and this permission notice shall be included in all 44 | copies or substantial portions of the Software. 45 | 46 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 47 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 48 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 49 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 50 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 51 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 52 | SOFTWARE. 53 | -------------------------------------------------------------------------------- /media/deepinsight-targetpoints.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 36 | 38 | 42 | 49 | 56 | 63 | 70 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /src/BlazorFace/Components/DimensionalityReductionDemo.razor: -------------------------------------------------------------------------------- 1 | @inherits ChooseImageGroupBase 2 | 3 | @using FaceAiSharp; 4 | @using SixLabors.ImageSharp.PixelFormats; 5 | 6 | @inject IJSRuntime JS 7 | @inject ObjectPool detectorPool 8 | @inject ObjectPool embGenPool 9 | 10 | @{ 11 | base.BuildRenderTree(__builder); 12 | } 13 | 14 | @if (!IsProcessing) 15 | { 16 |
    17 | 18 |
    19 | } 20 | 21 | @code { 22 | private readonly string imgId = Guid.NewGuid().ToString("n"); 23 | 24 | private readonly List _alignedFaces = new(); 25 | private readonly List _embeddings = new(); 26 | private readonly List _fileNames = new(); 27 | 28 | public Task ClearDemo() => Clear(); 29 | 30 | protected override async Task Clear() 31 | { 32 | _alignedFaces.Clear(); 33 | _embeddings.Clear(); 34 | _fileNames.Clear(); 35 | await base.Clear(); 36 | StateHasChanged(); 37 | } 38 | 39 | protected override async Task OnImageLoadedAsync(Image image, string fileName) 40 | { 41 | #if ANDROID 42 | return await Task.Run(() => OnImageLoadedAsyncImpl(image, fileName)); 43 | #else 44 | return await OnImageLoadedAsyncImpl(image, fileName); 45 | #endif 46 | } 47 | 48 | private Task OnImageLoadedAsyncImpl(Image image, string fileName) 49 | { 50 | var det = detectorPool.Get(); 51 | var embGen = embGenPool.Get(); 52 | try 53 | { 54 | var detection = det.DetectFaces(image); 55 | if (detection.Count == 0) 56 | { 57 | return Task.FromResult($"{fileName} was skipped because no face was found."); 58 | } 59 | 60 | var first = detection.First(); 61 | var lmrks = first.Landmarks ?? throw new InvalidOperationException("Face detection with landmarks is required."); 62 | 63 | embGen.AlignFaceUsingLandmarks(image, first.Landmarks); 64 | var emb = embGen.GenerateEmbedding(image); 65 | _embeddings.Add(emb); 66 | 67 | using var ms = new MemoryStream(); 68 | image.SaveAsJpeg(ms); 69 | _alignedFaces.Add(ms.ToArray()); 70 | 71 | _fileNames.Add(fileName); 72 | 73 | return Task.FromResult(null); 74 | } 75 | finally 76 | { 77 | detectorPool.Return(det); 78 | embGenPool.Return(embGen); 79 | } 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /src/BlazorFace.Web/Program.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Georg Jung. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | using System.Reflection; 5 | using Blazored.Modal; 6 | using BlazorFace.Services; 7 | using Microsoft.Extensions.FileProviders; 8 | 9 | namespace BlazorFace.Web 10 | { 11 | public class Program 12 | { 13 | public static void Main(string[] args) 14 | { 15 | var builder = WebApplication.CreateBuilder(args); 16 | 17 | ConfigureBlazorFaceServices(builder); 18 | 19 | // Add services to the container. 20 | builder.Services.AddRazorPages(); 21 | builder.Services.AddServerSideBlazor(); 22 | 23 | builder.Services.AddSingleton(); 24 | 25 | BlazorFace.Startup.ShowTryLocallySection = true; 26 | BlazorFace.Startup.AddBlazorFaceServices(builder.Services); 27 | 28 | // Add the following line: 29 | builder.WebHost.UseSentry(o => 30 | { 31 | o.TracesSampleRate = 1.0; 32 | }); 33 | 34 | var app = builder.Build(); 35 | 36 | // Configure the HTTP request pipeline. 37 | if (!app.Environment.IsDevelopment()) 38 | { 39 | app.UseExceptionHandler("/Error"); 40 | 41 | // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. 42 | app.UseHsts(); 43 | } 44 | 45 | if (app.Environment.IsDevelopment()) 46 | { 47 | // this is required because the media folder that is just linked into the wwwroot 48 | // will not be copied in debug builds. 49 | app.UseStaticFiles(new StaticFileOptions 50 | { 51 | FileProvider = new PhysicalFileProvider( 52 | Path.Combine(builder.Environment.ContentRootPath, @"../../media")), 53 | RequestPath = "/media", 54 | }); 55 | } 56 | 57 | app.UseHttpsRedirection(); 58 | 59 | app.UseStaticFiles(); 60 | 61 | app.UseRouting(); 62 | 63 | app.UseSentryTracing(); 64 | 65 | app.MapBlazorHub(); 66 | app.MapFallbackToPage("/_Host"); 67 | 68 | app.Run(); 69 | } 70 | 71 | public static void ConfigureBlazorFaceServices(WebApplicationBuilder builder) 72 | => BlazorFace.Startup.ConfigureBlazorFaceServices(builder.Services, builder.Configuration); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /Directory.Build.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Debug 5 | $([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)')) 6 | $(RepoRootPath)obj\$(MSBuildProjectName)\ 7 | $(RepoRootPath)bin\$(MSBuildProjectName)\ 8 | $(RepoRootPath)bin\Packages\$(Configuration)\ 9 | 11.0 10 | enable 11 | latest 12 | true 13 | true 14 | 15 | 16 | $(MSBuildThisFileDirectory) 17 | 18 | 19 | embedded 20 | 21 | Georg Jung 22 | Georg Jung 23 | © Georg Jung. All rights reserved. 24 | 25 | true 26 | true 27 | true 28 | snupkg 29 | 30 | true 31 | true 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | https://github.com/georg-jung/explain-face-rec/releases/tag/v$(Version) 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/wwwroot/css/app.css: -------------------------------------------------------------------------------- 1 | #blazor-error-ui { 2 | background: lightyellow; 3 | bottom: 0; 4 | box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); 5 | display: none; 6 | left: 0; 7 | padding: 0.6rem 1.25rem 0.7rem 1.25rem; 8 | position: fixed; 9 | width: 100%; 10 | z-index: 1000; 11 | } 12 | 13 | #blazor-error-ui .dismiss { 14 | cursor: pointer; 15 | position: absolute; 16 | right: 0.75rem; 17 | top: 0.5rem; 18 | } 19 | 20 | .blazor-error-boundary { 21 | background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; 22 | padding: 1rem 1rem 1rem 3.7rem; 23 | color: white; 24 | } 25 | 26 | .blazor-error-boundary::after { 27 | content: "An error has occurred." 28 | } 29 | 30 | .status-bar-safe-area { 31 | display: none; 32 | } 33 | 34 | @supports (-webkit-touch-callout: none) { 35 | .status-bar-safe-area { 36 | display: flex; 37 | position: sticky; 38 | top: 0; 39 | height: env(safe-area-inset-top); 40 | background-color: #f7f7f7; 41 | width: 100%; 42 | z-index: 1; 43 | } 44 | 45 | .flex-column, .navbar-brand { 46 | padding-left: env(safe-area-inset-left); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/BlazorFace/BlazorFace.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net7.0;net7.0-android 5 | net7.0 6 | enable 7 | enable 8 | / 9 | true 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | wwwroot\media\%(RecursiveDir)%(Filename)%(Extension) 42 | PreserveNewest 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | True 53 | True 54 | StaticResources.resx 55 | 56 | 57 | 58 | 59 | 60 | ResXFileCodeGenerator 61 | StaticResources.Designer.cs 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | # Ensure bash shell scripts use LF line endings 7 | *.sh eol=lf 8 | 9 | ############################################################################### 10 | # Set default behavior for command prompt diff. 11 | # 12 | # This is need for earlier builds of msysgit that does not have it on by 13 | # default for csharp files. 14 | # Note: This is only used by command line 15 | ############################################################################### 16 | #*.cs diff=csharp 17 | 18 | ############################################################################### 19 | # Set the merge driver for project and solution files 20 | # 21 | # Merging from the command prompt will add diff markers to the files if there 22 | # are conflicts (Merging from VS is not affected by the settings below, in VS 23 | # the diff markers are never inserted). Diff markers may cause the following 24 | # file extensions to fail to load in VS. An alternative would be to treat 25 | # these files as binary and thus will always conflict and require user 26 | # intervention with every merge. To do so, just uncomment the entries below 27 | ############################################################################### 28 | #*.sln merge=binary 29 | #*.csproj merge=binary 30 | #*.vbproj merge=binary 31 | #*.vcxproj merge=binary 32 | #*.vcproj merge=binary 33 | #*.dbproj merge=binary 34 | #*.fsproj merge=binary 35 | #*.lsproj merge=binary 36 | #*.wixproj merge=binary 37 | #*.modelproj merge=binary 38 | #*.sqlproj merge=binary 39 | #*.wwaproj merge=binary 40 | 41 | ############################################################################### 42 | # behavior for image files 43 | # 44 | # image files are treated as binary by default. 45 | ############################################################################### 46 | #*.jpg binary 47 | #*.png binary 48 | #*.gif binary 49 | 50 | ############################################################################### 51 | # diff behavior for common document formats 52 | # 53 | # Convert binary document formats to text before diffing them. This feature 54 | # is only available from the command line. Turn it on by uncommenting the 55 | # entries below. 56 | ############################################################################### 57 | #*.doc diff=astextplain 58 | #*.DOC diff=astextplain 59 | #*.docx diff=astextplain 60 | #*.DOCX diff=astextplain 61 | #*.dot diff=astextplain 62 | #*.DOT diff=astextplain 63 | #*.pdf diff=astextplain 64 | #*.PDF diff=astextplain 65 | #*.rtf diff=astextplain 66 | #*.RTF diff=astextplain 67 | -------------------------------------------------------------------------------- /.github/workflows/maui.yml: -------------------------------------------------------------------------------- 1 | name: MAUI Build 2 | 3 | on: 4 | workflow_dispatch: 5 | release: 6 | types: [published] 7 | 8 | env: 9 | DOTNET_NOLOGO: true 10 | DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true 11 | DOTNET_GENERATE_ASPNET_CERTIFICATE: false 12 | 13 | jobs: 14 | build-windows: 15 | runs-on: windows-2022 16 | permissions: 17 | contents: read 18 | steps: 19 | - uses: actions/checkout@v3 20 | with: 21 | fetch-depth: 0 # avoid shallow clone so nbgv can do its work. 22 | lfs: true 23 | - uses: dotnet/nbgv@v0.4 24 | id: nbgv 25 | - name: Update appxmanifest with nbgv version 26 | shell: pwsh 27 | run: | 28 | # Update appxmanifest. This must be done before build. 29 | [xml]$manifest= get-content "src/BlazorFace.Maui/Platforms/Windows/Package.appxmanifest" 30 | $manifest.Package.Identity.Version = "${{ steps.nbgv.outputs.SimpleVersion }}.0" 31 | $manifest.save("src/BlazorFace.Maui/Platforms/Windows/Package.appxmanifest") 32 | - name: Install MAUI Workload 33 | run: dotnet workload install maui-windows android --ignore-failed-sources 34 | - run: dotnet restore src/BlazorFace.Maui/BlazorFace.Maui.csproj -p:NoAndroid=TRUE -p:PublishReadyToRun=true 35 | - run: dotnet publish src/BlazorFace.Maui/BlazorFace.Maui.csproj -p:NoAndroid=TRUE -f net7.0-windows10.0.19041.0 -c Release --no-restore 36 | - uses: actions/upload-artifact@v3 37 | with: 38 | name: blazorface-maui-windows-${{ steps.nbgv.outputs.Version }} 39 | path: bin/BlazorFace.Maui/**/AppPackages/**/* 40 | 41 | build-android: 42 | runs-on: ubuntu-22.04 43 | permissions: 44 | contents: read 45 | steps: 46 | - uses: actions/checkout@v3 47 | with: 48 | fetch-depth: 0 # avoid shallow clone so nbgv can do its work. 49 | lfs: true 50 | - uses: dotnet/nbgv@v0.4 51 | id: nbgv 52 | - name: Install MAUI Workload 53 | run: dotnet workload install maui-android --ignore-failed-sources 54 | - run: dotnet restore src/BlazorFace.Maui/BlazorFace.Maui.csproj -p:PublishReadyToRun=true 55 | - name: Retrieve android keystore secret and decode it to a file 56 | env: 57 | KEYSTORE_FILE_BASE64: ${{ secrets.KEYSTORE_FILE_BASE64 }} 58 | run: | 59 | echo $KEYSTORE_FILE_BASE64 | base64 --decode > key.keystore 60 | cp key.keystore src/BlazorFace.Maui/ 61 | - run: dotnet publish src/BlazorFace.Maui/BlazorFace.Maui.csproj -f net7.0-android -c Release --no-restore -p:AndroidSigningStorePass=${{ secrets.KEYSTORE_PASSWORD }} -p:AndroidSigningKeyPass=${{ secrets.KEYSTORE_PASSWORD }} 62 | - uses: actions/upload-artifact@v3 63 | with: 64 | name: blazorface-maui-android-${{ steps.nbgv.outputs.Version }} 65 | path: bin/BlazorFace.Maui/Release/**/publish/*Signed.aab 66 | -------------------------------------------------------------------------------- /src/BlazorFace/Components/EmbeddingGenerationDemo.razor: -------------------------------------------------------------------------------- 1 | @inherits ChooseSingleImageBase 2 | 3 | @using FaceAiSharp; 4 | @using FaceAiSharp.Extensions; 5 | @using SixLabors.ImageSharp.Drawing.Processing; 6 | @using SixLabors.ImageSharp.PixelFormats; 7 | @using BlazorFace.Components 8 | 9 | @inject IJSRuntime JS 10 | @inject ObjectPool detectorPool 11 | @inject ObjectPool embGenPool 12 | 13 | @{ 14 | base.BuildRenderTree(__builder); 15 | } 16 | 17 |
    18 | 19 |
    20 | Aligned face used as input 21 |
    22 |
    27 | } 28 | 29 | @code { 30 | private readonly string imgId = Guid.NewGuid().ToString("n"); 31 | private bool _showFig = false; 32 | private float[]? _embeddings; 33 | 34 | protected override async Task Clear() 35 | { 36 | _embeddings = null; 37 | _showFig = false; 38 | await base.Clear(); 39 | } 40 | 41 | protected override async Task OnImageLoadedAsync(Image image) 42 | { 43 | #if ANDROID 44 | return await Task.Run(() => OnImageLoadedAsyncImpl(image)); 45 | #else 46 | return await OnImageLoadedAsyncImpl(image); 47 | #endif 48 | } 49 | 50 | private async Task OnImageLoadedAsyncImpl(Image image) 51 | { 52 | var det = detectorPool.Get(); 53 | var emb = embGenPool.Get(); 54 | 55 | try 56 | { 57 | var detections = det.DetectFaces(image); 58 | if (detections.Count == 0) 59 | { 60 | return "No faces could be found in this image."; 61 | } 62 | 63 | var first = detections.FirstOrDefault(); 64 | if (first.Landmarks is null || first.Landmarks.Count == 0) 65 | { 66 | throw new InvalidOperationException("Landmarks are required."); 67 | } 68 | 69 | ArcFaceEmbeddingsGenerator.AlignFaceUsingLandmarks(image, first.Landmarks, 255); 70 | 71 | _showFig = true; 72 | await InvokeAsync(async () => 73 | { 74 | await JS.SetImageStream(image, imgId); 75 | StateHasChanged(); 76 | }); 77 | 78 | _embeddings = emb.GenerateEmbedding(image); 79 | 80 | return null; 81 | } 82 | finally 83 | { 84 | embGenPool.Return(emb); 85 | detectorPool.Return(det); 86 | } 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/wwwroot/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Understanding Face Recognition 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
    19 | 20 |
    21 |
    22 |
    23 | Loading... 24 |
    25 |
    26 |
    27 | 28 |
    29 | An unhandled error has occurred. 30 | Reload 31 | 🗙 32 |
    33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /src/BlazorFace.Maui/Resources/Splash/splash_editable.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 36 | 38 | 43 | UnderstandingFaceRecognition 64 | 65 | 66 | -------------------------------------------------------------------------------- /src/BlazorFace.Web/Pages/_Host.cshtml: -------------------------------------------------------------------------------- 1 | @page "/" 2 | @using Microsoft.AspNetCore.Components.Web 3 | @namespace BlazorFace.Pages 4 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
    25 | 26 | An error has occurred. This application may no longer respond until reloaded. 27 | 28 | 29 | An unhandled exception has occurred. See browser dev tools for details. 30 | 31 | Reload 32 | 🗙 33 |
    34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /media/face-alignment.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 57 | -------------------------------------------------------------------------------- /media/image-with-3people.svg: -------------------------------------------------------------------------------- 1 | 2 | 40 | -------------------------------------------------------------------------------- /src/BlazorFace/wwwroot/highlight.js-11.7.0/languages/bash.min.js: -------------------------------------------------------------------------------- 1 | /*! `bash` grammar compiled for Highlight.js 11.7.0 */ 2 | (()=>{var e=(()=>{"use strict";return e=>{const s=e.regex,t={},n={begin:/\$\{/, 3 | end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]};Object.assign(t,{ 4 | className:"variable",variants:[{ 5 | begin:s.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},n]});const a={ 6 | className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},i={ 7 | begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/, 8 | end:/(\w+)/,className:"string"})]}},c={className:"string",begin:/"/,end:/"/, 9 | contains:[e.BACKSLASH_ESCAPE,t,a]};a.contains.push(c);const o={begin:/\$?\(\(/, 10 | end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,t] 11 | },r=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10 12 | }),l={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0, 13 | contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{ 14 | name:"Bash",aliases:["sh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/, 15 | keyword:["if","then","else","elif","fi","for","while","in","do","done","case","esac","function"], 16 | literal:["true","false"], 17 | built_in:["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset","alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","type","typeset","ulimit","unalias","set","shopt","autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp","chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"] 18 | },contains:[r,e.SHEBANG(),l,o,e.HASH_COMMENT_MODE,i,{match:/(\/[a-z._-]+)+/},c,{ 19 | className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},t]}}})() 20 | ;hljs.registerLanguage("bash",e)})(); -------------------------------------------------------------------------------- /src/BlazorFace/wwwroot/highlight.js-11.7.0/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@highlightjs/cdn-assets", 3 | "description": "Syntax highlighting with language autodetection. (pre-compiled CDN assets)", 4 | "keywords": [ 5 | "highlight", 6 | "syntax" 7 | ], 8 | "homepage": "https://highlightjs.org/", 9 | "version": "11.7.0", 10 | "author": "Josh Goebel ", 11 | "contributors": [ 12 | "Josh Goebel ", 13 | "Egor Rogov ", 14 | "Vladimir Jimenez ", 15 | "Ivan Sagalaev ", 16 | "Jeremy Hull ", 17 | "Oleg Efimov ", 18 | "Gidi Meir Morris ", 19 | "Jan T. Sott ", 20 | "Li Xuanji ", 21 | "Marcos Cáceres ", 22 | "Sang Dang " 23 | ], 24 | "bugs": { 25 | "url": "https://github.com/highlightjs/highlight.js/issues" 26 | }, 27 | "license": "BSD-3-Clause", 28 | "repository": { 29 | "type": "git", 30 | "url": "git://github.com/highlightjs/highlight.js.git" 31 | }, 32 | "sideEffects": [ 33 | "*.css", 34 | "*.scss" 35 | ], 36 | "scripts": { 37 | "mocha": "mocha", 38 | "lint": "eslint src/*.js src/lib/*.js demo/*.js tools/**/*.js --ignore-pattern vendor", 39 | "lint-languages": "eslint --no-eslintrc -c .eslintrc.lang.js src/languages/**/*.js", 40 | "build_and_test": "npm run build && npm run test", 41 | "build_and_test_browser": "npm run build-browser && npm run test-browser", 42 | "build": "node ./tools/build.js -t node", 43 | "build-cdn": "node ./tools/build.js -t cdn", 44 | "build-browser": "node ./tools/build.js -t browser :common", 45 | "test": "mocha test", 46 | "test-markup": "mocha test/markup", 47 | "test-detect": "mocha test/detect", 48 | "test-browser": "mocha test/browser", 49 | "test-parser": "mocha test/parser" 50 | }, 51 | "engines": { 52 | "node": ">=12.0.0" 53 | }, 54 | "devDependencies": { 55 | "@colors/colors": "^1.5.0", 56 | "@rollup/plugin-commonjs": "^22.0.0", 57 | "@rollup/plugin-json": "^4.1.0", 58 | "@rollup/plugin-node-resolve": "^13.3.0", 59 | "@types/mocha": "^9.1.1", 60 | "@typescript-eslint/eslint-plugin": "^5.27.1", 61 | "@typescript-eslint/parser": "^5.27.1", 62 | "clean-css": "^5.3.0", 63 | "cli-table": "^0.3.1", 64 | "commander": "9.3", 65 | "css": "^3.0.0", 66 | "css-color-names": "^1.0.1", 67 | "deep-freeze-es6": "^1.4.1", 68 | "del": "^6.1.1", 69 | "dependency-resolver": "^2.0.1", 70 | "eslint": "^8.17.0", 71 | "eslint-config-standard": "^17.0.0", 72 | "eslint-plugin-import": "^2.26.0", 73 | "eslint-plugin-node": "^11.1.0", 74 | "eslint-plugin-promise": "^6.0.0", 75 | "glob": "^7.2.3", 76 | "glob-promise": "^4.2.2", 77 | "handlebars": "^4.7.6", 78 | "jsdom": "^20.0.0", 79 | "lodash": "^4.17.20", 80 | "mocha": "^10.0.0", 81 | "refa": "^0.4.1", 82 | "rollup": "^2.47.0", 83 | "should": "^13.2.3", 84 | "terser": "^5.14.1", 85 | "tiny-worker": "^2.3.0", 86 | "typescript": "^4.7.3", 87 | "wcag-contrast": "^3.0.0" 88 | } 89 | } --------------------------------------------------------------------------------