improve: 修复后端代码注释规范性

pull/45/head
梁浩 4 months ago
parent 8fd6c8f023
commit 6ad854f436

@ -251,11 +251,3 @@ def get_flow_images_binary(flow_id, current_user_id):
'X-Flow-Id': str(flow_id)
}
)
""" 前端解析预览图片方式
const response = await fetch(`/api/image/binary/task/${taskId}`);
const contentType = response.headers.get('content-type');
const boundary = contentType.match(/boundary=(.+)/)[1];
const buffer = await response.arrayBuffer();
// --boundary 分割解析每个 part
"""

@ -1,6 +1,5 @@
"""
任务管理控制器
适配新数据库结构提供加噪微调热力图数值评估等任务相关接口
"""
from flask import Blueprint, request, jsonify

@ -1,5 +1,5 @@
"""
任务处理服务适配新数据库结构和路径配置
任务处理服务
处理加噪微调热力图评估等核心业务逻辑
使用Redis Queue进行异步任务处理

@ -1,5 +1,5 @@
"""
RQ Worker 数值评估任务处理器仅使用真实算法
RQ Worker 数值评估任务处理器
生成原始图与扰动图微调后的模型生成效果对比报告
"""
@ -20,7 +20,7 @@ logger = logging.getLogger(__name__)
def run_evaluate_task(task_id, clean_ref_dir, clean_output_dir,
perturbed_output_dir, output_dir, image_size=512):
"""
执行数值评估任务仅使用真实算法
执行数值评估任务
Args:
task_id: 任务ID

