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__':