Ошибка 13: В разрешении отказано. Как это исправить?

#python #neural-network

Вопрос:

Добрый вечер. У меня возникли трудности с доступом к одной из папок набора данных. Я неоднократно переназначал владельцев папок и выдал полный список разрешений. Включая файлы, которые в них хранятся, но ничто не помогает. Ошибка сохраняется. Не могли бы вы предложить решение этой проблемы?

Путь к набору данных: D: keras-учебник коды … а затем есть две папки с изображениями qr-кодов (Bcodes и Ccodes). Они хранят обычные Qr-коды и поврежденные (имеют графические дефекты).

 import matplotlib
matplotlib.use("Agg")
 
from mpl_toolkits.mplot3d import Axes3D
from sklearn.tree import DecisionTreeClassifier
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from keras.models import Sequential
from keras.layers.core import Dense
from keras.optimizers import SGD
from imutils import paths
from tensorflow import keras
from tensorflow.keras.preprocessing import image
import matplotlib.pyplot as plt
import numpy as np
import argparse
import random
import pickle
import cv2
import os
import keras
import pandas as pd
from glob import glob
 
def obj():
    def obj_filter(obj):
        def populate_dict_with_module_objects(target_dict, modules, obj_filter):
            for module in modules:
                for name in dir(module):
                    obj = getattr(module, name)
                    if obj_filter(obj):
                        target_dict[name] = obj
 
ap = argparse.ArgumentParser()
ap.add_argument("-d", "--dataset", required=True,
    help="path to input dataset of images")
ap.add_argument("-m", "--model", required=True,
    help="path to output trained model")
ap.add_argument("-l", "--label-bin", required=True,
    help="path to output label binarizer")
ap.add_argument("-p", "--plot", required=True,
    help="path to output accuracy/loss plot")
args = vars(ap.parse_args())
 
try:
    import Image
except ImportError:
    from PIL import Image
 
def process_image(img_path):
    print(f"Processing image: {img_path}")
    img = Image.open(img_path)
 
    print (img.info)
 
    del img
 
images_dir = "D:keras-tutorialcodes"
 
if __name__ == "__main__":
    images_list = os.listdir(images_dir)
    print(images_list)
 
    for img_filename in images_list:
        img_path = os.path.join(images_dir, img_filename)
        process_image(img_path)
        
print("[INFO] loading images...")
data = []
labels = []
 
imagePaths = sorted(list(paths.list_images(args["dataset"])))
random.seed(42)
random.shuffle(imagePaths)
 
    image = cv2.imread(imagePath)
    image = cv2.resize(image, (32, 32)).flatten()
    data.append(image)
 
    label = imagePath.split(os.path.sep)[-2]
    labels.append(label)
 
data = np.array(data, dtype="float") / 255.0
labels = np.array(labels)
 
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split (data,
    labels, test_size=0.25, train_size=None, random_state=42)
 
lb = LabelBinarizer()
trainY = lb.fit_transform(trainY)
testY = lb.transform(testY)
 
