diff --git a/utils/directory_manager.py b/utils/directory_manager.py index bd831e7..1d5802d 100644 --- a/utils/directory_manager.py +++ b/utils/directory_manager.py @@ -15,8 +15,11 @@ class DirectoryManager: def clean_output_dir(self): """清理输出目录""" try: - shutil.rmtree(self.config.output_dir) - print(f"已清理输出目录: {self.config.output_dir}") + if os.path.exists(self.config.output_dir): + shutil.rmtree(self.config.output_dir) + print(f"已清理输出目录: {self.config.output_dir}") + else: + pass except Exception as e: print(f"清理输出目录时发生错误: {str(e)}") raise @@ -65,7 +68,7 @@ class DirectoryManager: free_space = disk_usage.free # 计算所需空间(输入大小的10倍) - required_space = input_size * 10 + required_space = input_size * 8 if free_space < required_space: error_msg = ( diff --git a/utils/logger.py b/utils/logger.py index 9aee1a6..80c1f10 100644 --- a/utils/logger.py +++ b/utils/logger.py @@ -2,34 +2,35 @@ import logging import os from datetime import datetime + def setup_logger(output_dir): # 创建logs目录 log_dir = os.path.join(output_dir, 'logs') - + # 创建日志文件名(包含时间戳) timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') log_file = os.path.join(log_dir, f'preprocess_{timestamp}.log') - + # 配置日志格式 formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) - + # 配置文件处理器 file_handler = logging.FileHandler(log_file, encoding='utf-8') file_handler.setFormatter(formatter) - + # 配置控制台处理器 console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) - + # 获取根日志记录器 logger = logging.getLogger('UAV_Preprocess') logger.setLevel(logging.INFO) - + # 添加处理器 logger.addHandler(file_handler) logger.addHandler(console_handler) - - return logger \ No newline at end of file + + return logger diff --git a/utils/odm_monitor.py b/utils/odm_monitor.py index 0bf1916..82ee4cd 100644 --- a/utils/odm_monitor.py +++ b/utils/odm_monitor.py @@ -85,21 +85,20 @@ class ODMProcessMonitor: self.logger.error("容器运行失败的详细错误日志:") for line in error_msg: self.logger.error(line) + container.remove() + time.sleep(5) else: # 获取所有日志 logs = container.logs().decode("utf-8").splitlines() - # 输出最后 50 行日志 self.logger.info("容器运行完成,以下是最后 50 行日志:") for line in logs[-50:]: self.logger.info(line) success = True error_msg = "" + container.remove() break - # 删除容器 - container.remove() - time.sleep(5) return success, error_msg diff --git a/utils/visualizer.py b/utils/visualizer.py index 83918ac..531a0ac 100644 --- a/utils/visualizer.py +++ b/utils/visualizer.py @@ -8,11 +8,11 @@ from pyproj import Transformer class FilterVisualizer: """过滤结果可视化器""" - + def __init__(self, output_dir: str): """ 初始化可视化器 - + Args: output_dir: 输出目录路径 """ @@ -24,28 +24,28 @@ class FilterVisualizer: "EPSG:32649", # UTM49N always_xy=True ) - + def _convert_to_utm(self, lon: pd.Series, lat: pd.Series) -> tuple: """ 将经纬度坐标转换为UTM坐标 - + Args: lon: 经度序列 lat: 纬度序列 - + Returns: tuple: (x坐标, y坐标) """ return self.transformer.transform(lon, lat) - - def visualize_filter_step(self, - current_points: pd.DataFrame, - previous_points: pd.DataFrame, - step_name: str, - save_name: Optional[str] = None): + + def visualize_filter_step(self, + current_points: pd.DataFrame, + previous_points: pd.DataFrame, + step_name: str, + save_name: Optional[str] = None): """ 可视化单个过滤步骤的结果 - + Args: current_points: 当前步骤后的点 previous_points: 上一步骤的点 @@ -53,39 +53,43 @@ class FilterVisualizer: save_name: 保存文件名,默认为step_name """ self.logger.info(f"开始生成{step_name}的可视化结果") - + # 找出被过滤掉的点 - filtered_files = set(previous_points['file']) - set(current_points['file']) - filtered_points = previous_points[previous_points['file'].isin(filtered_files)] - + filtered_files = set( + previous_points['file']) - set(current_points['file']) + filtered_points = previous_points[previous_points['file'].isin( + filtered_files)] + # 转换坐标到UTM - current_x, current_y = self._convert_to_utm(current_points['lon'], current_points['lat']) - filtered_x, filtered_y = self._convert_to_utm(filtered_points['lon'], filtered_points['lat']) - + current_x, current_y = self._convert_to_utm( + current_points['lon'], current_points['lat']) + filtered_x, filtered_y = self._convert_to_utm( + filtered_points['lon'], filtered_points['lat']) + # 创建图形 - plt.rcParams['font.sans-serif']=['SimHei']#黑体 + plt.rcParams['font.sans-serif'] = ['SimHei'] # 黑体 plt.rcParams['axes.unicode_minus'] = False - plt.figure() - + plt.figure(figsize=(20, 20)) + # 绘制保留的点 plt.scatter(current_x, current_y, - color='blue', label='保留的点', - alpha=0.6, s=50) - + color='blue', label='保留的点', + alpha=0.6, s=5) + # 绘制被过滤的点 if not filtered_points.empty: plt.scatter(filtered_x, filtered_y, - color='red', marker='x', label='过滤的点', - alpha=0.6, s=100) - + color='red', marker='x', label='过滤的点') + # 设置图形属性 plt.title(f"{step_name}后的GPS点\n" - f"(过滤: {len(filtered_points)}, 保留: {len(current_points)})", - fontsize=14) + f"(过滤: {len(filtered_points)}, 保留: {len(current_points)})", + fontsize=14) plt.xlabel("东向坐标 (米)", fontsize=12) plt.ylabel("北向坐标 (米)", fontsize=12) plt.grid(True) - + plt.axis('equal') + # 添加统计信息 stats_text = ( f"原始点数: {len(previous_points)}\n" @@ -94,20 +98,21 @@ class FilterVisualizer: f"过滤率: {len(filtered_points)/len(previous_points)*100:.1f}%" ) plt.figtext(0.02, 0.02, stats_text, fontsize=10, - bbox=dict(facecolor='white', alpha=0.8)) - + bbox=dict(facecolor='white', alpha=0.8)) + # 添加图例 plt.legend(loc='upper right', fontsize=10) - + # 调整布局 plt.tight_layout() - + # 保存图形 save_name = save_name or step_name.lower().replace(' ', '_') - save_path = os.path.join(self.output_dir, 'filter_imgs', f'filter_{save_name}.png') + save_path = os.path.join( + self.output_dir, 'filter_imgs', f'filter_{save_name}.png') plt.savefig(save_path, dpi=300, bbox_inches='tight') plt.close() - + self.logger.info( f"{step_name}过滤可视化结果已保存至 {save_path}\n" f"过滤掉 {len(filtered_points)} 个点," @@ -120,11 +125,11 @@ if __name__ == '__main__': # 测试代码 import numpy as np from datetime import datetime - + # 创建测试数据 np.random.seed(42) n_points = 1000 - + # 生成随机点 test_data = pd.DataFrame({ 'lon': np.random.uniform(120, 121, n_points), @@ -132,16 +137,16 @@ if __name__ == '__main__': 'file': [f'img_{i}.jpg' for i in range(n_points)], 'date': [datetime.now() for _ in range(n_points)] }) - + # 随机选择点作为过滤后的结果 filtered_data = test_data.sample(n=800) - + # 测试可视化 visualizer = FilterVisualizer('test_output') os.makedirs('test_output', exist_ok=True) - + visualizer.visualize_filter_step( filtered_data, test_data, "Test Filter" - ) \ No newline at end of file + )