@ -1,6 +1,5 @@
"""
RQ Worker 微调任务处理器 - 适配新数据库结构
仅支持真实算法移除虚拟算法调用
RQ Worker 微调任务处理器
"""
import os
@ -22,7 +21,7 @@ def run_finetune_task(task_id, finetune_method, train_images_dir,
output_model_dir, class_dir, coords_save_path, validation_output_dir,
finetune_type, custom_params=None):
"""
执行微调任务仅使用真实算法
执行微调任务
Args:
task_id: 任务ID
@ -95,7 +94,7 @@ def run_finetune_task(task_id, finetune_method, train_images_dir,
# DreamBooth/LoRA: 直接使用模板
instance_prompt_prefix = instance_prompt
# 处理 Validation Prompt (拼接后缀)
# 处理 Validation Prompt
prompt_suffix = finetune.custom_prompt.strip() if finetune.custom_prompt else ""
if prompt_suffix:
@ -207,7 +206,7 @@ def _run_real_finetune(finetune_method, task_id, train_images_dir, output_model_
class_dir, coords_save_path, validation_output_dir,
instance_prompt, class_prompt, validation_prompt, finetune_type, custom_params, log_file):
"""
运行真实微调算法参考sh脚本配置
运行真实微调算法
Args:
finetune_method: 微调方法
@ -240,7 +239,7 @@ def _run_real_finetune(finetune_method, task_id, train_images_dir, output_model_
if not script_path:
raise ValueError(f"Finetune method {finetune_method} not configured")
# 覆盖提示词参数(从数据库读取)
# 覆盖提示词参数
if 'instance_prompt' in default_params:
default_params['instance_prompt'] = instance_prompt
if 'class_prompt' in default_params:
@ -273,7 +272,7 @@ def _run_real_finetune(finetune_method, task_id, train_images_dir, output_model_
])
elif finetune_method == 'textual_inversion':
# Textual Inversion 特有参数 (不需要 class_data_dir)
# Textual Inversion 特有参数
cmd_args.extend([
f"--coords_save_path={coords_save_path}",
])
@ -354,30 +353,6 @@ def _run_real_finetune(finetune_method, task_id, train_images_dir, output_model_
os.makedirs(output_model_dir)
logger.info(f"Cleanup completed. Only validation images and coords.json are kept.")
# # 清理class_dir参考sh脚本
# if finetune_method in ['dreambooth', 'lora']:
# logger.info(f"Cleaning class directory: {class_dir}")
# if os.path.exists(class_dir):
# shutil.rmtree(class_dir)
# os.makedirs(class_dir)
# # 清理output_model_dir中的非图片文件
# logger.info(f"Cleaning non-image files in output directory: {output_model_dir}")
# if os.path.exists(output_model_dir):
# image_extensions = {'.jpg', '.jpeg', '.png', '.bmp', '.gif', '.webp', '.tiff'}
# for item in os.listdir(output_model_dir):
# item_path = os.path.join(output_model_dir, item)
# if os.path.isfile(item_path):
# _, ext = os.path.splitext(item)
# if ext.lower() not in image_extensions:
# try:
# os.remove(item_path)
# logger.info(f"Removed non-image file: {item}")
# except Exception as e:
# logger.warning(f"Failed to remove {item}: {str(e)}")
return {
'status': 'success',
@ -388,7 +363,7 @@ def _run_real_finetune(finetune_method, task_id, train_images_dir, output_model_
def _save_generated_images(task_id, output_dir, finetune_type):
"""
保存微调生成的验证图片到数据库适配新数据库结构
保存微调生成的验证图片到数据库
新数据库结构
- Task表tasks_id (主键), flow_id, tasks_type_id

@ -1,7 +1,6 @@
"""
RQ Worker 热力图任务处理器 - 适配新数据库结构
RQ Worker 热力图任务处理器
生成原始图与扰动图的注意力差异热力图
仅支持真实算法移除虚拟算法调用
"""
import os
@ -21,14 +20,14 @@ logger = logging.getLogger(__name__)
def run_heatmap_task(task_id, original_image_path, perturbed_image_path,
output_dir, perturbed_image_id=None):
"""
执行热力图生成任务仅使用真实算法
执行热力图生成任务
Args:
task_id: 任务ID
original_image_path: 原始图片路径
perturbed_image_path: 扰动图片路径
output_dir: 输出目录
perturbed_image_id: 扰动图片ID用于建立father关系
perturbed_image_id: 扰动图片ID
Returns:
任务执行结果
@ -228,7 +227,7 @@ def _save_heatmap_image(task_id, heatmap_file_path, father_image_id=None):
Args:
task_id: 任务ID
heatmap_file_path: 热力图文件完整路径
father_image_id: 父图片ID(原始图片ID)
father_image_id: 父图片ID
"""
from app import db
from app.database import Image, ImageType

@ -1,7 +1,5 @@
"""
RQ Worker任务处理器 - 加噪任务
适配新数据库结构: Task + Perturbation + Images
仅支持真实算法移除虚拟算法调用
"""
import os
@ -24,7 +22,7 @@ logger = logging.getLogger(__name__)
def run_perturbation_task(task_id, algorithm_code, epsilon, input_dir, output_dir,
class_dir, custom_params=None):
"""
执行对抗性扰动任务仅使用真实算法
执行对抗性扰动任务
Args:
task_id: 任务ID对应 tasks 表的 tasks_id
@ -139,7 +137,7 @@ def run_perturbation_task(task_id, algorithm_code, epsilon, input_dir, output_di
def _run_real_algorithm(script_path, conda_env, algorithm_code, task_id,
epsilon, input_dir, output_dir, class_dir, custom_params, log_file):
"""
运行真实算法参考sh脚本配置
运行真实算法
Args:
script_path: 算法脚本路径
@ -307,7 +305,7 @@ def _run_real_algorithm(script_path, conda_env, algorithm_code, task_id,
def _save_perturbed_images(task_id, output_dir):
"""
保存扰动图片到数据库适配新数据库结构
保存扰动图片到数据库
新数据库结构
- Task表tasks_id (主键), flow_id, tasks_type_id

@ -67,39 +67,14 @@ class Config:
MODEL_ORIGINAL_FOLDER = os.path.join(MODEL_OUTPUTS_FOLDER, 'original') # 原图的模型生成结果
MODEL_PERTURBED_FOLDER = os.path.join(MODEL_OUTPUTS_FOLDER, 'perturbed') # 加噪图的模型生成结果
# 微调训练相关配置
CLASS_DATA_FOLDER = os.path.join(STATIC_ROOT, 'class') # 类别数据目录(用于 prior preservation
MODEL_DATA_FOLDER = os.path.join(STATIC_ROOT, 'model_data') # 模型数据目录(用于微调训练数据存储)
CLASS_DATA_FOLDER = os.path.join(STATIC_ROOT, 'class') # 类别数据目录
MODEL_DATA_FOLDER = os.path.join(STATIC_ROOT, 'model_data') # 模型数据目录
# 可视化与分析配置
EVA_RES_FOLDER = os.path.join(STATIC_ROOT, 'eva_res') # 评估结果根目录
COORDS_SAVE_FOLDER = os.path.join(EVA_RES_FOLDER, 'position') # 3D坐标可视化数据(用于训练轨迹)
POSITIONS_SAVE_FOLDER = os.path.join(EVA_RES_FOLDER, 'position') # 位置数据与coords相同LoRA使用未使用
COORDS_SAVE_FOLDER = os.path.join(EVA_RES_FOLDER, 'position') # 3D坐标可视化数据
POSITIONS_SAVE_FOLDER = os.path.join(EVA_RES_FOLDER, 'position') # 位置数据
HEATDIF_SAVE_FOLDER = os.path.join(EVA_RES_FOLDER, 'heatdif') # 热力图差异数据
NUMBERS_SAVE_FOLDER = os.path.join(EVA_RES_FOLDER, 'numbers') # 数值结果数据
# 预设演示图像配置
DEMO_IMAGES_FOLDER = os.path.join(STATIC_ROOT, 'demo') # 演示图片根目录
DEMO_ORIGINAL_FOLDER = os.path.join(DEMO_IMAGES_FOLDER, 'original') # 演示原始图片
DEMO_PERTURBED_FOLDER = os.path.join(DEMO_IMAGES_FOLDER, 'perturbed') # 演示加噪图片
DEMO_COMPARISONS_FOLDER = os.path.join(DEMO_IMAGES_FOLDER, 'comparisons') # 演示对比图
# 算法配置
ALGORITHMS = {
'simac': {
'name': 'SimAC算法',
'description': 'Simple Anti-Customization Method for Protecting Face Privacy',
'default_epsilon': 8.0
},
'caat': {
'name': 'CAAT算法',
'description': 'Perturbing Attention Gives You More Bang for the Buck',
'default_epsilon': 16.0
},
'pid': {
'name': 'PID算法',
'description': 'Prompt-Independent Data Protection Against Latent Diffusion Models',
'default_epsilon': 4.0
}
}
class DevelopmentConfig(Config):
"""开发环境配置"""

@ -11,56 +11,56 @@ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd "$SCRIPT_DIR"
# 检查Flask应用
echo "📌 Flask 应用:"
echo "Flask 应用:"
if [ -f logs/flask.pid ]; then
FLASK_PID=$(cat logs/flask.pid)
if ps -p $FLASK_PID > /dev/null 2>&1; then
echo " 运行中 (PID: $FLASK_PID)"
echo " 📍 URL: http://127.0.0.1:6006"
echo " 📍 测试: http://127.0.0.1:6006/static/test.html"
echo " 运行中 (PID: $FLASK_PID)"
echo " URL: http://127.0.0.1:6006"
echo " 测试: http://127.0.0.1:6006/static/test.html"
else
echo " 未运行 (PID文件存在但进程不存在)"
echo " 未运行 (PID文件存在但进程不存在)"
fi
else
if pgrep -f "python run.py" > /dev/null 2>&1; then
FLASK_PID=$(pgrep -f "python run.py")
echo " ⚠️ 运行中但无PID文件 (PID: $FLASK_PID)"
echo " 运行中但无PID文件 (PID: $FLASK_PID)"
else
echo " 未运行"
echo " 未运行"
fi
fi
echo ""
# 检查Worker
echo "📌 RQ Worker:"
echo "RQ Worker:"
if [ -f logs/worker.pid ]; then
WORKER_PID=$(cat logs/worker.pid)
if ps -p $WORKER_PID > /dev/null 2>&1; then
echo " 运行中 (PID: $WORKER_PID)"
echo " 运行中 (PID: $WORKER_PID)"
else
echo " 未运行 (PID文件存在但进程不存在)"
echo " 未运行 (PID文件存在但进程不存在)"
fi
else
if pgrep -f "python worker.py" > /dev/null 2>&1; then
WORKER_PID=$(pgrep -f "python worker.py")
echo " ⚠️ 运行中但无PID文件 (PID: $WORKER_PID)"
echo " 运行中但无PID文件 (PID: $WORKER_PID)"
else
echo " 未运行"
echo " 未运行"
fi
fi
echo ""
# 检查Redis
echo "📌 Redis:"
echo "Redis:"
if redis-cli ping > /dev/null 2>&1; then
echo " 运行中"
echo " 运行中"
else
echo " 未运行"
echo " 未运行"
fi
echo ""
# 检查日志文件
echo "📌 日志文件:"
echo "日志文件:"
if [ -f logs/flask.log ]; then
FLASK_LOG_SIZE=$(du -h logs/flask.log | cut -f1)
echo " Flask: logs/flask.log ($FLASK_LOG_SIZE)"

@ -29,11 +29,11 @@ def main():
# 创建worker
worker = Worker([queue], connection=redis_conn)
print(f"🚀 RQ Worker启动成功!")
print(f"📡 Redis: {AlgorithmConfig.REDIS_URL}")
print(f"📋 Queue: {AlgorithmConfig.RQ_QUEUE_NAME}")
print(f"🔄 使用{'真实' if AlgorithmConfig.USE_REAL_ALGORITHMS else '虚拟'}算法")
print(f"等待任务...")
print(f"RQ Worker启动成功!")
print(f"Redis: {AlgorithmConfig.REDIS_URL}")
print(f"Queue: {AlgorithmConfig.RQ_QUEUE_NAME}")
print(f"使用{'真实' if AlgorithmConfig.USE_REAL_ALGORITHMS else '虚拟'}算法")
print(f"等待任务...")
# 启动worker
worker.work()

Loading…
Cancel
Save