IdlecloudX commited on
Commit
800b58e
·
verified ·
1 Parent(s): fdb4d5a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +20 -27
app.py CHANGED
@@ -102,18 +102,14 @@ class Tagger:
102
  tag_categories_for_translation["character"].append(tag_name)
103
 
104
 
105
- # Sort general tags by score
106
  res["general"] = dict(sorted(res["general"].items(), key=lambda kv: kv[1], reverse=True))
107
- # Sort character tags by score (optional, but good for consistency)
108
  res["characters"] = dict(sorted(res["characters"].items(), key=lambda kv: kv[1], reverse=True))
109
- # Ratings are usually fixed, but sorting doesn't hurt if order matters for display
110
  res["ratings"] = dict(sorted(res["ratings"].items(), key=lambda kv: kv[1], reverse=True))
111
 
112
 
113
- # Re-populate tag_categories_for_translation based on sorted and filtered results
114
  tag_categories_for_translation["general"] = list(res["general"].keys())
115
  tag_categories_for_translation["characters"] = list(res["characters"].keys())
116
- tag_categories_for_translation["ratings"] = list(res["ratings"].keys()) # Order from sorted res
117
 
118
  return res, tag_categories_for_translation
119
 
@@ -202,7 +198,6 @@ with gr.Blocks(theme=gr.themes.Soft(), title="AI 图像标签分析器", css=cus
202
  gr.Markdown("# 🖼️ AI 图像标签分析器")
203
  gr.Markdown("上传图片自动识别标签,支持中英文显示和一键复制。")
204
 
205
- # State variables to store results for re-processing summary without re-running model
206
  state_res = gr.State({})
207
  state_translations_dict = gr.State({})
208
  state_tag_categories_for_translation = gr.State({})
@@ -255,7 +250,7 @@ with gr.Blocks(theme=gr.themes.Soft(), title="AI 图像标签分析器", css=cus
255
 
256
  html = '<div class="label-container">'
257
 
258
- if not isinstance(translations_list, list): # defensive check
259
  translations_list = []
260
 
261
  tag_keys = list(tags_dict.keys())
@@ -320,15 +315,15 @@ with gr.Blocks(theme=gr.themes.Soft(), title="AI 图像标签分析器", css=cus
320
  # ----------------- 主要处理回调 -----------------
321
  def process_image_and_generate_outputs(
322
  img, g_th, c_th, s_scores, # Main inputs
323
- s_gen, s_char, s_rat, s_sep, s_zh_in_sum # Summary controls from UI
324
  ):
325
  if img is None:
326
  yield (
327
  gr.update(interactive=True, value="🚀 开始分析"),
328
  gr.update(visible=True, value="❌ 请先上传图片。"),
329
- "", "", "", "", # HTML outputs
330
- gr.update(placeholder="请先上传图片并开始分析..."), # Summary text
331
- {}, {}, {} # States
332
  )
333
  return
334
 
@@ -354,7 +349,6 @@ with gr.Blocks(theme=gr.themes.Soft(), title="AI 图像标签分析器", css=cus
354
 
355
  try:
356
  # 1. Predict tags
357
- # The predict method now returns res and tag_categories_for_translation
358
  res, tag_categories_original_order = tagger_instance.predict(img, g_th, c_th)
359
 
360
  all_tags_to_translate = []
@@ -362,7 +356,7 @@ with gr.Blocks(theme=gr.themes.Soft(), title="AI 图像标签分析器", css=cus
362
  all_tags_to_translate.extend(tag_categories_original_order.get(cat_key, []))
363
 
364
  all_translations_flat = []
365
- if all_tags_to_translate: # Only call translate if there's something to translate
366
  all_translations_flat = translate_texts(all_tags_to_translate, src_lang="auto", tgt_lang="zh")
367
 
368
  current_translations_dict = {}
@@ -382,19 +376,19 @@ with gr.Blocks(theme=gr.themes.Soft(), title="AI 图像标签分析器", css=cus
382
 
383
  summary_text = generate_summary_text_content(
384
  res, current_translations_dict,
385
- s_gen, s_char, s_rat, s_sep, s_zh_in_sum # Use summary specific checkbox for zh
386
  )
387
 
388
  yield (
389
  gr.update(interactive=True, value="🚀 开始分析"),
390
- gr.update(visible=True, value="✅ 分析完成!"), # Success message
391
  general_html,
392
  char_html,
393
  rating_html,
394
  gr.update(value=summary_text),
395
- res, # Store full results in state
396
- current_translations_dict, # Store translations in state
397
- tag_categories_original_order # Store original order for consistency if needed
398
  )
399
 
400
  except Exception as e:
@@ -404,17 +398,17 @@ with gr.Blocks(theme=gr.themes.Soft(), title="AI 图像标���分析器", css=cus
404
  yield (
405
  gr.update(interactive=True, value="🚀 开始分析"),
406
  gr.update(visible=True, value=f"❌ 处理失败: {str(e)}"),
407
- "<p>处理出错</p>", "<p>处理出错</p>", "<p>处理出错</p>", # Clear HTML
408
- gr.update(value=f"错误: {str(e)}", placeholder="分析失败..."), # Update summary
409
- {}, {}, {} # Clear states
410
  )
411
 
412
  # ----------------- 更新汇总文本的回调 -----------------
413
  def update_summary_display(
414
- s_gen, s_char, s_rat, s_sep, s_zh_in_sum, # UI controls for summary
415
- current_res_from_state, current_translations_from_state # Data from state
416
  ):
417
- if not current_res_from_state: # No analysis done yet
418
  return gr.update(placeholder="请先完成一次图像分析以生成汇总。", value="")
419
 
420
  new_summary_text = generate_summary_text_content(
@@ -428,7 +422,7 @@ with gr.Blocks(theme=gr.themes.Soft(), title="AI 图像标签分析器", css=cus
428
  process_image_and_generate_outputs,
429
  inputs=[
430
  img_in, gen_slider, char_slider, show_tag_scores,
431
- sum_general, sum_char, sum_rating, sum_sep, sum_show_zh # Pass summary controls directly
432
  ],
433
  outputs=[
434
  btn, processing_info,
@@ -439,12 +433,11 @@ with gr.Blocks(theme=gr.themes.Soft(), title="AI 图像标签分析器", css=cus
439
  # show_progress="full" # Gradio's built-in progress
440
  )
441
 
442
- # Bind summary update controls to the update_summary_display function
443
  summary_controls = [sum_general, sum_char, sum_rating, sum_sep, sum_show_zh]
444
  for ctrl in summary_controls:
445
  ctrl.change(
446
  fn=update_summary_display,
447
- inputs=summary_controls + [state_res, state_translations_dict], # All controls + state data
448
  outputs=[out_summary],
449
  # show_progress=False # Typically fast, no need for progress indicator
450
  )
 
102
  tag_categories_for_translation["character"].append(tag_name)
103
 
104
 
 
105
  res["general"] = dict(sorted(res["general"].items(), key=lambda kv: kv[1], reverse=True))
 
106
  res["characters"] = dict(sorted(res["characters"].items(), key=lambda kv: kv[1], reverse=True))
 
107
  res["ratings"] = dict(sorted(res["ratings"].items(), key=lambda kv: kv[1], reverse=True))
108
 
109
 
 
110
  tag_categories_for_translation["general"] = list(res["general"].keys())
111
  tag_categories_for_translation["characters"] = list(res["characters"].keys())
112
+ tag_categories_for_translation["ratings"] = list(res["ratings"].keys())
113
 
114
  return res, tag_categories_for_translation
115
 
 
198
  gr.Markdown("# 🖼️ AI 图像标签分析器")
199
  gr.Markdown("上传图片自动识别标签,支持中英文显示和一键复制。")
200
 
 
201
  state_res = gr.State({})
202
  state_translations_dict = gr.State({})
203
  state_tag_categories_for_translation = gr.State({})
 
250
 
251
  html = '<div class="label-container">'
252
 
253
+ if not isinstance(translations_list, list):
254
  translations_list = []
255
 
256
  tag_keys = list(tags_dict.keys())
 
315
  # ----------------- 主要处理回调 -----------------
316
  def process_image_and_generate_outputs(
317
  img, g_th, c_th, s_scores, # Main inputs
318
+ s_gen, s_char, s_rat, s_sep, s_zh_in_sum
319
  ):
320
  if img is None:
321
  yield (
322
  gr.update(interactive=True, value="🚀 开始分析"),
323
  gr.update(visible=True, value="❌ 请先上传图片。"),
324
+ "", "", "", "",
325
+ gr.update(placeholder="请先上传图片并开始分析..."),
326
+ {}, {}, {}
327
  )
328
  return
329
 
 
349
 
350
  try:
351
  # 1. Predict tags
 
352
  res, tag_categories_original_order = tagger_instance.predict(img, g_th, c_th)
353
 
354
  all_tags_to_translate = []
 
356
  all_tags_to_translate.extend(tag_categories_original_order.get(cat_key, []))
357
 
358
  all_translations_flat = []
359
+ if all_tags_to_translate:
360
  all_translations_flat = translate_texts(all_tags_to_translate, src_lang="auto", tgt_lang="zh")
361
 
362
  current_translations_dict = {}
 
376
 
377
  summary_text = generate_summary_text_content(
378
  res, current_translations_dict,
379
+ s_gen, s_char, s_rat, s_sep, s_zh_in_sum
380
  )
381
 
382
  yield (
383
  gr.update(interactive=True, value="🚀 开始分析"),
384
+ gr.update(visible=True, value="✅ 分析完成!"),
385
  general_html,
386
  char_html,
387
  rating_html,
388
  gr.update(value=summary_text),
389
+ res,
390
+ current_translations_dict,
391
+ tag_categories_original_order
392
  )
393
 
394
  except Exception as e:
 
398
  yield (
399
  gr.update(interactive=True, value="🚀 开始分析"),
400
  gr.update(visible=True, value=f"❌ 处理失败: {str(e)}"),
401
+ "<p>处理出错</p>", "<p>处理出错</p>", "<p>处理出错</p>",
402
+ gr.update(value=f"错误: {str(e)}", placeholder="分析失败..."),
403
+ {}, {}, {}
404
  )
405
 
406
  # ----------------- 更新汇总文本的回调 -----------------
407
  def update_summary_display(
408
+ s_gen, s_char, s_rat, s_sep, s_zh_in_sum,
409
+ current_res_from_state, current_translations_from_state
410
  ):
411
+ if not current_res_from_state:
412
  return gr.update(placeholder="请先完成一次图像分析以生成汇总。", value="")
413
 
414
  new_summary_text = generate_summary_text_content(
 
422
  process_image_and_generate_outputs,
423
  inputs=[
424
  img_in, gen_slider, char_slider, show_tag_scores,
425
+ sum_general, sum_char, sum_rating, sum_sep, sum_show_zh
426
  ],
427
  outputs=[
428
  btn, processing_info,
 
433
  # show_progress="full" # Gradio's built-in progress
434
  )
435
 
 
436
  summary_controls = [sum_general, sum_char, sum_rating, sum_sep, sum_show_zh]
437
  for ctrl in summary_controls:
438
  ctrl.change(
439
  fn=update_summary_display,
440
+ inputs=summary_controls + [state_res, state_translations_dict],
441
  outputs=[out_summary],
442
  # show_progress=False # Typically fast, no need for progress indicator
443
  )