From 64ccd54c9cd81702e11b2940e1f748152ef4d0cc Mon Sep 17 00:00:00 2001
From: Infstellar <2644641825@qq.com>
Date: Fri, 21 Feb 2025 22:30:14 +0800
Subject: [PATCH 1/9] feat: upload images & AUTO labeling!
---
.gitignore | 3 +-
README.md | 2 +
app.py | 2 +-
pages/images_manager.py | 79 ++++++++++++++++++++++++++++++++++++++++
pages/label_images.py | 34 ++++++-----------
pages/utils.py | 20 +++++++++-
services/image_search.py | 39 ++++++++++++--------
services/label_memes.py | 41 ++++++++++++++-------
8 files changed, 164 insertions(+), 56 deletions(-)
create mode 100644 pages/images_manager.py
diff --git a/.gitignore b/.gitignore
index 6f2fce4..93d0353 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,4 +5,5 @@
.env
.env.*
!.env.example
-config/config.yaml
\ No newline at end of file
+config/config.yaml
+cache/
\ No newline at end of file
diff --git a/README.md b/README.md
index 6eae97e..6ec1c2b 100644
--- a/README.md
+++ b/README.md
@@ -42,6 +42,8 @@ pic_example:
选择 `label images` 页面,选择图片文件夹,点击 `使用VLM生成描述` ,选择需要的描述后重命名文件即可。
+程序使用文件名生成embedding用于检索。如果你希望给一个图片多个embedding,你可以在文件名中使用`-`分隔。
+
## Demo
diff --git a/app.py b/app.py
index f053d0e..c45cdbd 100644
--- a/app.py
+++ b/app.py
@@ -4,5 +4,5 @@ import yaml
from services.image_search import ImageSearch
from config.settings import config, reload_config
-pg = st.navigation([st.Page("pages/VVQuest.py"), st.Page("pages/label_images.py")])
+pg = st.navigation([st.Page("pages/VVQuest.py"), st.Page("pages/label_images.py"), st.Page("pages/images_manager.py")])
pg.run()
\ No newline at end of file
diff --git a/pages/images_manager.py b/pages/images_manager.py
new file mode 100644
index 0000000..1288959
--- /dev/null
+++ b/pages/images_manager.py
@@ -0,0 +1,79 @@
+import datetime
+import os
+import shutil
+import time
+
+import numpy as np
+import streamlit as st
+import random
+import yaml
+from PIL import Image
+import threading
+
+from services.image_search import ImageSearch
+from config.settings import config, reload_config
+from pages.utils import *
+from services.label_memes import LabelMemes
+from services.utils import verify_folder
+
+if 'label_meme_obj' not in st.session_state:
+ st.session_state.label_meme_obj = LabelMemes()
+if 'image_folder_name' not in st.session_state:
+ st.session_state.image_folder_name = 'data/images' # 默认使用原始图片目录
+
+with st.sidebar:
+ st.selectbox(
+ '选择图片文件夹',
+ options=get_image_dirs(),
+ key='image_folder_name',
+ help='选择导入后的图片文件夹'
+ )
+
+ st.checkbox(
+ '使用VLM自动生成文件名',
+ key='auto_generate_labels',
+ value=True
+ )
+
+ uploaded_images = st.file_uploader(label='添加表情包', accept_multiple_files=True, type=['png', 'jpg', 'jpeg', 'gif'])
+
+CACHE_PATH = os.path.join(config.base_dir, 'cache')
+verify_folder(CACHE_PATH)
+
+def label_image(image_path):
+ for i in range(15):
+ try:
+ l = st.session_state.label_meme_obj.label_image(image_path)
+ return f'{l[0]}-{l[1]}-{l[2]}-{l[3]}'
+ except Exception as e:
+ st.error(f'第{i + 1}次尝试生成描述失败, 错误信息: {e}')
+ time.sleep(1)
+ st.error('生成描述失败')
+ return False
+
+if uploaded_images:
+ show_image_area = st.empty()
+ for uploaded_image in uploaded_images:
+ try:
+ img_name = uploaded_image.name
+ except Exception as e:
+ img_name = f'{datetime.datetime.now()}.gif'
+ # 使用 PIL 打开图片并显示
+ img = Image.open(uploaded_image)
+ show_image_area.image(img, caption=uploaded_image.name, width=200)
+ cache_path = os.path.join(CACHE_PATH, f'{time.time()}.gif')
+ img.save(os.path.join(cache_path))
+ # 生成图片描述
+ if st.session_state.auto_generate_labels:
+ res = label_image(cache_path)
+ if res:
+ img_name = res + os.path.splitext(img_name)[1]
+
+ # 保存上传的图片到指定文件夹
+ save_image_path = os.path.join(st.session_state.image_folder_name,img_name )
+ if os.path.exists(save_image_path):
+ st.error(f'图片 {save_image_path} 已存在')
+ else:
+ img.save(save_image_path)
+ st.success(f'图片 {save_image_path} 已保存')
+ uploaded_images = []
\ No newline at end of file
diff --git a/pages/label_images.py b/pages/label_images.py
index 5d0a2e7..afc08d3 100644
--- a/pages/label_images.py
+++ b/pages/label_images.py
@@ -14,19 +14,7 @@ from config.settings import config, reload_config
from pages.utils import *
from services.label_memes import LabelMemes
-IMAGE_DIRS_PATH = 'data/image_dirs'
-if not os.path.exists(IMAGE_DIRS_PATH):
- os.makedirs(IMAGE_DIRS_PATH)
-# 获取image_dirs下的所有文件夹
-def get_image_dirs():
- dirs = ['data/images'] # 默认包含原始图片目录
- if os.path.exists(IMAGE_DIRS_PATH):
- for item in os.listdir(IMAGE_DIRS_PATH):
- item_path = os.path.join(IMAGE_DIRS_PATH, item)
- if os.path.isdir(item_path):
- dirs.append(item_path)
- return dirs
st.set_page_config(
page_title="LabelImages",
@@ -88,10 +76,10 @@ def pregenerate_label(img_path, label_obj:LabelMemes, result_dict):
return True
except Exception as e:
print(f'pregenerate_label failed: {str(e)}')
+ time.sleep(1)
with st.sidebar:
- # 使用selectbox替代text_input
st.selectbox(
'选择图片文件夹',
options=get_image_dirs(),
@@ -118,12 +106,12 @@ if os.path.exists(st.session_state.image_folder_name):
st.write(st.session_state.image_folder_name)
img_path = st.session_state.all_images_path[st.session_state.image_index]
- st.write(img_path)
- with Image.open(img_path) as img:
- img_obj = img.copy()
- img_obj = np.array(img_obj)
- img_obj = resize_image(img_obj, 256)
- st.image(img_obj)
+ # st.write(img_path)
+ # with Image.open(img_path) as img:
+ # img_obj = img.copy()
+ # img_obj = np.array(img_obj)
+ # img_obj = resize_image(img_obj, 256)
+ st.image(img_path, width=256)
col3, col4, col5 = st.columns([1, 1, 1])
@@ -148,15 +136,15 @@ if os.path.exists(st.session_state.image_folder_name):
def use_vlm_result_to_generate_buttons():
try:
name_list = st.session_state.img_analyse_result
- colB1, colB2, colB3 = st.columns([1, 1, 1])
- for index, i in enumerate([colB1, colB2, colB3]):
+ colB1, colB2, colB3, colB4 = st.columns([1, 1, 1, 1])
+ for index, i in enumerate([colB1, colB2, colB3, colB4]):
with i:
def create_onc(inner_index):
def onc():
st.session_state.new_file_name += name_list[inner_index]
return onc
-
- st.button(f"添加 \"{name_list[index]}\" 到文件名", on_click=create_onc(index),key=f'generate_clicked_{index}')
+ if not name_list[index] == '':
+ st.button(f"添加 \"{name_list[index]}\" 到文件名", on_click=create_onc(index),key=f'generate_clicked_{index}')
# auto mode
if st.session_state.auto_generate_labels:
diff --git a/pages/utils.py b/pages/utils.py
index e2a4365..8b35d75 100644
--- a/pages/utils.py
+++ b/pages/utils.py
@@ -1,7 +1,7 @@
import os
import cv2
-
+from config.settings import config
def get_all_file_paths(folder_path):
# 用于存储所有文件的绝对路径
@@ -24,4 +24,20 @@ def resize_image(img, max_size=1024):
new_w = int(w * scale)
new_h = int(h * scale)
return cv2.resize(img, (new_w, new_h), interpolation=cv2.INTER_AREA)
- return img
\ No newline at end of file
+ return img
+
+IMAGE_DIRS_PATH = 'data/image_dirs'
+if not os.path.exists(IMAGE_DIRS_PATH):
+ os.makedirs(IMAGE_DIRS_PATH)
+
+# 获取image_dirs下的所有文件夹
+def get_image_dirs():
+ dirs = ['data/images'] # 默认包含原始图片目录
+ if os.path.exists(IMAGE_DIRS_PATH):
+ for item in os.listdir(IMAGE_DIRS_PATH):
+ item_path = os.path.join(IMAGE_DIRS_PATH, item)
+ if os.path.isdir(item_path):
+ dirs.append(item_path)
+ for i in config.paths.image_dirs.keys():
+ dirs.append(i)
+ return dirs
\ No newline at end of file
diff --git a/services/image_search.py b/services/image_search.py
index 6877e05..3c1a77d 100644
--- a/services/image_search.py
+++ b/services/image_search.py
@@ -152,23 +152,30 @@ class ImageSearch:
break
if full_filename:
- if filepath in generated_files:
- # 使用已经存在的embedding
- embedding = self.image_data[generated_files.index(filepath)]['embedding']
- embedding_name = self.image_data[generated_files.index(filepath)]['embedding_name']
- else:
- embedding_name = filename
- if replace_patterns_regex is not None:
- for pattern, replacement in replace_patterns_regex.items():
- embedding_name = re.sub(pattern, replacement, embedding_name)
+ # if filepath in generated_files:
+ # # 使用已经存在的embedding
+ # embedding = self.image_data[generated_files.index(filepath)]['embedding']
+ # embedding_name = self.image_data[generated_files.index(filepath)]['embedding_name']
+ # else:
+
+ # 在service那边已经有缓存了,这边直接开干,同时也是为了适配一个图片多个embedding。
+ raw_embedding_name = filename
+ if replace_patterns_regex is not None:
+ for pattern, replacement in replace_patterns_regex.items():
+ raw_embedding_name = re.sub(pattern, replacement, raw_embedding_name)
+ embedding_names = raw_embedding_name.split('-')
+ for embedding_name in embedding_names:
+ if embedding_name == '':
+ print()
+ continue
embedding = self.embedding_service.get_embedding(embedding_name)
- embeddings.append({
- "filename": full_filename,
- "filepath": filepath,
- "embedding": embedding,
- "embedding_name": embedding_name,
- "type": image_type if image_type is not None else 'Normal'
- })
+ embeddings.append({
+ "filename": full_filename,
+ "filepath": filepath,
+ "embedding": embedding,
+ "embedding_name": embedding_name,
+ "type": image_type if image_type is not None else 'Normal'
+ })
progress_bar.progress((index + 1) / length, text=f"处理图片 {index + 1}/{length}")
diff --git a/services/label_memes.py b/services/label_memes.py
index 4d24744..e56aecf 100644
--- a/services/label_memes.py
+++ b/services/label_memes.py
@@ -9,9 +9,7 @@ import io
PROMOTE = """你是一位表情包分类专家。请分析这个表情包,要求:
1. 简要分析表情包的内容,含义,主体和可能的使用场景;如果表情包有文字,你应该仔细分析考虑,因为表情包的文字通常有幽默感而难以理解;
-2. 按格式要求输出表情包的文本描述,格式如下: **表情包含义**:(几个关键词概括表情包;如果表情包有文字,你要写出); **表情包主体**:(提取表情包的主角); **表情包使用场景**:(几个关键词描述表情包可能的使用场景)
-
-
+2. 按格式要求输出表情包的文本描述,格式如下: **表情包含义**:(几个关键词概括表情包;); **表情包主体**:(几个关键词描述表情包的主角); **表情包使用场景**:(几个关键词描述表情包可能的使用场景);**表情包文字**:(提取表情包中的所有文字;如果没有文字,输出"无文字")
"""
class LabelMemes():
@@ -43,22 +41,32 @@ class LabelMemes():
def _analyze_result_text(self, text:str):
"""分析并格式化模型返回的文本"""
- if not '**表情包含义**' in text or not '**表情包主体**' in text or not '**表情包使用场景**' in text:
- raise Exception(f'analyze result text error: {text}; 模型太蠢,换个模型或者重试')
+ if not '**表情包含义**' in text or not '**表情包主体**' in text or not '**表情包使用场景**' in text or not '**表情包文字**' in text:
+ raise Exception(f'analyze result text error: {text}: \n 模型太蠢(输出不符合要求),换个模型或者重试')
desc = text.split('**表情包含义**')[-1]
character = desc.split('**表情包主体**')[-1]
usage = character.split('**表情包使用场景**')[-1]
- def clean_some_characters(x, l):
+ texts = character.split('**表情包文字**')[-1]
+
+ def clean_some_characters(x, l, r=''):
for i in l:
- x = x.replace(i, '')
+ x = x.replace(i, r)
return x
desc = desc.replace(character, '')
character = character.replace(usage, '')
- laji = ['表情包主体', '表情包使用场景', ':', '**(', ');**', ');**', '**', ');', ')', ';', '(', ')', '\n', ':', '(', ')']
- desc = clean_some_characters(desc, laji).replace('/', ' ').replace('\\', ' ')
- character = clean_some_characters(character, laji).replace('/', ' ').replace('\\', ' ')
- usage = clean_some_characters(usage, laji).replace('/', ' ').replace('\\', ' ')
- return desc, character, usage
+ usage = usage.replace(texts, '')
+ laji = ['表情包主体', '表情包使用场景', '表情包文字', ':', '**(', ');**', ');**', '**', ');', ')', ';', '(', ')', '\n', ':', '(', ')']
+ seperator = ['/', '\\', ',', ',', '、']
+ desc = clean_some_characters(clean_some_characters(desc, laji), seperator, ' ')
+ character = clean_some_characters(clean_some_characters(character, laji), seperator, ' ')
+ usage = clean_some_characters(clean_some_characters(usage, laji), seperator, ' ')
+ texts = clean_some_characters(clean_some_characters(texts, laji), seperator, ' ')
+ if '无文字' in texts:
+ texts = ''
+ for i in [desc, character, usage, texts]:
+ if len(i) > 20:
+ raise Exception(f'analyze result text error: {text}: \n 模型太蠢(字数过多), 换个模型或者重试')
+ return desc, character, usage, texts
def _resize_image(self, img):
"""尺寸调整"""
@@ -147,7 +155,14 @@ class LabelMemes():
}
]
}
- ]
+ ],
+ "stream": False,
+ "max_tokens": 1024,
+ "stop": ["null"],
+ "temperature": 0.5,
+ "top_p": 0.5,
+ "top_k": 50,
+ "frequency_penalty": 0.0,
}
headers = {
"Authorization": f"Bearer {config.api.silicon_api_key}",
From 624a24c9e9634a90a69282a1ff797431922913f8 Mon Sep 17 00:00:00 2001
From: Infstellar <2644641825@qq.com>
Date: Fri, 21 Feb 2025 22:41:03 +0800
Subject: [PATCH 2/9] docs
---
README.md | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/README.md b/README.md
index 6ec1c2b..4a19c2c 100644
--- a/README.md
+++ b/README.md
@@ -44,6 +44,14 @@ pic_example:
程序使用文件名生成embedding用于检索。如果你希望给一个图片多个embedding,你可以在文件名中使用`-`分隔。
+## 上传图片 (WIP)
+
+选择 `images manager` 页面,点击`添加表情包`按钮,上传图片即可。
+
+可以选择多张表情包。
+
+可以启用`使用VLM自动生成文件名`,程序会使用VLM为每张图片生成文件名。
+
## Demo
From 9c7f7680546ec048457e6dbb22d4b844bbcfc862 Mon Sep 17 00:00:00 2001
From: Infstellar <2644641825@qq.com>
Date: Fri, 21 Feb 2025 22:44:38 +0800
Subject: [PATCH 3/9] docs & fix
---
README.md | 2 ++
services/label_memes.py | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 4a19c2c..5f981ee 100644
--- a/README.md
+++ b/README.md
@@ -52,6 +52,8 @@ pic_example:
可以启用`使用VLM自动生成文件名`,程序会使用VLM为每张图片生成文件名。
+每次上传完成后,需要叉掉所有已上传的文件或者刷新页面,否则会重复保存。
+
## Demo
diff --git a/services/label_memes.py b/services/label_memes.py
index e56aecf..0a41cd9 100644
--- a/services/label_memes.py
+++ b/services/label_memes.py
@@ -63,7 +63,7 @@ class LabelMemes():
texts = clean_some_characters(clean_some_characters(texts, laji), seperator, ' ')
if '无文字' in texts:
texts = ''
- for i in [desc, character, usage, texts]:
+ for i in [desc, character, usage]:
if len(i) > 20:
raise Exception(f'analyze result text error: {text}: \n 模型太蠢(字数过多), 换个模型或者重试')
return desc, character, usage, texts
From de961673f5f033a2a104e97f861f0bf9eca8a619 Mon Sep 17 00:00:00 2001
From: Infstellar <2644641825@qq.com>
Date: Fri, 21 Feb 2025 22:51:24 +0800
Subject: [PATCH 4/9] fix: filter out duplicate images
---
services/image_search.py | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/services/image_search.py b/services/image_search.py
index 3c1a77d..e21b39c 100644
--- a/services/image_search.py
+++ b/services/image_search.py
@@ -216,6 +216,7 @@ class ImageSearch:
return []
similarities = []
+ exists_imgs_path = []
for img in self.image_data:
if 'filepath' not in img and config.misc.adapt_for_old_version:
img['filepath'] = os.path.join(config.get_absolute_image_dirs()[0], img["filename"])
@@ -226,5 +227,14 @@ class ImageSearch:
return []
# 按相似度降序排序并返回前top_k个结果
- sorted_items = sorted(similarities, key=lambda x: x[1], reverse=True)[:top_k]
- return [item[0] for item in sorted_items]
\ No newline at end of file
+ sorted_items = sorted(similarities, key=lambda x: x[1], reverse=True)
+ return_list = []
+ count = 0
+ for i in sorted_items:
+ if count >= top_k:
+ break
+ if i[0] not in exists_imgs_path:
+ return_list.append(i[0])
+ exists_imgs_path.append(i[0])
+ count += 1
+ return [item[0] for item in return_list]
\ No newline at end of file
From d240e91f66c66f9496834383a74d105cd6233ff2 Mon Sep 17 00:00:00 2001
From: Infstellar <2644641825@qq.com>
Date: Fri, 21 Feb 2025 22:53:51 +0800
Subject: [PATCH 5/9] fix
---
services/image_search.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/services/image_search.py b/services/image_search.py
index e21b39c..f413df7 100644
--- a/services/image_search.py
+++ b/services/image_search.py
@@ -237,4 +237,4 @@ class ImageSearch:
return_list.append(i[0])
exists_imgs_path.append(i[0])
count += 1
- return [item[0] for item in return_list]
\ No newline at end of file
+ return return_list
\ No newline at end of file
From 1ab36dd263eb6098fab526bbc8df4fda26ccd1fb Mon Sep 17 00:00:00 2001
From: Infstellar <2644641825@qq.com>
Date: Sat, 22 Feb 2025 10:36:03 +0800
Subject: [PATCH 6/9] rename; some fixes
---
README.md | 20 +++++++++++--------
app.py | 2 +-
pages/{images_manager.py => upload_images.py} | 17 ++++++++++------
3 files changed, 24 insertions(+), 15 deletions(-)
rename pages/{images_manager.py => upload_images.py} (79%)
diff --git a/README.md b/README.md
index 5f981ee..7a66390 100644
--- a/README.md
+++ b/README.md
@@ -38,15 +38,9 @@ pic_example:
type: "名称"
```
-## 图片打标 (WIP)
+## 上传图片
-选择 `label images` 页面,选择图片文件夹,点击 `使用VLM生成描述` ,选择需要的描述后重命名文件即可。
-
-程序使用文件名生成embedding用于检索。如果你希望给一个图片多个embedding,你可以在文件名中使用`-`分隔。
-
-## 上传图片 (WIP)
-
-选择 `images manager` 页面,点击`添加表情包`按钮,上传图片即可。
+选择 `upload images` 页面,点击`添加表情包`按钮,上传图片即可。
可以选择多张表情包。
@@ -54,6 +48,16 @@ pic_example:
每次上传完成后,需要叉掉所有已上传的文件或者刷新页面,否则会重复保存。
+上传完成后,需要重新生成缓存。
+
+## 图片打标 (WIP)
+
+选择 `label images` 页面,选择图片文件夹,点击 `使用VLM生成描述` ,选择需要的描述后重命名文件即可。
+
+程序使用文件名生成embedding用于检索。如果你希望给一个图片多个embedding,你可以在文件名中使用`-`分隔。
+
+
+
## Demo
diff --git a/app.py b/app.py
index c45cdbd..3a5c46d 100644
--- a/app.py
+++ b/app.py
@@ -4,5 +4,5 @@ import yaml
from services.image_search import ImageSearch
from config.settings import config, reload_config
-pg = st.navigation([st.Page("pages/VVQuest.py"), st.Page("pages/label_images.py"), st.Page("pages/images_manager.py")])
+pg = st.navigation([st.Page("pages/VVQuest.py"), st.Page("pages/label_images.py"), st.Page("pages/upload_images.py")])
pg.run()
\ No newline at end of file
diff --git a/pages/images_manager.py b/pages/upload_images.py
similarity index 79%
rename from pages/images_manager.py
rename to pages/upload_images.py
index 1288959..5169624 100644
--- a/pages/images_manager.py
+++ b/pages/upload_images.py
@@ -40,19 +40,20 @@ with st.sidebar:
CACHE_PATH = os.path.join(config.base_dir, 'cache')
verify_folder(CACHE_PATH)
-def label_image(image_path):
+def label_image(image_path, show_result_area):
for i in range(15):
try:
l = st.session_state.label_meme_obj.label_image(image_path)
return f'{l[0]}-{l[1]}-{l[2]}-{l[3]}'
except Exception as e:
- st.error(f'第{i + 1}次尝试生成描述失败, 错误信息: {e}')
+ show_result_area.error(f'第{i + 1}次尝试生成描述失败, 错误信息: {e}')
time.sleep(1)
- st.error('生成描述失败')
+ show_result_area.error('生成描述失败')
return False
if uploaded_images:
show_image_area = st.empty()
+ show_result_area= st.empty()
for uploaded_image in uploaded_images:
try:
img_name = uploaded_image.name
@@ -62,18 +63,22 @@ if uploaded_images:
img = Image.open(uploaded_image)
show_image_area.image(img, caption=uploaded_image.name, width=200)
cache_path = os.path.join(CACHE_PATH, f'{time.time()}.gif')
+ if img.mode == 'P':
+ img = img.convert('RGB')
img.save(os.path.join(cache_path))
# 生成图片描述
if st.session_state.auto_generate_labels:
- res = label_image(cache_path)
+ res = label_image(cache_path, show_result_area)
if res:
img_name = res + os.path.splitext(img_name)[1]
# 保存上传的图片到指定文件夹
save_image_path = os.path.join(st.session_state.image_folder_name,img_name )
if os.path.exists(save_image_path):
- st.error(f'图片 {save_image_path} 已存在')
+ show_result_area.error(f'图片 {save_image_path} 已存在')
else:
+ if img.mode == 'P':
+ img = img.convert('RGB')
img.save(save_image_path)
- st.success(f'图片 {save_image_path} 已保存')
+ show_result_area.success(f'图片 {save_image_path} 已保存')
uploaded_images = []
\ No newline at end of file
From 0ae66105dd12e91d445beb4a39d2808a7dc47969 Mon Sep 17 00:00:00 2001
From: Infstellar <2644641825@qq.com>
Date: Sat, 22 Feb 2025 10:41:23 +0800
Subject: [PATCH 7/9] feat: delete cache
---
app.py | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/app.py b/app.py
index 3a5c46d..124c9c7 100644
--- a/app.py
+++ b/app.py
@@ -1,8 +1,28 @@
import streamlit as st
import random
+import os
import yaml
from services.image_search import ImageSearch
from config.settings import config, reload_config
+from services.utils import verify_folder
+
+def delete_all_files_in_folder(folder_path):
+ try:
+ # 遍历文件夹中的所有文件和子文件夹
+ for root, dirs, files in os.walk(folder_path, topdown=False):
+ # 删除所有文件
+ for file in files:
+ file_path = os.path.join(root, file)
+ os.remove(file_path)
+ # 删除所有空文件夹
+ for dir in dirs:
+ dir_path = os.path.join(root, dir)
+ os.rmdir(dir_path)
+ except Exception as e:
+ print(f"删除过程中出现错误: {e}")
+
+verify_folder(os.path.join(config.base_dir, "cache"))
+delete_all_files_in_folder(os.path.join(config.base_dir, "cache"))
pg = st.navigation([st.Page("pages/VVQuest.py"), st.Page("pages/label_images.py"), st.Page("pages/upload_images.py")])
pg.run()
\ No newline at end of file
From d3d3a58b372174d42c96dc973c2ebf7e425ccf01 Mon Sep 17 00:00:00 2001
From: Infstellar <2644641825@qq.com>
Date: Sat, 22 Feb 2025 10:44:40 +0800
Subject: [PATCH 8/9] fix
---
pages/upload_images.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pages/upload_images.py b/pages/upload_images.py
index 5169624..4310fb6 100644
--- a/pages/upload_images.py
+++ b/pages/upload_images.py
@@ -62,7 +62,7 @@ if uploaded_images:
# 使用 PIL 打开图片并显示
img = Image.open(uploaded_image)
show_image_area.image(img, caption=uploaded_image.name, width=200)
- cache_path = os.path.join(CACHE_PATH, f'{time.time()}.gif')
+ cache_path = os.path.join(CACHE_PATH, img_name)
if img.mode == 'P':
img = img.convert('RGB')
img.save(os.path.join(cache_path))
From 5be330e4b4315ecbc23b3037c11241d7d96753f6 Mon Sep 17 00:00:00 2001
From: Infstellar <2644641825@qq.com>
Date: Sat, 22 Feb 2025 10:47:54 +0800
Subject: [PATCH 9/9] fix
---
pages/upload_images.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pages/upload_images.py b/pages/upload_images.py
index 4310fb6..ca2bc00 100644
--- a/pages/upload_images.py
+++ b/pages/upload_images.py
@@ -63,7 +63,7 @@ if uploaded_images:
img = Image.open(uploaded_image)
show_image_area.image(img, caption=uploaded_image.name, width=200)
cache_path = os.path.join(CACHE_PATH, img_name)
- if img.mode == 'P':
+ if img.mode == 'P': #TODO: 检查这行代码是否不需要
img = img.convert('RGB')
img.save(os.path.join(cache_path))
# 生成图片描述
@@ -81,4 +81,4 @@ if uploaded_images:
img = img.convert('RGB')
img.save(save_image_path)
show_result_area.success(f'图片 {save_image_path} 已保存')
- uploaded_images = []
\ No newline at end of file
+ uploaded_images = [] # 这行代码没用,那个组件仍然会保存已上传的文件
\ No newline at end of file