100

I encountered it while executing from object_detection.utils import label_map_util in jupyter notebook. It is actually the tensorflow object detection tutorial notebook(it comes with the tensorflow object detection api) The complete error log:

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'
ilkkachu
  • 6,221
  • 16
  • 30
Reghunaath A A
  • 3,130
  • 4
  • 7
  • 18

11 Answers11

196

The protoc version I got through pip show protobuf and protoc --version were different. The version in pip was a bit outdated.

After I upgraded the pip version with

pip install --upgrade protobuf

the problem was solved.

Boris Verkhovskiy
  • 14,854
  • 11
  • 100
  • 103
Reghunaath A A
  • 3,130
  • 4
  • 7
  • 18
50

These three commands solved it for me:

pip uninstall protobuf python3-protobuf
pip install --upgrade pip
pip install --upgrade protobuf
analyst045
  • 628
  • 7
  • 21
  • 6
    In my case, I only had to upgrade pip and and protobuf (within the virtual environment) from `3.11.3` to `3.13.0` – alejandro Aug 24 '20 at 04:16
  • Simply updating protobuf from 3.11.2 to 3.13.0 was sufficient for me. – PolyTekPatrick Sep 12 '20 at 22:03
  • 1
    It also works for me. Although I upgraded protobuf, it did not work. Then I run the following comment `pip uninstall protobuf python3-protobuf` and it worked. Thanks! – Can Jun 23 '21 at 18:54
5

This can be due to incorrect versions of protobuf and python3-protobuf in your IDE(in my case PyCharm) and in site-packages. Following solved error in my case:

pip uninstall python3-protobuf
pip uninstall protobuf

then finally do

pip install protobuf

Also if you have requirements.txt or setup.py check protobuf version from pip freeze and use the same version in your requirements.txt file

pip freeze

(check protobuf version, and use same in requirements.txt)

protobuf==3.15.6 (in my case pip freeze gave me this version for protobuf)

igorkf
  • 3,159
  • 2
  • 22
  • 31
Onkar
  • 297
  • 5
  • 9
3

For others looking into this more recently newer google libraries are using proto plus, a wrapper for python proto messages. Using this helper function worked for me (cred: tobked)

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))

https://github.com/googleapis/python-memcache/issues/19

Matt Key
  • 95
  • 1
  • 6
2

After trying many different solutions (i'm working on a Mac) the one that worked for me is to reinstall protobuf using:

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

As is highlighted in this article

TacoEater
  • 2,115
  • 20
  • 22
2

the problem for me was i had libprotobuf at 3.11 and protobuf at 3.15 upgrading libprotobuf fixed it for me.

davzaman
  • 823
  • 2
  • 10
  • 20
2

I got this problem in Anaconda too. I installed it with:

conda install -c conda-forge streamlit

with the versions protobuf and libprotobuf of 3.11.4

I was not able to update neither protobuf nor libprotobuf.

I recommend to install first "conda install protobuf" and then

conda install -c conda-forge streamlit

I got now the versions protobuf and libprotobuf of 3.14.0 and it works.

Shivam Roy
  • 1,961
  • 3
  • 10
  • 23
2

The issue of my condition is protoc not install.

step to solve the problem:

  1. check pip3 show protobuf, you will see version of protobuf.
    • e.q. Version: 3.17.3
  2. goto protobuf release page and install same version of protoc
    • e.q.
      1. wget https://github.com/protocolbuffers/protobuf/releases/download/v3.17.3/protoc-3.17.3-linux-x86_64.zip
      2. unzip protoc-3.17.3-linux-x86_64.zip
      3. vim ~/.bashprofile and paste PATH=$PATH:/home/YOUR_HOST_NAME/bin
      4. source ~/.bashprofile and echo $PATH to check whether /home/YOUR_HOST_NAME/bin exist or not.
  3. check pip3 show protobuf is equal to protoc --version
  4. If not work, reboot and try again.
chilin
  • 420
  • 7
  • 9
1

Downgrade protobuf using pip

Sometimes the upgrade code pip install --upgrade protobuf throwed another error. -

  • version 3.20 seems to be working properly
pip install protobuf==3.20.*

similar to TypeError: Descriptors cannot not be created directly

Dr.House
  • 784
  • 5
  • 11
0

This can also happen if you use protoc to generate your language specific bindings file in a different OS than where you import it. For example,

Linux OS

protoc -I=./ --python_out=./ my_module.proto 

Mac OS

import my_module_pb2
quickinsights
  • 1,067
  • 12
  • 18
0

In my case, I was passing a dictionary to where the Google cloud API was expecting a string. Woops.

ubershmekel
  • 11,864
  • 10
  • 72
  • 89