import copy import os import cv2 import numpy as np import requests def run_skyseg(onnx_session, input_size, image): temp_image = copy.deepcopy(image) resize_image = cv2.resize(temp_image, dsize=(input_size[0], input_size[1])) x = cv2.cvtColor(resize_image, cv2.COLOR_BGR2RGB) x = np.array(x, dtype=np.float32) mean = [0.485, 0.456, 0.406] std = [0.229, 0.224, 0.225] x = (x / 255 - mean) / std x = x.transpose(2, 0, 1) x = x.reshape(-1, 3, input_size[0], input_size[1]).astype("float32") input_name = onnx_session.get_inputs()[0].name output_name = onnx_session.get_outputs()[0].name onnx_result = onnx_session.run([output_name], {input_name: x}) onnx_result = np.array(onnx_result).squeeze() min_value = np.min(onnx_result) max_value = np.max(onnx_result) if max_value > min_value: onnx_result = (onnx_result - min_value) / (max_value - min_value) else: onnx_result = np.zeros_like(onnx_result) onnx_result *= 255 onnx_result = onnx_result.astype("uint8") return onnx_result def segment_sky(image_path, onnx_session, mask_filename=None): if mask_filename is None: raise ValueError("mask_filename must not be None") image = cv2.imread(image_path) if image is None: return None result_map = run_skyseg(onnx_session, [320, 320], image) result_map_original = cv2.resize(result_map, (image.shape[1], image.shape[0])) output_mask = np.zeros_like(result_map_original) output_mask[result_map_original < 32] = 255 os.makedirs(os.path.dirname(mask_filename), exist_ok=True) cv2.imwrite(mask_filename, output_mask) return output_mask def download_file_from_url(url, filename): try: response = requests.get(url, allow_redirects=False, timeout=30) response.raise_for_status() if response.status_code == 302: redirect_url = response.headers["Location"] response = requests.get(redirect_url, stream=True, timeout=120) response.raise_for_status() with open(filename, "wb") as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk) except requests.exceptions.RequestException as exc: print(f"Error downloading file: {exc}")