{
  "id": 603592,
  "title": "6th Place Solution",
  "url": "/competitions/cmi-detect-behavior-with-sensor-data/discussion/603592",
  "author_name": "Jack (Japan)",
  "post_date": "2025-09-03T08:19:19.759000",
  "votes": 115,
  "comment_count": 26,
  "views": 0,
  "content": "<p>First of all, I would like to thank the competition hosts and all the participants for their efforts and contributions. It’s inspiring to see such creativity and dedication. I am also thrilled to have placed in the prize-winning range. Below, I would like to share an overview of my solution.</p>\n<hr>\n<h2>Brief Summary</h2>\n<p>The main points of my solution are as follows:</p>\n<ul>\n<li>Used a custom neural network with separate 1D-CNN branches, one for each sensor modality  </li>\n<li>Extracted the last 75 frames of each sequence as inputs to the NN  </li>\n<li>Estimated gesture segments with a simple U-Net and added them as additional inputs  </li>\n<li>Converted left-handed data to align with right-handed data  </li>\n<li>Identified subjects who wore devices upside down (rotated by 180° around the z-axis) and corrected their data  </li>\n<li>Trained two nearly identical NNs (differing only in input blocks) 50 times each on the full dataset with different random seeds, then averaged the outputs of all 100 NNs</li>\n<li>Did not apply any post-processing  </li>\n</ul>\n<p>Here are the cross-validation (CV) and leaderboard (LB) scores. Cross-validation was performed using 10-fold StratifiedGroupKFold.</p>\n<table>\n<thead>\n<tr>\n<th>Model</th>\n<th>CV or full-train</th>\n<th>Handle upside-down<br>devices in test</th>\n<th>CV<br>(single seed)</th>\n<th>CV<br>(5-seed average)</th>\n<th>Public LB</th>\n<th>Private LB</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>CV</td>\n<td>False</td>\n<td><strong>0.864</strong><br>(0.894, 0.834)</td>\n<td><strong>0.874</strong><br>(0.905, 0.843)</td>\n<td><strong>0.869</strong></td>\n<td><strong>0.860</strong></td>\n</tr>\n<tr>\n<td>2</td>\n<td>CV</td>\n<td>False</td>\n<td><strong>0.862</strong><br>(0.892, 0.833)</td>\n<td><strong>0.875</strong><br>(0.904, 0.846)</td>\n<td><strong>0.874</strong></td>\n<td><strong>0.856</strong></td>\n</tr>\n<tr>\n<td>1 + 2</td>\n<td>CV</td>\n<td>False</td>\n<td>-</td>\n<td><strong>0.877</strong><br>(0.906, 0.849)</td>\n<td><strong>0.873</strong></td>\n<td><strong>0.858</strong></td>\n</tr>\n<tr>\n<td>1 + 2</td>\n<td>full-train</td>\n<td>False</td>\n<td>-</td>\n<td>-</td>\n<td><strong>0.871</strong></td>\n<td><strong>0.860</strong></td>\n</tr>\n<tr>\n<td>1 + 2</td>\n<td>full-train</td>\n<td>True</td>\n<td>-</td>\n<td>-</td>\n<td><strong>0.871</strong></td>\n<td><strong>0.873</strong></td>\n</tr>\n</tbody>\n</table>\n<p>The notebook for model 1 in the table is linked below.  <br>\n<a href=\"https://www.kaggle.com/code/rsakata/cmi3-6th-place-solution-partial\" target=\"_blank\">https://www.kaggle.com/code/rsakata/cmi3-6th-place-solution-partial</a></p>\n<h2>Neural Network Architecture</h2>\n<p>Of the two gesture classification neural networks, the structure of one is shown below. The other differs only slightly in the input feature blocks.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F169364%2Ffa57a78dc1ae1a46d8ea8bc296dadd89%2Fnn_architecture.png?generation=1756890658946904&amp;alt=media\" alt=\"\"></p>\n<p>Each input feature block (shown on the left) is processed with 1D-CNN and MLP layers. It was important to perform the first convolution in each 1D-CNN block as a grouped convolution by channel.  </p>\n<p>Before the MLP layers, the 1D-CNN outputs are pooled along the time axis. Instead of simple global average pooling, pooling is done separately over the gesture and non-gesture segments, and the results are concatenated as the input to the MLP. To enable this, gesture segments were pre-estimated with a U-Net and added as inputs. (The U-Net structure was quite simple, with no special tricks, so I omit the details here.)</p>\n<p>The final prediction is obtained by combining the outputs from all blocks. Following the problem setup, the model produces predictions using both all inputs and IMU-only inputs. Additionally, separate predictions are generated for each block.  </p>\n<p>Cross-entropy loss is calculated for all predictions and used for backpropagation. The loss weights are: 1/4 each for the all-input and IMU-only predictions, and 1/12 for each of the six block-specific predictions.  </p>\n<p>In addition to predicting gestures (18 classes), the network also predicts orientation (4 classes), added as an auxiliary loss weighted at 0.5 relative to the gesture loss. Non-target gestures were not compressed; the model was trained as an 18-class classification task, since early experiments showed this performed slightly better.</p>\n<p>For inference on the test set, if more than 50% of TOF values were missing, the IMU-only prediction was used; otherwise, the all-input prediction was used.</p>\n<p>I will provide explanations for several feature blocks in the figure.</p>\n<h4>derived_acc</h4>\n<p>This block consists of the three components of linear_acc and the three components of global_acc. linear_acc is acceleration with gravity removed, calculated the same way as in many public notebooks. global_acc is acceleration expressed in the global (world) coordinate system; see the discussion in the link below.  <br>\n<a href=\"https://www.kaggle.com/competitions/cmi-detect-behavior-with-sensor-data/discussion/583080\" target=\"_blank\">https://www.kaggle.com/competitions/cmi-detect-behavior-with-sensor-data/discussion/583080</a></p>\n<h4>rotvec_diff</h4>\n<p>This is essentially equivalent to what was calculated as angular_vel in public notebooks. (The division by time is omitted since the values are later standardized.)</p>\n<h4>tof</h4>\n<p>Before temporal convolution, each of the five TOF sensors’ values was spatially convolved on an 8×8 grid. After three rounds of stride-2 max pooling, the spatial dimensions were fully collapsed, producing 32 channels per sensor (160 in total). The resulting feature maps were then processed with temporal convolution in the same way as the other blocks.</p>\n<hr>\n<h2>Preprocessing</h2>\n<h3>Handling Left-Handed Subjects</h3>\n<p>One of the most important preprocessing steps was handling left-handed subjects.</p>\n<p>For <strong>acc</strong> features, the fix was simple. Because these features are symmetric left–right, flipping the sign of the x component was enough to convert left-handed data into right-handed. This is clearly visible in the acc histograms below.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F169364%2Fc8ba809c708948dbe0c03dc96814915d%2Ffig_1.png?generation=1756887464315672&amp;alt=media\" alt=\"\"></p>\n<p>For <strong>rot</strong> features, things were more complicated, so I’ll start with <strong>rotvec_diff</strong>. Note that rotation around the x-axis is the same for both left- and right-handed subjects (like twisting a motorcycle throttle). In contrast, the y and z components had to be sign-flipped — a step that proved critical for improving accuracy for left-handed subjects.</p>\n<p>At first glance, it might seem that flipping y and z would also be enough for <strong>rot</strong> values. However, rotation around the z-axis depends on the subject’s facing direction (unless all subjects performed gestures facing true north). So I first canceled out the angle relative to true north, then flipped rot_y and rot_z. After aligning the left- and right-handed histograms, the subjects’ facing direction was estimated at roughly 130° from north (likely southwest).  <br>\nThe before-and-after histograms below confirm that the distributions matched after this transformation.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F169364%2Fb9ea168a8bceb3076406b03664ba0501%2Ffig_2.png?generation=1756887494143110&amp;alt=media\" alt=\"\"></p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F169364%2F7449c8933855943a0c6b2bd64a5e1571%2Ffig_3.png?generation=1756887515129665&amp;alt=media\" alt=\"\"></p>\n<p>However, this preprocessing is only possible because all subjects faced the same direction during data collection. For real-world use, models shouldn’t depend on absolute orientation, so excluding <strong>rot</strong> (and <strong>global_acc</strong>) values entirely might be a better approach.</p>\n<p>For sensor placement, I also mirrored some values: thm_3/tof_3 were swapped with thm_5/tof_5, and each TOF sensor’s v0–63 values were flipped left–right.</p>\n<p>These steps resulted in a gesture classification accuracy of about 85% for left-handed subjects with IMU+THM+TOF in CV.</p>\n<h3>Handling Upside-Down Devices</h3>\n<p>Another key finding was that two subjects wore the device rotated 180° around the z-axis — specifically, SUBJ_019262 and SUBJ_045235. The histograms below compare these subjects with the rest.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F169364%2F2d760f9bb78878b48aeb7022189b42b3%2Ffig_4.png?generation=1756887529722860&amp;alt=media\" alt=\"\"></p>\n<p>The fact that acc_x and acc_y distributions appeared flipped strongly suggests the devices were worn upside down. I corrected the sensor values as if the devices had been worn properly:</p>\n<ul>\n<li>For <strong>acc</strong>: flip the signs of x and y components  </li>\n<li>For <strong>rotvec_diff</strong>: flip the signs of x and y components (z returns to original after two flips)  </li>\n<li>For <strong>rot</strong>: add a 180° rotation around the z-axis, and flip the signs of x and y components  </li>\n<li>Swap thm_2 with thm_4, and tof_2 with tof_4  </li>\n<li>Swap thm_3 with thm_5, and tof_3 with tof_5  </li>\n<li>Rotate the v0–63 values of TOF sensors  </li>\n</ul>\n<p>These corrections not only drastically improved accuracy for the two affected subjects (accuracy exceeded 90% with IMU+THM+TOF in CV) but also gave a small boost to other subjects.</p>\n<p>To prepare for similar cases in the test set, I also trained a model to detect whether a sequence was recorded with a 180° device rotation. The model architecture was exactly the same as that of the gesture classification network, differing only in the number of output classes.</p>\n<p>Since this didn’t improve the Public Score, I wasn’t sure whether to include it. In the end, I added it to one of my final submissions but not the other. It turned out to make a big difference on the Private Score (+0.013), which significantly improved my Private Leaderboard rank.</p>\n<h3>Other Simple Preprocessing</h3>\n<p>Additionally, a few other simple preprocessing steps were applied:</p>\n<ul>\n<li>For <strong>thm</strong>: Values below 20 °C were treated as outliers and replaced with nulls (filled with 0 after standardization)  </li>\n<li>For <strong>tof</strong>: Values of –1 were replaced with 255  </li>\n</ul>\n<hr>\n<h2>Others</h2>\n<ul>\n<li>Optimizer: I used RAdamScheduleFree. In the final stage, I attempted to switch to AdamW and tune it, and although I was able to reach similar performance, it did not clearly surpass the previous results, so I continued using RAdamScheduleFree until the end.</li>\n<li>Data augmentation and mix-up: I could not get them to work effectively, so I did not adopt them.</li>\n<li>EMA: I also tried using EMA, which improved single CV results, but its effect disappeared when combined with seed averaging, so I ultimately decided not to use it.</li>\n</ul>\n<hr>\n<p>Thank you for reading!</p>",
  "messages": [
    {
      "id": 3280840,
      "postDate": "2025-09-03T08:19:19.760Z",
      "content": "<p>First of all, I would like to thank the competition hosts and all the participants for their efforts and contributions. It’s inspiring to see such creativity and dedication. I am also thrilled to have placed in the prize-winning range. Below, I would like to share an overview of my solution.</p>\n<hr>\n<h2>Brief Summary</h2>\n<p>The main points of my solution are as follows:</p>\n<ul>\n<li>Used a custom neural network with separate 1D-CNN branches, one for each sensor modality  </li>\n<li>Extracted the last 75 frames of each sequence as inputs to the NN  </li>\n<li>Estimated gesture segments with a simple U-Net and added them as additional inputs  </li>\n<li>Converted left-handed data to align with right-handed data  </li>\n<li>Identified subjects who wore devices upside down (rotated by 180° around the z-axis) and corrected their data  </li>\n<li>Trained two nearly identical NNs (differing only in input blocks) 50 times each on the full dataset with different random seeds, then averaged the outputs of all 100 NNs</li>\n<li>Did not apply any post-processing  </li>\n</ul>\n<p>Here are the cross-validation (CV) and leaderboard (LB) scores. Cross-validation was performed using 10-fold StratifiedGroupKFold.</p>\n<table>\n<thead>\n<tr>\n<th>Model</th>\n<th>CV or full-train</th>\n<th>Handle upside-down<br>devices in test</th>\n<th>CV<br>(single seed)</th>\n<th>CV<br>(5-seed average)</th>\n<th>Public LB</th>\n<th>Private LB</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>CV</td>\n<td>False</td>\n<td><strong>0.864</strong><br>(0.894, 0.834)</td>\n<td><strong>0.874</strong><br>(0.905, 0.843)</td>\n<td><strong>0.869</strong></td>\n<td><strong>0.860</strong></td>\n</tr>\n<tr>\n<td>2</td>\n<td>CV</td>\n<td>False</td>\n<td><strong>0.862</strong><br>(0.892, 0.833)</td>\n<td><strong>0.875</strong><br>(0.904, 0.846)</td>\n<td><strong>0.874</strong></td>\n<td><strong>0.856</strong></td>\n</tr>\n<tr>\n<td>1 + 2</td>\n<td>CV</td>\n<td>False</td>\n<td>-</td>\n<td><strong>0.877</strong><br>(0.906, 0.849)</td>\n<td><strong>0.873</strong></td>\n<td><strong>0.858</strong></td>\n</tr>\n<tr>\n<td>1 + 2</td>\n<td>full-train</td>\n<td>False</td>\n<td>-</td>\n<td>-</td>\n<td><strong>0.871</strong></td>\n<td><strong>0.860</strong></td>\n</tr>\n<tr>\n<td>1 + 2</td>\n<td>full-train</td>\n<td>True</td>\n<td>-</td>\n<td>-</td>\n<td><strong>0.871</strong></td>\n<td><strong>0.873</strong></td>\n</tr>\n</tbody>\n</table>\n<p>The notebook for model 1 in the table is linked below.  <br>\n<a href=\"https://www.kaggle.com/code/rsakata/cmi3-6th-place-solution-partial\" target=\"_blank\">https://www.kaggle.com/code/rsakata/cmi3-6th-place-solution-partial</a></p>\n<h2>Neural Network Architecture</h2>\n<p>Of the two gesture classification neural networks, the structure of one is shown below. The other differs only slightly in the input feature blocks.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F169364%2Ffa57a78dc1ae1a46d8ea8bc296dadd89%2Fnn_architecture.png?generation=1756890658946904&amp;alt=media\" alt=\"\"></p>\n<p>Each input feature block (shown on the left) is processed with 1D-CNN and MLP layers. It was important to perform the first convolution in each 1D-CNN block as a grouped convolution by channel.  </p>\n<p>Before the MLP layers, the 1D-CNN outputs are pooled along the time axis. Instead of simple global average pooling, pooling is done separately over the gesture and non-gesture segments, and the results are concatenated as the input to the MLP. To enable this, gesture segments were pre-estimated with a U-Net and added as inputs. (The U-Net structure was quite simple, with no special tricks, so I omit the details here.)</p>\n<p>The final prediction is obtained by combining the outputs from all blocks. Following the problem setup, the model produces predictions using both all inputs and IMU-only inputs. Additionally, separate predictions are generated for each block.  </p>\n<p>Cross-entropy loss is calculated for all predictions and used for backpropagation. The loss weights are: 1/4 each for the all-input and IMU-only predictions, and 1/12 for each of the six block-specific predictions.  </p>\n<p>In addition to predicting gestures (18 classes), the network also predicts orientation (4 classes), added as an auxiliary loss weighted at 0.5 relative to the gesture loss. Non-target gestures were not compressed; the model was trained as an 18-class classification task, since early experiments showed this performed slightly better.</p>\n<p>For inference on the test set, if more than 50% of TOF values were missing, the IMU-only prediction was used; otherwise, the all-input prediction was used.</p>\n<p>I will provide explanations for several feature blocks in the figure.</p>\n<h4>derived_acc</h4>\n<p>This block consists of the three components of linear_acc and the three components of global_acc. linear_acc is acceleration with gravity removed, calculated the same way as in many public notebooks. global_acc is acceleration expressed in the global (world) coordinate system; see the discussion in the link below.  <br>\n<a href=\"https://www.kaggle.com/competitions/cmi-detect-behavior-with-sensor-data/discussion/583080\" target=\"_blank\">https://www.kaggle.com/competitions/cmi-detect-behavior-with-sensor-data/discussion/583080</a></p>\n<h4>rotvec_diff</h4>\n<p>This is essentially equivalent to what was calculated as angular_vel in public notebooks. (The division by time is omitted since the values are later standardized.)</p>\n<h4>tof</h4>\n<p>Before temporal convolution, each of the five TOF sensors’ values was spatially convolved on an 8×8 grid. After three rounds of stride-2 max pooling, the spatial dimensions were fully collapsed, producing 32 channels per sensor (160 in total). The resulting feature maps were then processed with temporal convolution in the same way as the other blocks.</p>\n<hr>\n<h2>Preprocessing</h2>\n<h3>Handling Left-Handed Subjects</h3>\n<p>One of the most important preprocessing steps was handling left-handed subjects.</p>\n<p>For <strong>acc</strong> features, the fix was simple. Because these features are symmetric left–right, flipping the sign of the x component was enough to convert left-handed data into right-handed. This is clearly visible in the acc histograms below.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F169364%2Fc8ba809c708948dbe0c03dc96814915d%2Ffig_1.png?generation=1756887464315672&amp;alt=media\" alt=\"\"></p>\n<p>For <strong>rot</strong> features, things were more complicated, so I’ll start with <strong>rotvec_diff</strong>. Note that rotation around the x-axis is the same for both left- and right-handed subjects (like twisting a motorcycle throttle). In contrast, the y and z components had to be sign-flipped — a step that proved critical for improving accuracy for left-handed subjects.</p>\n<p>At first glance, it might seem that flipping y and z would also be enough for <strong>rot</strong> values. However, rotation around the z-axis depends on the subject’s facing direction (unless all subjects performed gestures facing true north). So I first canceled out the angle relative to true north, then flipped rot_y and rot_z. After aligning the left- and right-handed histograms, the subjects’ facing direction was estimated at roughly 130° from north (likely southwest).  <br>\nThe before-and-after histograms below confirm that the distributions matched after this transformation.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F169364%2Fb9ea168a8bceb3076406b03664ba0501%2Ffig_2.png?generation=1756887494143110&amp;alt=media\" alt=\"\"></p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F169364%2F7449c8933855943a0c6b2bd64a5e1571%2Ffig_3.png?generation=1756887515129665&amp;alt=media\" alt=\"\"></p>\n<p>However, this preprocessing is only possible because all subjects faced the same direction during data collection. For real-world use, models shouldn’t depend on absolute orientation, so excluding <strong>rot</strong> (and <strong>global_acc</strong>) values entirely might be a better approach.</p>\n<p>For sensor placement, I also mirrored some values: thm_3/tof_3 were swapped with thm_5/tof_5, and each TOF sensor’s v0–63 values were flipped left–right.</p>\n<p>These steps resulted in a gesture classification accuracy of about 85% for left-handed subjects with IMU+THM+TOF in CV.</p>\n<h3>Handling Upside-Down Devices</h3>\n<p>Another key finding was that two subjects wore the device rotated 180° around the z-axis — specifically, SUBJ_019262 and SUBJ_045235. The histograms below compare these subjects with the rest.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F169364%2F2d760f9bb78878b48aeb7022189b42b3%2Ffig_4.png?generation=1756887529722860&amp;alt=media\" alt=\"\"></p>\n<p>The fact that acc_x and acc_y distributions appeared flipped strongly suggests the devices were worn upside down. I corrected the sensor values as if the devices had been worn properly:</p>\n<ul>\n<li>For <strong>acc</strong>: flip the signs of x and y components  </li>\n<li>For <strong>rotvec_diff</strong>: flip the signs of x and y components (z returns to original after two flips)  </li>\n<li>For <strong>rot</strong>: add a 180° rotation around the z-axis, and flip the signs of x and y components  </li>\n<li>Swap thm_2 with thm_4, and tof_2 with tof_4  </li>\n<li>Swap thm_3 with thm_5, and tof_3 with tof_5  </li>\n<li>Rotate the v0–63 values of TOF sensors  </li>\n</ul>\n<p>These corrections not only drastically improved accuracy for the two affected subjects (accuracy exceeded 90% with IMU+THM+TOF in CV) but also gave a small boost to other subjects.</p>\n<p>To prepare for similar cases in the test set, I also trained a model to detect whether a sequence was recorded with a 180° device rotation. The model architecture was exactly the same as that of the gesture classification network, differing only in the number of output classes.</p>\n<p>Since this didn’t improve the Public Score, I wasn’t sure whether to include it. In the end, I added it to one of my final submissions but not the other. It turned out to make a big difference on the Private Score (+0.013), which significantly improved my Private Leaderboard rank.</p>\n<h3>Other Simple Preprocessing</h3>\n<p>Additionally, a few other simple preprocessing steps were applied:</p>\n<ul>\n<li>For <strong>thm</strong>: Values below 20 °C were treated as outliers and replaced with nulls (filled with 0 after standardization)  </li>\n<li>For <strong>tof</strong>: Values of –1 were replaced with 255  </li>\n</ul>\n<hr>\n<h2>Others</h2>\n<ul>\n<li>Optimizer: I used RAdamScheduleFree. In the final stage, I attempted to switch to AdamW and tune it, and although I was able to reach similar performance, it did not clearly surpass the previous results, so I continued using RAdamScheduleFree until the end.</li>\n<li>Data augmentation and mix-up: I could not get them to work effectively, so I did not adopt them.</li>\n<li>EMA: I also tried using EMA, which improved single CV results, but its effect disappeared when combined with seed averaging, so I ultimately decided not to use it.</li>\n</ul>\n<hr>\n<p>Thank you for reading!</p>",
      "rawMarkdown": "First of all, I would like to thank the competition hosts and all the participants for their efforts and contributions. It’s inspiring to see such creativity and dedication. I am also thrilled to have placed in the prize-winning range. Below, I would like to share an overview of my solution.\n\n---\n\n## Brief Summary\n\nThe main points of my solution are as follows:\n- Used a custom neural network with separate 1D-CNN branches, one for each sensor modality  \n- Extracted the last 75 frames of each sequence as inputs to the NN  \n- Estimated gesture segments with a simple U-Net and added them as additional inputs  \n- Converted left-handed data to align with right-handed data  \n- Identified subjects who wore devices upside down (rotated by 180° around the z-axis) and corrected their data  \n- Trained two nearly identical NNs (differing only in input blocks) 50 times each on the full dataset with different random seeds, then averaged the outputs of all 100 NNs\n- Did not apply any post-processing  \n\nHere are the cross-validation (CV) and leaderboard (LB) scores. Cross-validation was performed using 10-fold StratifiedGroupKFold.\n\n| Model | CV or full-train | Handle upside-down<br>devices in test | CV<br>(single seed) | CV<br>(5-seed average) | Public LB | Private LB |\n| --- | --- | --- | --- | --- | --- | --- |\n| 1 | CV | False | **0.864**<br>(0.894, 0.834) | **0.874**<br>(0.905, 0.843) | **0.869** | **0.860** |\n| 2 | CV | False | **0.862**<br>(0.892, 0.833) | **0.875**<br>(0.904, 0.846) | **0.874** | **0.856** |\n| 1 + 2 | CV | False | - | **0.877**<br>(0.906, 0.849) | **0.873** | **0.858** |\n| 1 + 2 | full-train | False | - | - | **0.871** | **0.860** |\n| 1 + 2 | full-train | True | - | - | **0.871** | **0.873** |\n\nThe notebook for model 1 in the table is linked below.  \nhttps://www.kaggle.com/code/rsakata/cmi3-6th-place-solution-partial\n\n## Neural Network Architecture\n\nOf the two gesture classification neural networks, the structure of one is shown below. The other differs only slightly in the input feature blocks.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F169364%2Ffa57a78dc1ae1a46d8ea8bc296dadd89%2Fnn_architecture.png?generation=1756890658946904&alt=media)\n\nEach input feature block (shown on the left) is processed with 1D-CNN and MLP layers. It was important to perform the first convolution in each 1D-CNN block as a grouped convolution by channel.  \n\nBefore the MLP layers, the 1D-CNN outputs are pooled along the time axis. Instead of simple global average pooling, pooling is done separately over the gesture and non-gesture segments, and the results are concatenated as the input to the MLP. To enable this, gesture segments were pre-estimated with a U-Net and added as inputs. (The U-Net structure was quite simple, with no special tricks, so I omit the details here.)\n\nThe final prediction is obtained by combining the outputs from all blocks. Following the problem setup, the model produces predictions using both all inputs and IMU-only inputs. Additionally, separate predictions are generated for each block.  \n\nCross-entropy loss is calculated for all predictions and used for backpropagation. The loss weights are: 1/4 each for the all-input and IMU-only predictions, and 1/12 for each of the six block-specific predictions.  \n\nIn addition to predicting gestures (18 classes), the network also predicts orientation (4 classes), added as an auxiliary loss weighted at 0.5 relative to the gesture loss. Non-target gestures were not compressed; the model was trained as an 18-class classification task, since early experiments showed this performed slightly better.\n\nFor inference on the test set, if more than 50% of TOF values were missing, the IMU-only prediction was used; otherwise, the all-input prediction was used.\n\nI will provide explanations for several feature blocks in the figure.\n\n#### derived_acc\n\nThis block consists of the three components of linear_acc and the three components of global_acc. linear_acc is acceleration with gravity removed, calculated the same way as in many public notebooks. global_acc is acceleration expressed in the global (world) coordinate system; see the discussion in the link below.  \nhttps://www.kaggle.com/competitions/cmi-detect-behavior-with-sensor-data/discussion/583080\n\n\n#### rotvec_diff\n\nThis is essentially equivalent to what was calculated as angular_vel in public notebooks. (The division by time is omitted since the values are later standardized.)\n\n#### tof\n\nBefore temporal convolution, each of the five TOF sensors’ values was spatially convolved on an 8×8 grid. After three rounds of stride-2 max pooling, the spatial dimensions were fully collapsed, producing 32 channels per sensor (160 in total). The resulting feature maps were then processed with temporal convolution in the same way as the other blocks.\n\n---\n\n## Preprocessing\n\n### Handling Left-Handed Subjects\n\nOne of the most important preprocessing steps was handling left-handed subjects.\n\nFor **acc** features, the fix was simple. Because these features are symmetric left–right, flipping the sign of the x component was enough to convert left-handed data into right-handed. This is clearly visible in the acc histograms below.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F169364%2Fc8ba809c708948dbe0c03dc96814915d%2Ffig_1.png?generation=1756887464315672&alt=media)\n\nFor **rot** features, things were more complicated, so I’ll start with **rotvec_diff**. Note that rotation around the x-axis is the same for both left- and right-handed subjects (like twisting a motorcycle throttle). In contrast, the y and z components had to be sign-flipped — a step that proved critical for improving accuracy for left-handed subjects.\n\nAt first glance, it might seem that flipping y and z would also be enough for **rot** values. However, rotation around the z-axis depends on the subject’s facing direction (unless all subjects performed gestures facing true north). So I first canceled out the angle relative to true north, then flipped rot_y and rot_z. After aligning the left- and right-handed histograms, the subjects’ facing direction was estimated at roughly 130° from north (likely southwest).  \nThe before-and-after histograms below confirm that the distributions matched after this transformation.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F169364%2Fb9ea168a8bceb3076406b03664ba0501%2Ffig_2.png?generation=1756887494143110&alt=media)\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F169364%2F7449c8933855943a0c6b2bd64a5e1571%2Ffig_3.png?generation=1756887515129665&alt=media)\n\nHowever, this preprocessing is only possible because all subjects faced the same direction during data collection. For real-world use, models shouldn’t depend on absolute orientation, so excluding **rot** (and **global_acc**) values entirely might be a better approach.\n\nFor sensor placement, I also mirrored some values: thm_3/tof_3 were swapped with thm_5/tof_5, and each TOF sensor’s v0–63 values were flipped left–right.\n\nThese steps resulted in a gesture classification accuracy of about 85% for left-handed subjects with IMU+THM+TOF in CV.\n\n### Handling Upside-Down Devices\n\nAnother key finding was that two subjects wore the device rotated 180° around the z-axis — specifically, SUBJ_019262 and SUBJ_045235. The histograms below compare these subjects with the rest.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F169364%2F2d760f9bb78878b48aeb7022189b42b3%2Ffig_4.png?generation=1756887529722860&alt=media)\n\nThe fact that acc_x and acc_y distributions appeared flipped strongly suggests the devices were worn upside down. I corrected the sensor values as if the devices had been worn properly:\n\n- For **acc**: flip the signs of x and y components  \n- For **rotvec_diff**: flip the signs of x and y components (z returns to original after two flips)  \n- For **rot**: add a 180° rotation around the z-axis, and flip the signs of x and y components  \n- Swap thm_2 with thm_4, and tof_2 with tof_4  \n- Swap thm_3 with thm_5, and tof_3 with tof_5  \n- Rotate the v0–63 values of TOF sensors  \n\nThese corrections not only drastically improved accuracy for the two affected subjects (accuracy exceeded 90% with IMU+THM+TOF in CV) but also gave a small boost to other subjects.\n\nTo prepare for similar cases in the test set, I also trained a model to detect whether a sequence was recorded with a 180° device rotation. The model architecture was exactly the same as that of the gesture classification network, differing only in the number of output classes.\n\nSince this didn’t improve the Public Score, I wasn’t sure whether to include it. In the end, I added it to one of my final submissions but not the other. It turned out to make a big difference on the Private Score (+0.013), which significantly improved my Private Leaderboard rank.\n\n### Other Simple Preprocessing\n\nAdditionally, a few other simple preprocessing steps were applied:\n- For **thm**: Values below 20 °C were treated as outliers and replaced with nulls (filled with 0 after standardization)  \n- For **tof**: Values of –1 were replaced with 255  \n\n---\n\n## Others\n\n- Optimizer: I used RAdamScheduleFree. In the final stage, I attempted to switch to AdamW and tune it, and although I was able to reach similar performance, it did not clearly surpass the previous results, so I continued using RAdamScheduleFree until the end.\n- Data augmentation and mix-up: I could not get them to work effectively, so I did not adopt them.\n- EMA: I also tried using EMA, which improved single CV results, but its effect disappeared when combined with seed averaging, so I ultimately decided not to use it.\n\n---\n\nThank you for reading!",
      "votes": 115
    },
    {
      "id": 3294910,
      "postDate": "2025-09-27T05:03:41.267Z",
      "content": "<p>Hi, thank you and congrats on the marvellous notebook and results, I have a question that confuses me.<br>\nThe IMU unit didn't specify which Coordinate Systems (Left-Handed vs. Right-Handed) they are using, but they must use one of the above system, right? <br>\nAssume they use right-handed coord system (same logic applies to the other coord system),  I have 2 different format of right-hand coordinate system below, which one is being used and why? I think you adopted the second format, otherwise it wouldn't make sense to cancel out different facing directions across different subjects along z-axis , may I know the reason/intuition behind? thanks a lot.<br>\n<img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F14683498%2Fcdeefd911ee7dfb36fdb51afe5c35e40%2Fright-handed%20coord%20system.png?generation=1758948936203494&amp;alt=media\" alt=\"\"></p>\n<ol>\n<li><br>\n<img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F14683498%2F2f67f32a5db7cbce9859bc8cd1fac145%2Fright-handed%20system%202.png?generation=1758949191794998&amp;alt=media\" alt=\"\"></li>\n</ol>",
      "rawMarkdown": "Hi, thank you and congrats on the marvellous notebook and results, I have a question that confuses me.\nThe IMU unit didn't specify which Coordinate Systems (Left-Handed vs. Right-Handed) they are using, but they must use one of the above system, right? \nAssume they use right-handed coord system (same logic applies to the other coord system),  I have 2 different format of right-hand coordinate system below, which one is being used and why? I think you adopted the second format, otherwise it wouldn't make sense to cancel out different facing directions across different subjects along z-axis , may I know the reason/intuition behind? thanks a lot.\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F14683498%2Fcdeefd911ee7dfb36fdb51afe5c35e40%2Fright-handed%20coord%20system.png?generation=1758948936203494&alt=media)\n\n2. \n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F14683498%2F2f67f32a5db7cbce9859bc8cd1fac145%2Fright-handed%20system%202.png?generation=1758949191794998&alt=media)",
      "votes": 5,
      "replies": [
        {
          "id": 3295749,
          "postDate": "2025-09-29T12:58:57.097Z",
          "content": "<p>When computing the global (world) acceleration from acc and rot features, you can observe that gravitational acceleration appears along the z-axis. This suggests that the z-axis corresponds to the vertical direction.</p>",
          "rawMarkdown": "When computing the global (world) acceleration from acc and rot features, you can observe that gravitational acceleration appears along the z-axis. This suggests that the z-axis corresponds to the vertical direction.",
          "votes": 1,
          "replies": [
            {
              "id": 3299876,
              "postDate": "2025-10-09T02:57:45.623Z",
              "content": "<p>thanks a lot &gt;&lt;, I learn a lot from this notebook</p>",
              "rawMarkdown": "thanks a lot ><, I learn a lot from this notebook\n",
              "votes": 1
            }
          ]
        }
      ]
    },
    {
      "id": 3280847,
      "postDate": "2025-09-03T08:39:05.693Z",
      "content": "<blockquote>\n  <p>Since this didn’t improve the Public Score, I wasn’t sure whether to include it.<br>\n  In the end, I added it to one of my final submissions but not the other.<br>\n  It turned out to make a big difference on the Private Score (+0.013), which significantly improved my Private Leaderboard rank.</p>\n</blockquote>\n<p>Yep, it's a secret, I was wondering who will find it since it's not trivial.  <br>\nI did the same as you i.e. training a model to detect if a sequence is flipped x+y (should have been rotated around z 180 degree but the difference is small).<br>\nAt first, I planned to aggregate the scores of this model for each subject, and if a subject has majority flipped, then it's probably a flipped subject.<br>\nThen I probed to see if there is at least 1 such subject that has majority of sequences flipped…there wasn't even 1.<br>\nBut I was not convinced lol…I suspected I had a bug in the aggregation.<br>\nSo I probed to see if there are any identified flipped sequences at all, my probing said there are ~30-40.<br>\nWhich was way higher then the number expected from error of the model if no sequense was flipped.<br>\nI probed further, and deduced that all or at least most of the flipped sequences are in private test.  <br>\nFor me, for same model: 0.86/0.849 without flipping correction, 0.86/0.857 with correction.</p>\n<p>This mean that there is at least one subject, that has some sequences flipped x+y, but it's less than the majority of it's sequences! (or at least less that a significant majority).<br>\nI find it very interesting!</p>",
      "rawMarkdown": "> Since this didn’t improve the Public Score, I wasn’t sure whether to include it.\nIn the end, I added it to one of my final submissions but not the other.\nIt turned out to make a big difference on the Private Score (+0.013), which significantly improved my Private Leaderboard rank.\n\nYep, it's a secret, I was wondering who will find it since it's not trivial.  \nI did the same as you i.e. training a model to detect if a sequence is flipped x+y (should have been rotated around z 180 degree but the difference is small).\nAt first, I planned to aggregate the scores of this model for each subject, and if a subject has majority flipped, then it's probably a flipped subject.\nThen I probed to see if there is at least 1 such subject that has majority of sequences flipped...there wasn't even 1.\nBut I was not convinced lol...I suspected I had a bug in the aggregation.\nSo I probed to see if there are any identified flipped sequences at all, my probing said there are ~30-40.\nWhich was way higher then the number expected from error of the model if no sequense was flipped.\nI probed further, and deduced that all or at least most of the flipped sequences are in private test.  \nFor me, for same model: 0.86/0.849 without flipping correction, 0.86/0.857 with correction.\n\nThis mean that there is at least one subject, that has some sequences flipped x+y, but it's less than the majority of it's sequences! (or at least less that a significant majority).\nI find it very interesting!",
      "votes": 8,
      "replies": [
        {
          "id": 3280858,
          "postDate": "2025-09-03T08:50:54.670Z",
          "content": "<p>\"This mean that there is at least one subject, that has some sequences flipped x+y, but it's less than the majority of it's sequences! \" Ohhhh!  That makes scence, I probe with the assumption that all sequneces would flip if a subject is incorrect wearing, which leading to a wrong conclution.</p>",
          "rawMarkdown": "\"This mean that there is at least one subject, that has some sequences flipped x+y, but it's less than the majority of it's sequences! \" Ohhhh!  That makes scence, I probe with the assumption that all sequneces would flip if a subject is incorrect wearing, which leading to a wrong conclution.",
          "replies": [
            {
              "id": 3280860,
              "postDate": "2025-09-03T08:55:07.843Z",
              "content": "<p>When I saw this, I was like 'well, knowing Kagglers, I'm sure that some will probe for flipped subject, but conclude that there is none'.<br>\nGlad to see I was right 🤣</p>",
              "rawMarkdown": "When I saw this, I was like 'well, knowing Kagglers, I'm sure that some will probe for flipped subject, but conclude that there is none'.\nGlad to see I was right 🤣",
              "votes": 4
            },
            {
              "id": 3281058,
              "postDate": "2025-09-03T14:45:32.027Z",
              "rawMarkdown": "",
              "isDeleted": true
            },
            {
              "id": 3281078,
              "postDate": "2025-09-03T15:34:20.647Z",
              "rawMarkdown": "",
              "isDeleted": true
            }
          ]
        }
      ]
    },
    {
      "id": 3287741,
      "postDate": "2025-09-12T06:32:14.730Z",
      "content": "<p>Congrats on your 6th place solution 👏, and thank you for the very detailed write-up!</p>\n<p>I noticed your CV (single seed) scores are in the 0.86–0.87 range, and the averaged CV gets close to 0.88, which is similar to the Public/Private LB results.</p>\n<p>Could you share a bit more on how well your 10-fold StratifiedGroupKFold CV tracked the leaderboard scores? Did you find that CV tended to slightly overestimate/underestimate the private LB, or was it generally well aligned?</p>",
      "rawMarkdown": "Congrats on your 6th place solution 👏, and thank you for the very detailed write-up!\n\nI noticed your CV (single seed) scores are in the 0.86–0.87 range, and the averaged CV gets close to 0.88, which is similar to the Public/Private LB results.\n\nCould you share a bit more on how well your 10-fold StratifiedGroupKFold CV tracked the leaderboard scores? Did you find that CV tended to slightly overestimate/underestimate the private LB, or was it generally well aligned?",
      "votes": 1,
      "replies": [
        {
          "id": 3288253,
          "postDate": "2025-09-13T13:36:56.727Z",
          "content": "<p>I didn’t make many submissions, and the differences between them didn’t seem very significant. That said, given the limited amount of data, there was a fair degree of variance.</p>",
          "rawMarkdown": "I didn’t make many submissions, and the differences between them didn’t seem very significant. That said, given the limited amount of data, there was a fair degree of variance.",
          "votes": 1,
          "replies": [
            {
              "id": 3299338,
              "postDate": "2025-10-07T19:47:36.290Z",
              "content": "<p>Thanks for clarifying, Jack! Small datasets always add some randomness. Still, it’s impressive how close your CV and leaderboard results ended up.</p>",
              "rawMarkdown": "Thanks for clarifying, Jack! Small datasets always add some randomness. Still, it’s impressive how close your CV and leaderboard results ended up.",
              "votes": 1
            }
          ]
        }
      ]
    },
    {
      "id": 3281410,
      "postDate": "2025-09-04T08:33:02.587Z",
      "content": "<p><a href=\"https://www.kaggle.com/rsakata\" target=\"_blank\">@rsakata</a> Congrats for solo prize winner.</p>\n<p>This approach is prone to label error of handedness. Some participant reported NaN in demographic column, and if it is true, it affect LB performance of this approach.<br>\n<a href=\"https://www.kaggle.com/competitions/cmi-detect-behavior-with-sensor-data/discussion/603543\" target=\"_blank\">https://www.kaggle.com/competitions/cmi-detect-behavior-with-sensor-data/discussion/603543</a></p>\n<p>Also, missing rotation column in test can harm this approach.</p>\n<p>Do you handle specific care for these cases?</p>",
      "rawMarkdown": "@rsakata Congrats for solo prize winner.\n\nThis approach is prone to label error of handedness. Some participant reported NaN in demographic column, and if it is true, it affect LB performance of this approach.\nhttps://www.kaggle.com/competitions/cmi-detect-behavior-with-sensor-data/discussion/603543\n\nAlso, missing rotation column in test can harm this approach.\n\nDo you handle specific care for these cases?",
      "votes": 1,
      "replies": [
        {
          "id": 3281580,
          "postDate": "2025-09-04T14:28:08.757Z",
          "content": "<p>Thank you for your comment. You’re absolutely right — labeling errors in handedness would have a major impact. Ideally, this too should be determined by a classification model.</p>\n<p>Although I didn’t mention it explicitly in the write-up, I did take measures to handle missing rot values. My model outputs predictions for each feature block, so I implemented a conditional branch: if both tof and rot have more than 50% missing values, the prediction from the acc block is used instead.</p>",
          "rawMarkdown": "Thank you for your comment. You’re absolutely right — labeling errors in handedness would have a major impact. Ideally, this too should be determined by a classification model.\n\nAlthough I didn’t mention it explicitly in the write-up, I did take measures to handle missing rot values. My model outputs predictions for each feature block, so I implemented a conditional branch: if both tof and rot have more than 50% missing values, the prediction from the acc block is used instead.",
          "votes": 3,
          "replies": [
            {
              "id": 3281632,
              "postDate": "2025-09-04T15:19:00.570Z",
              "content": "<p>smart measure. thanks.</p>",
              "rawMarkdown": "smart measure. thanks.",
              "votes": 1
            }
          ]
        }
      ]
    },
    {
      "id": 3280881,
      "postDate": "2025-09-03T09:42:14.547Z",
      "content": "<p>Great solution! congrats</p>",
      "rawMarkdown": "Great solution! congrats",
      "votes": 1
    },
    {
      "id": 3280850,
      "postDate": "2025-09-03T08:41:50.700Z",
      "content": "<p>Great work. We did the same flip with left-handedness subjects and incorrect wearing subjects. I also used a model try to detect incorrect wearing subjects. But after probing, I didn't find any incorrect wearing subjects at LB, weird.</p>",
      "rawMarkdown": "Great work. We did the same flip with left-handedness subjects and incorrect wearing subjects. I also used a model try to detect incorrect wearing subjects. But after probing, I didn't find any incorrect wearing subjects at LB, weird.",
      "votes": 1,
      "replies": [
        {
          "id": 3280855,
          "postDate": "2025-09-03T08:44:25.737Z",
          "content": "<p>Check my replay below </p>",
          "rawMarkdown": "Check my replay below ",
          "votes": 1
        }
      ]
    },
    {
      "id": 3287764,
      "postDate": "2025-09-12T07:42:55.683Z",
      "content": "<p>Good observation for data handness and rotate, That balanced my fold score.</p>",
      "rawMarkdown": "Good observation for data handness and rotate, That balanced my fold score.",
      "votes": 2
    },
    {
      "id": 3286139,
      "postDate": "2025-09-09T09:49:14.137Z",
      "content": "<p>thanks for sharing! I also inspected your code and I am still quite amazed of how you come up with such a structure, some questions</p>\n<ol>\n<li>your conv layers put normalization after activation, is it wrong or intentional?</li>\n<li>after conv layres, you used the segment average pooling, did you consider LSTM or GRU where every body else is using? Why you decided to not go with it?</li>\n<li>quite amazed at the NN structure, how did you come up with such a complex structure, is there any reference or just step-by-step trial &amp; error?</li>\n</ol>",
      "rawMarkdown": "thanks for sharing! I also inspected your code and I am still quite amazed of how you come up with such a structure, some questions\n1. your conv layers put normalization after activation, is it wrong or intentional?\n2. after conv layres, you used the segment average pooling, did you consider LSTM or GRU where every body else is using? Why you decided to not go with it?\n3. quite amazed at the NN structure, how did you come up with such a complex structure, is there any reference or just step-by-step trial & error?\n",
      "votes": 2,
      "replies": [
        {
          "id": 3286246,
          "postDate": "2025-09-09T13:31:59.207Z",
          "content": "<p>Thank you for your comment!</p>\n<ol>\n<li>I know the typical order is Conv → BN → ReLU, and I initially followed that. However, when I swapped BN and ReLU, the accuracy improved, so I adopted that arrangement. I don’t know why, though — I’ve never encountered this before, so it might have just happened to work better with this dataset.</li>\n<li>I also tried LSTM and attention pooling instead of gesture/non-gesture pooling, but they didn’t show any improvement.</li>\n<li>There was no reference; the structure was the result of repeated trial and error.</li>\n</ol>",
          "rawMarkdown": "Thank you for your comment!\n\n1. I know the typical order is Conv → BN → ReLU, and I initially followed that. However, when I swapped BN and ReLU, the accuracy improved, so I adopted that arrangement. I don’t know why, though — I’ve never encountered this before, so it might have just happened to work better with this dataset.\n2. I also tried LSTM and attention pooling instead of gesture/non-gesture pooling, but they didn’t show any improvement.\n3. There was no reference; the structure was the result of repeated trial and error.",
          "votes": 4
        }
      ]
    },
    {
      "id": 3282474,
      "postDate": "2025-09-06T11:09:31.293Z",
      "content": "<p>I am also face null results due to label handedness this is too irritating phase when you see them 😂Great Solution!</p>",
      "rawMarkdown": "I am also face null results due to label handedness this is too irritating phase when you see them 😂Great Solution!",
      "votes": 2
    },
    {
      "id": 3280894,
      "postDate": "2025-09-03T10:07:52.283Z",
      "content": "<p>upside detector + UNet gesture features is brilliant! Congrats!</p>",
      "rawMarkdown": "upside detector + UNet gesture features is brilliant! Congrats!",
      "votes": 2
    },
    {
      "id": 3299340,
      "postDate": "2025-10-07T19:53:40.093Z",
      "content": "<p>Thanks again for sharing this. great work, Jack! <br>\nOne question — do you think your orientation and handedness fixes were more important for improving CV stability, or for closing the public/private gap?</p>",
      "rawMarkdown": "Thanks again for sharing this. great work, Jack! \nOne question — do you think your orientation and handedness fixes were more important for improving CV stability, or for closing the public/private gap?"
    },
    {
      "id": 3282473,
      "postDate": "2025-09-06T11:07:26.373Z",
      "rawMarkdown": "",
      "isDeleted": true
    },
    {
      "id": 3281433,
      "postDate": "2025-09-04T09:20:27.603Z",
      "content": "<p>Thank you, <a href=\"https://www.kaggle.com/rsakata\" target=\"_blank\">@rsakata</a> </p>",
      "rawMarkdown": "Thank you, @rsakata ",
      "votes": 1
    },
    {
      "id": 3281154,
      "postDate": "2025-09-03T18:21:48.797Z",
      "content": "<p>Great work </p>",
      "rawMarkdown": "Great work ",
      "votes": 1
    }
  ],
  "comments": [
    {
      "id": 3294910,
      "author_name": "Summer",
      "author_url": "",
      "post_date": "2025-09-27T05:03:41.267000",
      "content": "<p>Hi, thank you and congrats on the marvellous notebook and results, I have a question that confuses me.<br>\nThe IMU unit didn't specify which Coordinate Systems (Left-Handed vs. Right-Handed) they are using, but they must use one of the above system, right? <br>\nAssume they use right-handed coord system (same logic applies to the other coord system),  I have 2 different format of right-hand coordinate system below, which one is being used and why? I think you adopted the second format, otherwise it wouldn't make sense to cancel out different facing directions across different subjects along z-axis , may I know the reason/intuition behind? thanks a lot.<br>\n<img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F14683498%2Fcdeefd911ee7dfb36fdb51afe5c35e40%2Fright-handed%20coord%20system.png?generation=1758948936203494&amp;alt=media\" alt=\"\"></p>\n<ol>\n<li><br>\n<img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F14683498%2F2f67f32a5db7cbce9859bc8cd1fac145%2Fright-handed%20system%202.png?generation=1758949191794998&amp;alt=media\" alt=\"\"></li>\n</ol>",
      "votes": 5,
      "replies": [
        {
          "id": 3295749,
          "author_name": "Jack (Japan)",
          "author_url": "",
          "post_date": "2025-09-29T12:58:57.097000",
          "content": "<p>When computing the global (world) acceleration from acc and rot features, you can observe that gravitational acceleration appears along the z-axis. This suggests that the z-axis corresponds to the vertical direction.</p>",
          "votes": 1,
          "replies": [
            {
              "id": 3299876,
              "author_name": "Summer",
              "author_url": "",
              "post_date": "2025-10-09T02:57:45.623000",
              "content": "<p>thanks a lot &gt;&lt;, I learn a lot from this notebook</p>",
              "votes": 1,
              "replies": []
            }
          ]
        }
      ]
    },
    {
      "id": 3280847,
      "author_name": "greySnow",
      "author_url": "",
      "post_date": "2025-09-03T08:39:05.693000",
      "content": "<blockquote>\n  <p>Since this didn’t improve the Public Score, I wasn’t sure whether to include it.<br>\n  In the end, I added it to one of my final submissions but not the other.<br>\n  It turned out to make a big difference on the Private Score (+0.013), which significantly improved my Private Leaderboard rank.</p>\n</blockquote>\n<p>Yep, it's a secret, I was wondering who will find it since it's not trivial.  <br>\nI did the same as you i.e. training a model to detect if a sequence is flipped x+y (should have been rotated around z 180 degree but the difference is small).<br>\nAt first, I planned to aggregate the scores of this model for each subject, and if a subject has majority flipped, then it's probably a flipped subject.<br>\nThen I probed to see if there is at least 1 such subject that has majority of sequences flipped…there wasn't even 1.<br>\nBut I was not convinced lol…I suspected I had a bug in the aggregation.<br>\nSo I probed to see if there are any identified flipped sequences at all, my probing said there are ~30-40.<br>\nWhich was way higher then the number expected from error of the model if no sequense was flipped.<br>\nI probed further, and deduced that all or at least most of the flipped sequences are in private test.  <br>\nFor me, for same model: 0.86/0.849 without flipping correction, 0.86/0.857 with correction.</p>\n<p>This mean that there is at least one subject, that has some sequences flipped x+y, but it's less than the majority of it's sequences! (or at least less that a significant majority).<br>\nI find it very interesting!</p>",
      "votes": 8,
      "replies": [
        {
          "id": 3280858,
          "author_name": "minerppdy",
          "author_url": "",
          "post_date": "2025-09-03T08:50:54.670000",
          "content": "<p>\"This mean that there is at least one subject, that has some sequences flipped x+y, but it's less than the majority of it's sequences! \" Ohhhh!  That makes scence, I probe with the assumption that all sequneces would flip if a subject is incorrect wearing, which leading to a wrong conclution.</p>",
          "votes": 0,
          "replies": [
            {
              "id": 3280860,
              "author_name": "greySnow",
              "author_url": "",
              "post_date": "2025-09-03T08:55:07.843000",
              "content": "<p>When I saw this, I was like 'well, knowing Kagglers, I'm sure that some will probe for flipped subject, but conclude that there is none'.<br>\nGlad to see I was right 🤣</p>",
              "votes": 4,
              "replies": []
            },
            {
              "id": 3281058,
              "author_name": "",
              "author_url": "",
              "post_date": "2025-09-03T14:45:32.027000",
              "content": "",
              "votes": 0,
              "replies": []
            },
            {
              "id": 3281078,
              "author_name": "",
              "author_url": "",
              "post_date": "2025-09-03T15:34:20.647000",
              "content": "",
              "votes": 0,
              "replies": []
            }
          ]
        }
      ]
    },
    {
      "id": 3287741,
      "author_name": "Fae Gaze",
      "author_url": "",
      "post_date": "2025-09-12T06:32:14.730000",
      "content": "<p>Congrats on your 6th place solution 👏, and thank you for the very detailed write-up!</p>\n<p>I noticed your CV (single seed) scores are in the 0.86–0.87 range, and the averaged CV gets close to 0.88, which is similar to the Public/Private LB results.</p>\n<p>Could you share a bit more on how well your 10-fold StratifiedGroupKFold CV tracked the leaderboard scores? Did you find that CV tended to slightly overestimate/underestimate the private LB, or was it generally well aligned?</p>",
      "votes": 1,
      "replies": [
        {
          "id": 3288253,
          "author_name": "Jack (Japan)",
          "author_url": "",
          "post_date": "2025-09-13T13:36:56.727000",
          "content": "<p>I didn’t make many submissions, and the differences between them didn’t seem very significant. That said, given the limited amount of data, there was a fair degree of variance.</p>",
          "votes": 1,
          "replies": [
            {
              "id": 3299338,
              "author_name": "Fae Gaze",
              "author_url": "",
              "post_date": "2025-10-07T19:47:36.290000",
              "content": "<p>Thanks for clarifying, Jack! Small datasets always add some randomness. Still, it’s impressive how close your CV and leaderboard results ended up.</p>",
              "votes": 1,
              "replies": []
            }
          ]
        }
      ]
    },
    {
      "id": 3281410,
      "author_name": "Bilzard",
      "author_url": "",
      "post_date": "2025-09-04T08:33:02.587000",
      "content": "<p><a href=\"https://www.kaggle.com/rsakata\" target=\"_blank\">@rsakata</a> Congrats for solo prize winner.</p>\n<p>This approach is prone to label error of handedness. Some participant reported NaN in demographic column, and if it is true, it affect LB performance of this approach.<br>\n<a href=\"https://www.kaggle.com/competitions/cmi-detect-behavior-with-sensor-data/discussion/603543\" target=\"_blank\">https://www.kaggle.com/competitions/cmi-detect-behavior-with-sensor-data/discussion/603543</a></p>\n<p>Also, missing rotation column in test can harm this approach.</p>\n<p>Do you handle specific care for these cases?</p>",
      "votes": 1,
      "replies": [
        {
          "id": 3281580,
          "author_name": "Jack (Japan)",
          "author_url": "",
          "post_date": "2025-09-04T14:28:08.757000",
          "content": "<p>Thank you for your comment. You’re absolutely right — labeling errors in handedness would have a major impact. Ideally, this too should be determined by a classification model.</p>\n<p>Although I didn’t mention it explicitly in the write-up, I did take measures to handle missing rot values. My model outputs predictions for each feature block, so I implemented a conditional branch: if both tof and rot have more than 50% missing values, the prediction from the acc block is used instead.</p>",
          "votes": 3,
          "replies": [
            {
              "id": 3281632,
              "author_name": "Bilzard",
              "author_url": "",
              "post_date": "2025-09-04T15:19:00.570000",
              "content": "<p>smart measure. thanks.</p>",
              "votes": 1,
              "replies": []
            }
          ]
        }
      ]
    },
    {
      "id": 3280881,
      "author_name": "Fnoa",
      "author_url": "",
      "post_date": "2025-09-03T09:42:14.547000",
      "content": "<p>Great solution! congrats</p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 3280850,
      "author_name": "minerppdy",
      "author_url": "",
      "post_date": "2025-09-03T08:41:50.700000",
      "content": "<p>Great work. We did the same flip with left-handedness subjects and incorrect wearing subjects. I also used a model try to detect incorrect wearing subjects. But after probing, I didn't find any incorrect wearing subjects at LB, weird.</p>",
      "votes": 1,
      "replies": [
        {
          "id": 3280855,
          "author_name": "greySnow",
          "author_url": "",
          "post_date": "2025-09-03T08:44:25.737000",
          "content": "<p>Check my replay below </p>",
          "votes": 1,
          "replies": []
        }
      ]
    },
    {
      "id": 3287764,
      "author_name": "XuKong Ji",
      "author_url": "",
      "post_date": "2025-09-12T07:42:55.683000",
      "content": "<p>Good observation for data handness and rotate, That balanced my fold score.</p>",
      "votes": 2,
      "replies": []
    },
    {
      "id": 3286139,
      "author_name": "MJeremy",
      "author_url": "",
      "post_date": "2025-09-09T09:49:14.137000",
      "content": "<p>thanks for sharing! I also inspected your code and I am still quite amazed of how you come up with such a structure, some questions</p>\n<ol>\n<li>your conv layers put normalization after activation, is it wrong or intentional?</li>\n<li>after conv layres, you used the segment average pooling, did you consider LSTM or GRU where every body else is using? Why you decided to not go with it?</li>\n<li>quite amazed at the NN structure, how did you come up with such a complex structure, is there any reference or just step-by-step trial &amp; error?</li>\n</ol>",
      "votes": 2,
      "replies": [
        {
          "id": 3286246,
          "author_name": "Jack (Japan)",
          "author_url": "",
          "post_date": "2025-09-09T13:31:59.207000",
          "content": "<p>Thank you for your comment!</p>\n<ol>\n<li>I know the typical order is Conv → BN → ReLU, and I initially followed that. However, when I swapped BN and ReLU, the accuracy improved, so I adopted that arrangement. I don’t know why, though — I’ve never encountered this before, so it might have just happened to work better with this dataset.</li>\n<li>I also tried LSTM and attention pooling instead of gesture/non-gesture pooling, but they didn’t show any improvement.</li>\n<li>There was no reference; the structure was the result of repeated trial and error.</li>\n</ol>",
          "votes": 4,
          "replies": []
        }
      ]
    },
    {
      "id": 3282474,
      "author_name": "Muhammad Hamza",
      "author_url": "",
      "post_date": "2025-09-06T11:09:31.293000",
      "content": "<p>I am also face null results due to label handedness this is too irritating phase when you see them 😂Great Solution!</p>",
      "votes": 2,
      "replies": []
    },
    {
      "id": 3280894,
      "author_name": "Optimo",
      "author_url": "",
      "post_date": "2025-09-03T10:07:52.283000",
      "content": "<p>upside detector + UNet gesture features is brilliant! Congrats!</p>",
      "votes": 2,
      "replies": []
    },
    {
      "id": 3299340,
      "author_name": "Fae Gaze",
      "author_url": "",
      "post_date": "2025-10-07T19:53:40.093000",
      "content": "<p>Thanks again for sharing this. great work, Jack! <br>\nOne question — do you think your orientation and handedness fixes were more important for improving CV stability, or for closing the public/private gap?</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 3282473,
      "author_name": "",
      "author_url": "",
      "post_date": "2025-09-06T11:07:26.373000",
      "content": "",
      "votes": 0,
      "replies": []
    },
    {
      "id": 3281433,
      "author_name": "Navneet",
      "author_url": "",
      "post_date": "2025-09-04T09:20:27.603000",
      "content": "<p>Thank you, <a href=\"https://www.kaggle.com/rsakata\" target=\"_blank\">@rsakata</a> </p>",
      "votes": 1,
      "replies": []
    },
    {
      "id": 3281154,
      "author_name": "",
      "author_url": "",
      "post_date": "2025-09-03T18:21:48.797000",
      "content": "<p>Great work </p>",
      "votes": 1,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "3280840": "First of all, I would like to thank the competition hosts and all the participants for their efforts and contributions. It’s inspiring to see such creativity and dedication. I am also thrilled to have placed in the prize-winning range. Below, I would like to share an overview of my solution.\n\n---\n\n## Brief Summary\n\nThe main points of my solution are as follows:\n- Used a custom neural network with separate 1D-CNN branches, one for each sensor modality  \n- Extracted the last 75 frames of each sequence as inputs to the NN  \n- Estimated gesture segments with a simple U-Net and added them as additional inputs  \n- Converted left-handed data to align with right-handed data  \n- Identified subjects who wore devices upside down (rotated by 180° around the z-axis) and corrected their data  \n- Trained two nearly identical NNs (differing only in input blocks) 50 times each on the full dataset with different random seeds, then averaged the outputs of all 100 NNs\n- Did not apply any post-processing  \n\nHere are the cross-validation (CV) and leaderboard (LB) scores. Cross-validation was performed using 10-fold StratifiedGroupKFold.\n\n| Model | CV or full-train | Handle upside-down<br>devices in test | CV<br>(single seed) | CV<br>(5-seed average) | Public LB | Private LB |\n| --- | --- | --- | --- | --- | --- | --- |\n| 1 | CV | False | **0.864**<br>(0.894, 0.834) | **0.874**<br>(0.905, 0.843) | **0.869** | **0.860** |\n| 2 | CV | False | **0.862**<br>(0.892, 0.833) | **0.875**<br>(0.904, 0.846) | **0.874** | **0.856** |\n| 1 + 2 | CV | False | - | **0.877**<br>(0.906, 0.849) | **0.873** | **0.858** |\n| 1 + 2 | full-train | False | - | - | **0.871** | **0.860** |\n| 1 + 2 | full-train | True | - | - | **0.871** | **0.873** |\n\nThe notebook for model 1 in the table is linked below.  \nhttps://www.kaggle.com/code/rsakata/cmi3-6th-place-solution-partial\n\n## Neural Network Architecture\n\nOf the two gesture classification neural networks, the structure of one is shown below. The other differs only slightly in the input feature blocks.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F169364%2Ffa57a78dc1ae1a46d8ea8bc296dadd89%2Fnn_architecture.png?generation=1756890658946904&alt=media)\n\nEach input feature block (shown on the left) is processed with 1D-CNN and MLP layers. It was important to perform the first convolution in each 1D-CNN block as a grouped convolution by channel.  \n\nBefore the MLP layers, the 1D-CNN outputs are pooled along the time axis. Instead of simple global average pooling, pooling is done separately over the gesture and non-gesture segments, and the results are concatenated as the input to the MLP. To enable this, gesture segments were pre-estimated with a U-Net and added as inputs. (The U-Net structure was quite simple, with no special tricks, so I omit the details here.)\n\nThe final prediction is obtained by combining the outputs from all blocks. Following the problem setup, the model produces predictions using both all inputs and IMU-only inputs. Additionally, separate predictions are generated for each block.  \n\nCross-entropy loss is calculated for all predictions and used for backpropagation. The loss weights are: 1/4 each for the all-input and IMU-only predictions, and 1/12 for each of the six block-specific predictions.  \n\nIn addition to predicting gestures (18 classes), the network also predicts orientation (4 classes), added as an auxiliary loss weighted at 0.5 relative to the gesture loss. Non-target gestures were not compressed; the model was trained as an 18-class classification task, since early experiments showed this performed slightly better.\n\nFor inference on the test set, if more than 50% of TOF values were missing, the IMU-only prediction was used; otherwise, the all-input prediction was used.\n\nI will provide explanations for several feature blocks in the figure.\n\n#### derived_acc\n\nThis block consists of the three components of linear_acc and the three components of global_acc. linear_acc is acceleration with gravity removed, calculated the same way as in many public notebooks. global_acc is acceleration expressed in the global (world) coordinate system; see the discussion in the link below.  \nhttps://www.kaggle.com/competitions/cmi-detect-behavior-with-sensor-data/discussion/583080\n\n\n#### rotvec_diff\n\nThis is essentially equivalent to what was calculated as angular_vel in public notebooks. (The division by time is omitted since the values are later standardized.)\n\n#### tof\n\nBefore temporal convolution, each of the five TOF sensors’ values was spatially convolved on an 8×8 grid. After three rounds of stride-2 max pooling, the spatial dimensions were fully collapsed, producing 32 channels per sensor (160 in total). The resulting feature maps were then processed with temporal convolution in the same way as the other blocks.\n\n---\n\n## Preprocessing\n\n### Handling Left-Handed Subjects\n\nOne of the most important preprocessing steps was handling left-handed subjects.\n\nFor **acc** features, the fix was simple. Because these features are symmetric left–right, flipping the sign of the x component was enough to convert left-handed data into right-handed. This is clearly visible in the acc histograms below.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F169364%2Fc8ba809c708948dbe0c03dc96814915d%2Ffig_1.png?generation=1756887464315672&alt=media)\n\nFor **rot** features, things were more complicated, so I’ll start with **rotvec_diff**. Note that rotation around the x-axis is the same for both left- and right-handed subjects (like twisting a motorcycle throttle). In contrast, the y and z components had to be sign-flipped — a step that proved critical for improving accuracy for left-handed subjects.\n\nAt first glance, it might seem that flipping y and z would also be enough for **rot** values. However, rotation around the z-axis depends on the subject’s facing direction (unless all subjects performed gestures facing true north). So I first canceled out the angle relative to true north, then flipped rot_y and rot_z. After aligning the left- and right-handed histograms, the subjects’ facing direction was estimated at roughly 130° from north (likely southwest).  \nThe before-and-after histograms below confirm that the distributions matched after this transformation.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F169364%2Fb9ea168a8bceb3076406b03664ba0501%2Ffig_2.png?generation=1756887494143110&alt=media)\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F169364%2F7449c8933855943a0c6b2bd64a5e1571%2Ffig_3.png?generation=1756887515129665&alt=media)\n\nHowever, this preprocessing is only possible because all subjects faced the same direction during data collection. For real-world use, models shouldn’t depend on absolute orientation, so excluding **rot** (and **global_acc**) values entirely might be a better approach.\n\nFor sensor placement, I also mirrored some values: thm_3/tof_3 were swapped with thm_5/tof_5, and each TOF sensor’s v0–63 values were flipped left–right.\n\nThese steps resulted in a gesture classification accuracy of about 85% for left-handed subjects with IMU+THM+TOF in CV.\n\n### Handling Upside-Down Devices\n\nAnother key finding was that two subjects wore the device rotated 180° around the z-axis — specifically, SUBJ_019262 and SUBJ_045235. The histograms below compare these subjects with the rest.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F169364%2F2d760f9bb78878b48aeb7022189b42b3%2Ffig_4.png?generation=1756887529722860&alt=media)\n\nThe fact that acc_x and acc_y distributions appeared flipped strongly suggests the devices were worn upside down. I corrected the sensor values as if the devices had been worn properly:\n\n- For **acc**: flip the signs of x and y components  \n- For **rotvec_diff**: flip the signs of x and y components (z returns to original after two flips)  \n- For **rot**: add a 180° rotation around the z-axis, and flip the signs of x and y components  \n- Swap thm_2 with thm_4, and tof_2 with tof_4  \n- Swap thm_3 with thm_5, and tof_3 with tof_5  \n- Rotate the v0–63 values of TOF sensors  \n\nThese corrections not only drastically improved accuracy for the two affected subjects (accuracy exceeded 90% with IMU+THM+TOF in CV) but also gave a small boost to other subjects.\n\nTo prepare for similar cases in the test set, I also trained a model to detect whether a sequence was recorded with a 180° device rotation. The model architecture was exactly the same as that of the gesture classification network, differing only in the number of output classes.\n\nSince this didn’t improve the Public Score, I wasn’t sure whether to include it. In the end, I added it to one of my final submissions but not the other. It turned out to make a big difference on the Private Score (+0.013), which significantly improved my Private Leaderboard rank.\n\n### Other Simple Preprocessing\n\nAdditionally, a few other simple preprocessing steps were applied:\n- For **thm**: Values below 20 °C were treated as outliers and replaced with nulls (filled with 0 after standardization)  \n- For **tof**: Values of –1 were replaced with 255  \n\n---\n\n## Others\n\n- Optimizer: I used RAdamScheduleFree. In the final stage, I attempted to switch to AdamW and tune it, and although I was able to reach similar performance, it did not clearly surpass the previous results, so I continued using RAdamScheduleFree until the end.\n- Data augmentation and mix-up: I could not get them to work effectively, so I did not adopt them.\n- EMA: I also tried using EMA, which improved single CV results, but its effect disappeared when combined with seed averaging, so I ultimately decided not to use it.\n\n---\n\nThank you for reading!",
    "3294910": "Hi, thank you and congrats on the marvellous notebook and results, I have a question that confuses me.\nThe IMU unit didn't specify which Coordinate Systems (Left-Handed vs. Right-Handed) they are using, but they must use one of the above system, right? \nAssume they use right-handed coord system (same logic applies to the other coord system),  I have 2 different format of right-hand coordinate system below, which one is being used and why? I think you adopted the second format, otherwise it wouldn't make sense to cancel out different facing directions across different subjects along z-axis , may I know the reason/intuition behind? thanks a lot.\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F14683498%2Fcdeefd911ee7dfb36fdb51afe5c35e40%2Fright-handed%20coord%20system.png?generation=1758948936203494&alt=media)\n\n2. \n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F14683498%2F2f67f32a5db7cbce9859bc8cd1fac145%2Fright-handed%20system%202.png?generation=1758949191794998&alt=media)",
    "3280847": "> Since this didn’t improve the Public Score, I wasn’t sure whether to include it.\nIn the end, I added it to one of my final submissions but not the other.\nIt turned out to make a big difference on the Private Score (+0.013), which significantly improved my Private Leaderboard rank.\n\nYep, it's a secret, I was wondering who will find it since it's not trivial.  \nI did the same as you i.e. training a model to detect if a sequence is flipped x+y (should have been rotated around z 180 degree but the difference is small).\nAt first, I planned to aggregate the scores of this model for each subject, and if a subject has majority flipped, then it's probably a flipped subject.\nThen I probed to see if there is at least 1 such subject that has majority of sequences flipped...there wasn't even 1.\nBut I was not convinced lol...I suspected I had a bug in the aggregation.\nSo I probed to see if there are any identified flipped sequences at all, my probing said there are ~30-40.\nWhich was way higher then the number expected from error of the model if no sequense was flipped.\nI probed further, and deduced that all or at least most of the flipped sequences are in private test.  \nFor me, for same model: 0.86/0.849 without flipping correction, 0.86/0.857 with correction.\n\nThis mean that there is at least one subject, that has some sequences flipped x+y, but it's less than the majority of it's sequences! (or at least less that a significant majority).\nI find it very interesting!",
    "3287741": "Congrats on your 6th place solution 👏, and thank you for the very detailed write-up!\n\nI noticed your CV (single seed) scores are in the 0.86–0.87 range, and the averaged CV gets close to 0.88, which is similar to the Public/Private LB results.\n\nCould you share a bit more on how well your 10-fold StratifiedGroupKFold CV tracked the leaderboard scores? Did you find that CV tended to slightly overestimate/underestimate the private LB, or was it generally well aligned?",
    "3281410": "@rsakata Congrats for solo prize winner.\n\nThis approach is prone to label error of handedness. Some participant reported NaN in demographic column, and if it is true, it affect LB performance of this approach.\nhttps://www.kaggle.com/competitions/cmi-detect-behavior-with-sensor-data/discussion/603543\n\nAlso, missing rotation column in test can harm this approach.\n\nDo you handle specific care for these cases?",
    "3280881": "Great solution! congrats",
    "3280850": "Great work. We did the same flip with left-handedness subjects and incorrect wearing subjects. I also used a model try to detect incorrect wearing subjects. But after probing, I didn't find any incorrect wearing subjects at LB, weird.",
    "3287764": "Good observation for data handness and rotate, That balanced my fold score.",
    "3286139": "thanks for sharing! I also inspected your code and I am still quite amazed of how you come up with such a structure, some questions\n1. your conv layers put normalization after activation, is it wrong or intentional?\n2. after conv layres, you used the segment average pooling, did you consider LSTM or GRU where every body else is using? Why you decided to not go with it?\n3. quite amazed at the NN structure, how did you come up with such a complex structure, is there any reference or just step-by-step trial & error?\n",
    "3282474": "I am also face null results due to label handedness this is too irritating phase when you see them 😂Great Solution!",
    "3280894": "upside detector + UNet gesture features is brilliant! Congrats!",
    "3299340": "Thanks again for sharing this. great work, Jack! \nOne question — do you think your orientation and handedness fixes were more important for improving CV stability, or for closing the public/private gap?",
    "3282473": "",
    "3281433": "Thank you, @rsakata ",
    "3281154": "Great work "
  }
}