Маркировка изображений с помощью Python

Недавно я наткнулся на этот вопрос: Интерактивная маркировка изображений в блокноте jupyter, который показался мне весьма интересным.

Имея небольшой опыт программирования на Python, я попытался запустить предоставленный код из ответа с помощью Jupyter Notebook, но почему-то не могу заставить его работать. Я считаю, что я делаю что-то неправильно при импорте изображений. Я пытаюсь импортировать все изображения из папки с именем «изображения», которая находится в «ПУТИ».

Вот полный код:

import cv2
import os

import ipywidgets as widgets
import functools

images_list = []

os.chdir(PATH)
# Load in the images
for filepath in os.listdir('images/'):
    images_list.append(cv2.imread('images/{0}'.format(filepath),0))


COLS = 4
ROWS = 2
IMAGES = images_list 
IMG_WIDTH = 200
IMG_HEIGHT = 200

def on_click(index):
    print('Image %d clicked' % index)


rows = []

for row in range(ROWS):
    cols = []
    for col in range(COLS):
        index = row * COLS + col
        image = widgets.Image(
            value=IMAGES[index], width=IMG_WIDTH, height=IMG_HEIGHT
        )
        button = widgets.Button(description='Image %d' % index)
        # Bind the click event to the on_click function, with our index as argument
        button.on_click(functools.partial(on_click, index))

        # Create a vertical layout box, image above the button
        box = widgets.VBox([image, button])
        cols.append(box)

    # Create a horizontal layout box, grouping all the columns together
    rows.append(widgets.HBox(cols))

# Create a vertical layout box, grouping all the rows together
result = widgets.VBox(rows)

Редактировать

После исправления синтаксической ошибки я получаю следующую ошибку:

--------------------------------------------------------------------------- 
TraitError 
Traceback (most recent call last) <ipython-input-87-2ca2a1eb59b4> in <module>()
     36         index = row * COLS + col
     37         image = widgets.Image(
---> 38             value=IMAGES[index], width=IMG_WIDTH, height=IMG_HEIGHT
     39         )
     40         button = widgets.Button(description='Image %d' % index)

~\Anaconda3\lib\site-packages\ipywidgets\widgets\widget.py in __init__(self, **kwargs)
    409         """Public constructor"""
    410         self._model_id = kwargs.pop('model_id', None)
--> 411         super(Widget, self).__init__(**kwargs)
    412
    413         Widget._call_widget_constructed(self)

~\Anaconda3\lib\site-packages\traitlets\traitlets.py in __init__(self, *args, **kwargs)
    995             for key, value in kwargs.items():
    996                 if self.has_trait(key):
--> 997                     setattr(self, key, value)
    998                 else:
    999                     # passthrough args that don't set traits to super

~\Anaconda3\lib\site-packages\traitlets\traitlets.py in __set__(self, obj, value)
    583             raise TraitError('The "%s" trait is read-only.' % self.name)
    584         else:
--> 585             self.set(obj, value)
    586 
    587     def _validate(self, obj, value):

~\Anaconda3\lib\site-packages\traitlets\traitlets.py in set(self, obj, value)
    557 
    558     def set(self, obj, value):
--> 559         new_value = self._validate(obj, value)
    560         try:
    561             old_value = obj._trait_values[self.name]

~\Anaconda3\lib\site-packages\traitlets\traitlets.py in _validate(self, obj, value)
    589             return value
    590         if hasattr(self, 'validate'):
--> 591             value = self.validate(obj, value)
    592         if obj._cross_validation_lock is False:
    593             value = self._cross_validate(obj, value)

~\Anaconda3\lib\site-packages\traitlets\traitlets.py in validate(self, obj, value)
   2024         if isinstance(value, bytes):
   2025             return value
-> 2026         self.error(obj, value)
   2027 
   2028 

~\Anaconda3\lib\site-packages\traitlets\traitlets.py in error(self, obj, value)
    623             e = "The '%s' trait must be %s, but a value of %r was specified." \
    624                 % (self.name, self.info(), repr_type(value))
--> 625         raise TraitError(e)
    626 
    627     def get_metadata(self, key, default=None):

TraitError: The 'value' trait of an Image instance must be a bytes object, but a value of 
    array([[232, 242, 243, ..., 243, 246, 232],
           [244, 254, 255, ..., 254, 255, 243],
           [244, 254, 255, ..., 254, 255, 242],
           ...,
           [242, 253, 253, ..., 254, 254, 243],
           [245, 255, 255, ..., 255, 255, 244],
           [238, 249, 248, ..., 245, 245, 234]], dtype=uint8) 
    <class 'numpy.ndarray'> 
was specified.

Редактировать

Вот моя версия Jupyter Notebook:

Маркировка изображений с помощью Python

Для вашего отредактированного вопроса: TraitError выглядит так, как будто пакет Traitlets ожидает объект Bytes, но IPyWidget отправляет ему пустой массив. Учитывая, что вы сами ничего не делаете с numpy, я предполагаю, что это проблема совместимости. Какую версию ipywidgets вы используете? А что насчет трейлетов? Совместимы ли они?

Niayesh Isky 18.03.2019 01:44

@NiayeshIsky Спасибо за ваш комментарий. Я обновил свой вопрос своей версией jupyter, но я не знаю, как проверить трейлеты. Как бы Вы это сделали ? Спасибо.

henry 18.03.2019 08:12

Похоже, вы используете Anaconda, поэтому, согласно этот ответ, просто запустите conda env export -n YOUR_ENV_NAME > environment.yml и найдите traitlets в выходном environment.yml файле. (Или вы можете пастобин весь выходной файл и ссылку на него здесь, если хотите.)

Niayesh Isky 18.03.2019 13:46
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
3
3 723
1

Ответы 1

В скопированном вами коде отсутствует двоеточие в конце второй строки for, которая должна выглядеть так:

    for col in range(COLS):

(Я бы порекомендовал хорошую IDE или, по крайней мере, средство проверки синтаксиса, чтобы отлавливать такого рода ошибки!)

После того, как вы исправите все проблемы с синтаксисом, вы можете проверить, действительно ли у вас есть какие-либо проблемы с тем, как вы импортируете изображения. Но из того, что я вижу, ваш код в порядке - вы открываете кучу файлов в виде изображений в оттенках серого и передаете их коду из связанного вопроса. (Если у вас все еще есть проблемы после того, как синтаксические ошибки исчезли, вы можете отредактировать этот вопрос или опубликовать другой.)

Спасибо, что заметили мою опечатку! Я исправил это, но теперь я получаю другое сообщение об ошибке (см. обновленный вопрос)

henry 17.03.2019 17:43

@henry, пожалуйста, если вы отредактируете свой оригинал и получите ответы, просто добавьте ниже свой вопрос, новую проблему, с которой вы столкнулись, после «Редактировать:», чтобы каждый мог проследить, что произошло. Ваше здоровье.

Paradox 17.03.2019 17:48

Другие вопросы по теме