|
@@ -85,36 +85,43 @@ class PairedImageSaver:
|
|
|
# 从配置模块读取 OSS 和设备配置(确保即使外部不传也能正确配置)
|
|
# 从配置模块读取 OSS 和设备配置(确保即使外部不传也能正确配置)
|
|
|
try:
|
|
try:
|
|
|
from config import S3_COMPATIBLE_CONFIG, DEVICE_CONFIG
|
|
from config import S3_COMPATIBLE_CONFIG, DEVICE_CONFIG
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
# OSS 配置:优先使用传入参数,否则从配置模块读取
|
|
# OSS 配置:优先使用传入参数,否则从配置模块读取
|
|
|
- if enable_oss or (not enable_oss and S3_COMPATIBLE_CONFIG.get('enabled', False)):
|
|
|
|
|
|
|
+ oss_enabled_in_config = S3_COMPATIBLE_CONFIG.get('enabled', False)
|
|
|
|
|
+ if enable_oss or (not enable_oss and oss_enabled_in_config):
|
|
|
self.enable_oss = True
|
|
self.enable_oss = True
|
|
|
else:
|
|
else:
|
|
|
self.enable_oss = enable_oss
|
|
self.enable_oss = enable_oss
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
|
|
+ logger.info(f"[配对保存] OSS配置: enable_oss={enable_oss}, config_enabled={oss_enabled_in_config}, 最终启用={self.enable_oss}")
|
|
|
|
|
+
|
|
|
# OSS 上传器:优先使用传入的实例,否则从全局获取
|
|
# OSS 上传器:优先使用传入的实例,否则从全局获取
|
|
|
if oss_uploader is not None:
|
|
if oss_uploader is not None:
|
|
|
self.oss_uploader = oss_uploader
|
|
self.oss_uploader = oss_uploader
|
|
|
|
|
+ logger.info("[配对保存] 使用传入的 OSS 上传器")
|
|
|
elif self.enable_oss:
|
|
elif self.enable_oss:
|
|
|
try:
|
|
try:
|
|
|
from oss_uploader import get_oss_uploader
|
|
from oss_uploader import get_oss_uploader
|
|
|
self.oss_uploader = get_oss_uploader()
|
|
self.oss_uploader = get_oss_uploader()
|
|
|
|
|
+ logger.info(f"[配对保存] 获取 OSS 上传器: enabled={self.oss_uploader.enabled}, running={getattr(self.oss_uploader, 'running', False)}")
|
|
|
if not self.oss_uploader.running:
|
|
if not self.oss_uploader.running:
|
|
|
self.oss_uploader.start()
|
|
self.oss_uploader.start()
|
|
|
|
|
+ logger.info("[配对保存] OSS 上传器已启动")
|
|
|
except Exception as e:
|
|
except Exception as e:
|
|
|
logger.warning(f"[配对保存] OSS 上传器初始化失败: {e}")
|
|
logger.warning(f"[配对保存] OSS 上传器初始化失败: {e}")
|
|
|
self.oss_uploader = None
|
|
self.oss_uploader = None
|
|
|
self.enable_oss = False
|
|
self.enable_oss = False
|
|
|
else:
|
|
else:
|
|
|
self.oss_uploader = None
|
|
self.oss_uploader = None
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
# 设备配置:合并传入参数和配置模块
|
|
# 设备配置:合并传入参数和配置模块
|
|
|
self.device_config = DEVICE_CONFIG.copy()
|
|
self.device_config = DEVICE_CONFIG.copy()
|
|
|
if device_config:
|
|
if device_config:
|
|
|
self.device_config.update(device_config)
|
|
self.device_config.update(device_config)
|
|
|
-
|
|
|
|
|
- except ImportError:
|
|
|
|
|
|
|
+
|
|
|
|
|
+ except ImportError as e:
|
|
|
# 配置模块不可用时使用传入参数
|
|
# 配置模块不可用时使用传入参数
|
|
|
|
|
+ logger.warning(f"[配对保存] 配置模块导入失败: {e}")
|
|
|
self.enable_oss = enable_oss
|
|
self.enable_oss = enable_oss
|
|
|
self.oss_uploader = oss_uploader
|
|
self.oss_uploader = oss_uploader
|
|
|
self.device_config = device_config or {}
|
|
self.device_config = device_config or {}
|
|
@@ -240,8 +247,12 @@ class PairedImageSaver:
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
# 上传全景图到 OSS
|
|
# 上传全景图到 OSS
|
|
|
|
|
+ logger.info(f"[配对保存] 开始新批次: enable_oss={self.enable_oss}, uploader={self.oss_uploader}, path={panorama_path}")
|
|
|
if self.enable_oss and panorama_path and self.oss_uploader:
|
|
if self.enable_oss and panorama_path and self.oss_uploader:
|
|
|
|
|
+ logger.info(f"[配对保存] 准备上传全景图到 OSS: {panorama_path}")
|
|
|
self._upload_panorama_to_oss(batch_id, panorama_path)
|
|
self._upload_panorama_to_oss(batch_id, panorama_path)
|
|
|
|
|
+ else:
|
|
|
|
|
+ logger.warning(f"[配对保存] OSS未启用或上传器不可用: enable_oss={self.enable_oss}, uploader={self.oss_uploader}")
|
|
|
|
|
|
|
|
return batch_id
|
|
return batch_id
|
|
|
|
|
|
|
@@ -398,8 +409,9 @@ class PairedImageSaver:
|
|
|
self._stats['total_ptz_images'] += 1
|
|
self._stats['total_ptz_images'] += 1
|
|
|
|
|
|
|
|
logger.info(f"[配对保存] 球机图已保存: {filepath}, BBox={ptz_bbox}")
|
|
logger.info(f"[配对保存] 球机图已保存: {filepath}, BBox={ptz_bbox}")
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
# 上传球机图到 OSS
|
|
# 上传球机图到 OSS
|
|
|
|
|
+ logger.info(f"[配对保存] 准备上传球机图到 OSS: enable_oss={self.enable_oss}, uploader={self.oss_uploader}")
|
|
|
if self.enable_oss and self.oss_uploader:
|
|
if self.enable_oss and self.oss_uploader:
|
|
|
self._upload_ptz_to_oss(batch_id, person_index, str(filepath))
|
|
self._upload_ptz_to_oss(batch_id, person_index, str(filepath))
|
|
|
else:
|
|
else:
|
|
@@ -414,7 +426,10 @@ class PairedImageSaver:
|
|
|
|
|
|
|
|
def _upload_panorama_to_oss(self, batch_id: str, panorama_path: str):
|
|
def _upload_panorama_to_oss(self, batch_id: str, panorama_path: str):
|
|
|
"""上传全景图到 OSS"""
|
|
"""上传全景图到 OSS"""
|
|
|
|
|
+ logger.info(f"[OSS] _upload_panorama_to_oss 被调用: batch_id={batch_id}, path={panorama_path}")
|
|
|
|
|
+
|
|
|
def on_upload_complete(result):
|
|
def on_upload_complete(result):
|
|
|
|
|
+ logger.info(f"[OSS] 全景图上传完成回调: success={result.success}, url={result.oss_url}")
|
|
|
# 更新上传状态(即使 _current_batch 已切换也能正确记录)
|
|
# 更新上传状态(即使 _current_batch 已切换也能正确记录)
|
|
|
self._upload_status[batch_id]['panorama'] = True
|
|
self._upload_status[batch_id]['panorama'] = True
|
|
|
self._upload_status[batch_id]['panorama_url'] = result.oss_url
|
|
self._upload_status[batch_id]['panorama_url'] = result.oss_url
|
|
@@ -425,6 +440,7 @@ class PairedImageSaver:
|
|
|
logger.info(f"[OSS] 全景图上传成功: {result.oss_url}")
|
|
logger.info(f"[OSS] 全景图上传成功: {result.oss_url}")
|
|
|
|
|
|
|
|
def on_upload_error(result):
|
|
def on_upload_error(result):
|
|
|
|
|
+ logger.error(f"[OSS] 全景图上传失败回调: {result.error}")
|
|
|
self._upload_status[batch_id]['panorama'] = False
|
|
self._upload_status[batch_id]['panorama'] = False
|
|
|
self._upload_status[batch_id]['panorama_url'] = None
|
|
self._upload_status[batch_id]['panorama_url'] = None
|
|
|
with self._stats_lock:
|
|
with self._stats_lock:
|
|
@@ -433,21 +449,29 @@ class PairedImageSaver:
|
|
|
|
|
|
|
|
# 包装回调,同时处理成功和失败
|
|
# 包装回调,同时处理成功和失败
|
|
|
def on_upload_done(result):
|
|
def on_upload_done(result):
|
|
|
|
|
+ logger.info(f"[OSS] 全景图上传结果: success={result.success}")
|
|
|
if result.success:
|
|
if result.success:
|
|
|
on_upload_complete(result)
|
|
on_upload_complete(result)
|
|
|
else:
|
|
else:
|
|
|
on_upload_error(result)
|
|
on_upload_error(result)
|
|
|
|
|
|
|
|
- self.oss_uploader.upload_image(
|
|
|
|
|
- local_path=panorama_path,
|
|
|
|
|
- batch_id=batch_id,
|
|
|
|
|
- image_type='panorama',
|
|
|
|
|
- callback=on_upload_done
|
|
|
|
|
- )
|
|
|
|
|
|
|
+ try:
|
|
|
|
|
+ oss_key = self.oss_uploader.upload_image(
|
|
|
|
|
+ local_path=panorama_path,
|
|
|
|
|
+ batch_id=batch_id,
|
|
|
|
|
+ image_type='panorama',
|
|
|
|
|
+ callback=on_upload_done
|
|
|
|
|
+ )
|
|
|
|
|
+ logger.info(f"[OSS] 全景图已加入上传队列: oss_key={oss_key}")
|
|
|
|
|
+ except Exception as e:
|
|
|
|
|
+ logger.error(f"[OSS] 全景图上传异常: {e}")
|
|
|
|
|
|
|
|
def _upload_ptz_to_oss(self, batch_id: str, person_index: int, ptz_path: str):
|
|
def _upload_ptz_to_oss(self, batch_id: str, person_index: int, ptz_path: str):
|
|
|
"""上传球机图到 OSS"""
|
|
"""上传球机图到 OSS"""
|
|
|
|
|
+ logger.info(f"[OSS] _upload_ptz_to_oss 被调用: batch_id={batch_id}, person={person_index}, path={ptz_path}")
|
|
|
|
|
+
|
|
|
def on_upload_complete(result):
|
|
def on_upload_complete(result):
|
|
|
|
|
+ logger.info(f"[OSS] 球机图上传完成回调: person={person_index}, success={result.success}, url={result.oss_url}")
|
|
|
# 更新上传状态(即使 _current_batch 已切换也能正确记录)
|
|
# 更新上传状态(即使 _current_batch 已切换也能正确记录)
|
|
|
self._upload_status[batch_id]['ptz'][person_index] = result.oss_url
|
|
self._upload_status[batch_id]['ptz'][person_index] = result.oss_url
|
|
|
if self._current_batch and self._current_batch.batch_id == batch_id:
|
|
if self._current_batch and self._current_batch.batch_id == batch_id:
|
|
@@ -458,6 +482,7 @@ class PairedImageSaver:
|
|
|
logger.info(f"[OSS] 球机图上传成功 (person_{person_index}): {result.oss_url}")
|
|
logger.info(f"[OSS] 球机图上传成功 (person_{person_index}): {result.oss_url}")
|
|
|
|
|
|
|
|
def on_upload_error(result):
|
|
def on_upload_error(result):
|
|
|
|
|
+ logger.error(f"[OSS] 球机图上传失败回调: person={person_index}, error={result.error}")
|
|
|
self._upload_status[batch_id]['ptz'][person_index] = None
|
|
self._upload_status[batch_id]['ptz'][person_index] = None
|
|
|
with self._stats_lock:
|
|
with self._stats_lock:
|
|
|
self._stats['oss_upload_failed'] += 1
|
|
self._stats['oss_upload_failed'] += 1
|
|
@@ -465,18 +490,23 @@ class PairedImageSaver:
|
|
|
|
|
|
|
|
# 包装回调,同时处理成功和失败
|
|
# 包装回调,同时处理成功和失败
|
|
|
def on_upload_done(result):
|
|
def on_upload_done(result):
|
|
|
|
|
+ logger.info(f"[OSS] 球机图上传结果: person={person_index}, success={result.success}")
|
|
|
if result.success:
|
|
if result.success:
|
|
|
on_upload_complete(result)
|
|
on_upload_complete(result)
|
|
|
else:
|
|
else:
|
|
|
on_upload_error(result)
|
|
on_upload_error(result)
|
|
|
|
|
|
|
|
- self.oss_uploader.upload_image(
|
|
|
|
|
- local_path=ptz_path,
|
|
|
|
|
- batch_id=batch_id,
|
|
|
|
|
- image_type='ptz',
|
|
|
|
|
- person_index=person_index,
|
|
|
|
|
- callback=on_upload_done
|
|
|
|
|
- )
|
|
|
|
|
|
|
+ try:
|
|
|
|
|
+ oss_key = self.oss_uploader.upload_image(
|
|
|
|
|
+ local_path=ptz_path,
|
|
|
|
|
+ batch_id=batch_id,
|
|
|
|
|
+ image_type='ptz',
|
|
|
|
|
+ person_index=person_index,
|
|
|
|
|
+ callback=on_upload_done
|
|
|
|
|
+ )
|
|
|
|
|
+ logger.info(f"[OSS] 球机图已加入上传队列: person={person_index}, oss_key={oss_key}")
|
|
|
|
|
+ except Exception as e:
|
|
|
|
|
+ logger.error(f"[OSS] 球机图上传异常: {e}")
|
|
|
|
|
|
|
|
def _finalize_batch(self, batch: DetectionBatch):
|
|
def _finalize_batch(self, batch: DetectionBatch):
|
|
|
"""完成批次处理"""
|
|
"""完成批次处理"""
|