run_pipeline.sh 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. #!/bin/bash
  2. # ============================================================================
  3. # Floorplan Pipeline 一键执行脚本
  4. # ============================================================================
  5. # 功能:依次执行 extract_initial_mask -> inference_refine_mask -> pipeline -> vis
  6. # 环境:conda activate floorplan_env
  7. # 用法:./run_pipeline.sh <图片名称>
  8. # 示例:./run_pipeline.sh SG-n6nV8B2oW95
  9. # ============================================================================
  10. # 记录开始时间
  11. START_TIME=$(date +%s)
  12. # ============================================================================
  13. # 内存和显存监控变量
  14. # ============================================================================
  15. MONITOR_DIR="/tmp/floorplan_monitor_$$"
  16. mkdir -p "$MONITOR_DIR"
  17. echo "0" > "$MONITOR_DIR/max_ram"
  18. echo "0" > "$MONITOR_DIR/max_vram"
  19. MONITOR_PID=""
  20. # 获取所有 python 进程的总 RAM 占用 (MB)
  21. get_python_ram_usage() {
  22. local total=0
  23. for pid in $(pgrep -f "python.*\.py" 2>/dev/null); do
  24. if [ -f "/proc/$pid/status" ]; then
  25. local vmrss=$(grep VmRSS /proc/$pid/status 2>/dev/null | awk '{print $2}')
  26. if [ -n "$vmrss" ]; then
  27. total=$((total + vmrss / 1024))
  28. fi
  29. fi
  30. done
  31. echo "$total"
  32. }
  33. # 获取 GPU 显存占用 (MB)
  34. get_vram_usage() {
  35. local used=$(nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits 2>/dev/null | awk '{sum+=$1} END {print sum+0}')
  36. echo "$used"
  37. }
  38. # 后台监控进程(使用子 shell)
  39. monitor_memory() {
  40. local max_ram_file="$MONITOR_DIR/max_ram"
  41. local max_vram_file="$MONITOR_DIR/max_vram"
  42. local running_flag="$MONITOR_DIR/running"
  43. echo "1" > "$running_flag"
  44. while [ "$(cat "$running_flag" 2>/dev/null)" = "1" ]; do
  45. local ram=$(get_python_ram_usage)
  46. local vram=$(get_vram_usage)
  47. # 更新最大值(空值默认为 0)
  48. local cur_max_ram=$(cat "$max_ram_file" 2>/dev/null || echo "0")
  49. local cur_max_vram=$(cat "$max_vram_file" 2>/dev/null || echo "0")
  50. cur_max_ram=${cur_max_ram:-0}
  51. cur_max_vram=${cur_max_vram:-0}
  52. [ -n "$ram" ] && [ "$ram" -gt "$cur_max_ram" ] 2>/dev/null && echo "$ram" > "$max_ram_file"
  53. [ -n "$vram" ] && [ "$vram" -gt "$cur_max_vram" ] 2>/dev/null && echo "$vram" > "$max_vram_file"
  54. sleep 1
  55. done
  56. }
  57. echo "=============================================="
  58. echo " Floorplan Pipeline 一键处理"
  59. echo "=============================================="
  60. echo ""
  61. # 检查参数
  62. if [ -z "$1" ]; then
  63. echo "用法:./run_pipeline.sh <图片名称>"
  64. echo "示例:./run_pipeline.sh SG-n6nV8B2oW95"
  65. exit 1
  66. fi
  67. IMAGE_NAME="$1"
  68. # 1. 激活 conda 环境
  69. echo "🔧 激活 conda 环境:floorplan_env"
  70. source /home/dage/Project/Miniconda-25-1/etc/profile.d/conda.sh
  71. conda activate floorplan_env
  72. if [ $? -ne 0 ]; then
  73. echo "❌ 激活 conda 环境失败,请检查环境名称是否正确"
  74. exit 1
  75. fi
  76. echo "✅ 环境激活成功"
  77. echo ""
  78. # 2. 检查图片是否存在
  79. if [ ! -f "temp_data/${IMAGE_NAME}" ] && [ ! -f "temp_data/${IMAGE_NAME}.png" ] && [ ! -f "temp_data/${IMAGE_NAME}.jpg" ]; then
  80. echo "❌ 图片不存在:temp_data/${IMAGE_NAME}*"
  81. echo " 请确认图片名称(可带扩展名或不带)"
  82. exit 1
  83. fi
  84. echo "📁 处理图片:${IMAGE_NAME}"
  85. echo ""
  86. # 启动后台监控
  87. echo "📊 内存/显存监控已启动"
  88. echo ""
  89. monitor_memory &
  90. MONITOR_PID=$!
  91. # ============================================================================
  92. # Step 1: 提取 initial mask
  93. # ============================================================================
  94. echo "=============================================="
  95. echo " Step 1/4: 提取 Initial Mask"
  96. echo "=============================================="
  97. python extract_initial_mask.py "${IMAGE_NAME}"
  98. if [ $? -ne 0 ]; then
  99. echo "❌ Step 1 失败,终止流程"
  100. exit 1
  101. fi
  102. echo ""
  103. # 清理显存
  104. echo "🧹 清理显存..."
  105. python -c "import torch; torch.cuda.empty_cache()"
  106. echo ""
  107. # ============================================================================
  108. # Step 2: 推理 refine mask
  109. # ============================================================================
  110. echo "=============================================="
  111. echo " Step 2/4: 推理 Refine Mask"
  112. echo "=============================================="
  113. BASE_NAME="${IMAGE_NAME%.*}" # 去掉扩展名
  114. python inference_refine_mask.py "${BASE_NAME}"
  115. if [ $? -ne 0 ]; then
  116. echo "❌ Step 2 失败,终止流程"
  117. exit 1
  118. fi
  119. echo ""
  120. # 清理显存
  121. echo "🧹 清理显存..."
  122. python -c "import torch; torch.cuda.empty_cache()"
  123. echo ""
  124. # ============================================================================
  125. # Step 3: Pipeline 处理生成 JSON
  126. # ============================================================================
  127. echo "=============================================="
  128. echo " Step 3/4: Pipeline 处理生成 JSON"
  129. echo "=============================================="
  130. python pipeline.py "${BASE_NAME}"
  131. if [ $? -ne 0 ]; then
  132. echo "❌ Step 3 失败,终止流程"
  133. exit 1
  134. fi
  135. echo ""
  136. # ============================================================================
  137. # Step 4: 可视化
  138. # ============================================================================
  139. echo "=============================================="
  140. echo " Step 4/4: 可视化"
  141. echo "=============================================="
  142. python vis.py "${BASE_NAME}"
  143. if [ $? -ne 0 ]; then
  144. echo "❌ Step 4 失败,终止流程"
  145. exit 1
  146. fi
  147. echo ""
  148. # ============================================================================
  149. # 完成
  150. # ============================================================================
  151. # 停止监控进程
  152. echo "0" > "$MONITOR_DIR/running"
  153. sleep 1
  154. kill $MONITOR_PID 2>/dev/null
  155. wait $MONITOR_PID 2>/dev/null
  156. # 读取最大值
  157. MAX_RAM_MB=$(cat "$MONITOR_DIR/max_ram" 2>/dev/null)
  158. MAX_VRAM_MB=$(cat "$MONITOR_DIR/max_vram" 2>/dev/null)
  159. MAX_RAM_MB=${MAX_RAM_MB:-0}
  160. MAX_VRAM_MB=${MAX_VRAM_MB:-0}
  161. # 清理监控目录
  162. rm -rf "$MONITOR_DIR"
  163. echo "=============================================="
  164. echo " ✅ 全部处理完成!"
  165. echo "=============================================="
  166. echo ""
  167. echo "📁 结果位置:temp_data/${BASE_NAME}/"
  168. ls -1 "temp_data/${BASE_NAME}/"
  169. # 计算并显示运行时间
  170. END_TIME=$(date +%s)
  171. ELAPSED=$((END_TIME - START_TIME))
  172. # 格式化时间显示(超过 60 秒显示为分钟)
  173. if [ $ELAPSED -ge 60 ]; then
  174. MINUTES=$((ELAPSED / 60))
  175. SECONDS=$((ELAPSED % 60))
  176. echo "⏱️ 总耗时:${MINUTES}分${SECONDS}秒"
  177. else
  178. echo "⏱️ 总耗时:${ELAPSED}秒"
  179. fi
  180. # 显示内存和显存使用情况
  181. echo ""
  182. echo "=============================================="
  183. echo " 📊 资源使用情况"
  184. echo "=============================================="
  185. echo " 最大内存占用 (RAM): ${MAX_RAM_MB} MB"
  186. echo " 最大显存占用 (VRAM): ${MAX_VRAM_MB} MB"
  187. echo "=============================================="
  188. echo ""