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:
- Verwijder dubbele slices. (Houd hoogste nummer)
- Verwijder onbruikbare metingen (<> 30 beelden, minder dan 7/8 bruikbare slices)
- Bepaal systole positie (beeldnummer)
- Bepaal van toepassing zijnde bovenste layer
- Van toepassing zijnde onderste layer
- Idem voor diastole positie
- Bepaal point of interest
- Verklein en schaal beelden
- Verzamel in tensor, 2ch, 4ch + 8 beelden
- Voeg metadata toe
- 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