ABONAMENTE VIDEO REDACȚIA
RO
EN
NOU
Numărul 148
Numărul 147 Numărul 146 Numărul 145 Numărul 144 Numărul 143 Numărul 142 Numărul 141 Numărul 140 Numărul 139 Numărul 138 Numărul 137 Numărul 136 Numărul 135 Numărul 134 Numărul 133 Numărul 132 Numărul 131 Numărul 130 Numărul 129 Numărul 128 Numărul 127 Numărul 126 Numărul 125 Numărul 124 Numărul 123 Numărul 122 Numărul 121 Numărul 120 Numărul 119 Numărul 118 Numărul 117 Numărul 116 Numărul 115 Numărul 114 Numărul 113 Numărul 112 Numărul 111 Numărul 110 Numărul 109 Numărul 108 Numărul 107 Numărul 106 Numărul 105 Numărul 104 Numărul 103 Numărul 102 Numărul 101 Numărul 100 Numărul 99 Numărul 98 Numărul 97 Numărul 96 Numărul 95 Numărul 94 Numărul 93 Numărul 92 Numărul 91 Numărul 90 Numărul 89 Numărul 88 Numărul 87 Numărul 86 Numărul 85 Numărul 84 Numărul 83 Numărul 82 Numărul 81 Numărul 80 Numărul 79 Numărul 78 Numărul 77 Numărul 76 Numărul 75 Numărul 74 Numărul 73 Numărul 72 Numărul 71 Numărul 70 Numărul 69 Numărul 68 Numărul 67 Numărul 66 Numărul 65 Numărul 64 Numărul 63 Numărul 62 Numărul 61 Numărul 60 Numărul 59 Numărul 58 Numărul 57 Numărul 56 Numărul 55 Numărul 54 Numărul 53 Numărul 52 Numărul 51 Numărul 50 Numărul 49 Numărul 48 Numărul 47 Numărul 46 Numărul 45 Numărul 44 Numărul 43 Numărul 42 Numărul 41 Numărul 40 Numărul 39 Numărul 38 Numărul 37 Numărul 36 Numărul 35 Numărul 34 Numărul 33 Numărul 32 Numărul 31 Numărul 30 Numărul 29 Numărul 28 Numărul 27 Numărul 26 Numărul 25 Numărul 24 Numărul 23 Numărul 22 Numărul 21 Numărul 20 Numărul 19 Numărul 18 Numărul 17 Numărul 16 Numărul 15 Numărul 14 Numărul 13 Numărul 12 Numărul 11 Numărul 10 Numărul 9 Numărul 8 Numărul 7 Numărul 6 Numărul 5 Numărul 4 Numărul 3 Numărul 2 Numărul 1
×
▼ LISTĂ EDIȚII ▼
Numărul 99
Abonament PDF

Segmentarea automată în imagistică medicală

Ioana Negruț
Medical A.I. Technical Lead @ NTT DATA Romania



Andreea Sandu
Machine Learning Engineer @ NTT DATA Romania



PROGRAMARE


Echipa AI din Cluj din cadrul companiei noastre colaborează îndeaproape cu personalul medical al unor spitale de top din toată lumea, cu scopul îmbunătățirii procesului de diagnosticare, atât în ceea ce privește timpul necesar diagnosticării cât și acuratețea acesteia.

Fascinați de misterul ce învăluie performanțele imbatabile ale rețelelor neuronale, efortul specialiștilor s-a concentrat, multă vreme, înspre optimizarea acestora și consacrarea unor arhitecturi creative. Odată cu transferul și adaptarea inteligenței artificiale la domeniul imagisticii medicale, contribuția acesteia a devenit incontestabilă, stimulând dezvoltarea de rețele noi, specifice nevoilor radiologilor... până de curând, când puterea datelor pare să iasă la iveală.

Segmentarea este un concept des întâlnit în procesarea de imagini și se referă la gruparea pixelilor, în funcție de anumite caracteristici, în clustere omogene în interior și eterogene între ele. De-a lungul timpului, modul în care fiecare pixel se distribuie în grupuri a evoluat, de la condiții pe baza unor praguri, la histograme de valori sau algoritmi de clustering și până la celebrele rețele neuronale care au acaparat atenția în ultimii ani.

