]> AND Private Git Repository - myo-class.git/commitdiff
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
stable, day after meeting master
authorBernardo TOD <bernardo.tod52@gmail.com>
Wed, 3 Jul 2019 15:39:53 +0000 (17:39 +0200)
committerBernardo TOD <bernardo.tod52@gmail.com>
Wed, 3 Jul 2019 15:39:53 +0000 (17:39 +0200)
Case_index.txt [new file with mode: 0644]
black-list.txt [new file with mode: 0644]
draw-plt.py [new file with mode: 0644]
regularjson.py
topng.py
tosampledir.py
totraindir.py

diff --git a/Case_index.txt b/Case_index.txt
new file mode 100644 (file)
index 0000000..5c2c143
--- /dev/null
@@ -0,0 +1,393 @@
+Case_0002
+Case_0003
+Case_0004
+Case_0005
+Case_0006
+Case_0007
+Case_0008
+Case_0009
+Case_0011
+Case_0012
+Case_0013
+Case_0014
+Case_0015
+Case_0016
+Case_0017
+Case_0018
+Case_0019
+Case_0021
+Case_0023
+Case_0025
+Case_0026
+Case_0027
+Case_0028
+Case_0029
+Case_0030
+Case_0031
+Case_0032
+Case_0035
+Case_0036
+Case_0037
+Case_0040
+Case_0043
+Case_0044
+Case_0045
+Case_0046
+Case_0047
+Case_0048
+Case_0049
+Case_0050
+Case_0051
+Case_0052
+Case_0053
+Case_0055
+Case_0056
+Case_0059
+Case_0060
+Case_0061
+Case_0063
+Case_0064
+Case_0065
+Case_0066
+Case_0067
+Case_0068
+Case_0069
+Case_0070
+Case_0071
+Case_0072
+Case_0073
+Case_0074
+Case_0075
+Case_0076
+Case_0077
+Case_0078
+Case_0079
+Case_0080
+Case_0081
+Case_0082
+Case_0083
+Case_0084
+Case_0085
+Case_0086
+Case_0087
+Case_0088
+Case_0089
+Case_0090
+Case_0091
+Case_0092
+Case_0093
+Case_0094
+Case_0095
+Case_0096
+Case_0097
+Case_0098
+Case_0099
+Case_0100
+Case_0101
+Case_0103
+Case_0104
+Case_0105
+Case_0106
+Case_0107
+Case_0108
+Case_0200
+Case_0201
+Case_0204
+Case_0205
+Case_0206
+Case_0208
+Case_0209
+Case_0210
+Case_0211
+Case_0212
+Case_0213
+Case_0214
+Case_0215
+Case_0216
+Case_0217
+Case_0218
+Case_0219
+Case_0220
+Case_0221
+Case_0222
+Case_0223
+Case_0224
+Case_0225
+Case_0226
+Case_0227
+Case_0228
+Case_0229
+Case_0230
+Case_0231
+Case_0232
+Case_0233
+Case_0234
+Case_0235
+Case_0236
+Case_0237
+Case_0238
+Case_0239
+Case_0240
+Case_0241
+Case_0242
+Case_0243
+Case_0244
+Case_0245
+Case_0246
+Case_0247
+Case_0248
+Case_0249
+Case_0250
+Case_0251
+Case_0252
+Case_0253
+Case_0254
+Case_0255
+Case_0256
+Case_0257
+Case_0258
+Case_0259
+Case_0260
+Case_0261
+Case_0262
+Case_0263
+Case_0264
+Case_0265
+Case_0266
+Case_0267
+Case_0268
+Case_0269
+Case_0270
+Case_0271
+Case_0272
+Case_0273
+Case_0274
+Case_0275
+Case_0276
+Case_0277
+Case_0278
+Case_0279
+Case_0280
+Case_0281
+Case_0282
+Case_0283
+Case_0284
+Case_0285
+Case_0286
+Case_0287
+Case_0288
+Case_0289
+Case_0290
+Case_0291
+Case_0292
+Case_0293
+Case_0294
+Case_0295
+Case_0296
+Case_0297
+Case_0298
+Case_0299
+Case_0300
+Case_0301
+Case_0302
+Case_0303
+Case_0304
+Case_0305
+Case_0306
+Case_0307
+Case_0308
+Case_0309
+Case_0310
+Case_0311
+Case_0312
+Case_0313
+Case_0314
+Case_0315
+Case_0316
+Case_0317
+Case_0318
+Case_0319
+Case_0320
+Case_0321
+Case_0322
+Case_0323
+Case_0324
+Case_0325
+Case_0326
+Case_0327
+Case_0328
+Case_0329
+Case_0330
+Case_0331
+Case_0332
+Case_0333
+Case_0334
+Case_0335
+Case_0336
+Case_0337
+Case_0338
+Case_0339
+Case_0340
+Case_0341
+Case_0342
+Case_0343
+Case_0344
+Case_0345
+Case_0346
+Case_0347
+Case_0348
+Case_0349
+Case_0350
+Case_0351
+Case_0352
+Case_0353
+Case_0354
+Case_0355
+Case_0356
+Case_0357
+Case_0358
+Case_0359
+Case_0360
+Case_0361
+Case_0362
+Case_0363
+Case_0364
+Case_0365
+Case_0366
+Case_0367
+Case_0368
+Case_0369
+Case_0370
+Case_0371
+Case_0372
+Case_0373
+Case_0374
+Case_0375
+Case_0376
+Case_0377
+Case_0378
+Case_0379
+Case_0380
+Case_0381
+Case_0382
+Case_0383
+Case_0384
+Case_0385
+Case_0386
+Case_0387
+Case_0388
+Case_0389
+Case_0390
+Case_0391
+Case_0392
+Case_0393
+Case_0394
+Case_0395
+Case_0396
+Case_0397
+Case_0398
+Case_0399
+Case_0400
+Case_0401
+Case_0402
+Case_0403
+Case_0404
+Case_0405
+Case_0406
+Case_0407
+Case_0408
+Case_0409
+Case_0410
+Case_0411
+Case_0412
+Case_0413
+Case_0414
+Case_0415
+Case_0416
+Case_0417
+Case_0418
+Case_0419
+Case_0420
+Case_0421
+Case_0422
+Case_0423
+Case_0424
+Case_0425
+Case_0426
+Case_0427
+Case_0428
+Case_0429
+Case_0430
+Case_0431
+Case_0432
+Case_0433
+Case_0434
+Case_0435
+Case_0436
+Case_0437
+Case_0438
+Case_0439
+Case_0440
+Case_0441
+Case_0442
+Case_0443
+Case_0444
+Case_0445
+Case_0446
+Case_0447
+Case_0448
+Case_0449
+Case_0450
+Case_0451
+Case_0452
+Case_0453
+Case_0454
+Case_0455
+Case_0456
+Case_0457
+Case_0458
+Case_0459
+Case_0460
+Case_0461
+Case_0462
+Case_0463
+Case_0464
+Case_0465
+Case_0466
+Case_0467
+Case_0468
+Case_0469
+Case_0470
+Case_0471
+Case_0472
+Case_0473
+Case_0474
+Case_0475
+Case_0476
+Case_0477
+Case_0478
+Case_0479
+Case_0480
+Case_0481
+Case_0482
+Case_0483
+Case_0484
+Case_0485
+Case_0486
+Case_0487
+Case_0488
+Case_0489
+Case_0490
+Case_0491
+Case_0492
+Case_0493
+Case_0494
+Case_0495
+Case_0496
+Case_0497
+Case_0498
+Case_0499
+Case_0500
+Case_0501
+Case_0502
+Case_0503
\ No newline at end of file
diff --git a/black-list.txt b/black-list.txt
new file mode 100644 (file)
index 0000000..5474fbd
--- /dev/null
@@ -0,0 +1,21 @@
+================= OLD =================
+
+ BLACK_LIST_CASES = ['Case_0009', 'Case_0208', 'Case_0258', 'Case_0259', 'Case_0265', 'Case_0266', 'Case_0300', 'Case_0305', 'Case_0311',
+       'Case_0311', 'Case_0315', 'Case_0316', 'Case_0319', 'Case_0320', 'Case_0321', 'Case_0322', 'Case_0323', 'Case_0326',
+       'Case_0327', 'Case_0328', 'Case_0329', 'Case_0331', 'Case_0332', 'Case_0333', 'Case_0334', 'Case_0335',
+        'Case_0337',
+       'Case_0338', 'Case_0339', 'Case_0340', 'Case_0342', 'Case_0343', 'Case_0345', 'Case_0346', 'Case_0347', 'Case_0348',
+       'Case_0349', 'Case_0350', 'Case_0382', 'Case_0383', 'Case_0384', 'Case_0386', 'Case_0387', 'Case_0388', 'Case_0389', 'Case_0390', 'Case_0391', 'Case_0392', 'Case_0393',
+       'Case_0394', 'Case_0395', 'Case_0396', 'Case_0397', 'Case_0398', 'Case_0399', 'Case_0400', 'Case_0401', 'Case_0402',
+       'Case_0402', 'Case_0407', 'Case_0409',
+ ]
+
+ BLACK_LIST_IMAGES = ['Case_0021-Image00006', 'Case_0021-Image00007', 'Case_0021-Image00008', 'Case_0021-Image00009',
+       'Case_0098-Image00001', 'Case_0209-59178790', 'Case_0209-59178801', 'Case_0229-Image00002', 'Case_0260-Image00001',
+       'Case_0229-Image00004', 'Case_0229-Image00006', 'Case_0243-Image00004', 'Case_0245-Image00007', 'Case_0271-Image00006',
+       'Case_0275-Image00002', 'Case_0086-Image07.dcm', 'Case_0309-Image00002', 'Case_0330-Image00007', 'Case_0336-Image00001', 'Case_0336-Image00008',
+       'Case_0336-Image00008', 'Case_0336-Image00009', 'Case_0340-Image00005', 'Case_0340-Image00006', 'Case_0340-Image00007',
+       'Case_0351-I2000000', 'Case_0351-I6000000', 'Case_0351-I7000000', 'Case_0352-I1100000', 'Case_0386-Image00001', 'Case_0344-Image00008',
+       'Case_0344-Image00009', 'Case_0403-Image00009', 'Case_0404-I2000000', 'Case_0403-Image00009',
+       'Case_0404-I2000000', 'Case_0406-Image00008', 'Case_0406-Image000089', 'Case_0406-Image00010', 
+ ]
\ No newline at end of file
diff --git a/draw-plt.py b/draw-plt.py
new file mode 100644 (file)
index 0000000..5b65075
--- /dev/null
@@ -0,0 +1,36 @@
+import numpy as np
+import matplotlib.pyplot as plt
+
+dep = ( 0, pow(2, 8) ) # 9 bits
+arr = ( 0, pow(2, 16) ) # 16 bits
+
+# deprange = np.arange(0, pow(2, 8), 1) # 9 bits
+
+
+# test <<
+plt.plot(dep, arr, 'r--', linewidth=.3)
+# plt.plot(dep, arr, 'r--', deprange, deprange<<8, 'bs', linewidth=.1)
+plt.show()
+
+print("decalage")
+for i in deprange:
+       print( 'i, i<<8:', (i, i<<8) )
+# test >>
+
+# # test <<
+# print("affine transfo")
+# count = 0
+# for i in deprange:
+#      ab = dep
+#      cd = arr
+
+#      a, b = ab[0], ab[1]
+#      c, d = cd[0], cd[1]
+       
+#      r = max( 0, ( (i-a) * (d-c) / (b-a) + c ) )
+#      r2 = i<<8
+#      print( 'i, r:', (i, r) )
+#      print( 'i, i<<8:', (i, r2) )
+#      count += (r != r2)
+
+# print('count', count)
\ No newline at end of file
index 87addeb3299f4cef3713e416c38005fb4102aea6..bef52b9ba93e8a4579662d6c2b45c4ed23aeed31 100644 (file)
@@ -16,11 +16,11 @@ from pprint import pprint
 
 
 # constants
