[AI Tagger] Add better backwards compatibility from csv era (#342)

* add better backwards compatibility with scenes tagged in the csv era

* fix typo
This commit is contained in:
skier233 2024-06-21 02:33:33 -04:00 committed by GitHub
parent f9a437025f
commit 40a9bbbdbd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 65 additions and 45 deletions

View File

@ -200,14 +200,34 @@ async def __tag_scene(scene):
log.error(f"Failed to load AI results from file: {e}")
elif os.path.exists(os.path.join(os.path.dirname(scenePath), os.path.splitext(os.path.basename(scenePath))[0] + f"__vid_giddy__1.0.csv")):
ai_video_result = AIVideoResult.from_csv_file(os.path.join(os.path.dirname(scenePath), os.path.splitext(os.path.basename(scenePath))[0] + f"__vid_giddy__1.0.csv"), scene_id=sceneId, phash=phash, duration=duration)
log.info(f"Loading AI results from CSV file for scene {scenePath}: {ai_video_result}")
log.info(f"Loading AI results from CSV file for scene {scenePath}")
current_pipeline_video = await ai_server.get_current_video_pipeline()
if ai_video_result.already_contains_model(current_pipeline_video):
log.info(f"Skipping running AI for scene {scenePath} as it has already been processed with the same pipeline version and configuration. Updating tags and markers instead.")
ai_video_result.to_json_file(ai_file_path)
ai_video_result.update_stash_tags()
ai_video_result.update_stash_markers()
return
log.info(f"Skipping running AI for scene {scenePath} as it has already been processed with the same pipeline version and configuration. Updating tags and markers instead.")
ai_video_result.to_json_file(ai_file_path)
ai_video_result.update_stash_tags()
ai_video_result.update_stash_markers()
return
elif os.path.exists(os.path.join(os.path.dirname(scenePath), os.path.splitext(os.path.basename(scenePath))[0] + f"__actiondetection__1.0.csv")):
ai_video_result = AIVideoResult.from_csv_file(os.path.join(os.path.dirname(scenePath), os.path.splitext(os.path.basename(scenePath))[0] + f"__actiondetection__1.0.csv"), scene_id=sceneId, phash=phash, duration=duration, version=1.0)
log.info(f"Loading AI results from CSV file for scene {scenePath}")
current_pipeline_video = await ai_server.get_current_video_pipeline()
if ai_video_result.already_contains_model(current_pipeline_video):
log.info(f"Skipping running AI for scene {scenePath} as it has already been processed with the same pipeline version and configuration. Updating tags and markers instead.")
ai_video_result.to_json_file(ai_file_path)
ai_video_result.update_stash_tags()
ai_video_result.update_stash_markers()
return
elif os.path.exists(os.path.join(os.path.dirname(scenePath), os.path.splitext(os.path.basename(scenePath))[0] + f"__actiondetection__2.0.csv")):
ai_video_result = AIVideoResult.from_csv_file(os.path.join(os.path.dirname(scenePath), os.path.splitext(os.path.basename(scenePath))[0] + f"__actiondetection__2.0.csv"), scene_id=sceneId, phash=phash, duration=duration, version=2.0)
log.info(f"Loading AI results from CSV file for scene {scenePath}")
current_pipeline_video = await ai_server.get_current_video_pipeline()
if ai_video_result.already_contains_model(current_pipeline_video):
log.info(f"Skipping running AI for scene {scenePath} as it has already been processed with the same pipeline version and configuration. Updating tags and markers instead.")
ai_video_result.to_json_file(ai_file_path)
ai_video_result.update_stash_tags()
ai_video_result.update_stash_markers()
return
else:
log.warning(f"Scene {scenePath} is already tagged but has no AI results file. Running AI again.")
vr_video = media_handler.is_vr_scene(scene.get('tags'))

View File

@ -112,7 +112,7 @@ class AIVideoResult(BaseModel):
last_time_frame.end = time_frame.end or time_frame.start
else:
merged_time_frames.append(deepcopy(time_frame))
merged_time_frames = [tf for tf in merged_time_frames if (tf.end or tf.start) - tf.start + frame_interval >= min_duration]
merged_time_frames = [tf for tf in merged_time_frames if (tf.end - tf.start + frame_interval if tf.end else frame_interval) >= min_duration]
media_handler.add_markers_to_video(self.video_metadata.video_id, tag_id, tag_name, merged_time_frames)
def already_contains_model(self, model_config):
@ -171,7 +171,7 @@ class AIVideoResult(BaseModel):
return cls.model_validate_json(f.read())
@classmethod
def from_csv_file(cls, csv_file, scene_id, phash, duration):
def from_csv_file(cls, csv_file, scene_id, phash, duration, version=1.0):
server_results = []
frame_interval = None
last_frame_index = None
@ -187,6 +187,6 @@ class AIVideoResult(BaseModel):
server_results.append({"frame_index": frame_index, "actions": [(tag_name, 1.0)]})
last_frame_index = frame_index
tags = cls.__mutate_server_result_tags(server_results, "actiondetection", frame_interval)
model_info = ModelInfo(version=1.0, ai_model_config=ModelConfig(frame_interval=frame_interval, threshold=0.3))
model_info = ModelInfo(version=version, ai_model_config=ModelConfig(frame_interval=frame_interval, threshold=0.3))
video_metadata = VideoMetadata(video_id=scene_id, phash=phash, models={"actiondetection" : model_info}, duration=duration)
return cls(video_metadata=video_metadata, tags=tags)

View File

@ -1,37 +1,37 @@
ServerTag,StashTag,MinMarkerDuration,MaxGap,RequiredDuration,TagThreshold
69,69_AI,5,2,20s,0.5
Anal Fucking,Anal Fucking_AI,5,2,20s,0.5
Ass Licking,Ass Licking_AI,5,2,20s,0.5
Ass Penetration,Ass Penetration_AI,5,2,20s,0.5
Ball Licking/Sucking,Ball Licking/Sucking_AI,2,2,20s,0.5
Blowjob,Blowjob_AI,5,2,20s,0.5
Cum on Person,Cum on Person_AI,3,2,15s,0.5
Cum Swapping,Cum Swapping_AI,2,2,15s,0.5
Cumshot,Cumshot_AI,1,2,10s,0.5
Deepthroat,Deepthroat_AI,1,2,20s,0.5
Double Penetration,Double Penetration_AI,5,2,20s,0.5
Fingering,Fingering_AI,5,2,20s,0.5
Fisting,Fisting_AI,3,2,20s,0.5
Footjob,Footjob_AI,3,2,20s,0.5
Gangbang,Gangbang_AI,5,2,20s,0.5
Gloryhole,Gloryhole_AI,5,2,20s,0.5
Grabbing Ass,Grabbing Ass_AI,5,2,20s,0.5
Grabbing Boobs,Grabbing Boobs_AI,5,2,20s,0.5
Grabbing Hair/Head,Grabbing Hair/Head_AI,5,2,20s,0.5
Handjob,Handjob_AI,5,2,20s,0.5
Kissing,Kissing_AI,5,2,20s,0.5
Licking Penis,Licking Penis_AI,2,2,20s,0.5
Masturbation,Masturbation_AI,5,2,20s,0.5
Pissing,Pissing_AI,2,2,20s,0.5
Pussy Licking (Clearly Visible),Pussy Licking (Clearly Visible)_AI,5,2,20s,0.5
Pussy Licking,Pussy Licking_AI,3,2,20s,0.5
Pussy Rubbing,Pussy Rubbing_AI,5,2,20s,0.5
Sucking Fingers,Sucking Fingers_AI,1,2,20s,0.5
Sucking Toy/Dildo,Sucking Toy/Dildo_AI,1,2,20s,0.5
Wet (Genitals),Wet (Genitals)_AI,3,2,20s,0.5
Titjob,Titjob_AI,5,2,20s,0.5
Tribbing/Scissoring,Tribbing/Scissoring_AI,3,2,20s,0.5
Undressing,Undressing_AI,3,2,20s,0.5
Vaginal Penetration,Vaginal Penetration_AI,5,2,20s,0.5
Vaginal Fucking,Vaginal Fucking_AI,5,2,20s,0.5
Vibrating,Vibrating_AI,5,2,20s,0.5
69,69_AI,15,6,20s,0.5
Anal Fucking,Anal Fucking_AI,15,6,20s,0.5
Ass Licking,Ass Licking_AI,15,6,20s,0.5
Ass Penetration,Ass Penetration_AI,15,6,20s,0.5
Ball Licking/Sucking,Ball Licking/Sucking_AI,5,4,20s,0.5
Blowjob,Blowjob_AI,15,6,20s,0.5
Cum on Person,Cum on Person_AI,5,4,15s,0.5
Cum Swapping,Cum Swapping_AI,5,4,15s,0.5
Cumshot,Cumshot_AI,4,4,10s,0.5
Deepthroat,Deepthroat_AI,5,4,20s,0.5
Double Penetration,Double Penetration_AI,10,4,20s,0.5
Fingering,Fingering_AI,15,6,20s,0.5
Fisting,Fisting_AI,15,6,20s,0.5
Footjob,Footjob_AI,15,6,20s,0.5
Gangbang,Gangbang_AI,15,6,20s,0.5
Gloryhole,Gloryhole_AI,15,8,20s,0.5
Grabbing Ass,Grabbing Ass_AI,10,8,20s,0.5
Grabbing Boobs,Grabbing Boobs_AI,6,6,20s,0.5
Grabbing Hair/Head,Grabbing Hair/Head_AI,6,6,20s,0.5
Handjob,Handjob_AI,15,6,20s,0.5
Kissing,Kissing_AI,10,4,20s,0.5
Licking Penis,Licking Penis_AI,6,4,20s,0.5
Masturbation,Masturbation_AI,15,10,20s,0.5
Pissing,Pissing_AI,5,4,20s,0.5
Pussy Licking (Clearly Visible),Pussy Licking (Clearly Visible)_AI,10,4,20s,0.5
Pussy Licking,Pussy Licking_AI,15,6,20s,0.5
Pussy Rubbing,Pussy Rubbing_AI,15,6,20s,0.5
Sucking Fingers,Sucking Fingers_AI,5,4,20s,0.5
Sucking Toy/Dildo,Sucking Toy/Dildo_AI,5,4,20s,0.5
Wet (Genitals),Wet (Genitals)_AI,15,6,20s,0.5
Titjob,Titjob_AI,10,4,20s,0.5
Tribbing/Scissoring,Tribbing/Scissoring_AI,15,6,20s,0.5
Undressing,Undressing_AI,15,6,20s,0.5
Vaginal Penetration,Vaginal Penetration_AI,15,6,20s,0.5
Vaginal Fucking,Vaginal Fucking_AI,15,6,20s,0.5
Vibrating,Vibrating_AI,10,6,20s,0.5

1 ServerTag StashTag MinMarkerDuration MaxGap RequiredDuration TagThreshold
2 69 69_AI 5 15 2 6 20s 0.5
3 Anal Fucking Anal Fucking_AI 5 15 2 6 20s 0.5
4 Ass Licking Ass Licking_AI 5 15 2 6 20s 0.5
5 Ass Penetration Ass Penetration_AI 5 15 2 6 20s 0.5
6 Ball Licking/Sucking Ball Licking/Sucking_AI 2 5 2 4 20s 0.5
7 Blowjob Blowjob_AI 5 15 2 6 20s 0.5
8 Cum on Person Cum on Person_AI 3 5 2 4 15s 0.5
9 Cum Swapping Cum Swapping_AI 2 5 2 4 15s 0.5
10 Cumshot Cumshot_AI 1 4 2 4 10s 0.5
11 Deepthroat Deepthroat_AI 1 5 2 4 20s 0.5
12 Double Penetration Double Penetration_AI 5 10 2 4 20s 0.5
13 Fingering Fingering_AI 5 15 2 6 20s 0.5
14 Fisting Fisting_AI 3 15 2 6 20s 0.5
15 Footjob Footjob_AI 3 15 2 6 20s 0.5
16 Gangbang Gangbang_AI 5 15 2 6 20s 0.5
17 Gloryhole Gloryhole_AI 5 15 2 8 20s 0.5
18 Grabbing Ass Grabbing Ass_AI 5 10 2 8 20s 0.5
19 Grabbing Boobs Grabbing Boobs_AI 5 6 2 6 20s 0.5
20 Grabbing Hair/Head Grabbing Hair/Head_AI 5 6 2 6 20s 0.5
21 Handjob Handjob_AI 5 15 2 6 20s 0.5
22 Kissing Kissing_AI 5 10 2 4 20s 0.5
23 Licking Penis Licking Penis_AI 2 6 2 4 20s 0.5
24 Masturbation Masturbation_AI 5 15 2 10 20s 0.5
25 Pissing Pissing_AI 2 5 2 4 20s 0.5
26 Pussy Licking (Clearly Visible) Pussy Licking (Clearly Visible)_AI 5 10 2 4 20s 0.5
27 Pussy Licking Pussy Licking_AI 3 15 2 6 20s 0.5
28 Pussy Rubbing Pussy Rubbing_AI 5 15 2 6 20s 0.5
29 Sucking Fingers Sucking Fingers_AI 1 5 2 4 20s 0.5
30 Sucking Toy/Dildo Sucking Toy/Dildo_AI 1 5 2 4 20s 0.5
31 Wet (Genitals) Wet (Genitals)_AI 3 15 2 6 20s 0.5
32 Titjob Titjob_AI 5 10 2 4 20s 0.5
33 Tribbing/Scissoring Tribbing/Scissoring_AI 3 15 2 6 20s 0.5
34 Undressing Undressing_AI 3 15 2 6 20s 0.5
35 Vaginal Penetration Vaginal Penetration_AI 5 15 2 6 20s 0.5
36 Vaginal Fucking Vaginal Fucking_AI 5 15 2 6 20s 0.5
37 Vibrating Vibrating_AI 5 10 2 6 20s 0.5