Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • Gabimet
  • Metodat e segmentimit të imazhit. Shfaqja e rezultatit me një imazh me ngjyra

Metodat e segmentimit të imazhit. Shfaqja e rezultatit me një imazh me ngjyra

Pragu është ndoshta metoda më e thjeshtë e segmentimit, e cila tërheq shumë vëmendjen e specialistëve. Metoda përqendrohet në përpunimin e imazheve, zona individuale homogjene të të cilave ndryshojnë në ndriçimin mesatar. Lloji më i thjeshtë dhe në të njëjtën kohë i përdorur shpesh i segmentimit është segmentimi binar, kur ekzistojnë vetëm dy lloje të seksioneve homogjene. Në këtë rast, shndërrimi i secilës pikë të imazhit burimor në imazhin dalës kryhet sipas rregullit:

(7.1)

ku është një parametër i vetëm përpunimi i quajtur pragu. Nivelet e ndriçimit të daljes dhe, mund të jenë arbitrare, ato kryejnë vetëm funksionet e etiketave, me ndihmën e të cilave shënohet harta që rezulton - duke caktuar pikat e saj në klasa ose, përkatësisht. Nëse përgatitja që rezulton përgatitet për perceptim vizual, atëherë shpesh vlerat e tyre korrespondojnë me nivelet e bardh e zi. Nëse ka më shumë se dy klasa, atëherë një familje e pragjeve duhet të specifikohet gjatë përcaktimit të pragut, duke ndarë shkëlqimet e klasave të ndryshme nga njëra-tjetra.

Çështja qendrore e segmentimit të pragut është përcaktimi i pragjeve, i cili duhet të kryhet automatikisht. Metodat e përdorura aktualisht për përcaktimin automatik të pragut janë përshkruar në detaje në rishikim. Shumëllojshmëria e metodave është shumë e madhe, por ato bazohen kryesisht në analizën e histogramit të imazhit origjinal.

Le të jetë histogrami i imazhit origjinal dixhital. Supozoni se diapazoni i shkëlqimit të tij është midis 0 (niveli i zi) dhe 255 (niveli i bardhë). Ideja fillestare e metodës së pragut të histogramit u bazua në supozimin se shpërndarjet e probabilitetit për secilën klasë janë unimodale (përmbajnë një kulm secila), dhe pikat kufitare që ndajnë seksionet e klasave të ndryshme në imazh janë të pakta. Këto supozime duhet të plotësohen nga histogrami, i cili ka karakter multimodal. Korrespondojnë modalitetet individuale klasa të ndryshme, dhe depresionet që i ndajnë - në rajonet kufitare, të vogla në numrin e pikave të përfshira në to. Në këtë rast, pragjet e segmentimit gjenden sipas pozicionit të lugëve. Oriz. 7.1 ilustron sa më sipër në lidhje me rastin e dy klasave. Në fakt, është jashtëzakonisht e rrallë të përdoren konsiderata kaq të thjeshta për të zgjedhur pragun. Fakti është se histogramet reale zakonisht janë të prera fort, gjë që ilustrohet nga rezultati i eksperimentit në Fig. 7.2. Kjo shërben si pengesa e parë për identifikimin e pikëve minimale. Pengesa e dytë është se kufijtë midis zonave homogjene në imazh janë të paqarta, si rezultat i së cilës rritet niveli i histogramit në ato pjesë të tij që shfaqin pikat e kufirit. Natyrisht, kjo çon në një ulje të zhytjeve në histogram ose edhe në zhdukjen e tyre.

Fig.7.1 Për zgjedhjen e pragut të segmentimit binar

Një nga mënyrat efektive për të kapërcyer këto vështirësi është përcaktimi i pragut bazuar në të ashtuquajturin kriter diskriminues. Konsideroni këtë qasje për dy klasa, që nga përgjithësimi në rastin më shumë klasa nuk është një problem thelbësor. Pra, ne konsiderojmë se shpërndarja , është ndërtuar për një imazh që përmban dy lloje zonash, dhe ka një kufi optimal, duke i ndarë ato në mënyrën më të mirë në një kuptim të caktuar. Për të përcaktuar pragun optimal, ne ndërtojmë një funksion diskriminues , argumenti i të cilit ka kuptimin e një pragu prove. Vlera e tij, e cila maksimizon funksionin, është pragu optimal. Merrni parasysh ndërtimin e një funksioni diskriminues.

Le të jetë një vlerë pragu hipotetike që e ndan shpërndarjen në dy klasa. Në këtë rast, zakonisht nuk luan një rol të madh se cilës nga klasat do t'i caktohen pikat e imazhit me shkëlqim, për shkak të numrit të vogël të pikave kufitare që ndajnë seksione të klasave të ndryshme. Probabiliteti që një pikë e kornizës e marrë në mënyrë të rastësishme t'i përkasë klasës është e barabartë me

(7.2)

Në mënyrë të ngjashme, probabiliteti i përkatësisë së tij në një klasë përcaktohet nga formula

(7.3)

për më tepër, për shkak të normalizimit të shpërndarjes së probabilitetit, kemi barazinë

Më tej, supozojmë se seksioni i shpërndarjes , i kufizuar nga pika , përshkruan pjesën e imazhit që i përket dhe seksionin , - në pronësi. Kjo na lejon të marrim parasysh dy shpërndarje dhe , që korrespondojnë me dhe , t'i ndërtojmë ato nga shpërndarja duke përdorur shprehjet:

Këtu, ndarja sipas probabiliteteve siguron normalizimin e shpërndarjeve të kushtëzuara të paraqitura.

Momentet mund të gjenden për shpërndarjet e probabilitetit të formuara në këtë mënyrë. Shprehjet për pritjet matematikore dhe kanë formën

(7.4)

ku - Pritshmëria e panormalizuar matematikore për, - pritjet matematikore për të gjithë kornizën.

Në mënyrë të ngjashme, varianca ditore e të gjithë kornizës jepet nga

(7.6)

Për të ndërtuar funksionin diskriminues, ne prezantojmë gjithashtu një parametër tjetër të energjisë, i quajtur dispersioni ndërklasor:

Funksioni diskriminues pa dimension përcaktohet nga shprehja

(7.8)

