<![CDATA[Vimal Mollyn]]>vimalmollyn.com/vimalmollyn.com/favicon.pngVimal Mollynvimalmollyn.com/Ghost 5.22Thu, 21 Nov 2024 17:55:12 GMT60<![CDATA[WheelPoser: Sparse-IMU Based Body Pose Estimation for Wheelchair Users]]>Vimal Mollyn, Kuang Yuan, Patrick Carrington. ASSETS 2024.
Paper | Code | Video
Best Paper]]>
vimalmollyn.com/research/wheelposer/673a6675382443cb7913102cSun, 17 Nov 2024 22:10:07 GMT
Yunzhi Li, Vimal Mollyn, Kuang Yuan, Patrick Carrington
Paper | Code and Data | Video
WheelPoser: Sparse-IMU Based Body Pose Estimation for Wheelchair Users

Despite researchers having extensively studied various ways to track body pose on-the-go, most prior work does not take into account wheelchair users, leading to poor tracking performance. Wheelchair users could greatly benefit from this pose information to prevent injuries, monitor their health, identify environmental accessibility barriers, and interact with gaming and VR experiences. In this work, we present WheelPoser, a real-time pose estimation system specifically designed for wheelchair users. Our system uses only four strategically placed IMUs on the user’s body and wheelchair, making it far more practical than prior systems using cameras and dense IMU arrays. WheelPoser is able to track a wheelchair user’s pose with a mean joint angle error of 14.30° and a mean joint position error of 6.74 cm, more than three times better than similar systems using sparse IMUs. To train our system, we collect a novel WheelPoser-IMU dataset, consisting of 167 minutes of paired IMU sensor and motion capture data of people in wheelchairs, including wheelchair-specific motions such as propulsion and pressure relief. Finally, we explore the potential application space enabled by our system and discuss future opportunities.

Published at ASSETS 2024.

]]>
<![CDATA[EgoTouch: On-Body Touch Input Using AR/VR Headset Cameras]]>Vimal Mollyn, Chris Harrison. UIST 2024.
Paper | iOS App
People's Choice Best Demo]]>
vimalmollyn.com/research/egotouch/670d5d9b820ab7e3d38932adMon, 14 Oct 2024 18:14:16 GMT
Vimal Mollyn, Chris Harrison
Paper | Talk | Video Demo | iOS App Sign-Up
EgoTouch: On-Body Touch Input Using AR/VR Headset Cameras

In augmented and virtual reality (AR/VR) experiences, a user’s arms and hands can provide a convenient and tactile surface for touch input. Prior work has shown on-body input to have significant speed, accuracy, and ergonomic benefits over in-air interfaces, which are common today. In this work, we demonstrate high accuracy, bare hands (i.e., no special instrumentation of the user) skin input using just an RGB camera, like those already integrated into all modern XR headsets. Our results show this approach can be accurate, and robust across diverse lighting conditions, skin tones, and body motion (e.g., input while walking). Finally, our pipeline also provides rich input metadata including touch force, finger identification, angle of attack, and rotation. We believe these are the requisite technical ingredients to more fully unlock on-skin interfaces that have been well motivated in the HCI literature but have lacked robust and practical methods.

Published at UIST 2024.

]]>
<![CDATA[Vision-Based Hand Gesture Customization from a Single Demonstration]]>Vimal Mollyn, Cori Tymoszek Park, Richard Kang, Asaf Liberman, Oron Levy, Jun Gong, Abdelkareem Bedri, Gierad Laput. UIST 2024.
Paper | Video]]>
vimalmollyn.com/research/vision-based-hand-gesture-customization-from-a-single-demonstration/670d6143820ab7e3d38932d9Fri, 11 Oct 2024 18:32:00 GMT
Soroush Shahi, Vimal Mollyn, Cori Tymoszek Park, Richard Kang, Asaf Liberman, Oron Levy, Jun Gong, Abdelkareem Bedri, Gierad Laput
Paper | Video
Vision-Based Hand Gesture Customization from a Single Demonstration

