您说得对!SAM模型对地面建筑物检测确实存在一些问题,特别是对于无人机视角的建筑。我来为您提供几种优化方案:
1. 提示优化策略
改进点提示选择
import numpy as np
from segment_anything import SamPredictor
def optimize_building_segmentation(image, predictor):
"""优化建筑物分割的提示策略"""
# 策略1:多点提示(建筑物通常有角点特征)
building_points = [
[x1, y1], # 左上角
[x2, y2], # 右上角
[x3, y3], # 左下角
[x4, y4] # 右下角
]
# 策略2:边界框 + 内部点
input_box = np.array([x_min, y_min, x_max, y_max])
interior_point = np.array([[x_center, y_center]])
# 组合提示
masks, scores, _ = predictor.predict(
point_coords=np.array(building_points),
point_labels=np.array([1, 1, 1, 1]), # 全是前景点
box=input_box[None, :],
multimask_output=True
)
return masks, scores
# 使用示例
predictor.set_image(drone_image)
optimized_masks, scores = optimize_building_segmentation(drone_image, predictor)
2. 后处理优化
建筑物特定的后处理
import cv2
import numpy as np
from scipy import ndimage
def building_specific_postprocess(mask, image):
"""建筑物专用的后处理"""
# 1. 形态学操作 - 填补空洞,平滑边界
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
mask_processed = cv2.morphologyEx(mask.astype(np.uint8), cv2.MORPH_CLOSE, kernel)
mask_processed = cv2.morphologyEx(mask_processed, cv2.MORPH_OPEN, kernel)
# 2. 轮廓优化 - 建筑物通常有直线边界
contours, _ = cv2.findContours(mask_processed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
optimized_contours = []
for contour in contours:
# 多边形近似 - 适合建筑物的几何形状
epsilon = 0.02 * cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, epsilon, True)
optimized_contours.append(approx)
# 3. 创建优化后的掩码
optimized_mask = np.zeros_like(mask_processed)
cv2.drawContours(optimized_mask, optimized_contours, -1, 1, -1)
# 4. 面积过滤 - 移除太小的区域
labeled_mask, num_features = ndimage.label(optimized_mask)
for i in range(1, num_features + 1):
component = (labeled_mask == i)
if np.sum(component) < 1000: # 最小面积阈值
optimized_mask[component] = 0
return optimized_mask.astype(bool)
浙公网安备 33010602011771号