maandag 18 januari 2016

MRI - 11 - Opnieuw plannen


Na een heleboel tijdverslindende andere activiteiten eindelijk weer tijd om hier weer eens wat aandacht aan te besteden. Bijna vergeten waarmee ik bezig was. Deep learning op basis van de metadata. Het werkelijk aanbieden van een eerste inzending lukt nog niet zo goed. Moet ik nogeens mee bezig. Ik wil nu met de plaatkes bezig. Ik maak snel een tweede , grove planning:

  1. Verwijder dubbele slices. (Houd hoogste nummer)
  2. Verwijder onbruikbare metingen (<> 30 beelden, minder dan 7/8 bruikbare slices)
  3. Bepaal systole positie (beeldnummer)
  4. Bepaal van toepassing zijnde bovenste layer
  5. Van toepassing zijnde onderste layer

  6. Idem voor diastole positie

  7. Bepaal point of interest

  8. Verklein en schaal beelden
  9. Verzamel in tensor, 2ch, 4ch + 8 beelden
  10. Voeg metadata toe
  11. Leer in convolutional DL
Stap 1 is mij nu, denk ik, gelukt; het verwijderen van de slices die op dezelfde locatie zijn gemaakt. Ik rename de eerder gemaakte slice-directories van 'sax_..' naar 'xxx_..'. Wil ze toch liever nog niet weggooien. 

Dit is de gebruikte code.  


'''
execfile('/Users/DWW/Documents/01 Rename double slices.py')
'''
#source = 'train'
source = 'validate'
print ' ...... preparing meta data for ' + source + ' for rename'
import os
import dicom
import numpy as np
import pandas as pd
import csv
#import random

RootDir = '/Users/DWW/data/' + source

def get_frames(root_path):
    """Get path to all the frame in view SAX and contain complete frames"""
    ret = []
    for root, _, files in os.walk(root_path):
        filesx = [x for x in files if x[-4:] == '.dcm']
        if len(filesx) == 0 or not filesx[0].endswith(".dcm") or root.find("sax") == -1:
            continue
        prefix = filesx[0].rsplit('-', 1)[0]
        fileset = set(filesx)
        expected = ["%s-%04d.dcm" % (prefix, i + 1) for i in range(30)]
        if all(x in fileset for x in expected):
            ret.append([root + "/" + x for x in expected])
    # sort for reproduciblity
    return sorted(ret, key = lambda x: x[0])

def get_struct(root_path):
    i = 0
    ret = []
    for file in get_frames(root_path):
        i += 1
        for f in file:
            study = f[f.find('/' + source + '/') + 2 + len(source):f.find('/study/')]
            slice = f[f.find('/study/') + 7:f.find('/IM-')]
            #print i, study, slice,'...', f
            ret.append([int(study)*1000+int(slice[4:]), study, slice, f])
    return sorted(ret, key = lambda x: x[0])


struct = np.array(get_struct(RootDir))

'''
' Rename per study the previous slices when they reappear in position
'
'''

pSlice = ''
pStudy = ''

Locations = []
Paths = []
Delete = []

for key, study, slice, path in struct:#[:20000]:
    if pStudy == study:
        if pSlice != slice:
            ds = dicom.read_file(path)
            curloc = int(100*ds.SliceLocation)
            try:
                i = Locations.index(curloc)
            #print 'i=',i
            except:
                i = -1
            if i >= 0: # location al eerder gevonden
                # vul Delete met slice folder en verwijder oud uit Locations en Path
                name = Paths[i]
                Delete += [name[0:name.find('IM-')-1]]
                
                
                print( name, path, Locations[i], curloc)
                del Locations[i]
                del Paths[i]
            Locations += [curloc]
            #print 'loc=',Locations
            Paths += [path]
        pSlice = slice
            
    else: #Nieuwe studie - Leegmaken Locations + Paths
        ds = dicom.read_file(path)
        curloc = int(100*ds.SliceLocation)
        Locations = [curloc]
        Paths = [path]

    pStudy = study
    pSlice = slice
for i in Delete:
    h= i[0:i.find('sax')] + 'xxx' + i[i.find('sax') +3:]
    os.rename(i,h)
    print i, h



Geen opmerkingen:

Een reactie posten