Official baseline implementation for the ADODAS grand challenge (ACMMM 2026).
- Track A1: three binary labels for Depression / Anxiety / Stress.
- Track A2: 21 ordinal item predictions with scores in
{0, 1, 2, 3}.
Create a conda environment from envs/adodas.yaml:
conda env create -f envs/adodas.yaml
conda activate adodasThe config field feature_root should point to the anonymized feature tree. The loader expects:
<feature_root>/<split>/<anon_school>/<anon_class>/<anon_pid>/
|- audio/
| |- mel_mfcc/<session>/
| |- vad/<session>/
| |- ssl_embed/<audio_ssl_model_tag>/<session>/
| `- egemaps/<session>/
`- video/
|- headpose_geom/<session>/
|- face_behavior/<session>/
|- qc_stats/<session>/
|- vad_agg/<session>/
|- body_pose/<session>/
|- global_motion/<session>/
`- vision_ssl_embed/<video_ssl_model_tag>/<session>/
python train.py --task <a1|a2> --config <config_yaml>python infer.py --task <a1|a2> --checkpoint <path_to_best.pt> [--config <config_yaml>] [--split <split_name>] [--output <csv_path>]Typical workflow:
- Train a model and get
best.ptunder<output_dir>/runs/<run_name>/checkpoints/. - Run inference using that checkpoint.
For each run, directories are organized as:
<output_dir>/runs/<run_name>/
|- logs/
|- checkpoints/
|- calibration/
`- submissions/ (created only when submissions are written)
- A01: "The North Wind and the Sun" standardized reading passage.
- 有一回,北风跟太阳在那儿争论谁的本领大。说着说着,来了一个过路的,身上穿了一件厚袍子。他们俩就商量好了,说谁能先叫这个过路的把他的袍子脱下来,就算是他的本领大。北风就使劲吹起来,拼命地吹。可是,他吹得越厉害,那个人就把他的袍子裹得越紧。到末了儿,北风没辙了,只好就算了。一会儿,太阳出来一晒,那个人马上就把袍子脱了下来。所以,北风不得不承认,还是太阳比他的本领大。
- B01:Please describe how your day went yesterday.
- 请描述一下,你昨天过的怎么样?
- B02:Please describe your happiest memory from the past week.
- 请描述一下,现在回想最近一周最开心的记忆?
- B03:Please describe your saddest memory from the past week.
- 请描述一下,现在回想最近一周最悲伤的记忆?
- 家庭结构(Family structure)
- 1=核心家庭,Nuclear
- 2=大家庭, Extended
- 3=单亲家庭, Single-parent
- 4=重组家庭,Blended
- 5=隔代家庭,Skipped-generation
- 6=其他,Other
- 是否是独生子女(Only child status)
- Whether the respondent is an only child (1:Yes/0:No).
- 如非独生子女,是否感受到父母有所偏爱?(Parental favoritism If not an only child)
- 1=偏爱兄弟姐妹,Favoring siblings
- 2=无偏爱,No favoritism
- 3=偏爱自己,Favoring self
- 本学期相比上个学期,学习成绩变动情况(Academic performance change Compared with previous semester):
- 1=进步,Improved,
- 2=退步,Declined,
- 3=稳定,Stable.
- 本学期相比上个学期,情绪变动情况(Emotional state change Compared with previous semester):
- 1=变好,Better
- 2=变差,Worse
- 3=无变化,No change
- Contents:
- Log-Mel spectrogram: 80 dims
- MFCC: 13 dims
- Time resolution: 25 Hz
sequence.npz:mel_features:(T, 80)mfcc_features:(T, 13)timestamps_ms:(T,)valid_mask:(T,)
- Field meanings:
mel_features[:, 0:80]: log energy over 80 Mel filter banksmfcc_features[:, 0:13]: 13 MFCC coefficients
pooledstatistics:mean/std/p10/p50/p90are computed separately for Mel and MFCC features- Theoretical total dimensionality:
80*5 + 13*5 = 465 - Column naming patterns:
mel_00_mean ... mel_79_p90mfcc_00_mean ... mfcc_12_p90
- Extraction method:
webrtcvad - Time resolution: 25 Hz
sequence.npz:features:(T, 1)
- Single-dimension semantics:
- Dimension 0:
vad_decision1indicates speech0indicates silence / non-speech
- Dimension 0:
pooled.jsonfields:speech_ratiototal_speech_durationtotal_silence_durationnum_speech_segmentsnum_silence_segmentspause_countmean_pause_durationmax_pause_durationlong_pause_count- Other outputs:
segments.json: start/end timestamps of speech and silence segments
- Extraction method:
openSMILE eGeMAPSv02 functionals - Total
pooleddimensionality:88 - Description:
- These 88 dimensions are standardized acoustic statistical features covering F0, loudness, spectral slope, spectral flux, formant-related statistics, and voiced/unvoiced segment statistics.
- Example column names:
F0semitoneFrom27.5Hz_sma3nz_ameanF0semitoneFrom27.5Hz_sma3nz_stddevNormloudnessPeaksPerSecVoicedSegmentsPerSecMeanVoicedSegmentLengthSecequivalentSoundLevel_dBp
- Extraction method: final-layer hidden states from a speech self-supervised model, linearly interpolated and resampled to 25 Hz
sequence.npz:features:(T, D)timestamps_ms:(T,)valid_mask:(T,)embed_dim: scalarmodel_name: scalar
- Per-frame semantics:
- Each frame is a
D-dimensional speech representation vector produced by the corresponding pretrained model.
- Each frame is a
pooledstatistics:mean/std/p10/p50/p90are computed for each embedding dimension- Total dimensionality:
5 * D - Column naming pattern:
embed_0000_mean ... embed_(D-1)_p90
Supported models and dimensions:
| model_tag | HuggingFace / model identifier | Per-frame dimension |
|---|---|---|
wavlm-base |
microsoft/wavlm-base |
768 |
chinese-hubert-base |
TencentGameMate/chinese-hubert-base |
768 |
chinese-hubert-large |
TencentGameMate/chinese-hubert-large |
1024 |
chinese-wav2vec2-base |
TencentGameMate/chinese-wav2vec2-base |
768 |
chinese-wav2vec2-large |
TencentGameMate/chinese-wav2vec2-large |
1024 |
wav2vec2-chinese-xlsr |
jonatasgrosman/wav2vec2-large-xlsr-53-chinese-zh-cn |
1024 |
- Pretrained dependency: indirectly depends on upstream
InsightFace buffalo_loutputs (face_meta) - Extraction method: quality statistics computed from
face_meta.parquet sequence.npz:features:(T, 4)feature_names = [quality_score, blur_score, brightness, det_score]
- 4-D mapping:
- Dimension 0:
quality_score, overall quality score - Dimension 1:
blur_score, blur/sharpness score - Dimension 2:
brightness - Dimension 3:
det_score, face detection confidence
- Dimension 0:
- Main
pooled.jsonfields:total_framesdetected_framesdetection_ratevalid_framesvalid_ratiois_low_qualityblur_mean,blur_std,blur_min,blur_maxbrightness_mean,brightness_stdquality_mean,quality_stddet_score_mean,det_score_stdface_area_ratio_meannum_selected_frames
- Pretrained dependency: indirectly depends on 5-point landmarks from upstream
InsightFace buffalo_l - Extraction method: geometric approximation based on 5-point landmarks
sequence.npz:features:(T, 5)feature_names = [yaw, pitch, roll, ear_mean, mar]
- 5-D mapping:
- Dimension 0:
yaw, left-right head rotation - Dimension 1:
pitch, up-down head motion - Dimension 2:
roll, head tilt - Dimension 3:
ear_mean, mean EAR of both eyes, approximately reflecting eye openness - Dimension 4:
mar, mouth opening ratio
- Dimension 0:
pooledstatistics:mean/std/min/maxare computed for each ofyaw/pitch/roll/ear_mean/mar- Plus
valid_ratio - Total dimensionality:
5*4 + 1 = 21
- Pretrained dependency: indirectly depends on upstream
InsightFace buffalo_loutputs (face_meta) - Extraction method: behavior statistics based on
ear / mar / yaw / pitch / quality_score sequence.npz:features:(T, 5)
- 5-D mapping:
- Dimension 0:
ear - Dimension 1:
mar - Dimension 2:
yaw - Dimension 3:
pitch - Dimension 4:
quality_score
- Dimension 0:
pooled.parquetstatistical fields:blink_countblink_rate_per_minavg_blink_duration_framesmouth_open_ratiomouth_movement_stdspeech_activity_ratiogaze_stability_scoreyaw_rangepitch_rangesaccade_countexpression_variabilityexpression_change_count
- Total dimensionality:
12
- Pretrained model: no
- Extraction method: align and aggregate audio
vadonto the video timeline sequence.npz:features:(T, 4)feature_names = [speech_prob, speech_activity, local_speech_ratio, speech_transition]
- 4-D mapping:
- Dimension 0:
speech_prob, aligned speech probability/intensity - Dimension 1:
speech_activity, binary speech activity - Dimension 2:
local_speech_ratio, local-window speech ratio - Dimension 3:
speech_transition, frame-to-frame speech state transition intensity
- Dimension 0:
pooled.parquetstatistical fields:speech_ratioavg_speech_probspeech_transitionssilence_ratiolocal_speech_ratio_meanlocal_speech_ratio_std
- Pretrained model:
MediaPipe PoseLandmarker- Preferred:
pose_landmarker_full.task - Fallback:
pose_landmarker_lite.task
- Preferred:
sequence.npz:features:(T, 27)landmark_names = [nose, left_shoulder, right_shoulder, left_elbow, right_elbow, left_wrist, right_wrist, left_hip, right_hip]
- 27-D mapping:
- Each landmark outputs 3 dimensions:
(x, y, visibility) - There are 9 upper-body landmarks, so total dimensionality is
27 = 9 * 3
- Each landmark outputs 3 dimensions:
- Flattened order:
nose_x, nose_y, nose_visibilityleft_shoulder_x, left_shoulder_y, left_shoulder_visibilityright_shoulder_x, right_shoulder_y, right_shoulder_visibilityleft_elbow_x, left_elbow_y, left_elbow_visibilityright_elbow_x, right_elbow_y, right_elbow_visibilityleft_wrist_x, left_wrist_y, left_wrist_visibilityright_wrist_x, right_wrist_y, right_wrist_visibilityleft_hip_x, left_hip_y, left_hip_visibilityright_hip_x, right_hip_y, right_hip_visibility
- Main
pooled.jsonfields:num_framesnum_valid_framesvalid_ratiolandmarks_mean: 27 dimensionslandmarks_std: 27 dimensions
- Pretrained model: no
- Extraction method: OpenCV Farneback optical flow + frame differencing
sequence.npz:features:(T, 4)feature_names = [flow_mag_mean, flow_mag_std, flow_angle_mean, frame_diff_mean]
- 4-D mapping:
- Dimension 0:
flow_mag_mean, mean optical-flow magnitude - Dimension 1:
flow_mag_std, std of optical-flow magnitude - Dimension 2:
flow_angle_mean, mean optical-flow direction - Dimension 3:
frame_diff_mean, mean pixel difference between adjacent frames
- Dimension 0:
- Main
pooled.jsonfields:num_framesflow_magnitude_meanflow_magnitude_stdflow_magnitude_maxframe_diff_meanframe_diff_maxmotion_energy
- Pretrained model: yes
- Extraction method: aligned face images are fed into a pretrained vision model;
pooler_outputorCLS tokenis used sequence.npz:features:(T, D)timestamps_ms:(T,)valid_mask:(T,)embed_dim: scalarmodel_name: scalar
- Per-frame semantics:
- Each frame is a
D-dimensional high-level visual representation vector encoding face appearance, pose, texture, and expression-related patterns. It does not correspond to a single handcrafted geometric variable.
- Each frame is a
pooledstatistics:mean/std/p10/p50/p90are computed for each embedding dimension- Total dimensionality:
5 * D - Column naming pattern:
embed_0000_mean ... embed_(D-1)_p90
Supported models and dimensions:
| model_tag | HuggingFace / model identifier | Per-frame dimension |
|---|---|---|
dinov2-small |
facebook/dinov2-small |
384 |
dinov2-base |
facebook/dinov2-base |
768 |
dinov2-large |
facebook/dinov2-large |
1024 |
vit-mae-base |
facebook/vit-mae-base |
768 |
vit-base-patch16-224 |
google/vit-base-patch16-224 |
768 |
siglip-base-patch16-224 |
google/siglip-base-patch16-224 |
768 |
siglip-so400m-patch14-384 |
google/siglip-so400m-patch14-384 |
1152 |
clip-vit-base-patch32 |
openai/clip-vit-base-patch32 |
768 |
clip-vit-large-patch14 |
openai/clip-vit-large-patch14 |
1024 |