Hand gesture recognition is becoming a more prevalent mode of human-computer interaction, especially as cameras proliferate across everyday devices. Despite continued progress in this field, gesture customization is often underexplored. Customization is crucial since it enables users to define and demonstrate gestures that are more natural, memorable, and accessible. However, customization requires efficient usage of user-provided data. We introduce a method that enables users to easily design bespoke gestures with a monocular camera from one demonstration. We employ transformers and meta-learning techniques to address few-shot learning challenges. Unlike prior work, our method supports any combination of one-handed, two-handed, static, and dynamic gestures, including different viewpoints, and the ability to handle irrelevant hand movements. We implement three real-world applications using our customization method, conduct a user study, and achieve up to 94% average recognition accuracy from one demonstration. Our work provides a viable path for vision-based gesture customization, laying the foundation for future advancements in this domain.

Published at UIST 2024.

]]>
<![CDATA[WorldPoint: Finger Pointing as a Rapid and Natural Trigger for In-The-Wild Mobile Interactions]]>Vimal Mollyn, Chris Harrison. ISS 2023.
Paper | Video ]]>
vimalmollyn.com/research/worldpoint/653db9ee3c9cd8621b7e4838Sun, 29 Oct 2023 02:08:00 GMT
Daehwa Kim, Vimal Mollyn, Chris Harrison
Video
WorldPoint: Finger Pointing as a Rapid and Natural Trigger for In-The-Wild Mobile Interactions

Pointing with one’s finger is a natural and rapid way to denote an area or object of interest. It is routinely used in human-human interaction to increase both the speed and accuracy of communication, but it is rarely utilized in human-computer interactions. In this work, we show how the recent advent of wide-angle, rear-facing smartphone cameras, along with hardware-accelerated machine learning, opens the door to real-time, infrastructure-free, finger-pointing interactions on today’s mobile phones. We envision users raising their hands to point in front of their phones as a “wake gesture”. This can then be coupled with a voice command to trigger advanced functionality. For example, while composing an email, a user can point at a document on a table and say “attach”. Our interaction technique requires no navigation away from the current app and is both faster and more privacy-preserving than the current method of taking a photo.

Published at ACM Conference on Interactive Surfaces and Spaces (ISS ’23).

]]>
<![CDATA[SmartPoser: Arm Pose Estimation with a Smartphone and Smartwatch Using UWB and IMU Data]]>Vimal Mollyn*, Chris Harrison. UIST 2023.
Paper | Video]]>
vimalmollyn.com/research/smartposer/653dbe5f3c9cd8621b7e4864Sat, 28 Oct 2023 02:29:00 GMT
Nathan DeVrio*, Vimal Mollyn*, Chris Harrison
Paper | Video
SmartPoser: Arm Pose Estimation with a Smartphone and Smartwatch Using UWB and IMU Data

The ability to track a user’s arm pose could be valuable in a wide range of applications, including fitness, rehabilitation, augmented reality input, life logging, and context-aware assistants. Unfortunately, this capability is not readily available to consumers. Systems either require cameras, which carry privacy issues, or utilize multiple worn IMUs or markers. In this work, we describe how an off-the-shelf smartphone and smartwatch can work together to accurately estimate arm pose. Moving beyond prior work, we take advantage of more recent ultra-wideband (UWB) functionality on these devices to capture absolute distance between the two devices. This measurement is the perfect complement to inertial data, which is relative and suffers from drift. We quantify the performance of our software-only approach using off-the-shelf devices, showing it can estimate the wrist and elbow joints with a median positional error of 11.0 cm, without the user having to provide training data.

Published at UIST 2023.

]]>
<![CDATA[IMUPoser: Full-Body Pose Estimation using IMUs in Phones, Watches, and Earbuds]]>Vimal Mollyn, Riku Arakawa, Mayank Goel, Chris Harrison, Karan Ahuja. CHI 2023.
Paper | Code
Best Paper Honorable Mention ]]>
vimalmollyn.com/research/imuposer/63f657474c70423206b3823eWed, 22 Feb 2023 18:11:00 GMT
Vimal Mollyn, Riku Arakawa, Mayank Goel, Chris Harrison, Karan Ahuja
Paper | Code | Video
IMUPoser: Full-Body Pose Estimation using IMUs in Phones, Watches, and Earbuds

Tracking body pose on-the-go could have powerful uses in fitness, mobile gaming, context-aware virtual assistants, and rehabilitation. However, users are unlikely to buy and wear special suits or sensor arrays to achieve this end. Instead, in this work, we explore the feasibility of estimating body pose using IMUs already in devices that many users own — namely smartphones, smartwatches, and earbuds. This approach has several challenges, including noisy data from low-cost commodity IMUs, and the fact that the number of instrumentation points on a user’s body is both sparse and in flux. Our pipeline receives whatever subset of IMU data is available, potentially from just a single device, and produces a best-guess pose.