def create_model(lyrs=[8], act='linear', opt='Adam', dr=0.0):
    seed(42)
    tf.random.set_seed(42)
    model = tf.keras.Sequential()
    model.add(tf.keras.Dense(lyrs[0], input_dim=X_train.shape[1], activation=act))
    for i in range(1, len(lyrs)):
        model.add(tf.keras.Dense(lyrs[i], activation=act))
        model.add(tf.keras.Dropout(dr))
        model.add(tf.keras.Dense(1, activation='sigmoid'))
        model.complete(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy'])
    return model
 
    model = tf.keras.KerasClassifier(build_nf=create_model, verbose=0)
 
    batch_size = [16, 32, 64]
    epochs = [50, 100]
    param_grid = dict(batch_size=batch_size, ephochs=epochs)
 
    grid = tf.keras.GridSearchCV(estimator=model,
                                 param_grid=param_grid,
                                 cv=3,
                                 verbose=2)  # include n_jobs=-1 if you are using CPU
    grid_result = grid.fit(X_train, y_train)
 
H = model.fit(trainX, trainY, validation_data=(testX, testY),
    epochs=EPOCHS, batch_size=32)
 
print("[INFO] evaluating network...")
predictions = model.predict(testX, batch_size=32)
print(classification_report(testY.argmax(axis=1),
    predictions.argmax(axis=1), target_names=lb.classes_))
 
N = np.arange(0, EPOCHS)
plt.style.use("ggplot")
plt.figure()
plt.plot(N, H.history["loss"], label="train_loss")
plt.plot(N, H.history["val_loss"], label="val_loss")
plt.plot(N, H.history["acc"], label="train_acc")
plt.plot(N, H.history["val_acc"], label="val_acc")
plt.title("Training Loss and Accuracy (Simple NN)")
plt.xlabel("Epoch #")
plt.ylabel("Loss/Accuracy")
plt.legend()
plt.savefig(args["plot"])
 
print("[INFO] serializing network and label binarizer...")
model.save(args["model"])
f = open(args["label_bin"], "wb")
f.write(pickle.dumps(lb))
f.close()
 

Ошибка:

 C:  WINDOWS  system32> python D:  keras-tutorial  train_simple_nn.py -d codes -m output / simple_nn.model -l output / simple_nn_lb.pickle -p output / simple_nn_plot.png
2021-06-20 18: 49: 06.375743: I tensorflow / stream_executor / platform / default / dso_loader.cc: 53] Successfully opened dynamic library cudart64_110.dll
['Bcodes', 'Ccodes']
Processing image: D:  keras-tutorial  codes  Bcodes
Traceback (most recent call last):
File "D:  keras-tutorial  train_simple_nn.py", line 81, in <module>
process_image (img_path)
File "D:  keras-tutorial  train_simple_nn.py", line 63, in process_image
img = Image.open (img_path)
File "C:  Users  Alex  AppData  Local  Programs  Python  Python36  lib  si te-packages  PIL  Image.py", line 2912, in open
fp = builtins.open (filename, "rb")
PermissionError: [Errno 13] Permission denied: 'D: \ keras-tutorial \ codes \ Bcodes'
 

Комментарии:

1. Это большой объем кода, и большая его часть, скорее всего, не связана с вашей проблемой. Это помогло бы взломать тестовую программу, которая удаляет то, что не связано с проблемой. Если я правильно понимаю, D:\keras-tutorial\codes\Bcodes это каталог, но вы пытаетесь его открыть. Это тот фрагмент кода, который мне показался бы интересным.

2. @tdelaney Я побоялся опубликовать отдельный фрагмент. Внезапно возникнет больше ошибок или потребуется весь программный код, чтобы понять это.

3. Но это только часть отладки. Легко взломать копию программы на python. Ваша ошибка возникает в начале кода. Вы можете просто удалить все, что не было запущено в момент ошибки. У вас есть параметры командной строки… как насчет примера, в котором есть жестко закодированные ваи? Так как это проблема с открытием файла, зачем вообще иметь Image.open (или любой из его импорта). У ванили open может быть та же проблема, которая дает вам отличные подсказки о том, что не так. Сужение проблемы приводит к решению.

Ответ №1:

Проблема в том, что вы недостаточно глубоко изучили свою структуру каталогов. Немного взломал ваш код

 images_dir = "D:keras-tutorialcodes"
images_list = os.listdir(images_dir)
print(images_list)
 

выходы

 ['Bcodes', 'Ccodes']
 

подкаталоги, содержащие нужные вам изображения. Вы пробуете image.open эти каталоги, а не файлы в этих каталогах. Если вы хотите обработать все файлы в подкаталогах, вы можете использовать шаблон D:keras-tutorialcodes** глобуса .

 from glob import glob
import os
images_dir = "D:\keras-tutorial\codes"
 
if __name__ == "__main__":
    images_list = glob(os.path.join(images_dir, "*", "*"))
    print(images_list)
 
    for img_path in images_list:
        process_image(img_path)
 

Если все эти файлы имеют общее расширение файла, например «.img», вы могли бы сделать этот код немного безопаснее, выполнив glob(os.path.join(images_dir, "*", "*.img") вместо этого.

также было бы неплохо включить обработку изображений в обработчик исключений, который имеет какую-то политику для файлов, которые обрабатываются неправильно.