ImportError no puede importar el nombre BytesIO cuando se importa caffe en ubuntu

Estoy tratando de hacer caffe corriendo en mi máquina equipada con Ubuntu 12.04LTS. Después de terminar todos los pasos en la página de Instalación , entrené el modelo LeNet con éxito y traté de usarlo como tutorial desde aquí . Entonces me salió el siguiente error:

Traceback (most recent call last): File "", line 1, in  ImportError: No module named caffe Error in sys.excepthook: Traceback (most recent call last): File "/usr/lib/python2.7/dist-packages/apport_python_hook.py", line 66, in apport_excepthook from apport.fileutils import likely_packaged, get_recent_crashes File "/usr/lib/python2.7/dist-packages/apport/__init__.py", line 1, in  from apport.report import Report File "/usr/lib/python2.7/dist-packages/apport/report.py", line 18, in  import problem_report File "/usr/lib/python2.7/dist-packages/problem_report.py", line 14, in  import zlib, base64, time, sys, gzip, struct, os File "/usr/lib/python2.7/gzip.py", line 10, in  import io File "${HOME}/path/to/caffe/python/caffe/io.py", line 2, in  import skimage.io File "/usr/local/lib/python2.7/dist-packages/skimage/io/__init__.py", line 11, in  from ._io import * File "/usr/local/lib/python2.7/dist-packages/skimage/io/_io.py", line 1, in  from io import BytesIO ImportError: cannot import name BytesIO Original exception was: Traceback (most recent call last): File "", line 1, in  ImportError: No module named caffe 

Establecí PYTHONPATH en el archivo .bashrc antes de hacer lo anterior. ¿Cuál es el problema? ¿Alguien podría dar alguna pista? Estoy realmente confundido. Después de ejecutar el comando python -c 'import io; print io.__file__' python -c 'import io; print io.__file__' en el mismo directorio:

 Traceback (most recent call last): File "${HOME}/path/to/caffe/python/caffe/io.py", line 2, in  import skimage.io File "/usr/local/lib/python2.7/dist-packages/skimage/io/__init__.py", line 11, in  from ._io import * File "/usr/local/lib/python2.7/dist-packages/skimage/io/_io.py", line 1, in  from io import BytesIO ImportError: cannot import name BytesIO Error in sys.excepthook: Traceback (most recent call last): File "/usr/lib/python2.7/dist-packages/apport_python_hook.py", line 66, in apport_excepthook from apport.fileutils import likely_packaged, get_recent_crashes File "/usr/lib/python2.7/dist-packages/apport/__init__.py", line 1, in  from apport.report import Report File "/usr/lib/python2.7/dist-packages/apport/report.py", line 18, in  import problem_report File "/usr/lib/python2.7/dist-packages/problem_report.py", line 14, in  import zlib, base64, time, sys, gzip, struct, os File "/usr/lib/python2.7/gzip.py", line 10, in  import io File "${HOME}/path/to/caffe/python/caffe/io.py", line 2, in  import skimage.io File "/usr/local/lib/python2.7/dist-packages/skimage/io/__init__.py", line 11, in  from ._io import * File "/usr/local/lib/python2.7/dist-packages/skimage/io/_io.py", line 1, in  from io import BytesIO ImportError: cannot import name BytesIO Original exception was: Traceback (most recent call last): File "${HOME}/path/to/caffe/python/caffe/io.py", line 2, in  import skimage.io File "/usr/local/lib/python2.7/dist-packages/skimage/io/__init__.py", line 11, in  from ._io import * File "/usr/local/lib/python2.7/dist-packages/skimage/io/_io.py", line 1, in  from io import BytesIO ImportError: cannot import name BytesIO 

Entonces, el problema se convierte en: ¿cómo resolver el problema del nombre? PD: También inserté un problema en el repository de caffe .

Parece que tienes un paquete o módulo llamado io en tu ruta de Python que está enmascarando el paquete de la biblioteca estándar. En su lugar, se importa pero no tiene un objeto BytesIO para importar.

Intenta correr:

 python -c 'import io; print io.__file__' 

en la misma ubicación donde está ejecutando el tutorial y cambie el nombre o mueva el archivo nombrado por esa importación, suponiendo que no es la versión estándar de la biblioteca (que termina en lib/python2.7/io.pyc ).

Podría ser que configures tu ruta de Python en el directorio incorrecto. Debe incluir path/to/caffe/python , no path/to/caffe/python/caffe , ni tampoco debe intentar ejecutar python con este último como su directorio de trabajo actual. En ambos casos, caffe/python/caffe/io.py lugar de la versión estándar de la biblioteca.

Las instrucciones de instalación no tienen la culpa aquí; claramente te dicen que uses:

 export PYTHONPATH=/path/to/caffe/python:$PYTHONPATH 

Tenga en cuenta la falta de /caffe al final de ese camino.

También me encontré con este problema, instalando caffe en una instancia de AWS ubuntu 14.04 siguiendo el script como se describe en el repository de github de BVLC aquí: “Caffe en EC2 Ubuntu 14.04” .

He configurado la ruta de acceso de python como se indica. Según lo diagnosticado por @Martijn Pieters, el problema es que caffe está importando su propia biblioteca io, que luego está importando la biblioteca io de scikit-image, que a su vez está intentando (pero está fallando) cargar la biblioteca estándar de python io (donde se encuentra BytesIO ). En cambio, debido a la ruta de acceso de python, cuando scikit-image intenta importar BytesIO desde el módulo io, se dirige circularmente al módulo io de caffe.

También descubrí que incluso cuando no estaba tratando de importar caffe, pero debido a haber configurado mi camino de python para incluir caffe, este mismo problema me golpea en otros lugares.

Probablemente hay varias maneras de abordar esto. Pero la esencia es que la importación de alto nivel de caffe tiene la culpa. Para verificar esto, modifiqué el código caffe de la siguiente manera:

  1. .../caffe/io.py nombre de .../caffe/io.py modulo a .../caffe/caffe_io.py para estar seguro (aunque con el cuidado correcto del espacio de nombres, esto no debería ser necesario)

  2. pycaffe.py la importación en la parte superior del módulo pycaffe.py desde: import caffe.io para import caffe.caffe_io

  3. __init__.py la importación en __init__.py la misma manera (desde import caffe.io para import caffe.caffe_io )

Ahora, cuando importas io desde python, no recogerá la biblioteca de io en caffe. Cuando importas caffe, importará su biblioteca caffe_io personalizada, y todo debería estar bien. Es posible que desee realizar un escaneo más exhaustivo a través de los módulos de Python Caffe para asegurarse de que no haya pasado por alto otros lugares donde la importación debe cambiar.

Espero que esto ayude. Quizás cuando tenga tiempo, emitiré una solicitud de extracción con estos cambios (o similares) en el repository de github de caffe.