Published at ACM CHI Conference on Human Factors in Computing Systems (CHI 2023)

]]>
<![CDATA[Hosting Ghost websites for free]]>vimalmollyn.com/workflow/this-website/636a6dd14cec59946a643419Thu, 10 Nov 2022 16:24:40 GMTMostly personal notes on building and maintaining this website.

TLDR

I use ghost as the backend cms to manage all my posts. I have a custom script that converts my website into a static website that can be hosted for free using github pages.

Setup

Setting up ghost is super simple, I use ghost-cli. Install instructions are here. Create a new directory for your website (mkdir my_website), and run ghost install local inside it — that should allow you to view a locally hosted website.

Building the static website

Download the make_website function from here and place it inside your fish functions folder (.config/fish/functions/make_website.fish). Then go to the parent directory of your website and run the following.

$ make_website <http://localhost:2369> vimalmollyn.github.io vimal-mollyn.com

This should make a new folder in the parent directory called vimalmollyn.github.io which you can push to github.

Modifying themes

Navigate to my_website/content/themes/<theme-name> and run npm run dev inside it. That should allow you to modify the theme and see changes live. Otherwise, you’d have to restart ghost each time you made a change to the theme to notice the change.

Modifying routes

Follow tips from https://ghost.org/docs/themes/routing/#tips and upload the latest routes.yaml to the website.

]]>
<![CDATA[PrISM-Tracker: A Framework for Multimodal Procedure Tracking Using Wearable Sensors and State Transition Information with User-Driven Handling of Errors and Uncertainty]]>Vimal Mollyn, Suzanne Nie, Emma Russell, Dustin P. Dimeo, Haarika A. Reddy, Alexander K. Maytin, Bryan T. Carroll, Jill Fain Lehman, Mayank Goel. Ubicomp/IMWUT 2023.
Paper]]>
vimalmollyn.com/research/prism-tracker/635ff0870ad851831f3a2b9fMon, 31 Oct 2022 16:06:29 GMT
Riku Arakawa, Hiromu Yakura, Vimal Mollyn, Suzanne Nie, Emma Russell, Dustin P. Dimeo, Haarika A. Reddy, Alexander K. Maytin, Bryan T. Carroll, Jill Fain Lehman, Mayank Goel
Paper | Code | Video
PrISM-Tracker: A Framework for Multimodal Procedure Tracking
Using Wearable Sensors and State Transition Information with
User-Driven Handling of Errors and Uncertainty

A user often needs training and guidance while performing several daily life procedures, e.g., cooking, setting up a new appliance, or doing a COVID test. Watch-based human activity recognition (HAR) can track users' actions during these procedures. However, out of the box, state-of-the-art HAR struggles from noisy data and less-expressive actions that are often part of daily life tasks. This paper proposes PrISM-Tracker, a procedure-tracking framework that augments existing HAR models with (1) graph-based procedure representation and (2) a user-interaction module to handle model uncertainty. Specifically, PrISM-Tracker extends a Viterbi algorithm to update state probabilities based on time-series HAR outputs by leveraging the graph representation that embeds time information as prior. Moreover, the model identifies moments or classes of uncertainty and asks the user for guidance to improve tracking accuracy. We tested PrISM-Tracker in two procedures: latte-making in an engineering lab study and wound care for skin cancer patients at a clinic. The results showed the effectiveness of the proposed algorithm utilizing transition graphs in tracking steps and the efficacy of using simulated human input to enhance performance. This work is the first step toward human-in-the-loop intelligent systems for guiding users while performing new and complicated procedural tasks.

Published at Ubicomp/IMWUT 2023.

]]>
<![CDATA[SAMoSA: Sensing Activities with Motion and Subsampled Audio]]>Vimal Mollyn, Karan Ahuja, Dhruv Verma, Chris Harrison, Mayank Goel. Ubicomp/IMWUT 2022.
Paper | Code | Video]]>
vimalmollyn.com/research/samosa/63031a1456aa9c4ebe39b8c4Mon, 22 Aug 2022 06:10:09 GMT
Vimal Mollyn, Karan Ahuja, Dhruv Verma, Chris Harrison, Mayank Goel
Paper | Code | Video

