Flask调用DeepFace人脸检索接口报OSError [Errno 22]无效参数错误
问题原因
报错核心是DeepFace.find()的参数传错:
DeepFace生成人脸特征嵌入pkl文件时,会直接将model_name参数的取值转为字符串拼接到文件名中。你在代码中提前通过DeepFace.build_model()加载了Keras模型实例,却把这个实例对象传给了要求传入模型名称字符串的model_name参数,模型实例转字符串后会得到带内存地址、包含</>等Windows文件名非法字符的内容,最终触发路径无效错误。
另外你的代码中同时传入了model_name和model两个功能重叠的参数,且参数值传反了:model参数才是用来接收预构建模型实例的入口,model_name必须传入官方定义的模型名字符串。
修复方法
二选一即可:
- 方案1(最简实现,官方默认用法):删除提前构建模型的代码,直接给
model_name传模型名字符串,移除冗余的model传参:
# 删掉这行:face_req_model = DeepFace.build_model(models[1]) df = DeepFace.find( img_path=detected_list, db_path=db_path, model_name=models[1], # 直接传字符串"Facenet",不要传模型对象 enforce_detection=False, detector_backend=backends[3], distance_metric=metrics[0] )
- 方案2(适合需要复用模型、减少重复加载开销的场景):保留提前加载模型的逻辑,注意参数对应关系,
model_name传字符串,model传预构建的实例:
face_req_model = DeepFace.build_model(models[1]) df = DeepFace.find( img_path=detected_list, db_path=db_path, model_name=models[1], # 必须传字符串,用于生成合法的pkl文件名 model=face_req_model, # 这里传提前加载好的模型实例 enforce_detection=False, detector_backend=backends[3], distance_metric=metrics[0] )
补充注意:Windows环境下拼接路径建议全程使用
os.path.join(),不要手动混合拼接/和\\,你当前代码中路径拼接混用了两种斜杠,虽然不是本次报错的核心原因,但后续很容易触发其他路径兼容问题。
内容的提问来源于stack exchange,提问作者Ubong Essien
相关产品推荐
相关产品推荐

