კომპიუტერული ხედვა Jupyter ნოუთბუქი · PyTorch

სეგმენტაცია

ეს არის პრაქტიკული ნოუთბუქი. წაიკითხე კოდი და შედეგები აქ, ან გაუშვი ინტერაქტიულად Google Colab-ში ან Jupyter-ში.

ჩვენ უკვე ვისწავლეთ Object Detection-ის შესახებ, რომელიც საშუალებას გვაძლევს აღმოვაჩინოთ ობიექტები სურათზე მათი შეზღუდული უჯრების წინასწარმეტყველებით. თუმცა, ზოგიერთი ამოცანისთვის ჩვენ გვჭირდება არა მხოლოდ შეზღუდვის ყუთები, არამედ უფრო ზუსტი ობიექტის ლოკალიზაცია. ამ ამოცანას ეწოდება სეგმენტაცია.

სეგმენტაცია შეიძლება ჩაითვალოს პიქსელების კლასიფიკაციად, ხოლო თითოეული სურათის პიქსელისთვის უნდა ვიწინასწარმეტყველოთ მისი კლასი (ფონი არის ერთ-ერთი კლასი). არსებობს ორი ძირითადი სეგმენტაციის ალგორითმი:

  • სემანტიკური სეგმენტაცია მხოლოდ პიქსელების კლასს ეუბნება და არ განასხვავებს ერთი და იმავე კლასის სხვადასხვა ობიექტებს შორის
  • ინსტანციის სეგმენტაცია ყოფს კლასებს სხვადასხვა ინსტანციებად.

მაგალითად, სეგმენტაცია 10 ცხვარი სხვადასხვა ობიექტია, სემანტიკური სეგმენტაციისთვის ყველა ცხვარი წარმოდგენილია ერთი კლასით.

სურათი ეს ბლოგის პოსტი-დან

არსებობს სხვადასხვა ნერვული არქიტექტურა სეგმენტაციისთვის, მაგრამ მათ აქვთ იგივე სტრუქტურა:

  • Encoder ამონაწერი თვისებები შეყვანის სურათი
  • დეკოდერი გარდაქმნის ამ ფუნქციებს ნიღბის გამოსახულებად, არხების იგივე ზომითა და რაოდენობით, რომლებიც შეესაბამება კლასების რაოდენობას.

სურათი ამ პუბლიკაციას-დან

წინაპირობები

დასაწყისისთვის, ჩვენ მოვახდენთ საჭირო ბიბლიოთეკების იმპორტს და შევამოწმებთ არის თუ არა ტრენინგისთვის ხელმისაწვდომი GPU.

იტვირთება…
იტვირთება…

The Dataset

ჩვენ გამოვიყენებთ PH2 მონაცემთა ბაზას ადამიანის ნევუსების დერმოსკოპიული გამოსახულებების. ეს მონაცემთა ნაკრები შეიცავს სამი კლასის 200 სურათს: ტიპიური ნევუსი, ატიპიური ნევუსი და მელანომა. ყველა სურათი ასევე შეიცავს შესაბამის ნიღაბს, რომელიც ასახავს ნევუსს.

ქვემოთ მოცემული კოდი ჩამოტვირთავს მონაცემთა ბაზას თავდაპირველი მდებარეობიდან და ახდენს მის დეკომპრესიას. თქვენ უნდა გქონდეთ დაინსტალირებული unrar პროგრამა ამ კოდის მუშაობისთვის, შეგიძლიათ დააინსტალიროთ sudo apt-get install unrar-ის გამოყენებით Linux-ზე, ან ჩამოტვირთეთ ბრძანების ხაზის ვერსია Windows-ისთვის აქ.

იტვირთება…

ახლა ჩვენ განვსაზღვრავთ კოდს მონაცემთა ნაკრების ჩასატვირთად. ჩვენ ყველა სურათს გარდაქმნით 256x256 ზომებად და დავყოფთ მონაცემთა ბაზას მატარებელ და სატესტო ნაწილებად. ეს ფუნქცია აბრუნებს მატარებლის და ტესტის მონაცემთა ნაკრებებს, თითოეული შეიცავს ორიგინალურ სურათებს და ნიღბებს, რომლებიც ასახავს ნევუსს.

იტვირთება…

მოდით ახლა დავხატოთ ზოგიერთი სურათი მონაცემთა ნაკრებიდან, რათა დავინახოთ, როგორ გამოიყურებიან ისინი:

იტვირთება…

ჩვენ ასევე დაგვჭირდება მონაცემთა ჩამტვირთველები, რათა შევიტანოთ მონაცემები ჩვენს ნერვულ ქსელში.

იტვირთება…

სეგნეტი