SAMoSA: Sensing Activities with Motion and Subsampled Audio

Human activity recognition (HAR) has numerous applications, including real-time task assistance, automated exercise tracking, rehabilitation, and personal informatics. Over the years, researchers have explored numerous modalities to sense a user’s actions, and sound has proven to be a useful signal. Sounds resulting from physical activities, such as washing one’s hands or brushing one’s teeth, are often distinctive and enable accurate HAR. However, sampling audio at rates between 8 and 16 kHz carries a power consumption and compute cost. Moreover, these audio ranges capture human speech content and other sensitive information that users might not want to have recorded.

In a bid to protect user privacy, researchers have proposed to featurize recorded data. If done at the edge, featurization is considered privacy-sensitive, but it comes with considerable processing cost. Furthermore, an always-on acoustic activity recognition system increases the power burden; especially on resource-constrained devices such as smartwatches, where the battery cannot be made much larger. In response, we present SAMoSA - Sensing Activities with Motion and Subsampled Audio. Our approach first uses power- and compute-optimized IMUs sampled at 50 Hz to act as a trigger for detecting the start of activities of interest. IMUs are ubiquitous, are heavily engineered for efficiency, and numerous prior works have shown the effectiveness of IMU data to detect user activities. Once we detect the start of an activity using an IMU, we use a multimodal model that combines motion and audio data for classifying the activity. To further minimize the computation cost of processing audio data, we reduce the sampling rates to ≤ 1 kHz. Subsampling can be implemented directly and easily at the hardware level; i.e., instead of post-processing fast-sampled audio data (e.g., 44 kHz), the sensor is directly sampled at a reduced rate. This approach saves power needed to sample, move/store in memory, and featurize the data. Our approach was partially inspired by the always-on "Measure Sounds" (loudness) feature found on recent Apple Watch models. This software-based sensor relies on the microphone, but presumably senses at a very low rate so as to have minimal impact on battery life. At these lower rates, human speech is also unintelligible, thus offering a more privacy-sensitive approach.

We show in our evaluation that motion and sound signals are complementary and provide wide coverage of numerous activities of daily living. A similar approach (albeit without subsampled audio) is reportedly used in Apple Watch’s handwashing recognition implementation, but there is no official documentation of the approach and its implementation. SAMoSA provides a generic, open-source approach that extends to 25 additional activities. Overall, this paper makes the following contributions:

  1. A practical activity recognition system that uses 50 Hz IMU along with audio sampled at ≤ 1 kHz, and yet still achieves performance comparable to models using more power-hungry and privacy-invasive 16 kHz audio data.
  2. A comprehensive suite of experiments, quantifying the efficacy of our system across 8 audio sampling rates, 4 contexts, 60 environments, and 26 activity classes. We also present a power consumption and a speech intelligibility study for different audio sampling rates.
  3. A new smartwatch sensor dataset with synchronized motion and sound data. We further showcase how our multimodal model resolves ambiguity among activities that are confused by a single modality alone.
  4. Open-sourced data, processing pipeline, and trained models to facilitate replication and further exploration and deployment in the field.
Presentation at Ubicomp 2022

Citation:

Vimal Mollyn, Karan Ahuja, Dhruv Verma, Chris Harrison, and Mayank Goel. 2022. SAMoSA: Sensing Activities with Motion and Subsampled Audio. Proc. ACM Interact. Mob. Wearable Ubiquitous Technol. 6, 3, Article 132 (September 2022), 19 pages. https://doi.org/10.1145/3550284

]]>
<![CDATA[Setting up NeoVim]]>vimalmollyn.com/workflow/setting-up-neovim/62106ca69c62562d990b935aSat, 19 Feb 2022 04:23:46 GMT

Personal notes for me to remember how to set up neovim on a new remote machine.

First, Download the NeoVim AppImage.

curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim.appimage
chmod u+x nvim.appimage
./nvim.appimage

Next, we need to make nvim globally accessible - either make a symlink or move the app image to /usr/bin/nvim

sudo mv nvim.appimage /usr/bin/nvim

Then, clone my latest config from GitHub to the nvim config folder