-# json
+# json OLD may be it was just a separation for the copy, new -> no more that, stay in one directory
 #   |--> json_GT
 #   |--> json_GT_part2
-RT_PATH = '../../Data/json/'
-JSON_GTS = ['json_GT', 'json_GT_part2']
+RT_PATH = '../../Data/Contours_updated/'
+JSON_GTS = ['json_GT']
 INFA_STR = 'Infarction'
 EPI_STR = 'Epicardic'
 ENDO_STR = 'Endocardic'
index fde569ba6509bdf19efb0a28c282d4ec4b8b1dfb..672fd6d9a4dd66bfc33018d1c28981ad94b13d11 100644 (file)
--- a/topng.py
+++ b/topng.py
@@ -27,6 +27,7 @@ INPUT_DIR = '../../Data/Images_anonymous/Case_0002/'
 OUT_DIR = './generated/'
 
 CROP_SIZE = (45, 45) # (width, height)
+EPI_MIN_PIXELS = 30 * 30 # nombre pixels minimal pour considérer un epicardic, else on ignore, 30 * 30, vu que c'est carré
 RED_COLOR = 100
 
 def roundall(*l):
@@ -108,6 +109,43 @@ def getxy(file):
                return np.array(tmp, dtype=np.int32)
                # return tmp
 