Siç u përmend më lart, pragu optimal konsiderohet se plotëson kërkesën

(7.9)

Le të shpjegojmë kuptimin e kriterit (7.9). Emëruesi në shprehjen (7.8) është varianca e të gjithë kornizës dhe, për rrjedhojë, nuk varet nga vlera e pragut të provës që e ndan imazhin në klasa. Prandaj, pika maksimale e shprehjes (7.8) përkon me pikën maksimale të numëruesit, d.m.th. përcaktohet nga natyra e varësisë së dispersionit ndërklasor (7.7) nga pragu . Ndërsa priret në zero, probabiliteti , siç vijon nga (7.2), tenton gjithashtu në zero. Meqenëse i gjithë imazhi i përket klasës, ka një trend. Rrjedhimisht, të dy termat në (7.7) bëhen zero. E njëjta gjë vërehet në vlerën tjetër ekstreme të pragut =255. Për shkak të mosnegativitetit të sasive të përfshira në (7.7) dhe (7.9) dhe barazisë së funksionit me zero në skajet e fushës së përkufizimit, brenda këtij domeni ka një maksimum, abshisa e së cilës merret. si prag optimal. Duhet të theksohet natyra cilësore e këtyre konsideratave. Studimet më të hollësishme tregojnë, për shembull, se kur përpunohen disa imazhe, funksioni diskriminues ka disa maksimum edhe nëse ka vetëm dy klasa në imazh. Kjo, në veçanti, manifestohet kur sipërfaqet totale të parcelave të zëna nga klasat janë dukshëm të ndryshme. Prandaj, detyra në rast i përgjithshëm disi e komplikuar nga nevoja për të përcaktuar maksimumin absolut të funksionit .

Nga pikëpamja llogaritëse, për të ekzekutuar algoritmin, është e nevojshme të gjendet pritshmëria dhe varianca matematikore për të gjithë imazhin. Më tej, për secilën vlerë, probabilitetet dhe përcaktohen duke përdorur (7.2) dhe (7.3) (ose kushtet e normalizimit), si dhe pritshmëritë matematikore të klasave dhe duke përdorur relacionet (7.4), (7.5). Vlerat e gjetura në këtë mënyrë bëjnë të mundur përcaktimin e vlerës së .

Sasia e llogaritjeve mund të reduktohet nëse kryejmë disa transformime të formulës (7.7) për variancën ndërklasore. Duke përdorur formulat (7.2)...(7.5), është e lehtë të merret raporti për pritjet matematikore:

(7.11)

Duke shprehur sasinë nga (7.10) dhe duke e zëvendësuar atë me (7.11), më në fund gjejmë:

(7.12)

Lidhja (7.12), e përdorur si punë, përfshin vetëm dy sasi - probabilitetin dhe pritshmërinë e panormalizuar matematikore, e cila redukton ndjeshëm sasinë e llogaritjeve në kërkimin automatik për pragun optimal.

Në fig. 7.2 tregon rezultatet e eksperimentit, duke ilustruar metodën e përshkruar të segmentimit binar automatik. Figura 7.2, a tregon një fotografi ajrore të zonës "Fushë" të sipërfaqes së tokës, dhe Figura 7.2, b tregon rezultatin e segmentimit të saj binar, të kryer në bazë të përcaktimit automatik të pragut duke përdorur metodën diskriminuese. Histogrami i shpërndarjes së imazhit origjinal është paraqitur në Fig. 7.2, c, dhe funksioni diskriminues i llogaritur nga histogrami që rezulton është paraqitur në Fig. 7.2, d. Parregullsi e fortë e histogramit, gjeneruese nje numer i madh i minima përjashton mundësinë e përcaktimit të drejtpërdrejtë të një minimumi informacioni të vetëm që ndan klasat nga njëra-tjetra. Funksioni është shumë më i qetë dhe, për më tepër, në këtë rast unimodal, gjë që e bën pragun një detyrë shumë të thjeshtë. Pragu optimal në të cilin merret një imazh i segmentuar është =100. Rezultatet tregojnë se metoda e përshkruar për gjetjen e pragut, duke qenë një zhvillim i qasjes së histogramit, ka një efekt të fortë zbutës në parregullsinë e vetë histogramit.

Le të prekim çështjen e segmentimit të pragut të imazheve jo-stacionare. Nëse ndriçimi mesatar ndryshon brenda një kornize, atëherë duhet të ndryshojnë edhe pragjet e segmentimit. Shpesh në këto raste, njeriu drejtohet në ndarjen e kornizës në zona të veçanta, brenda të cilave ndryshimet në ndriçimin mesatar mund të neglizhohen. Kjo bën të mundur zbatimin e parimeve të pragut të përshtatshëm për të punuar me imazhe të palëvizshme brenda zonave individuale. Në imazhin e përpunuar, në këtë rast, vërehen zonat në të cilat është ndarë imazhi origjinal, kufijtë midis zonave janë qartë të dukshme. Kjo është - disavantazh i rëndësishëm metodë.

Një procedurë që kërkon më shumë kohë, por edhe më efikase duke përdorur një dritare rrëshqitëse, në të cilën çdo pozicion i ri i hapësirës së punës ndryshon nga ai i mëparshmi me vetëm një hap rresht ose kolonë. Pragu optimal i gjetur në çdo hap i referohet pikës qendrore të rajonit aktual. Kështu, me këtë metodë, pragu ndryshon në çdo pikë të kornizës dhe këto ndryshime kanë një karakter të krahasueshëm me natyrën e jostacionaritetit të vetë imazhit. Procedura e përpunimit, natyrisht, është dukshëm më e ndërlikuar.

Një kompromis është procedura në të cilën në vend të një dritareje rrëshqitëse me një hap të vetëm, përdoret një dritare "kërcuese", e cila lëviz disa hapa në çdo fazë të përpunimit. Në pikat "të munguara" të kornizës, pragu mund të përcaktohet duke përdorur interpolimin (shpesh më i thjeshtë interpolimi linear) nga vlerat e tij të gjetura në pikat më të afërta.

Fig.7.2 Një shembull i segmentimit binar me prag automatik