Segmentarea automată a deschis noi orizonturi în ceea ce privește procesarea de imagini, în special în situațiile în care se dorește o analiză mai profundă a datelor, atunci când un algoritm de detecție nu este suficient. Domeniul imagisticii medicale este un exemplu în care precizia algoritmilor de inteligență artificială este esențială, unde pentru un diagnostic corect, contribuția fiecărui pixel poate fi decisivă. Această necesitate este unul dintre motivele pentru care efortul multor cercetători se concentrează în direcția dezvoltării algoritmilor specifici domeniului medical.

Odată ce contribuția inteligenței artificiale în domeniul imagisticii medicale a devenit clară, resursele nu au încetat să apară. Astfel avem în prezent baze de date publice adnotate, cuprinzătoare, precum Cancer Imaging Archive, NIH sau Luna16 la un click distanță. Este uzual ca aceste date să constituie baza progresului științific în domeniul radiologiei, iar până de curând, fascinați de misterul ce învăluie rețelele neuronale, efortul s-a concentrat preponderent înspre optimizarea acestora. O mai puțină atenție s-a acordat datelor.

Datele medicale

Ca regulă de bază, studiile de caz din domeniul radiologiei pot avea ca scop final detecția de leziuni, segmentarea leziunilor, diagnosticarea unor organe sau leziuni sau monitorizarea evoluției unor boli. Imposibilitatea unui singur sistem de a acoperi tot spectrul larg de anomalii ce pot afecta un pacient a dus la specializarea algoritmilor, fie la nivel de organ și anume identificarea și clasificarea mai multor leziuni ale organului vizat sau chiar mai specific la nivel de anomalie și anume detecția sau segmentarea unei anumite leziuni la nivelul organului.

Datele publice disponibile mimează obiectivele, astfel un sistem de segmentare al organelor din cutia toracică (plămâni, inimă, aortă) nu va ține cont de starea de sănătate a organelor, ci doar de prezența lor. Paradoxal, deși cu intenția de a folosi rezultatele în studiul leziunilor, sistemele automate de segmentare a organelor performează cel mai bine pe organele sănătoase. Segmentarea este nesatisfăcătoare în cazul leziunilor periferice (noduli periferici), a celor care ies din conturul normal al organului, deformându-l în exterior (chisturi mari), precum și în cazul plămânilor cu fibroză sau apă la plămâni.

Controlarea mediului prin alegerea datelor poate fi de succes în laborator, prezentând metrici aproape de perfecțiune, însă atunci când vorbim despre integrarea unui algoritm în producție, tot controlul se prăbușește în dezamăgirea unor rezultate mult sub așteptări.

La (Johannes Hofmanninger, 2020) - s-a publicat un studiu menit să atenționeze asupra impactului biasului din date. Comparând performanța mai multor arhitecturi de rețele neuronale, inclusiv vanilla U-net, pe seturi de date diferite, s- a evidențiat importanța diversității datelor. Pentru o putere predictivă relevantă, este imperios necesar ca la antrenare, inputul să fie cât mai eterogen, iar eșantionarea să se facă ținând cont de leziunile diverse care pot să apară, chiar și dacă aceasta însemnă o abatere de la obiectivul cercetării. Această abordare a rezultat într-un rezultat superior sau cel puțin la fel de bun al arhitecturii vanilla U-net, comparativ cu alte arhitecturi mai complexe, subliniind contribuția datelor pentru a o atinge.

Arhitectura U-Net

U-Net este o rețea neuronală proiectată originar pentru a fi folosită la segmentarea celulelor, dar preluată apoi și în alte domenii, dovedind o performanță a algoritmilor precedenți. De la publicarea ei (Olaf Ronneberger, 2015), arhitectura vanilla a suferit multiple mutații, toate cu scopul sporirii performanțelor. Astfel avem astăzi o diversitate de rețele neuronale pentru segmentarea de obiecte, precum: Res-Unet, W-net, V-net, HPU-net, RA-Unet și probabil, multe altele de care nu am aflat încă, care se bat pe 2-5 procente suplimentare la metrici.

