You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_minddataset.py 21 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. # Copyright 2019 Huawei Technologies Co., Ltd
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License at
  6. #
  7. # http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. # ==============================================================================
  15. """
  16. This is the test module for mindrecord
  17. """
  18. import collections
  19. import json
  20. import os
  21. import re
  22. import string
  23. import mindspore.dataset.transforms.vision.c_transforms as vision
  24. import numpy as np
  25. import pytest
  26. from mindspore.dataset.transforms.vision import Inter
  27. from mindspore import log as logger
  28. import mindspore.dataset as ds
  29. from mindspore.mindrecord import FileWriter
  30. FILES_NUM = 4
  31. CV_FILE_NAME = "../data/mindrecord/imagenet.mindrecord"
  32. CV_DIR_NAME = "../data/mindrecord/testImageNetData"
  33. NLP_FILE_NAME = "../data/mindrecord/aclImdb.mindrecord"
  34. NLP_FILE_POS = "../data/mindrecord/testAclImdbData/pos"
  35. NLP_FILE_VOCAB= "../data/mindrecord/testAclImdbData/vocab.txt"
  36. @pytest.fixture
  37. def add_and_remove_cv_file():
  38. """add/remove cv file"""
  39. paths = ["{}{}".format(CV_FILE_NAME, str(x).rjust(1, '0'))
  40. for x in range(FILES_NUM)]
  41. for x in paths:
  42. os.remove("{}".format(x)) if os.path.exists("{}".format(x)) else None
  43. os.remove("{}.db".format(x)) if os.path.exists("{}.db".format(x)) else None
  44. writer = FileWriter(CV_FILE_NAME, FILES_NUM)
  45. data = get_data(CV_DIR_NAME)
  46. cv_schema_json = {"file_name": {"type": "string"}, "label": {"type": "int32"},
  47. "data": {"type": "bytes"}}
  48. writer.add_schema(cv_schema_json, "img_schema")
  49. writer.add_index(["file_name", "label"])
  50. writer.write_raw_data(data)
  51. writer.commit()
  52. yield "yield_cv_data"
  53. for x in paths:
  54. os.remove("{}".format(x))
  55. os.remove("{}.db".format(x))
  56. @pytest.fixture
  57. def add_and_remove_nlp_file():
  58. """add/remove nlp file"""
  59. paths = ["{}{}".format(NLP_FILE_NAME, str(x).rjust(1, '0'))
  60. for x in range(FILES_NUM)]
  61. for x in paths:
  62. if os.path.exists("{}".format(x)):
  63. os.remove("{}".format(x))
  64. if os.path.exists("{}.db".format(x)):
  65. os.remove("{}.db".format(x))
  66. writer = FileWriter(NLP_FILE_NAME, FILES_NUM)
  67. data = [x for x in get_nlp_data(NLP_FILE_POS, NLP_FILE_VOCAB, 10)]
  68. nlp_schema_json = {"id": {"type": "string"}, "label": {"type": "int32"},
  69. "rating": {"type": "float32"},
  70. "input_ids": {"type": "int64",
  71. "shape": [-1]},
  72. "input_mask": {"type": "int64",
  73. "shape": [1, -1]},
  74. "segment_ids": {"type": "int64",
  75. "shape": [2,-1]}
  76. }
  77. writer.set_header_size(1 << 14)
  78. writer.set_page_size(1 << 15)
  79. writer.add_schema(nlp_schema_json, "nlp_schema")
  80. writer.add_index(["id", "rating"])
  81. writer.write_raw_data(data)
  82. writer.commit()
  83. yield "yield_nlp_data"
  84. for x in paths:
  85. os.remove("{}".format(x))
  86. os.remove("{}.db".format(x))
  87. def test_cv_minddataset_writer_tutorial():
  88. """tutorial for cv dataset writer."""
  89. paths = ["{}{}".format(CV_FILE_NAME, str(x).rjust(1, '0'))
  90. for x in range(FILES_NUM)]
  91. for x in paths:
  92. os.remove("{}".format(x)) if os.path.exists("{}".format(x)) else None
  93. os.remove("{}.db".format(x)) if os.path.exists("{}.db".format(x)) else None
  94. writer = FileWriter(CV_FILE_NAME, FILES_NUM)
  95. data = get_data(CV_DIR_NAME)
  96. cv_schema_json = {"file_name": {"type": "string"}, "label": {"type": "int32"},
  97. "data": {"type": "bytes"}}
  98. writer.add_schema(cv_schema_json, "img_schema")
  99. writer.add_index(["file_name", "label"])
  100. writer.write_raw_data(data)
  101. writer.commit()
  102. for x in paths:
  103. os.remove("{}".format(x))
  104. os.remove("{}.db".format(x))
  105. def test_cv_minddataset_partition_tutorial(add_and_remove_cv_file):
  106. """tutorial for cv minddataset."""
  107. columns_list = ["data", "file_name", "label"]
  108. num_readers = 4
  109. def partitions(num_shards):
  110. for partition_id in range(num_shards):
  111. data_set = ds.MindDataset(CV_FILE_NAME + "0", columns_list, num_readers,
  112. num_shards=num_shards, shard_id=partition_id)
  113. num_iter = 0
  114. for item in data_set.create_dict_iterator():
  115. logger.info("-------------- partition : {} ------------------------".format(partition_id))
  116. logger.info("-------------- item[label]: {} -----------------------".format(item["label"]))
  117. num_iter += 1
  118. return num_iter
  119. assert partitions(4) == 3
  120. assert partitions(5) == 2
  121. assert partitions(9) == 2
  122. def test_cv_minddataset_dataset_size(add_and_remove_cv_file):
  123. """tutorial for cv minddataset."""
  124. columns_list = ["data", "file_name", "label"]
  125. num_readers = 4
  126. data_set = ds.MindDataset(CV_FILE_NAME + "0", columns_list, num_readers)
  127. assert data_set.get_dataset_size() == 10
  128. repeat_num = 2
  129. data_set = data_set.repeat(repeat_num)
  130. num_iter = 0
  131. for item in data_set.create_dict_iterator():
  132. logger.info("-------------- get dataset size {} -----------------".format(num_iter))
  133. logger.info("-------------- item[label]: {} ---------------------".format(item["label"]))
  134. logger.info("-------------- item[data]: {} ----------------------".format(item["data"]))
  135. num_iter += 1
  136. assert num_iter == 20
  137. data_set = ds.MindDataset(CV_FILE_NAME + "0", columns_list, num_readers,
  138. num_shards=4, shard_id=3)
  139. assert data_set.get_dataset_size() == 3
  140. def test_cv_minddataset_repeat_reshuffle(add_and_remove_cv_file):
  141. """tutorial for cv minddataset."""
  142. columns_list = ["data", "label"]
  143. num_readers = 4
  144. data_set = ds.MindDataset(CV_FILE_NAME + "0", columns_list, num_readers)
  145. decode_op = vision.Decode()
  146. data_set = data_set.map(input_columns=["data"], operations=decode_op, num_parallel_workers=2)
  147. resize_op = vision.Resize((32, 32), interpolation=Inter.LINEAR)
  148. data_set = data_set.map(input_columns="data", operations=resize_op, num_parallel_workers=2)
  149. data_set = data_set.batch(2)
  150. data_set = data_set.repeat(2)
  151. num_iter = 0
  152. labels = []
  153. for item in data_set.create_dict_iterator():
  154. logger.info("-------------- get dataset size {} -----------------".format(num_iter))
  155. logger.info("-------------- item[label]: {} ---------------------".format(item["label"]))
  156. logger.info("-------------- item[data]: {} ----------------------".format(item["data"]))
  157. num_iter += 1
  158. labels.append(item["label"])
  159. assert num_iter == 10
  160. logger.info("repeat shuffle: {}".format(labels))
  161. assert len(labels) == 10
  162. assert labels[0:5] == labels[0:5]
  163. assert labels[0:5] != labels[5:5]
  164. def test_cv_minddataset_batch_size_larger_than_records(add_and_remove_cv_file):
  165. """tutorial for cv minddataset."""
  166. columns_list = ["data", "label"]
  167. num_readers = 4
  168. data_set = ds.MindDataset(CV_FILE_NAME + "0", columns_list, num_readers)
  169. decode_op = vision.Decode()
  170. data_set = data_set.map(input_columns=["data"], operations=decode_op, num_parallel_workers=2)
  171. resize_op = vision.Resize((32, 32), interpolation=Inter.LINEAR)
  172. data_set = data_set.map(input_columns="data", operations=resize_op, num_parallel_workers=2)
  173. data_set = data_set.batch(32, drop_remainder=True)
  174. num_iter = 0
  175. for item in data_set.create_dict_iterator():
  176. logger.info("-------------- get dataset size {} -----------------".format(num_iter))
  177. logger.info("-------------- item[label]: {} ---------------------".format(item["label"]))
  178. logger.info("-------------- item[data]: {} ----------------------".format(item["data"]))
  179. num_iter += 1
  180. assert num_iter == 0
  181. def test_cv_minddataset_issue_888(add_and_remove_cv_file):
  182. """issue 888 test."""
  183. columns_list = ["data", "label"]
  184. num_readers = 2
  185. data = ds.MindDataset(CV_FILE_NAME + "0", columns_list, num_readers, shuffle=False, num_shards=5, shard_id=1)
  186. data = data.shuffle(2)
  187. data = data.repeat(9)
  188. num_iter = 0
  189. for item in data.create_dict_iterator():
  190. num_iter += 1
  191. assert num_iter == 18
  192. def test_cv_minddataset_blockreader_tutorial(add_and_remove_cv_file):
  193. """tutorial for cv minddataset."""
  194. columns_list = ["data", "label"]
  195. num_readers = 4
  196. data_set = ds.MindDataset(CV_FILE_NAME + "0", columns_list, num_readers,
  197. block_reader=True)
  198. assert data_set.get_dataset_size() == 10
  199. repeat_num = 2
  200. data_set = data_set.repeat(repeat_num)
  201. num_iter = 0
  202. for item in data_set.create_dict_iterator():
  203. logger.info("-------------- block reader repeat tow {} -----------------".format(num_iter))
  204. logger.info("-------------- item[label]: {} ----------------------------".format(item["label"]))
  205. logger.info("-------------- item[data]: {} -----------------------------".format(item["data"]))
  206. num_iter += 1
  207. assert num_iter == 20
  208. def test_cv_minddataset_reader_basic_tutorial(add_and_remove_cv_file):
  209. """tutorial for cv minderdataset."""
  210. columns_list = ["data", "file_name", "label"]
  211. num_readers = 4
  212. data_set = ds.MindDataset(CV_FILE_NAME + "0", columns_list, num_readers)
  213. assert data_set.get_dataset_size() == 10
  214. num_iter = 0
  215. for item in data_set.create_dict_iterator():
  216. logger.info("-------------- cv reader basic: {} ------------------------".format(num_iter))
  217. logger.info("-------------- len(item[data]): {} ------------------------".format(len(item["data"])))
  218. logger.info("-------------- item[data]: {} -----------------------------".format(item["data"]))
  219. logger.info("-------------- item[file_name]: {} ------------------------".format(item["file_name"]))
  220. logger.info("-------------- item[label]: {} ----------------------------".format(item["label"]))
  221. num_iter += 1
  222. assert num_iter == 10
  223. def test_nlp_minddataset_reader_basic_tutorial(add_and_remove_nlp_file):
  224. """tutorial for nlp minderdataset."""
  225. num_readers = 4
  226. data_set = ds.MindDataset(NLP_FILE_NAME + "0", None, num_readers)
  227. assert data_set.get_dataset_size() == 10
  228. num_iter = 0
  229. for item in data_set.create_dict_iterator():
  230. logger.info("-------------- cv reader basic: {} ------------------------".format(num_iter))
  231. logger.info("-------------- num_iter: {} ------------------------".format(num_iter))
  232. logger.info("-------------- item[id]: {} ------------------------".format(item["id"]))
  233. logger.info("-------------- item[rating]: {} --------------------".format(item["rating"]))
  234. logger.info("-------------- item[input_ids]: {}, shape: {} -----------------".format(
  235. item["input_ids"], item["input_ids"].shape))
  236. logger.info("-------------- item[input_mask]: {}, shape: {} -----------------".format(
  237. item["input_mask"], item["input_mask"].shape))
  238. logger.info("-------------- item[segment_ids]: {}, shape: {} -----------------".format(
  239. item["segment_ids"], item["segment_ids"].shape))
  240. assert item["input_ids"].shape == (50,)
  241. assert item["input_mask"].shape == (1, 50)
  242. assert item["segment_ids"].shape == (2, 25)
  243. num_iter += 1
  244. assert num_iter == 10
  245. def test_cv_minddataset_reader_basic_tutorial_5_epoch(add_and_remove_cv_file):
  246. """tutorial for cv minderdataset."""
  247. columns_list = ["data", "file_name", "label"]
  248. num_readers = 4
  249. data_set = ds.MindDataset(CV_FILE_NAME + "0", columns_list, num_readers)
  250. assert data_set.get_dataset_size() == 10
  251. for epoch in range(5):
  252. num_iter = 0
  253. for data in data_set:
  254. logger.info("data is {}".format(data))
  255. num_iter += 1
  256. assert num_iter == 10
  257. data_set.reset()
  258. def test_cv_minddataset_reader_basic_tutorial_5_epoch_with_batch(add_and_remove_cv_file):
  259. """tutorial for cv minderdataset."""
  260. columns_list = ["data", "file_name", "label"]
  261. num_readers = 4
  262. data_set = ds.MindDataset(CV_FILE_NAME + "0", columns_list, num_readers)
  263. resize_height = 32
  264. resize_width = 32
  265. # define map operations
  266. decode_op = vision.Decode()
  267. resize_op = vision.Resize((resize_height, resize_width), ds.transforms.vision.Inter.LINEAR)
  268. data_set = data_set.map(input_columns=["data"], operations=decode_op, num_parallel_workers=4)
  269. data_set = data_set.map(input_columns=["data"], operations=resize_op, num_parallel_workers=4)
  270. data_set = data_set.batch(2)
  271. assert data_set.get_dataset_size() == 5
  272. for epoch in range(5):
  273. num_iter = 0
  274. for data in data_set:
  275. logger.info("data is {}".format(data))
  276. num_iter += 1
  277. assert num_iter == 5
  278. data_set.reset()
  279. def test_cv_minddataset_reader_no_columns(add_and_remove_cv_file):
  280. """tutorial for cv minderdataset."""
  281. data_set = ds.MindDataset(CV_FILE_NAME + "0")
  282. assert data_set.get_dataset_size() == 10
  283. num_iter = 0
  284. for item in data_set.create_dict_iterator():
  285. logger.info("-------------- cv reader basic: {} ------------------------".format(num_iter))
  286. logger.info("-------------- len(item[data]): {} ------------------------".format(len(item["data"])))
  287. logger.info("-------------- item[data]: {} -----------------------------".format(item["data"]))
  288. logger.info("-------------- item[file_name]: {} ------------------------".format(item["file_name"]))
  289. logger.info("-------------- item[label]: {} ----------------------------".format(item["label"]))
  290. num_iter += 1
  291. assert num_iter == 10
  292. def test_cv_minddataset_reader_repeat_tutorial(add_and_remove_cv_file):
  293. """tutorial for cv minderdataset."""
  294. columns_list = ["data", "file_name", "label"]
  295. num_readers = 4
  296. data_set = ds.MindDataset(CV_FILE_NAME + "0", columns_list, num_readers)
  297. repeat_num = 2
  298. data_set = data_set.repeat(repeat_num)
  299. num_iter = 0
  300. for item in data_set.create_dict_iterator():
  301. logger.info("-------------- repeat two test {} ------------------------".format(num_iter))
  302. logger.info("-------------- len(item[data]): {} -----------------------".format(len(item["data"])))
  303. logger.info("-------------- item[data]: {} ----------------------------".format(item["data"]))
  304. logger.info("-------------- item[file_name]: {} -----------------------".format(item["file_name"]))
  305. logger.info("-------------- item[label]: {} ---------------------------".format(item["label"]))
  306. num_iter += 1
  307. assert num_iter == 20
  308. def get_data(dir_name):
  309. """
  310. usage: get data from imagenet dataset
  311. params:
  312. dir_name: directory containing folder images and annotation information
  313. """
  314. if not os.path.isdir(dir_name):
  315. raise IOError("Directory {} not exists".format(dir_name))
  316. img_dir = os.path.join(dir_name, "images")
  317. ann_file = os.path.join(dir_name, "annotation.txt")
  318. with open(ann_file, "r") as file_reader:
  319. lines = file_reader.readlines()
  320. data_list = []
  321. for line in lines:
  322. try:
  323. filename, label = line.split(",")
  324. label = label.strip("\n")
  325. with open(os.path.join(img_dir, filename), "rb") as file_reader:
  326. img = file_reader.read()
  327. data_json = {"file_name": filename,
  328. "data": img,
  329. "label": int(label)}
  330. data_list.append(data_json)
  331. except FileNotFoundError:
  332. continue
  333. return data_list
  334. def get_multi_bytes_data(file_name, bytes_num=3):
  335. """
  336. Return raw data of multi-bytes dataset.
  337. Args:
  338. file_name (str): String of multi-bytes dataset's path.
  339. bytes_num (int): Number of bytes fields.
  340. Returns:
  341. List
  342. """
  343. if not os.path.exists(file_name):
  344. raise IOError("map file {} not exists".format(file_name))
  345. dir_name = os.path.dirname(file_name)
  346. with open(file_name, "r") as file_reader:
  347. lines = file_reader.readlines()
  348. data_list = []
  349. row_num = 0
  350. for line in lines:
  351. try:
  352. img10_path = line.strip('\n').split(" ")
  353. img5 = []
  354. for path in img10_path[:bytes_num]:
  355. with open(os.path.join(dir_name, path), "rb") as file_reader:
  356. img5 += [file_reader.read()]
  357. data_json = {"image_{}".format(i): img5[i]
  358. for i in range(len(img5))}
  359. data_json.update({"id": row_num})
  360. row_num += 1
  361. data_list.append(data_json)
  362. except FileNotFoundError:
  363. continue
  364. return data_list
  365. def get_mkv_data(dir_name):
  366. """
  367. Return raw data of Vehicle_and_Person dataset.
  368. Args:
  369. dir_name (str): String of Vehicle_and_Person dataset's path.
  370. Returns:
  371. List
  372. """
  373. if not os.path.isdir(dir_name):
  374. raise IOError("Directory {} not exists".format(dir_name))
  375. img_dir = os.path.join(dir_name, "Image")
  376. label_dir = os.path.join(dir_name, "prelabel")
  377. data_list = []
  378. file_list = os.listdir(label_dir)
  379. index = 1
  380. for item in file_list:
  381. if os.path.splitext(item)[1] == '.json':
  382. file_path = os.path.join(label_dir, item)
  383. image_name = ''.join([os.path.splitext(item)[0], ".jpg"])
  384. image_path = os.path.join(img_dir, image_name)
  385. with open(file_path, "r") as load_f:
  386. load_dict = json.load(load_f)
  387. if os.path.exists(image_path):
  388. with open(image_path, "rb") as file_reader:
  389. img = file_reader.read()
  390. data_json = {"file_name": image_name,
  391. "prelabel": str(load_dict),
  392. "data": img,
  393. "id": index}
  394. data_list.append(data_json)
  395. index += 1
  396. logger.info('{} images are missing'.format(len(file_list)-len(data_list)))
  397. return data_list
  398. def get_nlp_data(dir_name, vocab_file, num):
  399. """
  400. Return raw data of aclImdb dataset.
  401. Args:
  402. dir_name (str): String of aclImdb dataset's path.
  403. vocab_file (str): String of dictionary's path.
  404. num (int): Number of sample.
  405. Returns:
  406. List
  407. """
  408. if not os.path.isdir(dir_name):
  409. raise IOError("Directory {} not exists".format(dir_name))
  410. for root, dirs, files in os.walk(dir_name):
  411. for index, file_name_extension in enumerate(files):
  412. if index < num:
  413. file_path = os.path.join(root, file_name_extension)
  414. file_name, _ = file_name_extension.split('.', 1)
  415. id_, rating = file_name.split('_', 1)
  416. with open(file_path, 'r') as f:
  417. raw_content = f.read()
  418. dictionary = load_vocab(vocab_file)
  419. vectors = [dictionary.get('[CLS]')]
  420. vectors += [dictionary.get(i) if i in dictionary
  421. else dictionary.get('[UNK]')
  422. for i in re.findall(r"[\w']+|[{}]"
  423. .format(string.punctuation),
  424. raw_content)]
  425. vectors += [dictionary.get('[SEP]')]
  426. input_, mask, segment = inputs(vectors)
  427. input_ids = np.reshape(np.array(input_), [-1])
  428. input_mask = np.reshape(np.array(mask), [1, -1])
  429. segment_ids = np.reshape(np.array(segment), [2, -1])
  430. data = {
  431. "label": 1,
  432. "id": id_,
  433. "rating": float(rating),
  434. "input_ids": input_ids,
  435. "input_mask": input_mask,
  436. "segment_ids": segment_ids
  437. }
  438. yield data
  439. def convert_to_uni(text):
  440. if isinstance(text, str):
  441. return text
  442. if isinstance(text, bytes):
  443. return text.decode('utf-8', 'ignore')
  444. raise Exception("The type %s does not convert!" % type(text))
  445. def load_vocab(vocab_file):
  446. """load vocabulary to translate statement."""
  447. vocab = collections.OrderedDict()
  448. vocab.setdefault('blank', 2)
  449. index = 0
  450. with open(vocab_file) as reader:
  451. while True:
  452. tmp = reader.readline()
  453. if not tmp:
  454. break
  455. token = convert_to_uni(tmp)
  456. token = token.strip()
  457. vocab[token] = index
  458. index += 1
  459. return vocab
  460. def inputs(vectors, maxlen=50):
  461. length = len(vectors)
  462. if length > maxlen:
  463. return vectors[0:maxlen], [1]*maxlen, [0]*maxlen
  464. input_ = vectors+[0]*(maxlen-length)
  465. mask = [1]*length + [0]*(maxlen-length)
  466. segment = [0]*maxlen
  467. return input_, mask, segment