From abe54f1befc7c3559172b8e10294c233624bbfac Mon Sep 17 00:00:00 2001 From: Sara 'Moose' van de Moosdijk Date: Fri, 6 Dec 2019 10:27:23 +1100 Subject: [PATCH 01/25] Setting up sign and speak repo --- reinvent-2019/sign-and-speak/LICENSE | 175 ++++++++++++++++++ reinvent-2019/sign-and-speak/README.md | 57 ++++++ .../img/sign-and-speak-logo-small.png.png | Bin 0 -> 30128 bytes 3 files changed, 232 insertions(+) create mode 100644 reinvent-2019/sign-and-speak/LICENSE create mode 100644 reinvent-2019/sign-and-speak/README.md create mode 100644 reinvent-2019/sign-and-speak/img/sign-and-speak-logo-small.png.png diff --git a/reinvent-2019/sign-and-speak/LICENSE b/reinvent-2019/sign-and-speak/LICENSE new file mode 100644 index 00000000..67db8588 --- /dev/null +++ b/reinvent-2019/sign-and-speak/LICENSE @@ -0,0 +1,175 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. diff --git a/reinvent-2019/sign-and-speak/README.md b/reinvent-2019/sign-and-speak/README.md new file mode 100644 index 00000000..227e8c44 --- /dev/null +++ b/reinvent-2019/sign-and-speak/README.md @@ -0,0 +1,57 @@ +# Sign & Speak - AI-powered Communication + +
+ +## Project Overview + +TODO + +## Project Abstract + +Sign & Speak facilitates communication between users of spoken language and users of sign language. By applying AI models trained to transcribe speech and interpret sign language, combined with a camera and a microphone, the tool enables two-way conversation in situations where communication was previously challenging. + +## Architecture + +TODO + +## User Guide + +TODO + +### Machine Learning Model + +TODO + +#### Creating a data set + +TODO + +#### Training and deploying a model + +TODO + +### User Interface + +TODO + +## FAQ + +TODO - Add more Q/A + +**Q: There is more than one sign language?** +**A:** TODO + +**Q: Will this method work for sign languages other than Auslan?** +**A:** TODO + +**Q: Can you share your Auslan data set and/or model?** +**A:** TODO + +## Authors + +Sara 'Moose' van de Moosdijk, AWS ([GitHub](https://github.com/moose-in-australia/) | [LinkedIn](https://www.linkedin.com/in/saravandemoosdijk/)) +Eshaan Anand, AWS (GitHub | LinkedIn) + +## License + +This library is licensed under the Apache 2.0 License. \ No newline at end of file diff --git a/reinvent-2019/sign-and-speak/img/sign-and-speak-logo-small.png.png b/reinvent-2019/sign-and-speak/img/sign-and-speak-logo-small.png.png new file mode 100644 index 0000000000000000000000000000000000000000..e9daf5a1d066c411a36e00b9db3a43a452314bb1 GIT binary patch literal 30128 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 KiUR?Lzy1#s#20J; literal 0 HcmV?d00001 From 615ff03573bc570526887c1059037604fd57f8ed Mon Sep 17 00:00:00 2001 From: Sara 'Moose' van de Moosdijk Date: Fri, 6 Dec 2019 10:29:28 +1100 Subject: [PATCH 02/25] Fixed file name --- ...-small.png.png => sign-and-speak-logo-small.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename reinvent-2019/sign-and-speak/img/{sign-and-speak-logo-small.png.png => sign-and-speak-logo-small.png} (100%) diff --git a/reinvent-2019/sign-and-speak/img/sign-and-speak-logo-small.png.png b/reinvent-2019/sign-and-speak/img/sign-and-speak-logo-small.png similarity index 100% rename from reinvent-2019/sign-and-speak/img/sign-and-speak-logo-small.png.png rename to reinvent-2019/sign-and-speak/img/sign-and-speak-logo-small.png From 17d233236ad228606ad175ff35642552ed236d34 Mon Sep 17 00:00:00 2001 From: Sara 'Moose' van de Moosdijk Date: Fri, 6 Dec 2019 10:33:43 +1100 Subject: [PATCH 03/25] Trying to fix image centering --- reinvent-2019/sign-and-speak/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reinvent-2019/sign-and-speak/README.md b/reinvent-2019/sign-and-speak/README.md index 227e8c44..50bbae57 100644 --- a/reinvent-2019/sign-and-speak/README.md +++ b/reinvent-2019/sign-and-speak/README.md @@ -1,6 +1,6 @@ # Sign & Speak - AI-powered Communication -
+

## Project Overview From fd64d483f83511bb4e00022093e859298d5c4450 Mon Sep 17 00:00:00 2001 From: Sara 'Moose' van de Moosdijk Date: Fri, 6 Dec 2019 10:50:36 +1100 Subject: [PATCH 04/25] Adding architecture diagram --- reinvent-2019/sign-and-speak/README.md | 15 ++++++++++++++- .../img/sign-and-speak-architecture.png | Bin 0 -> 134100 bytes 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 reinvent-2019/sign-and-speak/img/sign-and-speak-architecture.png diff --git a/reinvent-2019/sign-and-speak/README.md b/reinvent-2019/sign-and-speak/README.md index 50bbae57..d8c4c80f 100644 --- a/reinvent-2019/sign-and-speak/README.md +++ b/reinvent-2019/sign-and-speak/README.md @@ -10,10 +10,16 @@ TODO Sign & Speak facilitates communication between users of spoken language and users of sign language. By applying AI models trained to transcribe speech and interpret sign language, combined with a camera and a microphone, the tool enables two-way conversation in situations where communication was previously challenging. -## Architecture +## Participant Experience TODO +## Architecture + +TODO - describe architecture + +

+ ## User Guide TODO @@ -39,12 +45,19 @@ TODO TODO - Add more Q/A **Q: There is more than one sign language?** + **A:** TODO **Q: Will this method work for sign languages other than Auslan?** + **A:** TODO **Q: Can you share your Auslan data set and/or model?** + +**A:** TODO + +**Q: What is the animal in your logo?** + **A:** TODO ## Authors diff --git a/reinvent-2019/sign-and-speak/img/sign-and-speak-architecture.png b/reinvent-2019/sign-and-speak/img/sign-and-speak-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..c46bce1ab1220b0e3fb5d8761d7bc3b380153f00 GIT binary patch literal 134100 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 Ntt?6Yn+iU)mG6@x&_$?PEL?b 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 z%0D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%0DL1Uzow==?;omFrbzNk7gu{uj`6nJdMQ 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 Date: Fri, 6 Dec 2019 11:03:15 +1100 Subject: [PATCH 05/25] Adding Sign & Speak project to project list --- reinvent-2019/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/reinvent-2019/README.md b/reinvent-2019/README.md index 80093e84..d10a62f9 100644 --- a/reinvent-2019/README.md +++ b/reinvent-2019/README.md @@ -17,6 +17,7 @@ A collection of templates, sample code and documentation from the re:Invent 2019 | [Learn Languages with AWS AI/ML](learn-languages-ai-ml) | A casual game to learn languages with AWS AI/ML | | [Polyglot Bot](polyglot-bot) | A greeter bot that recognizes your greeting language and wish you back in the same language with hand gesture | | [Rhythm Cloud](rhythm-cloud) | Learn to play the drums and learn AWS IoT | +| [Sign & Speak](sign-and-speak) | A communication tool for users of sign language and users of spoken language, allowing for simple conversation through the use of AI/ML | | [Skittles Sorter](skittle-sorter) | The Skittles Sorter automagically sorts your favorite snack based on their color, powered by the AWS IoT suite of services | | [Sports Scoring using Machine Learning](sports-scoring-using-machine-learning) | Track and display the score of a Cornhole game using a camera and Amazon SageMaker | | [Walking Robot](walking-robot) | We use AWS RoboMaker to design, simulate and then help build a physical limbs and motors, we then use Sagemaker to help learn balance and then IoT to control and use feedback of real-world measurements to compare with the simulated data | From 4a7977bb2f22d993bf295cd4f87b735243ad7dd7 Mon Sep 17 00:00:00 2001 From: Sara 'Moose' van de Moosdijk Date: Fri, 6 Dec 2019 11:03:33 +1100 Subject: [PATCH 06/25] Fixed line break --- reinvent-2019/sign-and-speak/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/reinvent-2019/sign-and-speak/README.md b/reinvent-2019/sign-and-speak/README.md index d8c4c80f..19fc16a6 100644 --- a/reinvent-2019/sign-and-speak/README.md +++ b/reinvent-2019/sign-and-speak/README.md @@ -63,6 +63,7 @@ TODO - Add more Q/A ## Authors Sara 'Moose' van de Moosdijk, AWS ([GitHub](https://github.com/moose-in-australia/) | [LinkedIn](https://www.linkedin.com/in/saravandemoosdijk/)) + Eshaan Anand, AWS (GitHub | LinkedIn) ## License From 4ccc38bb05faf3b227e4050ff082b996842adfbd Mon Sep 17 00:00:00 2001 From: Sara 'Moose' van de Moosdijk Date: Fri, 6 Dec 2019 11:24:55 +1100 Subject: [PATCH 07/25] Added FAQ content --- reinvent-2019/sign-and-speak/README.md | 38 ++++++++++++++++---------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/reinvent-2019/sign-and-speak/README.md b/reinvent-2019/sign-and-speak/README.md index 19fc16a6..f530a68e 100644 --- a/reinvent-2019/sign-and-speak/README.md +++ b/reinvent-2019/sign-and-speak/README.md @@ -2,70 +2,78 @@

-## Project Overview +## 1. Project Overview TODO -## Project Abstract +## 2. Project Abstract Sign & Speak facilitates communication between users of spoken language and users of sign language. By applying AI models trained to transcribe speech and interpret sign language, combined with a camera and a microphone, the tool enables two-way conversation in situations where communication was previously challenging. -## Participant Experience +## 3. Participant Experience TODO -## Architecture +## 4. Architecture TODO - describe architecture

-## User Guide +## 5. User Guide TODO -### Machine Learning Model +### 5.1 Machine Learning Model TODO -#### Creating a data set +#### 5.1.1 Creating a data set TODO -#### Training and deploying a model +#### 5.1.2 Training and deploying a model TODO -### User Interface +### 5.2 User Interface TODO -## FAQ +## 6. FAQ TODO - Add more Q/A **Q: There is more than one sign language?** -**A:** TODO +**A:** Yes! By some estimates there are perhaps [300 sign languages](https://en.wikipedia.org/wiki/List_of_sign_languages). Although ASL (American Sign Language) is probably the most well-known of these languages, the Sign & Speak project was built to support [Auslan](https://en.wikipedia.org/wiki/Auslan) (Australian Sign Language). **Q: Will this method work for sign languages other than Auslan?** -**A:** TODO +**A:** We believe our method can be applied to any sign language. All you need is the training data to train a new model for the sign language of your choice. We describe our approach for collecting training data in the User Guide section of this document. **Q: Can you share your Auslan data set and/or model?** +**A:** To protect the privacy of the volunteers who helped us build our Auslan model, we will not release the data or the model. However, with the code made available in this repository, you can train a new model on your own data. + +**Q: What are the limitations of this method?** + **A:** TODO -**Q: What is the animal in your logo?** +**Q: What are the future plans for this project?** **A:** TODO -## Authors +**Q: What is the animal in your logo?** + +**A:** It's a [quokka](https://duckduckgo.com/?q=quokka&t=ffnt&atb=v176-1&iax=images&ia=images), a marsupial found only in Australia. We are not professional artists. ;) + +## 7. Authors Sara 'Moose' van de Moosdijk, AWS ([GitHub](https://github.com/moose-in-australia/) | [LinkedIn](https://www.linkedin.com/in/saravandemoosdijk/)) Eshaan Anand, AWS (GitHub | LinkedIn) -## License +## 8. License This library is licensed under the Apache 2.0 License. \ No newline at end of file From c0194c16aedf262cab6faed5a3064b93be688003 Mon Sep 17 00:00:00 2001 From: Sara 'Moose' van de Moosdijk Date: Fri, 6 Dec 2019 11:47:49 +1100 Subject: [PATCH 08/25] Added hardware and equipment section --- reinvent-2019/sign-and-speak/README.md | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/reinvent-2019/sign-and-speak/README.md b/reinvent-2019/sign-and-speak/README.md index f530a68e..85adbe02 100644 --- a/reinvent-2019/sign-and-speak/README.md +++ b/reinvent-2019/sign-and-speak/README.md @@ -22,21 +22,32 @@ TODO - describe architecture ## 5. User Guide -TODO +This section describes how to set up the project on your own AWS account. + +### 5.1 Hardware and Equipment + +Below is a list of hardware and equipment used during the demo, in combination with the laptop running the demo itself. + +* Webcam with USB connector +* Directional microphone with USB connector +* White canvas background + stand +* Height-adjustable tripods for webcam and microphone +* Additional monitor (*optional*) +* Softbox lighting kit (*optional*) -### 5.1 Machine Learning Model +### 5.2 Machine Learning Model TODO -#### 5.1.1 Creating a data set +#### 5.2.1 Creating a data set TODO -#### 5.1.2 Training and deploying a model +#### 5.2.2 Training and deploying a model TODO -### 5.2 User Interface +### 5.3 User Interface TODO From 8ca844895cc9b22e03a029983a45948360b26b71 Mon Sep 17 00:00:00 2001 From: Sara 'Moose' van de Moosdijk Date: Fri, 6 Dec 2019 12:33:43 +1100 Subject: [PATCH 09/25] Added participant experience details --- reinvent-2019/sign-and-speak/README.md | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/reinvent-2019/sign-and-speak/README.md b/reinvent-2019/sign-and-speak/README.md index 85adbe02..5f36943e 100644 --- a/reinvent-2019/sign-and-speak/README.md +++ b/reinvent-2019/sign-and-speak/README.md @@ -12,7 +12,27 @@ Sign & Speak facilitates communication between users of spoken language and user ## 3. Participant Experience -TODO +The Sign & Speak demo allows two participants to complete two scripted conversations, where one participant uses Auslan (Australian sign language) and one participant uses English. The Auslan user stands in front of a webcam, with a white background behind them, and is shown the 'Sign' page of the UI. The English user stands in front of a directional microphone, and is shown the 'Speak' page of the UI. Both UI components allow the participants to record their interaction through start/stop buttons. + +The table below shows the two scripted conversations supported in the demo, where *A* is the Auslan user and *E* is the English user. + +| Conversation #1 | Conversation #2 | +| A: Hello.
E: Hi! How are you?
A: Good. How are you?
E: I'm doing well. What are you planning tonight?
A: Going to the pub.
E: Oh cool, I'd love to join you. What time are you going?
A: At 20:00
E: See you there!
A: Goodbye | A: Pleased to meet you.
E: Likewise. How are you?
A: Good. How are you?
E: I'm doing well. What are you up to tonight?
A: Going to a restaurant.
E: Sound great, I'd love to join you. At what time are you going?
A: At 20:00
E: See you there!
A: Goodbye | + +In addition to the two-way conversation, the demo allows for individual participants to test the Auslan transcription model seperately. When testing the Auslan model, participants can choose from the following list of supported words and phrases: + +* Cat +* Friend +* Grandfather +* Grandmother +* Hello +* Goodbye +* Pleased to meet you +* Good! How are you? +* Thank you +* Eight 'o clock +* Restaurant +* Pub ## 4. Architecture From f05fdc08939ed49d1ff170be6cb668609c4ab21d Mon Sep 17 00:00:00 2001 From: Sara 'Moose' van de Moosdijk Date: Fri, 6 Dec 2019 12:40:11 +1100 Subject: [PATCH 10/25] Fix table --- reinvent-2019/sign-and-speak/README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/reinvent-2019/sign-and-speak/README.md b/reinvent-2019/sign-and-speak/README.md index 5f36943e..db3e7c7a 100644 --- a/reinvent-2019/sign-and-speak/README.md +++ b/reinvent-2019/sign-and-speak/README.md @@ -17,7 +17,16 @@ The Sign & Speak demo allows two participants to complete two scripted conversat The table below shows the two scripted conversations supported in the demo, where *A* is the Auslan user and *E* is the English user. | Conversation #1 | Conversation #2 | -| A: Hello.
E: Hi! How are you?
A: Good. How are you?
E: I'm doing well. What are you planning tonight?
A: Going to the pub.
E: Oh cool, I'd love to join you. What time are you going?
A: At 20:00
E: See you there!
A: Goodbye | A: Pleased to meet you.
E: Likewise. How are you?
A: Good. How are you?
E: I'm doing well. What are you up to tonight?
A: Going to a restaurant.
E: Sound great, I'd love to join you. At what time are you going?
A: At 20:00
E: See you there!
A: Goodbye | +| A: Hello. | A: Pleased to meet you. | +| E: Hi! How are you? | E: Likewise. How are you? | +| A: Good. How are you? | A: Good. How are you? | +| E: I'm doing well. What are you planning tonight? | E: I'm doing well. What are you up to tonight? | +| A: Going to the pub. | A: Going to a restaurant. | +| E: Oh cool, I'd love to join you. What time are you going? | | +| A: At 20:00 | E: Sound great, I'd love to join you. At what time are you going? | +| E: See you there! | A: At 20:00 | +| A: Goodbye | E: See you there! | +| | A: Goodbye | In addition to the two-way conversation, the demo allows for individual participants to test the Auslan transcription model seperately. When testing the Auslan model, participants can choose from the following list of supported words and phrases: From 6c42992994346cfb3b36370a7af7e540043185f8 Mon Sep 17 00:00:00 2001 From: Sara 'Moose' van de Moosdijk Date: Fri, 6 Dec 2019 17:12:59 +1100 Subject: [PATCH 11/25] Adding model information and architecture details --- reinvent-2019/sign-and-speak/README.md | 29 +++++++++++++++++++------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/reinvent-2019/sign-and-speak/README.md b/reinvent-2019/sign-and-speak/README.md index db3e7c7a..5b7635ba 100644 --- a/reinvent-2019/sign-and-speak/README.md +++ b/reinvent-2019/sign-and-speak/README.md @@ -17,16 +17,16 @@ The Sign & Speak demo allows two participants to complete two scripted conversat The table below shows the two scripted conversations supported in the demo, where *A* is the Auslan user and *E* is the English user. | Conversation #1 | Conversation #2 | +| ------------- | ------------- | | A: Hello. | A: Pleased to meet you. | | E: Hi! How are you? | E: Likewise. How are you? | | A: Good. How are you? | A: Good. How are you? | | E: I'm doing well. What are you planning tonight? | E: I'm doing well. What are you up to tonight? | | A: Going to the pub. | A: Going to a restaurant. | -| E: Oh cool, I'd love to join you. What time are you going? | | -| A: At 20:00 | E: Sound great, I'd love to join you. At what time are you going? | -| E: See you there! | A: At 20:00 | -| A: Goodbye | E: See you there! | -| | A: Goodbye | +| E: Oh cool, I'd love to join you. What time are you going? | E: Sound great, I'd love to join you. At what time are you going? | +| A: At 20:00 | A: At 20:00 | +| E: See you there! | E: See you there! | +| A: Goodbye | A: Goodbye | In addition to the two-way conversation, the demo allows for individual participants to test the Auslan transcription model seperately. When testing the Auslan model, participants can choose from the following list of supported words and phrases: @@ -45,7 +45,12 @@ In addition to the two-way conversation, the demo allows for individual particip ## 4. Architecture -TODO - describe architecture +The image below shows the full architecture for the two-way communication demo. + +1. A video recording is made of the Auslan user signing a word or phrase. This video is uploaded to an Amazon S3 bucket. +1. The video upload triggers an AWS Lambda function which transforms the video into an image (a grid of frames). +1. A second AWS Lambda function sends the image to an Amazon SageMaker inference endpoint and waits for the response. It stores the resulting message in Amazon DynamoDB. +1. TODO - continue describing the process

