मेरे पास एक csv फ़ाइल है, जिसमें प्रत्येक पंक्ति में एक छवि के लिए पिक्सेल मान होते हैं। इसलिए, एक पंक्ति के प्रत्येक कॉलम में पिक्सेल मान होते हैं, अंतिम कॉलम को छोड़कर, जिसमें छवि के लिए 'लेबल' होते हैं, जो "कोट", "ड्रेस", "सैंडल" आदि जैसे शब्द होते हैं। (नोट: पहली पंक्ति कॉलम नाम शामिल हैं और एक छवि नहीं है)।

मैं इन पंक्तियों को छवियों के रूप में पढ़ना चाहता हूं और उन सभी को सहेजना चाहता हूं (अधिमानतः लेबल द्वारा क्रमबद्ध, जैसे 'ड्रेस 1', 'ड्रेस 2', ...., 'सैंडल 1', 'सैंडल 2', .., आदि प्रत्येक के लिए। चार लेबल)।

मैंने लेबल वर्गीकरण के बिना बचत के लिए निम्नलिखित दृष्टिकोण की कोशिश की, लेकिन मुझे एक त्रुटि मिल रही है:

import numpy as np
import csv
import matplotlib.pyplot as plt
i=0
with open('myfile.csv', 'r') as csv_file:
      for data in csv.reader(csv_file):
      pixels = data[:]
      pixels = np.array(pixels, dtype='uint8')
      #Reshape the array into 28 x 28 array (As images are 28x28)
      pixels = pixels.reshape((28, 28)) 
      i +=1
      plt.savefig(str(i))

इसके बारे में जाने का सबसे कुशल तरीका खोज रहे हैं। किसी भी इनपुट की सराहना की जाएगी। धन्यवाद!

1
snelzb 11 अगस्त 2019, 06:45

1 उत्तर

सबसे बढ़िया उत्तर

अगर आपके पास लास्ट कॉलम में नाम है तो आपको बिना लास्ट एलिमेंट data[:-1] के कन्वर्ट करना होगा। और फ़ाइल नाम savefig( data[-1] + str(i) + '.jpg' ) में अंतिम कॉलम का उपयोग करें। विस्तार के बिना यह नहीं जान सकता कि किस प्रकार की छवि लिखनी है।

आपको प्रत्येक लेबल के लिए अलग से i गिनना होगा - अर्थात। dict . का उपयोग करना

i = dict() 
i[label] = 0 

# later 

i[label] += 1 
savefig( label + str(i[label]) + '.jpg' 

आप इसे लिखने के लिए PIL/'तकियाinstead ofmatplotlib` का भी उपयोग कर सकते हैं।

from PIL import Image    

image = Image.fromarray(pixels)
image.save(filename)

import numpy as np
import csv
from PIL import Image    

counter = dict()

with open('myfile.csv') as csv_file:
    csv_reader = csv.reader(csv_file)

    # skip headers
    next(csv_reader)

    for row in csv.reader(csv_reader):

        pixels = row[:-1] # without label
        pixels = np.array(pixels, dtype='uint8')
        pixels = pixels.reshape((28, 28))
        image = Image.fromarray(pixels)

        label = row[-1]

        if label not in counter:
            counter[label] = 0
        counter[label] += 1

        filename = '{}{}.jpg'.format(label, counter[label])
        image.save(filename)

        print('saved:', filename)

संपादित करें: उदाहरण जो इसे उन लोगों के लिए डेटा की एक पंक्ति के साथ दिखाता है जो csv फ़ाइल डाउनलोड किए बिना इसका परीक्षण करना चाहते हैं।

import numpy as np
import csv
from PIL import Image

counter = dict()

row = [
        255,   0,   0,   0,   0,   0,  255,
          0, 255, 255, 255, 255, 255,    0,
          0, 255,   0, 255,   0, 255,    0,
          0, 255, 255, 255, 255, 255,    0,
          0, 255,   0,   0,   0, 255,    0,
          0, 255, 255, 255, 255, 255,    0,
        255,   0,   0,   0,   0,   0,  255,
        'face'
      ]

pixels = row[:-1]

pixels = np.array(pixels, dtype='uint8')
pixels = pixels.reshape((7, 7))
image = Image.fromarray(pixels)

label = row[-1]

if label not in counter:
    counter[label] = 0
counter[label] += 1

filename = '{}{}.png'.format(label, counter[label])

image.save(filename)

print('saved:', filename)

परिणाम: face1.png:

enter image description here


संपादित करें: मैंने आपकी csv फ़ाइल की जांच की है और पिक्सेल पूर्णांक मान नहीं हैं, लेकिन फ़्लोट (सकारात्मक, नकारात्मक) मान हैं, इसलिए आप uint8 का उपयोग नहीं कर सकते। यह float होना चाहिए।

pixels = np.array(pixels, dtype='float')

आप छवि को बचाने के लिए RGB या ग्रेस्केल L में बदल सकते हैं

image = image.convert('RGB')
image = image.convert('L')

लेकिन ऐसा लगता है कि नकारात्मक मूल्यों को परिवर्तित करने में समस्या है।

का उपयोग करते हुए

plt.imsave(filename, pixels)

मुझे अपेक्षित परिणाम मिलता है


import numpy as np
import csv
from PIL import Image    
import matplotlib.pyplot as plt

counter = dict()

with open('gen_image_wgan.csv') as csv_file:
    csv_reader = csv.reader(csv_file)

    # skip headers
    next(csv_reader)

    for row in csv_reader:

        pixels = row[:-1] # without label
        pixels = np.array(pixels, dtype='float')
        pixels = pixels.reshape((28, 28))

        label = row[-1]

        if label not in counter:
            counter[label] = 0
        counter[label] += 1

        filename = '{}{}.png'.format(label, counter[label])
        plt.imsave(filename, pixels)

        print('saved:', filename)
2
furas 11 अगस्त 2019, 16:05