Pentru a înțelege structura rețelei U-Net este necesar să definim datele de intrare (eng. input) și datele de ieșire (eng. output). Așa cum am explicat mai sus, segmentarea presupune selectarea pixelilor care formează regiunea sau obiectul de interes. Acest lucru este reprezentat printr-o mască, o imagine binară, unde pixelii albi descriu obiectul căutat, iar pixelii negrii fundalul. Această imagine este de fapt outputul unei rețele de segmentare. Iar ca input, avem tot o imagine, care conține sau nu obiectul/regiunea de interes.

Arhitectura unei rețele de tip U-Net este formată din două structuri cu roluri diferite care îi dau forma caracteristică de "U".

Figura 1 U-Net architecture (original image source)

Partea din stânga este asemănătoare cu o rețea convolutivă tradițională în care multiple straturi de convoluție și max pooling extrag caracteristici (eng. features) din imaginea de input. În același timp, dimensiunea caracteristicilor se reduce după fiecare bloc de straturi convolutive datorită operației de max pooling. În literatură această structură se numește encoder, ceea ce înseamnă că rolul ei este de a extrage doar acele informații esențiale pentru imaginea de input. A doua parte a rețelei U-Net se numește, așa cum probabil ați intuit, decoder, deoarece are rolul de a decoda acele informații învățate de encoder și de a le transforma într-o mască de segmentare. Și aici se folosesc blocuri de straturi convolutive, însă în loc de a micșora succesiv caracteristicile, acestea sunt mărite. Acest lucru se poate realiza cel mai simplu prin interpolare liniară, operație care la fel ca cea de max pooling nu conține parametri pe care rețeaua trebuie să îi învețe.

Getting your hands dirty

În continuare, vom exemplifica procesul de segmentare în domeniul medical folosind arhitectura U-Net. Codul utilizat poate fi găsit pe Github fiind implementat în Python 3.

Pentru acest exemplu vom folosi setul de date (CBIS-DDSM, 2020) disponibil în Cancer Imaging Archive. Acesta conține mamografii și măști binare cu tumorile segmentate de radiologi. Luăm în considerare 1566 de pacienți, care pot avea una sau mai multe tumori. Acestea sunt de două tipuri: calcifieri (eng. calcification) și mase (eng. mass).

Figura 2 Mamografii ale aceluiași sân din două unghiuri diferite: Cranial - caudal (stânga), Mediolateral-oblig (dreapta)

Pre-procesarea datelor

Primul și poate cel mai important pas în dezvoltarea unui algoritm de inteligență artificială este pre-procesarea datelor de intrare. Mamografiile și măștile sunt disponibile în format DICOM, la o rezoluție de peste 3000 pixeli. Suplimentar, avem la dispoziție și alte informații: ID-ul pacientului, tipul de vedere al imaginii, pe ce sân este prezentă tumoarea, ID-ul tumorii, patologia (benign sau malign) sau căile relative către mamografii și măști. Tipul de vedere reprezintă unghiul din care a fost făcută mamografia: cranial-caudal (CC) sau mediolateral-oblig (MLO). Setul de date este împărțit în patru fișiere de tip .csv după destinația datelor (antrenare și testare), respectiv tipul tumorii (mase sau calcifieri). Pentru o mai ușoară organizare și manipulare a datelor, acestea au fost concatenate într-unul singur. Toți acești pași pot fi refăcuți cu ajutorul Jupyter notebookului data_analysis/data_analysis.ipynb.

Cea mai simplă metodă prin care imaginile medicale pot fi folosite pentru antrenarea unui rețele neuronale este convertirea lor din array uni-dimensional în imagini JPG, PNG, BMP etc. Pentru acest lucru folosim comanda dcmj2pnm din DICOM Toolkit (DCMTK), o colecție de librării specializată pentru procesarea fișierelor DICOM. Fiecare mamografie și mască sunt convertite în imagini JPG în Jupyter notebook-ul data_analysis/create_jpgs.ipynb. După convertirea tuturor fișierelor .dcm se creează două fișiere .csv conținând căile către imaginile, respective măștile în format .jpg și tipul tumorii. În continuare, maștile și imaginile sunt folosite pentru a decupa doar regiunile care conțin o tumoare. Pe scurt, algoritmul de decupare este următorul:

  1. Se calculează coordonatele dreptunghiului care încadrează tumora, folosind masca de segmentare.

  2. Se găsește centrul acestui dreptunghi.

  3. Se găsește în ce partea a imaginii este sânul. Astfel: se calculează media intensităților pixelilor pentru două fâșii verticale, din fiecare parte a imaginii. Fâșia cu valoarea cea mai mare este pe partea unde și sânul este prezent, adică stânga sau dreapta. (M Tiberiu, 2018).

  4. Dacă imaginea decupată este mai mică decât dimensiunea necesară, atunci restul de pixeli se completează cu o valoare constantă.

  5. Se salvează noile imagini și măști în două foldere separate.