@@ -66,13 +71,21 @@ Below is a list of hardware and equipment used during the demo, in combination w ### 5.2 Machine Learning Model -TODO +The sign language machine learning model is created using [PyTorch](https://pytorch.org/) in [Amazon SageMaker](https://aws.amazon.com/sagemaker/). This section describes the process of training a new model from scratch. #### 5.2.1 Creating a data set +First, you need to decide on a set of words and short phrases which the demo should support. We used the list of 12 words and phrases listed in section 3. The model performs better on signs which are visually distinct, but with enough training data, it can distinguish between similar signs such as grandfather and grandmother. + +Second, you need to determine the audience for your demo. At re:Invent, we expected to see adult participants, with no prior knowledge of Auslan, and various nationalities, genders, clothing styles, and other visual features. To create a robust model for our expected audience, we asked 64 colleagues from different AWS offices to help us create training data. + +We controlled for factors such as background and lighting by choosing to only support a white background with even lighting. After completing the recording sessions with volunteers, and discarding unsuitable recordings, we were left with 42-72 videos per word or phrase. + +#### 5.2.2. Video preprocessing + TODO -#### 5.2.2 Training and deploying a model +#### 5.2.3 Training and deploying a model TODO From 765a1bf5f0d2b8722f085d8a6331f81c3c2048ca Mon Sep 17 00:00:00 2001 From: Sara 'Moose' van de Moosdijk Date: Sun, 15 Dec 2019 11:56:41 +1100 Subject: [PATCH 12/25] First version scripts for sign language training and inference --- .../sign-and-speak/scripts/grid_serve.py | 111 ++++++++++ .../sign-and-speak/scripts/grid_train.py | 195 ++++++++++++++++++ 2 files changed, 306 insertions(+) create mode 100644 reinvent-2019/sign-and-speak/scripts/grid_serve.py create mode 100644 reinvent-2019/sign-and-speak/scripts/grid_train.py diff --git a/reinvent-2019/sign-and-speak/scripts/grid_serve.py b/reinvent-2019/sign-and-speak/scripts/grid_serve.py new file mode 100644 index 00000000..de0af361 --- /dev/null +++ b/reinvent-2019/sign-and-speak/scripts/grid_serve.py @@ -0,0 +1,111 @@ +"""Sign & Speak Inference Script + +This script defines the methods required by Amazon SageMaker to create an +inference endpoint for the Sign & Speak project. It expects image input, +where each image is a 3x3 grid of video frames, and is stored in an Amazon S3 +bucket. The output is the text version of the label and a confidence score. + +Input sent to the endpoint should be JSON with the following format: +{'grid': } + +Output returned will be JSON with the following format: +{'output': , +'confidence': } +""" + +import json +import logging +import os +import tempfile +import re + +import boto3 +import torch +from torchvision import transforms +from PIL import Image + + +logger = logging.getLogger(__name__) +JSON_CONTENT_TYPE = 'application/json' +# Define a data transformation similar to the one used to train the original ResNet model +transform = transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) + ]) +classes = {} + + +def model_fn(model_dir): + """ + Loads the trained model from the model directory. + """ + logger.info('Loading the model.') + logger.info(model_dir) + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + logger.info('Current device: {}'.format(device)) + if device == "cuda": + model = torch.load(os.path.join(model_dir, 'model.pth')) #GPU + else: + model = torch.load(os.path.join(model_dir, 'model.pth'), map_location="cpu") #CPU + model.to(device).eval() + + logger.info('Loading the classes.') + global classes + with open(os.path.join(model_dir, 'class_indices.json'), 'r') as file_handler: + classes = json.load(file_handler) + + return model + + +def input_fn(serialized_input_data, content_type=JSON_CONTENT_TYPE): + """ + Loads the JSON input, fetches the image from S3, and transforms the image. + """ + logger.info('Deserializing the input data.') + if content_type == JSON_CONTENT_TYPE: + # Load JSON input + input_data = json.loads(serialized_input_data) + image_loc_s3 = input_data['grid'] + + # Fetch bucket and object details + url_components = re.search("s3://(.+?)/(.*)", image_loc_s3) + bucket_name = url_components.group(1) + object_name = url_components.group(2) + + # Load image file from S3 bucket + tmp = tempfile.NamedTemporaryFile() + with open(tmp.name, 'wb') as file_handle: + s3_client = boto3.client('s3') + s3_client.download_fileobj(bucket_name, object_name, file_handle) + image = Image.open(tmp.name) + + # Transform image same as during training + transformed_image = transform(image) + model_input = transformed_image.unsqueeze(0) + return model_input + raise Exception("Requested unsupported ContentType in content_type: {}".format(content_type)) + + +def output_fn(prediction_output, accept=JSON_CONTENT_TYPE): + """ + Transforms the model output to return the text label instead of its index. Returns + the result as JSON. + """ + logger.info('Serializing the generated output.') + logger.info("Original output is {}".format(prediction_output)) + + # Normalize the confidence value to be a float value between 0 and 1 + normalized_output = torch.nn.functional.softmax(prediction_output[0], dim=0) + batched_norm = normalized_output.unsqueeze(0) + values, indices = torch.max(batched_norm.data, 1) + + # Fetch the text label based on the label index + #classes = {"cat": 0, "eight o clock": 1, "friend": 2, "good how are you": 3, "goodbye": 4, "grandfather": 5, "grandmother": 6, "hello": 7, "pleased to meet you": 8, "pub": 9, "restaurant": 10, "thank you": 11} + for label, index in classes.items(): + if index == indices.item(): + class_from_idx = label + + # Format and return the final result + if accept == JSON_CONTENT_TYPE: + return json.dumps({'output': class_from_idx, 'confidence': values.item()}), accept + raise Exception('Requested unsupported ContentType in Accept: ' + accept) diff --git a/reinvent-2019/sign-and-speak/scripts/grid_train.py b/reinvent-2019/sign-and-speak/scripts/grid_train.py new file mode 100644 index 00000000..33164a32 --- /dev/null +++ b/reinvent-2019/sign-and-speak/scripts/grid_train.py @@ -0,0 +1,195 @@ +"""Sign & Speak Training Script + +This script uses transfer learning on a ResNet18 model from the PyTorch model zoo +to train an image classification model for a limited set of sign language words +and phrases. It is compatible with Amazon SageMaker, which can be used to run +training and hyperparameter tuning jobs from this script. + +The input consists of 3x3 grid images of video frames, organized into folders +for each label (e.g., a folder named 'cat' contains all training images for +the sign for cat). + +The code is based on this tutorial: +https://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html +""" + +import time +import copy +import logging +import sys +import argparse +import json +import os + +import numpy as np +import torch +from torch.utils.data.sampler import SubsetRandomSampler +from torch.utils.data import DataLoader +import torch.nn as nn +import torch.optim as optim +from torch.optim import lr_scheduler +from torchvision import transforms +from torchvision.datasets import ImageFolder +from torchvision import models + + +logger = logging.getLogger(__name__) +logger.setLevel(logging.DEBUG) +logger.addHandler(logging.StreamHandler(sys.stdout)) + + +def save_model(model, model_dir): + """ + Saves the entire PyTorch model in the model + artifact directory. + """ + logger.info("Saving the model.") + path = os.path.join(model_dir, 'model.pth') + torch.save(model, path) + + +def save_classes(class_to_idx, output_dir): + """ + Saves the dictionary of indices assigned to + labels in the output directory as a JSON file. + """ + logger.info("Saving classes.") + with open(os.path.join(output_dir, "class_indices.json"), "w") as file_handle: + json.dump(class_to_idx, file_handle) + + +def train(args): + """ + Splits the data set into training and validation sets, transforms the data, + and runs the training epochs. + """ + + # Define a data transformation similar to the one used to train the original ResNet model + data_transform = transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) + ]) + + # Load data from an image folder structure (one folder per label) + dataset = ImageFolder(args.data_dir, transform=data_transform) + class_names = dataset.classes + + # Shuffle and define split of data into training and validation sets + validation_split = .1 + shuffle_dataset = True + dataset_size = len(dataset) + indices = list(range(dataset_size)) + split = int(np.floor(validation_split * dataset_size)) + if shuffle_dataset : + np.random.seed(args.seed) + np.random.shuffle(indices) + train_indices, val_indices = indices[split:], indices[:split] + dataset_sizes = {'train': len(train_indices), + 'val': len(val_indices)} + samplers = {'train': SubsetRandomSampler(train_indices), + 'val': SubsetRandomSampler(val_indices)} + + dataloaders = {x: DataLoader(dataset, batch_size=args.batch_size, + sampler=samplers[x]) + for x in ['train', 'val']} + + + # Load and set up pretrained ResNet model + device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") + model_ft = models.resnet18(pretrained=True) + num_ftrs = model_ft.fc.in_features + logger.info("Number of classes is {}".format(len(class_names))) + model_ft.fc = nn.Linear(num_ftrs, len(class_names)) + model_ft = model_ft.to(device) + criterion = nn.CrossEntropyLoss() + + # Observe that all parameters are being optimized + optimizer_ft = optim.SGD(model_ft.parameters(), lr=args.lr, momentum=args.momentum) + + # Decay learning rate + exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=args.step_size, gamma=args.gamma) + + since = time.time() + best_model_wts = copy.deepcopy(model_ft.state_dict()) + best_acc = 0.0 + num_epochs = args.epochs + + for epoch in range(num_epochs): + logger.info('Epoch {}/{}'.format(epoch, num_epochs - 1)) + logger.info('-' * 10) + + # Each epoch has a training and validation phase + for phase in ['train', 'val']: + if phase == 'train': + model_ft.train() # Set model to training mode + else: + model_ft.eval() # Set model to evaluate mode + + running_loss = 0.0 + running_corrects = 0 + + # Iterate over data. + for inputs, labels in dataloaders[phase]: + inputs = inputs.to(device) + labels = labels.to(device) + + # zero the parameter gradients + optimizer_ft.zero_grad() + + # forward + # track history if only in train + with torch.set_grad_enabled(phase == 'train'): + outputs = model_ft(inputs) + _, preds = torch.max(outputs, 1) + loss = criterion(outputs, labels) + + # backward + optimize only if in training phase + if phase == 'train': + loss.backward() + optimizer_ft.step() + + # statistics + running_loss += loss.item() * inputs.size(0) + running_corrects += torch.sum(preds == labels.data) + + if phase == 'train': + exp_lr_scheduler.step() + + epoch_loss = running_loss / dataset_sizes[phase] + epoch_acc = running_corrects.double() / dataset_sizes[phase] + + logger.info('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc)) + + # Track the best validation accuracy + if phase == 'val' and epoch_acc > best_acc: + best_acc = epoch_acc + best_model_wts = copy.deepcopy(model_ft.state_dict()) + + time_elapsed = time.time() - since + logger.info('Training complete in {:.0f}m {:.0f}s'.format(time_elapsed // 60, time_elapsed % 60)) + logger.info('Best val Acc: {:4f}'.format(best_acc)) + + # Load best model weights and save this model + model_ft.load_state_dict(best_model_wts) + save_model(model_ft, args.model_dir) + save_classes(dataset.class_to_idx, args.model_dir) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + + # Parameters specific to the deep learning model + parser.add_argument('--batch-size', type=int, default=4, help='input batch size for training (default: 4)') + parser.add_argument('--epochs', type=int, default=25, help='number of epochs to train (default: 25)') + parser.add_argument('--lr', type=float, default=0.001, help='learning rate (default: 0.001)') + parser.add_argument('--momentum', type=float, default=0.9, help='SGD momentum (default: 0.9)') + parser.add_argument('--seed', type=int, default=42, help='random seed (default: 42)') + parser.add_argument('--step-size', type=int, default=7, help='step size (default: 7)') + parser.add_argument('--gamma', type=float, default=0.1, help='gamma (default: 0.1)') + + # Amazon SageMaker container environment variables + parser.add_argument('--model-dir', type=str, default=os.environ['SM_MODEL_DIR'], help='path to the directory to write model artifacts to') + parser.add_argument('--data-dir', type=str, default=os.environ['SM_CHANNEL_TRAINING'], help='path to the directory containing the training data') + + train(parser.parse_args()) + \ No newline at end of file From ed0a3091e52d4c021032807f18f5ac9bcb5665ba Mon Sep 17 00:00:00 2001 From: Sara 'Moose' van de Moosdijk Date: Sun, 15 Dec 2019 13:14:52 +1100 Subject: [PATCH 13/25] Training and deployment instructions --- .../scripts/ML Instructions.ipynb | 288 ++++++++++++++++++ 1 file changed, 288 insertions(+) create mode 100644 reinvent-2019/sign-and-speak/scripts/ML Instructions.ipynb diff --git a/reinvent-2019/sign-and-speak/scripts/ML Instructions.ipynb b/reinvent-2019/sign-and-speak/scripts/ML Instructions.ipynb new file mode 100644 index 00000000..0ed560d5 --- /dev/null +++ b/reinvent-2019/sign-and-speak/scripts/ML Instructions.ipynb @@ -0,0 +1,288 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Sign & Speak ML Instructions\n", + "\n", + "This notebook shows how to use Amazon SageMaker to run the training and inference scripts for the Sign & Speak project.\n", + "\n", + "Use the `conda_pytorch_p36` kernel to run the cells in this notebook.\n", + "\n", + "## Training\n", + "\n", + "The following cell defines the training job to be run by Amazon SageMaker. It points to the `grid_train.py` training script, defines the number and types of instances used for training, sets the hyperparameter values, and defines regular expressions which Amazon SageMaker uses to track the training metrics.\n", + "\n", + "Before running this cell, you must provide a descriptive name for the training job and specify the Amazon S3 URI where the output should be stored. The URI should look like `s3://bucket-name/output-folder/`.\n", + "\n", + "*Note: If you are using a new AWS account, you may not have access to p2 instance types yet. The code should run fine on a CPU instance type, but it will require more time to complete. Submit a limit increase request to use p2 instances.*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import sagemaker\n", + "from sagemaker.pytorch import PyTorch\n", + "\n", + "# Replace the following variables with a descriptive name for the\n", + "# training job and an S3 URI where to store the output\n", + "JOB_NAME = 'INSERT_A_NAME_HERE'\n", + "OUTPUT_PATH = 'INSERT_AN_S3_URI_HERE'\n", + "\n", + "role = sagemaker.get_execution_role()\n", + "\n", + "estimator = PyTorch(entry_point='grid_train.py',\n", + " role=role,\n", + " base_job_name=JOB_NAME,\n", + " output_path=OUTPUT_PATH,\n", + " framework_version='1.1.0',\n", + " train_instance_count=1,\n", + " train_instance_type='ml.p2.xlarge',\n", + " hyperparameters={\n", + " \"epochs\": 10,\n", + " \"batch-size\": 4,\n", + " \"gamma\": 0.1,\n", + " \"lr\": 0.001,\n", + " \"momentum\": 0.9,\n", + " \"step-size\": 7\n", + " },\n", + " metric_definitions=[\n", + " {'Name': 'train:loss', 'Regex': 'train Loss: (.*?) '},\n", + " {'Name': 'train:acc', 'Regex': 'train Loss: .*? Acc: (.*?)$'},\n", + " {'Name': 'val:loss', 'Regex': 'val Loss: (.*?) '},\n", + " {'Name': 'val:acc', 'Regex': 'val Loss: .*? Acc: (.*?)$'}\n", + " ]\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once the training job has been defined, pass in the Amazon S3 URI for the training data to start the training job. The URI should look like `s3://bucket-name/training-data-folder/`, where `training-data-folder` contains one folder per label containing the training images for that label. \n", + "\n", + "This cell will output the logs of the training job, but you can also view the logs and visualize the metrics in the Amazon SageMaker console." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "estimator.fit({'training': 'INSERT_AN_S3_URI_HERE'})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Hyperparameter Tuning\n", + "This section shows how to run a hyperparameter tuning job using Amazon SageMaker. First, define the range of values for the hyperparameters which you want to tune." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from sagemaker.tuner import IntegerParameter, CategoricalParameter, ContinuousParameter\n", + "\n", + "hyperparameter_ranges = {\n", + " 'batch-size': IntegerParameter(3,30,scaling_type='Auto'),\n", + " 'momentum': ContinuousParameter(0.1, 0.9, scaling_type='Auto'),\n", + " 'step-size': IntegerParameter(3, 12, scaling_type='Auto'),\n", + " 'gamma': ContinuousParameter(0.01, 0.9, scaling_type='Auto')\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, define the training jobs which will be run during hyperparameter tuning. This is the same as in the above section on training." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import sagemaker\n", + "from sagemaker.pytorch import PyTorch\n", + "\n", + "# Replace the following variables with a descriptive name for the\n", + "# training job and an S3 URI where to store the output\n", + "JOB_NAME = 'INSERT_A_NAME_HERE'\n", + "OUTPUT_PATH = 'INSERT_AN_S3_URI_HERE'\n", + "\n", + "role = sagemaker.get_execution_role()\n", + "\n", + "estimator = PyTorch(entry_point='grid_train.py',\n", + " role=role,\n", + " base_job_name=JOB_NAME\n", + " output_path=OUTPUT_PATH,\n", + " framework_version='1.1.0',\n", + " train_instance_count=1,\n", + " train_instance_type='ml.p2.xlarge',\n", + " hyperparameters={\n", + " \"epochs\": 20,\n", + " \"lr\": 0.001\n", + " },\n", + " metric_definitions=[\n", + " {'Name': 'train:loss', 'Regex': 'train Loss: (.*?) '},\n", + " {'Name': 'train:acc', 'Regex': 'train Loss: .*? Acc: (.*?)$'},\n", + " {'Name': 'val:loss', 'Regex': 'val Loss: (.*?) '},\n", + " {'Name': 'val:acc', 'Regex': 'val Loss: .*? Acc: (.*?)$'}\n", + " ]\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, define the hyperparameter tuning job based on the defined hyperparameter ranges. Set the objective metric, the maximum number of training jobs, and the maximum number of parallel training jobs. \n", + "\n", + "*Note: make sure your AWS account limits allow for the number of parallel training jobs for the instance type defined in the training job.*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from sagemaker.tuner import HyperparameterTuner\n", + "\n", + "TUNING_JOB_NAME = 'INSERT_A_NAME_HERE'\n", + "\n", + "tuner = HyperparameterTuner(\n", + " estimator=estimator,\n", + " objective_metric_name='val:acc',\n", + " hyperparameter_ranges=hyperparameter_ranges,\n", + " metric_definitions=[\n", + " {'Name': 'train:loss', 'Regex': 'train Loss: (.*?) '},\n", + " {'Name': 'train:acc', 'Regex': 'train Loss: .*? Acc: (.*?)$'},\n", + " {'Name': 'val:loss', 'Regex': 'val Loss: (.*?) '},\n", + " {'Name': 'val:acc', 'Regex': 'val Loss: .*? Acc: (.*?)$'}\n", + " ],\n", + " strategy='Bayesian',\n", + " objective_type='Maximize',\n", + " max_jobs=30,\n", + " max_parallel_jobs=3,\n", + " base_tuning_job_name=TUNING_JOB_NAME\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once the tuning job has been defined, pass in the Amazon S3 URI for the training data to start the tuning job. The URI should look like `s3://bucket-name/training-data-folder/`, where `training-data-folder` contains one folder per label containing the training images for that label.\n", + "\n", + "View the logs and visualize the metrics for the training jobs linked to this tuning job in the Amazon SageMaker console." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tuner.fit(inputs='INSERT_AN_S3_URI_HERE')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Deploying\n", + "\n", + "After running some training jobs and/or hyperparameter tuning jobs, decide on which training job you want to base your deployment. Find the Amazon S3 URI of the model package, which should look like `s3://bucket-name/training-job-name/output/model.tar.gz`. Insert the URI in the code below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from sagemaker.predictor import RealTimePredictor, json_serializer, json_deserializer\n", + "\n", + "class JSONPredictor(RealTimePredictor):\n", + " def __init__(self, endpoint_name, sagemaker_session):\n", + " super(JSONPredictor, self).__init__(endpoint_name, sagemaker_session, json_serializer, json_deserializer)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from sagemaker.pytorch import PyTorchModel\n", + "import sagemaker\n", + "\n", + "role = sagemaker.get_execution_role()\n", + "model = PyTorchModel(model_data='INSERT_S3_URI_OF_MODEL_PACKAGE',\n", + " role=role,\n", + " framework_version='1.1.0',\n", + " entry_point='grid_serve.py',\n", + " predictor_cls=JSONPredictor)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After defining the model and predictor type, we specify the number and type of instances for running the endpoint. \n", + "\n", + "*Note: An endpoint takes several minutes to start up.*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "predictor = model.deploy(initial_instance_count=1, instance_type='ml.m4.xlarge')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once your endpoint is complete, note down the name to link it up to the Sign & Speak user interface." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "conda_pytorch_p36", + "language": "python", + "name": "conda_pytorch_p36" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 505cb517b2bf3dba6481c07f720764a9e8d88892 Mon Sep 17 00:00:00 2001 From: Sara 'Moose' van de Moosdijk Date: Sun, 15 Dec 2019 15:17:07 +1100 Subject: [PATCH 14/25] Adding image to explain grid concept --- .../sign-and-speak/img/grid_concept.png | Bin 0 -> 105182 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 reinvent-2019/sign-and-speak/img/grid_concept.png diff --git a/reinvent-2019/sign-and-speak/img/grid_concept.png b/reinvent-2019/sign-and-speak/img/grid_concept.png new file mode 100644 index 0000000000000000000000000000000000000000..bd556e4f3c30eda05ff1b6c5e84496d1bafc8f11 GIT binary patch literal 105182 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 t_ET#*lp5&+Q#V=Z{P#M=DFp)Spul56oKw>F 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 literal 0 HcmV?d00001 From e18e40ab7163240eae5698e74b9f76d0c356b70a Mon Sep 17 00:00:00 2001 From: Sara 'Moose' van de Moosdijk Date: Sun, 15 Dec 2019 15:17:24 +1100 Subject: [PATCH 15/25] added explanation on video preprocessing and machine learning --- reinvent-2019/sign-and-speak/README.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/reinvent-2019/sign-and-speak/README.md b/reinvent-2019/sign-and-speak/README.md index 5b7635ba..1e26cc93 100644 --- a/reinvent-2019/sign-and-speak/README.md +++ b/reinvent-2019/sign-and-speak/README.md @@ -83,11 +83,25 @@ We controlled for factors such as background and lighting by choosing to only su #### 5.2.2. Video preprocessing -TODO +Each video recording of a word or phrase is transformed into an image representation for the purpose of performing image classification with the machine learning model. This processing is done through a combination of Bash and Python scripts executed by AWS Lambda. This section explains how the preprocessing generates an image from a video, and describes how to set up your own AWS Lambda function to support the process. + +To capture the movement (or time) element of signing a word or phrase, the image representation of a video is created as a 3x3 grid of video frames. [FFmpeg](https://ffmpeg.org/) is used to extract the key (non-blurry) frames from the video, then a Python script selects 9 key frames evenly spread across the length of the video, and FFmpeg is used to arrange these frames into the final grid structure. By selecting the frames according to the length of the video, this method is more robust to different speeds of signing. The image below illustrates the concept (blurred for anonymization only). + +

