Tensorflow के tfrecord प्रारूप के साथ बाइनरी इंस्टेंस मास्क की चर संख्या को सीरियल करें
एमएस कोको 2014 डेटासेट के लिए, प्रत्येक छवि में बाउंडिंग बॉक्स की एक चर संख्या होती है, और संबंधित बाइनरी इंस्टेंस मास्क जो एनोटेशन फ़ाइल में दिए गए उदाहरण बहुभुज से प्राप्त किए जा सकते हैं। मैं इसे pycocotools (विशेष रूप से coco.py फ़ाइल का उपयोग करके) प्राप्त करता हूं। अब मैं Tensorflow के tfrecords प्रारूप का उपयोग करके छवि जानकारी को क्रमबद्ध करना चाहता हूं। एक पायथन को एनोटेशन पढ़ने के बाद, प्रत्येक छवि आईडी द्वारा अनुक्रमित, मैं बाउंडिंग बॉक्स की चर संख्याओं को क्रमबद्ध करने में सक्षम था जैसे:
x_min_values = []
x_max_values = []
y_min_values = []
y_max_values = []
for bb in bounding_boxes:
x_min_values.append(int(bb[0]))
y_min_values.append(int(bb[1]))
x_max_values.append(int(bb[2]))
y_max_values.append(int(bb[3]))
और फिर मेरी सुविधा का उपयोग करने के लिए tf.train.Example
, मैंने प्रत्येक सूची को एक int64 फीचर सूची में रूपांतरित किया:
def _int64_feature_list(value):
return tf.train.Feature(int64_list=tf.train.Int64List(value=value))
लेकिन अब मुद्दा यह है कि चूंकि उदाहरण 2 आयामी हैं, इसलिए मुझे यकीन नहीं है कि मुझे उनका उपयोग करने के लिए किस रणनीति का उपयोग करना चाहिए। यदि केवल एक मुखौटा था, एक विभाजन मुखौटा के रूप में, तो मैं बस सरणी को समतल कर सकता हूं, और 64 बिट फीचर सूची लिख सकता हूं, फिर डीसर्लाइज़ करते समय सरणी को फिर से खोलने के लिए छवि की ऊंचाई और चौड़ाई का उपयोग कर सकता हूं, लेकिन मैं ऐसा नहीं कर सकता मास्क के चर संख्या के लिए। किसी भी अंतर्दृष्टि की सराहना की।
जवाब
नीचे बताए अनुसार FixedLenSequenceFeature का उपयोग करने की आवश्यकता है :
2 छवियों का एक उदाहरण जिसमें 3 और 2 बाउंडिंग बॉक्स हैं
bounding_boxes = []
bounding_boxes.append(np.random.randint(low=0, high=2000,size=(3, 4)))
bounding_boxes.append(np.random.randint(low=0, high=2000,size=(2, 4)))
for i, box in enumerate(bounding_boxes):
print({i},box)
आउटपुट:
{०} [[१ 11०६ ११ 19२ १ ९ १ ९ १५४
[ ] [१४54 49 १६५४ ४ ९ 89६
[ ९ [ ] [१३१ ५१५ १६५४ १४ [४]]
{१} [[६०१ १४ 16३ १६ 75० }५६]
[१3 ९ १ ९९ ३ १०४ ९ १ ] ९ ३]]
#Write tfrecord
def _int64_feature(list_of_ints):
return tf.train.Feature(int64_list=tf.train.Int64List(value=list_of_ints))
out_path = './test.tfrec'
with tf.io.TFRecordWriter(out_path) as out:
for box in bounding_boxes:
example = tf.train.Example(features=tf.train.Features(feature={
'boxes': _int64_feature(np.array(box).flatten().tolist()),
}))
out.write(example.SerializeToString())
लिखित tfrecord की जाँच करें:
ds = tf.data.TFRecordDataset(out_path)
for i, data in enumerate(ds):
process_each = {
'boxes': tf.io.FixedLenSequenceFeature([], dtype=tf.int64, allow_missing=True),
}
samples = tf.io.parse_example(data, process_each)
print(i, samples['boxes'].numpy().reshape(-1, 4))
आउटपुट:
0 [[1806 1172 1919 1547]
[1478 1654 498 1689]
[131 515 1654 1586]]
1 [[601 1473 1670 756]
[1791 993 1049 1793]]