Vlerësimi i efektivitetit të segmentimit të pragut sipas Fig. 7.2, b, duhet theksuar se kjo metodë bën të mundur marrjen e një ideje të caktuar për natyrën e rajoneve homogjene që formojnë kornizën e vëzhguar. Në të njëjtën kohë, papërsosmëria e saj themelore është e dukshme, e shkaktuar nga natyra njëpikëshe e vendimeve të marra. Prandaj, në seksionet e mëposhtme, ne i drejtohemi metodave statistikore që na lejojnë të marrim parasysh gjatë segmentimit vetitë gjeometrike zonat - madhësitë, konfigurimi, etj. Vëmë re menjëherë se karakteristikat gjeometrike përkatëse jepen në këtë rast nga modelet e tyre probabiliste dhe më shpesh në një formë të nënkuptuar.

Pragu është një nga metodat kryesore të segmentimit të imazhit për shkak të vetive të tij intuitive. Kjo metodë përqendrohet në përpunimin e imazheve, zona individuale homogjene të të cilave ndryshojnë në ndriçimin mesatar. Metoda më e zakonshme e segmentimit me prag është segmentimi binar, domethënë kur kemi në dispozicion dy lloje zonash homogjene.

Në këtë rast, imazhi përpunohet me piksel, dhe shndërrimi i secilit piksel të figurës hyrëse në imazhin dalës përcaktohet nga relacioni:

ku është një parametër i përpunimit i quajtur pragu dhe janë nivelet e ndriçimit të daljes. Përpunimi me pikselë, pozicioni i të cilave në imazh nuk luan ndonjë rol, quhet pikë. Nivelet dhe luajnë rolin e etiketave. Ata përcaktojnë se çfarë lloji të përfshijë. pikë e dhënë: në H0 ose në H1. Ose ata thonë se H0 përbëhet nga pikat e sfondit, dhe H1 nga pikat e interesit. Si rregull, nivelet dhe korrespondojnë me nivelet e bardhë dhe të zezë. Klasat H1 (të njohura edhe si klasa e interesit) do t'i quajmë klasën e objektit dhe klasën H0 klasën e sfondit.

Natyrisht, segmentimi mund të jetë jo vetëm binar, dhe në këtë rast ka më shumë se dy klasa ekzistuese. Ky lloj segmentimi quhet shumënivelësh. Imazhi që rezulton nuk është binar, por përbëhet nga segmente me ndriçim të ndryshëm. Formalisht këtë operacion mund të shkruhet si më poshtë:

ku është numri i niveleve dhe janë klasat e imazhit. Në këtë rast, për secilën nga klasat, duhet të vendoset një prag i përshtatshëm, i cili do t'i ndante këto klasa nga njëra-tjetra. Imazhet binare janë më të lehta për t'u ruajtur dhe përpunuar sesa imazhet që kanë shumë nivele ndriçimi.

Pjesa më e vështirë e përcaktimit të pragut është vetë procesi i pragut. Pragu shpesh shkruhet si funksion i formës:

ku është imazhi dhe është disa karakteristikë e pikës së imazhit, për shembull, ndriçimi mesatar në lagjen e përqendruar në këtë pikë.

Nëse vlera e pragut varet vetëm nga, domethënë e njëjtë për të gjitha pikat e figurës, atëherë një prag i tillë quhet global. Nëse pragu varet nga koordinatat hapësinore, atëherë një prag i tillë quhet lokal. Nëse varet nga karakteristika, atëherë një prag i tillë quhet adaptues. Kështu, përpunimi konsiderohet global nëse i referohet të gjithë imazhit në tërësi, dhe lokal nëse i referohet një zone të zgjedhur.

Përveç dallimeve të mësipërme midis algoritmeve, ka shumë më tepër metoda. Shumë prej tyre janë thjesht një kombinim i të tjerëve, por shumica e tyre, në një mënyrë ose në një tjetër, bazohen në analizën e histogramit të imazhit origjinal, megjithatë, ka edhe qasje thelbësisht të ndryshme që nuk ndikojnë në analizën e histogrameve në formë e drejtpërdrejtë ose kalojnë prej tyre në analizën e disa funksioneve të tjera.

Segmentimi i imazhit me U-Net në praktikë

Prezantimi

Në këtë postim në blog, do të shohim se si funksionon Unet, si ta zbatojmë atë dhe cilat të dhëna nevojiten për ta trajnuar atë. Për ta bërë këtë, ne do të konsiderojmë:

  1. si burim frymëzimi.
  2. Pytorchsi mjet për realizimin e ideve tona.
  3. Konkurse Kaggle si një vend ku mund të testojmë hipotezat tona mbi të dhëna reale.

Ne nuk do ta ndjekim nenin 100%, por do të përpiqemi të kuptojmë thelbin e tij, ta përshtatim atë me nevojat tona.

Paraqitja e problemit

Në këtë problem, na jepet një imazh i një makine dhe maska ​​e saj binare (duke lokalizuar pozicionin e makinës në imazh). Ne duam të krijojmë një model që do të jetë në gjendje të ndajë imazhin e makinës nga sfondi me një saktësi pixel për pixel mbi 99%.

Për të kuptuar se çfarë duam, imazhi gif më poshtë:

Imazhi në të majtë është imazhi origjinal, në të djathtë është maska ​​që do të aplikohet në imazh. Ne do të përdorim një rrjet nervor Unet që do të mësojë të krijojë automatikisht një maskë.

  1. Furnizimi i imazheve të makinave në rrjetin nervor.
  2. Përdorimi i një funksioni humbjeje, krahasimi i daljes së rrjetit nervor me maskat përkatëse dhe kthimi i një gabimi për rrjetin për të gjetur se ku rrjeti është i gabuar.

Struktura e kodit

Kodi është thjeshtuar sa më shumë që të jetë e mundur për të kuptuar se si funksionon. Kodi kryesor është në këtë skedar kryesore.py , ta analizojmë rresht pas rreshti.

Kodi

Ne do të përsërisim përmes kodit në main.py dhe përmes artikullit. Mos u shqetësoni për detajet e fshehura në skedarët e tjerë të projektit: ne do t'ju tregojmë ato që ju nevojiten sipas nevojës.

Le të fillojmë nga fillimi:

def main(): # Hiperparametra input_img_resize = (572, 572) # Madhësia e ndryshimit të madhësisë së imazheve hyrëse të rrjetit nervor output_img_resize = (388, 388) # Madhësia e ndryshimit të madhësisë së imazheve dalëse të rrjetit nervor batch_size = 3 epoka = 50 prag = 0. 5 validation_size = 0. 2 sample_size = Asnjë # -- Parametrat opsionalë threads = cpu_count() use_cuda = torch.cuda.is_available() script_dir = os.path.dirname abspath(__file__ )) # Thirrjet e trajnimit tb_viz_cb = TensorboardVisualizerCallback(os.path.join(script_dir,"../logs/tb_viz" )) tb_logs_cb = TensorboardLoggerCallback(os.path.join/logs"dirt,_b". )) model_saver_cb = ModelSaverCallback(os.path.join(script_dir,"../output/models/model_" + helpers.get_model_timestamp()), verbose= E vërtetë )

Në seksionin e parë, ju përcaktoni hiperparametrat tuaj, mund t'i rregulloni sipas dëshirës, ​​për shembull, në varësi të kujtesës tuaj GPU. Parametrat optimale përcaktojnë disa opsione të dobishme dhe kthimet e thirrjeve. TensorboardVisualizerCallback është një klasë që do të ruajë parashikimet në tensorboard në çdo epokë të procesit të trajnimit, TensorboardLoggerCallback ruani vlerat e funksionit të humbjes dhe "saktësinë" për pixel në tensorboard. Dhe së fundi ModelSaverCallback ruani modelin tuaj pas përfundimit të trajnimit.

# Shkarko grupet e të dhënave ds_fetcher = DatasetFetcher() ds_fetcher. grupi i të dhënave të shkarkimit ()

Ky seksion shkarkon dhe rimerr automatikisht grupin e të dhënave nga Kaggle. Ju lutemi vini re se për punë e suksesshme këtë pjesë të kodit që duhet të keni llogari Kaggle me emrin e përdoruesit dhe fjalëkalimin, të cilat duhet të vendosen në variablat e mjedisit KAGGLE_USER dhe KAGGLE_PASSWD përpara se të ekzekutoni skenarin. Gjithashtu kërkohet të pranoni rregullat e konkursit përpara se të ngarkoni të dhënat. Kjo mund të bëhet në skedën.shkarkimi i të dhënave të konkurrencës

# Merr shtegun për te skedarët për rrjetin nervor X_train, y_train, X_valid, y_valid = ds_fetcher.get_train_files(sample_size= mostër_size, validation_size= validation_size) full_x_test = ds_fetcher.get_test_files (pre-test_sallize.b. bashkohu (script_dir,"../output/submit.csv.gz" ), origin_img_size, prag)

Kjo linjë përcakton kthimi i thirrjes funksion për testin (ose parashikimin). Ai do të ruajë parashikimet në një skedar gzipçdo herë që prodhohet një grup i ri parashikimi. Kështu, parashikimet nuk do të ruhen në memorie, pasi ato janë shumë të mëdha në përmasa.

Pas përfundimit të procesit të parashikimit, mund të dërgoni skedarin e marrë paraqes.csv.gz nga dosja e daljes në Kaggle.

# -- Përcaktoni arkitekturën tonë të rrjetit nervor# Letra origjinale ka 1 kanal hyrje, në rastin tonë kemi 3 (RGB ) net = unet_origin. Klasifikuesi UNetOriginal ((3 , *img_resize)) = nn. klasifikues. CarvanaClassifier (net, epoka) optimizues = optim. SGD (parametrat neto() , lr= 0,01 , momenti = 0,99 ) train_ds = TrainImageDataset (X_train , y_train, input_img_resize, output_img_resize, X_transform = aug. augment augment_img_img), mostër të dhënash augment_img, rain_img_img, rain_img_loader= = threads, pin_memory= use_cuda) valid_ds = TrainImageDataset (X_valid , y_valid, input_img_resize, output_img_resize, threshold= threshold) valid_loader = DataLoader (valid_ds, batch_dasize, batch_damors use, squential_size, batch_damors use, sampler_size_sequently

shtyp ( "Trajnimi mbi () mostrat dhe vërtetimi mbi () mostrat". format(len(train_loader. dataset), len(valid_loader. dataset))) # Trajnoni klasifikuesin e klasifikuesit. treni (ngarkuesi_treni, ngarkuesi_vlefshëm, epokat, kthimet e thirrjeve= )

test_ds = TestImageDataset (full_x_test, img_resize) test_loader = Dataloader (test_ds, batch_size, sampler= SequentialSampler (test_ds), num_workers= threads, pin_memory= use_cuda) # Parashiko dhe ruaj klasifikuesin. parashikoj(test_loader, kthim thirrje=) pred_saver_cb. mbyll_saver()

Së fundi, ne bëjmë të njëjtën gjë si më sipër, por për drejtimin e parashikimit. Ne e quajmë tonën pred_saver_cb.close_saver() për të pastruar dhe mbyllur skedarin që përmban parashikimet.

Zbatimi i arkitekturës së rrjetit nervor

Neni Unet paraqet një qasje për segmentimin e imazheve mjekësore. Megjithatë, rezulton se kjo qasje mund të përdoret edhe për detyra të tjera segmentimi. Përfshirë atë në të cilën do të punojmë tani.

Para se të vazhdoni, duhet të lexoni të gjithë artikullin të paktën një herë. Mos u shqetësoni nëse nuk keni marrë mirëkuptim të plotë aparate matematikore, mund ta kaloni këtë seksion, si dhe kapitullin "Eksperimentet". Qëllimi ynë është të marrim pamjen e madhe.

Qëllimi i artikullit origjinal është i ndryshëm nga i yni, do të na duhet të përshtatim disa pjesë sipas nevojave tona.

Në kohën kur u shkrua vepra, humbën 2 gjëra që tani nevojiten për të shpejtuar konvergjencën e rrjetit nervor:

  1. BatchNorm.
  2. GPU të fuqishme.

E para u shpik vetëm 3 muaj më parë Unet, dhe ndoshta shumë herët për autorët Unet e shtoi atë në artikullin tuaj.

Deri më sot BatchNorm përdoret pothuajse kudo. Ju mund ta hiqni atë në kod nëse dëshironi ta vlerësoni artikullin 100%, por mund të mos jetoni për të parë konvergimin e rrjetit.

