diff --git a/Assets/SVG/AutoTrain.svg b/Assets/SVG/AutoTrain.svg new file mode 100644 index 0000000000000000000000000000000000000000..335841f636e60fabcbc034f13f9dfd771cebf163 --- /dev/null +++ b/Assets/SVG/AutoTrain.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 662 111"><defs><style>.cls-1{fill:#1a1a1a;}.cls-2{font-size:72px;fill:#f2f2f2;font-family:BloggerSans, Blogger Sans;}.cls-3{letter-spacing:0em;}.cls-4{letter-spacing:-0.01em;}.cls-5{letter-spacing:0em;}.cls-6{stroke:#000;stroke-miterlimit:10;stroke-width:5px;fill:url(#linear-gradient);}.cls-7{fill:url(#Orchid);}.cls-8{fill:url(#Orchid-2);}</style><linearGradient id="linear-gradient" x1="54.13" y1="65.95" x2="277.11" y2="65.95" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#66d6ff"/><stop offset="0.06" stop-color="#6fd1fc"/><stop offset="0.17" stop-color="#89c3f2"/><stop offset="0.31" stop-color="#b2aee3"/><stop offset="0.4" stop-color="#d39cd7"/><stop offset="0.99" stop-color="#f6ff6a"/></linearGradient><linearGradient id="Orchid" x1="49.57" y1="60.81" x2="58.43" y2="60.81" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ff7bac"/><stop offset="0.22" stop-color="#ff7bac" stop-opacity="0.76"/><stop offset="0.6" stop-color="#ff7bac" stop-opacity="0.36"/><stop offset="0.87" stop-color="#ff7bac" stop-opacity="0.1"/><stop offset="1" stop-color="#ff7bac" stop-opacity="0"/></linearGradient><linearGradient id="Orchid-2" x1="272.71" y1="56.47" x2="281.67" y2="56.47" xlink:href="#Orchid"/></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><rect class="cls-1" width="662" height="111" rx="45.5"/><text class="cls-2" transform="translate(331 77.2)">Au<tspan class="cls-3" x="76.17" y="0">t</tspan><tspan x="99.22" y="0">oT</tspan><tspan class="cls-4" x="167.4" y="0">r</tspan><tspan class="cls-5" x="191.16" y="0">ain</tspan></text><path class="cls-6" d="M54.13,60.67c5.33-8,16-19.73,29.57-22.65C139.83,26,143.78,84,183.94,93.67,202,98,235.65,98,277.11,56.56"/><circle class="cls-7" cx="54" cy="60.81" r="4.43"/><circle class="cls-8" cx="277.19" cy="56.47" r="4.48"/></g></g></svg> \ No newline at end of file diff --git a/Assets/BottomBar.svg b/Assets/SVG/BottomBar.svg similarity index 100% rename from Assets/BottomBar.svg rename to Assets/SVG/BottomBar.svg diff --git a/Assets/SVG/Collecting.svg b/Assets/SVG/Collecting.svg new file mode 100644 index 0000000000000000000000000000000000000000..a4fb0d6856b35e5675fd0daa00e58e581e74eada --- /dev/null +++ b/Assets/SVG/Collecting.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 141.5 50.05"><defs><style>.cls-1{fill:#ffd74f;stroke:#333;stroke-miterlimit:10;}.cls-2{font-size:23px;fill:#4d4d4d;font-family:OdinRounded-Light, Odin Rounded;font-weight:300;letter-spacing:0em;}.cls-3{letter-spacing:0.05em;}</style></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><rect class="cls-1" x="0.5" y="0.5" width="140.5" height="31.5" rx="13.87"/><text class="cls-2" transform="translate(7.58 23.99) scale(0.95 1)">C<tspan class="cls-3" x="14.33" y="0">OLL</tspan><tspan x="55.87" y="0">E</tspan><tspan class="cls-3" x="67.67" y="0">CTING</tspan></text></g></g></svg> \ No newline at end of file diff --git a/Assets/SVG/FastTrack.svg b/Assets/SVG/FastTrack.svg new file mode 100644 index 0000000000000000000000000000000000000000..9b74bd7997d705b297c923ee88d7848b4478b4ae --- /dev/null +++ b/Assets/SVG/FastTrack.svg @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 25.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 1366 768" style="enable-background:new 0 0 1366 768;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:#1A1A1A;} + .st1{fill:none;} + .st2{fill:#F2F2F2;} + .st3{font-family:'BloggerSans';} + .st4{font-size:72px;} + .st5{fill:url(#SVGID_1_);stroke:#000000;stroke-width:5;stroke-miterlimit:10;} + .st6{fill:url(#SVGID_2_);} + .st7{fill:url(#SVGID_3_);} + .st8{fill:#FFCC99;} +</style> +<g> + <path class="st0" d="M968.5,444h-571c-25.1,0-45.5-20.4-45.5-45.5v-20c0-25.1,20.4-45.5,45.5-45.5h571c25.1,0,45.5,20.4,45.5,45.5 + v20C1014,423.6,993.6,444,968.5,444z"/> +</g> +<rect x="683" y="358" class="st1" width="314" height="60"/> +<text transform="matrix(1 0 0 1 683 410.1992)" class="st2 st3 st4">AutoTrain</text> +<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="406.1263" y1="398.9493" x2="629.1129" y2="398.9493"> + <stop offset="0" style="stop-color:#66D6FF"/> + <stop offset="6.399725e-02" style="stop-color:#6FD1FC"/> + <stop offset="0.1704" style="stop-color:#89C3F2"/> + <stop offset="0.3052" style="stop-color:#B2AEE3"/> + <stop offset="0.3998" style="stop-color:#D39CD7"/> + <stop offset="0.9944" style="stop-color:#F6FF6A"/> +</linearGradient> +<path class="st5" d="M406.1,393.7c5.3-8,16-19.7,29.6-22.6c56.1-12.1,60.1,46,100.2,55.6c18,4.3,51.7,4.3,93.2-37.1"/> +<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="401.5714" y1="393.8084" x2="410.4339" y2="393.8084"> + <stop offset="0" style="stop-color:#FF7BAC"/> + <stop offset="1" style="stop-color:#FF7BAC;stop-opacity:0"/> +</linearGradient> +<circle class="st6" cx="406" cy="393.8" r="4.4"/> +<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="624.7101" y1="389.4715" x2="633.6678" y2="389.4715"> + <stop offset="0" style="stop-color:#FF7BAC"/> + <stop offset="1" style="stop-color:#FF7BAC;stop-opacity:0"/> +</linearGradient> +<circle class="st7" cx="629.2" cy="389.5" r="4.5"/> +<g> + <path class="st0" d="M968.5,253h-571c-25.1,0-45.5-20.4-45.5-45.5v-20c0-25.1,20.4-45.5,45.5-45.5h571c25.1,0,45.5,20.4,45.5,45.5 + v20C1014,232.6,993.6,253,968.5,253z"/> +</g> +<rect x="683" y="167.6" class="st1" width="273" height="60"/> +<text transform="matrix(1 0 0 1 682.9988 219.7927)"><tspan x="0" y="0" class="st2 st3 st4">Fast</tspan><tspan x="121.2" y="0" class="st2 st3 st4">-</tspan></text> +<path class="st8" d="M410.7,237L410.7,237c7,0,12.7-5.7,12.7-12.7v-53.6c0-7-5.7-12.7-12.7-12.7h0c-7,0-12.7,5.7-12.7,12.7v53.6 + C398,231.3,403.7,237,410.7,237z"/> +<path class="st8" d="M443.4,237L443.4,237c7,0,12.7-5.7,12.7-12.7v-53.6c0-7-5.7-12.7-12.7-12.7h0c-7,0-12.7,5.7-12.7,12.7v53.6 + C430.7,231.3,436.3,237,443.4,237z"/> +<path class="st8" d="M476,237L476,237c7,0,12.7-5.7,12.7-12.7v-53.6c0-7-5.7-12.7-12.7-12.7h0c-7,0-12.7,5.7-12.7,12.7v53.6 + C463.3,231.3,469,237,476,237z"/> +<path class="st8" d="M530.4,237L530.4,237c7,0,12.7-5.7,12.7-12.7v-53.6c0-7-5.7-12.7-12.7-12.7l0,0c-7,0-12.7,5.7-12.7,12.7v53.6 + C517.7,231.3,523.4,237,530.4,237z"/> +<path class="st8" d="M584.9,237L584.9,237c7,0,12.7-5.7,12.7-12.7v-53.6c0-7-5.7-12.7-12.7-12.7h0c-7,0-12.7,5.7-12.7,12.7v53.6 + C572.2,231.3,577.9,237,584.9,237z"/> +<path class="st8" d="M639.3,237L639.3,237c7,0,12.7-5.7,12.7-12.7v-53.6c0-7-5.7-12.7-12.7-12.7l0,0c-7,0-12.7,5.7-12.7,12.7v53.6 + C626.6,231.3,632.3,237,639.3,237z"/> +</svg> diff --git a/Assets/SVG/Asset 2.svg b/Assets/SVG/LogoStart.svg similarity index 100% rename from Assets/SVG/Asset 2.svg rename to Assets/SVG/LogoStart.svg diff --git a/Assets/SVG/MainLogo.svg b/Assets/SVG/MainLogo.svg new file mode 100644 index 0000000000000000000000000000000000000000..407cafa079e76912445586bdd2fd99ecc844a2a2 --- /dev/null +++ b/Assets/SVG/MainLogo.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 812 812"><defs><style>.cls-1{fill:#130f55;}.cls-2{fill:url(#linear-gradient);}</style><linearGradient id="linear-gradient" x1="70.59" y1="405.33" x2="740.93" y2="405.33" gradientTransform="translate(-1.75 2.14) rotate(-0.25)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#db589a" stop-opacity="0.9"/><stop offset="0.13" stop-color="#d261a2" stop-opacity="0.91"/><stop offset="0.33" stop-color="#ba78b6" stop-opacity="0.93"/><stop offset="0.6" stop-color="#939fd8" stop-opacity="0.96"/><stop offset="0.87" stop-color="#6cf"/></linearGradient></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><rect class="cls-1" width="812" height="812" rx="96.5"/><path class="cls-2" d="M128.79,248.7c22.2-9.46,43.08-5.64,71-.31,34.42,6.57,63.46,22.49,78.13,30.66,7.43,4.14,12.67,7.29,18.78,11.3,24.73,16.23,41.62,33.3,110.63,83.14,10,7.22,14.93,10.9,18.06,12.93,9.3,6,101.08,63.72,181.13,31.21,37.28-15.14,43.41-38.21,73.85-36.32,20.62,1.29,44.47,13.53,55.15,35.76,12.16,25.28,1.21,50.8-2.74,60-7.09,16.53-18.41,29.05-32.82,40.14C617.82,580.45,516,568,516,568s-78.31-9.58-144.09-61.35c-5.24-4.13-21.86-15.44-44.15-33.81a358.85,358.85,0,0,0-52.09-35.78s-62.88-32.73-109.21-32.52c0,0-22.79,0-23,.09h0c-22.77,3.23-29.75,13.85-40.94,12.18-17.77-2.65-26.84-33.39-28.17-37.88C61.53,335.49,79.48,269.7,128.79,248.7Z"/></g></g></svg> \ No newline at end of file diff --git a/Assets/SVG/NotCollecting.svg b/Assets/SVG/NotCollecting.svg new file mode 100644 index 0000000000000000000000000000000000000000..f159fa8df6e47d34bbf4a1b9571d8a8ca754e9cf --- /dev/null +++ b/Assets/SVG/NotCollecting.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 141.5 50.05"><defs><style>.cls-1{fill:#1a1a1a;stroke:#666;stroke-miterlimit:10;}.cls-2{font-size:23px;fill:#4d4d4d;font-family:OdinRounded-Light, Odin Rounded;font-weight:300;letter-spacing:0em;}.cls-3{letter-spacing:0.05em;}</style></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><rect class="cls-1" x="0.5" y="0.5" width="140.5" height="31.5" rx="13.87"/><text class="cls-2" transform="translate(6.58 23.99) scale(0.95 1)">C<tspan class="cls-3" x="14.33" y="0">OLL</tspan><tspan x="55.87" y="0">E</tspan><tspan class="cls-3" x="67.67" y="0">CTING</tspan></text></g></g></svg> \ No newline at end of file diff --git a/Assets/TopBar.svg b/Assets/SVG/TopBar.svg similarity index 100% rename from Assets/TopBar.svg rename to Assets/SVG/TopBar.svg diff --git a/Assets/readme/AutoTrain.png b/Assets/readme/AutoTrain.png new file mode 100644 index 0000000000000000000000000000000000000000..3cee14d8b7d352eae271bf40ca8b449b3a1c14b1 Binary files /dev/null and b/Assets/readme/AutoTrain.png differ diff --git a/Assets/readme/Collecting1.gif b/Assets/readme/Collecting1.gif index e2840bcc5951e83e68042bb1eb1903b0ef526638..7bc533f0870513b07ed73e33ec38aee1b162e97a 100644 Binary files a/Assets/readme/Collecting1.gif and b/Assets/readme/Collecting1.gif differ diff --git a/Assets/readme/Collecting2.gif b/Assets/readme/Collecting2.gif index d8f6076edaf8396de99c2eec5e7653f803e354bf..2c874d162024cead79bf6470e26c040410d60345 100644 Binary files a/Assets/readme/Collecting2.gif and b/Assets/readme/Collecting2.gif differ diff --git a/Assets/readme/Detect1.gif b/Assets/readme/Detect1.gif index 9c2b1b49a9eeba6273e5b2bf388672ba8fbb22ac..1d6b46e7316b309bc29222bbe804b03f4c2afeae 100644 Binary files a/Assets/readme/Detect1.gif and b/Assets/readme/Detect1.gif differ diff --git a/Assets/readme/Detect2.gif b/Assets/readme/Detect2.gif index 28edf05b893b033331b91d2f5a7f64b35f8f4b2f..ea499a1b0bf31210e3bd048a81f2ba453b458e02 100644 Binary files a/Assets/readme/Detect2.gif and b/Assets/readme/Detect2.gif differ diff --git a/Assets/readme/FastTrack.png b/Assets/readme/FastTrack.png new file mode 100644 index 0000000000000000000000000000000000000000..f89978e2104b37284db2c250781f7d8a07bd93f7 Binary files /dev/null and b/Assets/readme/FastTrack.png differ diff --git a/Assets/readme/MainLogo.png b/Assets/readme/MainLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..486bf4232f5c6cea169871bd3c067719bf783bd8 Binary files /dev/null and b/Assets/readme/MainLogo.png differ diff --git a/Assets/readme/SignTrack Logo.svg b/Assets/readme/SignTrack Logo.svg deleted file mode 100644 index fe5749fda05b6880c2d9e96fb42a36104f0d54ba..0000000000000000000000000000000000000000 --- a/Assets/readme/SignTrack Logo.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1343 364"><defs><style>.cls-1{fill:url(#linear-gradient);}.cls-2{font-size:48px;}.cls-2,.cls-9{font-family:OdinRounded-Light, Odin Rounded;font-weight:300;}.cls-3{letter-spacing:-0.03em;}.cls-4{font-size:45px;}.cls-10,.cls-4{font-family:MyriadPro-Regular, Myriad Pro;font-weight:400;}.cls-5{letter-spacing:-0.05em;}.cls-6{letter-spacing:-0.04em;}.cls-7{letter-spacing:-0.04em;}.cls-8{fill:url(#linear-gradient-2);}.cls-9{font-size:37px;fill:#333;}.cls-11{letter-spacing:-0.06em;}.cls-12{letter-spacing:-0.03em;}.cls-13{fill:#c799d8;}.cls-14{fill:#ff9986;}</style><linearGradient id="linear-gradient" x1="786.4" y1="-17.01" x2="543.3" y2="404.05" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#c799d8"/><stop offset="1" stop-color="#ff9986"/></linearGradient><linearGradient id="linear-gradient-2" x1="484.77" y1="117.16" x2="547.74" y2="117.16" gradientTransform="translate(-0.63 3.24) rotate(-0.25)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#db589a" stop-opacity="0.9"/><stop offset="0.13" stop-color="#d261a2" stop-opacity="0.91"/><stop offset="0.33" stop-color="#ba78b6" stop-opacity="0.93"/><stop offset="0.6" stop-color="#939fd8" stop-opacity="0.96"/><stop offset="0.87" stop-color="#6cf"/></linearGradient></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><rect class="cls-1" x="457" width="429" height="364" rx="59.5"/><text class="cls-2" transform="translate(482 190.42)"><tspan class="cls-3">C</tspan><tspan x="28.7" y="0">omputi</tspan><tspan class="cls-4" x="162.96" y="0">n</tspan><tspan x="187.93" y="0">g</tspan><tspan class="cls-5" x="0" y="57.6">f</tspan><tspan x="16.85" y="57.6">or </tspan><tspan class="cls-6" x="70.99" y="57.6">e</tspan><tspan class="cls-7" x="92.49" y="57.6">v</tspan><tspan x="116.06" y="57.6">er</tspan><tspan class="cls-6" x="154.51" y="57.6">y</tspan><tspan x="177.98" y="57.6">o</tspan><tspan class="cls-4" x="204.24" y="57.6">n</tspan><tspan x="229.21" y="57.6">e</tspan></text><path class="cls-8" d="M490.11,103.42c2.08-.89,4-.53,6.67,0a24.94,24.94,0,0,1,7.34,2.88c.69.39,1.19.68,1.76,1.06,2.32,1.52,3.91,3.13,10.39,7.81.94.68,1.4,1,1.7,1.21.87.57,9.49,6,17,2.94,3.51-1.42,4.08-3.59,6.94-3.41a6.28,6.28,0,0,1,5.18,3.35,6.76,6.76,0,0,1-.26,5.64,9.31,9.31,0,0,1-3.08,3.77c-7.71,5.94-17.28,4.77-17.28,4.77a30.41,30.41,0,0,1-13.54-5.76c-.49-.39-2.05-1.45-4.14-3.18a33.91,33.91,0,0,0-4.9-3.36s-5.9-3.07-10.25-3h-2.16c-2.14.3-2.8,1.3-3.85,1.14-1.67-.25-2.52-3.14-2.65-3.56C483.79,111.57,485.47,105.39,490.11,103.42Z"/><text class="cls-9" transform="translate(553.8 129.53)">Sig<tspan class="cls-10" x="45.65" y="0">n</tspan><tspan class="cls-11" x="66.19" y="0">T</tspan><tspan class="cls-12" x="84.06" y="0">r</tspan><tspan x="94.45" y="0">ack</tspan></text><rect class="cls-13" x="914" width="429" height="364" rx="59.5"/><rect class="cls-14" width="429" height="364" rx="59.5"/></g></g></svg> \ No newline at end of file diff --git a/Assets/readme/dataset.gif b/Assets/readme/dataset.gif new file mode 100644 index 0000000000000000000000000000000000000000..21feedf501d51b710aef4371a3579a400ee5e044 Binary files /dev/null and b/Assets/readme/dataset.gif differ diff --git a/Insights/ModelID.npy b/Insights/ModelID.npy new file mode 100644 index 0000000000000000000000000000000000000000..e57e8a1c5ae8ab426be9752c008a16ec0fa24da8 Binary files /dev/null and b/Insights/ModelID.npy differ diff --git a/Insights/SignTrack.h5 b/Insights/SignTrack.h5 new file mode 100644 index 0000000000000000000000000000000000000000..6f4ca5b3e0cd4a1e8baaf6a362845ab3667b8513 Binary files /dev/null and b/Insights/SignTrack.h5 differ diff --git a/README.md b/README.md index 69bc80f3ebef650e56aef6594e2554f9319ab6b0..4537a7fa5bddf0b899a25ece375b27d4e4f1285e 100644 --- a/README.md +++ b/README.md @@ -1,46 +1,89 @@ - +<p align="center"> + <img src="Assets/readme/SignTrack.png"> +</p> ## In this guide you can learn about * [What is SignTrack](#What is SignTrack) * [How it works](#How it works) * [Showcase](#Quick Guide) + * [Data Collection](#Data Collection) + * [Model Train](#Model Train) + * [SignTrack Main](#SignTrack Main) + * [Dataset](#Dataset) * [Dependances](#Dependances) * [Setup](#setup) * [Troubleshoting](#troubleshoting) ## What is SignTrack -SignTrack is a sign language transcriber. It analyzes, processes, and recognizes sign language in real-time, with exceptional accuracy and efficiency. From transforming signs to text to helping you learn sign language by its application in interactive learning, SignTrack helps make computers more open for everyone. +SignTrack is a sign language transcriber. It analyzes, processes, and recognizes sign language in real-time, with exceptional accuracy and efficiency. From transforming signs to text to helping you learn sign language through its application in interactive learning, SignTrack helps make computers more open for everyone by taking a human-centric approach to computing. + +<br /> ## How it works -SignTrack utilizes a state-of-the-art LSTM model that predicts based on a sequence of data, enabling the detection of whole phrases and moving signs. To further improve precision and efficiency, SignTrack has been trained only on key hand and pose landmarks, that have been extracted using MediaPipe. That way also remains accurate on every skin shade. +SignTrack utilizes a state-of-the-art LSTM model that predicts based on a sequence of data, enabling the detection of whole phrases and moving signs. To further improve precision and efficiency, SignTrack has been trained only on key hand and pose landmarks, that have been extracted using MediaPipe. That way it also remains accurate on every skin shade. -Making the data collecting experience friendlier for the user has been one of our top priorities. That's why we made sure to create an easy-to-use data collection user interface, even for those with minimal coding skills. +<br /> ## Showcase -### Data Collecting +## Data Collection + +Making the data collecting experience friendlier for the user has been one of our top priorities. That's why we made sure to create an easy-to-use data collection user interface, even for those with minimal coding skills. -The journey starts with data collection. Data plays a fundamental role in creating a great model, that's both accurate and has great performance. The data collection program has been designed to generate data suitable for training the model. Added to that, it has been made to help our users to create an accurate model. With breaks between training sessions and intuitive design, anyone can create a good training dataset. +Data plays a fundamental role in creating a great model that's both accurate and has great performance. The data collection program has been designed to generate data suitable for training the model. Added to that, it has been made to help our users to create an accurate model. With breaks between training sessions and intuitive design, anyone can create a good training dataset. Another feature of SignTrack Data Collect is flipping the image to generate data as if you signed with the other hand too! Creating a model that can make equally accurate predictions on both hands. -  +Privacy is at the center of SignTrack. All of the collected data is free of personal data, like raw images or computer specifications. Making users feel more comfortable exchanging datasets. + +<p align="center"> + <img src="Assets/readme/Collecting1.gif"> + <img src="Assets/readme/Collecting2.gif"> +</p> + +## Model Train + +<p align="center"> + <img img width="300" height="50" src="Assets/readme/AutoTrain.png"> +</p> -### Model Train +Training a neural network can be quite confusing. From setting training parameters, such as activation functions and the number of neurons on each layer, to the model architecture to the number of epochs, everything in SignTrack is automated, with the power of AutoTrain, requiring minimal or no adjustment from the user while training. -Training a neural network can be confusing. From setting training parameters, such as activation functions and the number of neurons on each layer, to the model architecture to the number of epochs, everything in SignTrack is automated, with the power of AutoTrain, requiring minimal or no adjustment from the user while training. -AutoTrain makes sure that you get the most out of your dataset. It sets all the training parameters for you while automatically saving the best-performing model. +AutoTrain makes sure that you get the most out of your dataset. It sets all the training parameters for you while automatically saving the best-performing model. What's more AutoTrain has now been redefined to make for an even faster tracking experience. FastTrack has been implemented right through the model training proccess, a new way of data augmentation, that improves the overall performance of the model, not only regarding FastTrack. -### Sign Track Main +## SignTrack Main + +<p align="center"> + <img img width="300" height="50" src="Assets/readme/FastTrack.png"> +</p> Utilizing the created model turned out to be an equally fundamental part of the project. Some people sign faster than the 24 frames that the model requires for making predictions. FastTrack is built into the __SignTrack main.py__ to solve this problem. It randomly duplicates the frames that the model's predictions are based on, until it gets the desired amount of frames. At the same time, making sure that the model makes predictions only on frames which the hands are on the frame, enhancing once again the overall performance. +Optimizations form an uninterapted experience. SignTrack is made to use resources only when needed. For example the SignTrack model is only called to make predictions when the hands have been visible on the scene. While the needed punctuation is only predicted after the user has completed forming the sentence. + The consistent, unique, and identifiable design continues on the main program while keeping on the display the needed information to understand how the model performs on specific signs. That can save a lot of time for those who work on making their SignTrack model. - +<p align="center"> + <img src="Assets/readme/Detect1.gif"> + <img src="Assets/readme/Detect2.gif"> +</p> + +## Dataset + +<p align="center"> + <img img width="600" height="80" src="Assets/readme/dataset.gif"> +</p> + +SignTrack comes with an expansive dataset for ASL. The given model, which is trained on this dataset, is recommended to be used on web cameras on or above head height. If the given model does not perform as expected you can always add more data using DataCollect. When creating your dataset remember to make sure to try signing from different angles and positions to create a more generalized model, that will work on a broader spectrum of angles. + +### Illustration + +All of the illustrations have been designed from the ground up for SignTrack. In the assets folder is a directory with SVG versions of them, apart from the GIFs. You can always tinker them using your favourite open source ilustration tool, like Inkscape. + +<br /> ## Dependances @@ -54,6 +97,8 @@ This project has been developed using: * Mediapipe * Cvzone +<br /> + ## Setup SignTrack uses python poetry to make installation a breeze. Dealing with TensorFlow can often be difficult. We made sure that this is not the case with SignTrack. @@ -91,6 +136,8 @@ SignTrack uses python poetry to make installation a breeze. Dealing with TensorF * Type and run on terminal __poetry shell__ * Type and run on terminal __python main.py__ +<br /> + ## Troubleshoting ### OpenCV errors @@ -112,3 +159,23 @@ If that does not work try reinstalling OpenCV * Then type __pip uninstall opencv-python__ * Finally type __pip install opencv-python==4.1.2.30__ + +<br /> + +### Failling to install a package + +#### Try installing manually from the poetry env + +* Type __poetry shell__ on your terminal on the SignTrack directory + +* Type __pip install__ and continue with typing the failed to install package, making sure that it is the matching version + +<br /> + +## Credits + +Creating this amazing project would not have been possible without the help of: + +* My mentor, Barbara PongraÄić, for helping me focus on what is important. +* My friend, Fotini Tsiami, for assisting me throught the illustration designing proccess. +* DuckDuckGo and YouTube tutorials, well, for obvious reasons. diff --git a/model.SignTrack b/model.SignTrack new file mode 100644 index 0000000000000000000000000000000000000000..a158a36d79a704b8afd4abfe076ee7b7270313de Binary files /dev/null and b/model.SignTrack differ diff --git a/model.pack b/model.pack deleted file mode 100644 index 0c5d4cafdfced3a552cdeb91a76a339f775de85c..0000000000000000000000000000000000000000 Binary files a/model.pack and /dev/null differ diff --git a/poetry.lock b/poetry.lock index 95f5cf96914a10b84a22e9b9f7b9365b4f6ed17f..cfabec5bdb808eff680856fdcc38eac58cb549ff 100644 --- a/poetry.lock +++ b/poetry.lock @@ -89,11 +89,23 @@ python-versions = ">=3.5.0" [package.extras] unicode_backport = ["unicodedata2"] +[[package]] +name = "click" +version = "8.1.0" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} + [[package]] name = "colorama" version = "0.4.4" description = "Cross-platform colored terminal text." -category = "dev" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -117,6 +129,18 @@ category = "main" optional = false python-versions = ">=3.6" +[[package]] +name = "filelock" +version = "3.6.0" +description = "A platform independent file lock." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] +testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"] + [[package]] name = "flatbuffers" version = "1.12" @@ -229,6 +253,31 @@ numpy = [ {version = ">=1.19.3", markers = "python_version >= \"3.9\""}, ] +[[package]] +name = "huggingface-hub" +version = "0.4.0" +description = "Client library to download and publish models on the huggingface.co hub" +category = "main" +optional = false +python-versions = ">=3.6.0" + +[package.dependencies] +filelock = "*" +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} +packaging = ">=20.9" +pyyaml = "*" +requests = "*" +tqdm = "*" +typing-extensions = ">=3.7.4.3" + +[package.extras] +tensorflow = ["tensorflow"] +testing = ["pytest", "datasets"] +torch = ["torch"] +all = ["pytest", "datasets", "black (>=20.8b1)", "isort (>=5.5.4)", "flake8 (>=3.8.3)"] +dev = ["pytest", "datasets", "black (>=20.8b1)", "isort (>=5.5.4)", "flake8 (>=3.8.3)"] +quality = ["black (>=20.8b1)", "isort (>=5.5.4)", "flake8 (>=3.8.3)"] + [[package]] name = "idna" version = "3.3" @@ -570,6 +619,22 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "regex" +version = "2022.3.15" +description = "Alternative regular expression module, to replace re." +category = "main" +optional = false +python-versions = ">=3.6" + [[package]] name = "requests" version = "2.27.1" @@ -614,6 +679,21 @@ python-versions = ">=3.6,<4" [package.dependencies] pyasn1 = ">=0.1.3" +[[package]] +name = "sacremoses" +version = "0.0.49" +description = "SacreMoses" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +click = "*" +joblib = "*" +regex = "*" +six = "*" +tqdm = "*" + [[package]] name = "scikit-learn" version = "1.0.2" @@ -645,6 +725,14 @@ python-versions = ">=3.7" [package.dependencies] numpy = ">=1.16.5" +[[package]] +name = "sentencepiece" +version = "0.1.96" +description = "SentencePiece python wrapper" +category = "main" +optional = false +python-versions = "*" + [[package]] name = "setuptools-scm" version = "6.4.2" @@ -769,6 +857,18 @@ category = "main" optional = false python-versions = ">=3.6" +[[package]] +name = "tokenizers" +version = "0.11.6" +description = "Fast and Customizable Tokenizers" +category = "main" +optional = false +python-versions = "*" + +[package.extras] +docs = ["sphinx", "sphinx-rtd-theme", "setuptools-rust"] +testing = ["pytest", "requests", "numpy", "datasets"] + [[package]] name = "toml" version = "0.10.2" @@ -785,6 +885,93 @@ category = "main" optional = false python-versions = ">=3.7" +[[package]] +name = "torch" +version = "1.11.0" +description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" +category = "main" +optional = false +python-versions = ">=3.7.0" + +[package.dependencies] +typing-extensions = "*" + +[[package]] +name = "tqdm" +version = "4.63.1" +description = "Fast, Extensible Progress Meter" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["py-make (>=0.1.0)", "twine", "wheel"] +notebook = ["ipywidgets (>=6)"] +telegram = ["requests"] + +[[package]] +name = "transformers" +version = "4.17.0" +description = "State-of-the-art Natural Language Processing for TensorFlow 2.0 and PyTorch" +category = "main" +optional = false +python-versions = ">=3.6.0" + +[package.dependencies] +filelock = "*" +huggingface-hub = ">=0.1.0,<1.0" +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} +numpy = ">=1.17" +packaging = ">=20.0" +pyyaml = ">=5.1" +regex = "!=2019.12.17" +requests = "*" +sacremoses = "*" +tokenizers = ">=0.11.1,<0.11.3 || >0.11.3" +tqdm = ">=4.27" + +[package.extras] +all = ["tensorflow (>=2.3)", "onnxconverter-common", "tf2onnx", "torch (>=1.0)", "jax (>=0.2.8)", "jaxlib (>=0.1.65)", "flax (>=0.3.5)", "optax (>=0.0.8)", "sentencepiece (>=0.1.91,!=0.1.92)", "protobuf", "tokenizers (>=0.11.1,!=0.11.3)", "torchaudio", "librosa", "pyctcdecode (>=0.3.0)", "phonemizer", "pillow", "optuna", "ray", "sigopt", "timm", "codecarbon (==1.2.0)"] +audio = ["librosa", "pyctcdecode (>=0.3.0)", "phonemizer"] +codecarbon = ["codecarbon (==1.2.0)"] +deepspeed = ["deepspeed (>=0.5.9)"] +dev = ["tensorflow (>=2.3)", "onnxconverter-common", "tf2onnx", "torch (>=1.0)", "jax (>=0.2.8)", "jaxlib (>=0.1.65)", "flax (>=0.3.5)", "optax (>=0.0.8)", "sentencepiece (>=0.1.91,!=0.1.92)", "protobuf", "tokenizers (>=0.11.1,!=0.11.3)", "torchaudio", "librosa", "pyctcdecode (>=0.3.0)", "phonemizer", "pillow", "optuna", "ray", "sigopt", "timm", "codecarbon (==1.2.0)", "pytest", "pytest-xdist", "timeout-decorator", "parameterized", "psutil", "datasets", "pytest-timeout", "black (>=22.0,<23.0)", "sacrebleu (>=1.4.12,<2.0.0)", "rouge-score", "nltk", "GitPython (<3.1.19)", "faiss-cpu", "cookiecutter (==1.7.2)", "isort (>=5.5.4)", "flake8 (>=3.8.3)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "unidic-lite (>=1.0.7)", "unidic (>=1.0.2)", "scikit-learn"] +dev-tensorflow = ["pytest", "pytest-xdist", "timeout-decorator", "parameterized", "psutil", "datasets", "pytest-timeout", "black (>=22.0,<23.0)", "sacrebleu (>=1.4.12,<2.0.0)", "rouge-score", "nltk", "GitPython (<3.1.19)", "faiss-cpu", "cookiecutter (==1.7.2)", "tensorflow (>=2.3)", "onnxconverter-common", "tf2onnx", "sentencepiece (>=0.1.91,!=0.1.92)", "protobuf", "tokenizers (>=0.11.1,!=0.11.3)", "pillow", "isort (>=5.5.4)", "flake8 (>=3.8.3)", "scikit-learn", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "librosa", "pyctcdecode (>=0.3.0)", "phonemizer"] +dev-torch = ["pytest", "pytest-xdist", "timeout-decorator", "parameterized", "psutil", "datasets", "pytest-timeout", "black (>=22.0,<23.0)", "sacrebleu (>=1.4.12,<2.0.0)", "rouge-score", "nltk", "GitPython (<3.1.19)", "faiss-cpu", "cookiecutter (==1.7.2)", "torch (>=1.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "protobuf", "tokenizers (>=0.11.1,!=0.11.3)", "torchaudio", "librosa", "pyctcdecode (>=0.3.0)", "phonemizer", "pillow", "optuna", "ray", "sigopt", "timm", "codecarbon (==1.2.0)", "isort (>=5.5.4)", "flake8 (>=3.8.3)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "unidic-lite (>=1.0.7)", "unidic (>=1.0.2)", "scikit-learn", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"] +docs = ["tensorflow (>=2.3)", "onnxconverter-common", "tf2onnx", "torch (>=1.0)", "jax (>=0.2.8)", "jaxlib (>=0.1.65)", "flax (>=0.3.5)", "optax (>=0.0.8)", "sentencepiece (>=0.1.91,!=0.1.92)", "protobuf", "tokenizers (>=0.11.1,!=0.11.3)", "torchaudio", "librosa", "pyctcdecode (>=0.3.0)", "phonemizer", "pillow", "optuna", "ray", "sigopt", "timm", "codecarbon (==1.2.0)"] +fairscale = ["fairscale (>0.3)"] +flax = ["jax (>=0.2.8)", "jaxlib (>=0.1.65)", "flax (>=0.3.5)", "optax (>=0.0.8)"] +flax-speech = ["librosa", "pyctcdecode (>=0.3.0)", "phonemizer"] +ftfy = ["ftfy"] +integrations = ["optuna", "ray", "sigopt"] +ja = ["fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "unidic-lite (>=1.0.7)", "unidic (>=1.0.2)"] +modelcreation = ["cookiecutter (==1.7.2)"] +onnx = ["onnxconverter-common", "tf2onnx", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"] +onnxruntime = ["onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"] +optuna = ["optuna"] +quality = ["black (>=22.0,<23.0)", "isort (>=5.5.4)", "flake8 (>=3.8.3)", "GitPython (<3.1.19)"] +ray = ["ray"] +retrieval = ["faiss-cpu", "datasets"] +sagemaker = ["sagemaker (>=2.31.0)"] +sentencepiece = ["sentencepiece (>=0.1.91,!=0.1.92)", "protobuf"] +serving = ["pydantic", "uvicorn", "fastapi", "starlette"] +sigopt = ["sigopt"] +sklearn = ["scikit-learn"] +speech = ["torchaudio", "librosa", "pyctcdecode (>=0.3.0)", "phonemizer"] +testing = ["pytest", "pytest-xdist", "timeout-decorator", "parameterized", "psutil", "datasets", "pytest-timeout", "black (>=22.0,<23.0)", "sacrebleu (>=1.4.12,<2.0.0)", "rouge-score", "nltk", "GitPython (<3.1.19)", "faiss-cpu", "cookiecutter (==1.7.2)"] +tf = ["tensorflow (>=2.3)", "onnxconverter-common", "tf2onnx"] +tf-cpu = ["tensorflow-cpu (>=2.3)", "onnxconverter-common", "tf2onnx"] +tf-speech = ["librosa", "pyctcdecode (>=0.3.0)", "phonemizer"] +timm = ["timm"] +tokenizers = ["tokenizers (>=0.11.1,!=0.11.3)"] +torch = ["torch (>=1.0)"] +torch-speech = ["torchaudio", "librosa", "pyctcdecode (>=0.3.0)", "phonemizer"] +torchhub = ["filelock", "huggingface-hub (>=0.1.0,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "torch (>=1.0)", "tokenizers (>=0.11.1,!=0.11.3)", "tqdm (>=4.27)"] +vision = ["pillow"] + [[package]] name = "typing-extensions" version = "3.7.4.3" @@ -848,7 +1035,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "29cf07116fe53f6c596d81b8bea6ecc58a45bb41b22013649dc5ddeaf5a4e08a" +content-hash = "ee3e416ae99b88ae139ea5598e58dd9943413328404e0ab375ce97e9208c44be" [metadata.files] absl-py = [ @@ -887,6 +1074,10 @@ charset-normalizer = [ {file = "charset-normalizer-2.0.10.tar.gz", hash = "sha256:876d180e9d7432c5d1dfd4c5d26b72f099d503e8fcc0feb7532c9289be60fcbd"}, {file = "charset_normalizer-2.0.10-py3-none-any.whl", hash = "sha256:cb957888737fc0bbcd78e3df769addb41fd1ff8cf950dc9e7ad7793f1bf44455"}, ] +click = [ + {file = "click-8.1.0-py3-none-any.whl", hash = "sha256:19a4baa64da924c5e0cd889aba8e947f280309f1a2ce0947a3e3a7bcb7cc72d6"}, + {file = "click-8.1.0.tar.gz", hash = "sha256:977c213473c7665d3aa092b41ff12063227751c41d7b17165013e10069cc5cd2"}, +] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, @@ -898,6 +1089,10 @@ cycler = [ {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, ] +filelock = [ + {file = "filelock-3.6.0-py3-none-any.whl", hash = "sha256:f8314284bfffbdcfa0ff3d7992b023d4c628ced6feb957351d4c48d059f56bc0"}, + {file = "filelock-3.6.0.tar.gz", hash = "sha256:9cd540a9352e432c7246a48fe4e8712b10acb1df2ad1f30e8c070b82ae1fed85"}, +] flatbuffers = [ {file = "flatbuffers-1.12-py2.py3-none-any.whl", hash = "sha256:9e9ef47fa92625c4721036e7c4124182668dc6021d9e7c73704edd395648deb9"}, {file = "flatbuffers-1.12.tar.gz", hash = "sha256:63bb9a722d5e373701913e226135b28a6f6ac200d5cc7b4d919fa38d73b44610"}, @@ -986,6 +1181,10 @@ h5py = [ {file = "h5py-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:1cdfd1c5449ca1329d152f0b66830e93226ebce4f5e07dd8dc16bfc2b1a49d7b"}, {file = "h5py-3.1.0.tar.gz", hash = "sha256:1e2516f190652beedcb8c7acfa1c6fa92d99b42331cbef5e5c7ec2d65b0fc3c2"}, ] +huggingface-hub = [ + {file = "huggingface_hub-0.4.0-py3-none-any.whl", hash = "sha256:808021af1ce1111104973ae54d81738eaf40be6d1e82fc6bdedb82f81c6206e7"}, + {file = "huggingface_hub-0.4.0.tar.gz", hash = "sha256:f0e3389f8988eb7781b17de520ae7fd0aa50d9823534e3ae55344d943a88ac87"}, +] idna = [ {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, @@ -1353,6 +1552,117 @@ pytz = [ {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, ] +pyyaml = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] +regex = [ + {file = "regex-2022.3.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:42eb13b93765c6698a5ab3bcd318d8c39bb42e5fa8a7fcf7d8d98923f3babdb1"}, + {file = "regex-2022.3.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9beb03ff6fe509d6455971c2489dceb31687b38781206bcec8e68bdfcf5f1db2"}, + {file = "regex-2022.3.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0a5a1fdc9f148a8827d55b05425801acebeeefc9e86065c7ac8b8cc740a91ff"}, + {file = "regex-2022.3.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cb374a2a4dba7c4be0b19dc7b1adc50e6c2c26c3369ac629f50f3c198f3743a4"}, + {file = "regex-2022.3.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c33ce0c665dd325200209340a88438ba7a470bd5f09f7424e520e1a3ff835b52"}, + {file = "regex-2022.3.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04c09b9651fa814eeeb38e029dc1ae83149203e4eeb94e52bb868fadf64852bc"}, + {file = "regex-2022.3.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab5d89cfaf71807da93c131bb7a19c3e19eaefd613d14f3bce4e97de830b15df"}, + {file = "regex-2022.3.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0e2630ae470d6a9f8e4967388c1eda4762706f5750ecf387785e0df63a4cc5af"}, + {file = "regex-2022.3.15-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:df037c01d68d1958dad3463e2881d3638a0d6693483f58ad41001aa53a83fcea"}, + {file = "regex-2022.3.15-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:940570c1a305bac10e8b2bc934b85a7709c649317dd16520471e85660275083a"}, + {file = "regex-2022.3.15-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7f63877c87552992894ea1444378b9c3a1d80819880ae226bb30b04789c0828c"}, + {file = "regex-2022.3.15-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:3e265b388cc80c7c9c01bb4f26c9e536c40b2c05b7231fbb347381a2e1c8bf43"}, + {file = "regex-2022.3.15-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:058054c7a54428d5c3e3739ac1e363dc9347d15e64833817797dc4f01fb94bb8"}, + {file = "regex-2022.3.15-cp310-cp310-win32.whl", hash = "sha256:76435a92e444e5b8f346aed76801db1c1e5176c4c7e17daba074fbb46cb8d783"}, + {file = "regex-2022.3.15-cp310-cp310-win_amd64.whl", hash = "sha256:174d964bc683b1e8b0970e1325f75e6242786a92a22cedb2a6ec3e4ae25358bd"}, + {file = "regex-2022.3.15-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6e1d8ed9e61f37881c8db383a124829a6e8114a69bd3377a25aecaeb9b3538f8"}, + {file = "regex-2022.3.15-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b52771f05cff7517f7067fef19ffe545b1f05959e440d42247a17cd9bddae11b"}, + {file = "regex-2022.3.15-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:673f5a393d603c34477dbad70db30025ccd23996a2d0916e942aac91cc42b31a"}, + {file = "regex-2022.3.15-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8923e1c5231549fee78ff9b2914fad25f2e3517572bb34bfaa3aea682a758683"}, + {file = "regex-2022.3.15-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:764e66a0e382829f6ad3bbce0987153080a511c19eb3d2f8ead3f766d14433ac"}, + {file = "regex-2022.3.15-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd00859291658fe1fda48a99559fb34da891c50385b0bfb35b808f98956ef1e7"}, + {file = "regex-2022.3.15-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa2ce79f3889720b46e0aaba338148a1069aea55fda2c29e0626b4db20d9fcb7"}, + {file = "regex-2022.3.15-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:34bb30c095342797608727baf5c8aa122406aa5edfa12107b8e08eb432d4c5d7"}, + {file = "regex-2022.3.15-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:25ecb1dffc5e409ca42f01a2b2437f93024ff1612c1e7983bad9ee191a5e8828"}, + {file = "regex-2022.3.15-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:aa5eedfc2461c16a092a2fabc5895f159915f25731740c9152a1b00f4bcf629a"}, + {file = "regex-2022.3.15-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:7d1a6e403ac8f1d91d8f51c441c3f99367488ed822bda2b40836690d5d0059f5"}, + {file = "regex-2022.3.15-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:3e4d710ff6539026e49f15a3797c6b1053573c2b65210373ef0eec24480b900b"}, + {file = "regex-2022.3.15-cp36-cp36m-win32.whl", hash = "sha256:0100f0ded953b6b17f18207907159ba9be3159649ad2d9b15535a74de70359d3"}, + {file = "regex-2022.3.15-cp36-cp36m-win_amd64.whl", hash = "sha256:f320c070dea3f20c11213e56dbbd7294c05743417cde01392148964b7bc2d31a"}, + {file = "regex-2022.3.15-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fc8c7958d14e8270171b3d72792b609c057ec0fa17d507729835b5cff6b7f69a"}, + {file = "regex-2022.3.15-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ca6dcd17f537e9f3793cdde20ac6076af51b2bd8ad5fe69fa54373b17b48d3c"}, + {file = "regex-2022.3.15-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0214ff6dff1b5a4b4740cfe6e47f2c4c92ba2938fca7abbea1359036305c132f"}, + {file = "regex-2022.3.15-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a98ae493e4e80b3ded6503ff087a8492db058e9c68de371ac3df78e88360b374"}, + {file = "regex-2022.3.15-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b1cc70e31aacc152a12b39245974c8fccf313187eead559ee5966d50e1b5817"}, + {file = "regex-2022.3.15-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4829db3737480a9d5bfb1c0320c4ee13736f555f53a056aacc874f140e98f64"}, + {file = "regex-2022.3.15-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:303b15a3d32bf5fe5a73288c316bac5807587f193ceee4eb6d96ee38663789fa"}, + {file = "regex-2022.3.15-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:dc7b7c16a519d924c50876fb152af661a20749dcbf653c8759e715c1a7a95b18"}, + {file = "regex-2022.3.15-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ce3057777a14a9a1399b81eca6a6bfc9612047811234398b84c54aeff6d536ea"}, + {file = "regex-2022.3.15-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:48081b6bff550fe10bcc20c01cf6c83dbca2ccf74eeacbfac240264775fd7ecf"}, + {file = "regex-2022.3.15-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dcbb7665a9db9f8d7642171152c45da60e16c4f706191d66a1dc47ec9f820aed"}, + {file = "regex-2022.3.15-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c155a1a80c5e7a8fa1d9bb1bf3c8a953532b53ab1196092749bafb9d3a7cbb60"}, + {file = "regex-2022.3.15-cp37-cp37m-win32.whl", hash = "sha256:04b5ee2b6d29b4a99d38a6469aa1db65bb79d283186e8460542c517da195a8f6"}, + {file = "regex-2022.3.15-cp37-cp37m-win_amd64.whl", hash = "sha256:797437e6024dc1589163675ae82f303103063a0a580c6fd8d0b9a0a6708da29e"}, + {file = "regex-2022.3.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8afcd1c2297bc989dceaa0379ba15a6df16da69493635e53431d2d0c30356086"}, + {file = "regex-2022.3.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0066a6631c92774391f2ea0f90268f0d82fffe39cb946f0f9c6b382a1c61a5e5"}, + {file = "regex-2022.3.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8248f19a878c72d8c0a785a2cd45d69432e443c9f10ab924c29adda77b324ae"}, + {file = "regex-2022.3.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d1f3ea0d1924feb4cf6afb2699259f658a08ac6f8f3a4a806661c2dfcd66db1"}, + {file = "regex-2022.3.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:794a6bc66c43db8ed06698fc32aaeaac5c4812d9f825e9589e56f311da7becd9"}, + {file = "regex-2022.3.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d1445824944e642ffa54c4f512da17a953699c563a356d8b8cbdad26d3b7598"}, + {file = "regex-2022.3.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f553a1190ae6cd26e553a79f6b6cfba7b8f304da2071052fa33469da075ea625"}, + {file = "regex-2022.3.15-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:75a5e6ce18982f0713c4bac0704bf3f65eed9b277edd3fb9d2b0ff1815943327"}, + {file = "regex-2022.3.15-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f16cf7e4e1bf88fecf7f41da4061f181a6170e179d956420f84e700fb8a3fd6b"}, + {file = "regex-2022.3.15-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dad3991f0678facca1a0831ec1ddece2eb4d1dd0f5150acb9440f73a3b863907"}, + {file = "regex-2022.3.15-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:491fc754428514750ab21c2d294486223ce7385446f2c2f5df87ddbed32979ae"}, + {file = "regex-2022.3.15-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:6504c22c173bb74075d7479852356bb7ca80e28c8e548d4d630a104f231e04fb"}, + {file = "regex-2022.3.15-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:01c913cf573d1da0b34c9001a94977273b5ee2fe4cb222a5d5b320f3a9d1a835"}, + {file = "regex-2022.3.15-cp38-cp38-win32.whl", hash = "sha256:029e9e7e0d4d7c3446aa92474cbb07dafb0b2ef1d5ca8365f059998c010600e6"}, + {file = "regex-2022.3.15-cp38-cp38-win_amd64.whl", hash = "sha256:947a8525c0a95ba8dc873191f9017d1b1e3024d4dc757f694e0af3026e34044a"}, + {file = "regex-2022.3.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:591d4fba554f24bfa0421ba040cd199210a24301f923ed4b628e1e15a1001ff4"}, + {file = "regex-2022.3.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b9809404528a999cf02a400ee5677c81959bc5cb938fdc696b62eb40214e3632"}, + {file = "regex-2022.3.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f08a7e4d62ea2a45557f561eea87c907222575ca2134180b6974f8ac81e24f06"}, + {file = "regex-2022.3.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a86cac984da35377ca9ac5e2e0589bd11b3aebb61801204bd99c41fac516f0d"}, + {file = "regex-2022.3.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:286908cbe86b1a0240a867aecfe26a439b16a1f585d2de133540549831f8e774"}, + {file = "regex-2022.3.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b7494df3fdcc95a1f76cf134d00b54962dd83189520fd35b8fcd474c0aa616d"}, + {file = "regex-2022.3.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b1ceede92400b3acfebc1425937454aaf2c62cd5261a3fabd560c61e74f6da3"}, + {file = "regex-2022.3.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0317eb6331146c524751354ebef76a7a531853d7207a4d760dfb5f553137a2a4"}, + {file = "regex-2022.3.15-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9c144405220c5ad3f5deab4c77f3e80d52e83804a6b48b6bed3d81a9a0238e4c"}, + {file = "regex-2022.3.15-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:5b2e24f3ae03af3d8e8e6d824c891fea0ca9035c5d06ac194a2700373861a15c"}, + {file = "regex-2022.3.15-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f2c53f3af011393ab5ed9ab640fa0876757498aac188f782a0c620e33faa2a3d"}, + {file = "regex-2022.3.15-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:060f9066d2177905203516c62c8ea0066c16c7342971d54204d4e51b13dfbe2e"}, + {file = "regex-2022.3.15-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:530a3a16e57bd3ea0dff5ec2695c09632c9d6c549f5869d6cf639f5f7153fb9c"}, + {file = "regex-2022.3.15-cp39-cp39-win32.whl", hash = "sha256:78ce90c50d0ec970bd0002462430e00d1ecfd1255218d52d08b3a143fe4bde18"}, + {file = "regex-2022.3.15-cp39-cp39-win_amd64.whl", hash = "sha256:c5adc854764732dbd95a713f2e6c3e914e17f2ccdc331b9ecb777484c31f73b6"}, + {file = "regex-2022.3.15.tar.gz", hash = "sha256:0a7b75cc7bb4cc0334380053e4671c560e31272c9d2d5a6c4b8e9ae2c9bd0f82"}, +] requests = [ {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, @@ -1366,6 +1676,10 @@ rsa = [ {file = "rsa-4.8-py3-none-any.whl", hash = "sha256:95c5d300c4e879ee69708c428ba566c59478fd653cc3a22243eeb8ed846950bb"}, {file = "rsa-4.8.tar.gz", hash = "sha256:5c6bd9dc7a543b7fe4304a631f8a8a3b674e2bbfc49c2ae96200cdbe55df6b17"}, ] +sacremoses = [ + {file = "sacremoses-0.0.49-py3-none-any.whl", hash = "sha256:33ca6d4e125271b9201cc7fdf7f03f3ffdd358ee6dd8079c0432811d82da5377"}, + {file = "sacremoses-0.0.49.tar.gz", hash = "sha256:c2ecd3a50d1c09a26253ad84b0b89e9e3a28a023455b72a2197cfeab27ff5141"}, +] scikit-learn = [ {file = "scikit-learn-1.0.2.tar.gz", hash = "sha256:b5870959a5484b614f26d31ca4c17524b1b0317522199dc985c3b4256e030767"}, {file = "scikit_learn-1.0.2-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:da3c84694ff693b5b3194d8752ccf935a665b8b5edc33a283122f4273ca3e687"}, @@ -1421,6 +1735,50 @@ scipy = [ {file = "scipy-1.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:a5193a098ae9f29af283dcf0041f762601faf2e595c0db1da929875b7570353f"}, {file = "scipy-1.6.1.tar.gz", hash = "sha256:c4fceb864890b6168e79b0e714c585dbe2fd4222768ee90bc1aa0f8218691b11"}, ] +sentencepiece = [ + {file = "sentencepiece-0.1.96-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc969e6694fb27fba7cee2953f350804faf03913f25ae1ee713a7b8a1bc08018"}, + {file = "sentencepiece-0.1.96-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36e9ff61e7b67c5b7ee96733613622620b4802fc8cf188a4dbc1f355b03dde02"}, + {file = "sentencepiece-0.1.96-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e9e9fe8094ca57549d801e9a2017ac5c24108bbf485ea4f8994a72e8e96ee135"}, + {file = "sentencepiece-0.1.96-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b77d27f59d515c43b61745b8173fbe7c7b3014b14b3702a75bf1793471e7def6"}, + {file = "sentencepiece-0.1.96-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1dac8c2ad02b5ebc1179c0a14cbc7d7c6f4fd73d4dd51820626402d0aefc974e"}, + {file = "sentencepiece-0.1.96-cp35-cp35m-macosx_10_6_x86_64.whl", hash = "sha256:e8ec5bb6777e2060e1499750c50e1b69dca5a0f80f90f2c66656c5f3e5244593"}, + {file = "sentencepiece-0.1.96-cp36-cp36m-macosx_10_6_x86_64.whl", hash = "sha256:99ea2d9db19e63a2d17d5dc64f9ace83fb9308a735be05a1aaf98eb4b496fba7"}, + {file = "sentencepiece-0.1.96-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeb090ad462833df03af1debce4ae607a2766ef861f992003ad0c56d074ab805"}, + {file = "sentencepiece-0.1.96-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f8c90df663cd9759b2cf8dd29998b63140ac39e51ada2e739dc13bdac0b4f001"}, + {file = "sentencepiece-0.1.96-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26d20d713b3ba1b7a19205336afb1e93a4327c372b2f795e907b8dc2315ac92e"}, + {file = "sentencepiece-0.1.96-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5388882bb24d083f6cc8cffc5c435f3694a7772b018e06ea6fd84d1044009efb"}, + {file = "sentencepiece-0.1.96-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a92e1932ee8fd500680ccbe1bf53eb33228f4c9d6524ed6f300bcc80ac359f27"}, + {file = "sentencepiece-0.1.96-cp36-cp36m-win32.whl", hash = "sha256:bedf0355117fb4e9b1fc9fc92b4d5ee743a7d468be9f6196e3b94447710ea589"}, + {file = "sentencepiece-0.1.96-cp36-cp36m-win_amd64.whl", hash = "sha256:4997c7ccf2ae462320250314aa5709a88d8a09fa271d073458a07bebf33f8e7c"}, + {file = "sentencepiece-0.1.96-cp37-cp37m-macosx_10_6_x86_64.whl", hash = "sha256:a697257a2cd7581732d7741a8d32a06927f0311c3d277dbc47fa1043350c9d17"}, + {file = "sentencepiece-0.1.96-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff7d752a7f82d87711ec1a95c2262cb74f98be5b457f0300d81a1aefe5be2a95"}, + {file = "sentencepiece-0.1.96-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e61e0757e49c306fff78ea75d6b75773418fe22214b4a460959203be934e834"}, + {file = "sentencepiece-0.1.96-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ef59ba19340dc1d002ce5713b911c0ef23c577b08f8ed57998ee3c8e62c5bf6e"}, + {file = "sentencepiece-0.1.96-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:89c038da7f827a6e2ca4c73aeb4e4b25b99d981ce47dd61b04d446c8200cba1e"}, + {file = "sentencepiece-0.1.96-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d954d25a8705f972e8bfc1dea5464d7e697dd6f4ade092f1a487387e6d6c829a"}, + {file = "sentencepiece-0.1.96-cp37-cp37m-win32.whl", hash = "sha256:fd907a8f744e5337de7fc532dd800c4416b571ea47f8c3c66be10cd1bc67c925"}, + {file = "sentencepiece-0.1.96-cp37-cp37m-win_amd64.whl", hash = "sha256:335bf84d72112cc91f3c3b691d61802fc963503b7772fd8280d20368048b8f3e"}, + {file = "sentencepiece-0.1.96-cp38-cp38-macosx_10_6_x86_64.whl", hash = "sha256:e811984b0908c14c56de7d8226fdd494d87a7ccb75af8ac3a07423037aaafc35"}, + {file = "sentencepiece-0.1.96-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8179785883b556cd517416cdbda6244745414b00ec83132cfe1d26000971f3ae"}, + {file = "sentencepiece-0.1.96-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:466e381f0a812da8fda97a9707498cef3210ea8385a3421bcbadcb5384063969"}, + {file = "sentencepiece-0.1.96-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8cb24d8d0b2f8b7463815a59183eb81ec1d7a06e3217bed456063f3303eddfb"}, + {file = "sentencepiece-0.1.96-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e88354b61f59dfdeb41023f7be8ae31dc627c2dc2dacbc2de8b2d82a0997135c"}, + {file = "sentencepiece-0.1.96-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a336575463d75d3aac1f7e32470b8998643ccd9a73786bd726f6b0470520b6b4"}, + {file = "sentencepiece-0.1.96-cp38-cp38-win32.whl", hash = "sha256:81bb77ba3651114943b2f8f77829cf764137dff06e38f4bf7fa43efea12c7f84"}, + {file = "sentencepiece-0.1.96-cp38-cp38-win_amd64.whl", hash = "sha256:eba0471ab0bb2e07ed06d91ecf5185d402c83d194155a41d8e2aa547d187712e"}, + {file = "sentencepiece-0.1.96-cp39-cp39-macosx_10_6_x86_64.whl", hash = "sha256:78e18d9106c36dcca929e18fd2c412378deac661d47fa3ee25defc55eef8a215"}, + {file = "sentencepiece-0.1.96-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c24c1d9405b2148184ff27c062493d5e3be5c144575f95b5a0d7c660a515af"}, + {file = "sentencepiece-0.1.96-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:940a6999c7d3f55e9d7b194fd5e1f41a7dbed26d3519fb95333216292a39599e"}, + {file = "sentencepiece-0.1.96-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:384148cead5cdab34a4d74fe1fb6a5a8abaafed25eaa4a7698b49dd9482e4c4e"}, + {file = "sentencepiece-0.1.96-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c703e68ea192e45b65c5d5836f6980849d828a18da4189899d7150fad82dc9e"}, + {file = "sentencepiece-0.1.96-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d501713a8396193883aa526f48dc609f5f031a5df1afbafa561cf9ab492ffc76"}, + {file = "sentencepiece-0.1.96-cp39-cp39-win32.whl", hash = "sha256:b8b1dd2712f8a7de5b4c8ec912e6c041d25750bf03e1ce325cdba43bae0944ae"}, + {file = "sentencepiece-0.1.96-cp39-cp39-win_amd64.whl", hash = "sha256:d45e3f78e746aa161bc9f5a31c6a2839c512101113a4065f4d2e7a3ab8198d8c"}, + {file = "sentencepiece-0.1.96-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5513298d62fe63dd0862d08a6eb52a9aa3537006f597f2386184e3f95bb88889"}, + {file = "sentencepiece-0.1.96-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dadccb2e49244b6e64b4527d13ec14d5e094a90b41cf9b963e457e64182f1941"}, + {file = "sentencepiece-0.1.96-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48c6d13b3bfff08060c138248e85df60f6fad11135ad7a8fc2ef6005aacca839"}, + {file = "sentencepiece-0.1.96.tar.gz", hash = "sha256:9bdf097d5bd1d8ce42dfee51f6ff05f5578b96e48c6f6006aa4eff69edfa3639"}, +] setuptools-scm = [ {file = "setuptools_scm-6.4.2-py3-none-any.whl", hash = "sha256:acea13255093849de7ccb11af9e1fb8bde7067783450cee9ef7a93139bddf6d4"}, {file = "setuptools_scm-6.4.2.tar.gz", hash = "sha256:6833ac65c6ed9711a4d5d2266f8024cfa07c533a0e55f4c12f6eff280a5a9e30"}, @@ -1467,6 +1825,46 @@ threadpoolctl = [ {file = "threadpoolctl-3.0.0-py3-none-any.whl", hash = "sha256:4fade5b3b48ae4b1c30f200b28f39180371104fccc642e039e0f2435ec8cc211"}, {file = "threadpoolctl-3.0.0.tar.gz", hash = "sha256:d03115321233d0be715f0d3a5ad1d6c065fe425ddc2d671ca8e45e9fd5d7a52a"}, ] +tokenizers = [ + {file = "tokenizers-0.11.6-cp310-cp310-macosx_10_11_x86_64.whl", hash = "sha256:c24f3e0e69edf015efab6bea0a24d45eb19f477106d00a739c19d2a02f6085fc"}, + {file = "tokenizers-0.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c5a786fe12a4c1782337abc818fc48ca84e07f8cb0eeab263a27fcd30f7fc6f"}, + {file = "tokenizers-0.11.6-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6f7b82aaedb24e0a4dcd8fe77a79de9a0acf43db8ae173cdb4eca1e767566b47"}, + {file = "tokenizers-0.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7d8ea3a05b593e5744c4ad0e6e2cbba6f82588c302d663855316c1861c09557"}, + {file = "tokenizers-0.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fde9a1e7d18caddff3ac13baf4e31235688b0db2ba42bbc8179dc878327560a"}, + {file = "tokenizers-0.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:46a763d1f43f46448e41884356f105a2f067b6e573c7e0c67d8f93512304b22c"}, + {file = "tokenizers-0.11.6-cp310-cp310-win32.whl", hash = "sha256:6bc5cc6d5b17bf8222049a2c97bcc117974793e37fb2e42b8fb04b2ef984d165"}, + {file = "tokenizers-0.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:3c1ad5d230bdd6a3f63bbffd16a9fdea6a049ceb6d225e4d70a2664853f40aaf"}, + {file = "tokenizers-0.11.6-cp36-cp36m-macosx_12_0_arm64.whl", hash = "sha256:44697b08469dfe3265a851f87ad41c7f04efa511ada8182b6b08aa809765dcb8"}, + {file = "tokenizers-0.11.6-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0975b9f06f982580909f9fa769baf58b806ab2d099daccc43dc95d60bf56817a"}, + {file = "tokenizers-0.11.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0deaa700f9e442ed4bb4fe2c6482979b3709772bcce2dd7b89dc586ec39ce2e"}, + {file = "tokenizers-0.11.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34ac8450ad93e4dae1c72b7ad6c6a74d2941a68beb25df25d05b2b371267daba"}, + {file = "tokenizers-0.11.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:38420ddd3b47d6f13be20bfecd928f4301c8cbebd1a752a7436c22fe01b3f6c4"}, + {file = "tokenizers-0.11.6-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:c08d5745fb5852adeeffc6bfbe13b77cd95d3f49e7e6129537858c5fb9b7142c"}, + {file = "tokenizers-0.11.6-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:820a4cc3ef39c556c6f9495ce7cbd169098ca352e073ed3b34d6b74b53df2fbb"}, + {file = "tokenizers-0.11.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c72383a918e9fef9c2bf4666a961f3b312361fb027165b4446ff333441ebf91"}, + {file = "tokenizers-0.11.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6259833c189e36c29e84a853b9503028324a3b176a2ae3980c815456d326b652"}, + {file = "tokenizers-0.11.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:79074927fc9efaf13b3accd53246e50ade37550920077411ab55bd5ed4944153"}, + {file = "tokenizers-0.11.6-cp37-cp37m-win32.whl", hash = "sha256:7ed928ac19a3397af6fe3716b313fb13dcaf54978f0fc159eeabaff8e35e5c92"}, + {file = "tokenizers-0.11.6-cp37-cp37m-win_amd64.whl", hash = "sha256:6840554a8cac1196db627d42edbf77f4b5decf6ce6fa9ca073efaaa2cff887a6"}, + {file = "tokenizers-0.11.6-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:216745a6e92eb52d99b56123e6fece59e0dcf7bd1444f42bee09e1f02c89bbec"}, + {file = "tokenizers-0.11.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e6d02076160d60966d6b2b320744affe6b846ee10a37d1c0222b6ca9e640bdb8"}, + {file = "tokenizers-0.11.6-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7074162348a7784faccbea18cf814138483ce0c47eb17dc482cbc4bbbde8a00c"}, + {file = "tokenizers-0.11.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c5ae264b75b7355db2bc3f34e8e3eb608fcca799ff9a109f3d61e4d9614f947"}, + {file = "tokenizers-0.11.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d393eb6b79ab972e6ebede2aa330903913cf380f6fe975d64a92fca15b5d8579"}, + {file = "tokenizers-0.11.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:251978daef3b57257bd313df7ef705aacc6cd5831644f6e2e8a42e2c7b7c4a30"}, + {file = "tokenizers-0.11.6-cp38-cp38-win32.whl", hash = "sha256:fd3fccc801b7621eca8dfd876494fad0b00bd43fc73afdc1c11d6be3c9136f78"}, + {file = "tokenizers-0.11.6-cp38-cp38-win_amd64.whl", hash = "sha256:3c1c6e10f655e0f57b9bb9a64ac4b7ea70d20a73f8013f8bd38d21d64d45d96a"}, + {file = "tokenizers-0.11.6-cp39-cp39-macosx_10_11_x86_64.whl", hash = "sha256:809b506a6e9f2f6cba86cfe642c1d1e82cbd758574bdc1207efe07229d6fa4d4"}, + {file = "tokenizers-0.11.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5b3829ad386747760e7d805c9ffd5cb5a9309679467029eea3162fb76c8c89dc"}, + {file = "tokenizers-0.11.6-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:b9a34bd33d866862f45bfc4a409563132a0b6af5951e08f3ccfde36152cd7683"}, + {file = "tokenizers-0.11.6-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e75efa0275665ca30536c75dc5b4d33492fc40ae40c90d9085bdcdb99e060044"}, + {file = "tokenizers-0.11.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afc3c76268cdef4567f84a19d9c06fdd697b22f5142d1af18254ec70703db7b"}, + {file = "tokenizers-0.11.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:47878a49211f8df63f7ec7de62f13b1c65e68be501f6a98b28f4bbb8d3390f25"}, + {file = "tokenizers-0.11.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d4f67758f62d64410e86d548c2c38ca5e59310ca38c18e8239637213c49e2fb"}, + {file = "tokenizers-0.11.6-cp39-cp39-win32.whl", hash = "sha256:468c3e3f414a532924fa277a58807e127a27d2a56b04113540ea755fc5ca9ba8"}, + {file = "tokenizers-0.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b28966c68a2cdecd5120f4becea159eebe0335b8202e21e292eb381031026edc"}, + {file = "tokenizers-0.11.6.tar.gz", hash = "sha256:562b2022faf0882586c915385620d1f11798fc1b32bac55353a530132369a6d0"}, +] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, @@ -1475,6 +1873,35 @@ tomli = [ {file = "tomli-2.0.0-py3-none-any.whl", hash = "sha256:b5bde28da1fed24b9bd1d4d2b8cba62300bfb4ec9a6187a957e8ddb9434c5224"}, {file = "tomli-2.0.0.tar.gz", hash = "sha256:c292c34f58502a1eb2bbb9f5bbc9a5ebc37bee10ffb8c2d6bbdfa8eb13cc14e1"}, ] +torch = [ + {file = "torch-1.11.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:62052b50fffc29ca7afc0c04ef8206b6f1ca9d10629cb543077e12967e8d0398"}, + {file = "torch-1.11.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:866bfba29ac98dec35d893d8e17eaec149d0ac7a53be7baae5c98069897db667"}, + {file = "torch-1.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:951640fb8db308a59d9b510e7d1ad910aff92913323bbe4bc75435347ddd346d"}, + {file = "torch-1.11.0-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:5d77b5ece78fdafa5c7f42995ff9474399d22571cd6b2de21a5d666306a2ff8c"}, + {file = "torch-1.11.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:b5a38682769b544c875ecc34bcb81fbad5c922139b61319aacffcfd8a32f528c"}, + {file = "torch-1.11.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f82d77695a60626f2b7382d85bc566de8a6b3e50d32080755abc040db802e419"}, + {file = "torch-1.11.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b96654d42566080a134e784705f33f8536b3b95b5dcde357ed7879b1692a5f78"}, + {file = "torch-1.11.0-cp37-cp37m-win_amd64.whl", hash = "sha256:8ee7c2e8d7f7020d5bfbc1bb91b9591044c26bbd0cee5e4f694cfd7ed8649260"}, + {file = "torch-1.11.0-cp37-none-macosx_10_9_x86_64.whl", hash = "sha256:6860b1d1bf0bb0b67a6bd47f85a0e4c825b518eea13b5d6101999dbbcbd5bc0c"}, + {file = "torch-1.11.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:4322aa29f50da7f404db06cdf30896ea67b09f673af4a985afc7162bc897864d"}, + {file = "torch-1.11.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e4d2e0ddd652f30e94cff750220324ec45705d4ecc69658f773b3cb1c7a28dd0"}, + {file = "torch-1.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:34ce5ea4d8d85da32cdbadb50d4585106901e9f8a3527991daa70c13a09de1f7"}, + {file = "torch-1.11.0-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:0ccc85cd06227a3edf809e2c795fd5762c3d4e8a38b5c9f744c6e7cf841361bb"}, + {file = "torch-1.11.0-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:c1554e49d74f1b2c3e7202d77056ba2dd7465437585bac64062b580f714a44e9"}, + {file = "torch-1.11.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:58c7814502b1c129a650d7092033bbb0bbd64faf1a7941631aaa1aeaddc37570"}, + {file = "torch-1.11.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:831cf588f01dda9409e75576741d2823453990dee2983d670f2584b37a01adf7"}, + {file = "torch-1.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:44a1d02fd20f827f0f36dc26fdcfc45e793806a6ad52769a22260655a77a4369"}, + {file = "torch-1.11.0-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:50fd9bf85c578c871c28f1cb0ace9dfc6024401c7f399b174fb0f370899f4454"}, + {file = "torch-1.11.0-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:0e48af66ad755f0f9c5f2664028a414f57c49d6adc37e77e06fe0004da4edb61"}, +] +tqdm = [ + {file = "tqdm-4.63.1-py2.py3-none-any.whl", hash = "sha256:6461b009d6792008d0000e1b0c7ca50195ec78c0e808a3a6b668a56a3236c3a5"}, + {file = "tqdm-4.63.1.tar.gz", hash = "sha256:4230a49119a416c88cc47d0d2d32d5d90f1a282d5e497d49801950704e49863d"}, +] +transformers = [ + {file = "transformers-4.17.0-py3-none-any.whl", hash = "sha256:5c7d1955693ebf4a69a0fa700b2ef730232d5d7c1528e15d44c1d473b38f57b8"}, + {file = "transformers-4.17.0.tar.gz", hash = "sha256:986fd59255460555b893a2b1827b9b8dd4e5cd6343e4409d18539208f69fb51b"}, +] typing-extensions = [ {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"}, diff --git a/pyproject.toml b/pyproject.toml index cbe03615b43164417732b97e399d40201f5ef61a..ab807256264bbc8ce9973eee7fe1935e57df2cb4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,6 +13,9 @@ sklearn = "^0.0" matplotlib = "^3.5.1" pandas = "1.1.1" cvzone = "^1.5.6" +sentencepiece = "^0.1.96" +transformers = "^4.17.0" +torch = "^1.11.0" [tool.poetry.dev-dependencies] pytest = "^5.2" diff --git a/signtrack/Packr.py b/signtrack/Packr.py index 9b09e82398c310ddc4ed92758ecd41ef78ddbafc..abf9a813f21c9c9cfaacf6fd6e14723122ec0bf3 100644 --- a/signtrack/Packr.py +++ b/signtrack/Packr.py @@ -7,7 +7,11 @@ from os.path import exists def ModelPack(mpath, signs): - filename = 'model.pack' + ''' + Conbines the model with the feature labels + in one file + ''' + filename = 'model.SignTrack' if exists(filename): try: os.remove(filename) @@ -20,7 +24,11 @@ def ModelPack(mpath, signs): def ModelIDUnpack(): - filename = 'model.pack' + ''' + Extracts the model and returns the signs the model + is able to predict + ''' + filename = 'model.SignTrack' with zipfile.ZipFile(filename, 'r') as file: file.extractall('tmp/') return "tmp/Insights/ModelID.npy" diff --git a/signtrack/SignTrack_DataColect.py b/signtrack/SignTrack_DataColect.py index f06fa888d984d2b9d7f52dd398b39080a6246588..a0049c57066d7f241c9f52565302b9d614039122 100644 --- a/signtrack/SignTrack_DataColect.py +++ b/signtrack/SignTrack_DataColect.py @@ -9,10 +9,10 @@ from pathlib import Path from essentials import mediapipe_detection, extract_keypoints, display_styled_landmarks # Dataset export location, Changing requires changes in Signtrack_Train -data_path = os.path.join('TEST') +data_path = os.path.join('Dataset') # Actions that we try to detect, Changing requires changes in Signtrack_Train -signs = np.array(["hello"]) +signs = np.array(["sorry"]) # Number of sequences to be collected for each action no_datapacks = 25 @@ -21,7 +21,7 @@ no_datapacks = 25 seq_length = 24 # Choose camera input -cap = cv2.VideoCapture(0) +cap = cv2.VideoCapture(1) # Resize camera input cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) diff --git a/signtrack/SignTrack_Train.py b/signtrack/SignTrack_Train.py index 5a54a5964a7efe46f1b8ed3b8480ec7bdf819ced..38bbcb305f9654527dd3b4185608de1dc5a52186 100644 --- a/signtrack/SignTrack_Train.py +++ b/signtrack/SignTrack_Train.py @@ -7,6 +7,7 @@ import os from matplotlib import pyplot as plt from sklearn.model_selection import train_test_split from tensorflow.keras.utils import to_categorical +import random from Packr import ModelPack @@ -18,7 +19,7 @@ MODEL_PATH = 'Insights/SignTrack.h5' # Signs that we try to detect signs = np.array(['no', 'thank you', 'me', 'please', 'good', 'morning', 'want', 'go to', 'night', 'how', - 'hello', "what's up", 'yes', 'fine', 'see you later', 'like', 'afternoon', 'you', 'goodbye', 'sorry']) + 'hello', "what's up", 'yes', 'fine', 'see you later', 'like', 'afternoon', 'you', "sorry", 'goodbye']) # Videos are going to be 24 frames in length sequence_length = 24 @@ -33,13 +34,22 @@ for sign in signs: dirs = os.listdir('Dataset/' + sign) for dir in dirs: window = [] + window_aug = [] for frame_num in range(sequence_length): res = np.load(os.path.join(DATA_PATH, sign, str( dir), "{}.npy".format(frame_num))) window.append(res) + window_aug.append(res) + # Randomly duplicating images in a copy of res + # Used for data augmentation + for i in range(round(sequence_length * 0.5)): + rand = random.randint(1, sequence_length-1) + window_aug[rand] = window_aug[rand-1] sequences.append(window) labels.append(label_map[sign]) - print('Data for {} imported'.format(sign)) + sequences.append(window_aug) + labels.append(label_map[sign]) + print('Data for {} imported \n'.format(sign)) X = np.array(sequences) y = to_categorical(labels).astype(int) @@ -50,16 +60,10 @@ log_dir = os.path.join('Insights') X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.15) # Setting up model parameters - -# Our model is set so that it predicts based on a sequence of data model = Sequential() -# Adds an LSTM layer with 64 neurons, that returns its results, activation method is Relu (most common for CNNs) -# to continue on the next layer, with an input shape of (frames per sequence, number of keypoints) model.add(LSTM(64, return_sequences=True, activation='relu', input_shape=(24, 258))) -# Adding an 128 neuron LSTM layer model.add(LSTM(128, return_sequences=True, activation='relu')) -# Adding an 64 neuron LSTM layer this time without returning the data model.add(LSTM(64, return_sequences=False, activation='relu')) model.add(Dense(64, activation='relu')) model.add(Dense(32, activation='relu')) @@ -72,7 +76,7 @@ loss = 1 AutoTrain = model.fit(X_train, y_train, epochs=1) -for i in range(1000): +for i in range(250): if AutoTrain.history['loss'][-1] >= 0.04: AutoTrain = model.fit(X_train, y_train, epochs=1) if AutoTrain.history['loss'][-1] < loss: diff --git a/signtrack/essentials.py b/signtrack/essentials.py index 98eaf2ebb37874a24780dfa09e58194f37783fa5..4b900e6cf664595a7e6e4baf1132b734e5303cd7 100644 --- a/signtrack/essentials.py +++ b/signtrack/essentials.py @@ -3,12 +3,16 @@ import cv2 import numpy as np import mediapipe as mp + mp_holistic = mp.solutions.holistic # Holistic model mp_drawing = mp.solutions.drawing_utils # Drawing utilities -phrases = {('how you'): 'how are you?', + +phrases = {('how you'): 'how are you', ('fine'): "I'm fine", - ('me fine me'): "I am fine"} + ('me fine me'): "I am fine", + ('good.by.e'): "goodbye", + ('Good.by.e'): "goodbye"} def mediapipe_detection(img, model): @@ -83,7 +87,12 @@ def extract_keypoints(results): def grammar_correct(sentence): + """ + Grammar in sign language often differs from the on in written speech. + Using this function, the sentence is corrected from simple grammatical + errors + """ for key in phrases: if key in sentence: - sentence = (sentence.replace(key, phrases[key])).capitalize() + sentence = sentence.replace(key, phrases[key]) return sentence diff --git a/signtrack/__main__.py b/signtrack/main.py similarity index 82% rename from signtrack/__main__.py rename to signtrack/main.py index 62237571de63ee91658e843eb014a93f33d269a5..aa21b70fdce414a6a12767348beb16705d9c9ab0 100644 --- a/signtrack/__main__.py +++ b/signtrack/main.py @@ -9,13 +9,21 @@ import mediapipe as mp from essentials import mediapipe_detection, display_styled_landmarks, extract_keypoints, HandsOnScene, grammar_correct import Packr import random +from transformers import AutoTokenizer, AutoModelForTokenClassification, pipeline + +tokenizer = AutoTokenizer.from_pretrained( + "oliverguhr/fullstop-punctuation-multilang-large") +model = AutoModelForTokenClassification.from_pretrained( + "oliverguhr/fullstop-punctuation-multilang-large") + +pun = pipeline('ner', model=model, tokenizer=tokenizer) # The number of frames per sequence that the model has been trained on seq_length = 24 # Choose camera input -cap = cv2.VideoCapture(0) +cap = cv2.VideoCapture(3) # Resize camera input cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) @@ -87,9 +95,9 @@ def prob_vis(res, actions, input_frame): # Positioning the assets and the text on the image """ Adds the bottom bar on the frame, the position is calculated : - Horizontally: by calculating half of the width of the frame + For the X axis: by calculating half of the width of the frame minus half of the width of the bottom bar - Vertically: by calculating the height of the frame minus + For the Y axis: by calculating the height of the frame minus the height of the bar while leavig 17 pixels space from the top """ @@ -98,9 +106,9 @@ def prob_vis(res, actions, input_frame): """ Adds the top bar on the frame, the position is calculated : - Horizontally: by calculating half of the difference between + For the X axis: by calculating half of the difference between the width of the frame and the width of the bottom bar - Vertically: by calculating the height of the bar minus + For the Y axis: by calculating the height of the bar minus the height of the bar devided by 1.5 """ output_frame = cvzone.overlayPNG( @@ -110,7 +118,7 @@ def prob_vis(res, actions, input_frame): """ Prints the 6 most probable signs on the top bar, the position is calculated knowing that: - Horizontally: the distance between each window is + For the X axis: the distance between each window is 105 pixels, while the first window is 52 pixels from 0 and that each letter has aproximately a 5.25 pixel width @@ -122,7 +130,7 @@ def prob_vis(res, actions, input_frame): """ Prints the probabilities of the 3 most probable signs on the top bar, the position is calculated knowing that: - Horizontally: the distance between each window is + For the X : the distance between each window is 105 pixels, while the first window is 46 from 0axis The Y axis possition remains the same at 53 pixels """ @@ -131,8 +139,8 @@ def prob_vis(res, actions, input_frame): """ Adds the sentence text on the bottom bar, the position is calculated by: - Horizontally: dividing the width of the frame by 6 - Vertically: calculating the difference of the height of the + For the X axis: dividing the width of the frame by 6 + For the Y axis: calculating the difference of the height of the frame and the height of the bar while keeping a 3 pixel distance from the top of the bar """ @@ -184,26 +192,41 @@ while cap.isOpened(): text = grammar_correct((' '.join(sentence))) # Else if hands are not in the scene for the last 5 frames clear sequence data else: + text = grammar_correct((' '.join(sentence))) seq = [] res = np.zeros(shape=len(signs)) # if the hands are not visible in teh last 44 frames clearthe sentence and process the displayed text if not True in HandsOnPrevFrames: if len(sentence) > 0: - text = grammar_correct((' '.join(sentence))) - sentence = [] + sentence = text.capitalize() + # Calling the text model to add punctuation + output_json = pun(sentence) + sentence = "" + text = '' + # Adding the predicted punctuation in the final sentence + for n in output_json: + result = n['word'].replace( + 'â–', ' ') + n['entity'].replace('0', '') + sentence += result + # Capitalizing the needed letters + sentence = sentence.split('. ') + for word in sentence: + text += word[0].upper() + word[1:] + '. ' + text = (grammar_correct(text[1:-2])).capitalize() + sentence = [] # If there are 24 frames in seq then call the model to predict if len(seq) == seq_length: res = model.predict(np.expand_dims(seq, axis=0))[0] """ - In case there is more than 60% the amount of needed data + In case there is more than 65% the amount of needed data call the model to predict in a new version of seq with randomly duplicated frames """ - elif len(seq) >= seq_length * 0.75: + elif len(seq) >= seq_length * 0.65: missing = seq_length - len(seq) seqpros = seq for i in range(missing): diff --git a/signtrack/model.pack b/signtrack/model.pack index 5daf14e8f9b1aeade5e0b440dbc23b89065429f6..0c5d4cafdfced3a552cdeb91a76a339f775de85c 100644 Binary files a/signtrack/model.pack and b/signtrack/model.pack differ diff --git a/tests/Packr.py b/tests/Packr.py index 9b09e82398c310ddc4ed92758ecd41ef78ddbafc..abf9a813f21c9c9cfaacf6fd6e14723122ec0bf3 100644 --- a/tests/Packr.py +++ b/tests/Packr.py @@ -7,7 +7,11 @@ from os.path import exists def ModelPack(mpath, signs): - filename = 'model.pack' + ''' + Conbines the model with the feature labels + in one file + ''' + filename = 'model.SignTrack' if exists(filename): try: os.remove(filename) @@ -20,7 +24,11 @@ def ModelPack(mpath, signs): def ModelIDUnpack(): - filename = 'model.pack' + ''' + Extracts the model and returns the signs the model + is able to predict + ''' + filename = 'model.SignTrack' with zipfile.ZipFile(filename, 'r') as file: file.extractall('tmp/') return "tmp/Insights/ModelID.npy" diff --git a/tests/SignTrack.py b/tests/SignTrack.py index 22885153c7429ec1d4b2f928f6b965bde4229113..aa21b70fdce414a6a12767348beb16705d9c9ab0 100644 --- a/tests/SignTrack.py +++ b/tests/SignTrack.py @@ -9,13 +9,21 @@ import mediapipe as mp from essentials import mediapipe_detection, display_styled_landmarks, extract_keypoints, HandsOnScene, grammar_correct import Packr import random +from transformers import AutoTokenizer, AutoModelForTokenClassification, pipeline + +tokenizer = AutoTokenizer.from_pretrained( + "oliverguhr/fullstop-punctuation-multilang-large") +model = AutoModelForTokenClassification.from_pretrained( + "oliverguhr/fullstop-punctuation-multilang-large") + +pun = pipeline('ner', model=model, tokenizer=tokenizer) # The number of frames per sequence that the model has been trained on seq_length = 24 # Choose camera input -cap = cv2.VideoCapture(0) +cap = cv2.VideoCapture(3) # Resize camera input cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) @@ -184,26 +192,41 @@ while cap.isOpened(): text = grammar_correct((' '.join(sentence))) # Else if hands are not in the scene for the last 5 frames clear sequence data else: + text = grammar_correct((' '.join(sentence))) seq = [] res = np.zeros(shape=len(signs)) # if the hands are not visible in teh last 44 frames clearthe sentence and process the displayed text if not True in HandsOnPrevFrames: if len(sentence) > 0: - text = grammar_correct((' '.join(sentence))) - sentence = [] + sentence = text.capitalize() + # Calling the text model to add punctuation + output_json = pun(sentence) + sentence = "" + text = '' + # Adding the predicted punctuation in the final sentence + for n in output_json: + result = n['word'].replace( + 'â–', ' ') + n['entity'].replace('0', '') + sentence += result + # Capitalizing the needed letters + sentence = sentence.split('. ') + for word in sentence: + text += word[0].upper() + word[1:] + '. ' + text = (grammar_correct(text[1:-2])).capitalize() + sentence = [] # If there are 24 frames in seq then call the model to predict if len(seq) == seq_length: res = model.predict(np.expand_dims(seq, axis=0))[0] """ - In case there is more than 60% the amount of needed data + In case there is more than 65% the amount of needed data call the model to predict in a new version of seq with randomly duplicated frames """ - elif len(seq) >= seq_length * 0.75: + elif len(seq) >= seq_length * 0.65: missing = seq_length - len(seq) seqpros = seq for i in range(missing): diff --git a/tests/SignTrack_Train.py b/tests/SignTrack_Train.py index 5a54a5964a7efe46f1b8ed3b8480ec7bdf819ced..38bbcb305f9654527dd3b4185608de1dc5a52186 100644 --- a/tests/SignTrack_Train.py +++ b/tests/SignTrack_Train.py @@ -7,6 +7,7 @@ import os from matplotlib import pyplot as plt from sklearn.model_selection import train_test_split from tensorflow.keras.utils import to_categorical +import random from Packr import ModelPack @@ -18,7 +19,7 @@ MODEL_PATH = 'Insights/SignTrack.h5' # Signs that we try to detect signs = np.array(['no', 'thank you', 'me', 'please', 'good', 'morning', 'want', 'go to', 'night', 'how', - 'hello', "what's up", 'yes', 'fine', 'see you later', 'like', 'afternoon', 'you', 'goodbye', 'sorry']) + 'hello', "what's up", 'yes', 'fine', 'see you later', 'like', 'afternoon', 'you', "sorry", 'goodbye']) # Videos are going to be 24 frames in length sequence_length = 24 @@ -33,13 +34,22 @@ for sign in signs: dirs = os.listdir('Dataset/' + sign) for dir in dirs: window = [] + window_aug = [] for frame_num in range(sequence_length): res = np.load(os.path.join(DATA_PATH, sign, str( dir), "{}.npy".format(frame_num))) window.append(res) + window_aug.append(res) + # Randomly duplicating images in a copy of res + # Used for data augmentation + for i in range(round(sequence_length * 0.5)): + rand = random.randint(1, sequence_length-1) + window_aug[rand] = window_aug[rand-1] sequences.append(window) labels.append(label_map[sign]) - print('Data for {} imported'.format(sign)) + sequences.append(window_aug) + labels.append(label_map[sign]) + print('Data for {} imported \n'.format(sign)) X = np.array(sequences) y = to_categorical(labels).astype(int) @@ -50,16 +60,10 @@ log_dir = os.path.join('Insights') X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.15) # Setting up model parameters - -# Our model is set so that it predicts based on a sequence of data model = Sequential() -# Adds an LSTM layer with 64 neurons, that returns its results, activation method is Relu (most common for CNNs) -# to continue on the next layer, with an input shape of (frames per sequence, number of keypoints) model.add(LSTM(64, return_sequences=True, activation='relu', input_shape=(24, 258))) -# Adding an 128 neuron LSTM layer model.add(LSTM(128, return_sequences=True, activation='relu')) -# Adding an 64 neuron LSTM layer this time without returning the data model.add(LSTM(64, return_sequences=False, activation='relu')) model.add(Dense(64, activation='relu')) model.add(Dense(32, activation='relu')) @@ -72,7 +76,7 @@ loss = 1 AutoTrain = model.fit(X_train, y_train, epochs=1) -for i in range(1000): +for i in range(250): if AutoTrain.history['loss'][-1] >= 0.04: AutoTrain = model.fit(X_train, y_train, epochs=1) if AutoTrain.history['loss'][-1] < loss: diff --git a/tests/__pycache__/Packr.cpython-37.pyc b/tests/__pycache__/Packr.cpython-37.pyc index c7872d53133091b59d723171827e4795cbec3256..7e43eddda5ad52ddcbd92c947c773a0270ca9433 100644 Binary files a/tests/__pycache__/Packr.cpython-37.pyc and b/tests/__pycache__/Packr.cpython-37.pyc differ diff --git a/tests/__pycache__/essentials.cpython-37.pyc b/tests/__pycache__/essentials.cpython-37.pyc index e7ca6da5b7647920e5e717aa69a7a3a478a1cef1..90c6bc1d285d646edd19bcb178ace3f29abc209a 100644 Binary files a/tests/__pycache__/essentials.cpython-37.pyc and b/tests/__pycache__/essentials.cpython-37.pyc differ diff --git a/tests/essentials.py b/tests/essentials.py index efb38495141e8fdbc27fde8726be848eaf8fce62..4b900e6cf664595a7e6e4baf1132b734e5303cd7 100644 --- a/tests/essentials.py +++ b/tests/essentials.py @@ -3,12 +3,16 @@ import cv2 import numpy as np import mediapipe as mp + mp_holistic = mp.solutions.holistic # Holistic model mp_drawing = mp.solutions.drawing_utils # Drawing utilities + phrases = {('how you'): 'how are you', ('fine'): "I'm fine", - ('me fine me'): "I am fine"} + ('me fine me'): "I am fine", + ('good.by.e'): "goodbye", + ('Good.by.e'): "goodbye"} def mediapipe_detection(img, model): @@ -83,6 +87,11 @@ def extract_keypoints(results): def grammar_correct(sentence): + """ + Grammar in sign language often differs from the on in written speech. + Using this function, the sentence is corrected from simple grammatical + errors + """ for key in phrases: if key in sentence: sentence = sentence.replace(key, phrases[key])