115 lines
4.0 KiB
Python
Raw Permalink Normal View History

2025-07-10 09:41:26 +08:00
import os
import shutil
import uuid
from miniohelp import upload_folder, load_config, parse_minio_url, download_file_url
from datetime import timedelta
from map.uav_seg import UAVSegPredictor
import errno
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 test_uav_seg(model_path, input_path, output_path):
predictor = UAVSegPredictor(
model_path= model_path,
model_type='deeplabv3plus',
num_classes=7
)
color_map = [
[255, 0, 0], # 类别0: 红色
[0, 255, 0], # 类别1: 绿色
[0, 0, 255], # 类别2: 蓝色
[255, 255, 0], # 类别3: 黄色
[255, 0, 255], # 类别4: 品红
[0, 255, 255], # 类别5: 青色
[128, 0, 128] # 类别6: 紫色
]
predictor.predict_folder(input_path, output_path,color_map)
def map_process_images(urls, yaml_name, bucket_name, bucket_directory,uav_model_path):
"""
批量处理图片下载 -> 分割识别 -> 上传 MinIO -> 返回访问 URL 列表
参数:
- urls: 图片 URL 列表List[str]
- yaml_name: MinIO 配置文件路径
- bucket_name: 存储桶名
- bucket_directory: 存储桶目录可共享一个目录
返回:
- dict: 包含 codemsg 和上传后的 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 = []
for url in urls:
# 每个文件用唯一 ID 命名,避免冲突
unique_name = str(uuid.uuid4()) + os.path.splitext(url)[-1]
local_path = os.path.join(input_folder, unique_name)
print(f"📥 下载图片: {url}")
download_file_url(url, save_path=local_path)
print("🧠 图像识别中...")
test_uav_seg(uav_model_path, input_folder, output_path=output_folder)
print("☁️ 上传结果到 MinIO...")
upload_folder(client, output_folder, bucket_name, bucket_directory)
# 获取输出文件夹中的文件名并生成 MinIO URL
result_files = list_files(output_folder)
for result_path in result_files:
filename = os.path.basename(result_path)
object_path = os.path.join(bucket_directory, filename).replace("\\", "/")
url = client.presigned_get_object(bucket_name, object_path, expires=timedelta(days=2))
output_urls.append(parse_minio_url(url))
# 清理临时文件夹
shutil.rmtree(input_folder)
shutil.rmtree(output_folder)
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)
if __name__ == '__main__':
urls = [
"http://171.221.233.49:9000/300bdf2b-a150-406e-be63-d28bd29b409f/qiepian/data7/data3/15/25807/19269.png"]
2025-07-10 10:04:45 +08:00
yaml_name = "config"
2025-07-10 09:41:26 +08:00
bucket_name = "300bdf2b-a150-406e-be63-d28bd29b409f"
bucket_directory = "2025/seg"
uav_model_path = "D:/work/AI_Python/Ai_tottle/map/checkpoints/deeplabv3plus_best.pth"
result = map_process_images(urls, yaml_name, bucket_name, bucket_directory,uav_model_path)
print(result)