უმარტივეს ენკოდერ-დეკოდერის არქიტექტურას ეწოდება SegNet. ის იყენებს სტანდარტულ CNN-ს კონვოლუციებითა და გაერთიანებებით ენკოდერში, და დეკონვოლუციურ CNN-ს, რომელიც მოიცავს დეკოდერში კონვოლუციებს და ასიმპლინგებს. ის ასევე ეყრდნობა პარტიული ნორმალიზებას მრავალ ფენიანი ქსელის წარმატებით მოსამზადებლად.

სურათი ამ ნაშრომიდან: Badrinarayanan, V., Kendall, A., & Cipolla, R. (2015). SegNet: ღრმა კონვოლუციონალური ენკოდერ-დეკოდერის არქიტექტურა გამოსახულების სეგმენტაციისთვის

იტვირთება…

განსაკუთრებით უნდა აღვნიშნოთ დანაკარგის ფუნქცია, რომელიც გამოიყენება სეგმენტაციისთვის. კლასიკურ ავტოენკოდერებში ჩვენ უნდა გავზომოთ მსგავსება ორ სურათს შორის და ამისათვის შეგვიძლია გამოვიყენოთ საშუალო კვადრატული შეცდომა. სეგმენტაციისას, სამიზნე ნიღბის გამოსახულებაში თითოეული პიქსელი წარმოადგენს კლასის ნომერს (one-hot კოდირებული მესამე განზომილების გასწვრივ), ამიტომ ჩვენ უნდა გამოვიყენოთ კლასიფიკაციისთვის დამახასიათებელი დანაკარგის ფუნქციები - ჯვარედინი ენტროპიის დაკარგვა, საშუალოდ ყველა პიქსელზე. თუ ნიღაბი ორობითია (როგორც ჩვენს მაგალითში) - ჩვენ გამოვიყენებთ ორობითი ჯვარედინი ენტროპიის დაკარგვას (ძვ.წ.).

იტვირთება…

ტრენინგის ციკლი განისაზღვრება ჩვეულებრივი გზით:

იტვირთება…
იტვირთება…
გამოტანა
100%|██████████| 30/30 [16:01<00:00, 32.04s/it, train loss:=0.593, test loss:=0.577]

ჩვენი მოდელის შესაფასებლად, ჩვენ უბრალოდ დავსახავთ სამიზნე ნიღბებს და წინასწარმეტყველურ ნიღბებს რამდენიმე სურათისთვის:

იტვირთება…
გამოტანა
ნოუთბუქის გამოტანანოუთბუქის გამოტანა

ასევე არსებობს რამდენიმე ფორმალური მეტრიკა შესრულების შესაფასებლად, რომლის შესახებაც შეგიძლიათ წაიკითხოთ აქ. ყველაზე მარტივი გასაგებად არის პიქსელის სიზუსტე - სწორად კლასიფიცირებული პიქსელების პროცენტი.

U-Net

SegNet არქიტექტურა ძალიან ბუნებრივია, მაგრამ ის არ არის ყველაზე ზუსტი. მართლაც, ჩვენ პირველად გამოვიყენებთ პირამიდის CNN არქიტექტურას ორიგინალურ სურათზე, რაც ამცირებს გამოსახულების მახასიათებლების სივრცულ სიზუსტეს. შემდეგ, როდესაც სურათს აღვადგინებთ, პიქსელის პოზიციების სწორად რეკონსტრუქციას ვერ ვახერხებთ.

ეს მიგვიყვანს იდეამდე გამოტოვოთ კავშირები კონვოლუციურ ფენებს შორის კოდირსა და დეკოდერში. ეს არქიტექტურა ძალიან გავრცელებულია სემანტიკური სეგმენტაციისთვის და ეწოდება U-Net. კავშირების გამოტოვება თითოეულ კონვოლუციურ დონეზე ეხმარება ქსელს არ დაკარგოს ინფორმაცია ფუნქციების შესახებ ორიგინალური შეყვანიდან ამ დონეზე.

ჩვენ აქ გამოვიყენებთ საკმაოდ მარტივ CNN არქიტექტურას, მაგრამ U-Net ასევე შეუძლია გამოიყენოს უფრო რთული ენკოდერი ფუნქციების ამოღებისთვის, როგორიცაა ResNet-50.

სურათი ქაღალდიდან: რონებერგერი, ოლაფი, ფილიპ ფიშერი და თომას ბროქსი. U-Net: კონვოლუციური ქსელები ბიოსამედიცინო გამოსახულების სეგმენტაციისთვის.

იტვირთება…
იტვირთება…
იტვირთება…
გამოტანა
100%|██████████| 30/30 [29:07<00:00, 58.26s/it, train loss:=0.595, test loss:=0.572] 
იტვირთება…
გამოტანა
ნოუთბუქის გამოტანანოუთბუქის გამოტანა

ეს გაკვეთილი არის Microsoft “AI for Beginners” კურსის ქართული თარგმანი, გავრცელებული MIT ლიცენზიით.