我在jupyter笔记本中执行from object_detection.utils import label_map_util
时遇到了它。实际上是tensorflow对象检测教程笔记本(它随tensorflow对象检测api一起提供)
完整的错误日志:
AttributeError Traceback (most recent call last)
<ipython-input-7-7035655b948a> in <module>
1 from object_detection.utils import ops as utils_ops
----> 2 from object_detection.utils import label_map_util
3 from object_detection.utils import visualization_utils as vis_util
~\AppData\Roaming\Python\Python37\site-packages\object_detection\utils\label_map_util.py in <module>
25 import tensorflow as tf
26 from google.protobuf import text_format
---> 27 from object_detection.protos import string_int_label_map_pb2
28
29
~\AppData\Roaming\Python\Python37\site-packages\object_detection\protos\string_int_label_map_pb2.py in <module>
19 syntax='proto2',
20 serialized_options=None,
---> 21 create_key=_descriptor._internal_create_key,
22 serialized_pb=b'\n2object_detection/protos/string_int_label_map.proto\x12\x17object_detection.protos\"\xc0\x01\n\x15StringIntLabelMapItem\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\x05\x12\x14\n\x0c\x64isplay_name\x18\x03 \x01(\t\x12M\n\tkeypoints\x18\x04 \x03(\x0b\x32:.object_detection.protos.StringIntLabelMapItem.KeypointMap\x1a(\n\x0bKeypointMap\x12\n\n\x02id\x18\x01 \x01(\x05\x12\r\n\x05label\x18\x02 \x01(\t\"Q\n\x11StringIntLabelMap\x12<\n\x04item\x18\x01 \x03(\x0b\x32..object_detection.protos.StringIntLabelMapItem'
23 )
AttributeError: module 'google.protobuf.descriptor' has no attribute '_internal_create_key'
答案 0 :(得分:81)
这是一个对我有用的解决方案,我不确定它是否对其他人有用。
我通过pip show protobuf
和protoc --version
获得的协议版本是不同的。我升级了pip版本后,pip中的版本有些过时了。
要升级它,请使用pip install --upgrade protobuf
答案 1 :(得分:32)
以下三个命令为我解决了该问题:
pip卸载protobuf python3-protobuf
pip install --upgrade pip
pip install --upgrade protobuf
希望这可以帮助。
答案 2 :(得分:1)
对我来说,问题是我在 libprotobuf
有 3.11
,在 protobuf
有 3.15
升级 libprotobuf 为我修复了它。
答案 3 :(得分:1)
这可能是由于您的 IDE(在我的情况下为 PyCharm)和站点包中的 protobuf 和 python3-protobuf 版本不正确。在我的情况下,以下解决了错误:
pip uninstall pyhton3-protobuf
pip uninstall protobuf
然后终于做
pip install protobuf
另外,如果您有 requirements.txt 或 setup.py,请从 pip freeze 中检查 protobuf 版本并在您的 requirements.txt 文件中使用相同的版本
pip freeze
(检查 protobuf 版本,并在 requirements.txt 中使用相同的版本)
protobuf==3.15.6
(就我而言,pip freeze 给了我这个 protobuf 版本)
答案 4 :(得分:1)
我在 Anaconda 中也遇到了这个问题。 我安装它:
conda install -c conda-forge streamlit
版本为 3.11.4 的 protobuf
和 libprotobuf
我无法更新 protobuf
和 libprotobuf
。
我建议先安装“conda install protobuf”然后
conda install -c conda-forge streamlit
我现在获得了 3.14.0 的 protobuf
和 libprotobuf
版本,并且可以正常工作。
答案 5 :(得分:0)
尝试了许多不同的解决方案(我在Mac上工作)后,最适合我的方法是使用以下方法重新安装protobuf:
PROTOC_ZIP=protoc-3.7.1-osx-x86_64.zip
curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v3.7.1/$PROTOC_ZIP
sudo unzip -o $PROTOC_ZIP -d /usr/local bin/protoc
sudo unzip -o $PROTOC_ZIP -d /usr/local 'include/*'
rm -f $PROTOC_ZIP
中突出显示
答案 6 :(得分:0)
对于最近浏览此书的其他人,谷歌库正在使用proto plus,它是python proto消息的包装。使用此辅助功能对我有用(信条:敲打)
import json
import proto
def proto_message_to_dict(message: proto.Message) -> dict:
"""Helper method to parse protobuf message to dictionary."""
return json.loads(message.__class__.to_json(message))
答案 7 :(得分:0)
如果您使用 protoc 在与导入文件不同的操作系统中生成特定于语言的绑定文件,也会发生这种情况。例如,
Linux 操作系统
SelectableText(
le_li[i],
toolbarOptions: ToolbarOptions(
selectAll: false,
copy: true,
cut: false,
paste: false),
selectionControls: CustomTextSelectionControls(
customButton: (start, end) async {
pref = await SharedPreferences.getInstance();
// Passing the translation to a variable
var translation = await translator.translate(
le_li[i].substring(start, end),
from:
pref.getString('Lang_Short2').substring(0, 2),
to: pref.getString('Lang_Short').substring(0, 2));
await _showMyDialog2(context,
le_li[i].substring(start, end), translation.text);
}),
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 20.0, fontWeight: FontWeight.bold),
showCursor: true,
cursorColor: Colors.red,
cursorWidth: 8,
onSelectionChanged: onSelectionChanged
)
Mac 操作系统
protoc -I=./ --python_out=./ my_module.proto