Në lidhje me GPU-të, artikulli thotë:

Për të minimizuar shpenzimet e përgjithshme dhe për të përdorur në maksimum memorien e GPU-së, ne favorizojmë pllakat e mëdha hyrëse mbi një madhësi të madhe grupi dhe për këtë arsye e reduktojmë grupin në një imazh të vetëm

Ata përdorën një GPU me 6 GB RAM, por aktualisht GPU ka më shumë memorie, për të vendosur imazhe në një grumbull. Grupi aktual i barabartë me tre, funksionon për GPU në një GPU me 8 GB RAM. Nëse nuk keni një kartë të tillë video, provoni ta zvogëloni grupin në 2 ose 1.

Sa i përket metodave shtesat (d.m.th. shtrembërimi i imazhit origjinal sipas një modeli) të konsideruar në artikull, ne do të përdorim të ndryshme nga ato të përshkruara në artikull, pasi imazhet tona janë shumë të ndryshme nga imazhet biomjekësore.

Tani le të fillojmë nga fillimi duke projektuar arkitekturën e rrjetit nervor:

Ja si duket Unet. Ju mund të gjeni një zbatim ekuivalent Pytorch në një modul nn.unet_origin.py.

Të gjitha klasat në këtë skedar kanë të paktën 2 metoda:

  • __fillimi__()ku do të inicializojmë shtresat e rrjetit tonë nervor;
  • përpara ()e cila quhet metoda kur rrjet nervor merr të dhëna.

Le të shohim detajet e zbatimit:

  • ConvBnRelu është një bllok që përmban operacionet Conv2D, BatchNorm dhe Relu. Në vend që të shtypim 3 prej tyre për çdo pirg enkoderi (ops group down) dhe grup dekoder (ops group up), ne i grupojmë në këtë objekt dhe e ripërdorim sipas nevojës.
  • StackEncoder përmbledh të gjithë "pirgun" e operacioneve poshtë, duke përfshirë operacionet ConvBnRelu dhe MaxPool si më poshtë:



Ne gjurmojmë prodhimin operacioni i fundit ConvBnRelu x_gjurmë dhe kthejeni sepse ne do ta lidhim këtë dalje me pirgje dekoderash.

  • dekoder stekështë i njëjtë me StackEncoder, por për operacionet e dekodimit të rrethuara me të kuqe më poshtë:



Vini re se ai merr parasysh operacionin trim/concatenate (të rrethuar në portokalli) duke kaluar në down_tensor i cili nuk është gjë tjetër veçse tensori x_trace i kthyer nga tonë StackEncoder .

  • UNetOriginalështë vendi ku ndodh magjia. Ky është rrjeti ynë nervor, i cili do të mbledhë të gjitha tullat e vogla të paraqitura më sipër. Metodat në fillim dhe përpara vërtetë komplekse, ata shtojnë një bandë StackEncoder , pjesa qendrore dhe në fund disa dekoder stek . Më pas marrim rezultatin dekoder stek , shtoni një konvolucion 1x1 në të sipas artikullit, por në vend që të përcaktojmë dy filtra si dalje, ne përcaktojmë vetëm 1, i cili në fakt do të jetë parashikimi ynë i maskës së shkallës së gri. Më pas, ne "tkursim" daljen tonë për të hequr madhësinë e kanalit (vetëm 1, kështu që nuk kemi nevojë ta ruajmë atë).

Nëse doni të kuptoni më shumë detaje për çdo bllok, vendosni pikë kontrolli korrigjimi në metodën përpara të secilës klasë për të parë objektet në detaje. Ju gjithashtu mund të printoni formën e tensorëve tuaj të daljes midis shtresave duke printuar ( x.size () ).

Trajnimi i rrjeteve nervore

  1. Funksioni i humbjes

Tani në botën reale. Sipas artikullit:

Funksioni i energjisë llogaritet nga një soft-max sipas pikselit mbi hartën përfundimtare të veçorive të kombinuara me Funksioni i humbjes së entropisë së kryqëzuar.

Çështja është se në rastin tonë ne duam të përdorim koeficienti i zarit si një funksion humbjeje në vend të asaj që ata e quajnë "funksion energjie" pasi kjo është metrika e përdorur nëKonkurrenca Kaggle , i cili është përcaktuar:

Xështë parashikimi ynë dhe Y- maskë e etiketuar saktë në objektin aktual. |X| nënkupton kardinalitetin e grupit X(numri i elementeve në këtë grup) dhe ∩ për kryqëzimin ndërmjet X dhe Y.

Kodi për koeficientin e zarit mund të gjendet në nn.humbjet.SoftDiceLoss .

klasa SoftDiceLoss (nn.Moduli): def __init__(vetë, peshë= Asnjë, madhësi_mesatare= E vërtetë): super (SoftDiceLoss, vetë).__init__() def përpara(vetë, logits, targets): smooth = 1 num = targets.size (0 ) probs = F.sigmoid(logits) m1 = probs.view(num, - 1 ) m2 = targets.view(num, - 1 ) kryqëzim = (m1 * m2) rezultati = 2 . * (kryqëzimi.shumë (1) + i qetë) / (m1.shumë (1) + m2.shumë (1) + i qetë) rezultati = 1 - pikë. shuma () / numër rezultati i kthimit

Arsyeja pse kryqëzimi zbatohet si shumëzim dhe kardinaliteti si shuma () boshti 1 (shuma e tre kanaleve) është se parashikimi dhe objektivi janë një-hot koduar vektorët.

Për shembull, supozoni se parashikimi në pixel (0, 0) është 0,567 dhe objektivi është 1, marrim 0,567 * 1 = 0,567. Nëse objektivi është 0, marrim 0 në atë pozicion piksel.

Ne përdorëm gjithashtu një faktor të qetë prej 1 për përhapjen prapa. Nëse parashikimi është një prag i vështirë prej 0 dhe 1, është e vështirë të përhapet prapa humbje zare.

