{"id":41049,"date":"2021-03-02T18:43:28","date_gmt":"2021-03-02T10:43:28","guid":{"rendered":"\/blog\/?p=41049"},"modified":"2021-03-02T18:43:31","modified_gmt":"2021-03-02T10:43:31","slug":"handwriting-recognition-with-wio-terminal-edge-impulse","status":"publish","type":"post","link":"https:\/\/www.seeedstudio.com\/blog\/2021\/03\/02\/handwriting-recognition-with-wio-terminal-edge-impulse\/","title":{"rendered":"Build Handwriting Recognition with Wio Terminal &#038; Edge Impulse"},"content":{"rendered":"\n<p>In today\u2019s tutorial, I\u2019ll show you how you can build a machine learning based handwriting recognition device with the Wio Terminal and Edge Impulse. Follow this detailed guide to learn how a single time of flight sensor can allow you to recognise handwriting gestures and translate them to text!<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>In this comprehensive tutorial, we will cover:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Key Concepts: Time-of-Flight Sensors, Machine Learning &amp; TinyML<\/li><li>Setting up the development environment<\/li><li>How to Perform Data Collection with Edge Impulse<\/li><li>Designing, Training, Evaluating &amp; Deploying the Machine Learning model with Edge Impulse<\/li><li>Implementing Live Inferences on the Wio Terminal with Arduino<\/li><li>Potential Improvements to this Project<\/li><\/ul>\n\n\n\n<div style=\"height:31px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1030\" height=\"601\" src=\"https:\/\/blog.seeedstudio.com\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6-1030x601.png\" alt=\"\" class=\"wp-image-41124\" srcset=\"https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6-1030x601.png 1030w, https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6-300x175.png 300w, https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6-768x448.png 768w, https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6-1024x597.png 1024w, https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6.png 1500w\" sizes=\"(max-width: 1030px) 100vw, 1030px\" \/><\/figure><\/div>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Project Overview: Handwriting Recognition<\/strong><\/h2>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Handwriting recognition has consistently been a popular field of development since digitalisation began to occur on a global scale. One common use case that you might be familiar with is the conversion of handwritten text into computer readable formats through optical character recognition, or OCR.<\/p>\n\n\n\n<p>In addition to camera based systems, there are many other ways to achieve handwriting recognition, such as with the touchscreens on our mobile phones and tablets, or <a href=\"https:\/\/www.hackster.io\/naveenbskumar\/handwriting-recognition-7583e3\">movement based tracking with inertial measurement units (IMUs)<\/a>. However, the project that we will be covering today will be far simpler than that &#8211; we will use nothing but a single time of flight sensor to recognise handwriting gestures.<\/p>\n\n\n\n<p>Let\u2019s first have a look at a video demonstration of the project in action.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"800\" height=\"450\" src=\"https:\/\/blog.seeedstudio.com\/wp-content\/uploads\/2021\/03\/HR-Feature-1.gif\" alt=\"\" class=\"wp-image-41119\"\/><\/figure><\/div>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Brief on TinyML and Edge Impulse<\/strong><\/h2>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Machine learning is a method of data analysis. It builds on the idea that systems can automatically learn from data with the help of algorithms to identify patterns and make decisions. Image recognition, stock market prediction and speech to text natural language processing are only some of the applications that have been enabled by machine learning.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/kQtcMLNApPTSlnqT9Ea57lnESF2AOaFgbV6VWrasUwdrisXRm7zVJizAh3X_DwOxSOh9jggOU-eLWsQPNVY327eSXJBUajodY7ENv1YSfPh42OIZNwbVKqACZYsfCCW0qwcFQ8mJ\" alt=\"\" width=\"800\"\/><figcaption>Neural Network for Image Classification, Source: Carnegie Mellon University<\/figcaption><\/figure><\/div>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>TinyML, short for Tiny Machine Learning, is a subset of machine learning that employs optimisation techniques to reduce the computational space and power required by machine learning models. Specifically, it aims to bring ML applications to compact, power-efficient, and most importantly affordable devices like microcontroller units.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/bE8khbTgkyBaWPSFquroRgwI2iL5F_VMSA5MHdobEQTKXwOr0oyR24BleCZUJPIjNA29arPWK-fbYmiGD4f0zy0xXxhdWYiq6kY2Gby3Z_AD1df7NjevPTtoYyb0REzJV3CWp3Cq\" alt=\"\" width=\"500\"\/><\/figure><\/div>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>For today\u2019s project, we will be using <a href=\"https:\/\/www.edgeimpulse.com\/\">Edge Impulse<\/a>. Edge Impulse is a platform that makes it easy to build machine learning models for the edge by providing infrastructure all the way from data collection and processing to model training and finally deployment.&nbsp;<\/p>\n\n\n\n<p>For this project, we will need to create an Edge Impulse account, which is free for personal use. Sign up <a href=\"https:\/\/studio.edgeimpulse.com\/signup\">here<\/a>.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Time of Flight &amp; Handwriting Recognition<\/strong><\/h2>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Firstly, time of flight or ToF is a method for measuring distance, or ranging. In ToF sensors, a signal is first emitted from the sensor to the environment. When the signal hits an obstacle or object, it will be reflected and returned to the sensor. The sensor measures the time it takes for the signal to return and uses it to calculate the distance travelled by the wave, hence \u201ctime of flight\u201d.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/OgxtL0KVAatCQdZOsZgLXbwlDOgmRgbctRntxMSdQHWNw1sciA7kYWVpS7JkvStEgp6atIpnbXioE2kyqtvSs4GIAwllm7EkZS7cUqtvD1dTCEAHB-kGJzNj8n8ak0vcUwPkn8n1\" alt=\"\" width=\"600\"\/><figcaption>Source: Terabee<\/figcaption><\/figure><\/div>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>But how does this enable handwriting recognition? The concept behind today\u2019s project is actually relatively simple. We will place the ToF sensor at the side of our \u201cdrawing board\u201d, and perform our handwriting gestures within the sensor\u2019s line of sight. As our gesture is being performed, our hand will move and cause changes to the distance values read by the sensor.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/ajgJJcIp7_MEH9uNHOpr8VrqhPUTetdzd_HnnAE4O3hN23Trzo_GOjfxQaNXp4_lXMuAJ9-RONsEPT-5p5zdi7-qTH3nw5_7azox1Bc_4OzWNHxGAgW4F2Tm8rY54wxHiu2E0yNO\" alt=\"\" width=\"700\"\/><\/figure><\/div>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Because each letter we write will follow the same movements in general, we expect the series of distances recorded by the sensor during the gestures to follow certain abstract patterns. Yes, identifying handwriting from an array of values is no easy task for the human eye, but it is certainly not beyond the capabilities of machine learning!<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Project Materials<\/strong><\/h2>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Before we proceed any further, the items below are recommended if you would like to follow along with this tutorial.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/www.seeedstudio.com\/Wio-Terminal-p-4509.html\">Wio Terminal<\/a><\/li><li><a href=\"https:\/\/www.seeedstudio.com\/Grove-Time-of-Flight-Distance-Sensor-VL53L0X.html\">Grove VL53L0X Time of Flight Distance Sensor<\/a><\/li><\/ul>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>You can use any kind of ranging sensor for this project, such as the <a href=\"https:\/\/www.seeedstudio.com\/Grove-Ultrasonic-Distance-Sensor.html\">Grove Ultrasonic Ranger<\/a> or the <a href=\"https:\/\/www.seeedstudio.com\/Seeedstudio-Grove-TF-Mini-LiDAR.html\">Grove TF Mini LiDAR Sensor<\/a>, which are actually officially supported for data collection with Edge Impulse. Nonetheless, I am using the VL53L0X sensor as it is what I have on hand.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Set Up Wio Terminal &amp; Computer<\/strong><\/h2>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>To get started, we first have to set up our Wio Terminal and the development environment on our computer.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<ol class=\"wp-block-list\"><li>If this is your first time working with the Wio Terminal, it is highly recommended to first visit the<a href=\"https:\/\/wiki.seeedstudio.com\/Wio-Terminal-Getting-Started\/\"> Getting Started guide on the Seeed Wiki<\/a>.<\/li><li>Next, install the <a href=\"https:\/\/github.com\/Seeed-Studio\/Grove-Ranging-sensor-VL53L0X\">VL53L0X Grove Ranging Sensor Library<\/a> by downloading the repository as a ZIP and installing via Arduino IDE. Detailed instructions can be found <a href=\"https:\/\/wiki.seeedstudio.com\/How_to_install_Arduino_Library\/\">here<\/a>.<\/li><li>Finally, set up your Wio Terminal and computer for use with Edge Impulse by following the instructions at <a href=\"https:\/\/wiki.seeedstudio.com\/Wio-Terminal-Edge-Impulse\/\">this link<\/a>.<\/li><\/ol>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Setting Up the Data Collection<\/strong><\/h2>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>As with any machine learning project, our first step is to acquire some form of data. In today\u2019s project, we are going to create our own dataset by recording our sensor values while performing our gestures. Fortunately, it\u2019s fairly simple to do this with Edge Impulse!<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Uploading the Data to Edge Impulse<\/strong><\/h3>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Edge impulse allows you to upload data from a variety of sources, including your own datasets and even using your mobile phone. For uploading data from the Wio Terminal, there are two key ways.<\/p>\n\n\n\n<p>If you are using one of the aforementioned Edge Impulse supported <a href=\"https:\/\/www.seeedstudio.com\/Grove-Ultrasonic-Distance-Sensor.html\">Grove Ultrasonic Ranger<\/a> or <a href=\"https:\/\/www.seeedstudio.com\/Seeedstudio-Grove-TF-Mini-LiDAR.html\">Grove TF Mini LiDAR Sensor<\/a>, you can directly use the edge-impulse-daemon command in your terminal to collect and upload data conveniently. You can refer to this <a href=\"https:\/\/wiki.seeedstudio.com\/Wio-Terminal-Edge-Impulse-Distinguish-Alochol\/\">Edge Impulse alcohol distinguishing project<\/a> on the Seeed Wiki for detailed instructions.<\/p>\n\n\n\n<p>Otherwise, for other unsupported sensors, we will have to pass the data that we want to collect data with data forwarder instead!<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 1: Connect TOF Sensor to Wio Terminal<\/strong><\/h3>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Simply plug your Grove VL53L0X ToF sensor into the I2C Grove port of the Wio Terminal as shown below.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/BGJO12U2PgN7zMdg5nZifNUNNd0aeSFtKOOWGVRsYH4vbe0qGfDIxkASeqF_jEzpTj-KAYBIwxEtc82-M4Pp-m83pMbERnP-78NTYN1SRaLpPt5L5-97NpwLU-kW9GVzldJunceG\" alt=\"\" width=\"700\"\/><\/figure><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 2: Upload Arduino Sketch to Deliver Sensor Readings to Serial<\/strong><\/h3>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>The Edge Impulse data forwarder uses serial communication to obtain and record our sensor readings. In order to feed the readings in, we will first need to flash an Arduino sketch that will output the values we want to the serial interface.<\/p>\n\n\n\n<p>At this point, you can download the files for the project from this <a href=\"https:\/\/github.com\/supperted825\/WioTerminal_HandwritingRecogniser\">Github repository<\/a>.<\/p>\n\n\n\n<p>Inside the ToF_DataForwarder folder, open ToF_DataForwarder.ino and flash this to your Wio Terminal. Alternatively, you can also create your own data forwarding sketch from one of the examples available under Files &gt; Examples &gt; Grove VL53L0X Library. The data forwarder sketch I\u2019ve provided is based on the high accuracy ranging example, and transmits data at a frequency of 5Hz to the serial monitor.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/QYa54TeF5FghBaf0LmJPGgDqo33v0n8nAFfitCEnSVPGd2NVBlcDcUyiG7-3ISANpSJtRbCz6uoe6B1-Kcr4CTC1h5A0vIq1C5u5foiXMg78MveGcwwT9QM-bQS42jyjNEaLW7pM\" alt=\"\"\/><\/figure><\/div>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>After flashing, you\u2019ll want to verify that your sensor values are transmitting correctly. Open the serial monitor in the Arduino IDE and you should see a stream of distance values appearing, like below.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/CASfIzap22kDd8HRIHu5v3m8aMgYh1vcN0NgX9OqoQBQ9WG0jJB_X4JeIkLQSjeplEOFM8ig_gL9Aly8yINko9z_DA9fN-g1XA953l4qONk048g8Q4dxSvrUdSXVA3dnOUGLd4o2\" alt=\"\" width=\"600\"\/><\/figure><\/div>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>If you want more information on the data forwarder, visit <a href=\"https:\/\/docs.edgeimpulse.com\/docs\/cli-data-forwarder\">here<\/a>.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 3: Run the Edge Impulse Data Forwarder<\/strong><\/h3>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Next, close the serial monitor and open your terminal or command line on your computer. To start the Edge Impulse data forwarder, run:<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code>edge-impulse-data-forwarder<\/code><\/pre>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>You will be prompted to enter your Edge Impulse account details, and your Wio Terminal should then be connected to the Edge Impulse Web UI in a few moments! To check this, visit your Edge Impulse project and check under your devices tab. You should see something similar to what is shown below.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/_zL1IAaeoyVbeK3FuV7IMCImoB9t08waa9cuKST0ESBE7Fv1ISw9X2ZfwtPotZsoddi271HfhV-wFl7JN_Dq8K2lOZLuzZwNuvCjdHaiyvKdBU1bJydlpKIE6qICMa2xOxcBVdrj\" alt=\"\" width=\"700\"\/><\/figure><\/div>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Data Acquisition<\/strong><\/h2>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Now, we\u2019re ready to build our dataset! Head over to the Data acquisition tab on the side panel and you should be greeted with the following screen, albeit with no data shown.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/F4a7lOfxWSTo1pOuIAN-hkcCgkcNBifZs3GEd6nnJGLG6DpDiIF0kMMkXa-jlVItLQGCq3edjxBJPB1LZ9IdovPSsyfhycbUO29QH_WycI-OKtlsE6pcDLf8TfP92ZY8Ar1Iu44Q\" alt=\"\" width=\"700\"\/><\/figure><\/div>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Recording Parameters<\/strong><\/h3>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>On the right side, make sure your Wio Terminal and its ToF sensor are selected in the \u201cDevice\u201d and \u201cSensor\u201d fields. Set \u201cFrequency\u201d to the output frequency of your data forwarder sketch, then enter the \u201cLabel\u201d as the letter you are going to draw.<\/p>\n\n\n\n<p>Finally, let\u2019s talk a bit about duration. Initially, I wanted to record longer snippets of repetitive motion, then split it up into different samples with Edge Impulse\u2019s \u201cSplit Sample\u201d function. However, the process of identifying snippets is somewhat automatically done, which resulted in me only yielding 2 to 3 samples for a minute of recording despite having performed the gesture 20 times.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/Ika3zoZAgxKOWvHoaZ1zbB2LTs6mXK6V9NW9aDOrz7vhLdH33Eb7APGYQooDNydprY4u2K1ipPFlwozgDjitTO67uJFIolWHHoX1kW1-8bG0dhFb_2N2warpmyZotYF7JHBfq79r\" alt=\"\" width=\"700\"\/><\/figure><\/div>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>In the end, I recorded samples of 10 seconds to use without splitting, where I performed the gesture repeatedly within the window. However, you can definitely choose to record one gesture for each recording, which is the more straightforward approach.<\/p>\n\n\n\n<p>In fact, I actually recommend this over what I did, since movements between drawing the letters can add noise to the sample and dilute our learning features. But because my model ends up performing decently anyway (spoiler alert!), I didn\u2019t come back to change this.<\/p>\n\n\n\n<p>Once you\u2019re ready, click on the \u201cStart Sampling\u201d button. When the recording starts, you\u2019ll see a live countdown of how long you have left.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>How much data is needed?<\/strong><\/h3>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>For a proof of concept project, I\u2019ve only trained a total of 4 classes, \u2018A\u2019, \u2018B\u2019, \u2018C\u2019 in capital letters, as well as a Null class. If you\u2019re recording 10 second snippets like me, you\u2019ll want at least 10 data samples for each class for training, then 3 more samples each for testing. If you\u2019re recording individual snippets, that translates to about 30 and 10 per class for training and testing respectively.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Impulse Design<\/strong><\/h2>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Once you\u2019re satisfied with the data that you collected, we can move on to Impulse Design to begin working towards our machine learning model. Here we have several columns that can get rather confusing, but I\u2019ll do my best to explain the essentials for this project.<\/p>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/syR3I9ZSRO1HRbbe8iwh16UKofW10YmNFLGS4k7AD6glAaS0JHT5wt1oiKLYRf6Bx-VC08kxvbZSMld4aY_du3c43b1re6uXhvfNJx9MtRAV-BBYdFqcjdDHKxC4ECHnjd5uON3l\" alt=\"\" width=\"800\"\/><\/figure><\/div>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Add an Input Block<\/strong><\/h3>\n\n\n\n<p>In the left most column, select \u201cTime series data\u201d, since we are working with distance values recorded over a period of time. You\u2019ll notice two parameters that can be adjusted, \u201cWindow Size\u201d and \u201cWindow Increase\u201d.<\/p>\n\n\n\n<p>In layman terms, the way Edge Impulse handles data is that it will scan through your sample with a window that moves across. Window Size changes the size of that window, and Window Increase is the size of the step that will be taken when the window shifts rightwards. Each window in each step is going to be a data feature on its own.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/WBln5JE1vkeceNhNVUC1fGwRKZJ5TxcT2SaXm16o159RWDxLBPF1xhKkJFgrwrz84NfT3wgqgQhmyFEBBUwDb24NJP_mf5fdSYZTiROu4JRcDtvHQWOi6vuh0y3BdIDkCeeuY7hf\" alt=\"\" width=\"1000\"\/><\/figure><\/div>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>These values can heavily affect the performance of your model later on, so be sure to come back to adjust this if you aren\u2019t seeing desirable performance.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Add a Processing Block \/ Add a Learning Block<\/strong><\/h3>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Edge Impulse offers quite a number of processing methods, but I used the very simple flatten for this project. If you are planning on adding more classes later, it might be a good choice for you to work with raw data without preprocessing. This is because our data is time-series based, which means that the desired training features would already be available in our raw data. Using preprocessing with flatten can reduce the distinction between our classes, which will result in poorer performance when more classes are introduced.<\/p>\n\n\n\n<p>For learning, we don\u2019t really have much choice but to go with the Neural Network classifier. When you\u2019re done, check your output features and click on \u201cSave Impulse\u201d.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Data Processing<\/strong><\/h2>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Now, move onto \u201cFlatten\u201d in your project sidebar. You\u2019ll be greeted with some feature processing options such as scaling, as well as the choice of generated features from average, minimum, maximum, root mean squares, etc. This is where our raw data will be converted into features that are probably going to be more useful for our model to identify the handwritten gesture. You can select all of them for now.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/NaN3K3GPvvqiBgVr3HU2ibOIQ75andgZYl81eUp0gMVwXSSYL_kEvfngaIlcdslybvOg8PZVMrHvWvMw9BQ1kN8WQ7VEOcCr7g3Lu0pF_J5nWpMBOVHtB3AOYDJPj1xUw1NpZvp6\" alt=\"\" width=\"800\"\/><\/figure><\/div>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>After clicking on save parameters, you will be brought to the next page. Click on \u201cGenerate Features\u201d and let the program do its thing. A 3D graph will be shown on the right for you to explore the generated features of each class and how they related to one another.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/IL9BdRwTOXH3J6x_yEDHRIFm-tgis8f_TC8BDLIZkGygnwWhshC6Ry06qNDrNUrGBUGRqhx7CvAPZyL3Rcu7XzA_-aT-95c_2WWXD8FTEuSo_t4M8aqIopMp0UovSdu9qQWawYOe\" alt=\"\" width=\"800\"\/><\/figure><\/div>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>To help your model learn better, you want to find the features that distinguish your classes from each other cleanly and clearly. In my case, I found that standard deviation, skewness and kurtosis gave decent separation between each of the classes, so I ended up only using these three features in my final model to save on computational power.<\/p>\n\n\n\n<p>While it can be tempting to simply move on from here and begin training our model, it\u2019s really worth taking some time to revisit your data if none of the features give good distinctions between classes. In my case, I had to re-record several samples to fix those that had simply too much noise to be useful for model training.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Model Training<\/strong><\/h2>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Finally, it\u2019s time to train our neural network! Boost the number of training cycles to 500 (you can reduce this later), and leave the learning rate and confidence rating as is for now. You can exercise a lot of liberty when it comes to the structure of your NN classifier. I\u2019d suggest you play around with this and see what gets the best results!<\/p>\n\n\n\n<p>The architecture of the model I used is shown below.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/blog.seeedstudio.com\/wp-content\/uploads\/2021\/03\/Model.png\" alt=\"\" class=\"wp-image-41133\" width=\"600\" srcset=\"https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Model.png 810w, https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Model-300x291.png 300w, https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Model-768x746.png 768w\" sizes=\"(max-width: 810px) 100vw, 810px\" \/><\/figure><\/div>\n\n\n\n<p>Once your model is done training, you should see some metrics on the training performance. Ideally, you want this to be at least above 90%. This is also a good chance to see what classes the model is struggling with. For example, before I re-recorded my training data, I was getting a lot of misclassifications between class A and B, which gave me clues on how to improve my data collection process.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/XNKyR3lBXqf1kbBDQZHUHF1mF8EP3gb_h7QuronMv-V05-r6WJzkGHl5A7SZhshR71Zre2xpkcAXf457k3_mTNnXefm-l4tbKcg5k_OpZyLV3poWqFNjjD15ftWuRYTKFxzwD9-H\" alt=\"\" width=\"800\"\/><\/figure><\/div>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Testing the Model<\/strong><\/h2>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>You can test the model by heading over to the \u201cLive classification\u201d page. There, you can simply upload samples like we did in the data acquisition stage, and the model will produce a classification result for verification. You should also test your model on the test data that you recorded earlier in the \u201cModel testing\u201d page. You can move on if you\u2019re satisfied with its performance, or head back to an earlier step for improvements.<\/p>\n\n\n\n<p><em>Note: You can use \u201cVersioning\u201d to save the current state of your project. That should give you room to comfortably make changes. Don\u2019t be afraid to explore!<\/em><\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/_8bjurPhRigF3q4RjWXXsAYaGZ-h0FJxLJGC75gdAfAWOT3Zn2wMQYbmlesrLv7tHI2KFYtWrvgx_cdE8w6aYKtHV8i1Rwl3xityFtc6rXphBejeigKE625hTjkcc4W-WVbNOBBi\" alt=\"\"\/><\/figure>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Deploying the Model<\/strong><\/h2>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Congratulations on making it this far! Head over to the \u201cDeployment\u201d page to finally begin exporting our model for use on our Wio Terminal. First, select Arduino library.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/eXjP2gu8nFzX9MWP44kC0NuthUCxM6SSe64emuo4d745oWsNDmSK2g-sohoD0V4lv0_4uF18q3uVyKPXFBQD_Gj1wN5ugyAtWzQh0JMmEDs_3n77H8jlMKAHoIXgMEFeWckhaDSU\" alt=\"\" width=\"800\"\/><\/figure><\/div>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Then, select the \u201cQuantized (int8)\u201d model and click build. Quantisation is one TinyML technique that converts floating point numbers (those with decimals) to integers that require less memory and processing power to perform calculations with. This optimisation typically comes with a small loss in accuracy, but large improvements in latency and a reduction in computational requirement.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/IsKVLPer5zgG-kAqHQ1CIGaCl57zmFXg8VwoZ9ZkUQKwRas7Qd7cKuLZSQ4YRiFFtm5zgHLDZOn0k-nHIUjTmOYytkDo1AsYPXJkm0NuNyOT27gF3ocI_5AFL9cl93Dc7M3bLNna\" alt=\"\" width=\"800\"\/><\/figure><\/div>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Edge Impulse will then begin building the Arduino Library, which will be downloaded to your computer as a ZIP when complete. Install this ZIP file with your Arduino IDE.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/yfwg9FTY_v0G4jcR-D0YOJ-xgSYmGUMkiCoGxHvAqVmvoMY-EYC60gMMZQWu8CRd9OCJ1_9gNZVyyrSVvc6znCmL_dqks6zseIoq8nEFKx6HxHXwPfcbuHLsFL4LSL0Lx7Z9bCpG\" alt=\"\" width=\"700\"\/><\/figure><\/div>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Arduino Implementation<\/strong><\/h2>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Naturally, to deploy to our Wio Terminal with Arduino, we will need an Arduino sketch. Fortunately, the library you just installed comes with several examples that we can easily modify for our purpose. Navigate to Files &gt; Examples &gt; &lt;Library Name&gt; and select the static_buffer example.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/gd77DZTIXde-_Q2kzNd18a4aR5nabh8VwxPP_Zc7Wsl53hs_gRx5gfYM0nYRIJhVLu_IUfqd_aArMkpro5wBgLMJotBu6O8UhS4MZG8iGXPzWFyGgGiEb2MNVFvq5d3wshLdk-XH\" alt=\"\" width=\"700\"\/><\/figure><\/div>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Once it opens up, save the sketch in a location of your choice. Then, we will need to make the following changes to the Arduino code.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1.&nbsp; Add Includes &amp; Declarations<\/strong><\/h3>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Firstly, add the following code to the top of the sketch so that we can get input data from our ToF sensor.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;wio_terminal_handwriting_recogniser_inference.h&gt;\n#include &lt;wio_terminal_handwriting_recogniser_inference.h&gt;\n#include \"Seeed_vl53l0x.h\"\nSeeed_vl53l0x VL53L0X;\n\n#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE\n    #define SERIAL SerialUSB\n#else\n    #define SERIAL Serial\n#endif<\/code><\/pre>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Then, modify the features array declaration by removing const and the array contents as follows. In my case, I am using 25 as my model expects an input of 25 features (distance values). This will probably be different for you if you have chosen a different window size or step on Edge Impulse.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code>static float features&#91;25];<\/code><\/pre>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>If you are unsure of how many input features are required, you can declare a random integer first, and watch the serial monitor output. The program will throw an error message and tell you the dimensions that it expects.<strong><\/strong><\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2.&nbsp; Replace setup() Function<\/strong><\/h3>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Replace the setup() function entirely with the following code.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code>void setup() {\n    Serial.begin(115200);\n\n    VL53L0X_Error Status = VL53L0X_ERROR_NONE;\n    Status = VL53L0X.VL53L0X_common_init();\n    if (VL53L0X_ERROR_NONE != Status) {\n        SERIAL.println(\"start vl53l0x mesurement failed!\");\n        VL53L0X.print_pal_error(Status);\n        while (1);\n    }\n\n    VL53L0X.VL53L0X_high_accuracy_ranging_init();\n\n    if (VL53L0X_ERROR_NONE != Status) {\n        SERIAL.println(\"start vl53l0x mesurement failed!\");\n        VL53L0X.print_pal_error(Status);\n        while (1);\n    }\n    \n    Serial.println(\"Edge Impulse Inferencing Demo\");\n}<\/code><\/pre>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>3.&nbsp; Modify loop() Function<\/strong><\/h3>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Finally, add the following code to the top of your loop() function. Please take note that the maximum value of i defined in the for loop must be updated to match the length of your feature array as well.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code>Serial.print(\"Perform gesture in 3... \");\ndelay(1000);\nSerial.print(\"2... \");\ndelay(1000);\nSerial.print(\"1... \");\ndelay(1000);\nSerial.print(\"Start! ...\");\n    \nfor (int i = 0; i&lt;25; i++) {\n    VL53L0X_RangingMeasurementData_t RangingMeasurementData;\n    VL53L0X_Error Status = VL53L0X_ERROR_NONE;\n    \n    memset(&amp;RangingMeasurementData, 0, sizeof(VL53L0X_RangingMeasurementData_t));\n    Status = VL53L0X.PerformSingleRangingMeasurement(&amp;RangingMeasurementData);\n    if (VL53L0X_ERROR_NONE == Status) {\n        if (RangingMeasurementData.RangeMilliMeter &gt;= 2000) {\n            \/\/SERIAL.println(\"out of range!!\");\n            SERIAL.println(-50);\n        } else {\n            \/\/ SERIAL.print(\"Measured distance:\");\n            features&#91;i] = RangingMeasurementData.RangeMilliMeter;\n            \/\/ SERIAL.println(\" mm\");\n        }\n    } else {\n        SERIAL.print(\"mesurement failed !! Status code =\");\n        SERIAL.println(Status);\n    }\n    delay(200);\n}\nSerial.println(\"End!\");<\/code><\/pre>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Now, you can open the Serial monitor and test your model with live inferences on your Wio Terminal. The code will prompt you to start performing the gesture with a countdown, then perform the inference and display the results.<\/p>\n\n\n\n<p>For example, this is the output when I drew an A\u2026 followed by some other movements that the model seemed to think was a C.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/lA_kM14QY6yst9U1DSNC64Cnzqc8NzA7YUizQYm3v7ItcAeMjZ8SJlM6Kt3eoI9SKb6V51569vlzRzHHVsDcwJS12i4w30MjoyiNRpJn6OKrF5GbP6hbPeD1SzXfdQaaLKErptVW\" alt=\"\" width=\"600\"\/><\/figure><\/div>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Incorporating the LCD Display<\/strong><\/h2>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>The next step is to turn this into a true handwriting recognition device by incorporating the display prompts onto the Wio Terminal\u2019s built in LCD screen! You can follow along with the instructions in this section or simply refer to the Test_EIModel_TFT.ino file that should have been downloaded with the rest of this project\u2019s code.<\/p>\n\n\n\n<p>First, we include the TFT library and declare an instance. The TFT library for the Wio Terminal should already be installed in your computer if you\u2019ve performed Step 1 of the \u201cSet Up Wio Terminal &amp; Computer\u201d section in this tutorial.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code>#include \"TFT_eSPI.h\"\nTFT_eSPI tft;<\/code><\/pre>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Then, we include an initialisation in our setup() function, define some parameters and include a simple splash screen on startup.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code>tft.begin();\ntft.fillScreen(TFT_BLACK);\ntft.setRotation(3);\ntft.setTextDatum(MC_DATUM);\ntft.setTextPadding(320);\ntft.drawString(\"Wio Terminal Handwriting Recogniser!\", 160, 120);\ndelay(1000);\ntft.setTextSize(2);\ntft.fillScreen(TFT_BLACK);<\/code><\/pre>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>The modifications to our loop() function essentially involve changing all of our Serial.print() functions into tft.drawString() calls, so that the prompts will be displayed on our screen instead of through the serial monitor. For example:<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code>tft.fillScreen(TFT_BLACK);\ntft.drawString(F(\"Perform gesture in 3\"), 160, 120);\ndelay(1000);\ntft.drawString(F(\"Perform gesture in 3 2\"), 160, 120);\ndelay(1000);\ntft.drawString(F(\"Perform gesture in 3 2 1\"), 160, 120);\ndelay(1000);\ntft.drawString(F(\"Start!\"), 160, 120);<\/code><\/pre>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Now, instead of providing all the confidence values for all the possible outputs, we only want the values for the prediction with the highest possibility to be shown. Navigate down your code until you find the part that says \u201chuman-readable predictions\u201d. Then, modify your code to match the code below.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ human-readable predictions\nString output = \"Null\";\nfloat confidence = 0;\n    \nfor (size_t ix = 0; ix &lt; EI_CLASSIFIER_LABEL_COUNT; ix++) {\n    if (result.classification&#91;ix].value &gt; confidence) {\n        ei_printf(\"    %s: %.5f\\n\", result.classification&#91;ix].label, result.classification&#91;ix].value);\n        output = result.classification&#91;ix].label;\n        confidence = result.classification&#91;ix].value;\n    }\n}\n\ntft.drawString(output + \", \" + confidence, 160, 120);<\/code><\/pre>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>The Final Product<\/strong><\/h2>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>That\u2019s it! Now, we have a neural network built with Edge Impulse running on our Wio Terminal to give us on-the-fly recognition of handwriting gestures! Let\u2019s take a look again at the final product in operation.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"800\" height=\"450\" src=\"https:\/\/blog.seeedstudio.com\/wp-content\/uploads\/2021\/03\/Final-Demo-1.gif\" alt=\"\" class=\"wp-image-41116\"\/><\/figure><\/div>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Future Improvements for the Project<\/strong><\/h2>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>No doubt, this project is merely a proof of concept and has a long way to go before it&#8217;s a viable product. Still, it\u2019s impressive to see what can be done with just a single ToF sensor and machine learning! Here are some ways that this project can definitely be improved further.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">1.  <strong>Train the Model with More Data<\/strong><\/h3>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>If you\u2019ve made it to this step of the tutorial, you would know that even training just 3 classes (excluding Null) already takes quite a bit of gesturing. The unfortunate truth is that machine learning is all about data. In general, the more samples we give our model to train on, the better it will eventually perform.<\/p>\n\n\n\n<p>It\u2019s also important to introduce variations in our training data by changing the starting position of our gestures to be nearer or further away from the ToF sensor, gesturing with different speeds or even different handwriting styles. This will allow our model to be more robust and learn to recognise handwritten letters even if they\u2019re done in a variety of manners.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">2.  <strong>Use a ToF Sensor with Higher Performance<\/strong><\/h3>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>One major pain point I faced was the resolution of the data produced from the ToF sensor. Because I began facing errors at higher sample rates, I ended up with only 5 readings per second, which is suboptimal.<\/p>\n\n\n\n<p>Because of this, I was also limited to drawing big letters so that the motion features could be sufficiently captured in my samples. With a faster and more precise ToF sensor, it should in principle be possible to extract sufficient features even with normal-sized handwriting.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">3.  <strong>Use More or Other Sensors<\/strong><\/h3>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>While it\u2019s impressive to get this far with a single ToF sensor, it\u2019s also rather impractical to expect much more from it. If we were to train a model to recognise all 26 letters, there wouldn\u2019t be enough features to differentiate between at least a few of them. With a second ToF sensor, we\u2019d be able to take measurements for an additional axis, which will provide a much better distinction between different letters.<\/p>\n\n\n\n<p>ToF sensors in particular also have a rather tight \u201cfield of view\u201d, which makes it really easy to perform gestures in blind spots, resulting in incorrect classifications. Perhaps <a href=\"https:\/\/www.seeedstudio.com\/blog\/2019\/12\/23\/distance-sensors-types-and-selection-guide\/\">other types of ranging sensors<\/a> or even passive infrared (PIR) sensors may be more suitable for this application instead!<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Summary &amp; Some Closing Thoughts<\/strong><\/h2>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>I hope you\u2019ve enjoyed today&#8217;s tutorial on building a machine learning powered handwriting recognition device with your Wio Terminal! It\u2019s really exciting to think about the new possibilities that are enabled by machine learning &#8211; and now it\u2019s even more accessible thanks to platforms like Edge Impulse.<\/p>\n\n\n\n<p>Edge Impulse does assume that you have some knowledge of data analysis and machine learning, and as a result can be confusing for some. However, it is undoubtedly one of the most user-friendly experiences that I\u2019ve had the opportunity to use in my limited expertise with ML. I strongly encourage anyone interested in getting started with TinyML or even machine learning in general to play around with it!<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Once again, you can find the project code at <a href=\"https:\/\/github.com\/supperted825\/WioTerminal_HandwritingRecogniser\">this Github repository<\/a>. My Arduino library ZIP file generated from Edge Impulse is also available here if you want a straightforward way to try this project.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>For more TinyML projects with the Wio Terminal, please visit:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/www.seeedstudio.com\/blog\/2021\/01\/19\/tiny-ml-with-wio-terminal-1-intro\/\">Learn TinyML using Wio Terminal and Arduino IDE #1 Intro<\/a><\/li><li><a href=\"https:\/\/www.seeedstudio.com\/blog\/2021\/02\/03\/learn-tinyml-using-wio-terminal-and-arduino-ide-2-audio-scene-recognition-and-mobile-notifications\/\">Learn TinyML using Wio Terminal and Arduino IDE #2 Audio Scene Recognition and Mobile Notifications<\/a><\/li><li><a href=\"https:\/\/www.seeedstudio.com\/blog\/2021\/02\/23\/build-a-tinyml-smart-weather-station-with-wio-terminal\/\">Build a TinyML Smart Weather Station with Wio Terminal<\/a><\/li><\/ul>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>For other Wio Terminal projects, please visit:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/www.seeedstudio.com\/blog\/2021\/02\/04\/wio-terminal-arduino-customisable-timer-with-code\/\">Wio Terminal: Arduino Customisable Timer (with Code!)<\/a><\/li><li><a href=\"https:\/\/www.seeedstudio.com\/blog\/2021\/02\/08\/wio-terminal-arduino-smart-doorbell-with-code\/\">Wio Terminal: Arduino Smart Doorbell (with Code!)<\/a><\/li><li><a href=\"https:\/\/www.seeedstudio.com\/blog\/2021\/02\/19\/build-an-mqtt-intercom-with-wio-terminal-with-code\/\">Build an MQTT Intercom with Wio Terminal (with Code!)<\/a><\/li><\/ul>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>In today\u2019s tutorial, I\u2019ll show you how you can build a machine learning based handwriting<\/p>\n","protected":false},"author":3537,"featured_media":41124,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_lmt_disableupdate":"","_lmt_disable":"","_price":"","_stock":"","_tribe_ticket_header":"","_tribe_default_ticket_provider":"","_tribe_ticket_capacity":"0","_ticket_start_date":"","_ticket_end_date":"","_tribe_ticket_show_description":"","_tribe_ticket_show_not_going":false,"_tribe_ticket_use_global_stock":"","_tribe_ticket_global_stock_level":"","_global_stock_mode":"","_global_stock_cap":"","_tribe_rsvp_for_event":"","_tribe_ticket_going_count":"","_tribe_ticket_not_going_count":"","_tribe_tickets_list":"[]","_tribe_ticket_has_attendee_info_fields":false,"iawp_total_views":0,"footnotes":""},"categories":[1],"tags":[3172,1608,2336,3171,2626,3003,3678],"class_list":["post-41049","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news","tag-edge-impulse","tag-machine-learning","tag-ranging-sensor","tag-tinyml","tag-tof-sensor","tag-wio-terminal","tag-wio-terminal-project"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Build Handwriting Recognition with Wio Terminal &amp; Edge Impulse - Latest News from Seeed Studio<\/title>\n<meta name=\"description\" content=\"Is handwriting recognition possible with just one Time-of-Flight sensor? Read this step-by-step guide to do just that with the Wio Terminal &amp; Edge Impulse!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.seeedstudio.com\/blog\/2021\/03\/02\/handwriting-recognition-with-wio-terminal-edge-impulse\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Build Handwriting Recognition with Wio Terminal &amp; Edge Impulse - Latest News from Seeed Studio\" \/>\n<meta property=\"og:description\" content=\"Is handwriting recognition possible with just one Time-of-Flight sensor? Read this step-by-step guide to do just that with the Wio Terminal &amp; Edge Impulse!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.seeedstudio.com\/blog\/2021\/03\/02\/handwriting-recognition-with-wio-terminal-edge-impulse\/\" \/>\n<meta property=\"og:site_name\" content=\"Latest News from Seeed Studio\" \/>\n<meta property=\"article:published_time\" content=\"2021-03-02T10:43:28+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-03-02T10:43:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1500\" \/>\n\t<meta property=\"og:image:height\" content=\"875\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Jonathan Tan\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jonathan Tan\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.seeedstudio.com\/blog\/2021\/03\/02\/handwriting-recognition-with-wio-terminal-edge-impulse\/\",\"url\":\"https:\/\/www.seeedstudio.com\/blog\/2021\/03\/02\/handwriting-recognition-with-wio-terminal-edge-impulse\/\",\"name\":\"Build Handwriting Recognition with Wio Terminal & Edge Impulse - Latest News from Seeed Studio\",\"isPartOf\":{\"@id\":\"https:\/\/www.seeedstudio.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.seeedstudio.com\/blog\/2021\/03\/02\/handwriting-recognition-with-wio-terminal-edge-impulse\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.seeedstudio.com\/blog\/2021\/03\/02\/handwriting-recognition-with-wio-terminal-edge-impulse\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6.png\",\"datePublished\":\"2021-03-02T10:43:28+00:00\",\"dateModified\":\"2021-03-02T10:43:31+00:00\",\"author\":{\"@id\":\"https:\/\/www.seeedstudio.com\/blog\/#\/schema\/person\/61e29862da8741ee517eacd92f4cd094\"},\"description\":\"Is handwriting recognition possible with just one Time-of-Flight sensor? Read this step-by-step guide to do just that with the Wio Terminal & Edge Impulse!\",\"breadcrumb\":{\"@id\":\"https:\/\/www.seeedstudio.com\/blog\/2021\/03\/02\/handwriting-recognition-with-wio-terminal-edge-impulse\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.seeedstudio.com\/blog\/2021\/03\/02\/handwriting-recognition-with-wio-terminal-edge-impulse\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.seeedstudio.com\/blog\/2021\/03\/02\/handwriting-recognition-with-wio-terminal-edge-impulse\/#primaryimage\",\"url\":\"https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6.png\",\"contentUrl\":\"https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6.png\",\"width\":1500,\"height\":875},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.seeedstudio.com\/blog\/2021\/03\/02\/handwriting-recognition-with-wio-terminal-edge-impulse\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.seeedstudio.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Build Handwriting Recognition with Wio Terminal &#038; Edge Impulse\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.seeedstudio.com\/blog\/#website\",\"url\":\"https:\/\/www.seeedstudio.com\/blog\/\",\"name\":\"Latest News from Seeed Studio\",\"description\":\"Emerging IoT, AI and Autonomous Applications on the Edge\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.seeedstudio.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.seeedstudio.com\/blog\/#\/schema\/person\/61e29862da8741ee517eacd92f4cd094\",\"name\":\"Jonathan Tan\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.seeedstudio.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d8dd1a4a7882386e8818e110c9322897?s=96&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d8dd1a4a7882386e8818e110c9322897?s=96&r=g\",\"caption\":\"Jonathan Tan\"},\"url\":\"https:\/\/www.seeedstudio.com\/blog\/author\/jonathan-tan\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Build Handwriting Recognition with Wio Terminal & Edge Impulse - Latest News from Seeed Studio","description":"Is handwriting recognition possible with just one Time-of-Flight sensor? Read this step-by-step guide to do just that with the Wio Terminal & Edge Impulse!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.seeedstudio.com\/blog\/2021\/03\/02\/handwriting-recognition-with-wio-terminal-edge-impulse\/","og_locale":"en_US","og_type":"article","og_title":"Build Handwriting Recognition with Wio Terminal & Edge Impulse - Latest News from Seeed Studio","og_description":"Is handwriting recognition possible with just one Time-of-Flight sensor? Read this step-by-step guide to do just that with the Wio Terminal & Edge Impulse!","og_url":"https:\/\/www.seeedstudio.com\/blog\/2021\/03\/02\/handwriting-recognition-with-wio-terminal-edge-impulse\/","og_site_name":"Latest News from Seeed Studio","article_published_time":"2021-03-02T10:43:28+00:00","article_modified_time":"2021-03-02T10:43:31+00:00","og_image":[{"width":1500,"height":875,"url":"https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6.png","type":"image\/png"}],"author":"Jonathan Tan","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Jonathan Tan","Est. reading time":"20 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.seeedstudio.com\/blog\/2021\/03\/02\/handwriting-recognition-with-wio-terminal-edge-impulse\/","url":"https:\/\/www.seeedstudio.com\/blog\/2021\/03\/02\/handwriting-recognition-with-wio-terminal-edge-impulse\/","name":"Build Handwriting Recognition with Wio Terminal & Edge Impulse - Latest News from Seeed Studio","isPartOf":{"@id":"https:\/\/www.seeedstudio.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.seeedstudio.com\/blog\/2021\/03\/02\/handwriting-recognition-with-wio-terminal-edge-impulse\/#primaryimage"},"image":{"@id":"https:\/\/www.seeedstudio.com\/blog\/2021\/03\/02\/handwriting-recognition-with-wio-terminal-edge-impulse\/#primaryimage"},"thumbnailUrl":"https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6.png","datePublished":"2021-03-02T10:43:28+00:00","dateModified":"2021-03-02T10:43:31+00:00","author":{"@id":"https:\/\/www.seeedstudio.com\/blog\/#\/schema\/person\/61e29862da8741ee517eacd92f4cd094"},"description":"Is handwriting recognition possible with just one Time-of-Flight sensor? Read this step-by-step guide to do just that with the Wio Terminal & Edge Impulse!","breadcrumb":{"@id":"https:\/\/www.seeedstudio.com\/blog\/2021\/03\/02\/handwriting-recognition-with-wio-terminal-edge-impulse\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.seeedstudio.com\/blog\/2021\/03\/02\/handwriting-recognition-with-wio-terminal-edge-impulse\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.seeedstudio.com\/blog\/2021\/03\/02\/handwriting-recognition-with-wio-terminal-edge-impulse\/#primaryimage","url":"https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6.png","contentUrl":"https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6.png","width":1500,"height":875},{"@type":"BreadcrumbList","@id":"https:\/\/www.seeedstudio.com\/blog\/2021\/03\/02\/handwriting-recognition-with-wio-terminal-edge-impulse\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.seeedstudio.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Build Handwriting Recognition with Wio Terminal &#038; Edge Impulse"}]},{"@type":"WebSite","@id":"https:\/\/www.seeedstudio.com\/blog\/#website","url":"https:\/\/www.seeedstudio.com\/blog\/","name":"Latest News from Seeed Studio","description":"Emerging IoT, AI and Autonomous Applications on the Edge","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.seeedstudio.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.seeedstudio.com\/blog\/#\/schema\/person\/61e29862da8741ee517eacd92f4cd094","name":"Jonathan Tan","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.seeedstudio.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d8dd1a4a7882386e8818e110c9322897?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d8dd1a4a7882386e8818e110c9322897?s=96&r=g","caption":"Jonathan Tan"},"url":"https:\/\/www.seeedstudio.com\/blog\/author\/jonathan-tan\/"}]}},"modified_by":"Jonathan Tan","views":6822,"featured_image_urls":{"full":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6.png",1500,875,false],"thumbnail":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6-80x80.png",80,80,true],"medium":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6-300x175.png",300,175,true],"medium_large":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6-768x448.png",640,373,true],"large":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6-1030x601.png",640,373,true],"1536x1536":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6.png",1500,875,false],"2048x2048":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6.png",1500,875,false],"visody_icon":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6.png",32,19,false],"magazine-7-slider-full":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6.png",1500,875,false],"magazine-7-slider-center":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6-936x875.png",936,875,true],"magazine-7-featured":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6-1024x597.png",1024,597,true],"magazine-7-medium":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6-720x380.png",720,380,true],"magazine-7-medium-square":["https:\/\/www.seeedstudio.com\/blog\/wp-content\/uploads\/2021\/03\/Copy-of-Copy-of-Clean-6-675x450.png",675,450,true]},"author_info":{"display_name":"Jonathan Tan","author_link":"https:\/\/www.seeedstudio.com\/blog\/author\/jonathan-tan\/"},"category_info":"<a href=\"https:\/\/www.seeedstudio.com\/blog\/category\/news\/\" rel=\"category tag\">News<\/a>","tag_info":"News","comment_count":"0","_links":{"self":[{"href":"https:\/\/www.seeedstudio.com\/blog\/wp-json\/wp\/v2\/posts\/41049","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.seeedstudio.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.seeedstudio.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.seeedstudio.com\/blog\/wp-json\/wp\/v2\/users\/3537"}],"replies":[{"embeddable":true,"href":"https:\/\/www.seeedstudio.com\/blog\/wp-json\/wp\/v2\/comments?post=41049"}],"version-history":[{"count":23,"href":"https:\/\/www.seeedstudio.com\/blog\/wp-json\/wp\/v2\/posts\/41049\/revisions"}],"predecessor-version":[{"id":41134,"href":"https:\/\/www.seeedstudio.com\/blog\/wp-json\/wp\/v2\/posts\/41049\/revisions\/41134"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.seeedstudio.com\/blog\/wp-json\/wp\/v2\/media\/41124"}],"wp:attachment":[{"href":"https:\/\/www.seeedstudio.com\/blog\/wp-json\/wp\/v2\/media?parent=41049"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.seeedstudio.com\/blog\/wp-json\/wp\/v2\/categories?post=41049"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.seeedstudio.com\/blog\/wp-json\/wp\/v2\/tags?post=41049"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}