修改相似图片的路径,这样脚本就可以启动了

This commit is contained in:
2025-10-11 18:38:14 +08:00
parent 93e7b9490a
commit 1719a0a961
+46 -11
View File
@@ -109,6 +109,34 @@ class EmbeddingFoodClassifierApp:
paths_path = os.path.join(index_dir, 'image_paths.pkl') paths_path = os.path.join(index_dir, 'image_paths.pkl')
with open(paths_path, 'rb') as f: with open(paths_path, 'rb') as f:
self.image_paths = pickle.load(f) self.image_paths = pickle.load(f)
# 兼容 python -m:将相对路径规范为绝对路径(基于项目根目录)
PROJECT_ROOT = os.path.abspath(os.path.join(BASE_DIR, ".."))
INDEX_DIR = index_dir
def _resolve_path(p):
# 若已是绝对路径且存在
if os.path.isabs(p) and os.path.exists(p):
return p
# 统一规范相对路径
rp = os.path.normpath(p)
candidates = [
os.path.abspath(os.path.join(PROJECT_ROOT, rp)),
os.path.abspath(os.path.join(BASE_DIR, rp)),
os.path.abspath(os.path.join(INDEX_DIR, rp)),
]
# 特殊修正:如果路径误指向 PythonProjects\\dataset,尝试插入 FoodClassifier
try:
proj_root_parent = os.path.dirname(PROJECT_ROOT)
fixed = rp.replace(os.path.join("PythonProjects", "dataset"),
os.path.join("PythonProjects", "FoodClassifier", "dataset"))
candidates.append(os.path.abspath(os.path.join(proj_root_parent, fixed)))
except Exception:
pass
for c in candidates:
if os.path.exists(c):
return c
# 找不到就退回 PROJECT_ROOT 拼接的绝对路径
return os.path.abspath(os.path.join(PROJECT_ROOT, rp))
self.image_paths = [_resolve_path(p) for p in self.image_paths]
# 加载标签映射,就是一个list,一张张图片的分类,不过是0,1,2,3,4这种 # 加载标签映射,就是一个list,一张张图片的分类,不过是0,1,2,3,4这种
labels_path = os.path.join(index_dir, 'labels.pkl') labels_path = os.path.join(index_dir, 'labels.pkl')
@@ -748,10 +776,18 @@ class EmbeddingFoodClassifierApp:
faiss.write_index(self.faiss_index, index_path) faiss.write_index(self.faiss_index, index_path)
# 保存图片路径 # 保存图片路径
# 保存图片路径(统一存为绝对路径,避免工作目录变化带来的问题)
PROJECT_ROOT = os.path.abspath(os.path.join(BASE_DIR, ".."))
abs_image_paths = []
for p in self.image_paths:
if not os.path.isabs(p):
abs_image_paths.append(os.path.abspath(os.path.join(PROJECT_ROOT, p)))
else:
abs_image_paths.append(p)
paths_path = os.path.join(index_dir, 'image_paths.pkl') paths_path = os.path.join(index_dir, 'image_paths.pkl')
with open(paths_path, 'wb') as f: with open(paths_path, 'wb') as f:
# 重新写入图片路径 # 重新写入图片路径(绝对路径)
pickle.dump(self.image_paths, f) pickle.dump(abs_image_paths, f)
# 保存标签 # 保存标签
labels_path = os.path.join(index_dir, 'labels.pkl') labels_path = os.path.join(index_dir, 'labels.pkl')
@@ -1396,28 +1432,28 @@ class EmbeddingFoodClassifierApp:
# 加载并显示图片 # 加载并显示图片
try: try:
# 打开图片 # 加载图片(兼容中文路径)
pil_image = Image.open(image_path) cv_img = self.load_image_with_chinese_path(image_path)
if cv_img is None:
raise FileNotFoundError(f"无法读取图片,路径可能不存在或不可访问: {image_path}")
# 转为 PIL 并缩放
image_rgb = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB)
pil_image = Image.fromarray(image_rgb)
# 计算合适的显示尺寸 # 计算合适的显示尺寸
max_width, max_height = 500, 350 max_width, max_height = 500, 350
img_width, img_height = pil_image.size img_width, img_height = pil_image.size
# 计算缩放比例 # 计算缩放比例
scale = min(max_width / img_width, max_height / img_height, 1.0) scale = min(max_width / img_width, max_height / img_height, 1.0)
new_width = int(img_width * scale) new_width = int(img_width * scale)
new_height = int(img_height * scale) new_height = int(img_height * scale)
# 调整图片大小 # 调整图片大小
pil_image = pil_image.resize((new_width, new_height), Image.Resampling.LANCZOS) pil_image = pil_image.resize((new_width, new_height), Image.Resampling.LANCZOS)
# 转换为CTk图片 # 转换为CTk图片
ctk_image = ctk.CTkImage( ctk_image = ctk.CTkImage(
light_image=pil_image, light_image=pil_image,
dark_image=pil_image, dark_image=pil_image,
size=(new_width, new_height) size=(new_width, new_height)
) )
# 显示图片 # 显示图片
image_label = ctk.CTkLabel( image_label = ctk.CTkLabel(
image_frame, image_frame,
@@ -1425,9 +1461,8 @@ class EmbeddingFoodClassifierApp:
text="" text=""
) )
image_label.pack(expand=True, pady=20) image_label.pack(expand=True, pady=20)
# 图片信息 # 图片信息
info_text = f"原始尺寸: {img_width} × {img_height}显示尺寸: {new_width} × {new_height}" info_text = f"原始尺寸: {img_width} × {img_height} 显示尺寸: {new_width} × {new_height}"
info_label = ctk.CTkLabel( info_label = ctk.CTkLabel(
main_frame, main_frame,
text=info_text, text=info_text,