115 lines
4.4 KiB
Python
Raw Permalink Normal View History

2025-07-10 09:41:26 +08:00
import os
import shutil
import uuid
import errno
from ultralytics import YOLO
from miniohelp import upload_folder,load_config,download_file_url,parse_minio_url
from datetime import timedelta
def list_files(folder_path):
"""获取指定目录下的所有文件完整路径"""
return [os.path.join(folder_path, f) for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))]
def safe_rmtree(path):
try:
if os.path.exists(path):
shutil.rmtree(path)
except OSError as e:
if e.errno != errno.ENOENT: # 忽略“文件夹不存在”错误
print(f"⚠️ 删除目录失败: {path} 错误: {e}")
def map_process_images(urls, yaml_name, bucket_name, bucket_directory, uav_model_path):
"""
批量处理图片下载 -> 分割识别 -> 上传 MinIO -> 返回访问 URL 列表
"""
input_folder = "input_folder"
output_folder = "output_folder"
os.makedirs(input_folder, exist_ok=True)
os.makedirs(output_folder, exist_ok=True)
try:
print("🔐 加载 MinIO 配置...")
client = load_config(yaml_name)
output_urls = []
# 下载图片到 input_folder
for url in urls:
unique_name = str(uuid.uuid4()) + os.path.splitext(url)[-1]
local_path = os.path.join(input_folder, unique_name)
print(f"📥 下载图片: {url} -> {local_path}")
download_file_url(url, save_path=local_path)
# YOLO 模型推理
print("🧠 使用 YOLO 进行图像分割/识别...")
model = YOLO(uav_model_path)
model.predict(source=input_folder, save=True, project=output_folder, name="result", exist_ok=True)
result_folder = os.path.join(output_folder, "result") # 获取结果文件夹
# 上传结果到 MinIO
print("☁️ 上传结果到 MinIO...")
upload_folder(client, result_folder, bucket_name, bucket_directory)
# 生成访问 URL
result_files = list_files(result_folder)
for result_path in result_files:
filename = os.path.basename(result_path)
object_path = os.path.join(bucket_directory, filename).replace("\\", "/")
presigned_url = client.presigned_get_object(bucket_name, object_path, expires=timedelta(days=2))
output_urls.append(parse_minio_url(presigned_url))
return {
"code": 200,
"msg": "success",
"data": output_urls
}
except Exception as e:
print(f"❌ 处理失败: {e}")
return {
"code": 500,
"msg": f"error: {e}",
"data": []
}
finally:
safe_rmtree(input_folder)
safe_rmtree(output_folder)
def map_process_images_with_progress(urls, yaml_name, bucket_name, bucket_directory, uav_model_path, progress_callback):
"""
包装你的 map_process_images支持进度回调
"""
input_folder = "input_folder"
output_folder = "output_folder"
os.makedirs(input_folder, exist_ok=True)
os.makedirs(output_folder, exist_ok=True)
try:
client = load_config(yaml_name)
output_urls = []
total = len(urls)
for i, url in enumerate(urls):
unique_name = str(uuid.uuid4()) + os.path.splitext(url)[-1]
local_path = os.path.join(input_folder, unique_name)
download_file_url(url, save_path=local_path)
progress_callback("downloading", int((i + 1) / total * 30))
model = YOLO(uav_model_path)
model.predict(source=input_folder, save=True, project=output_folder, name="result", exist_ok=True)
result_folder = os.path.join(output_folder, "result")
progress_callback("processing", 60)
upload_folder(client, result_folder, bucket_name, bucket_directory)
result_files = list_files(result_folder)
for i, result_path in enumerate(result_files):
filename = os.path.basename(result_path)
object_path = os.path.join(bucket_directory, filename).replace("\\", "/")
presigned_url = client.presigned_get_object(bucket_name, object_path)
output_urls.append(parse_minio_url(presigned_url))
progress_callback("uploading", 60 + int((i + 1) / len(result_files) * 40))
return {"code": 200, "msg": "success", "data": output_urls}
finally:
safe_rmtree(input_folder)
safe_rmtree(output_folder)