Figura 3 Exemplu de imagine și mască decupată

Din cauza restricțiilor de memorie și procesare s-a ales decuparea imaginilor și măștilor la dimensiunea de 1024x1024 pixeli, însă ar fi preferabilă utilizarea mamografiilor la dimensiunea lor originală. Decuparea și redimensionarea duce la pierderi de informații și introducerea de artefacte nedorite.

Condiția ce stă la baza folosirii unui algoritm de predicție e împărțirea datelor în trei subseturi inegale de: antrenare, validare și testare. Majoritatea datelor vor fi folosite pentru a antrena rețeaua neuronală, adică pentru actualizarea parametrilor. Setul de validare este și el folosit în timpul procesului de antrenare, însă numai pentru a evalua capacitatea de predicție a modelului după fiecare epocă, capturând puterea de generalizare în metricile calculate. Datele de test sunt acelea ținute sub lacăt, pe care modelul nu le-a văzut niciodată și care dau performanța lui finală. Este imperios să ne asigurăm că fiecare observație aparține unui singur subset, că nu există data leakage și că rezultatele raportate sunt reale.

Acest pas de împărțire a datelor se realizează în prima parte a jupyter notebook-ului train.ipynb. Proporțiile pentru cele trei subseturi din întreg setul de date sunt: antrenare - 80%, validare - 10%, testare - 10%. În final, vom avea două fișiere .csv, unul pentru imagini și unul pentru măști, cu o coloană, subset, indicând subsetul căruia îi aparține imaginea respectivă.

Antrenare U-Net

Următorul pas este construirea unei rețele U-Net și antrenarea acesteia. Fișierul python UNetModel.py conține clasa UNetModel ce definește arhitectura U-Net. Ea este diferită de cea prezentată în articolul inițial. Astfel: numărul de filtre pentru fiecare bloc de straturi convolutive este mai mic, având posibilitatea de a-l modifica; se pot folosi straturi de BatchNormalization (Sergey Ioffe, 2015) între cele convolutive. Cu ajutorul pachetului Keras antrenarea rețelei neuronale și monitorizarea evoluției metricilor folosind obiecte de tip Callback este facilă. Cele mai utilizate callbackuri sunt: ModelCheckpoint, care salvează parametrii modelului la o anumită perioadă de timp, și CSVLogger, care la fiecare epocă salvează anumite metrici de evaluare și costul/piererea (eng. loss), atât pe setul de antrenare, cât și cel de validare. ModelCheckpoint este util în eventualitatea întreruperii antrenării sau pentru a compara modele la epoci diferite. CSVLogger permite vizualizarea procesului de antrenare, în timp real, reprezentând grafic curbele de învățare. Jupyter notebook-ul history_stats.ipynb implementează generarea acestui grafic.

În domeniul medical, ne lovim adesea de date insuficiente pentru ca un algoritm de inteligență artificială să învețe corect și eficient segmentarea unei tumori mamare și să fie de ajutor radiologilor. Metoda clasică de a rezolva (parțial) această problemă este prin augmentarea datelor la antrenare. În acest exemplu, augmentarea se realizează în timpul antrenării - on the fly, aplicând diverse transformări, care fie modifică intensitatea pixelilor (contrast, luminozitate etc. ), fie alterează geometria imaginii (rotație, translație etc.). În fișierul python generators.py este implementat acest proces. Tot aici este definită funcția care generează perechi de imagini și măști pentru antrenarea rețelei U-Net.

