Thanks, it appears to be that, do you know why open_image does that [0,255] instead of 0,1? My images are saved as 1bit with PIL.
This solved the issue:
class MySegmentationLabelList(SegmentationLabelList):
def open(self, fn): return open_mask(fn, div=True)
class MySegmentationItemList(ImageItemList):
"`ItemList` suitable for segmentation tasks."
_label_cls,_square_show_res = MySegmentationLabelList,False
[quote=āsgugger, post:3, topic:30292ā]
Not that any time you get a CUDA error, you have to rest
[/quote]But I use:mask = open_mask(get_y_fn(img_f), div=True)
mask.show(figsize=(5,5), alpha=1)
, then the mask shows all black. No mask now, right?
If itās a binary task and you have values of 38 and 0, you must divide by 38 your images or set every value greater than 0 to 1, for example hereās some code tha I use in a similar case:
def open_mk(fn:PathOrStr, div:bool=False, convert_mode:str='L', cls:type=ImageSegment,
after_open:Callable=None)->Image:
"Return `Image` object created from image in file `fn`."
with warnings.catch_warnings():
warnings.simplefilter("ignore", UserWarning) # EXIF warning from TiffPlugin
x = PIL.Image.open(fn).convert(convert_mode)
if after_open: x = after_open(x)
x = pil2tensor(x,np.float32)
x[x>0]=1 #MODIFIDED
if div: x.div_(255)
return cls(x)
class CustomSegmentationLabelList(SegmentationLabelList):
def open(self,fn): return open_mk(fn)
class CustomSegmentationItemList(ImageList):
_label_cls= CustomSegmentationLabelList
For all segmentation tasks, make sure that your labels are always starting at 0 and increasing till the number of classes minus 1. For 10 classes your labels should be 0,ā¦,9.
Best is preprocessing the masks and saving the correct format on disk. Best use ImageJ / Fiji for this task, then you can also check that everything fits. Sure you can do it with python, but transforming your data on the fly when loading it for learning is too resource intense, so I would not do that.
@harikrishnanrajeev Yes, I fixed it with pietro.latorreās method with updated fastai, and I also added '0āclass to the class list, then fit_one_cycle works. Maybe I neednāt generat the mask, but just load from coco json file, I havenāt tried that yet.
Hey, I am also facing the same problem. I had values of 76 and 0 when i print the mask.data values. Have u found the trick how to solve. If yes please let me know.
My brain was almost exploding because I did not find an error in my code but could not train a segmentation model. Just knowing that the accuracy metric no longer works for segmentation saved my life. Thank you.
How I saw something wrong in my code: open_mask(āpath to maskā).data contains values out of [0, classes-1]
2)I had mask in rle format, so I generated files with mask myself. But. I used ImageSegment.save(filename) without png format. So storing mask as png resolved my problem.
(this code from ImageSegment.save, I has copied it to my code, to add āpngā
x = get_image(mask, shape)
x = image2np(x.data).astype(np.uint8)
PIL.Image.fromarray(x).save(LBL_PATH/file_name,āpngā)
Hi everyone,
I found this solution! Just edit the open_mask function with this partial before using SegmentationItemList, so you wonāt need to extend it with a custom class