115 lines
4.4 KiB
Python
115 lines
4.4 KiB
Python
|
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)
|
|||
|
|