@@ -92,17 +92,25 @@ def _process_string(string_tensor):
9292
9393def reformat_prompt (example , column , image_placeholder , model_name ):
9494 """reformat prompt for multimodal SFT"""
95- if isinstance (example ["images" ], list ):
96- num_images = len (example ["images" ])
95+ if isinstance (example ["images" ], str ):
96+ example [column ] = mm_processor .reformat_prompt (
97+ example [column ], image_placeholder , model_name , num_images = 0 , video_placeholder = image_placeholder , num_videos = 1
98+ )
9799 else :
98- num_images = 1
99- example [column ] = mm_processor .reformat_prompt (example [column ], image_placeholder , model_name , num_images )
100+ if isinstance (example ["images" ], list ):
101+ num_images = len (example ["images" ])
102+ else :
103+ num_images = 1
104+ example [column ] = mm_processor .reformat_prompt (example [column ], image_placeholder , model_name , num_images )
100105 return example
101106
102107
103108def reformat_response (example , column , model_name ):
104109 """reformat response for multimodal SFT"""
105- example [column ] = mm_processor .reformat_response (example [column ][0 ], model_name )
110+ val = example [column ]
111+ if isinstance (val , (list , tuple )) and len (val ) > 0 :
112+ val = val [0 ]
113+ example [column ] = mm_processor .reformat_response (val , model_name )
106114 return example
107115
108116
@@ -120,9 +128,17 @@ def merge_image_columns(example, image_columns, max_num_images_per_example):
120128
121129
122130def pre_process_image_sft (example , image_column , config ):
123- """pre-process image for multimodal SFT"""
131+ """pre-process image or video for multimodal SFT"""
124132
125133 def _process_image_fn (image ):
134+ if isinstance (image , str ):
135+ import os
136+
137+ video_directory = getattr (config , "video_directory" , "" )
138+ if video_directory :
139+ image = os .path .join (video_directory , image )
140+ return mm_processor .preprocess_image_for_training (image , config )
141+
126142 if isinstance (image , list ):
127143 image = [np .array (mm_utils .convert_to_RGB (img )) for img in image ]
128144 else :
@@ -131,7 +147,7 @@ def _process_image_fn(image):
131147 image = mm_processor .preprocess_image_for_training (image , config )
132148 return image
133149
134- example [image_column ] = _process_image_fn (example [image_column ])
150+ example [image_column ] = _process_image_fn (example [image_column ]) if example . get ( image_column ) is not None else None
135151 return example
136152
137153
@@ -702,12 +718,12 @@ def _pad_image_and_mask(self, preprocessed_image: mm_utils.PreprocessorOutput) -
702718 if not isinstance (preprocessed_image , mm_utils .PreprocessorOutput ):
703719 raise TypeError (f"Input must be multimodal_utils.PreprocessorOutput, but got { type (preprocessed_image )} " )
704720
705- if preprocessed_image .pixel_values is None :
706- raise ValueError ("Input preprocessed_image must have pixel_values to pad images." )
707-
708721 if self .config .model_name and self .config .model_name .startswith ("qwen3-omni" ):
709722 return preprocessed_image
710723
724+ if preprocessed_image .pixel_values is None :
725+ raise ValueError ("Input preprocessed_image must have pixel_values to pad images." )
726+
711727 # Determine the maximum number of images/masks allowed.
712728 image_offsets = mm_processor .get_image_offsets (self .config , preprocessed_image )
713729 single_image_offset = image_offsets // preprocessed_image .pixel_values .shape [0 ]
0 commit comments