git clone https://github.com/VimalMollyn/NeoVim.git ~/.config/nvim

Make sure you have a relatively new version of node installed (I use node v17). Navigate to the plugins file and open it up in nvim. Plugins will start installing automagically!

nvim ~/home/.config/nvim/lua/user/plugins.lua

Enjoy!

]]>
<![CDATA[SSHFS rules!]]>vimalmollyn.com/workflow/sshfs-rules/61d2af1f2d8ed103c95c6d03Mon, 03 Jan 2022 08:25:32 GMTI often find myself having to transfer files between a remote server and my laptop. Just use scp or Transmit right? Wrong. Use sshfs and mount a remote drive locally!

Installation

💡 If you’re on an Apple Silicon Mac view my M1 Mac install instructions here.

Download and install macFUSE and sshfs from https://osxfuse.github.io/

Use

Create a mount point. A mount point is just a folder that will be used to mount your remote drive. Make sure it’s empty and remember it’s path.

mkdir -p ~/mnt/remote_drive

Use sshfs to mount your drive to this mount point.

sshfs -o allow_other user@ipadress:path/to/remote/drive ~/mnt/remote_drive

You will then be asked to enter your credentials (if you haven’t set up ssh keys)

You should now see your remote directory’s files in ~/mnt/remote_drive. Yay!

When you’re done, make sure to unmount the drive.

umount ~/mnt/remote_drive

Enjoy!

]]>
<![CDATA[M1 Mac Setup]]>vimalmollyn.com/workflow/m1-mac-setup/61d2af842d8ed103c95c6d0dMon, 03 Jan 2022 08:16:42 GMTA random collection of resources to set up an Apple Silicon Mac. Last updated - Feb 22nd 2022

Does it Arm?

An awesome website that let's you check if something works natively on apple silicon macs. Find it here: Does It ARM

Python + ML tools

M1 loves conda, stick to that whenever possible.  

First, install homebrew in case you haven't yet

## Install xcode command line tools
xcode-select --install

## install homebrew
/bin/bash -c "$(curl -fsSL <https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh>)"

Next, install conda through miniforge - this is a very important step! Don't install anaconda or miniconda any other way (Last checked Feb 22nd 2022)

## install miniforge
brew install --cask miniforge

## create a new conda env
conda create --name "first_env" python=3.8

## activate env and check
conda activate first_env
python -V ## should show 3.8 (default on macos is 3.9)

## make sure to install everything through conda if possible!
## some packages are broken on pip (like numpy!)
## incase you can't find a package on conda, use pip as follows

$(env_name) python -m pip install package_name

Increase the speed of key repeats

defaults write -g InitialKeyRepeat -int 10
defaults write -g KeyRepeat -int 1

Installing Tensorflow

(tested on MacOS BigSur 11.2)

# create a conda environment 
conda create -n "tf_m1" python=3.8.10

# activate the environment 
conda activate tf_m1

# install required packages
conda install numpy
conda install scipy
conda install -c apple tensorflow-deps==2.5.0
python -m pip install tensorflow-macos==2.5.0

# this install is optional, but definitely helps
python -m pip install tensorflow-metal

Install SSHFS

https://www.reddit.com/r/macapps/comments/lea865/how_to_install_sshfs_on_big_sur/

NodeJS

Installing nodejs on macOS Apple Silicon (M1)

Random

  • Force the Spotify desktop client to use less storage - append storage.size=1024 to the ~/Library/Application Support/Spotify/prefs file. 1024 is the max size in MB. src
]]>
<![CDATA[Creating custom python packages for your projects]]>vimalmollyn.com/workflow/creating-custom-python-packages-for-your-projects/61d2ae3d2d8ed103c95c6cf7Mon, 03 Jan 2022 08:06:34 GMTOne of the best things I learnt from reading the amazing Good research code handbook, was the power of creating custom python packages for your projects. I had always known how to create packages in python, but never found a nice way to integrate it with my mostly jupyter based workflow. If you’ve been searching for this as well, buckle up!

Step 1 - Create a project env

In conda, you do this as follows:

# feel free to change the env_name and python version
$ conda create --name "demo_env" python=3.8 
$ conda activate demo_env

Step 2 - Create a custom package

My usual project code structure is as shown. The folder that we’re interested in is the src folder. This is where our custom package resides. We can name our package whatever we want; in this case I’ve called it demo_package . The package must contain an __init__.py file along with the modules of the package.

