第一步對圖像進行讀取:
研究數據集:
在ARCGIS上觀察傾斜程度:
PIL 對路徑的支持更友好:PIL 在處理文件路徑(尤其是包含中文字符的路徑)時通常更加健壯。OpenCV 在某些版本或特定環境下可能會對非英文路徑處理不當,導致讀取或保存失敗。
跨平臺兼容性:PIL 在不同操作系統(如 Windows、Linux、macOS)上的路徑處理更為一致,這在開發跨平臺應用時是一個優勢?
import pandas as pd
from PIL import Image# 專業紅外圖像讀取方式
def read_ir_image(file_path):try:# 先用PIL讀取pil_img = Image.open(file_path)# 轉換為numpy數組img_array = np.array(pil_img)# 檢查是否為單通道紅外數據if len(img_array.shape) == 2: # 單通道print("檢測到單通道紅外數據")# 歸一化處理示例(根據實際傳感器數據調整)img_array = (img_array - img_array.min()) / (img_array.max() - img_array.min()) * 255img_array = img_array.astype(np.uint8)# 轉換為OpenCV格式return cv2.cvtColor(img_array, cv2.COLOR_RGB2BGR) if len(img_array.shape) == 3 else cv2.cvtColor(img_array,cv2.COLOR_GRAY2BGR)except Exception as e:print(f"紅外圖像處理錯誤: {e}")# 將 OpenCV 圖像轉換為 PIL 圖像并保存(支持中文路徑)
第二步對衛星圖像進行分割:
分割可以提高處理效率:將大尺寸的衛星圖像分割成多個小塊(tiles),每個小塊的尺寸與無人機圖像相近,可以顯著降低單次處理的數據量,加快處理速度。
并行處理:分割后的圖像塊可以進行并行處理,進一步提升整體處理效率。?
局部匹配更精確:在大尺寸圖像上直接進行匹配可能會因為場景復雜性高、特征點分布不均等原因導致匹配精度下降。而通過分割,可以在每個小塊內進行更精細的特征提取和匹配,提高匹配精度。
?
讀取匹配文件:
使用 pd.read_csv 讀取 matches.csv 文件。
matches_df['coordinate'] 列存儲了裁剪中心坐標,并通過 apply 解析為元組形式 (x_center, y_center)。
# 讀取 matches.csv 文件
matches_df = pd.read_csv(r'E:\傾斜\傾斜\Match-Dataset-train\gs20251-ir\matches.csv')# 打印列名以確認
print("Columns:", matches_df.columns)# 解析 coordinate 列
matches_df['coordinate'] = matches_df['coordinate'].apply(lambda x: tuple(map(int, x.strip('()').split(', '))))
對裁剪圖片進行填充并保存:
# 計算裁剪區域half_crop = crop_size // 2x1 = max(0, x_center - half_crop)y1 = max(0, y_center - half_crop)x2 = min(satellite_img.shape[1], x_center + half_crop)y2 = min(satellite_img.shape[0], y_center + half_crop)# 裁剪衛星圖cropped_satellite = satellite_img[y1:y2, x1:x2]# 如果裁剪區域小于指定尺寸,進行填充if cropped_satellite.shape[0] < crop_size or cropped_satellite.shape[1] < crop_size:padded_satellite = np.zeros((crop_size, crop_size, 3), dtype=np.uint8)padx1 = (crop_size - cropped_satellite.shape[1]) // 2pady1 = (crop_size - cropped_satellite.shape[0]) // 2padx2 = crop_size - cropped_satellite.shape[1] - padx1pady2 = crop_size - cropped_satellite.shape[0] - pady1padded_satellite[pady1:pady1 + cropped_satellite.shape[0],padx1:padx1 + cropped_satellite.shape[1]] = cropped_satellitecropped_satellite = padded_satellite
?第三步對圖片進行傾斜校正:
要根據無人機的姿態角(yaw、pitch、roll)將圖像修正為正射投影(orthorectification),需要進行一系列的幾何變換。
Yaw 角影響圖像的水平旋轉,可以通過簡單的旋轉來修正。
Pitch 和 Roll 的修正較為復雜,需要進行三維旋轉。可以使用 OpenCV 的 warpPerspective 函數來實現。
上述方法基于簡單的幾何變換,對于復雜的地形和高精度要求,可能需要更專業的正射糾正算法(如使用 DEM 數據)。
# 讀取姿態角數據csv_path = 'drone.csv'df = pd.read_csv(csv_path)image_name = '000000.jpg'image_data = df[df['drone_name'] == image_name].iloc[0]yaw, pitch, roll = image_data['yaw'], image_data['pitch'], image_data['roll']# Yaw 修正corrected_yaw = rotate_image(ir_image, -yaw)# Pitch 和 Roll 修正corrected_pitch_roll = correct_pitch_roll(corrected_yaw, pitch, roll)
?第四步進行訓練學習:
可以適當調整訓練輪次改到100,然后每一個批次可以改為8,以提高訓練效率。
# Eval Configparser.add_argument('--batch_size_eval', default=128, type=int)parser.add_argument('--eval_every_n_epoch', default=1, type=int)parser.add_argument('--normalize_features', default=True, type=bool)parser.add_argument('--eval_gallery_n', default=-1, type=int)
?第五步擴大數據集:
歷史影像地圖數據提供了更多的樣本,可以幫助模型更好地學習和泛化。特別是在數據集較小或特定場景數據不足的情況下,歷史影像可以作為補充數據。
尋找歷史影像數據,將歷史影像的數據格式、分辨率等與現有數據集一致,可以直接將其加入數據集中進行訓練。