使用Python通过Dlib初始化ResNet时出现KeyError问题求助
问题
环境配置:
- Python 3.10.5
- dlib 19.24.0
- deepface 0.0.79
- Jupyter Lab
运行代码:
import dlib from deepface import DeepFace from deepface.basemodels.DlibResNet import DlibResNet dlib_model = DlibResNet()
触发报错:
dlib_face_recognition_resnet_model_v1.dat is going to be downloaded --------------------------------------------------------------------------- KeyError Traceback (most recent call last) Cell In [4], line 17 3 from deepface.basemodels.DlibResNet import DlibResNet (...)\n---> 17 dlib_model = DlibResNet() File C:\\Program Files\\Python310\\lib\\site-packages\\deepface\\basemodels\\DlibResNet.py:32, in DlibResNet.__init__(self) 30 url = f"http://dlib.net/files/{file_name}" 31 output = f"{home}/.deepface/weights/{file_name}" ---> 32 gdown.download(url, output, quiet=False) 34 zipfile = bz2.BZ2File(output) 35 data = zipfile.read() File C:\\Program Files\\Python310\\lib\\site-packages\\gdown\\download.py:178, in download(url, output, quiet, proxy, speed, use_cookies, verify, id, fuzzy, resume, format) 173 url = "https://drive.google.com/open?id={id}".format( 174 id=gdrive_file_id 175 ) 176 continue --> 178 if res.headers["Content-Type"].startswith("text/html"): 179 m = re.search("<title>(.+)</title>", res.text) 180 if m and m.groups()[0].endswith(" - Google Docs"): File C:\\Program Files\\Python310\\lib\\site-packages\\requests\\structures.py:52, in CaseInsensitiveDict.__getitem__(self, key) 51 def __getitem__(self, key): ---> 52 return self._store[key.lower()][1] KeyError: 'content-type'
问题原因
错误根源是gdown库的兼容性问题:gdown原本是为Google Drive文件下载设计的,当它请求dlib.net的模型文件时,服务器返回的响应头里没有Content-Type字段,导致代码直接抛出KeyError。
解决方法
方法1:手动下载模型文件
- 下载模型压缩包:获取
dlib_face_recognition_resnet_model_v1.dat.bz2文件 - 找到权重存储目录:默认是用户主目录/.deepface/weights/(Windows下路径类似
C:\Users\你的用户名\.deepface\weights\) - 把下载好的压缩包放到这个目录,无需解压
- 重新运行代码即可
方法2:修改DlibResNet源码替换下载方式
找到deepface/basemodels/DlibResNet.py文件(路径在Python安装目录的site-packages下,比如C:\Program Files\Python310\lib\site-packages\deepface\basemodels\DlibResNet.py),修改初始化方法里的下载代码:
# 替换原来的gdown.download(url, output, quiet=False)这一行 import requests response = requests.get(url, stream=True) with open(output, 'wb') as f: for chunk in response.iter_content(chunk_size=1024): if chunk: f.write(chunk)
保存文件后重新运行代码。
方法3:升级DeepFace到最新版本
新版本可能修复了这个依赖问题,执行命令升级:
pip install --upgrade deepface
升级后再尝试初始化DlibResNet。
内容的提问来源于stack exchange,提问作者Mohammad Moosavi
相关产品推荐
相关产品推荐