.
|-- data
|-- notebooks
|-- README.md
|-- results
|-- scripts
|-- src
    |-- setup.py
    |-- demo_package
        |-- __init__.py
        |-- module1.py
        |-- module2.py
        |-- module3.py

Next, let’s take a look at the setup.py file. My version usually looks something like this:

from setuptools import find_packages, setup

setup(
    name='demo_package',
    packages=find_packages(),
)

Step 3 - Installing the package

The next step is to install the package. We can do this as follows:

(demo_env) $ **~/demo_project/src** python -m pip install -e .

Remember to activate the demo_env before installing it. Ensure that you run this command from inside the src folder, where setup.py is located.

Notes for the curious

python -m pip ensures that you’re using the right pip that is referenced in your virtual environment.

The -e flag is used in order to not have to update the package each time you update it - What an amazing feature!

Step 4 - Integrating with Jupyter

Now for the fun part, making this work with jupyter notebooks. Whenever you normally use a custom package and you update it, you have to restart the jupyter kernel in order for the package to be updated in the kernel. It looks like the jupyter dev team were was also frustrated by this and created a magic command just to solve this: the autoreload command. Here’s how you use it:

%load_ext autoreload
%autoreload 2

Just make sure to put this at the start of each jupyter notebook that you use. That’s it! Start using your custom package as you would any other! It’s that simple! :D

]]>
<![CDATA[SparseIMU: Computational Design of Sparse IMU Layouts for Sensing Fine-Grained Finger Microgestures]]>Vimal Mollyn, Aditya S. Nittala, Michael A. Hedderich, Marion Koelle, Thomas Seel, Jürgen Steimle. TOCHI 2022.
Paper]]>
vimalmollyn.com/research/sparseimu/61aad6b7c210c95c176a1ca4Sat, 04 Dec 2021 03:02:12 GMT
Adwait Sharma, Christina Salchow-Hömmen, Vimal Mollyn, Aditya S. Nittala, Michael A. Hedderich, Marion Koelle, Thomas Seel, Jürgen Steimle
SparseIMU: Computational Design of Sparse IMU Layouts for Sensing Fine-Grained Finger Microgestures

TOCHI '22.

Paper

This was work done with Dr. Jürgen Steimle and Adwait Sharma from Saarland University, during my research internship from May 2020 to June 2021


Microgestural interactions enable always-available input both while grasping everyday objects and with free-hands. To sense such gestures, minimal instrumentation of the hands is desirable. However, the choice of an effective but minimal IMU layout is challenging, due to the complex, multi-factorial space of finger gestures, grasps and objects. We propose SparseIMU, a rapid method for designing minimal inertial sensor-based layouts for effective gesture recognition. Furthermore, we contribute a Computational Tool to guide designers with optimal sensor placement. Our approach builds on an extensive Microgesture Dataset that we collected with a dense network of 17 inertial measurement units (IMUs). We performed a series of analyses, including an evaluation of the entire combinatorial space for Freehand and Grasping microgestures (393K layouts), and quantified the performance across different layout choices, revealing new gesture detection opportunities with IMUs. Finally, we demonstrate the versatility of our method with four scenarios.

Citation:

Adwait Sharma, Christina Salchow-Hömmen, Vimal Suresh Mollyn, Aditya Shekhar Nittala, Michael A. Hedderich, Marion Koelle, Thomas Seel, and Jürgen Steimle. 2022. SparseIMU: Computational Design of Sparse IMU Layouts for Sensing Fine-Grained Finger Microgestures. ACM Trans. Comput.-Hum. Interact. Just Accepted (October 2022). https://doi.org/10.1145/3569894

]]>
<![CDATA[I'm presenting a lightning talk at UIST 2021!]]>vimalmollyn.com/news/blog-im-looking-for-phd-positions-starting-fall-22/6155329b2db3000d4b6c5e60Wed, 06 Oct 2021 03:45:00 GMT

In September, I was presented with the opportunity to introduce myself to the HCI community at UIST. After filling out a form, submitting an abstract and a couple of emails, I'm super excited to present my Lighting Talk at UIST this year! Come say hi! :D

-- Update Nov 2021: Here's a link to the recorded talk! Shoot me an email if you share similar research interests!

]]>