2026/4/17 11:56:10
网站建设
项目流程
网站自己做流量,婚庆网站建设方案,北京模板网站建站,微信网站设计运营【视觉多模态】基于视觉AI的人物轨迹生成方案背景步骤小结背景
基于 Yolo-World v2 把人物从视频每帧中提取出来并分别存储在某路径下。现在的下一步#xff0c;应该是把这些截图全部转换为向量并存储到向量数据库。
步骤
下载SFace模型
https://github.com/opencv/opencv…【视觉多模态】基于视觉AI的人物轨迹生成方案背景步骤小结背景基于 Yolo-World v2 把人物从视频每帧中提取出来并分别存储在某路径下。现在的下一步应该是把这些截图全部转换为向量并存储到向量数据库。步骤下载SFace模型https://github.com/opencv/opencv_zoo/blob/main/models/face_recognition_sface/face_recognition_sface_2021dec.onnx安装opencv-python 依赖测试可用性importcv2 print(OpenCV版本, cv2.__version__)print(是否支持dnn模块, hasattr(cv2,dnn))基础调用测试代码importcv2importnumpy as np def sface_extract_face_vector(image_path, model_path,input_size(112,112)): 利用SFace模型提取人脸图像的特征向量 :param image_path: 输入人脸图像路径 :param model_path: SFace模型onnx格式路径 :param input_size: SFace输入尺寸固定112x112不可修改 :return:512维人脸特征向量归一化后# 步骤1读取并预处理图像SFace强制要求必须严格遵循# 1.1 读取图像彩色模式imgcv2.imread(image_path)ifimg is None: raise FileNotFoundError(f无法读取图像文件{image_path})# 1.2 转换色彩空间BGR→RGBSFace模型要求img_rgbcv2.cvtColor(img, cv2.COLOR_BGR2RGB)# 1.3 调整图像尺寸固定112x112SFace输入尺寸img_resizedcv2.resize(img_rgb, input_size)# 1.4 数据格式转换HWC→CHW并添加批次维度img_transposednp.transpose(img_resized,(2,0,1))# (H,W,C)→(C,H,W)img_batchnp.expand_dims(img_transposed,axis0)# (C,H,W)→(1,C,H,W)# 1.5 归一化像素值归一化到[-1, 1]SFace模型要求img_normalized(img_batch.astype(np.float32)-127.5)/127.5# 步骤2加载SFace onnx模型netcv2.dnn.readNetFromONNX(model_path)# 可选启用GPU加速若有NVIDIA GPU需配置OpenCV GPU环境# net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)# net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)# 步骤3模型推理前向传播获取特征向量net.setInput(img_normalized)face_vectornet.forward()# 输出形状(1, 512)# 步骤4向量归一化提升后续相似度计算的准确性face_vector_normalizedface_vector / np.linalg.norm(face_vector,axis1,keepdimsTrue)# 步骤5返回一维特征向量去除批次维度returnface_vector_normalized.squeeze()# ---------------------- 配置参数并运行 ----------------------if__name____main__:# 配置路径修改为你的实际路径importos SFACE_MODEL_PATH/data1/projs/SFace/opencv_zoo/face_recognition_sface_2021dec.onnxpath/data1/datas/wildtrack_dataset/wildtrack_dataset/Wildtrack_dataset/Image_subsets/C1/croppedforfileinos.listdir(path): TEST_IMAGE_PATHf{path}/{file}try:# 提取人脸特征向量face_featuresface_extract_face_vector(TEST_IMAGE_PATH, SFACE_MODEL_PATH)# 打印结果验证print(SFace特征向量形状, face_feature.shape)# 应输出 (512,)print(SFace特征向量前10个值, face_feature[:10])print(向量归一化验证模长应≈1, np.linalg.norm(face_feature))except Exception as e: print(运行报错, str(e))结果024.8.0-linux-x64/bundled/libs/debugpy/adapter/../../debugpy/launcher41849-- /data1/projs/yolov5-botsort/test_only.py OpenCV版本4.12.0 是否支持dnn模块 True SFace特征向量形状(128,)SFace特征向量前10个值[-0.041811070.105901390.045133310.013772150.0497637-0.03535534 -0.16844605 -0.079534460.00360839-0.02015602]向量归一化验证模长应≈11.0SFace特征向量形状(128,)[-0.008649510.137211070.00097885-0.00774572 -0.0306458 -0.01465974 -0.15866575 -0.06293750.090498960.017362320.0341635-0.13206565 -0.04685504 -0.059280860.04323329-0.035856850.11940002-0.003557990.05041823-0.01659128 -0.095046920.061995030.02595275-0.010231040.04494344-0.04678775 -0.006651940.062947180.05229411-0.11271915 -0.05184305 -0.03285127 -0.1269116 -0.18189423 -0.036520130.074977380.12063970.133915750.055842040.00342186-0.11525489 -0.1169667 -0.03108696 -0.10747405 -0.01156010.26701513-0.036781990.01830711-0.054812350.033669390.141028690.059063080.11707348-0.01611113 -0.101282090.06425073-0.044345770.226847960.07182860.10504609-0.10001983 -0.046612850.033695380.07690774-0.022769180.015273040.0209459-0.067221560.12785007-0.073309060.127180430.036501170.03357406-0.22308070.06874490.051670810.13399096-0.00556050.009251020.17704780.120136760.10237920.04011027-0.013265070.002124440.032370540.109193120.051502680.07991081-0.04595529 -0.05336874 -0.081588280.032809460.08914431-0.04767266 -0.09420003 -0.21350156 -0.049842370.125270650.017782810.046942-0.155373450.006912940.005221670.00649380.113883170.0553209-0.069932110.03343213-0.07741141 -0.04298204 -0.196524440.088440690.044994650.003223820.15364304-0.006026310.09509759-0.051170120.006598860.10149482-0.13059730.12939171-0.05865399 -0.0644947 -0.091725510.09984177-0.00866709]小结SFace可用了但有很多配套的内容需要补充。1SFace 只针对人脸并不包括人的身形、衣着等因此身形、衣着还是要另外的模型去辨别2SFace 只针对人脸也因此需要有前置的内容先从图中检测到人脸并进行切割后再传给SFace3细节上为了更好发挥模型的效果还有一个如下的流程【意识上漏掉了一些逻辑比如对齐、标准化这两步】原始图像 → 人脸检测定位人脸框坐标 → 人脸裁剪仅保留人脸区域 → 人脸对齐可选提升精度 → 标准化预处理112x112/RGB/归一化 → SFace特征提取 → 有效512维人脸向量人脸检测核心是定位人脸的位置和范围输出人脸框的 x/y/w/h 坐标解决 “图像里哪里有人脸” 的问题过滤掉无脸 / 背影图像。推荐模型轻量场景用 OpenCV Haar 级联高精度场景用 MTCNN/RetinaFace能检测侧脸、小人脸还能输出人脸关键点为后续对齐做准备。人脸裁剪根据检测到的人脸框坐标从原始图像中精准切割出仅包含人脸的区域剔除背景、身体、衣物等无关像素让后续处理只聚焦人脸。注意裁剪时可适当扩大人脸框比如向外扩展 10%避免裁剪掉人脸边缘如头发、下巴保证人脸特征的完整性。人脸对齐可选但推荐基于人脸检测输出的关键点眼睛、鼻子、嘴巴将人脸旋转、平移到标准正面姿态解决人脸倾斜、侧脸导致的特征提取偏差。这一步是提升 SFace 特征匹配精度的关键比如同一人侧脸和正面的人脸对齐后提取的向量相似度会大幅提升。标准化预处理将对齐后的人脸区域调整为 SFace 要求的112x112 固定尺寸再完成 BGR→RGB、归一化到 [-1,1]、格式转换HWC→CHW满足模型输入格式要求。所以还需要进一步完善补充。