Më pas krahasojmë humbjen e zarit me entropinë e kryqëzuar për të marrë funksionin tonë të humbjes totale, të cilën mund ta gjeni në metodë _kriter nga nn.Klasifikuesi.CarvanaKlasifikuesi . Sipas artikullit origjinal, ata përdorin gjithashtu një hartë të peshës në funksionin e humbjes së entropisë së kryqëzuar për t'i dhënë disa pikselëve më shumë gabim gjatë stërvitjes. Në rastin tonë, ne nuk kemi nevojë për një gjë të tillë, kështu që ne përdorim vetëm entropinë e kryqëzuar pa asnjë hartë peshe.

2. Optimizer

Duke qenë se nuk kemi të bëjmë me imazhe biomjekësore, do të përdorim tonat shtesat . Kodi mund të gjendet në img.augmentation.augment_img. Aty kryejmë përkthim të rastësishëm, rrotullim, rrokullisje dhe shkallëzim.

Trajnimi i rrjeteve nervore

Tani mund të filloni të mësoni. Ndërsa përparoni në çdo epokë, do të jeni në gjendje të vizualizoni se si modeli juaj parashikon në grupin e vlefshmërisë.

Për këtë ju duhet të vraponi tensorboard në dosjen e regjistrave duke përdorur komandën:

Tensorboard --logdir=./logs

Një shembull i asaj që mund të shihni në tensorboard pas epokës 1:

Segmentimi sipas metodës së pellgut ujëmbledhës të menaxhuar

Shumë shpesh, kur analizohen imazhet, lind problemi i ndarjes së pikselëve të imazhit në grupe sipas disa veçorive. Ky proces grupimi quhet segmentim. Më të njohurit janë dy lloje të segmentimit - segmentimi sipas shkëlqimit për imazhet binare dhe segmentimi sipas koordinatave të ngjyrave për imazhet me ngjyra. Metodat e segmentimit mund të konsiderohen si një zyrtarizim i konceptit të objektit që dallohet nga sfondi ose konceptet që lidhen me gradientin e shkëlqimit. Algoritmet e segmentimit karakterizohen nga disa parametra të besueshmërisë dhe besueshmërisë së përpunimit. Ato varen nga sa plotësisht merren parasysh karakteristika shtesë shpërndarja e shkëlqimit në zonat e objekteve ose sfondit, numri i rënieve të shkëlqimit, forma e objekteve, etj.

Ka shumë imazhe që përmbajnë objektin në studim me një shkëlqim mjaftueshëm uniform në një sfond me një shkëlqim të ndryshëm. Shembujt përfshijnë tekstin e shkruar me dorë, një sërë imazhesh mjekësore, e kështu me radhë. Nëse shkëlqimi i pikave të objektit ndryshon ndjeshëm nga shkëlqimi i pikave të sfondit, atëherë zgjidhja e problemit të vendosjes së pragut është një detyrë e thjeshtë. Në praktikë, kjo nuk është aq e lehtë, pasi imazhi në studim i nënshtrohet zhurmës dhe lejohet disa ndryshime në vlerat e shkëlqimit në të. Ka disa qasje analitike për kufizimin e pragut të shkëlqimit. Një metodë është vendosja e pragut në një nivel në të cilin shuma totale elementët me ndriçim nënpragu është në përputhje me probabilitetet a priori të këtyre vlerave të ndriçimit.

Qasje të ngjashme mund të aplikohen për përpunimin e imazheve me ngjyra dhe multispektrale. Ekziston edhe një lloj i tillë segmentimi si segmentimi i konturit. Shumë shpesh, analiza e imazhit përfshin operacione të tilla si marrja e konturit të jashtëm të imazheve të objektit dhe regjistrimi i koordinatave të pikave të kësaj konture. Ekzistojnë tre qasje kryesore për përfaqësimin e kufijve të një objekti: përshtatja e kurbës, gjurmimi i konturit dhe lidhja e pikës së rënies. Për plotësinë e analizës, duhet theksuar se ekziston edhe segmentimi i teksturës dhe segmentimi i formës.

Shumica pamje e thjeshtë segmentimi është segmentimi i pragut. Ka gjetur një aplikim shumë të gjerë në robotikë. Kjo shpjegohet me faktin se në këtë zonë imazhet e objekteve të studiuara, në pjesën më të madhe, kanë një strukturë mjaft homogjene dhe prapavija e tyre bie në sy. Por përveç kësaj, për përpunim të besueshëm, duhet të dini se imazhi përbëhet nga një objekt dhe një sfond, shkëlqimet e të cilave janë në intervale rreptësisht të njohura dhe nuk kryqëzohen me njëra-tjetrën.

Zhvillimi i teknologjive të përpunimit të imazhit ka çuar në shfaqjen e qasjeve të reja për zgjidhjen e problemeve të segmentimit të imazhit dhe aplikimin e tyre në zgjidhjen e shumë problemeve praktike.

Në këtë punim, ne do të shqyrtojmë qasje e re për zgjidhjen e problemit të segmentimit të imazhit - metoda e pellgut ujëmbledhës. Le të shpjegojmë shkurtimisht emrin e kësaj metode dhe cili është thelbi i saj.

Propozohet që imazhi të konsiderohet si një hartë e zonës, ku vlerat e shkëlqimit janë vlerat e lartësisë në lidhje me një nivel të caktuar. Nëse kjo zonë është e mbushur me ujë, atëherë formohen pishina. Me mbushje të mëtejshme me ujë, këto pishina kombinohen. Vendet ku bashkohen këto pellgje janë shënuar si vija ujëmbledhëse.

Ndarja e objekteve në kontakt në një imazh është një nga detyrat e rëndësishme të përpunimit të imazhit. Shpesh, për zgjidhjen e këtij problemi përdoret e ashtuquajtura metodë e pellgut ujëmbledhës shënues. Kur transformoni duke përdorur këtë metodë, duhet të përcaktoni "pellgjet ujëmbledhëse" dhe "vijat e pellgut ujëmbledhës" në imazh duke përpunuar zonat lokale në varësi të karakteristikave të tyre të shkëlqimit.

