EMG from Combination Gestures following Visual Prompts
<p>Dataset of surface EMG recordings from 10 subjects performing single and combination gestures, from Fast and Expressive Gesture Recognition using a Combination-Homomorphic Electromyogram Encoder.</p> <p>Each subject contributes 1224 gesture examples (584 single gestures and 640 combination gestures).</p> <p>For more details and example usage, see the following:</p> <ul> <li>Paper pdf - <a href="https://arxiv.org/pdf/2311.14675.pdf">https://arxiv.org/pdf/2311.14675.pdf</a></li> <li>Experiment code - <a href="https://github.com/nik-sm/com-hom-emg">https://github.com/nik-sm/com-hom-emg</a></li> </ul> <h2>Contents</h2> <p>Dataset of single and combination gestures from 10 subjects. Each subject contributes 1224 gesture examples (584 single gestures and 640 combination gestures).</p> <h2>Data</h2> <p>Each gesture trial consists of 500 ms of activity from 8 recording electrodes around the mid forearm.</p> <p>Recording was performed at 1926 Hz with built-in 20–450 Hz bandpass filtering applied.</p> <h3>Data Collection Details</h3> <p>In each gesture trial, subjects began from a neutral position, with the arm on an armrest. Subjects followed visual cues to perform either a direction gesture, a modifier gesture, or both. The timing structure and number of gestures obtained from each visual prompt varied across experimental blocks.</p> <p>Data for a single gesture trial come from the central 500ms when that gesture is being performed (the window is centered to be as far from gesture onset and gesture end as possible).</p> <p>See the paper for more details.</p> <h2>Labels</h2> <p>Each gesture trial in the dataset has a two-part label, describing which gesture was performed.</p> <p>The first label component describes the direction gesture, and takes values in {0, 1, 2, 3, 4}, with the following meaning:</p> <ul> <li>0 - "Up" (wrist extension)</li> <li>1 - "Down" (wrist flexion)</li> <li>2 - "Left" (wrist abduction; movement towards thumb side)</li> <li>3 - "Right" (wrist adduction; movement towards pinky side)</li> <li>4 - "NoDirection" (absence of a direction gesture; none of the above)</li> </ul> <p>The second label component describes the modifier gesture, and takes values in {0, 1, 2, 3, 4}, with the following meaning:</p> <ul> <li>0 - "Pinch" (connecting thumb and index finger)</li> <li>1 - "Thumb" (touching thumb to first knuckle of index finger)</li> <li>2 - "Fist" (all fingers curled)</li> <li>3 - "Open" (all fingers extended)</li> <li>4 - "NoModifier" (absence of a modifier gesture; none of the above)</li> </ul> <p>Each subject provided 1224 total examples, consisting of:</p> <ul> <li>- 584 single gesture examples. (584 = 73 examples, for each of the 4+4 possible single gesture classes)</li> <li>- 640 combination gesture examples. (640 = 40 examples, for each of the 4x4 possible combination gesture classes)<br> </li> </ul> <h3>Examples of Label Structure</h3> <p>Single gestures have labels like (0, 4) indicating ("Up", "NoModifier") or (4, 3) indicating ("NoDirection", "Open").</p> <p>Combination gesture have labels like (0, 0) indicating ("Up", "Pinch") or (2, 3) indicating ("Left", "Open").</p> <h2>Loading data</h2> <p>After downloading and unzipping, the examples below can be used to load data in Python or MATLAB.</p> <p>Data have shape `(items, channels, timesteps)`.</p> <p>Labels have shape `(items, 2)`, where the first coordinate is the direction and the second coordinate is the modifier.<br> </p> <h3>Python example</h3> <blockquote> <p><em># Load data</em></p> <p>import numpy as np</p> <p>from pathlib import Path</p> <p> </p> <p>folder = Path("path/to/combination-gesture-dataset/python")<br> </p> <p>all_data, all_labels = [], []</p> <p>for i in range(10):</p> <p> data = np.load(f"{folder}/subj{i}/data.npy")</p> <p> labels = np.load(f"{folder}/subj{i}/labels.npy")</p> <p> all_data.append(data)</p> <p> all_labels.append(labels)</p> <p>all_data = np.concatenate(all_data, axis=0)</p> <p>all_labels = np.concatenate(all_labels, axis=0)</p> <p> </p> <p>print(all_data.shape) <em># (12240, 8, 962)</em></p> <p>print(all_labels.shape) <em># (12240, 2)</em></p> <p> </p> <p><em># Convert numeric labels to text</em></p> <p>def convert_label(label):</p> <p> directions = ["Up", "Down", "Left", "Right", "NoDirection"]</p> <p> modifiers = ["Pinch", "Thumb", "Fist", "Open", "NoModifier"]</p> <p> return directions[label[0]], modifiers[label[1]]</p> <p> </p> <p>print(convert_label(all_labels[0])) <em># ('NoDirection', 'Fist')</em></p> </blockquote> <p> </p> <h3>MATLAB example</h3> <blockquote> <p>% Load data</p> <p>folder = "path/to/combination-gesture-dataset/matlab";<br> </p> <p>all_data = [];</p> <p>all_labels = [];</p> <p>for i = 0:9</p> <p> data = load(sprintf("%s/subj%d/data.mat", folder, i));</p> <p> labels = load(sprintf("%s/subj%d/labels.mat", folder, i));</p> <p> all_data = [all_data; data.contents];</p> <p> all_labels = [all_labels; labels.contents];</p> <p>end</p> <p> </p> <p>% (Optional) convert labels from 0-indexed to 1-indexed, for easier conversion to text</p> <p>all_labels = all_labels + 1;</p> <p> </p> <p>size(all_data) % (12240, 8, 962)</p> <p>size(all_labels) % (12240, 2)<br> </p> <p>% Convert numeric labels to text</p> <p>directions = ["Up", "Down", "Left", "Right", "NoDirection"];</p> <p>modifiers = ["Pinch", "Thumb", "Fist", "Open", "NoModifier"];</p> <p>convert_label = @(label) [directions(label(1) + 1), modifiers(label(2) + 1)];</p> <p> </p> <p>convert_label(all_labels(1, :)) % "NoDirection" "Fist"</p> </blockquote>
ShareScore
40/100
Overall dataset sharing score
Score breakdown
These five areas show where the dataset supports — or may limit — practical reuse.
- Stewardship
- 4
- Harmonization
- 4
- Access
- 16
- Reuse readiness
- 8
- Engagement
- 8