run_pipeline_simple.sh 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. #!/bin/bash
  2. # ============================================================================
  3. # Floorplan Pipeline Docker 一键执行脚本
  4. # ============================================================================
  5. # 功能:自动启动容器并依次执行 extract_initial_mask -> inference_refine_mask ->
  6. # pipeline -> vis
  7. # 镜像:floorplan_env_full:latest (自带 CUDA 库)
  8. # 用法:./run_pipeline_docker.sh <图片名称>
  9. # 示例:./run_pipeline_docker.sh SG-n6nV8B2oW95
  10. # ============================================================================
  11. # 记录开始时间
  12. START_TIME=$(date +%s)
  13. echo "=============================================="
  14. echo " Floorplan Pipeline Docker 一键处理"
  15. echo "=============================================="
  16. echo ""
  17. # 检查参数
  18. if [ -z "$1" ]; then
  19. echo "用法:./run_pipeline_docker.sh <图片名称>"
  20. echo "示例:./run_pipeline_docker.sh SG-n6nV8B2oW95"
  21. exit 1
  22. fi
  23. IMAGE_NAME="$1"
  24. # 获取当前工作目录的绝对路径
  25. WORK_DIR=$(pwd)
  26. # Docker 镜像和容器名称
  27. IMAGE_NAME_DOCKER="floorplan_env_full:latest"
  28. CONTAINER_NAME="floorplan_container"
  29. # 获取实际图片文件名(支持多种格式)
  30. get_image_file() {
  31. local img_name="$1"
  32. local img_dir="${WORK_DIR}/temp_data"
  33. # 检查是否是目录(已处理的图片)
  34. if [ -d "${img_dir}/${img_name}" ]; then
  35. # 在目录中查找原图
  36. for ext in png jpg jpeg; do
  37. if [ -f "${img_dir}/${img_name}/${img_name}.${ext}" ]; then
  38. echo "${img_name}/${img_name}.${ext}"
  39. return 0
  40. fi
  41. done
  42. fi
  43. # 检查是否是文件
  44. if [ -f "${img_dir}/${img_name}" ]; then
  45. echo "${img_name}"
  46. return 0
  47. elif [ -f "${img_dir}/${img_name}.png" ]; then
  48. echo "${img_name}.png"
  49. return 0
  50. elif [ -f "${img_dir}/${img_name}.jpg" ]; then
  51. echo "${img_name}.jpg"
  52. return 0
  53. fi
  54. return 1
  55. }
  56. ACTUAL_IMAGE_FILE=$(get_image_file "${IMAGE_NAME}")
  57. if [ -z "${ACTUAL_IMAGE_FILE}" ]; then
  58. echo "❌ 图片不存在:${WORK_DIR}/temp_data/${IMAGE_NAME}*"
  59. echo " 请确认图片名称(可带扩展名或不带)"
  60. exit 1
  61. fi
  62. # 检查并启动容器
  63. if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
  64. echo "✅ 容器 '${CONTAINER_NAME}' 已在运行"
  65. else
  66. echo "🚀 启动 Docker 容器 '${CONTAINER_NAME}'..."
  67. # 检查容器是否存在(已停止的)
  68. if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
  69. # 容器存在,直接启动
  70. docker start ${CONTAINER_NAME}
  71. else
  72. # 容器不存在,创建新容器
  73. docker run -td \
  74. --gpus all \
  75. --name ${CONTAINER_NAME} \
  76. --ipc=host \
  77. -v "${WORK_DIR}":"${WORK_DIR}" \
  78. -w "${WORK_DIR}" \
  79. ${IMAGE_NAME_DOCKER}
  80. if [ $? -ne 0 ]; then
  81. echo "❌ 启动容器失败"
  82. exit 1
  83. fi
  84. echo "✅ 容器启动成功(镜像已自带 CUDA 库)"
  85. fi
  86. fi
  87. echo ""
  88. echo "📁 处理图片:${ACTUAL_IMAGE_FILE}"
  89. echo ""
  90. # ============================================================================
  91. # Step 1: 提取 initial mask
  92. # ============================================================================
  93. echo "=============================================="
  94. echo " Step 1/4: 提取 Initial Mask"
  95. echo "=============================================="
  96. docker exec -w "${WORK_DIR}" ${CONTAINER_NAME} python extract_initial_mask.py "${IMAGE_NAME}"
  97. if [ $? -ne 0 ]; then
  98. echo "❌ Step 1 失败,终止流程"
  99. exit 1
  100. fi
  101. echo ""
  102. # 清理显存
  103. echo "🧹 清理显存..."
  104. docker exec -w "${WORK_DIR}" ${CONTAINER_NAME} python -c "import torch; torch.cuda.empty_cache()"
  105. echo ""
  106. # ============================================================================
  107. # Step 2: 推理 refine mask
  108. # ============================================================================
  109. echo "=============================================="
  110. echo " Step 2/4: 推理 Refine Mask"
  111. echo "=============================================="
  112. BASE_NAME="${IMAGE_NAME%.*}" # 去掉扩展名
  113. docker exec -w "${WORK_DIR}" ${CONTAINER_NAME} python inference_refine_mask.py "${BASE_NAME}"
  114. if [ $? -ne 0 ]; then
  115. echo "❌ Step 2 失败,终止流程"
  116. exit 1
  117. fi
  118. echo ""
  119. # 清理显存
  120. echo "🧹 清理显存..."
  121. docker exec -w "${WORK_DIR}" ${CONTAINER_NAME} python -c "import torch; torch.cuda.empty_cache()"
  122. echo ""
  123. # ============================================================================
  124. # Step 3: Pipeline 处理生成 JSON
  125. # ============================================================================
  126. echo "=============================================="
  127. echo " Step 3/4: Pipeline 处理生成 JSON"
  128. echo "=============================================="
  129. docker exec -w "${WORK_DIR}" ${CONTAINER_NAME} python pipeline.py "${BASE_NAME}"
  130. if [ $? -ne 0 ]; then
  131. echo "❌ Step 3 失败,终止流程"
  132. exit 1
  133. fi
  134. echo ""
  135. # ============================================================================
  136. # Step 4: 可视化
  137. # ============================================================================
  138. echo "=============================================="
  139. echo " Step 4/4: 可视化"
  140. echo "=============================================="
  141. docker exec -w "${WORK_DIR}" ${CONTAINER_NAME} python vis.py "${BASE_NAME}"
  142. if [ $? -ne 0 ]; then
  143. echo "❌ Step 4 失败,终止流程"
  144. exit 1
  145. fi
  146. echo ""
  147. # ============================================================================
  148. # 完成
  149. # ============================================================================
  150. echo "=============================================="
  151. echo " ✅ 全部处理完成!"
  152. echo "=============================================="
  153. echo ""
  154. # 修复文件权限(将容器内 root 创建的文件所有权改为宿主机用户)
  155. echo "🔧 修复文件权限..."
  156. docker exec ${CONTAINER_NAME} chown -R $(id -u):$(id -g) "${WORK_DIR}/temp_data/${BASE_NAME}"
  157. echo ""
  158. echo "📁 结果位置:temp_data/${BASE_NAME}/"
  159. ls -1 "${WORK_DIR}/temp_data/${BASE_NAME}/"
  160. # 计算并显示运行时间
  161. END_TIME=$(date +%s)
  162. ELAPSED=$((END_TIME - START_TIME))
  163. # 格式化时间显示(超过 60 秒显示为分钟)
  164. if [ $ELAPSED -ge 60 ]; then
  165. MINUTES=$((ELAPSED / 60))
  166. SECONDS=$((ELAPSED % 60))
  167. echo "⏱️ 总耗时:${MINUTES}分${SECONDS}秒"
  168. else
  169. echo "⏱️ 总耗时:${ELAPSED}秒"
  170. fi