139 lines
5.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import datetime
import json
import os.path
import time
from io import BytesIO
from PIL import Image
from torchvision import transforms
from CropLand_CD_module.change_detection_module import ChangeDetectionModule
from CropLand_CD_module.visualize_pil_segmentation_mask import visualize_pil_segmentation_mask_opencv
from middleware.conver_segementation_mask import apply_mask_to_image
from middleware.minio_util import downFile, upload_file, upload_file_from_buffer
from mqtt_pub import MQTTClient
# from change_detection_module import ChangeDetectionModule
mqtt_client=None
# MQTT 代理地址和端口
# broker = "112.44.103.230" # 公共 MQTT 代理(免费)
broker = "8.137.54.85" # 公共 MQTT 代理(免费)
port = 1883 # MQTT 默认端口
# 主题
topic = "thing/product/ai/events"
def corpland_detection_func(task_id, s3_id, early_pic_url, later_pic_url, model_func_id):
print("\n=== 变化检测系统 ===")
gpu_id = "0"
img_size = 256 # 模型预期的输入尺寸
lr = 0.0001
early_pic = downFile(early_pic_url)
later_pic = downFile(later_pic_url)
# from PIL import Image
# image1 = Image.open(image1_path).convert('RGB')
# image2 = Image.open(image2_path).convert('RGB')
# image1 = Image.open(early_pic).convert('RGB')
# image2 = Image.open(later_pic).convert('RGB')
early_pic_url=os.path.abspath(early_pic)
later_pic_url=os.path.abspath(later_pic)
# windows路径
# model_path = r'D:\project\2025-7-10_data+model\CropLand-CD-main_3\CropLand-CD-main\save_epoch\best_model.pth'
# save_dir= r"D:\project\2025-7-10_data+model\CropLand-CD-main_3\CropLand-CD-main\save"
# # linux路径
model_path = r"CropLand_CD_module/save_epoch/best_model.pth"
save_dir= r"CropLand_CD_module/save"
cd = ChangeDetectionModule(gpu_id, img_size, lr)
cd.load_model(model_path)
out_save_path = cd.predict_from_imgurl(early_pic_url,later_pic_url,save_dir)
print(out_save_path)
pic_path = os.path.abspath(later_pic)
# src_crs, instance_results_json_path, vis_png, vis_json=visualize_pil_segmentation_mask_opencv(out_save_path,pic_path)
src_crs, instance_results_json_path, vis_png, _ = visualize_pil_segmentation_mask_opencv(out_save_path, pic_path)
mask_dir=os.path.dirname(out_save_path)
mask_name=os.path.basename(out_save_path)
convert_mask_with_pic_name="mask_"+mask_name
convert_mask_path=os.path.join(mask_dir,convert_mask_with_pic_name)
apply_mask_to_image(
image_path=later_pic_url,
mask_path=out_save_path,
output_path=convert_mask_path,
alpha=0.4
)
date_str = datetime.datetime.now().strftime("%Y%m%d")
time_s = datetime.datetime.now().timestamp()
mqtt_client = MQTTClient(broker, port, topic)
pic_name = os.path.basename(later_pic)
pic_name_1 = f"{date_str}/{time_s}-1-{pic_name}"
pic_name_2 = f"{date_str}/{time_s}-2-{pic_name}"
pic_name = f"{date_str}/{time_s}-result-{pic_name}"
minio_path_1, file_type_1 = upload_file(early_pic, None)
minio_path_2, file_type_2 = upload_file(later_pic, None)
minio_path_result, file_type_result = upload_file(convert_mask_path, None)
minio_vis_png, file_type_result = upload_file(vis_png, None)
# if instance_results_json_path and os.path.exists(instance_results_json_path):
# # minio_vis_json, file_type_result = upload_file(json_result_path, "application/json")
# minio_vis_json, file_type_result = upload_file(instance_results_json_path, None)
# # minio_path_result, file_type_result = upload_file_from_buffer(buffer, pic_name)
if instance_results_json_path is None or not os.path.exists(instance_results_json_path):
print("警告: 无法生成有效的JSON结果文件使用空文件替代")
# 创建一个空的JSON文件作为替代
empty_result = {"error": "无法生成有效的结果", "instances": []}
instance_results_json_path = os.path.join(os.path.dirname(out_save_path), "empty_result.json")
with open(instance_results_json_path, 'w') as f:
json.dump(empty_result, f)
minio_vis_json, file_type_result = upload_file(instance_results_json_path, None)
message = {
"task_id": task_id,
"minio": {
"minio_path_1": minio_path_1,
"minio_path_2": minio_path_2,
"minio_path_result": minio_path_result,
"minio_path_boundary": minio_vis_png,
"minio_path_json": minio_vis_json,
"crs_info":str(src_crs),
"file_type": file_type_result
}
}
json_message = json.dumps(message, indent=4, ensure_ascii=False)
mqtt_client.publish_message(json_message)
time.sleep(0.5)
# 删除一期
if os.path.exists(early_pic):
os.remove(early_pic)
# 删除二期
if os.path.exists(later_pic):
os.remove(later_pic)
# 删除掩码
if os.path.exists(out_save_path):
os.remove(out_save_path)
# 删除掩码覆盖原图
if os.path.exists(convert_mask_path):
os.remove(convert_mask_path)
# 删除本地掩码图片
if os.path.exists(minio_vis_png):
os.remove(minio_vis_png)
# 删除本地json文件
if os.path.exists(minio_vis_json):
os.remove(minio_vis_json)
# 删除修改经纬度之后的json文件
if os.path.exists(instance_results_json_path):
os.remove(instance_results_json_path)
# if __name__ == '__main__':