2015-10-15 6 views
6

हाय मैं छवियों (कम लाखों लोगों की) है कि मैं पर वर्गीकरण करने की जरूरत है की एक बहुत कुछ है। मैं स्पार्क का उपयोग कर रहा हूं औरके प्रारूप में सभी छवियों में एक बड़े आरडीडी में पढ़ने में कामयाब रहा हूं।PySpark का उपयोग कर स्पार्क पढ़ छवियों

images = sc.wholeTextFiles("hdfs:///user/myuser/images/image/00*") 

हालांकि, मुझे वास्तव में उलझन में आया कि छवि के यूनिकोड प्रतिनिधित्व के साथ क्या करना है।

यहाँ एक छवि/फ़ाइल का एक उदाहरण है:

(u'hdfs://NameService/user/myuser/images/image/00product.jpg', u'\ufffd\ufffd\ufffd\ufffd\x00\x10JFIF\x00\x01\x01\x01\x00`\x00`\x00\x00\ufffd\ufffd\x01\x1eExif\x00\x00II*\x00\x08\x00\x00\x00\x08\x00\x12\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\x1a\x01\x05\x00\x01\x00\x00\x00n\x00\x00\x00\x1b\x01\x05\x00\x01\x00\x00\x00v\x00\x00\x00(\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x001\x01\x02\x00\x0b\x00\x00\x00~\x00\x00\x002\x01\x02\x00\x14\x00\x00\x00\ufffd\x00\x00\x00\x13\x02\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00i\ufffd\x04\x00\x01\x00\x00\x00\ufffd\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x01\x00\x00\x00`\x00\x00\x00\x01\x00\x00\x00GIMP 2.8.2\x00\x002013:07:29 10:41:35\x00\x07\x00\x00\ufffd\x07\x00\x04\x00\x00\x000220\ufffd\ufffd\x02\x00\x04\x00\x00\x00407\x00\x00\ufffd\x07\x00\x04\x00\x00\x000100\x01\ufffd\x03\x00\x01\x00\x00\x00\ufffd\ufffd\x00\x00\x02\ufffd\x04\x00\x01\x00\x00\x00\x04\x04\x00\x00\x03\ufffd\x04\x00\x01\x00\x00\x00X\x01\x00\x00\x05\ufffd\x04\x00\x01\x00\x00\x00\ufffd\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\x00\x02\x00\x04\x00\x00\x00R98\x00\x02\x00\x07\x00\x04\x00\x00\x000100\x00\x00\x00\x00\ufffd\ufffd\x04_http://ns.adobe.com/xap/1.0/\x00<?xpacket begin=\'\ufeff\' id=\'W5M0MpCehiHzreSzNTczkc9d\'?>\n<x:xmpmeta xmlns:x=\'adobe:ns:meta/\'>\n<rdf:RDF xmlns:rdf=\'http://www.w3.org/1999/02/22-rdf-syntax-ns#\'>\n\n <rdf:Description xmlns:exif=\'http://ns.adobe.com/exif/1.0/\'>\n <exif:Orientation>Top-left</exif:Orientation>\n <exif:XResolution>96</exif:XResolution>\n <exif:YResolution>96</exif:YResolution>\n <exif:ResolutionUnit>Inch</exif:ResolutionUnit>\n <exif:Software>ACD Systems Digital Imaging</exif:Software>\n <exif:DateTime>2013:07:29 10:37:00</exif:DateTime>\n <exif:YCbCrPositioning>Centered</exif:YCbCrPositioning>\n <exif:ExifVersion>Exif Version 2.2</exif:ExifVersion>\n <exif:SubsecTime>407</exif:SubsecTime>\n <exif:FlashPixVersion>FlashPix Version 1.0</exif:FlashPixVersion>\n <exif:ColorSpace>Uncalibrated</exif:ColorSpace>\n 

करीब देख रहे हैं, वहाँ वास्तव में कुछ अक्षर

... 
<x:xmpmeta xmlns:x=\'adobe:ns:meta/\'>\n<rdf:RDF xmlns:rdf=\'http://www.w3.org/1999/02/22-rdf-syntax-ns#\'>\n\n 
<rdf:Description xmlns:exif=\'http://ns.adobe.com/exif/1.0/\'>\n 
<exif:Orientation>Top-left</exif:Orientation>\n 
<exif:XResolution>96</exif:XResolution>\n 
<exif:YResolution>96</exif:YResolution>\n 
... 

मेरे पिछले अनुभव की तरह मेटाडाटा की तरह लग रहे पैकेज scipy उपयोग कर रहा था और कर रहे हैं संबंधित कार्यों जैसे 'imread' ... और इनपुट आमतौर पर एक फ़ाइल नाम है। अब मैं वास्तव में खो गया हूं कि उन यूनिकोड का क्या मतलब है और मैं इसे एक प्रारूप में बदलने के लिए क्या कर सकता हूं जिसे मैं परिचित हूं।

कर सकते हैं मेरे साथ किसी को भी हिस्सा कैसे कर सकते मैं उन यूनिकोड में scipy छवि में पढ़ (ndarray)?

+0

दिलचस्प सवाल +1 –

+0

आरडीडी पर imread के साथ मैपिंग का प्रयास करें। मुझे लगता है कि काम करना चाहिए। विस्तार से बता दें: मैं JPEG प्रारूप से परिचित नहीं हूँ, लेकिन प्रत्येक छवि एक फ़ाइल हो जाता है, और आप imread जैसे कार्यों का उपयोग जटिल छवि योजनाओं के हेरफेर आसान बनाने के लिए एक विशिष्ट प्रारूप है। – Dair

+0

@Dair [imread] (https://github.com/scipy/scipy/blob/v0.16.0/scipy/misc/pilutil.py#L102) के स्रोत कोड को पढ़ने, यह वास्तव में उपयोग कर छवि को पढ़ने के लिए कोशिश कर रहा है पीआईएल.इमेज ने फ़ाइल नाम दिया, यूनिकोड पढ़ने के लिए इंप्रेड को मजबूर करना काम नहीं करता है। –

उत्तर

4

आपका डाटा एक वास्तविक छवि फ़ाइल से कच्चे बाइट्स की तरह दिखता है (JPG?)। आपके डेटा के साथ समस्या यह है कि यह बाइट होना चाहिए, यूनिकोड नहीं। आपको यह पता लगाना होगा कि यूनिकोड से बाइट्स में कैसे परिवर्तित करें। वहाँ जाल आप से निपटने के लिए एन्कोडिंग से भरा कीड़े की एक पूरी कर सकते हैं, लेकिन आप img.encode('iso-8859-1') का उपयोग कर भाग्यशाली हो सकता है। मुझे नहीं पता और मैं इसके जवाब में उससे निपट नहीं पाऊंगा।

एक PNG छवि के लिए कच्चे डेटा इस तरह दिखता है:

rawdata = '\x89PNG\r\n\x1a\n\x00\x00...\x00\x00IEND\xaeB`\x82' 

एक बार जब आप यह बाइट्स में है, तो आप कच्चे डेटा से एक जनहित याचिका छवि बना सकते हैं, और एक nparray के रूप में यह पढ़ें:

>>> from StringIO import StringIO 
>>> from PIL import Image 
>>> import numpy as np 
>>> np.asarray(Image.open(StringIO(rawdata))) 

array([[[255, 255, 255, 0], 
    [255, 255, 255, 0], 
    [255, 255, 255, 0], 
    ..., 
    [255, 255, 255, 0], 
    [255, 255, 255, 0], 
    [255, 255, 255, 0]]], dtype=uint8) 

तुम सब यह स्पार्क पर काम करने की जरूरत है SparkContext.binaryFiles है:

>>> images = sc.binaryFiles("path/to/images/") 
>>> image_to_array = lambda rawdata: np.asarray(Image.open(StringIO(rawdata))) 
>>> images.values().map(image_to_array) 
+0

मुझे वास्तव में स्ट्रिंगियो दृष्टिकोण पसंद है जिसे [यहां] (http://effbot.org/imagingbook/image.htm#tag-Image.open) भी दस्तावेज किया गया है, हालांकि, अजीब यूनिकोड को बाइट्स में बदलना संभवतः मुश्किल हिस्सा है। 'Utf-8' और 'iso-8859-1' दोनों काम नहीं करते थे। यद्यपि वोट दिया गया :) –

+0

यूनिकोड नरक में आपका स्वागत है और शुभकामनाएं, दोस्त! –

+0

@PauloScardine क्या आपको दिमाग होगा यदि मैं एक संपादन करता हूं और इसे पूर्ण उत्तर में बदल देता हूं? – zero323

संबंधित मुद्दे