Metoda e pellgut ujëmbledhës shënues është një nga më të mirat metoda efektive segmentimi i imazhit. Gjatë zbatimit të kësaj metode, kryhen procedurat e mëposhtme themelore:

    Funksioni i segmentimit është llogaritur. Bëhet fjalë për imazhet ku objektet janë vendosur në zona të errëta dhe janë të vështira për t'u parë.

    Llogaritja e shënuesve plan të parë imazhe. Ato llogariten në bazë të analizës së lidhjes së pikselëve të çdo objekti.

    Llogaritja e shënuesve të sfondit. Janë pikselë që nuk janë pjesë e objekteve.

    Modifikimi i funksionit të segmentimit bazuar në vlerat e vendndodhjes së shënuesve të sfondit dhe shënuesve të planit të parë.

    Llogaritjet e bazuara në funksionin e modifikuar të segmentimit.

AT ky shembull ndër funksionet e paketës përpunimi i imazhit Funksionet më të përdorura të Toolbox janë fspecial, imfilter, watershed, label2rgb, imopen, imclose, imreconstruct, impcomplement, imregionalmax, bwareaopen, graythresh dhe imimposemin.

  • Hapi 1: Leximi i një imazhi me ngjyra dhe konvertimi i tij në shkallë gri.
  • Hapi 2: Përdorimi i vlerës së gradientit si funksion segmentimi.
  • Hapi 3: Shënimi i objekteve në plan të parë.
  • Hapi 4: Llogaritni shënuesit e sfondit.
  • Hapi 6: Vizualizimi i rezultatit të përpunimit.

Hapi 1: Leximi i një imazhi me ngjyra dhe konvertimi i tij në shkallë gri.

Leximi i të dhënave nga skedari pears.png rgb=imread("pears.png"); dhe përfaqësojnë ato si një imazh gri. I=rgb2gri(rgb); imshow(I) text(732,501,"…",... "FontSize",7,"Horizontal Alignment","djathtas")

Hapi 2: Përdorimi i vlerës së gradientit si funksion segmentimi.

Operatori Sobel, funksioni i imfilterit dhe llogaritjet e tjera përdoren për të llogaritur vlerën e gradientit. Gradienti ka vlerat e mëdha në kufijtë e objekteve dhe të vogla (në shumicën e rasteve) jashtë kufijve të objekteve.

Hy=fspecial("sobel"); hx=hy"; Iy=imfilter(double(I), hy, "replicate"); Ix=imfilter(double(I), hx, "replicate"); gradmag=sqrt(Ix.^2+Iy.^2 ); figura, imshow (gradmag,), titull ("vlera e gradientit")

Kështu, duke llogaritur vlerat e gradientit, ne mund të vazhdojmë me segmentimin e imazhit duke përdorur metodën e pellgut ujëmbledhës të shënuesit në shqyrtim.

L=pellgu ujëmbledhës(gradmag); Lrgb=label2rgb(L); figura, imshow (Lrgb), titull ("Lrgb")

Megjithatë, pa më shumë llogaritje shtesë, një segmentim i tillë do të jetë sipërfaqësor.

Hapi 3: Shënimi i objekteve në plan të parë.

Për shënimin e objekteve në plan të parë mund të përdoren procedura të ndryshme. Në këtë shembull do të përdoren teknikat morfologjike, të cilat quhen “hapje përmes restaurimit” dhe “mbyllje përmes restaurimit”. Këto operacione ju lejojnë të analizoni zonën e brendshme të objekteve të imazhit duke përdorur funksionin imregionalmax.

Siç u përmend më lart, gjatë shënimit të objekteve në plan të parë, përdoren gjithashtu operacione morfologjike. Le t'i hedhim një sy disa prej tyre dhe t'i krahasojmë. Së pari, ne zbatojmë operacionin e zgjerimit duke përdorur funksionin imopen.

Se=strel("disk", 20); Io=imopen(I, se); figura, tregoj (Io), titull ("Io")

Ie=imerode(I, se); Iobr=imrindërtoj(dmth, unë); figurë, imshow (Iobr), titull ("Iobr")

Operacionet e mëvonshme morfologjike të hapjes dhe mbylljes do të çojnë në lëvizjen e njollave të errëta dhe formimin e shënuesve. Le të analizojmë operacionet e mbylljes morfologjike. Për ta bërë këtë, së pari përdorim funksionin imclose:

Ioc=imclose(Io, se); figura, tregoj (Ioc), titull ("Ioc")

Iobrd=imdilate(Iobr, se); Iobrcbr=imrindërtoj(përfundoj(Iobrd), plotësoj(Iobr)); Iobrcbr=përfundoj(Iobrcbr); figura, imshow (Iobrcbr), titull ("Iobrcbr")

Krahasues analiza vizuale Iobrcbr dhe Ioc tregojnë se rindërtimi i paraqitur bazuar në operacionet morfologjike të hapjes dhe mbylljes është më efikas se operacionet standarde hapja dhe mbyllja. Le të llogarisim maksimumin lokal të Iobrcbr dhe të marrim shënuesit e planit të parë.

Fgm=imregionalmax(Iobrcbr); figurë, imshow (fgm), titull ("fgm")

Le të mbulojmë shënuesit në plan të parë në imazhin origjinal.

I2=I; I2(fgm)=255; figura, imshow(I2), titulli ("fgm e mbivendosur në imazhin burimor")

Vini re se në këtë rast, disa objekte të fshehura ose të mbyllura të imazhit nuk janë shënuar. Kjo veti ndikon në gjenerimin e rezultatit dhe shumë objekte të tilla imazhi nuk do të përpunohen për sa i përket segmentimit. Kështu, shënuesit e planit të parë shfaqin vetëm kufijtë e shumicës së objekteve. Kufijtë e paraqitur në këtë mënyrë i nënshtrohen përpunimit të mëtejshëm. Në veçanti, mund të jenë operacione morfologjike.

Se2=strel(ones(5, 5)); fgm2=imclose(fgm, se2); fgm3=imerode(fgm2, se2);

Si rezultat i një operacioni të tillë, pikselët individualë të izoluar të imazhit zhduken. Ju gjithashtu mund të përdorni funksionin bwareaopen, i cili ju lejon të hiqni një numër të caktuar pikselësh.

Fgm4=bwareaopen(fgm3, 20); I3=I; I3(fgm4)=255; figura, titulli imshow(I3) ("fgm4 i mbivendosur në imazhin origjinal")

Hapi 4: Llogaritni shënuesit e sfondit.

