Python错误:赢得';t隐式地将Unicode转换为字节

Python错误:赢得';t隐式地将Unicode转换为字节,python,caffe,Python,Caffe,我正在学习使用caffe和python的机器学习教程,但在尝试编译给定代码时遇到以下错误: line 80, in <module> in_txn.put('{:0>5d}'.format(in_idx), datum.SerializeToString()) TypeError: Won't implicitly convert Unicode to bytes; use .encode() 问题在于Python(二进制字符串)中有字节和常规str: >类型(b“测

我正在学习使用caffe和python的机器学习教程,但在尝试编译给定代码时遇到以下错误:

line 80, in <module>
    in_txn.put('{:0>5d}'.format(in_idx), datum.SerializeToString())
TypeError: Won't implicitly convert Unicode to bytes; use .encode()

问题在于Python(二进制字符串)中有
字节和常规
str

>类型(b“测试”)
>>>类型(“试验”)
字节
不被编码(例如US-ASCII、UTF-8等),而
str
被编码。您可能想做的是确保使用Python版本<2.7,因为即使您修复了示例中有问题的代码,您也可能在其他地方遇到其他问题。我建议您尝试使用Pytork或Keras的最新教程(如果您想更详细地了解正在发生的事情,请使用Pytork,如果您对基本原理不太了解,并且希望更高层次地了解事情,请使用Keras)

import os
import glob
import random
import sys
sys.path.append("/usr/lib/python3/dist-packages")

import numpy as np
sys.path.append("/home/johannes/.local/lib/python3.8/site-packages")
import cv2

import caffe
from caffe.proto import caffe_pb2
import lmdb

#Size of images
IMAGE_WIDTH = 227
IMAGE_HEIGHT = 227

def transform_img(img, img_width=IMAGE_WIDTH, img_height=IMAGE_HEIGHT):

    #Histogram Equalization
    img[:, :, 0] = cv2.equalizeHist(img[:, :, 0])
    img[:, :, 1] = cv2.equalizeHist(img[:, :, 1])
    img[:, :, 2] = cv2.equalizeHist(img[:, :, 2])

    #Image Resizing
    img = cv2.resize(img, (img_width, img_height), interpolation = cv2.INTER_CUBIC)

    return img


def make_datum(img, label):
    #image is numpy.ndarray format. BGR instead of RGB
    return caffe_pb2.Datum(
        channels=3,
        width=IMAGE_WIDTH,
        height=IMAGE_HEIGHT,
        label=label,
        data=np.rollaxis(img, 2).tostring())

train_lmdb = '/home/johannes/Documents/Projektseminar/deeplearning-cats-dogs-tutorial-master/trainData'
validation_lmdb = '/home/johannes/Documents/Projektseminar/deeplearning-cats-dogs-tutorial-master/validation'

os.system('rm -rf  ' + train_lmdb)
os.system('rm -rf  ' + validation_lmdb)


train_data = [img for img in glob.glob("../train/*jpg")]
test_data = [img for img in glob.glob("../test1/*jpg")]

#Shuffle train_data
random.shuffle(train_data)

print('Creating train_lmdb')

in_db = lmdb.open(train_lmdb, map_size=int(1e12))
with in_db.begin(write=True) as in_txn:
    for in_idx, img_path in enumerate(train_data):
        if in_idx %  6 == 0:
            continue
        img = cv2.imread(img_path, cv2.IMREAD_COLOR)
        img = transform_img(img, img_width=IMAGE_WIDTH, img_height=IMAGE_HEIGHT)
        if 'Ohne' in img_path:
            label = 0
        else:
            label = 1
        datum = make_datum(img, label)
        in_txn.put('{:0>5d}'.format(in_idx), datum.SerializeToString())
        print('{:0>5d}'.format(in_idx) + ':' + img_path)
in_db.close()


print('\nCreating validation_lmdb')

in_db = lmdb.open(validation_lmdb, map_size=int(1e12))
with in_db.begin(write=True) as in_txn:
    for in_idx, img_path in enumerate(train_data):
        if in_idx % 6 != 0:
            continue
        img = cv2.imread(img_path, cv2.IMREAD_COLOR)
        img = transform_img(img, img_width=IMAGE_WIDTH, img_height=IMAGE_HEIGHT)
        if 'Ohne' in img_path:
            label = 0
        else:
            label = 1
        datum = make_datum(img, label)
        in_txn.put('{:0>5d}'.format(in_idx), datum.SerializeToString())
        print('{:0>5d}'.format(in_idx) + ':' + img_path)
in_db.close()

print('\nFinished processing all images')