+def getimgname(file):
+       """
+               {
+                       'Image00001': [{
+                               'color': '#ff0000',
+                               'points': [
+                                       {'x': 94.377, 'y': 137.39},
+                                       {'x': 100.38, 'y': 139.55},
+                                       {'x': 103.26, 'y': 142.67},
+                                       {'x': 105.91, 'y': 147.95},
+                                       {'x': 105.42, 'y': 152.76},
+                                       {'x': 100.62, 'y': 156.84},
+                                       {'x': 95.338, 'y': 159.96},
+                                       {'x': 89.573, 'y': 158.52},
+                                       {'x': 84.53, 'y': 153},
+                                       {'x': 82.848, 'y': 149.15},
+                                       {'x': 82.368, 'y': 142.91},
+                                       {'x': 85.01, 'y': 138.11},
+                                       {'x': 89.813, 'y': 137.39},
+                                       {'x': 94.377, 'y': 137.39}
+                               ]
+                       }]
+               }
+               return 'Image00001' or return ''
+       """
+       imgXXX = None
+       # print("file", file)
+       with open(file) as jsonfile:
+               data = json.load(jsonfile)
+               if len(data) > 1:
+                       print("more than one image in same json")
+               # print("data")
+               # pprint(data)
+               for imgXXX in data: pass  # get the value of key ~= "Image00001", cause it's dynamic
+       return imgXXX
+
+
 def minmax(file):
        r = getxy(file)
        if r is not None:
