2015-10-15 22 views
6

Merhaba, sınıflandırma yapmam gereken çok fazla imge (alt milyon) var. Spark kullanıyorum ve (filename1, content1), (filename2, content2) ... formatındaki tüm görüntüleri büyük bir RDD'ye okumayı başardım.PySpark kullanarak Kıvılcım Görüntüleri okuyun

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

Ancak, görüntünün unicode temsilcileri ile ne gerçekten karıştı. Aslında bazı karakterler

... 
<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 
... 

Benim önceki deneyim gibi meta veriler gibi bakmak paket scipy kullanıyordum ve orada

(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 

yakın Aranan: Burada

bir görüntü/dosya örneğidir 'imread' gibi ilgili işlevler ... ve giriş genellikle bir dosya adıdır. Şimdi gerçekten bu unicode'un ne anlama geldiğini ve aşina olduğum bir forma dönüştürmek için neler yapabileceğimi gerçekten kaybettim.

Benimle paylaşan herkes, bu unicode'larda nasıl bir scipy görüntüsüne (ndarray) okuyabiliyor?

+0

ilginç soru 1 –

+0

RDD üzerinden imbayla eşleştirmeyi deneyin. Bence işe yaramalı. Ayrıntılı bilgi için: JPEG formatına aşina değilim, ancak her görüntü bir dosyaya dönüşüyor ve karmaşık görüntü şemalarının manipülasyonunu basitleştirmek için imread gibi fonksiyonlar kullandığınız özel bir formata sahip. – Dair

+0

@ [imread] 'in kaynak kodunu okuyarak (https://github.com/scipy/scipy/blob/v0.16.0/scipy/misc/pilutil.py#L102), görüntüyü gerçekten okunmaya çalışıyor. PIL.Image dosya ismi verildi, unicode okumak için okumaya zorlama çalışmıyor. –

cevap

4

Verileriniz gerçek bir görüntü dosyasındaki (JPG?) Ham bayt gibi görünüyor. Verilerinizdeki sorun, bayt değil, unicode olması gerektiğidir. Unicode'dan baytlara nasıl dönüştürüleceğini öğrenmelisiniz. Başa çıkmak zorunda olduğunuz şifreli şifrelerle dolu bir sürü kurt var, ama img.encode('iso-8859-1') kullanarak şanslı olabilirsiniz. Bilmiyorum ve cevabımda bununla ilgilenmeyeceğim.

bir PNG görüntüsü için ham verilere

şuna benzer: Eğer byte olarak buna sahip kez

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

, ham verilerden bir PIL görüntü oluşturmak ve bir nparray olarak okuyabilirsiniz:

>>> 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) 

bunu Spark üzerinde çalışması için gereken tek şey SparkContext.binaryFiles geçerli:

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

Ben de (burada http://effbot.org/imagingbook/image.htm#tag-Image.open) belgelenen StringIO yaklaşımı seviyorum, ancak, garip unicode byte çevirmek muhtemelen zor kısmıdır. Hem 'utf-8' hem de 'iso-8859-1' işe yaramadı. Oysa oy verin :) –

+0

Unicode cehenneme ve iyi şanslar hoş geldiniz dostum! –

+0

@PauloScardine Bir düzenleme yapıp tam cevaba çevirmemin sakıncası olur mu? – zero323

İlgili konular