【问题标题】:How to read images in a folder and store their class number and image data? Python如何读取文件夹中的图像并存储它们的类号和图像数据? Python
【发布时间】:2020-04-25 18:21:08
【问题描述】:

我有一个文件夹,其中包含 100 张图片,所有图片都是 png。文件名是1.png, 2.png, 3.png ... 最多100个。

目前我所做的是将这些图像手动拆分到不同的子文件夹(10 个文件夹,每个文件夹 10 个图像),每个文件夹是一个类别(汽车、飞机、马、狗等)。

我不想手动制作 10 个子文件夹来将图像复制并粘贴到每个子文件夹中,而是 根据与 txt 文件中的索引条目相对应的图像名称读取和存储其数据。

记事本文件如下所示。基本上这说明 1.png 是飞机,2.png 也是飞机,11.png 是汽车,等等。

airplane
airplane
airplane
airplane
airplane
airplane
airplane
airplane
airplane
airplane
car
car
car
car
car
car
car
car
car
car
bird
bird
bird
bird
bird
bird
bird
bird
bird
bird
cat
cat
cat
cat
cat
cat
cat
cat
cat
cat
deer
deer
deer
deer
deer
deer
deer
deer
deer
deer
dog
dog
dog
dog
dog
dog
dog
dog
dog
dog
frog
frog
frog
frog
frog
frog
frog
frog
frog
frog
horse
horse
horse
horse
horse
horse
horse
horse
horse
horse
ship
ship
ship
ship
ship
ship
ship
ship
ship
ship
truck
truck
truck
truck
truck
truck
truck
truck
truck
truck

我将如何执行这样的操作来生成用于深度学习目的的类号(标签)?这是我以前使用的:

def create_data(data_dir,array_name):
    for category in CATEGORIES:  
        path = os.path.join(data_dir,category)  # create path to class
        class_num = CATEGORIES.index(category)  # get the classification
        for img in os.listdir(path):  # iterate over each image
            try:
                img_array = cv2.imread(os.path.join(path,img) ,cv2.IMREAD_COLOR)                     new_array = img_array
                array_name.append([new_array, class_num]) 
            except Exception as e:  # in the interest in keeping the output clean...
                pass

def normalise(X):
    X = X/255.0

def append(data_array,X,y):
    for features,label in data_array:
        X.append(features)
        y.append(label)

【问题讨论】:

  • 我不明白这个问题。如果您的图像与它们在 txt 文件中列出的顺序相同,那么您只需读取 txt 文件并将其输入np.array() 即可拥有一个一维数组。
  • 这是一个非常脆弱、不可扩展的设计。当您拥有数千张图像时会发生什么 - 您如何检查呢?如果缺少一张图片怎么办 - 所有其他图片的类别都被误解了。也许考虑将类别名称/编号添加到文件名中,以便它与图像一起移动,而与其他图像的存在无关。或者将类别嵌入到PNG 评论字段中,使其成为图像的一部分。
  • @MarkSetchell 这就是我被问到的......这样的实现会是什么样子?
  • @pavel 如果我可以问一下,它会是什么样子?
  • 您可以使用 exiftoolImageMagick 或其他类似 exiftool -comment="Category:car" 1.png 的工具设置评论并使用 exiftool -s -S -comment 1.png 检索它

标签: python machine-learning deep-learning neural-network


【解决方案1】:

不太确定这是否是您的意思,但这应该会有所帮助:

import cv2

def read_images_and_labels(img_dir, label_file):
    with open(label_file) as f:
        labels = [word.lower().strip() for word in f.read().split("\n")]
    data = {}
    for (ind, val) in enumerate(list(set(labels))):
        data[val] = ind
    corrected_labels = [data[label] for label in labels]
    images = [cv2.imread('{}/{}.png'.format(img_dir, ind), cv2.IMREAD_COLOR) for (ind, label) in enumerate(labels, 1)]
    return list(zip(images, corrected_labels))

img_dir 是存储图像的位置,而 label_file 是存储标签数据的位置。根据您的代码,将 create_data() 的调用替换为

array_name = read_images_and_labels(data_dir, file='index.txt')

如果要验证标签,请将数据传递给以下函数。将超时设置为更高/更低以获得更长/更短的持续时间(超时以毫秒为单位)。可以查看带有图像标签的 cv2 窗口。

def verify_labels(data, label_file='index.txt', timeout=1000):
    with open(label_file) as f:
        labels = list(set(f.read().lower().split("\n")))
    for (img, ind) in data:
        lbl = labels[ind]  
        image = cv2.putText(img, lbl, (50,50), cv2.FONT_HERSHEY_SIMPLEX,  
                   1, (0, 0, 255), cv2.LINE_AA, False) 
        cv2.imshow(lbl, image)
        cv2.waitKey(timeout)

【讨论】:

  • 感谢您的帮助!有没有办法让我看到正确的标签被应用于正确的图像?
  • 是的,我添加了一个函数,您可以将生成的数据和标签文件传递给它来运行它。
猜你喜欢
  • 2023-03-03
  • 2021-05-04
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多