@@ -285,7 +323,7 @@ def readpng(inputfile):# just a specific func to preview a "shape = (X,Y,3)" ima
                for i, row in enumerate(tab):
                        print(row[0]*65536 + row[0]*256 + row[0], end=" " if i % image.shape[0] != 0 else "\n")
 
-def topng(inputfile, outfile=None, overwrite=True, verbose=False, epimask='', endomask='', centercrop=None, blackmask=False, square=False, redcontour=False):
+def topng(inputfile, outfile=None, overwrite=True, verbose=False, epimask='', endomask='', centercrop=None, blackmask=False, square=False, redcontour=False, epiminpixels=-1):
        """
                (verbose) return (64, 64) : the width and height
                (not verbose) return (img, dicimg) : the image and the dicimg objects
@@ -348,9 +386,18 @@ def topng(inputfile, outfile=None, overwrite=True, verbose=False, epimask='', en
                                if endomask:
                                        img = hollowmask(img, epimask, endomask)
                                else:
+                                       # ignore small epicardic --<<
+                                       xmin, ymin, xmax, ymax = minmax(epimask)
+                                       pixels = (xmax - xmin) * (ymax - ymin)
+                                       if pixels <= epiminpixels:
+                                               print( "small epicardic ({}), ignored!".format(inputfile.split('/')[-1]) )
+                                               return
+                                       # ignore small epicardic -->>
+
                                        img = mask(img, epimask)
 
                if centercrop:
+
                        img = crop(img, epimask, centercrop)
 
 
@@ -376,6 +423,7 @@ def topng(inputfile, outfile=None, overwrite=True, verbose=False, epimask='', en
        # np.savetxt(savepath + '.npy', img)
        # test >>
 
+
        if np.count_nonzero(img) > 0: # matrix not full of zero
                cv2.imwrite(savepath, img, [cv2.IMWRITE_PNG_COMPRESSION, 0]) # write png image
 
index 1846c1d10a7f5764450d425288f18162fabb12a5..98d9aa5815a7f483fa5e370b68dcdb7a660cced9 100644 (file)
@@ -3,9 +3,9 @@ from os.path import join, splitext
 from shutil import move as mv, copyfile as cp
 import pathlib
 
-def move(indir, outdir, n, distinction_word='', copy=True):# move n ordered files from indir to outdir
+def move(indir, outdir, start=None, end=None, distinction_word='', copy=True):# move start ordered files from indir to outdir
        l = sorted(ls(indir))
-       for filename in l[:n]:
+       for filename in l[start:end]:
                # print(join(indir, filename), join(outdir, filename))
                pathlib.Path(outdir).mkdir(parents=True, exist_ok=True)
                fname, fextension = splitext(filename)
@@ -14,7 +14,10 @@ def move(indir, outdir, n, distinction_word='', copy=True):# move n ordered file
 
 if __name__ == '__main__':
        
-       move('./generated/90/infarctus/crop-nomask', './sample/train/infarctus', 400, distinction_word="-crop-nomask") # move 400 ordered files from param 1 to param 2
-       move('./generated/90/noinfarctus/crop-nomask', './sample/train/noinfarctus', 400, distinction_word="-crop-nomask")
-       move('./generated/90/infarctus/crop-nomask', './sample/valid/infarctus', 100, distinction_word="-crop-nomask")
-       move('./generated/90/noinfarctus/crop-nomask', './sample/valid/noinfarctus', 100, distinction_word="-crop-nomask")
\ No newline at end of file
+       move('./generated/updated/infarctus/crop-mask', './sample/train/infarctus', 0, 800, distinction_word="-crop-mask") # move [0 -> 600] ordered files from param 1 to param 2
+       move('./generated/updated/infarctus/crop-mask', './sample/valid/infarctus', 800, 1100, distinction_word="-crop-mask")
+       move('./generated/updated/infarctus/crop-mask', './sample/test/infarctus', 1100, 1200, distinction_word="-crop-mask")
+       
+       move('./generated/updated/noinfarctus/crop-mask', './sample/train/noinfarctus', 0, 100, distinction_word="-crop-mask")
+       move('./generated/updated/noinfarctus/crop-mask', './sample/valid/noinfarctus', 100, 160, distinction_word="-crop-mask")
+       move('./generated/updated/noinfarctus/crop-mask', './sample/test/noinfarctus', 160, 200, distinction_word="-crop-mask")
index b901b85bb7ea34c22bf7730eb83f58f8327e717d..374eb84d102e06bf0b93bb207686799a6f1d1f59 100644 (file)
@@ -1,20 +1,46 @@
 from os import listdir as ls
 import png
 import pydicom
-from os.path import join
+from os.path import join, dirname
 
 # locals
-from topng import topng, mask, CROP_SIZE
-from regularjson import search, RT_PATH, JSON_GTS, INFA_STR, EPI_STR, ENDO_STR
+from topng import topng, getimgname, mask, CROP_SIZE, EPI_MIN_PIXELS
+from regularjson import search, RT_PATH, INFA_STR, EPI_STR, ENDO_STR
 
 # constants
 GLOB_DIR = '../../Data/Images_anonymous/'
-OUT_DIR = './generated/90/'
+OUT_DIR = './generated/updated/'
 INDICE_CASE = 'Case'
+PREFIX = '0_' # => 0_Case0002
+
+BLACK_LIST_CASES = [
+       'Case_0258', 'Case_0259',
+       'Case_0265', 'Case_0266', 'Case_0300', 'Case_0305',
+       'Case_0311', 'Case_0316',
+       'Case_0320', 'Case_0322', 'Case_0325', 'Case_0326', 'Case_0327',
+       'Case_0328', 'Case_0329', 'Case_0337', 'Case_0338', 'Case_0345',
+       'Case_0346', 'Case_0348', 'Case_0359', 'Case_0360', 'Case_0361',
+       'Case_0362', 'Case_0363', 'Case_0364', 'Case_0365', 'Case_0366',
+       'Case_0367', 'Case_0381', 'Case_0385', 'Case_0400', 'Case_0401', 'Case_0415', 'Case_0416',
+       'Case_0421','Case_0423', 'Case_0429', 'Case_0442', 'Case_0444', 'Case_0474',
+]
+
+BLACK_LIST_IMAGES = ['Case_0229-Image00002', 'Case_0229-Image00004', 'Case_0229-Image00006', 'Case_0229-Image00007',
+       'Case_0243-Image00003.png', 'Case_0243-Image00004', 'Case_0243-Image00005', 'Case_0265-Image00001', 'Case_0262-Image00007',
+       'Case_0262-Image00008', 'Case_0264-Image00006', 'Case_0275-Image00006',
+       'Case_0307-Image00006', 'Case_0314-Image00001', 'Case_0314-Image00002',
+       'Case_0314-Image00008', 'Case_0315-Image00005', 'Case_0321-Image00007',
+       'Case_0321-Image00008', 'Case_0328-Image00002',
+       'Case_0331-I7000000',
+       'Case_0356-Image00007', 'Case_0356-Image00008', 'Case_0356-Image00009', 'Case_0356-Image00009',
+       'Case_0358-Image00008', 'Case_0358-Image00009',
+       'Case_0377-Image00009', 
+]
 
 START = None # to manage the number of Patient Case to use in training + validation, if START == None => 0, if END == None => last index, it will use all in GLOB_DIR
-END = None
-
+END = None # like Case_420, to generate just a part of the dataset
+END_INF_CASES = 309 # to manage correct case with infarctus
+END_NOINF_CASES = None # to manage correct case with noinfarctus
 
 def get(l, i, r):
        if len(l) <= 1:
@@ -23,134 +49,191 @@ def get(l, i, r):
 if __name__ == '__main__':
        l = sorted(ls(GLOB_DIR))
 
+       # print("log", l)
+       # exit()
+
        # Initiliaze 
        wmin = hmin = None # None is important here, confert the 'minimum' algo
        wmax = hmax = w = h = 0
 
-       for cas in l[START:END]:# cas like 'Case0002'
+       for j, cas in enumerate(l[START:END]):# cas like 'Case0002'
                caspath = join(GLOB_DIR, cas)
 
-               if not INDICE_CASE in cas:# if the directory name doesn't sound familiar
+               if not INDICE_CASE in cas: # if the directory name doesn't sound familiar
+                       continue
+
+               if cas in BLACK_LIST_CASES: # if the directory was black listed
                        continue
 
                l1 = sorted( ls( caspath ) )# just ls one CaseXXXX and sort the result
                # $$NOTRUSTREF here we need to sort because there is no trusted ref or id
 
-               r = search(RT_PATH, cas)
+               # print('RT_PATH', RT_PATH)
+               # print('PREFIX + cas', PREFIX + cas)
+               r = search(RT_PATH, PREFIX + cas)
+               # print('r', r)
 
                print(cas, end=' ', flush=True) # log CaseXXXX
 
                if not r: # if the feature doesn't yet labeled by an expert go to next
                        continue
-               r = search(r['path'], '.') # to be more dynamic, here can just be '.' instead of '1.2.3.4.5.6'
+
+               # ------<< Searching for .json files
+               r = search(r['path'], 'contours') # contours/1.2.3.4.5.6
+               if not r:
+                       continue
+               r = search(r['path'], '1.2.3.4.5.6') # to be more dynamic, here can just be '.' instead of '1.2.3.4.5.6'
+               # ------>>
 
                if r:
                        r = r['path']
+                       # print('ls(r)', ls(r))
                        try:
                                l2 = sorted( ls(r) ) # $$NOTRUSTREF
                        except NotADirectoryError as e:
                                print("WARN", "a file in unexcepted place")
                                continue
 
-                       if 0 < len(l2) < len(l1):
+                       # IF THIS KIND OF ERROR OCCURS, CHANGE ON DISK TO GET IT CONFORMED
+                       if 1 == len(l2) < len(l1): # l2 == ["37"] and l1 == ["image001", "image002"..], may be "37" contains searched dirs, so enter..
                                r = join(r, l2[0])
                                l2 = sorted( ls(r) ) # $$NOTRUSTREF
                                # Try once : check subdirectory if i'am not the right
 
-                       if 0 < len(l2) < len(l1):
-                               # TODO: log, json doesn't match with images (labels != features)
-                               print("WARN", "json doesn't match with images (labels != features), Case", cas)
-                               continue
-                               pass
-
-                       for i, dic in enumerate(l1):
-                               # print('join', r, l2[i])
-                               ref = join(r, l2[i]) # logically, should be the json ref's "parent directory" of i dicom image
-
-                               infarctus = search(ref, INFA_STR)
-                               epimask = search(ref, EPI_STR)
-                               endomask = search(ref, ENDO_STR)
-                               # print("ref left:", l1[i]) # Testing..
-                               # print("ref right:", ref) # Testing..
-                               # print("infarctus:", infarctus) # Testing..
-                               # topng(join(caspath, dic), '%/%-%' % (join(OUT_DIR, 'infarctus'), cas, dic)
-                               # print('epimask', epimask)
-
-                               if epimask:# this condition could be if necessary
-                                       # w, h = topng(join(caspath, dic), '{}/{}-{}'.format(join(OUT_DIR, 'infarctus' if infarctus else 'noinfarctus'), cas, dic), epimask=epimask['path'] if epimask else None)
-                                       # img_, dicimg_, minmax_ = topng(join(caspath, dic),
-                                       #       '{}/{}-{}'.format(join(OUT_DIR, 'infarctus' if infarctus else 'noinfarctus'), cas, dic),
-                                       #       epimask=epimask['path'] if epimask else None,
-                                       #       verbose=True,
-                                       # )
-
-                                       # Possibly data augmentation purpose here
-                                       w, h = topng(
-                                               join(caspath, dic),
-                                               outfile='{}/crop-mask/{}-{}'.format(join(OUT_DIR,
-                                                       'infarctus' if infarctus else 'noinfarctus'),
-                                                       cas,
-                                                       dic,
-                                               ),
-                                               epimask=epimask['path'] if epimask else None,
-                                               centercrop=CROP_SIZE,
-                                               blackmask=True,
-                                       ) # crop and mask with black
-
-                                       if endomask:
-                                               w, h = topng(
+                       # if 0 < len(l2) < len(l1):
+                       #       # TODO: log, json doesn't match with images (labels != features)
+                       #       print("WARN", "json doesn't match with images (labels != features), Case", cas)
+                       #       continue
+                       #       pass
+
+                       for i, dic in enumerate(l1): # l1 => ["image001", "image002"], l2 => ["37", "42"]
+                               if True:
+                                       if "{}-{}".format(cas, dic) in BLACK_LIST_IMAGES: # if image was black listed
+                                               continue
+
+                                       epimask = ''
+                                       infarctus = ''
+                                       endomask = ''
+                                       # debug <<
+                                       # infarctus = True
+                                       # debug >>
+                                       # search the right json, for that, we open the json
+                                       for elt in l2:
+                                               # print('join', r, l2[i])
+                                               ref = join(r, elt) # logically, should be the json ref's "parent directory" of i dicom image
+
+                                               t_epimask = search(ref, EPI_STR)
+
+                                               parent = dirname(ref) # get the parent dir
+
+                                               infarctus = search(parent, INFA_STR)
+                                               endomask = search(parent, ENDO_STR)
+
+                                               if t_epimask and t_epimask.get("path"):
+                                                       timgname = getimgname(t_epimask["path"])
+
+                                                       if timgname == dic:
+                                                               epimask = t_epimask
+                                                               break
+                                               else:
+                                                       print('no epicardic')
+
+
+                                       # print("ref left:", l1[i]) # Testing..
+                                       # print("ref right:", ref) # Testing..
+                                       # print("infarctus:", infarctus) # Testing..
+                                       # topng(join(caspath, dic), '%/%-%' % (join(OUT_DIR, 'infarctus'), cas, dic)
+                                       # print('epimask', epimask)
+
+                                       # debug <<
+                                       # epimask = False
+                                       # debug >>
+
+                                       if epimask:# this condition could be if necessary
+                                               if infarctus and (END_INF_CASES is not None) and j > END_INF_CASES:
+                                                       continue
+                                               if not infarctus and (END_NOINF_CASES is not None) and j > END_NOINF_CASES:
+                                                       continue
+                                               # topng(join(caspath, dic), '{}/{}-{}'.format(join(OUT_DIR, 'infarctus' if infarctus else 'noinfarctus'), cas, dic), epimask=epimask['path'] if epimask else None)
+                                               # img_, dicimg_, minmax_ = topng(join(caspath, dic),
+                                               #       '{}/{}-{}'.format(join(OUT_DIR, 'infarctus' if infarctus else 'noinfarctus'), cas, dic),
+                                               #       epimask=epimask['path'] if epimask else None,
+                                               #       verbose=True,
+                                               # )
+
+                                               # Possibly data augmentation purpose here
+                                               print("EPI_MIN_PIXELS", EPI_MIN_PIXELS)
+                                               topng(
                                                        join(caspath, dic),
-                                                       outfile='{}/crop-mask-hollow/{}-{}'.format(join(OUT_DIR,
+                                                       outfile='{}/crop-mask/{}-{}'.format(join(OUT_DIR,
                                                                'infarctus' if infarctus else 'noinfarctus'),
                                                                cas,
                                                                dic,
                                                        ),
                                                        epimask=epimask['path'] if epimask else None,
-                                                       endomask=endomask['path'] if endomask else None,
                                                        centercrop=CROP_SIZE,
                                                        blackmask=True,
-                                               ) # crop and (mask and fill hollow) with black
-
-                                       w, h = topng(
-                                               join(caspath, dic),
-                                               outfile='{}/crop-nomask/{}-{}'.format(join(OUT_DIR,
-                                                       'infarctus' if infarctus else 'noinfarctus'),
-                                                       cas,
-                                                       dic,
-                                               ),
-                                               epimask=epimask['path'] if epimask else None,
-                                               centercrop=CROP_SIZE,
-                                       ) # just crop, don't apply black mask
-
-                                       # w, h = topng(
-                                       #       join(caspath, dic),
-                                       #       outfile='{}/contour/{}-{}'.format(join(OUT_DIR,
-                                       #               'infarctus' if infarctus else 'noinfarctus'),
-                                       #               cas,
-                                       #               dic,
-                                       #       ),
-                                       #       epimask=epimask['path'] if epimask else None,
-                                       #       redcontour=True,
-                                       # ) # draw a red contour for visibily purpose
-
-                                       # segmentation width & height <<
-                                       # xmin, ymin, xmax, ymax = minmax_
-                                       # w = xmax - xmin + 1 # +1 : even the position takes a bit
-                                       # h = ymax - ymin + 1
-                                       # segmentation width & height >>
-
-
-                                       # # search maximums
-                                       # if wmax < w: wmax = w 
-                                       # if hmax < h: hmax = h
-
-                                       # # search width minimum
-                                       # if wmin is None: wmin = w
-                                       # elif wmin > w: wmin = w
-                                       
-                                       # # search height minimum
-                                       # if hmin is None: hmin = h
-                                       # elif hmin > h: hmin = h
+                                                       epiminpixels=EPI_MIN_PIXELS
+                                               ) # crop and mask with black
+
+                                               # if endomask:
+                                               # topng(
+                                               #               join(caspath, dic),
+                                               #               outfile='{}/crop-mask-hollow/{}-{}'.format(join(OUT_DIR,
+                                               #                       'infarctus' if infarctus else 'noinfarctus'),
+                                               #                       cas,
+                                               #                       dic,
+                                               #               ),
+                                               #               epimask=epimask['path'] if epimask else None,
+                                               #               endomask=endomask['path'] if endomask else None,
+                                               #               centercrop=CROP_SIZE,
+                                               #               blackmask=True,
+                                               #       ) # crop and (mask and fill hollow) with black
+
+                                               # topng(
+                                               #       join(caspath, dic),
+                                               #       outfile='{}/crop-nomask/{}-{}'.format(join(OUT_DIR,
+                                               #               'infarctus' if infarctus else 'noinfarctus'),
+                                               #               cas,
+                                               #               dic,
+                                               #       ),
+                                               #       epimask=epimask['path'] if epimask else None,
+                                               #       centercrop=CROP_SIZE,
+                                               # ) # just crop, don't apply black mask
+
+                                               # w, h = BE CAREFULL, be sure w, h is needed, and that topng returns something
+                                               # topng(
+                                               #       join(caspath, dic),
+                                               #       outfile='{}/contour/{}-{}'.format(join(OUT_DIR,
+                                               #               'infarctus' if infarctus else 'noinfarctus'),
+                                               #               cas,
+                                               #               dic,
+                                               #       ),
+                                               #       epimask=epimask['path'] if epimask else None,
+                                               #       redcontour=True,
+                                               # ) # draw a red contour for visibily purpose
+
+                                               # segmentation width & height <<
+                                               # xmin, ymin, xmax, ymax = minmax_
+                                               # w = xmax - xmin + 1 # +1 : even the position takes a bit
+                                               # h = ymax - ymin + 1
+                                               # segmentation width & height >>
+
+
+                                               # # search maximums
+                                               # if wmax < w: wmax = w 
+                                               # if hmax < h: hmax = h
+
+                                               # # search width minimum
+                                               # if wmin is None: wmin = w
+                                               # elif wmin > w: wmin = w
+                                               
+                                               # # search height minimum
+                                               # if hmin is None: hmin = h
+                                               # elif hmin > h: hmin = h
+                               # except Exception as e:
+                               #       print("WARN", "something went wrong with this image", dic, str(e))
+                               #       continue
 
 
        # print('min-width, max-width:', (wmin, wmax))