+ +The stable release of FFmpeg at time of writing (4.2.1) does not contain all the features required to complete the preprocessing. We recommend downloading a [nightly build](https://johnvansickle.com/ffmpeg/) to access the latest features and bug fixes. We used the build from 26/08/2019, but would expect any later build or release to support the required functionality. + +TODO - explain how to create a Lambda layer for FFmpeg #### 5.2.3 Training and deploying a model -TODO +First, ensure that all training videos have been preprocessed into 3x3 grid images. Upload these images to an Amazon S3 bucket, organizing the images into folders based on their label (e.g. a folder for 'cat', a folder for 'pub', etc). + +Follow [these instructions](https://docs.aws.amazon.com/sagemaker/latest/dg/gs-setup-working-env.html) to set up an Amazon SageMaker instance on the smallest instance type (`ml.t3.medium`). If you want to pre-load the Sign & Speak scripts, simply add the URL to this GitHub repository in the 'Git repositories' section of the setup process. + +If you forgot to pre-load the Sign & Speak project, simply wait for the instance to show status `InService`, then click 'Open Jupyter'. In the new tab which opens, click on the 'New' drop-down menu in the top right corner, and choose 'Terminal' at the bottom of the list. From the terminal, you can `git clone` this repository onto the instance. + +Follow the instructions in `scripts/ML Instructions.ipynb` to train and deploy a model with your training data. Once you have an Amazon SageMaker endpoint, follow the instructions below to connect it to the UI. ### 5.3 User Interface From 6339f5f94273449aea85063827c7688c480e93be Mon Sep 17 00:00:00 2001 From: Sara 'Moose' van de Moosdijk Date: Sun, 15 Dec 2019 16:07:33 +1100 Subject: [PATCH 16/25] added project overview, completed faq section --- reinvent-2019/sign-and-speak/README.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/reinvent-2019/sign-and-speak/README.md b/reinvent-2019/sign-and-speak/README.md index 1e26cc93..8f3f42ca 100644 --- a/reinvent-2019/sign-and-speak/README.md +++ b/reinvent-2019/sign-and-speak/README.md @@ -4,7 +4,7 @@ ## 1. Project Overview -TODO +This repository provides the resources and instructions required to create your own version of the Sign & Speak project, which was on display at the Builder's Fair during re:Invent 2019. Sign & Speak uses machine learning to build a communication tool for users of sign language and users of spoken language. ## 2. Project Abstract @@ -109,8 +109,6 @@ TODO ## 6. FAQ -TODO - Add more Q/A - **Q: There is more than one sign language?** **A:** Yes! By some estimates there are perhaps [300 sign languages](https://en.wikipedia.org/wiki/List_of_sign_languages). Although ASL (American Sign Language) is probably the most well-known of these languages, the Sign & Speak project was built to support [Auslan](https://en.wikipedia.org/wiki/Auslan) (Australian Sign Language). @@ -125,11 +123,14 @@ TODO - Add more Q/A **Q: What are the limitations of this method?** -**A:** TODO +**A:** The method only works for individual signs, or short combinations of signs (e.g. 'pleased to meet you' consists of three signs). Due to the limit of 9 frames it will not support full sentences. Additionally, the demo performed well with 12 different labels, but would require significantly more training data to scale to larger numbers of supported labels. Finally, this method does not capture all the nuances of sign language, such as expression and context. **Q: What are the future plans for this project?** -**A:** TODO +**A:** There are many ideas for improving and extending this project; below is a short, but incomplete list. +* Add support for full sign language sentences +* Add support for continuous sign language recognition +* Add a 3D avatar to turn text into sign language **Q: What is the animal in your logo?** @@ -139,7 +140,7 @@ TODO - Add more Q/A Sara 'Moose' van de Moosdijk, AWS ([GitHub](https://github.com/moose-in-australia/) | [LinkedIn](https://www.linkedin.com/in/saravandemoosdijk/)) -Eshaan Anand, AWS (GitHub | LinkedIn) +Eshaan Anand, AWS (GitHub | [LinkedIn](https://sg.linkedin.com/in/eshaan-anand-03396456)) ## 8. License From fd74dad79caa7981befed94e1e8cc9e0cb500b68 Mon Sep 17 00:00:00 2001 From: Sara 'Moose' van de Moosdijk Date: Sun, 15 Dec 2019 16:19:31 +1100 Subject: [PATCH 17/25] finished video processing instructions --- reinvent-2019/sign-and-speak/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reinvent-2019/sign-and-speak/README.md b/reinvent-2019/sign-and-speak/README.md index 8f3f42ca..98f68a0e 100644 --- a/reinvent-2019/sign-and-speak/README.md +++ b/reinvent-2019/sign-and-speak/README.md @@ -91,7 +91,7 @@ To capture the movement (or time) element of signing a word or phrase, the image The stable release of FFmpeg at time of writing (4.2.1) does not contain all the features required to complete the preprocessing. We recommend downloading a [nightly build](https://johnvansickle.com/ffmpeg/) to access the latest features and bug fixes. We used the build from 26/08/2019, but would expect any later build or release to support the required functionality. -TODO - explain how to create a Lambda layer for FFmpeg +The video preprocessing code is included in this repository and should be placed in an [AWS Lambda](https://aws.amazon.com/lambda/) function running Python 3.8. To run the correct version of FFmpeg, you need to upload it as an AWS Lambda layer. Keep in mind the [size limits](https://docs.aws.amazon.com/lambda/latest/dg/limits.html) for AWS Lambda - only the main ffmpeg binary needs to be included in the ZIP package uploaded as a Lambda layer. #### 5.2.3 Training and deploying a model From f30760b5210fcc6e023892a014bc9ff02c74c2c8 Mon Sep 17 00:00:00 2001 From: Eshaan <25397997+eshaananand@users.noreply.github.com> Date: Tue, 17 Dec 2019 11:36:41 +0800 Subject: [PATCH 18/25] Added Sign&Speak UI details (minor modifications) --- reinvent-2019/sign-and-speak/README.md | 65 ++++++++++++++++++++------ 1 file changed, 51 insertions(+), 14 deletions(-) diff --git a/reinvent-2019/sign-and-speak/README.md b/reinvent-2019/sign-and-speak/README.md index 98f68a0e..959a7973 100644 --- a/reinvent-2019/sign-and-speak/README.md +++ b/reinvent-2019/sign-and-speak/README.md @@ -18,15 +18,15 @@ The table below shows the two scripted conversations supported in the demo, wher | Conversation #1 | Conversation #2 | | ------------- | ------------- | -| A: Hello. | A: Pleased to meet you. | -| E: Hi! How are you? | E: Likewise. How are you? | -| A: Good. How are you? | A: Good. How are you? | -| E: I'm doing well. What are you planning tonight? | E: I'm doing well. What are you up to tonight? | -| A: Going to the pub. | A: Going to a restaurant. | -| E: Oh cool, I'd love to join you. What time are you going? | E: Sound great, I'd love to join you. At what time are you going? | -| A: At 20:00 | A: At 20:00 | -| E: See you there! | E: See you there! | -| A: Goodbye | A: Goodbye | +| **A:** Hello. | **A:** Pleased to meet you. | +| **E:** Hi! How are you? | **E:** Likewise. How are you? | +| **A:** Good. How are you? | **A:** Good. How are you? | +| **E:** I'm doing well. What are you planning tonight? | **E:** I'm doing well. What are you up to tonight? | +| **A:** Going to the pub. | **A:** Going to a restaurant. | +| **E:** Oh cool, I'd love to join you. What time are you going? | **E:** Sound great, I'd love to join you. At what time are you going? | +| **A:** At 20:00 | **A:** At 20:00 | +| **E:** See you there! | **E:** See you there! | +| **A:** Goodbye | **A:** Goodbye | In addition to the two-way conversation, the demo allows for individual participants to test the Auslan transcription model seperately. When testing the Auslan model, participants can choose from the following list of supported words and phrases: @@ -47,10 +47,20 @@ In addition to the two-way conversation, the demo allows for individual particip The image below shows the full architecture for the two-way communication demo. +### Sign Flow ### 1. A video recording is made of the Auslan user signing a word or phrase. This video is uploaded to an Amazon S3 bucket. 1. The video upload triggers an AWS Lambda function which transforms the video into an image (a grid of frames). -1. A second AWS Lambda function sends the image to an Amazon SageMaker inference endpoint and waits for the response. It stores the resulting message in Amazon DynamoDB. -1. TODO - continue describing the process +1. A second AWS Lambda function sends the image to an Amazon SageMaker inference endpoint and waits for the response. It stores the resulting message in an Amazon DynamoDB table. + + +### Speak Flow +1. A stream of spoken words is sent to Amazon Transcribe to get a transcript. +1. This transcript is stored into the DynamoDB as a "Speech" message by a Lambda Function + +### UI Flow +- When a new Sign UI/Speak UI instance is started up, It makes a persistent connection to the Websocket API on the API Gateway +- Changes to the DynamoDB table are captured via a DynamoDB Stream and the inserted message is published to the API Gateway endpoint using another Lambda Function +- The Websocket API on the APIGateway publishes the message back to the Sign UI/ Speak UI which displays the formatted Message

@@ -103,9 +113,36 @@ If you forgot to pre-load the Sign & Speak project, simply wait for the instance Follow the instructions in `scripts/ML Instructions.ipynb` to train and deploy a model with your training data. Once you have an Amazon SageMaker endpoint, follow the instructions below to connect it to the UI. -### 5.3 User Interface +### 5.3 Sign & Speak User Interface + +There are two key screens in the UI - a Sign UI and a Speak UI. Each of them is meant to allow the user to interact with the demo and get a 2-way conversation going. + +Each of the UI will support 4 key functions + +- **On load** : Connect to WebSocket API +- **On unload** : Disconnect from WebSocket API +- **Receive Message** : On Receiving a message from the WebSocket API, update the Text Chat panel +- **Capture Intent** : Capture the intent of the user (e.g. capture user video in a Sign UI / capture spoken words from Speak UI) + +#### 5.3.1 Sign UI +The UI has two panels - Sign Panel and a Message Panel + +**Sign Panel** +- Start Sign Button > Starts recording the sign being performed by the user +- Stop Sign Button > Stops recording +- Upload Sign Button > Uploads the recorded video to S3 + +**Message Panel** +- Receive Message > Format the message and display in the Message Panel with a caption "Auslan" + +#### 5.3.2 Speak UI +**Sign Panel** +- Start Speaking > Starts capturing spoken words and stream to Amazon Transcribe endpoint +- Stop Speaking > Stops capturing spoken words and stop streaming to Amazon Transcribe endpoint +- Send Message > Sends the transcript of spoken text to an API Gateway endpoint, that saves it to the DynamoDB table using a Lambda function -TODO +**Message Panel** +- Receive Message > Format the message and display in the Message Panel with a caption "English" ## 6. FAQ @@ -140,7 +177,7 @@ TODO Sara 'Moose' van de Moosdijk, AWS ([GitHub](https://github.com/moose-in-australia/) | [LinkedIn](https://www.linkedin.com/in/saravandemoosdijk/)) -Eshaan Anand, AWS (GitHub | [LinkedIn](https://sg.linkedin.com/in/eshaan-anand-03396456)) +Eshaan Anand, AWS ([GitHub] (https://github.com/ea-coder) | [LinkedIn](https://sg.linkedin.com/in/eshaan-anand)) ## 8. License From 1fe01c907a23f4d5c51b8fcc0c1d966a07966fc5 Mon Sep 17 00:00:00 2001 From: Eshaan <25397997+eshaananand@users.noreply.github.com> Date: Mon, 3 Feb 2020 11:39:55 +0800 Subject: [PATCH 19/25] Added Sign UI --- .../sign-and-speak/CloudFormation/cf.json | 682 ++++++++++++++++++ reinvent-2019/sign-and-speak/README.md | 121 +++- .../lambda/inferSign-cf/index.py | 74 ++ .../frame_picker.py | 39 + .../python-video-to-grid-shell-cf/index.py | 80 ++ .../testscript.sh | 19 + .../video_to_grid.sh | 54 ++ .../lambda/s2s-ws-connect-cf/index.py | 44 ++ .../lambda/s2s-ws-disconnect-cf/index.py | 25 + .../s2s-ws-sendmessage-node-cf/index.js | 58 ++ reinvent-2019/sign-and-speak/ui/sign.html | 110 +++ .../ui/static/css/signspeak.css | 13 + .../sign-and-speak/ui/static/js/sign.js | 142 ++++ .../ui/static/js/web-socket-msg.js | 95 +++ 14 files changed, 1550 insertions(+), 6 deletions(-) create mode 100644 reinvent-2019/sign-and-speak/CloudFormation/cf.json create mode 100644 reinvent-2019/sign-and-speak/lambda/inferSign-cf/index.py create mode 100644 reinvent-2019/sign-and-speak/lambda/python-video-to-grid-shell-cf/frame_picker.py create mode 100644 reinvent-2019/sign-and-speak/lambda/python-video-to-grid-shell-cf/index.py create mode 100644 reinvent-2019/sign-and-speak/lambda/python-video-to-grid-shell-cf/testscript.sh create mode 100644 reinvent-2019/sign-and-speak/lambda/python-video-to-grid-shell-cf/video_to_grid.sh create mode 100644 reinvent-2019/sign-and-speak/lambda/s2s-ws-connect-cf/index.py create mode 100644 reinvent-2019/sign-and-speak/lambda/s2s-ws-disconnect-cf/index.py create mode 100644 reinvent-2019/sign-and-speak/lambda/s2s-ws-sendmessage-node-cf/index.js create mode 100644 reinvent-2019/sign-and-speak/ui/sign.html create mode 100644 reinvent-2019/sign-and-speak/ui/static/css/signspeak.css create mode 100644 reinvent-2019/sign-and-speak/ui/static/js/sign.js create mode 100644 reinvent-2019/sign-and-speak/ui/static/js/web-socket-msg.js diff --git a/reinvent-2019/sign-and-speak/CloudFormation/cf.json b/reinvent-2019/sign-and-speak/CloudFormation/cf.json new file mode 100644 index 00000000..69906731 --- /dev/null +++ b/reinvent-2019/sign-and-speak/CloudFormation/cf.json @@ -0,0 +1,682 @@ +{ + "Parameters":{ + "PARAMFFMPEGLayer" : { + "Default" : "", + "Description" : "ARN with version of the FFMPEG Layer", + "Type" : "String" + }, + "PARAMS2SEndpoint" : { + "Default" : "", + "Description" : "Endpoint of the S2S Model on Sagemaker", + "Type" : "String" + } + }, + "Resources": { + "messagestable": { + "Type": "AWS::DynamoDB::Table", + "Properties": { + "TableName": "messages-cf", + "AttributeDefinitions": [ + { + "AttributeName": "msgid", + "AttributeType": "S" + } + ], + "KeySchema": [ + { + "AttributeName": "msgid", + "KeyType": "HASH" + } + ], + "ProvisionedThroughput": { + "ReadCapacityUnits": 1, + "WriteCapacityUnits": 1 + }, + "StreamSpecification": { + "StreamViewType": "NEW_IMAGE" + } + } + }, + "messagestablestream": { + "Type": "AWS::Lambda::EventSourceMapping", + "DependsOn" : ["messagestable", "sendmessages2swslambda"], + "Properties": { + "BatchSize": 1, + "Enabled": true, + "EventSourceArn": {"Fn::GetAtt": ["messagestable","StreamArn"]}, + "FunctionName": {"Fn::GetAtt": ["sendmessages2swslambda","Arn"]}, + "StartingPosition": "LATEST" + } + }, + "wsclientstable": { + "Type": "AWS::DynamoDB::Table", + "Properties": { + "TableName": "ws-clients-cf", + "AttributeDefinitions": [ + { + "AttributeName": "connectionId", + "AttributeType": "S" + } + ], + "KeySchema": [ + { + "AttributeName": "connectionId", + "KeyType": "HASH" + } + ], + "ProvisionedThroughput": { + "ReadCapacityUnits": 1, + "WriteCapacityUnits": 1 + } + } + }, + "S3Bucket" : { + "DependsOn" : ["videotogridlambda","infersignlambda"], + "Type" : "AWS::S3::Bucket", + "Properties" : { + "BucketName" : "signs-data-cf", + "CorsConfiguration": { + "CorsRules": [ + { + "AllowedHeaders": [ + "*" + ], + "AllowedMethods": [ + "GET","PUT","POST" + ], + "AllowedOrigins": [ + "*" + ], + "Id": "myCORSRuleId1", + "MaxAge": "3600" + } + ] + } + } + }, + "S3InvokeGridLambdaPermission": { + "Type": "AWS::Lambda::Permission", + "DependsOn" : ["videotogridlambda","S3Bucket"], + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { "Ref": "videotogridlambda" }, + "Principal": "s3.amazonaws.com", + "SourceArn": {"Fn::GetAtt": [ "S3Bucket", "Arn" ] } + } + }, + "S3InvokeInferSignLambdaPermission": { + "Type": "AWS::Lambda::Permission", + "DependsOn" : ["infersignlambda","S3Bucket"], + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { "Ref": "infersignlambda" }, + "Principal": "s3.amazonaws.com", + "SourceArn": {"Fn::GetAtt": [ "S3Bucket", "Arn" ] } + } + }, + + "IAMS2SExecutionRole" : { + "Type" : "AWS::IAM::Role", + "Properties" : { + "RoleName" : {"Fn::Join": ["", [{"Ref": "AWS::Region"}, "s2s-iam-role-cf"]]}, + "AssumeRolePolicyDocument": { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "Service": [ + "lambda.amazonaws.com" + ] + }, + "Action": [ + "sts:AssumeRole" + ] + } + ] + }, + "Policies" : [ + { + "PolicyName": "s2s-iam-policy-cf", + "PolicyDocument" : { + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "sagemakerPolicies", + "Effect": "Allow", + "Action": [ + "sagemaker:InvokeEndpoint" + ], + "Resource": { + "Fn::Join":[ + "", + ["arn:aws:sagemaker:*:*:endpoint/",{"Ref" : "PARAMS2SEndpoint"}] + ] + } + }, + { + "Sid": "OtherPolicies", + "Effect": "Allow", + "Action": [ + + "execute-api:ManageConnections" + ], + "Resource": "arn:aws:execute-api:*:*:s2s-ws-cf/Prod/*/*" + }, + { + "Sid": "S3Policy", + "Effect": "Allow", + "Action": [ + "s3:GetObjectTagging", + "s3:PutObjectTagging", + "s3:PutObjectAcl", + "s3:ListBucket", + "s3:GetObject*", + "s3:PutObject", + "s3:GetObject" + ], + "Resource": "arn:aws:s3:::signs-data-cf/*" + }, + { + "Sid": "DynamoDBPolicy", + "Effect": "Allow", + "Action": [ + "dynamodb:GetShardIterator", + "dynamodb:GetRecords", + "dynamodb:DescribeStream", + "dynamodb:GetItem", + "dynamodb:Query", + "dynamodb:Scan", + "dynamodb:DeleteItem", + "dynamodb:PutItem", + "dynamodb:ListStreams" + ], + "Resource": [ + "arn:aws:dynamodb:*:*:table/messages-cf", + "arn:aws:dynamodb:*:*:table/messages-cf/stream/*", + "arn:aws:dynamodb:*:*:table/ws-clients-cf" + ] + }, + { + "Sid": "AllowLogsPolicy", + "Effect": "Allow", + "Action": [ + "logs:CreateLogGroup", + "logs:DescribeLogStreams", + "logs:PutLogEvents", + "logs:CreateLogStream" + ], + "Resource": "arn:aws:logs:*:*:*" + } + ] + } + } + ], + "Description" : "Allows Lambda functions to call AWS services on your behalf. " + } + }, + "wsconnectlambda" : { + "Type": "AWS::Lambda::Function", + "DependsOn" : ["IAMS2SExecutionRole"], + "Properties": { + "Description" : "Triggered on s2s ui client connecting to api websocket", + "FunctionName" : "s2s-ws-connect-cf", + "Handler": "index.lambda_handler", + "Role": { + "Fn::GetAtt": ["IAMS2SExecutionRole","Arn"] + }, + "Environment" : { + "Variables" : { + "messagestable" : {"Ref" : "messagestable"}, + "wsclientstable" : {"Ref" : "wsclientstable"} + } + }, + "Runtime": "python3.7", + "Timeout": 120, + "Code" : { + "ZipFile": { "Fn::Join": ["\n", [ + "import boto3 ", + "import json ", + "from datetime import datetime, timedelta ", + "import time ", + "import os", + "def lambda_handler(event, context): ", + " msgBody = (event) ", + " reqContext = event[\"requestContext\"] ", + " connectionId = reqContext[\"connectionId\"] ", + " #store to dynamo db ", + " ddbclient = boto3.client(\"dynamodb\") ", + " nowDTTM = datetime.utcnow().strftime(\"%Y-%m-%d %H:%M:%S\") # \"2019-05-22 06:06:42 ", + " epocSec = int(time.time()) ", + " response = ddbclient.put_item( ", + " Item={ ", + " \"connectionId\": { ", + " \"S\": str(connectionId),", + " }, ", + " \"insertdttm\" : { ", + " \"S\": nowDTTM ", + " }, ", + " \"epocSecond\" : { ", + " \"N\" : str(epocSec) ", + " } ", + " },", + " TableName=os.environ[\"wsclientstable\"], ", + " ) ", + " print(response) ", + " return { ", + " \"statusCode\": 200,", + " \"body\": json.dumps(\"Successful connect\")", + " } " + ]]} + } + } + }, + "wsconnectlambdapermission": { + "Type": "AWS::Lambda::Permission", + "DependsOn" : [ "s2swsapi" , "wsconnectlambda" ] , + "Properties": { + "FunctionName": { "Fn::GetAtt": [ "wsconnectlambda", "Arn" ] }, + "Action": "lambda:InvokeFunction", + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:aws:execute-api:", + { "Ref": "AWS::Region" }, + ":", + { "Ref": "AWS::AccountId" }, + ":", + { "Ref": "s2swsapi" }, + "/*/*"] + ] + } + + } + + }, + "s2swsapi": { + "Type": "AWS::ApiGatewayV2::Api", + "Properties": { + "Name": "s2s-ws-cf", + "ProtocolType": "WEBSOCKET", + "RouteSelectionExpression": "$request.body.action" + } + }, + "s2swsapiconnectintegration" : + { + "Type" : "AWS::ApiGatewayV2::Integration", + "DependsOn" : ["wsconnectlambda","s2swsapi"], + "Properties" : { + "ApiId" : { + "Ref": "s2swsapi" + }, + "Description" : "s2s Web Socket Connect API Integration", + "IntegrationType" : "AWS_PROXY", + "IntegrationUri" : { + "Fn::Join": [ + "", + [ + "arn:aws:apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt" : [ "wsconnectlambda", "Arn" ] + }, + "/invocations" + ] + ] + } + } + }, + "s2swsconnectroute" : { + "Type" : "AWS::ApiGatewayV2::Route", + "DependsOn" : [ + "s2swsapi", "s2swsapiconnectintegration" + ], + "Properties" :{ + "ApiId": { + "Ref" : "s2swsapi" + }, + "RouteKey": "$connect", + "AuthorizationType": "NONE", + "OperationName": "ConnectRoute", + "Target": { + "Fn::Join": [ + "/", + [ + "integrations", + { + "Ref": "s2swsapiconnectintegration" + } + ] + ] + } + } + }, + "s2swsdeployment" : { + "Type": "AWS::ApiGatewayV2::Deployment", + "DependsOn": [ + "s2swsconnectroute", "s2swsdisconnectroute" + ], + "Properties": { + "Description": "Deployment of S2S WS API", + "ApiId": { + "Ref": "s2swsapi" + } + } + }, + "s2swsprodstage": { + "Type": "AWS::ApiGatewayV2::Stage", + "DependsOn": [ + "s2swsdeployment" + ], + "Properties": { + "StageName": "Prod", + "Description": "Prod Stage", + "DeploymentId": { + "Ref": "s2swsdeployment" + }, + "ApiId": { + "Ref": "s2swsapi" + } + } + }, + "wsdisconnectlambda" : { + "Type": "AWS::Lambda::Function", + "DependsOn" : ["IAMS2SExecutionRole"], + "Properties": { + "Description" : "Triggered on s2s ui client disconnecting to api websocket", + "FunctionName" : "s2s-ws-disconnect-cf", + "Handler": "index.lambda_handler", + "Role": { + "Fn::GetAtt": ["IAMS2SExecutionRole","Arn"] + }, + "Environment" : { + "Variables" : { + "messagestable" : {"Ref" : "messagestable"}, + "wsclientstable" : {"Ref" : "wsclientstable"} + } + }, + "Runtime": "python3.7", + "Timeout": 120, + "Code" : { + "ZipFile": { "Fn::Join": ["\n", [ + "import json ", + "import boto3", + "import os", + "def lambda_handler(event, context):", + " msgBody = (event)", + " reqContext = event[\"requestContext\"]", + " connectionId = str(reqContext[\"connectionId\"])", + " print(\"connectionId is : \" + connectionId)", + " dynamodb = boto3.resource('dynamodb') ", + " table = dynamodb.Table(os.environ[\"wsclientstable\"]) ", + " response = table.delete_item( ", + " Key={'connectionId' : connectionId} ", + " ) ", + " return {", + " 'statusCode': 200, ", + " 'body': json.dumps('Successful disconnect') ", + " } " + + + ]]} + } + } + }, + "wsdisconnectlambdapermission": { + "Type": "AWS::Lambda::Permission", + "DependsOn" : [ "s2swsapi" , "wsdisconnectlambda" ] , + "Properties": { + "FunctionName": { "Fn::GetAtt": [ "wsdisconnectlambda", "Arn" ] }, + "Action": "lambda:InvokeFunction", + "Principal": "apigateway.amazonaws.com", + "SourceArn": { + "Fn::Join": [ + "", + [ + "arn:aws:execute-api:", + { "Ref": "AWS::Region" }, + ":", + { "Ref": "AWS::AccountId" }, + ":", + { "Ref": "s2swsapi" }, + "/*/*"] + ] + } + } + }, + "s2swsapidisconnectintegration" : + { + "Type" : "AWS::ApiGatewayV2::Integration", + "DependsOn" : ["wsdisconnectlambda","s2swsapi"], + "Properties" : { + "ApiId" : { + "Ref": "s2swsapi" + }, + "Description" : "s2s Web Socket Disconnect API Integration", + "IntegrationType" : "AWS_PROXY", + "IntegrationUri" : { + "Fn::Join": [ + "", + [ + "arn:aws:apigateway:", + { + "Ref": "AWS::Region" + }, + ":lambda:path/2015-03-31/functions/", + { + "Fn::GetAtt" : [ "wsdisconnectlambda", "Arn" ] + }, + "/invocations" + ] + ] + } + } + }, + "s2swsdisconnectroute" : { + "Type" : "AWS::ApiGatewayV2::Route", + "DependsOn" : [ + "s2swsapi", "s2swsapidisconnectintegration" + ], + "Properties" :{ + "ApiId": { + "Ref" : "s2swsapi" + }, + "RouteKey": "$disconnect", + "AuthorizationType": "NONE", + "OperationName": "DisconnectRoute", + "Target": { + "Fn::Join": [ + "/", + [ + "integrations", + { + "Ref": "s2swsapidisconnectintegration" + } + ] + ] + } + } + }, + "s2sclientuser" : { + "Type" : "AWS::IAM::User", + "Properties" : { + "UserName" : "s2sclientuser", + "Policies" : [ + { + "PolicyName": "s2s-clientui", + "PolicyDocument": { + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "PutToS3SignBucket", + "Effect": "Allow", + "Action": [ + "s3:PutObject", + "s3:PutObjectTagging", + "s3:PutObjectAcl" + ], + "Resource": [ + "arn:aws:s3:::signs-data-cf/*" + ] + } + ] + } + } + ] + } + }, + "s2siampolicyclientapp" : { + "Type": "AWS::IAM::Policy", + "DependsOn" : "IAMS2SExecutionRole", + "Properties": { + "PolicyName": "s2s-clientui", + "PolicyDocument": { + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "PutToS3SignBucket", + "Effect": "Allow", + "Action": [ + "s3:PutObject", + "s3:PutObjectTagging", + "s3:PutObjectAcl" + ], + "Resource": [ + "arn:aws:s3:::signs-data-cf/*" + ] + } + ] + }, + "Roles" : [{ + "Ref": "IAMS2SExecutionRole" + }] + } + }, + "videotogridlambda" : { + "Type": "AWS::Lambda::Function", + "DependsOn" : ["IAMS2SExecutionRole"], + "Properties": { + "Description" : "Convert video to grid image", + "FunctionName" : "python-video-to-grid-shell-cf", + "Handler": "index.lambda_handler", + "MemorySize" : "2048", + "Environment" : { + "Variables" : { + "messagestable" : {"Ref" : "messagestable"}, + "wsclientstable" : {"Ref" : "wsclientstable"} + } + }, + "Layers" : [{"Ref" : "PARAMFFMPEGLayer"}], + "Role": { + "Fn::GetAtt": ["IAMS2SExecutionRole","Arn"] + }, + "Runtime": "python3.7", + "Timeout": 300, + "Code" : { + "ZipFile": { "Fn::Join": ["\n", [ + "#Upload all code files from lambda/python-video-to-grid-shell folder" + ]]} + } + } + }, + "infersignlambda" : { + "Type": "AWS::Lambda::Function", + "DependsOn" : ["IAMS2SExecutionRole"], + "Properties": { + "Description" : "Infer sign from Grid Image by calling sagemaker endpoint", + "FunctionName" : "inferSign-cf", + "Handler": "index.lambda_handler", + "Role": { + "Fn::GetAtt": ["IAMS2SExecutionRole","Arn"] + }, + "Runtime": "python3.7", + "Timeout": 300, + "Environment" : { + "Variables" : { + "messagestable" : {"Ref" : "messagestable"}, + "wsclientstable" : {"Ref" : "wsclientstable"}, + "s2smodelendpoint" : {"Ref" : "PARAMS2SEndpoint"} + } + }, + "Code" : { + "ZipFile": { "Fn::Join": ["", [ + "#Upload all code files from lambda/infersign folder" + ]]} + } + } + }, + "sendmessages2swslambda" : { + "Type": "AWS::Lambda::Function", + "DependsOn" : ["IAMS2SExecutionRole"], + "Properties": { + "Description" : "Update S2S Client UI with inferred sign message", + "FunctionName" : "s2s-ws-sendmessage-node-cf", + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": ["IAMS2SExecutionRole","Arn"] + }, + "Runtime": "nodejs12.x", + "Timeout": 300, + "Environment" : { + "Variables" : { + "messagestable" : {"Ref" : "messagestable"}, + "wsclientstable" : {"Ref" : "wsclientstable"}, + "wssurl" : { + "Fn::Join" : [ + "", + [ + {"Ref" : "s2swsapi" }, + ".execute-api.", + {"Ref" : "AWS::Region"}, + ".amazonaws.com/", + {"Ref" : "s2swsprodstage"} + ] + ] + } + } + }, + "Code" : { + "ZipFile": { "Fn::Join": ["", [ + "//Upload all code files from lambda/s2s-ws-sendmessage-node" + ]]} + } + } + } + + }, + "Outputs" : { + "S2SWebSocketURL" : { + "Description": "The WSS Protocol URI to connect to for S2S UI Client", + "Value" : { + "Fn::Join" : [ + "", + [ + "wss://", + {"Ref" : "s2swsapi" }, + ".execute-api.", + {"Ref" : "AWS::Region"}, + ".amazonaws.com/", + {"Ref" : "s2swsprodstage"} + ] + ] + } + }, + "ARNTableMessages" : { + "Description": "Arn of DynamoDB table MESSAGES to store all signs", + "Value" : {"Fn::GetAtt" : [ "messagestable", "Arn" ]} + }, + "ARNTableWsClients" : { + "Description": "Arn of DynamoDB table WS-CLIENTS to store client information", + "Value" : {"Fn::GetAtt" : [ "wsclientstable", "Arn" ]} + }, + "ARNS3Bucket" : { + "Description": "Arn of S3 Bucket SIGNS-DATA to store sign information", + "Value" : {"Fn::GetAtt" : [ "S3Bucket", "Arn" ]} + } + } +} \ No newline at end of file diff --git a/reinvent-2019/sign-and-speak/README.md b/reinvent-2019/sign-and-speak/README.md index 959a7973..12cee2c3 100644 --- a/reinvent-2019/sign-and-speak/README.md +++ b/reinvent-2019/sign-and-speak/README.md @@ -136,7 +136,7 @@ The UI has two panels - Sign Panel and a Message Panel - Receive Message > Format the message and display in the Message Panel with a caption "Auslan" #### 5.3.2 Speak UI -**Sign Panel** +**Speak Panel** - Start Speaking > Starts capturing spoken words and stream to Amazon Transcribe endpoint - Stop Speaking > Stops capturing spoken words and stop streaming to Amazon Transcribe endpoint - Send Message > Sends the transcript of spoken text to an API Gateway endpoint, that saves it to the DynamoDB table using a Lambda function @@ -144,7 +144,92 @@ The UI has two panels - Sign Panel and a Message Panel **Message Panel** - Receive Message > Format the message and display in the Message Panel with a caption "English" -## 6. FAQ +**NOTE** : We have not uploaded the codes for the Speak UI, it follows the same behaviour seen at [aws-samples/amazon-transcribe-websocket-static](https://github.com/aws-samples/amazon-transcribe-websocket-static) + +## 6. Setup Instructions + +### 6.0 Pre-Setup + +**Setup the FFMPEG Lambda Layer** + +**Setup the S2S Model for infrence** + +### 6.1 Installation + +Please follow the below steps after downloading the code to setup + +**[AWS] Setup the AWS Resources** +- Run the CloudFormation template at /CloudFormation/cf.json. (Note: This template has been tested in AWS Sydney region only) + - Give the name of the stacka as "S2SAPP" + - Provide the parameters requested + - PARAMFFMPEGLayer : ARN with version of the FFMPEG Layer + - PARAMS2SEndpoint : URL of the S2S Model on Sagemaker + +**[AWS] IAM User with AccessKey** +- Go to IAM User "s2sclientuser" in IAM Console + - Click on the tab "Security Credentials" + - Click on "Create Access Key" + - Copy and Store the Access key ID/Secret access key, securely + + +**[AWS] Lambda Functions** +- Copy the updated code for lambda functions. Create the files as necessary + - infersign-cf ( index.py ) + - python-video-to-grid-shell-cf( index.py , frame_picker.py , testscript.sh , video_to_grid.sh ) + - s2s-ws-connect-cf( index.py ) + - s2s-ws-disconnect-cf( index.py ) + - s2s-ws-sendmessage-node-cf ( index.js ) + +**[AWS] Update Lambda Trigger : python-video-to-grid-shell** +- Open the Lambda Function python-video-to-grid-shell + - Click on Runtime dropdown, and select "Python3.8" + - Click on Add Trigger + - Trigger Configration: select S3 + - Bucket: signs-data-cf + - Event Type : "All object create events" + - Prefix : "02_app/upload/" + - Ensure "Enable Trigger" is checked + - Click Add + +**[AWS] Update Lambda Trigger : infersign** +- Open the Lambda Function infersign + - Click on Add Trigger + - Trigger Configration: select S3 + - Bucket: signs-data-cf + - Event Type : "All object create events" + - Prefix : "02_app/grid-image/" + - Ensure "Enable Trigger" is checked + - Click Add + +**[LocalMachine] S2S Client UI** +- Copy the ui folder to a local directory + +**[LocalMachine] Update [LocalDir]\ui\static\js\sign.js** +- update the app_credentials + - Put the AccessKeyID/SecretAccessKey in app_credentials +- set the region + - Update the variable "app_region" based on the AWS Region used + +**[LocalMachine] Update [LocalDir]\ui\static\js\web-socket-msg.js** +- Update the WS URL + - Put the CloudFormation Template Output value for S2SWebSocketURL in "wsurl" variable + +### 6.4 Run Application +** Use Firefox (We have tested it only on this browser) +- Navigate to the page \ui\sign.html +- Click on Start Sign/Stop Sign to record a sign +- Click on Upload Sign to trigger the process of inference +- Inferred Sign message is displayed on the UI +- If you get an alert message "WebSocket connection is closed. Refresh screen!!!", then reload your UI. + + +### 6.3 Uninstall + +**[AWS] Before Deleting the CloudFormation Stack** +- Make sure the S3 Bucket "signs-data-cf" is empty before deleting the Stack, otherwise it will fail. + - Delete the Cloudformation stack - "S2SAPP" + +## 7. FAQ **Q: There is more than one sign language?** @@ -162,23 +247,47 @@ The UI has two panels - Sign Panel and a Message Panel **A:** The method only works for individual signs, or short combinations of signs (e.g. 'pleased to meet you' consists of three signs). Due to the limit of 9 frames it will not support full sentences. Additionally, the demo performed well with 12 different labels, but would require significantly more training data to scale to larger numbers of supported labels. Finally, this method does not capture all the nuances of sign language, such as expression and context. +**Q:What platform has the UI been tested on?** + +**A:** The UI has been tested to work on Windows 10, with Mozilla Firefox browser. Its tested to work in the AWS Sydney Region. + +**Q:** I only see a rotating circle on the UI! Help! + +**A:** Check the following steps have been performed correctly +- Verify that all the lambda function code has been updated correctly +- Verify that the S3 Bucket triggers for inferSign-cf and python-video-to-grid-shell-cf are created +- Verify that you have changed the runtime language of lambda function python-video-to-grid-shell-cf to Python 3.8 +- Check CloudWatch logs for the lambda functions for errors + **Q: What are the future plans for this project?** **A:** There are many ideas for improving and extending this project; below is a short, but incomplete list. * Add support for full sign language sentences * Add support for continuous sign language recognition * Add a 3D avatar to turn text into sign language +* Improve the security of the application (e.g. Build in Authentication for UI and APIs) + **Q: What is the animal in your logo?** **A:** It's a [quokka](https://duckduckgo.com/?q=quokka&t=ffnt&atb=v176-1&iax=images&ia=images), a marsupial found only in Australia. We are not professional artists. ;) -## 7. Authors +## 8. Authors Sara 'Moose' van de Moosdijk, AWS ([GitHub](https://github.com/moose-in-australia/) | [LinkedIn](https://www.linkedin.com/in/saravandemoosdijk/)) -Eshaan Anand, AWS ([GitHub] (https://github.com/ea-coder) | [LinkedIn](https://sg.linkedin.com/in/eshaan-anand)) +Eshaan Anand, AWS ([GitHub](https://github.com/ea-coder) | [LinkedIn](https://sg.linkedin.com/in/eshaan-anand)) + +## 9. License + +This library is licensed under the Apache 2.0 License. + +## 10. References -## 8. License +This project references the following libraries to put together the solution -This library is licensed under the Apache 2.0 License. \ No newline at end of file +- [jquery-1.12.4](https://jquery.com/) +- [aws-sdk.min.js](https://cdnjs.cloudflare.com/ajax/libs/aws-sdk/2.610.0/aws-sdk.min.js) +- [bootstrap](https://getbootstrap.com/) +- [RecordRTC.js](https://github.com/muaz-khan/RecordRTC) +- [adapter-latest.js](https://github.com/webrtc/adapter) \ No newline at end of file diff --git a/reinvent-2019/sign-and-speak/lambda/inferSign-cf/index.py b/reinvent-2019/sign-and-speak/lambda/inferSign-cf/index.py new file mode 100644 index 00000000..0a69422f --- /dev/null +++ b/reinvent-2019/sign-and-speak/lambda/inferSign-cf/index.py @@ -0,0 +1,74 @@ +import boto3 +import json +import uuid +from datetime import datetime, timedelta +import time +import os + +s2smodelendpoint = os.environ["s2smodelendpoint"] +messagestable = os.environ["messagestable"] + +def lambda_handler(event, context): + + recordInfo = event["Records"][0] + + s3Info = recordInfo["s3"] + + bucketInfo = s3Info["bucket"] + + bucketName = bucketInfo["name"] + + objectInfo = s3Info ["object"] + + key = objectInfo["key"] + print ("key : " + key) + + files3url = "s3://" + bucketName + "/" + key + print("files3url is " + files3url) + + client = boto3.client('sagemaker-runtime') + + response = client.invoke_endpoint( + EndpointName=s2smodelendpoint, #'sagemaker-pytorch-2019-11-22-23-31-53-466', + Body=json.dumps({'grid': files3url}), + ContentType='application/json' + ) + prediction = json.loads(response['Body'].read()) + prediction_label = prediction['output'] + prediction_confidence = prediction['confidence'] + print("prediction_label is " + prediction_label) + print("prediction_confidence is " + str(prediction_confidence)) + + #print(prediction) + + #store to dynamo db + ddbclient = boto3.client('dynamodb') + nowDTTM = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S') # '2019-05-22 06:06:42 + epocSec = int(time.time()) + + response = ddbclient.put_item( + Item={ + 'msgid': { + 'S': str(uuid.uuid1()), + }, + 'msg': { + 'S': prediction_label, + }, + 'confidence': { + 'S': str(prediction_confidence), + }, + 'isSign' : { + 'BOOL' : True + }, + 'insertdttm' : { + 'S': nowDTTM + }, + 'epocSecond' : { + 'N' : str(epocSec) + } + }, + TableName=messagestable, + ) + + print(response) + diff --git a/reinvent-2019/sign-and-speak/lambda/python-video-to-grid-shell-cf/frame_picker.py b/reinvent-2019/sign-and-speak/lambda/python-video-to-grid-shell-cf/frame_picker.py new file mode 100644 index 00000000..58369f46 --- /dev/null +++ b/reinvent-2019/sign-and-speak/lambda/python-video-to-grid-shell-cf/frame_picker.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 + +import argparse +import sys +import glob +from math import ceil + + +def total_frame_count(dir): + """ + Returns the number of frames found in a directory. + """ + frame_files = glob.glob("{}/frame_*.png".format(dir)) + num_files = len(frame_files) + return num_files + + +def choose_frames(dir): + """ + Picks n evenly spaced frames from m frames. + Returns indices of chosen frames. + """ + NUM_GRID_FRAMES = 9 + total_frames = total_frame_count(dir) + grid_frame_indices = [] + for index in range(1, NUM_GRID_FRAMES + 1): + grid_frame_indices.append(int(ceil(index * total_frames / NUM_GRID_FRAMES))) + # Format as a string which can be easily parsed by a bash script + indices = "|".join(str(item) for item in grid_frame_indices) + return str(indices) + + +if __name__ == "__main__": + # Parse input + parser = argparse.ArgumentParser() + parser.add_argument("dir", help="directory containing the video frames") + args = parser.parse_args() + frame_indices = choose_frames(args.dir) + sys.exit(frame_indices) diff --git a/reinvent-2019/sign-and-speak/lambda/python-video-to-grid-shell-cf/index.py b/reinvent-2019/sign-and-speak/lambda/python-video-to-grid-shell-cf/index.py new file mode 100644 index 00000000..25ec2be9 --- /dev/null +++ b/reinvent-2019/sign-and-speak/lambda/python-video-to-grid-shell-cf/index.py @@ -0,0 +1,80 @@ +import json +import os +import boto3 + + +def lambda_handler(event, context): + # TODO implement + + recordInfo = event["Records"][0] + #print ('records info : ') + #print (recordInfo) + + s3Info = recordInfo["s3"] + #print ('s3event info : ') + #print(s3Info) + + bucketInfo = s3Info["bucket"] + #print ('bucket info : ') + #print (bucketInfo) + + bucketName = bucketInfo["name"] + print ('bucket Name : ' + bucketName) + #print (bucketName) + + objectInfo = s3Info ["object"] + #print ('objectInfo : ') + #print (objectInfo) + + + + key = objectInfo["key"] + print ("key : " + key) + #print (key ) 02_app/upload/hello.mp4 + + split = key.split('/') + filename = split[2] + print (filename) + + + + s3 = boto3.client('s3') + ##reinvent-signs-data/02_app/upload/hello.mp4 + + + #Download the video to /tmp folder + s3.download_file(bucketName, key, '/tmp/' + filename) + + # Copy all the scripts over to /tmp + os.system('cp testscript.sh /tmp/testscript.sh') + os.system('cp video_to_grid.sh /tmp/video_to_grid.sh') + os.system('cp frame_picker.py /tmp/frame_picker.py') + os.system('cp /opt/ffmpeg-git-20190826-amd64-static2/ffmpeg /tmp/ffmpeg') + os.system('echo copy done') + + + cmd = '/usr/bin/bash /tmp/testscript.sh '+ filename + os.system(cmd) + + stream = os.popen('echo Returned output') + output = stream.read() + print(output) + + + + #hello_grid.png + #/02_app/grid-image/lambda_grid.png + + split = filename.split('.') + filenameonlywithoutextension = split[0] + print('ready to upload grid file : ' + filenameonlywithoutextension) + + response = s3.upload_file('/tmp/' + filenameonlywithoutextension + '_grid.png', bucketName, '02_app/grid-image/' + filenameonlywithoutextension + '_grid.png') + + print('Uploaded grid image success') + + + return { + 'statusCode': 200, + 'body': json.dumps('Hello from Lambda!') + } diff --git a/reinvent-2019/sign-and-speak/lambda/python-video-to-grid-shell-cf/testscript.sh b/reinvent-2019/sign-and-speak/lambda/python-video-to-grid-shell-cf/testscript.sh new file mode 100644 index 00000000..31278581 --- /dev/null +++ b/reinvent-2019/sign-and-speak/lambda/python-video-to-grid-shell-cf/testscript.sh @@ -0,0 +1,19 @@ +echo "hello from script" + +echo "param" +echo $1 + +echo "-----------------------" +chmod 755 /tmp/ffmpeg +echo "cd /tmp" +cd /tmp +pwd +ls -lrt +echo "-----------------------" +echo "conversion started" +/usr/bin/bash /tmp/video_to_grid.sh $1 /tmp/ +echo "conversion done" +echo "-----------------------" +cd /tmp +ls -lrt +echo "script done" \ No newline at end of file diff --git a/reinvent-2019/sign-and-speak/lambda/python-video-to-grid-shell-cf/video_to_grid.sh b/reinvent-2019/sign-and-speak/lambda/python-video-to-grid-shell-cf/video_to_grid.sh new file mode 100644 index 00000000..34dc5190 --- /dev/null +++ b/reinvent-2019/sign-and-speak/lambda/python-video-to-grid-shell-cf/video_to_grid.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +###################### +# This script turns a video file into a grid image file. +# Example: +# ./video_to_grid.sh -i input-video.mp4 ./out-dir +###################### + +pwd + +# Retrieve command line input +input_video=$1 +output_dir=$2 +#mkdir $output_dir + +# Use a temporary directory to save files between steps +temp_dir="/tmp/wip" +mkdir $temp_dir + +# Separate the video file path into its parts +file_name=$(basename -- "$input_video") +extension=${file_name##*.} +video_name=${file_name%.*} + +echo ${input_video} + +# Center crop +if [ $extension == "mp4" ] +then + # The mp4 videos tend to be larger, which center crop needs to take into account + cropped_video="${temp_dir}/cropped.${extension}" + /tmp/ffmpeg -i $input_video -vf crop=700:700 $cropped_video +else + cropped_video="${temp_dir}/cropped.${extension}" + /tmp/ffmpeg -i $input_video -vf crop=480:480 $cropped_video +fi +# Resize +resized_video="${temp_dir}/resized.${extension}" +/tmp/ffmpeg -i $cropped_video -vf scale=76:76 $resized_video +# Split into frames +frame_file="${temp_dir}/frame_%01d.png" +/tmp/ffmpeg -i $resized_video -vf "select=not(mod(n\,6))" -vsync vfr -q:v 2 $frame_file +# Choose 9 evenly spread frames +frame_set=$(python frame_picker.py ${temp_dir} 2>&1 >/dev/null) +frames=(${frame_set//|/ }) +# Combine frames into grid image +grid_file="${output_dir}/${video_name}_grid.png" + +rm $grid_file + +/tmp/ffmpeg -i "${temp_dir}/frame_${frames[0]}.png" -i "${temp_dir}/frame_${frames[1]}.png" -i "${temp_dir}/frame_${frames[2]}.png" -i "${temp_dir}/frame_${frames[3]}.png" -i "${temp_dir}/frame_${frames[4]}.png" -i "${temp_dir}/frame_${frames[5]}.png" -i "${temp_dir}/frame_${frames[6]}.png" -i "${temp_dir}/frame_${frames[7]}.png" -i "${temp_dir}/frame_${frames[8]}.png" -filter_complex "[0:v][1:v][2:v][3:v][4:v][5:v][6:v][7:v][8:v]xstack=inputs=9:layout=w3_0|w3_h0+h2|w3_h0|0_h4|0_0|w3+w1_0|0_h1+h2|w3+w1_h0|w3+w1_h1+h2[v]" -map "[v]" $grid_file + +# Clean up +rm -r $temp_dir \ No newline at end of file diff --git a/reinvent-2019/sign-and-speak/lambda/s2s-ws-connect-cf/index.py b/reinvent-2019/sign-and-speak/lambda/s2s-ws-connect-cf/index.py new file mode 100644 index 00000000..0ccfd94f --- /dev/null +++ b/reinvent-2019/sign-and-speak/lambda/s2s-ws-connect-cf/index.py @@ -0,0 +1,44 @@ +import boto3 +import json +from datetime import datetime, timedelta +import time +import os + +def lambda_handler(event, context): + + print (event) + + msgBody = (event) + reqContext = event["requestContext"] + connectionId = reqContext["connectionId"] + print("connectionId is : " + connectionId) + + + + #store to dynamo db + ddbclient = boto3.client('dynamodb') + nowDTTM = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S') # '2019-05-22 06:06:42 + epocSec = int(time.time()) + + response = ddbclient.put_item( + Item={ + 'connectionId': { + 'S': str(connectionId), + }, + 'insertdttm' : { + 'S': nowDTTM + }, + 'epocSecond' : { + 'N' : str(epocSec) + } + }, + TableName=os.environ['wsclientstable'], + ) + + print(response) + + + return { + 'statusCode': 200, + 'body': json.dumps('Successful connect') + } diff --git a/reinvent-2019/sign-and-speak/lambda/s2s-ws-disconnect-cf/index.py b/reinvent-2019/sign-and-speak/lambda/s2s-ws-disconnect-cf/index.py new file mode 100644 index 00000000..b228c1e8 --- /dev/null +++ b/reinvent-2019/sign-and-speak/lambda/s2s-ws-disconnect-cf/index.py @@ -0,0 +1,25 @@ +import json +import boto3 +import os +def lambda_handler(event, context): + + print (event) + + msgBody = (event) + reqContext = event["requestContext"] + connectionId = str(reqContext["connectionId"]) + print("connectionId is : " + connectionId) + + + dynamodb = boto3.resource('dynamodb') + table = dynamodb.Table(os.environ['wsclientstable']) + + response = table.delete_item( + Key={'connectionId' : connectionId} + ) + + # TODO implement + return { + 'statusCode': 200, + 'body': json.dumps('Successful disconnect') + } diff --git a/reinvent-2019/sign-and-speak/lambda/s2s-ws-sendmessage-node-cf/index.js b/reinvent-2019/sign-and-speak/lambda/s2s-ws-sendmessage-node-cf/index.js new file mode 100644 index 00000000..212a50c2 --- /dev/null +++ b/reinvent-2019/sign-and-speak/lambda/s2s-ws-sendmessage-node-cf/index.js @@ -0,0 +1,58 @@ +"use strict"; + +const AWS = require("aws-sdk"); +const wsclientstable = process.env.wsclientstable; +const wssurl = process.env.wssurl; + + +require("aws-sdk/clients/apigatewaymanagementapi"); + +exports.handler = async (event) => { + var record = event["Records"]; + var eventName = record[0]["eventName"]; + if(eventName == "INSERT") + { + var dynamodbItem = record[0]["dynamodb"]; + var newItem = dynamodbItem["NewImage"]; + var sign = newItem["msg"]["S"]; + var confidence = newItem["confidence"]["S"]; + var isSign = newItem["isSign"]["BOOL"]; + var finalMesage = isSign + "|" + confidence + "|" + sign ; + var dynamoClient = new AWS.DynamoDB.DocumentClient(); + let connectionData; + try { + connectionData = await dynamoClient.scan({ TableName: wsclientstable, + ProjectionExpression: 'connectionId' }).promise(); + } + catch (e) { + console.log(e.stack); + return { statusCode: 500, body: e.stack }; + } + const apigwManagementApi = new AWS.ApiGatewayManagementApi({ + apiVersion: '2018-11-29', + endpoint: wssurl + }); + const postCalls = connectionData.Items.map(async ({ connectionId }) => { + try { + await apigwManagementApi.postToConnection({ ConnectionId: connectionId, Data: finalMesage }).promise(); + } catch (e) { + if (e.statusCode === 410) { + console.log('Found stale connection, deleting ${connectionId}'); + await dynamoClient.delete({ TableName: wsclientstable, Key: { connectionId } }).promise(); + } else { + throw e; + } + } + }); + try { + await Promise.all(postCalls); + } catch (e) { + return { statusCode: 500, body: e.stack }; + } + } + const response = { + statusCode: 200, + body: JSON.stringify('DDB Stream Message processed'), + }; + return response; +}; \ No newline at end of file diff --git a/reinvent-2019/sign-and-speak/ui/sign.html b/reinvent-2019/sign-and-speak/ui/sign.html new file mode 100644 index 00000000..b5a27881 --- /dev/null +++ b/reinvent-2019/sign-and-speak/ui/sign.html @@ -0,0 +1,110 @@ + + + + + Sign&Speak + + + + +
+ +
+
+
+
+
+
+
Sign Panel
+
+
+ + +
+
+
+
+ + +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
Message Panel
+
+
+ + +
+
+ + +
+ +
x + +
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/reinvent-2019/sign-and-speak/ui/static/css/signspeak.css b/reinvent-2019/sign-and-speak/ui/static/css/signspeak.css new file mode 100644 index 00000000..9d2f0d27 --- /dev/null +++ b/reinvent-2019/sign-and-speak/ui/static/css/signspeak.css @@ -0,0 +1,13 @@ +.loader { + border: 16px solid #f3f3f3; /* Light grey */ + border-top: 16px solid #3498db; /* Blue */ + border-radius: 50%; + width: 120px; + height: 120px; + animation: spin 2s linear infinite; + } + + @keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } + } \ No newline at end of file diff --git a/reinvent-2019/sign-and-speak/ui/static/js/sign.js b/reinvent-2019/sign-and-speak/ui/static/js/sign.js new file mode 100644 index 00000000..020ee1a2 --- /dev/null +++ b/reinvent-2019/sign-and-speak/ui/static/js/sign.js @@ -0,0 +1,142 @@ +///AWS Account Settings +var app_credentials = { // TODO: Get the details from IAM User "s2sclientuser" + accessKeyId: '',//TODO: Update the accesskeyid.. + secretAccessKey: '' //TODO: Update this secretAccessKey + }; +var app_region = 'ap-southeast-2'; //TODO: Set the region as required + + +var s3Bucket = "signs-data-cf"; +var s3Key = "02_app/upload/RecordedSign.webm"; + +AWS.config.update({credentials: app_credentials, region: app_region}); +var s3 = new AWS.S3(); + +var video; +var recorder; + +var videoConstraints = { + video: true , + audio: false +}; + +var initialized = false; + +$(document).ready(function() +{ + document.getElementById("imgSignGrid").style.visibility ="hidden"; + video = document.getElementById('videoplayer'); + s3 = new AWS.S3(); + + document.getElementById('btn-start-recording').onclick = function() { + this.disabled = true; + showRecVideo(); + + if(initialized == false) + { + //Set Recorder for first time + captureCamera(function(camera) { + video.muted = true; + video.volume = 0; + video.srcObject = camera; + recorder = RecordRTC(camera, { + type: 'video' + }); + recorder.startRecording(); + // release camera on stopRecording + recorder.camera = camera; + document.getElementById('btn-stop-recording').disabled = false; + }); + + initialized = true; + } + else + { + recorder.startRecording(); + document.getElementById('btn-stop-recording').disabled = false; + } + + + }; + + document.getElementById('btn-stop-recording').onclick = function() { + this.disabled = true; + + recorder.stopRecording(stopRecordingCallback); + document.getElementById('btn-start-recording').disabled = false; + }; +}); + +function captureCamera(callback) { + navigator.mediaDevices.getUserMedia(videoConstraints).then(function(camera) { + callback(camera); + }).catch(function(error) { + updateError('Unable to capture your camera. Please check console logs.'); + updateError(error); + }); +} +var vidblob = null; +function stopRecordingCallback() { + vidblob = recorder.getBlob(); +} + +function uploadVideoToS3(videoToUpload, key) +{ + console.info("upload video to S3"); + + document.getElementById("divSpinner").style.visibility=""; + + try + { + var params = { + Body: videoToUpload, + Bucket: s3Bucket, + Key: key, + ServerSideEncryption: "AES256", + }; + + s3.putObject(params, function(err, data) { + if (err) + updateError(err + err.stack); // an error occurred + }); + } + catch(e) + { + updateError("error encountered : " + e ); + } +} + +$('#btn-send-sign').click(function () { + uploadVideoToS3(vidblob,s3Key); + document.getElementById("imgSignGrid").style.visibility =""; +}); + + + + +function showRecVideo() +{ + var vidplayer = document.getElementById("videoplayer"); + var secvidplayer = document.getElementById("sec-videoplayer"); + + vidplayer.className = ""; + secvidplayer.className = "d-none"; +} + +function updateInfo(message) +{ + var node = document.createElement("li"); + node.className = "alert-info"; + var textnode = document.createTextNode("INFO : " + message); + node.appendChild(textnode); + document.getElementById("messages").appendChild(node); +} +function updateError(message) +{ + console.error(message); + var node = document.createElement("li"); + node.className = "alert-warning"; + var textnode = document.createTextNode("ERROR : " + message); + node.appendChild(textnode); + document.getElementById("messages").appendChild(node); +} \ No newline at end of file diff --git a/reinvent-2019/sign-and-speak/ui/static/js/web-socket-msg.js b/reinvent-2019/sign-and-speak/ui/static/js/web-socket-msg.js new file mode 100644 index 00000000..ded5992f --- /dev/null +++ b/reinvent-2019/sign-and-speak/ui/static/js/web-socket-msg.js @@ -0,0 +1,95 @@ +var wsurl = "wss://abcdxyz.execute-api.ap-southeast-2.amazonaws.com/Prod"; //TODO: Put the CloudFormation Template Output value for S2SWebSocketURL + +$(document).ready(function() +{ + WebSocketConnect(); + + document.getElementById('btn-resetui').onclick = function() { + $('#transcript').val(''); + transcription = ''; + document.getElementById("divtranscript").innerHTML = ""; + //document.getElementById("imgSignGrid").src = ""; + }; +}); + +function WebSocketConnect() { + + + if ("WebSocket" in window) { + console.info("WS is supported by browser"); + + // Let us open a web socket + var ws = new WebSocket(wsurl); + + ws.onopen = function() { + console.info("connection opened to WS"); + ws.send("Client is connected"); + console.info("Client is connected"); + }; + + ws.onmessage = function (evt) { + document.getElementById("divSpinner").style.visibility="hidden"; + //document.getElementById("imgSignGrid").src = ""; + var received_msg = evt.data; + console.info('msg recv from socket : ' + received_msg); + updateMsgPanel( received_msg); + + //alert("Message is received..."); + }; + + ws.onclose = function() { + + // websocket is closed. + console.info("connection closed to WS"); + alert("WS is closed. Refresh screen!!!"); + //alert("Connection is closed..."); + }; + } else { + + // The browser doesn't support WebSocket + console.error("WS is not supported"); + alert("WebSocket NOT supported by your Browser!"); + } +} +function updateMsgPanel(messageData) +{ + //Message Format + //isSign|confidence|Message + //true|0.6358023881912231|Hello + msgSplit = messageData.split("|"); + var sign = msgSplit[0]; + var conf = msgSplit[1]; + var msg = msgSplit[2]; + + if(msg == undefined) + { + return; + } + + var divnode = document.createElement("div"); + divnode.className = "alert alert-dark message" + var spannode = document.createElement("span"); + var imageAction = document.createElement("img"); + imageAction.id="imgAction"; + var textnode; + var linknode = document.createElement("a"); + if(sign == "true") + { + divnode.className = "alert alert-warning message" + spannode.className = "badge badge-warning"; + spannode.innerText = "Auslan"; + textnode = document.createTextNode( " " + msg + " (Confidence: " + conf + ")"); + } + else + { + divnode.className = "alert alert-dark message" + spannode.className = "badge badge-dark"; + spannode.innerText = "English"; + textnode = document.createTextNode( " " + msg + " ( Amazon Transcribe )"); + } + + divnode.appendChild(spannode); + divnode.appendChild(textnode); + + document.getElementById("divtranscript").appendChild(divnode); +} From e8d9251b4ffd89daba1037fae772d2e415ed0011 Mon Sep 17 00:00:00 2001 From: Eshaan <25397997+eshaananand@users.noreply.github.com> Date: Mon, 3 Feb 2020 11:47:52 +0800 Subject: [PATCH 20/25] Fixed Readme spelling errors --- reinvent-2019/sign-and-speak/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reinvent-2019/sign-and-speak/README.md b/reinvent-2019/sign-and-speak/README.md index 12cee2c3..eb56fb5d 100644 --- a/reinvent-2019/sign-and-speak/README.md +++ b/reinvent-2019/sign-and-speak/README.md @@ -160,7 +160,7 @@ Please follow the below steps after downloading the code to setup **[AWS] Setup the AWS Resources** - Run the CloudFormation template at /CloudFormation/cf.json. (Note: This template has been tested in AWS Sydney region only) - - Give the name of the stacka as "S2SAPP" + - Give the name of the stack as "S2SAPP" - Provide the parameters requested - PARAMFFMPEGLayer : ARN with version of the FFMPEG Layer - PARAMS2SEndpoint : URL of the S2S Model on Sagemaker @@ -172,7 +172,7 @@ Please follow the below steps after downloading the code to setup - Copy and Store the Access key ID/Secret access key, securely -**[AWS] Lambda Functions** +**[AWS] Lambda Functions : Update latest code ** - Copy the updated code for lambda functions. Create the files as necessary - infersign-cf ( index.py ) - python-video-to-grid-shell-cf( index.py , frame_picker.py , testscript.sh , video_to_grid.sh ) @@ -180,7 +180,7 @@ Please follow the below steps after downloading the code to setup - s2s-ws-disconnect-cf( index.py ) - s2s-ws-sendmessage-node-cf ( index.js ) -**[AWS] Update Lambda Trigger : python-video-to-grid-shell** +**[AWS] Update Lambda Trigger : python-video-to-grid-shell-cf** - Open the Lambda Function python-video-to-grid-shell - Click on Runtime dropdown, and select "Python3.8" - Click on Add Trigger @@ -191,7 +191,7 @@ Please follow the below steps after downloading the code to setup - Ensure "Enable Trigger" is checked - Click Add -**[AWS] Update Lambda Trigger : infersign** +**[AWS] Update Lambda Trigger : infersign-cf** - Open the Lambda Function infersign - Click on Add Trigger - Trigger Configration: select S3 From 51533c62e892f76d424fe050231863b566111e75 Mon Sep 17 00:00:00 2001 From: Sara van de Moosdijk Date: Mon, 3 Feb 2020 21:04:08 +1100 Subject: [PATCH 21/25] Added instructions for FFmpeg layer --- reinvent-2019/sign-and-speak/README.md | 38 ++++++++++++-------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/reinvent-2019/sign-and-speak/README.md b/reinvent-2019/sign-and-speak/README.md index eb56fb5d..c5f5ad1d 100644 --- a/reinvent-2019/sign-and-speak/README.md +++ b/reinvent-2019/sign-and-speak/README.md @@ -60,7 +60,7 @@ The image below shows the full architecture for the two-way communication demo. ### UI Flow - When a new Sign UI/Speak UI instance is started up, It makes a persistent connection to the Websocket API on the API Gateway - Changes to the DynamoDB table are captured via a DynamoDB Stream and the inserted message is published to the API Gateway endpoint using another Lambda Function -- The Websocket API on the APIGateway publishes the message back to the Sign UI/ Speak UI which displays the formatted Message +- The Websocket API on the APIGateway publishes the message back to the Sign UI/ Speak UI which displays the formatted message

@@ -99,10 +99,6 @@ To capture the movement (or time) element of signing a word or phrase, the image

-The stable release of FFmpeg at time of writing (4.2.1) does not contain all the features required to complete the preprocessing. We recommend downloading a [nightly build](https://johnvansickle.com/ffmpeg/) to access the latest features and bug fixes. We used the build from 26/08/2019, but would expect any later build or release to support the required functionality. - -The video preprocessing code is included in this repository and should be placed in an [AWS Lambda](https://aws.amazon.com/lambda/) function running Python 3.8. To run the correct version of FFmpeg, you need to upload it as an AWS Lambda layer. Keep in mind the [size limits](https://docs.aws.amazon.com/lambda/latest/dg/limits.html) for AWS Lambda - only the main ffmpeg binary needs to be included in the ZIP package uploaded as a Lambda layer. - #### 5.2.3 Training and deploying a model First, ensure that all training videos have been preprocessed into 3x3 grid images. Upload these images to an Amazon S3 bucket, organizing the images into folders based on their label (e.g. a folder for 'cat', a folder for 'pub', etc). @@ -111,8 +107,6 @@ Follow [these instructions](https://docs.aws.amazon.com/sagemaker/latest/dg/gs-s If you forgot to pre-load the Sign & Speak project, simply wait for the instance to show status `InService`, then click 'Open Jupyter'. In the new tab which opens, click on the 'New' drop-down menu in the top right corner, and choose 'Terminal' at the bottom of the list. From the terminal, you can `git clone` this repository onto the instance. -Follow the instructions in `scripts/ML Instructions.ipynb` to train and deploy a model with your training data. Once you have an Amazon SageMaker endpoint, follow the instructions below to connect it to the UI. - ### 5.3 Sign & Speak User Interface There are two key screens in the UI - a Sign UI and a Speak UI. Each of them is meant to allow the user to interact with the demo and get a 2-way conversation going. @@ -121,7 +115,7 @@ Each of the UI will support 4 key functions - **On load** : Connect to WebSocket API - **On unload** : Disconnect from WebSocket API -- **Receive Message** : On Receiving a message from the WebSocket API, update the Text Chat panel +- **Receive Message** : On receiving a message from the WebSocket API, update the Text Chat panel - **Capture Intent** : Capture the intent of the user (e.g. capture user video in a Sign UI / capture spoken words from Speak UI) #### 5.3.1 Sign UI @@ -151,8 +145,12 @@ The UI has two panels - Sign Panel and a Message Panel ### 6.0 Pre-Setup **Setup the FFMPEG Lambda Layer** +The stable release of FFmpeg at time of writing (4.2.1) does not contain all the features required to complete the preprocessing. We recommend downloading a [nightly build](https://johnvansickle.com/ffmpeg/) to access the latest features and bug fixes. We used the build from 26/08/2019, but would expect any later build or release to support the required functionality. -**Setup the S2S Model for infrence** +The video preprocessing code is included in this repository and should be placed in an [AWS Lambda](https://aws.amazon.com/lambda/) function running Python 3.8. To run the correct version of FFmpeg, you need to upload it as an [AWS Lambda layer](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html). Keep in mind the [size limits](https://docs.aws.amazon.com/lambda/latest/dg/limits.html) for AWS Lambda - only the main ffmpeg binary needs to be included in the ZIP package uploaded as a Lambda layer. + +**Setup the Machine Learning model for inference** +Follow the instructions in `scripts/ML Instructions.ipynb` to train and deploy a model with your training data. Once you have an Amazon SageMaker endpoint, follow the instructions below to connect it to the UI. ### 6.1 Installation @@ -171,8 +169,7 @@ Please follow the below steps after downloading the code to setup - Click on "Create Access Key" - Copy and Store the Access key ID/Secret access key, securely - -**[AWS] Lambda Functions : Update latest code ** +**[AWS] Lambda Functions : Update latest code** - Copy the updated code for lambda functions. Create the files as necessary - infersign-cf ( index.py ) - python-video-to-grid-shell-cf( index.py , frame_picker.py , testscript.sh , video_to_grid.sh ) @@ -205,9 +202,9 @@ Please follow the below steps after downloading the code to setup - Copy the ui folder to a local directory **[LocalMachine] Update [LocalDir]\ui\static\js\sign.js** -- update the app_credentials +- Update the app_credentials - Put the AccessKeyID/SecretAccessKey in app_credentials -- set the region +- Set the region - Update the variable "app_region" based on the AWS Region used **[LocalMachine] Update [LocalDir]\ui\static\js\web-socket-msg.js** @@ -215,14 +212,13 @@ Please follow the below steps after downloading the code to setup - Put the CloudFormation Template Output value for S2SWebSocketURL in "wsurl" variable ### 6.4 Run Application -** Use Firefox (We have tested it only on this browser) +*Use Firefox (We have tested it only on this browser)* - Navigate to the page \ui\sign.html - Click on Start Sign/Stop Sign to record a sign - Click on Upload Sign to trigger the process of inference -- Inferred Sign message is displayed on the UI +- Inferred sign message is displayed on the UI - If you get an alert message "WebSocket connection is closed. Refresh screen!!!", then reload your UI. - ### 6.3 Uninstall **[AWS] Before Deleting the CloudFormation Stack** @@ -249,11 +245,11 @@ Please follow the below steps after downloading the code to setup **Q:What platform has the UI been tested on?** -**A:** The UI has been tested to work on Windows 10, with Mozilla Firefox browser. Its tested to work in the AWS Sydney Region. +**A:** The UI has been tested to work on Windows 10, with Mozilla Firefox browser. It's tested to work in the AWS Sydney Region. **Q:** I only see a rotating circle on the UI! Help! -**A:** Check the following steps have been performed correctly +**A:** Check the following steps have been performed correctly: - Verify that all the lambda function code has been updated correctly - Verify that the S3 Bucket triggers for inferSign-cf and python-video-to-grid-shell-cf are created - Verify that you have changed the runtime language of lambda function python-video-to-grid-shell-cf to Python 3.8 @@ -267,7 +263,6 @@ Please follow the below steps after downloading the code to setup * Add a 3D avatar to turn text into sign language * Improve the security of the application (e.g. Build in Authentication for UI and APIs) - **Q: What is the animal in your logo?** **A:** It's a [quokka](https://duckduckgo.com/?q=quokka&t=ffnt&atb=v176-1&iax=images&ia=images), a marsupial found only in Australia. We are not professional artists. ;) @@ -284,10 +279,11 @@ This library is licensed under the Apache 2.0 License. ## 10. References -This project references the following libraries to put together the solution +This project references the following libraries to put together the solution: - [jquery-1.12.4](https://jquery.com/) - [aws-sdk.min.js](https://cdnjs.cloudflare.com/ajax/libs/aws-sdk/2.610.0/aws-sdk.min.js) - [bootstrap](https://getbootstrap.com/) - [RecordRTC.js](https://github.com/muaz-khan/RecordRTC) -- [adapter-latest.js](https://github.com/webrtc/adapter) \ No newline at end of file +- [adapter-latest.js](https://github.com/webrtc/adapter) +- [ffmpeg](https://ffmpeg.org/) \ No newline at end of file From c59e965506267186dd605f46fb4b46c4bb413e94 Mon Sep 17 00:00:00 2001 From: Sara van de Moosdijk Date: Mon, 3 Feb 2020 21:05:35 +1100 Subject: [PATCH 22/25] Fixed header numbering --- reinvent-2019/sign-and-speak/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reinvent-2019/sign-and-speak/README.md b/reinvent-2019/sign-and-speak/README.md index c5f5ad1d..f1d8cddb 100644 --- a/reinvent-2019/sign-and-speak/README.md +++ b/reinvent-2019/sign-and-speak/README.md @@ -211,7 +211,7 @@ Please follow the below steps after downloading the code to setup - Update the WS URL - Put the CloudFormation Template Output value for S2SWebSocketURL in "wsurl" variable -### 6.4 Run Application +### 6.3 Run Application *Use Firefox (We have tested it only on this browser)* - Navigate to the page \ui\sign.html - Click on Start Sign/Stop Sign to record a sign @@ -219,7 +219,7 @@ Please follow the below steps after downloading the code to setup - Inferred sign message is displayed on the UI - If you get an alert message "WebSocket connection is closed. Refresh screen!!!", then reload your UI. -### 6.3 Uninstall +### 6.4 Uninstall **[AWS] Before Deleting the CloudFormation Stack** - Make sure the S3 Bucket "signs-data-cf" is empty before deleting the Stack, otherwise it will fail. From 8360dca8c433baed484397c3f21094cf1933b6d9 Mon Sep 17 00:00:00 2001 From: Sara van de Moosdijk Date: Tue, 4 Feb 2020 13:24:56 +1100 Subject: [PATCH 23/25] Added more detail to ffmpeg layer instructions --- reinvent-2019/sign-and-speak/README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/reinvent-2019/sign-and-speak/README.md b/reinvent-2019/sign-and-speak/README.md index f1d8cddb..15578a61 100644 --- a/reinvent-2019/sign-and-speak/README.md +++ b/reinvent-2019/sign-and-speak/README.md @@ -145,12 +145,18 @@ The UI has two panels - Sign Panel and a Message Panel ### 6.0 Pre-Setup **Setup the FFMPEG Lambda Layer** -The stable release of FFmpeg at time of writing (4.2.1) does not contain all the features required to complete the preprocessing. We recommend downloading a [nightly build](https://johnvansickle.com/ffmpeg/) to access the latest features and bug fixes. We used the build from 26/08/2019, but would expect any later build or release to support the required functionality. -The video preprocessing code is included in this repository and should be placed in an [AWS Lambda](https://aws.amazon.com/lambda/) function running Python 3.8. To run the correct version of FFmpeg, you need to upload it as an [AWS Lambda layer](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html). Keep in mind the [size limits](https://docs.aws.amazon.com/lambda/latest/dg/limits.html) for AWS Lambda - only the main ffmpeg binary needs to be included in the ZIP package uploaded as a Lambda layer. +The stable release of FFmpeg at time of writing (4.2.1) does not contain all the features required to complete the preprocessing. We recommend downloading a [nightly build](https://johnvansickle.com/ffmpeg/) to access the latest features and bug fixes. We used the build from 26/08/2019 but would expect any later build or release to support the required functionality. To run the correct version of FFmpeg, you need to upload it as an [AWS Lambda layer](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html). Keep in mind the [size limits](https://docs.aws.amazon.com/lambda/latest/dg/limits.html) for AWS Lambda - only the main ffmpeg binary needs to be included in the ZIP package uploaded as a Lambda layer. Detailed instructions as follows: + +1. Download the `ffmpeg-git-amd64-static.tar.xz` from the [nightly build](https://johnvansickle.com/ffmpeg/) +1. Untar the tar file on your local machine +1. Create a zip package containing the `ffmpeg` binary file. Name the zip package however you like, but make sure the `ffmpeg` file is at the top level of the package +1. Navigate to AWS Lambda and upload the zip package as a layer +1. Make a note of the ARN **Setup the Machine Learning model for inference** -Follow the instructions in `scripts/ML Instructions.ipynb` to train and deploy a model with your training data. Once you have an Amazon SageMaker endpoint, follow the instructions below to connect it to the UI. + +Follow the instructions in `scripts/ML Instructions.ipynb` to train and deploy a model with your training data. Once you have an Amazon SageMaker endpoint, make a note of the ARN, and follow the instructions below to connect it to the UI. ### 6.1 Installation From 5de986181c81d81d9525f0dda6a778435400fb4f Mon Sep 17 00:00:00 2001 From: Sara van de Moosdijk Date: Tue, 4 Feb 2020 13:28:23 +1100 Subject: [PATCH 24/25] Shortening ffmpeg directory name --- .../lambda/python-video-to-grid-shell-cf/index.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reinvent-2019/sign-and-speak/lambda/python-video-to-grid-shell-cf/index.py b/reinvent-2019/sign-and-speak/lambda/python-video-to-grid-shell-cf/index.py index 25ec2be9..ef6068d4 100644 --- a/reinvent-2019/sign-and-speak/lambda/python-video-to-grid-shell-cf/index.py +++ b/reinvent-2019/sign-and-speak/lambda/python-video-to-grid-shell-cf/index.py @@ -49,7 +49,7 @@ def lambda_handler(event, context): os.system('cp testscript.sh /tmp/testscript.sh') os.system('cp video_to_grid.sh /tmp/video_to_grid.sh') os.system('cp frame_picker.py /tmp/frame_picker.py') - os.system('cp /opt/ffmpeg-git-20190826-amd64-static2/ffmpeg /tmp/ffmpeg') + os.system('cp /opt/ffmpeg /tmp/ffmpeg') os.system('echo copy done') From 4608920122fe5519c931bee78bb941173665cc25 Mon Sep 17 00:00:00 2001 From: Eshaan <25397997+eshaananand@users.noreply.github.com> Date: Wed, 5 Feb 2020 09:20:19 +0800 Subject: [PATCH 25/25] Fixed Lambda Permissions --- .../sign-and-speak/CloudFormation/cf.json | 23 +------------------ 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/reinvent-2019/sign-and-speak/CloudFormation/cf.json b/reinvent-2019/sign-and-speak/CloudFormation/cf.json index 69906731..64ff8098 100644 --- a/reinvent-2019/sign-and-speak/CloudFormation/cf.json +++ b/reinvent-2019/sign-and-speak/CloudFormation/cf.json @@ -93,28 +93,7 @@ ] } } - }, - "S3InvokeGridLambdaPermission": { - "Type": "AWS::Lambda::Permission", - "DependsOn" : ["videotogridlambda","S3Bucket"], - "Properties": { - "Action": "lambda:InvokeFunction", - "FunctionName": { "Ref": "videotogridlambda" }, - "Principal": "s3.amazonaws.com", - "SourceArn": {"Fn::GetAtt": [ "S3Bucket", "Arn" ] } - } - }, - "S3InvokeInferSignLambdaPermission": { - "Type": "AWS::Lambda::Permission", - "DependsOn" : ["infersignlambda","S3Bucket"], - "Properties": { - "Action": "lambda:InvokeFunction", - "FunctionName": { "Ref": "infersignlambda" }, - "Principal": "s3.amazonaws.com", - "SourceArn": {"Fn::GetAtt": [ "S3Bucket", "Arn" ] } - } - }, - + }, "IAMS2SExecutionRole" : { "Type" : "AWS::IAM::Role", "Properties" : {