DamoFD模型端到端部署:从训练到上线的完整流程
你是不是也遇到过这样的问题:在网上看到一个很酷的AI模型,想拿来用在自己的项目里,结果发现从下载到真正能用起来,中间要踩一堆坑?环境配置、数据准备、模型训练、部署上线,每一步都可能让你卡上半天。
今天我就来带你完整走一遍DamoFD人脸检测模型的端到端部署流程。DamoFD是达摩院开源的一个轻量级人脸检测模型,特点是又快又准,特别适合用在手机、摄像头这些资源有限的设备上。我会用最直白的方式,把从零开始到最终上线的每一步都讲清楚,让你看完就能自己动手做出来。
1. 先搞清楚DamoFD到底是个啥
在动手之前,咱们先花几分钟了解一下DamoFD到底是什么,这样后面操作起来心里才有底。
简单来说,DamoFD就是一个专门用来找照片里人脸的AI模型。你给它一张照片,它就能告诉你照片里有没有人脸,有的话在什么位置,还能标出眼睛、鼻子、嘴巴这五个关键点。听起来好像没什么特别的,但它的厉害之处在于特别轻巧,性能却一点不差。
我打个比方,传统的AI模型就像一辆大卡车,虽然能拉很多货,但油耗高、停车难。而DamoFD就像一辆小货车,该拉的货一样能拉,但更省油、更灵活。它的最小版本只有0.5G,这意味着你可以在普通的电脑上跑,甚至在一些配置不高的设备上也能用。
这个模型特别适合用在需要实时处理人脸的场景,比如:
- 手机相册自动整理人脸照片
- 智能门禁的人脸识别
- 视频会议的美颜和虚拟背景
- 社交应用的贴纸和特效
知道了这些,咱们就可以开始动手了。整个过程我会分成四个主要部分:环境准备、数据准备、模型训练、部署上线。每一步我都会给出具体的代码和操作,你跟着做就行。
2. 环境准备:搭建你的AI工作台
做AI开发,第一步就是把环境搭好。这就像你要做饭,得先把厨房收拾干净,把锅碗瓢盆准备好。别担心,我会带你用最简单的方式搞定。
2.1 选择你的开发环境
你有两个选择:本地电脑或者云端服务器。如果你是新手,我强烈建议用云端,因为省去了安装各种依赖的麻烦。这里我推荐用ModelScope提供的官方镜像,里面已经把需要的软件都装好了。
如果你选择本地开发,需要确保你的电脑满足这些基本要求:
- Python 3.7或更高版本
- 至少8GB内存(处理图片需要内存)
- 如果有GPU会快很多,没有的话CPU也能跑
2.2 一键安装所有依赖
最省事的方法是用ModelScope的官方镜像。但如果你想在本地安装,可以按照下面的步骤来:
# 创建专门的Python环境(避免和别的项目冲突) conda create -n damofd_env python=3.8 conda activate damofd_env # 安装PyTorch(根据你的CUDA版本选择) # 如果你有NVIDIA显卡,建议安装GPU版本 pip install torch==1.11.0 torchvision==0.12.0 # 安装ModelScope核心库 pip install modelscope # 安装计算机视觉相关的依赖 pip install modelscope[cv] -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html # 安装一些常用的工具库 pip install opencv-python matplotlib numpy pillow安装过程中如果遇到网络问题,可以试试换用国内的镜像源。整个安装过程大概需要10-20分钟,取决于你的网速。
安装完成后,你可以用下面这段简单的代码测试一下环境是否正常:
import torch import cv2 import modelscope print(f"PyTorch版本: {torch.__version__}") print(f"CUDA是否可用: {torch.cuda.is_available()}") print(f"ModelScope版本: {modelscope.__version__}") # 如果CUDA可用,显示显卡信息 if torch.cuda.is_available(): print(f"显卡型号: {torch.cuda.get_device_name(0)}")如果一切正常,你会看到类似这样的输出:
PyTorch版本: 1.11.0 CUDA是否可用: True ModelScope版本: 1.9.5 显卡型号: NVIDIA GeForce RTX 30802.3 常见问题解决
新手在环境配置时经常会遇到几个问题,我提前给你列出来:
CUDA版本不匹配:如果你安装的是GPU版本的PyTorch,但CUDA版本不对,程序会报错。解决方法是去PyTorch官网找到对应你CUDA版本的安装命令。
内存不足:处理大图片时如果内存不够,可以尝试减小图片尺寸或者使用更小的批次。
依赖冲突:如果你之前安装过其他AI框架,可能会有版本冲突。这时候用conda创建独立环境是最好的选择。
环境准备好了,咱们就可以进入下一步:准备训练数据。
3. 数据准备:给AI准备“学习资料”
AI模型就像学生,需要通过学习资料(数据)来掌握技能。对于人脸检测模型来说,学习资料就是带标注的人脸图片——每张图片都要告诉模型“人脸在这里”。
3.1 获取训练数据
最常用的人脸检测数据集是WIDER FACE,它包含了各种场景、各种角度、各种大小的人脸。好消息是,ModelScope已经内置了这个数据集,我们可以直接使用。
from modelscope.msdatasets import MsDataset # 加载WIDER FACE数据集(迷你版,用于快速测试) # 如果要训练完整模型,去掉'_mini'后缀 dataset = MsDataset.load('WIDER_FACE_mini', namespace='shaoxuan') # 查看数据集信息 print(f"数据集大小: {len(dataset)}") print(f"数据集结构: {dataset.config_kwargs}")如果你有自己的业务数据,比如你们公司的人脸照片,也可以用来训练。但要注意,数据需要按照特定的格式整理。WIDER FACE的数据格式是这样的:
- 图片放在一个文件夹里
- 标注文件是txt格式,每行对应一张图片
- 标注内容包括人脸位置(x, y, width, height)和一些属性
3.2 数据预处理
原始数据通常不能直接用来训练,需要做一些预处理。对于人脸检测任务,常见的预处理包括:
- 图片尺寸调整:把所有图片调整到统一大小,比如640x640
- 数据增强:通过旋转、翻转、调整亮度等方式增加数据多样性
- 标注格式转换:把标注转换成模型需要的格式
下面是一个简单的数据预处理示例:
import os import cv2 import numpy as np from PIL import Image def preprocess_image(image_path, target_size=(640, 640)): """预处理单张图片""" # 读取图片 img = cv2.imread(image_path) if img is None: return None # 调整大小 img_resized = cv2.resize(img, target_size) # 归一化(把像素值从0-255转换到0-1) img_normalized = img_resized / 255.0 # 转换通道顺序(从BGR到RGB) img_rgb = cv2.cvtColor(img_normalized, cv2.COLOR_BGR2RGB) return img_rgb def load_annotations(annotation_path): """加载标注文件""" annotations = {} with open(annotation_path, 'r') as f: lines = f.readlines() current_image = None for line in lines: line = line.strip() if line.endswith('.jpg'): current_image = line annotations[current_image] = [] elif line and current_image: # 解析标注:x1, y1, w, h, blur, expression, illumination, invalid, occlusion, pose parts = line.split() if len(parts) >= 4: x1, y1, w, h = map(float, parts[:4]) annotations[current_image].append([x1, y1, w, h]) return annotations # 使用示例 image_path = "path/to/your/image.jpg" annotation_path = "path/to/your/annotations.txt" # 预处理图片 processed_img = preprocess_image(image_path) # 加载标注 annotations = load_annotations(annotation_path) print(f"图片处理后的形状: {processed_img.shape}") print(f"标注数量: {len(annotations)}")3.3 创建数据加载器
数据准备好后,我们需要创建一个数据加载器,这样在训练时才能高效地读取数据。
import torch from torch.utils.data import Dataset, DataLoader class FaceDetectionDataset(Dataset): """自定义人脸检测数据集类""" def __init__(self, image_dir, annotation_dict, transform=None): self.image_dir = image_dir self.annotation_dict = annotation_dict self.transform = transform self.image_names = list(annotation_dict.keys()) def __len__(self): return len(self.image_names) def __getitem__(self, idx): image_name = self.image_names[idx] image_path = os.path.join(self.image_dir, image_name) # 加载图片 image = cv2.imread(image_path) if image is None: # 如果图片加载失败,返回一个空图片 image = np.zeros((640, 640, 3), dtype=np.uint8) else: image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 获取标注 boxes = self.annotation_dict[image_name] boxes = np.array(boxes, dtype=np.float32) # 如果有数据增强,在这里应用 if self.transform: augmented = self.transform(image=image, bboxes=boxes) image = augmented['image'] boxes = augmented['bboxes'] # 转换为Tensor image_tensor = torch.from_numpy(image).permute(2, 0, 1).float() / 255.0 boxes_tensor = torch.from_numpy(boxes).float() return { 'image': image_tensor, 'boxes': boxes_tensor, 'image_name': image_name } # 创建数据集和数据加载器 dataset = FaceDetectionDataset( image_dir='path/to/images', annotation_dict=annotations ) dataloader = DataLoader( dataset, batch_size=4, # 根据你的GPU内存调整 shuffle=True, num_workers=2 # 并行加载数据的进程数 ) # 测试数据加载器 for batch in dataloader: images = batch['image'] boxes = batch['boxes'] print(f"批次图片形状: {images.shape}") print(f"批次标注形状: {boxes.shape}") break数据准备好了,接下来就是最核心的部分:训练模型。
4. 模型训练:让AI学会识别人脸
有了数据和环境,现在可以开始训练模型了。DamoFD模型在ModelScope上已经提供了预训练版本,我们可以直接使用,也可以在自己的数据上进一步微调。
4.1 加载预训练模型
ModelScope让加载模型变得特别简单,几行代码就能搞定:
from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks # 创建人脸检测pipeline face_detection = pipeline( task=Tasks.face_detection, model='damo/cv_ddsar_face-detection_iclr23-damofd' ) # 测试一下模型 test_image_path = 'https://modelscope.oss-cn-beijing.aliyuncs.com/test/images/face_detection2.jpeg' result = face_detection(test_image_path) print("检测结果:") print(f"检测到的人脸数量: {len(result['boxes'])}") print(f"人脸位置: {result['boxes']}") print(f"置信度: {result['scores']}") print(f"关键点: {result['keypoints']}")这段代码会下载DamoFD模型(第一次运行需要下载,大概200MB左右),然后用它检测测试图片中的人脸。你会看到模型输出了人脸的位置框、置信度(模型有多确定这是人脸)和五个关键点坐标。
4.2 在自己的数据上训练
如果你有特定场景的人脸数据(比如戴口罩的人脸、侧脸等),可以在预训练模型的基础上继续训练,这样模型在你场景下的表现会更好。
import os import tempfile from modelscope.msdatasets import MsDataset from modelscope.metainfo import Trainers from modelscope.trainers import build_trainer from modelscope.hub.snapshot_download import snapshot_download # 加载数据集 ms_ds_widerface = MsDataset.load('WIDER_FACE_mini', namespace='shaoxuan') data_path = ms_ds_widerface.config_kwargs['split_config'] # 获取训练和验证数据的路径 train_dir = data_path['train'] val_dir = data_path['validation'] def get_name(dir_name): """获取目录中的第一个文件夹名""" names = [i for i in os.listdir(dir_name) if not i.startswith('_')] return names[0] if names else '' train_root = os.path.join(train_dir, get_name(train_dir), '') val_root = os.path.join(val_dir, get_name(val_dir), '') # 下载模型 model_id = 'damo/cv_ddsar_face-detection_iclr23-damofd' cache_path = snapshot_download(model_id) # 创建临时目录保存训练结果 tmp_dir = tempfile.mkdtemp() print(f"训练结果将保存在: {tmp_dir}") def modify_config(cfg): """修改训练配置""" # 调整训练参数 cfg.checkpoint_config.interval = 1 # 每1个epoch保存一次检查点 cfg.log_config.interval = 10 # 每10个批次打印一次日志 cfg.evaluation.interval = 1 # 每1个epoch评估一次 cfg.data.workers_per_gpu = 2 # 数据加载的工作进程数 cfg.data.samples_per_gpu = 8 # 每个GPU的批次大小 # 调整学习率 cfg.optimizer.lr = 0.001 return cfg # 配置训练参数 train_args = { 'cfg_file': os.path.join(cache_path, 'DamoFD_lms.py'), 'work_dir': tmp_dir, 'train_root': train_root, 'val_root': val_root, 'total_epochs': 10, # 训练10个epoch 'cfg_modify_fn': modify_config } # 创建训练器 trainer = build_trainer( name=Trainers.face_detection_scrfd, default_args=train_args ) print("开始训练...") trainer.train() print("训练完成!")训练过程中,你会看到类似这样的输出:
2024-01-15 10:30:15,789 - mmdet - INFO - Epoch [1][10/100] lr: 0.00100, loss: 1.2345, time: 0.5s 2024-01-15 10:30:25,123 - mmdet - INFO - Epoch [1][20/100] lr: 0.00100, loss: 0.9876, time: 0.4sloss值会逐渐下降,这说明模型正在学习。训练完成后,模型会保存在tmp_dir目录下。
4.3 模型微调
如果你只是想用预训练模型,但希望在某些参数上做调整,可以使用微调的方式:
import os import tempfile from modelscope.msdatasets import MsDataset from modelscope.metainfo import Trainers from modelscope.trainers import build_trainer from modelscope.hub.snapshot_download import snapshot_download from modelscope.utils.constant import ModelFile # 加载数据和模型(同上) model_id = 'damo/cv_ddsar_face-detection_iclr23-damofd' ms_ds_widerface = MsDataset.load('WIDER_FACE_mini', namespace='shaoxuan') data_path = ms_ds_widerface.config_kwargs['split_config'] train_dir = data_path['train'] val_dir = data_path['validation'] train_root = os.path.join(train_dir, get_name(train_dir), '') val_root = os.path.join(val_dir, get_name(val_dir), '') cache_path = snapshot_download(model_id) tmp_dir = tempfile.mkdtemp() # 微调配置 pretrain_epochs = 640 # 预训练已经训练的epoch数 ft_epochs = 5 # 再微调5个epoch total_epochs = pretrain_epochs + ft_epochs def modify_config(cfg): cfg.checkpoint_config.interval = 1 cfg.log_config.interval = 10 cfg.evaluation.interval = 1 cfg.data.workers_per_gpu = 1 cfg.data.samples_per_gpu = 4 # 微调时使用更小的学习率 cfg.optimizer.lr = 0.0001 return cfg # 微调参数 finetune_args = { 'cfg_file': os.path.join(cache_path, 'DamoFD_lms.py'), 'work_dir': tmp_dir, 'train_root': train_root, 'val_root': val_root, 'resume_from': os.path.join(cache_path, ModelFile.TORCH_MODEL_FILE), # 从预训练模型继续训练 'total_epochs': total_epochs, 'cfg_modify_fn': modify_config } # 创建训练器并开始微调 trainer = build_trainer( name=Trainers.face_detection_scrfd, default_args=finetune_args ) print("开始微调...") trainer.train() print("微调完成!")微调通常比从头训练快很多,因为模型已经具备了基本的人脸检测能力,只需要适应你的特定数据。
5. 部署上线:让模型真正用起来
模型训练好了,接下来就是把它部署到实际环境中。部署的方式有很多种,我会介绍几种最常用的。
5.1 本地部署(最简单的方式)
如果你只是在自己的电脑或服务器上使用,可以直接用Python调用:
import cv2 from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks from modelscope.utils.cv.image_utils import draw_face_detection_result from modelscope.preprocessors.image import LoadImage class FaceDetector: """人脸检测器封装类""" def __init__(self, model_path=None): """初始化检测器""" if model_path: # 使用自定义训练的模型 self.detector = pipeline( task=Tasks.face_detection, model=model_path ) else: # 使用预训练模型 self.detector = pipeline( task=Tasks.face_detection, model='damo/cv_ddsar_face-detection_iclr23-damofd' ) def detect(self, image_path): """检测单张图片""" # 支持本地路径和URL result = self.detector(image_path) return result def detect_batch(self, image_paths): """批量检测图片""" results = [] for path in image_paths: result = self.detect(path) results.append(result) return results def visualize(self, image_path, result, save_path=None): """可视化检测结果""" # 加载图片 img = LoadImage.convert_to_ndarray(image_path) # 绘制检测结果 img_draw = draw_face_detection_result(image_path, result) # 保存或显示 if save_path: cv2.imwrite(save_path, cv2.cvtColor(img_draw, cv2.COLOR_RGB2BGR)) print(f"结果已保存到: {save_path}") return img_draw # 使用示例 detector = FaceDetector() # 检测单张图片 image_url = 'https://modelscope.oss-cn-beijing.aliyuncs.com/test/images/face_detection2.jpeg' result = detector.detect(image_url) # 可视化结果 detector.visualize(image_url, result, save_path='detection_result.jpg') # 批量检测 image_list = ['image1.jpg', 'image2.jpg', 'image3.jpg'] batch_results = detector.detect_batch(image_list) for i, res in enumerate(batch_results): print(f"图片{i+1}检测到{len(res['boxes'])}个人脸")5.2 部署为Web服务
如果你想让其他人也能通过网页使用你的模型,可以把它部署成Web服务。这里用Flask做一个简单的例子:
from flask import Flask, request, jsonify, send_file import cv2 import numpy as np import io from PIL import Image from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks app = Flask(__name__) # 初始化模型 face_detection = pipeline( task=Tasks.face_detection, model='damo/cv_ddsar_face-detection_iclr23-damofd' ) @app.route('/detect', methods=['POST']) def detect_faces(): """人脸检测API接口""" try: # 检查是否有文件上传 if 'image' not in request.files: return jsonify({'error': '没有上传图片'}), 400 file = request.files['image'] # 读取图片 img_bytes = file.read() img = Image.open(io.BytesIO(img_bytes)) # 转换为numpy数组 img_np = np.array(img) # 临时保存图片 temp_path = 'temp_image.jpg' cv2.imwrite(temp_path, cv2.cvtColor(img_np, cv2.COLOR_RGB2BGR)) # 进行人脸检测 result = face_detection(temp_path) # 整理返回结果 response = { 'face_count': len(result['boxes']), 'faces': [] } for i, (box, score, keypoints) in enumerate(zip( result['boxes'], result['scores'], result['keypoints'] )): face_info = { 'id': i + 1, 'bbox': { 'x': float(box[0]), 'y': float(box[1]), 'width': float(box[2] - box[0]), 'height': float(box[3] - box[1]) }, 'confidence': float(score), 'keypoints': { 'left_eye': [float(keypoints[0][0]), float(keypoints[0][1])], 'right_eye': [float(keypoints[1][0]), float(keypoints[1][1])], 'nose': [float(keypoints[2][0]), float(keypoints[2][1])], 'left_mouth': [float(keypoints[3][0]), float(keypoints[3][1])], 'right_mouth': [float(keypoints[4][0]), float(keypoints[4][1])] } } response['faces'].append(face_info) return jsonify(response) except Exception as e: return jsonify({'error': str(e)}), 500 @app.route('/health', methods=['GET']) def health_check(): """健康检查接口""" return jsonify({'status': 'healthy', 'model': 'DamoFD'}) if __name__ == '__main__': # 启动服务 app.run(host='0.0.0.0', port=5000, debug=True)启动这个服务后,你就可以通过HTTP请求来使用人脸检测功能了:
# 启动服务 python app.py # 测试服务(在另一个终端) curl -X POST -F "image=@test.jpg" http://localhost:5000/detect5.3 部署到生产环境
对于生产环境,你可能需要考虑更多因素,比如性能、稳定性、可扩展性等。这里给出一些建议:
- 使用Docker容器化部署:
# Dockerfile FROM registry.cn-hangzhou.aliyuncs.com/modelscope-repo/modelscope:ubuntu20.04-cuda11.8.0-py38-torch2.0.1-tf2.13.0-1.9.5 WORKDIR /app # 复制代码 COPY requirements.txt . COPY app.py . # 安装依赖 RUN pip install --no-cache-dir -r requirements.txt # 下载模型(可以在构建时下载,避免每次启动都下载) RUN python -c "from modelscope.pipelines import pipeline; from modelscope.utils.constant import Tasks; pipeline(task=Tasks.face_detection, model='damo/cv_ddsar_face-detection_iclr23-damofd')" EXPOSE 5000 CMD ["python", "app.py"]性能优化建议:
- 使用GPU加速推理
- 实现请求批处理,提高吞吐量
- 添加缓存机制,避免重复计算
- 监控模型性能,定期评估准确率
部署架构示例:
客户端 → 负载均衡器 → 多个模型服务实例 → 数据库/缓存 ↓ 监控系统6. 模型评估与优化
模型部署后,还需要持续评估和优化。这里介绍几个重要的评估指标和优化方法。
6.1 评估模型性能
import os.path as osp import cv2 import os import numpy as np from modelscope.msdatasets import MsDataset from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks from modelscope.utils.cv.image_utils import voc_ap, image_eval, img_pr_info, gen_gt_info, dataset_pr_info def evaluate_model(model_id, dataset_path): """评估模型在数据集上的表现""" # 加载验证集 val_set = MsDataset.load('widerface_mini_train_val', namespace='ly261666', split='validation') img_base_path = next(iter(val_set))[1] img_dir = osp.join(img_base_path, 'val_data') img_gt = osp.join(img_base_path, 'val_label.txt') # 生成真实标注信息 gt_info = gen_gt_info(img_gt) # 创建检测器 if 'mtcnn' in model_id: detector = pipeline(Tasks.face_detection, model=model_id, conf_th=0.7) elif 'damofd' in model_id: detector = pipeline(Tasks.face_detection, model=model_id) else: detector = pipeline(Tasks.face_detection, model=model_id, conf_th=0.01) # 评估参数 iou_threshold = 0.5 thresh_num = 1000 pr_curve = np.zeros((thresh_num, 2)).astype('float') total_faces = 0 # 遍历所有图片 for img_name in os.listdir(img_dir): img_path = osp.join(img_dir, img_name) # 检测人脸 result = detector(img_path) # 整理检测结果 if result['boxes']: pred_boxes = np.array(result['boxes']) pred_scores = np.array(result['scores']).reshape(-1, 1) pred_info = np.concatenate([pred_boxes, pred_scores], axis=1) else: pred_info = np.array([]).reshape(0, 5) # 获取真实标注 gt_boxes = np.array(gt_info.get(img_name, [])).reshape(-1, 4) # 计算当前图片的评估指标 pred_recall, proposal_list = image_eval(pred_info, gt_boxes, iou_threshold) img_pr, _ = img_pr_info(thresh_num, pred_info, proposal_list, pred_recall) pr_curve += img_pr total_faces += len(gt_boxes) # 计算整体评估指标 pr_curve = dataset_pr_info(thresh_num, pr_curve, total_faces) precision = pr_curve[:, 0] recall = pr_curve[:, 1] # 计算AP(平均精度) ap = voc_ap(recall, precision) # 输出在不同召回率下的精度 print(f"\n模型: {model_id}") print(f"AP@{iou_threshold}: {ap:.4f}") print("\n不同召回率下的精度:") for target_recall in np.arange(0.1, 1.0, 0.1): idx = len(np.where(recall <= target_recall)[0]) - 1 if idx >= 0: print(f" 召回率 {target_recall:.1f}: 精度 = {precision[idx]:.4f}") return ap, precision, recall # 评估多个模型 models_to_evaluate = [ 'damo/cv_ddsar_face-detection_iclr23-damofd', 'damo/cv_resnet101_face-detection_cvpr22papermogface', 'damo/cv_resnet50_face-detection_retinaface' ] results = {} for model_id in models_to_evaluate: print(f"\n{'='*50}") print(f"正在评估: {model_id}") print('='*50) ap, precision, recall = evaluate_model(model_id, 'widerface_mini_train_val') results[model_id] = { 'AP': ap, 'precision': precision, 'recall': recall } # 比较模型性能 print("\n" + "="*60) print("模型性能对比") print("="*60) for model_id, metrics in results.items(): model_name = model_id.split('/')[-1] print(f"{model_name:30} AP: {metrics['AP']:.4f}")6.2 模型优化技巧
- 调整置信度阈值:
# 调整检测阈值,平衡召回率和误检率 def optimize_threshold(model_id, validation_data): best_threshold = 0.5 best_f1 = 0 for threshold in np.arange(0.1, 0.9, 0.05): detector = pipeline( task=Tasks.face_detection, model=model_id, conf_th=threshold ) # 计算当前阈值下的F1分数 f1_score = calculate_f1(detector, validation_data) if f1_score > best_f1: best_f1 = f1_score best_threshold = threshold print(f"最佳阈值: {best_threshold:.2f}, F1分数: {best_f1:.4f}") return best_threshold- 模型量化(减小模型大小):
import torch import torch.quantization def quantize_model(model_path, save_path): """量化模型,减小模型大小,提高推理速度""" # 加载模型 model = torch.load(model_path) model.eval() # 准备量化 quantized_model = torch.quantization.quantize_dynamic( model, {torch.nn.Linear, torch.nn.Conv2d}, # 要量化的层类型 dtype=torch.qint8 ) # 保存量化后的模型 torch.save(quantized_model.state_dict(), save_path) # 比较模型大小 original_size = os.path.getsize(model_path) / (1024 * 1024) quantized_size = os.path.getsize(save_path) / (1024 * 1024) print(f"原始模型大小: {original_size:.2f} MB") print(f"量化后模型大小: {quantized_size:.2f} MB") print(f"压缩比例: {(1 - quantized_size/original_size)*100:.1f}%") return quantized_model- 推理速度优化:
import time from functools import wraps def measure_speed(func): """测量函数执行时间的装饰器""" @wraps(func) def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() elapsed = end_time - start_time print(f"{func.__name__} 执行时间: {elapsed:.4f}秒") return result return wrapper @measure_speed def batch_inference(detector, image_paths, batch_size=4): """批量推理优化""" results = [] # 分批处理 for i in range(0, len(image_paths), batch_size): batch = image_paths[i:i+batch_size] # 可以在这里添加并行处理 batch_results = [detector(img) for img in batch] results.extend(batch_results) return results # 使用示例 detector = pipeline(task=Tasks.face_detection, model='damo/cv_ddsar_face-detection_iclr23-damofd') image_list = ['img1.jpg', 'img2.jpg', 'img3.jpg', 'img4.jpg', 'img5.jpg'] results = batch_inference(detector, image_list, batch_size=2)7. 总结
走完这一整套流程,你应该对DamoFD模型的端到端部署有了比较全面的了解。从环境准备、数据准备,到模型训练、部署上线,再到最后的评估优化,每一步都有其重要性。
实际用下来,DamoFD给我的感觉是部署确实简单,特别是借助ModelScope这样的平台,很多繁琐的步骤都被简化了。效果方面,对于常见的人脸检测场景,它的表现已经足够好了,而且因为模型轻量,运行速度很快,资源占用也少。
如果你刚接触人脸检测,我建议先从预训练模型开始,用我上面给的代码跑几个例子,感受一下效果。等熟悉了基本流程,再尝试用自己的数据做微调。部署时,根据你的实际需求选择合适的方式——如果只是内部使用,本地部署就够用了;如果需要对外提供服务,可以考虑做成Web API。
过程中可能会遇到一些问题,比如环境配置的依赖冲突、训练时的内存不足、部署时的性能瓶颈等。这些问题都很正常,解决的过程也是学习的过程。多查文档、多尝试,慢慢就能掌握其中的门道。
最后想说的是,AI模型的部署不是一次性的工作,而是一个持续的过程。模型上线后,还需要监控它的表现,定期用新数据评估,必要时进行更新和优化。只有这样,才能保证模型在实际应用中始终保持良好的效果。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。