更新守护进程

This commit is contained in:
龙澳 2024-12-22 14:28:07 +08:00
parent 37ce5c746f
commit 7f3036a003
3 changed files with 49 additions and 33 deletions

View File

@ -74,6 +74,7 @@ class ImagePreprocessor:
f"噪声点 {stats['noise_points']}"
)
# TODO 过滤算法还需要更新
def filter_points(self) -> pd.DataFrame:
"""过滤GPS点"""
if not self.config.enable_filter:
@ -217,7 +218,7 @@ class ImagePreprocessor:
if __name__ == "__main__":
# 创建配置
config = PreprocessConfig(
image_dir=r"E:\datasets\UAV\283\project\images",
image_dir=r"E:\datasets\UAV\502",
output_dir=r"E:\studio2\ODM_pro\test",
cluster_eps=0.01,
@ -238,7 +239,7 @@ if __name__ == "__main__":
enable_visualization=True,
enable_copy_images=True,
mode="快拼模式",
mode="sadf模式",
)
# 创建处理器并执行

View File

@ -36,10 +36,11 @@ i
"""
try:
grid_dir = os.path.join(self.output_dir, f'grid_{grid_idx + 1}')
grid_dir = grid_dir[0].lower() + grid_dir[1:].replace('\\', '/')
if self.mode == "快拼模式":
command = f"docker run -ti --rm -v {grid_dir}:/datasets opendronemap/odm --project-path /datasets project --feature-quality lowest --force-gps --use-3dmesh --fast-orthophoto --skip-3dmodel"
command = f"docker run -ti --rm -v {grid_dir}:/datasets opendronemap/odm --project-path /datasets project --feature-quality lowest --force-gps --fast-orthophoto --skip-3dmodel"
else:
command = f"docker run -ti --rm -v {grid_dir}:/datasets opendronemap/odm --project-path /datasets project --feature-quality lowest --force-gps --use-3dmesh"
command = f"docker run -ti --rm -v {grid_dir}:/datasets opendronemap/odm --project-path /datasets project --feature-quality lowest --force-gps"
self.logger.info(f"开始执行命令: {command}")
success, error_msg = self.monitor.run_odm_with_monitor(

View File

@ -5,10 +5,11 @@ import logging
import subprocess
from typing import Optional, Tuple
class ODMProcessMonitor:
"""ODM进程监控器"""
def __init__(self, max_retries: int = 3, check_interval: int = 300, mode: str = "快拼模式"):
def __init__(self, max_retries: int = 3, check_interval: int = 10, mode: str = "快拼模式"):
"""
初始化监控器
@ -22,22 +23,28 @@ class ODMProcessMonitor:
self.logger = logging.getLogger('UAV_Preprocess.ODMMonitor')
self.mode = mode
def _is_process_running(self, pid: int) -> bool:
"""检查进程是否在运行"""
def _check_docker_container(self, process_name: str = "opendronemap/odm") -> bool:
"""检查是否有指定的Docker容器在运行"""
try:
process = psutil.Process(pid)
return process.is_running()
except psutil.NoSuchProcess:
result = subprocess.run(
["docker", "ps", "--filter",
f"ancestor={process_name}", "--format", "{{.ID}}"],
capture_output=True,
text=True
)
return bool(result.stdout.strip())
except Exception as e:
self.logger.error(f"检查Docker容器状态时发生错误: {str(e)}")
return False
def _check_success(self, grid_dir: str) -> bool:
"""检查ODM是否执行成功"""
# ODM成功完成时会生成这些文件夹
if self.mode == "快拼模式":
success_markers = ['odm_orthophoto', 'odm_georeferencing']
else:
success_markers = ['odm_orthophoto', 'odm_georeferencing', 'odm_texturing']
return all(os.path.exists(os.path.join(grid_dir, marker)) for marker in success_markers)
success_markers = ['odm_orthophoto',
'odm_georeferencing', 'odm_texturing']
return all(os.path.exists(os.path.join(grid_dir, 'project', marker)) for marker in success_markers)
def run_odm_with_monitor(self, command: str, grid_dir: str, grid_idx: int) -> Tuple[bool, str]:
"""
@ -66,25 +73,32 @@ class ODMProcessMonitor:
text=True
)
pid = process.pid
self.logger.info(f"ODM进程启动PID: {pid}")
self.logger.info("ODM进程已启动开始监控Docker容器")
# 监控进程
# 等待进程启动
time.sleep(10)
# 监控Docker容器
while True:
if not self._is_process_running(pid):
# 进程结束,检查是否成功
if not self._check_docker_container():
# Docker容器已结束获取进程输出
stdout, stderr = process.communicate()
time.sleep(10)
# 保存日志
log_file = os.path.join(grid_dir, f'odm_attempt_{attempt + 1}.log')
log_file = os.path.join(
grid_dir, f'odm_attempt_{attempt + 1}.log')
with open(log_file, 'w', encoding='utf-8') as f:
f.write(f"=== 标准输出 ===\n{stdout}\n\n=== 错误输出 ===\n{stderr}")
f.write(
f"=== 标准输出 ===\n{stdout}\n\n=== 错误输出 ===\n{stderr}")
# 检查是否成功完成
if self._check_success(grid_dir):
self.logger.info(f"网格 {grid_idx + 1} ODM处理成功")
return True, ""
else:
self.logger.warning(f"网格 {grid_idx + 1}{attempt + 1} 次尝试失败")
self.logger.warning(
f"网格 {grid_idx + 1}{attempt + 1} 次尝试失败")
break
time.sleep(self.check_interval)