Files
change_hair/adapt_paths.sh
xsl 443cfa298f 初始化:换发型/换发色/训练发型服务
包含:
- hair_service_sd: 主服务(换发型/换发色/生发,端口8801)
- photo_service: LoRA调度+训练(端口32678)
- hair_grow_service: 调试测试页(端口8888,含4个测试页)
- 批量训练脚本(batch_train_hairstyles.py)
- 发际线mask自动识别(hairline_mask.py,4种方案)
- 手绘mask换发型(hair_swap_manual.py)
- 文档:README.md + LARGE_FILES.md + docs/

大文件(模型权重200G、训练数据123G)已排除,见 LARGE_FILES.md
OSS/COS密钥已脱敏为环境变量,原文件备份在本地
2026-07-07 13:53:52 +08:00

101 lines
4.4 KiB
Bash

#!/bin/bash
# 路径适配脚本:修正所有硬编码路径 + conda环境修复 + 端口适配
# 在数据同步完成后执行
set -u
BASE="/home/xsl/change_hair"
PROJ="$BASE/project"
LOG="$PROJ/logs/adapt.log"
mkdir -p "$PROJ/logs"
echo "路径适配开始: $(date '+%Y-%m-%d %H:%M:%S')" | tee "$LOG"
# ============================================================
# 第一部分:conda 环境硬编码路径修复
# ============================================================
echo "=== [1/4] 修复 conda 环境 shebang/路径前缀 ===" | tee -a "$LOG"
for ENV in py310 my_hair sdwebui; do
ENVDIR="/home/xsl/miniconda3/envs/$ENV"
if [ -d "$ENVDIR" ]; then
# 替换所有文本文件里的旧前缀为新前缀
# 旧前缀有两种:/home/szlc/miniconda3 和 /usr/local/miniconda3
grep -rl '/home/szlc/miniconda3\|/usr/local/miniconda3' "$ENVDIR" 2>/dev/null | while read -r f; do
sed -i 's|/home/szlc/miniconda3|/home/xsl/miniconda3|g; s|/usr/local/miniconda3|/home/xsl/miniconda3|g' "$f"
done
echo " [$ENV] 修复完成" | tee -a "$LOG"
else
echo " [$ENV] 目录不存在,跳过" | tee -a "$LOG"
fi
done
# ============================================================
# 第二部分:hair_service_sd 配置和代码路径适配
# ============================================================
echo "=== [2/4] 适配 hair_service_sd 路径 ===" | tee -a "$LOG"
HS="$PROJ/hair_service_sd"
# 安全替换函数:只处理 .py / .ini / .conf 文件,跳过权重/图片/二进制
adapt_hair_paths() {
local f="$1"
[ -f "$f" ] || return 0
case "$f" in
*.py|*.ini|*.conf|*.sh|*.json|*.yaml|*.yml|*.txt) ;;
*) return 0 ;;
esac
sed -i \
-e 's|/home/szlc/project|/home/xsl/change_hair/project|g' \
-e 's|/data/train_material|/home/xsl/change_hair/data/train_material|g' \
-e 's|/home/szlc/miniconda3|/home/xsl/miniconda3|g' \
-e 's|/usr/local/miniconda3|/home/xsl/miniconda3|g' \
"$f"
}
# 处理 hair_service_sd 顶层文件和 common/config 子目录
for f in "$HS"/*.py "$HS"/*.ini "$HS"/*.sh "$HS"/*.conf "$HS"/common/*.py "$HS"/config/*.ini "$HS"/config/*.py "$HS"/core/*.py "$HS"/utils/*.py; do
adapt_hair_paths "$f"
done
echo " hair_service_sd 配置/代码路径已适配" | tee -a "$LOG"
# ============================================================
# 第三部分:photo_service 路径适配
# 注意:photo_service 的 chinatszrn/kohya 路径属于 Docker 训练链路,
# 本机不配 Docker,这些路径保留不动(不影响换发色/换发型)
# 但基础路径和 callback_url 要适配
# ============================================================
echo "=== [3/4] 适配 photo_service 路径 ===" | tee -a "$LOG"
PS="$PROJ/photo_service"
for f in "$PS"/*.py; do
[ -f "$f" ] || continue
sed -i \
-e 's|/home/szlc/project|/home/xsl/change_hair/project|g' \
-e 's|/home/szlc/miniconda3|/home/xsl/miniconda3|g' \
"$f"
done
echo " photo_service 基础路径已适配(kohya/Docker路径保留)" | tee -a "$LOG"
# ============================================================
# 第四部分:onediff webui 路径适配
# ============================================================
echo "=== [4/4] 适配 onediff webui 路径 ===" | tee -a "$LOG"
OD="$PROJ/onediff/stable-diffusion-webui"
# webui config.json 里的 onediff compiler_caches 路径
if [ -f "$OD/config.json" ]; then
sed -i 's|/home/student/Documents/workspace_cxt_tianjing_hair/onediff|/home/xsl/change_hair/project/onediff|g; s|/home/szlc/project/onediff|/home/xsl/change_hair/project/onediff|g' "$OD/config.json"
echo " webui config.json 已适配" | tee -a "$LOG"
fi
# webui 启动脚本
for f in "$OD"/webui.sh "$OD"/webui-user.sh "$PROJ"/onediff/onediff/*.sh; do
[ -f "$f" ] && sed -i 's|/home/szlc/miniconda3|/home/xsl/miniconda3|g' "$f"
done
# ============================================================
# 第五部分:Lora 软链接(photo_service 训练产物输出位置)
# 本机用真实目录,不走 /gz-fs 软链
# ============================================================
echo "=== [5/5] 配置 Lora 目录 ===" | tee -a "$LOG"
mkdir -p "$BASE/gz-fs/Lora"
# webui 的 models/Lora 已随 onediff 拷贝过来(真实目录),无需软链
echo " Lora 目录就绪: $BASE/gz-fs/Lora" | tee -a "$LOG"
echo "路径适配完成: $(date '+%Y-%m-%d %H:%M:%S')" | tee -a "$LOG"
echo "请检查 $LOG 确认无误" | tee -a "$LOG"