Tani do të kryejmë operacionin e shënimit të sfondit. Në imazhin Iobrcbr, pikselët e errët i referohen sfondit. Kështu, mund të zbatohet një operacion i pragut të imazhit.

Bw=im2bw(Iobrcbr, graythresh(Iobrcbr)); figura, tregoj (bw), titull ("bw")

Pixelat e sfondit janë të errët, por nuk mund të kryeni thjesht operacione morfologjike në shënuesit e sfondit dhe të merrni kufijtë e objekteve që po segmentojmë. Ne duam të "hollojmë" sfondin në atë mënyrë që të marrim një imazh të vërtetë skeletor, ose të ashtuquajturin plan të parë të imazhit gjysmëton. Kjo llogaritet duke përdorur qasjen e pellgut ujëmbledhës dhe bazuar në matjet e distancës (në vijat e pellgut ujëmbledhës).

D=bwdist(bw); DL=pellgu ujëmbledhës(D); bgm=DL==0; figura, tregoj (bgm), titull ("bgm")

Hapi 5: Llogaritja e pellgut ujëmbledhës shënues bazuar në funksionin e modifikuar të segmentimit.

Funksioni imimposemin mund të përdoret për të përcaktuar me saktësi minimumin lokal të një imazhi. Bazuar në këtë, funksioni imimposemin mund të rregullojë gjithashtu vlerat e gradientëve në imazh dhe kështu të rafinojë vendndodhjen e shënuesve të planit të parë dhe të sfondit.

Gradmag2=imimposemin(gradmag, bgm | fgm4);

Së fundi, kryhet një operacion segmentimi i bazuar në pellgun ujëmbledhës.

L=pellgu ujëmbledhës(gradmag2);

Hapi 6: Vizualizimi i rezultatit të përpunimit.

Le të shfaqim shënuesit e mbivendosur në plan të parë, shënuesit e sfondit dhe kufijtë e objekteve të segmentuar në imazhin origjinal.

I4=I; I4(imdilate(L==0, ones(3, 3))|bgm|fgm4)=255; figura, imshow(I4) titulli ("Shënuesit e objekteve dhe kufijtë e mbivendosur mbi imazhin origjinal")

Si rezultat i këtij ekrani, ju mund të analizoni vizualisht vendndodhjen e shënuesve të planit të parë dhe të sfondit.

Me interes është edhe shfaqja e rezultateve të përpunimit duke përdorur një imazh me ngjyra. Matrica e gjeneruar nga funksionet e basenit dhe bwlabel mund të konvertohet në një imazh me ngjyrë të vërtetë duke përdorur funksionin label2rgb.

Lrgb=label2rgb(L, "jet", "w", "përzier"); figura, imshow (Lrgb) titulli ("Lrgb")

Mund të përdorni gjithashtu modalitetin e tejdukshëm për të mbivendosur një matricë etikete pseudo-ngjyrëshe në krye të imazhit origjinal.

Figura, imshow(I), mbaj në himage=imshow(Lrgb); set(image, "AlphaData", 0.3); titull ("Lrgb i mbivendosur në imazhin origjinal në modalitetin e tejdukshëm")

Artikulli përshkruan studimin e metodave të segmentimit të imazhit në shembuj të ndryshëm. Qëllimi i studimit është të zbulojë avantazhet dhe disavantazhet e disa metodave të njohura.


Metodat që do të diskutohen në këtë artikull:

  1. Metoda e Rajoneve të Rritjes;
  2. metoda e pellgut ujëmbledhës;
  3. Metoda e prerjeve normale.

Studimi i metodave të segmentimit në imazhet e modelit

Studimi i metodave të segmentimit fillimisht u krye në modelet e imazhit. Nëntë lloje imazhesh u përdorën si modele.




Rezultatet e studimit treguan:

  • Metoda e rritjes së rajoneve lokalizon defektet e teksturës, të dyja dukshëm të ndryshme nga sfondi, dhe të formuara nga rrotullimi dhe ndryshimi i shkëlqimit të strukturës;
  • Metoda e rritjes së rajonit lokalizon defektet në shkallë të ndryshme në kënde të ndryshme të rrotullimit të teksturës;
  • Metoda e konsideruar e segmentimit të pellgut ujëmbledhës në formë origjinale nuk siguron lokalizimin e defekteve teksturale;
  • Metoda e prerjeve normale lokalizon mirë praninë e një teksture të ndryshme nga sfondi, por nuk nxjerr në pah ndryshimin në shkëlqimin dhe rrotullimin e teksturës.

Studimi i metodave të segmentimit në imazhet e objekteve

Për të studiuar metodat e segmentimit, u përgatit një bazë të dhënash e imazheve të objekteve të ndryshme. Imazhet që rezultuan u segmentuan duke përdorur metoda të ndryshme, rezultati i të cilit është paraqitur në figurat në tabelë


imazh origjinal Metoda e rajoneve në rritje Metoda normale e prerjes metoda e pellgut ujëmbledhës

Rezultatet:

  • Metoda e rritjes së rajoneve nuk siguron lokalizimin e segmenteve në imazhet e objekteve;
  • Metodat e konsideruara të pellgut ujëmbledhës dhe seksioneve normale në formën e tyre origjinale nuk sigurojnë lokalizimin e objekteve të paraqitura;
  • Metoda e prerjeve normale siguron lokalizimin e objekteve në imazhet e objekteve.

rezultatet

Rezultatet e studimit:

  • Metoda e rritjes së rajoneve nuk siguron lokalizimin e segmenteve si në imazhet e modeleve, dhe mbi imazhet e objekteve, dhe gjithashtu ofron lokalizimin e elementeve të infrastrukturës rrugore.
  • Metodat e konsideruara të pellgut ujëmbledhës dhe prerjet normale në formën e tyre origjinale nuk ofrojnë plotësisht lokalizimin e objekteve të paraqitura.
  • Metoda e prerjeve normale siguron lokalizimin e objekteve si në imazhet e modeleve ashtu edhe në imazhet e objekteve, si dhe siguron lokalizimin e elementeve të infrastrukturës së transportit rrugor.
  • Metoda e rritjes në rajon dhe metoda e prerjes normale mund të rekomandohen për përdorim në sisteme të automatizuara kontrolli vizual.

Artikujt kryesorë të lidhur