Funcția de cost - Dice Index

Un algoritm perfect ar fi capabil să identifice exact realitatea. Măsurarea diferenței dintre realitate și predicția algoritmului este surprinsă de funcția de cost. Desigur că funcția de cost este adaptată la tipul realității, sau al datelor de ieșire. Segmentarea presupune compararea suprapunerii contururilor: pe de-o parte a măștilor adnotate de radiologi (realitatea) și pe de altă parte, a măștilor prezise de algoritm (predicția). Coeficientul Dice stă la baza calculării costului în cazul segmentării. Acesta măsoară gradul de suprapunere dintre cele două măști, fiind calculat cu următoarea formulă.

,unde X,Y sunt seturi

Indicele Dice are un interval de valori posibile între [0, 1], unde 1 reprezintă o suprapunere perfectă, iar 0 înseamnă că cele două măști nu se suprapun deloc.

Optimizarea rețelei U-Net este implementată în fișierul custom_metrics.py și este definită astfel:

Evaluare

Procesul de evaluare este implementat în Jupyter notebook-ul evaluate.ipynb Pentru a măsura performanța modelului antrenat se folosește subsetul de test creat anterior. Pentru fiecare imagine de test, rețeaua U-Net prezice o hartă de probabilități: o matrice de dimensiunea imaginii de intrare, unde fiecare valoare reprezintă probabilitatea ca pixelul de la acea locație să fie o tumoră (vs. fundalul imaginii). Categorisirea fiecărui pixel în fundal (0) sau tumoră (255) se face pe baza unui prag de probabilitate setat apriori, rezultând într-o imagine binară, o mască cu zona albă corespunzând tumorii. Aceasta se compară cu masca reală, folosind Indicele Dice și valoarea se salvează într-un tabel. După ce modelul a fost testat pe întregul subset de evaluare, se calculează o medie a tuturor Indiciilor Dice, care indică capacitatea modelului de a segmenta tumori mamare.

Concluzie

Exemplul prezentat oferă doar un punct de pornire pentru cei care vor să învețe despre segmentare în general sau să folosească o rețea U-Net într-o aplicație mai complexă. Fiecare etapă descrisă poate fi îmbunătățită în vederea segmentării tumorilor mamare. Cu această ocazie invităm cititorii curioși să folosească codul, fie cu setul de mamografii disponibil sau cu orice alt fel de imagini adnotate cu măști de segmentare.

În timpul dezvoltării unui algoritm de inteligență artificială, toate etapele prezentate, preprocesare, antrenare și evaluare sunt într-o buclă continuă de ajustare. Fiecare etapă are pașii și parametrii ei, care depind de studiul de caz și pot influența foarte mult rezultatul final al modelului. Însă, după cum ne învață prima regulă din machine learning și practica de mai multe ori la rând, datele și procesarea acestora contează cel mai mult. Hofmanninger et al au demonstrat că diversitatea datelor nu poate fi suplinită prin arhitecturi sofisticate și complexe. Există metode prin care diversitatea poate fi simulată într-o oarecare măsură, însă este, poate cu atât mai dificil în domeniul medical să înlocuiască complet specificul atâtor tipuri de leziuni și boli din corpul uman.

Referințe

  1. CBIS-DDSM. (2020).

  2. Johannes Hofmanninger, F. P. (2020). Automatic lung segmentation in routine imaging is a data diversity problem, not a methodology problem. RSNA .

  3. M Tiberiu, A. C. (2018). Tool for computer assisted mammographic image processing and analysis. PN-III-P2-2.1-CI-2018-1362.

  4. Olaf Ronneberger, P. F. (2015). U-Net: Convolutional Networks for Biomedical Image Segmentation. miccai.

  5. Sergey Ioffe, C. S. (2015). Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift. arXiv.

  6. DCMTK - dcmj2pnm

Conferință TSM

NUMĂRUL 147 - Automotive

Sponsori

  • Accenture
  • BT Code Crafters
  • Accesa
  • Bosch
  • Betfair
  • MHP
  • BoatyardX
  • .msg systems
  • P3 group
  • Ing Hubs
  • Cognizant Softvision
  • Colors in projects

Ioana Negruț a mai scris