{"about":{"site":"https://codewithpapers.app","non_affiliation":"Code with Papers and Syntology are not affiliated with, endorsed by, or sponsored by Papers with Code, Meta, or the pwc-archive mirror.","licence":"CC BY-SA 4.0","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","attribution":"https://codewithpapers.app/attribution","modified":"archive material modified by Syntology; see the attribution page"},"url":"/paper/comodo-cross-modal-video-to-imu-distillation","title":"COMODO: Cross-Modal Video-to-IMU Distillation for Efficient Egocentric Human Activity Recognition","arxiv_id":"2503.07259","date":"2025-03-10","proceeding":null,"authors":["Baiyu Chen","Wilson Wongso","Zechen Li","Yonchanok Khaokaew","Hao Xue","Flora Salim"],"abstract":"Egocentric video-based models capture rich semantic information and have demonstrated strong performance in human activity recognition (HAR). However, their high power consumption, privacy concerns, and dependence on lighting conditions limit their feasibility for continuous on-device recognition. In contrast, inertial measurement unit (IMU) sensors offer an energy-efficient and privacy-preserving alternative, yet they suffer from limited large-scale annotated datasets, leading to weaker generalization in downstream tasks. To bridge this gap, we propose COMODO, a cross-modal self-supervised distillation framework that transfers rich semantic knowledge from the video modality to the IMU modality without requiring labeled annotations. COMODO leverages a pretrained and frozen video encoder to construct a dynamic instance queue, aligning the feature distributions of video and IMU embeddings. By distilling knowledge from video representations, our approach enables the IMU encoder to inherit rich semantic information from video while preserving its efficiency for real-world applications. Experiments on multiple egocentric HAR datasets demonstrate that COMODO consistently improves downstream classification performance, achieving results comparable to or exceeding fully supervised fine-tuned models. Moreover, COMODO exhibits strong cross-dataset generalization. Benefiting from its simplicity, our method is also generally applicable to various video and time-series pre-trained models, offering the potential to leverage more powerful teacher and student foundation models in future research. The code is available at https://github.com/Breezelled/COMODO .","url_abs":"https://arxiv.org/abs/2503.07259v1","url_pdf":"https://arxiv.org/pdf/2503.07259v1.pdf","source":{"archive":"pwc-archive (Hugging Face), CC BY-SA 4.0","snapshot":"2025-07-28","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","row_kind":"abstracts"},"code_links":[{"paper_slug":"comodo-cross-modal-video-to-imu-distillation","repo_url":"https://github.com/Breezelled/COMODO","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":1,"framework":"pytorch","reach":{"status":"ok","spdx":"MIT"}}],"tasks":[{"task_slug":"activity-recognition","task_name":"Activity Recognition"},{"task_slug":"human-activity-recognition","task_name":"Human Activity Recognition"},{"task_slug":"privacy-preserving","task_name":"Privacy Preserving"}],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"syntology_url":"https://syntology.ai/paper/2503.07259","atlas_url":"https://app.syntology.ai/?focus=2503.07259","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2503.07259"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-25T09:33:49+00:00","read_at_is":"when the build read Syntology's graph, not when any sample ran","claim":"Per-sample execution status on synthesized fixtures; not a correctness claim about the paper. Samples come from repositories linked to the paper, official or community; repo_kind says which.","repos":[{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/Breezelled/COMODO","reach":{"status":"ok","spdx":"MIT"}}],"summary":{"ran":7,"ran_violates":1,"unverified":5},"by_repo_kind":{"official":{"samples":13,"ran":8,"repositories":1}},"repo_kind_vocabulary":{"official":"The archive marks this repository official for the paper","named_in_paper":"The archive records that the paper mentions this repository; it is not marked official","listed":"In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper","found_in_text":"Syntology found this repository in the paper's own text; whether it is the authors' implementation is not asserted","community":"Not in the archive's code links for this paper; a community repository Syntology harvested"},"n_pointer_only_for_licence":0,"samples":[{"code_sha256_prefix":"aa4e578d8fe253e7","entry":"UESTC_MMEA_CL_MOMENT_train_collate_fn","repo":"Breezelled/COMODO","repo_kind":"official","path":"comodo/utils/collate_util.py","file_url":"https://github.com/Breezelled/COMODO/blob/HEAD/comodo/utils/collate_util.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"aa4e578d8fe253e7"}},{"code_sha256_prefix":"b2d90cc702165a7d","entry":"extract_embeddings","repo":"Breezelled/COMODO","repo_kind":"official","path":"comodo/utils/svm_util.py","file_url":"https://github.com/Breezelled/COMODO/blob/HEAD/comodo/utils/svm_util.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"b2d90cc702165a7d"}},{"code_sha256_prefix":"814f7a78b3f4f115","entry":"info_nce","repo":"Breezelled/COMODO","repo_kind":"official","path":"comodo/loss.py","file_url":"https://github.com/Breezelled/COMODO/blob/HEAD/comodo/loss.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"814f7a78b3f4f115"}},{"code_sha256_prefix":"77589f4d86131356","entry":"resize","repo":"Breezelled/COMODO","repo_kind":"official","path":"comodo/utils/model_util.py","file_url":"https://github.com/Breezelled/COMODO/blob/HEAD/comodo/utils/model_util.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"77589f4d86131356"}},{"code_sha256_prefix":"0076a30fbf64e6f1","entry":"train_collate_fn","repo":"Breezelled/COMODO","repo_kind":"official","path":"comodo/utils/collate_util.py","file_url":"https://github.com/Breezelled/COMODO/blob/HEAD/comodo/utils/collate_util.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"0076a30fbf64e6f1"}},{"code_sha256_prefix":"9f7e3bf05a75b359","entry":"train_svm_on_embeddings","repo":"Breezelled/COMODO","repo_kind":"official","path":"comodo/utils/svm_util.py","file_url":"https://github.com/Breezelled/COMODO/blob/HEAD/comodo/utils/svm_util.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"9f7e3bf05a75b359"}},{"code_sha256_prefix":"55f1419d4d8c483c","entry":"transpose","repo":"Breezelled/COMODO","repo_kind":"official","path":"comodo/loss.py","file_url":"https://github.com/Breezelled/COMODO/blob/HEAD/comodo/loss.py","link_basis":"harvester_set","language":"python","status":"ran_violates","verification_level":1,"contract_check":"VIOLATES","metamorphic_tier":"invariant","behaviour_fingerprint":true,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"55f1419d4d8c483c"}},{"code_sha256_prefix":"b81095d2e1621d2e","entry":"video_collate_fn","repo":"Breezelled/COMODO","repo_kind":"official","path":"comodo/utils/dataloader_util.py","file_url":"https://github.com/Breezelled/COMODO/blob/HEAD/comodo/utils/dataloader_util.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"b81095d2e1621d2e"}},{"code_sha256_prefix":"26d5467aad92b08b","entry":"MLP","repo":"Breezelled/COMODO","repo_kind":"official","path":"comodo/utils/model_util.py","file_url":"https://github.com/Breezelled/COMODO/blob/HEAD/comodo/utils/model_util.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"26d5467aad92b08b"}},{"code_sha256_prefix":"60c7d71a83786e99","entry":"UESTC_MMEA_CL_Mantis_train_collate_fn","repo":"Breezelled/COMODO","repo_kind":"official","path":"comodo/utils/collate_util.py","file_url":"https://github.com/Breezelled/COMODO/blob/HEAD/comodo/utils/collate_util.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"60c7d71a83786e99"}},{"code_sha256_prefix":"dfb4e9322ba47b08","entry":"evaluate_svm","repo":"Breezelled/COMODO","repo_kind":"official","path":"comodo/utils/svm_util.py","file_url":"https://github.com/Breezelled/COMODO/blob/HEAD/comodo/utils/svm_util.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"dfb4e9322ba47b08"}},{"code_sha256_prefix":"6ee9895415951b99","entry":"get_imu_label_test_dataloader","repo":"Breezelled/COMODO","repo_kind":"official","path":"comodo/utils/dataloader_util.py","file_url":"https://github.com/Breezelled/COMODO/blob/HEAD/comodo/utils/dataloader_util.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"6ee9895415951b99"}},{"code_sha256_prefix":"4f64cd8befda6e5d","entry":"get_imu_label_train_dataloader","repo":"Breezelled/COMODO","repo_kind":"official","path":"comodo/utils/dataloader_util.py","file_url":"https://github.com/Breezelled/COMODO/blob/HEAD/comodo/utils/dataloader_util.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"4f64cd8befda6e5d"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}