File size: 2,951 Bytes
48237d2
 
 
 
 
c39b8fc
48237d2
c39b8fc
 
48237d2
c39b8fc
 
48237d2
c39b8fc
 
 
 
 
48237d2
c39b8fc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48237d2
c39b8fc
 
 
 
 
48237d2
c39b8fc
 
 
48237d2
c39b8fc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48237d2
c39b8fc
 
 
48237d2
c39b8fc
 
48237d2
c39b8fc
 
 
48237d2
c39b8fc
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
---
tags:
- fastai
---

# Model card

## Model description
Fastai `unet` created with `unet_learner` using `resnet34`

## Intended uses & limitations
This is only used for demonstration of fine tuning capabilities with fastai. It may be useful for further research. This model should **not** be used for gastrointestinal polyp diagnosis.

## Training and evaluation data
The model was trained on [Kvasir SEG dataset](https://datasets.simula.no/kvasir-seg/). Kvasir SEG is an open-access dataset of gastrointestinal polyp images and corresponding segmentation masks, manually annotated and verified by an experienced gastroenterologist.  
20% of the data set were used as validation set and 80% as training set.  
  
### Model training details:

#### Data pre-processing
Masks were converted to 1 bit images: 0 for background and 1 for mask using
```python
Path('/notebooks/Kvasir-SEG/masks1b-binary').mkdir(parents=True, exist_ok=True)
for img_path in tqdm(get_image_files(path/'masks')):
    img = Image.open(img_path)
    thresh = 127
    fn = lambda x : 1 if x > thresh else 0
    img1b = img.convert('L').point(fn)
    img1b.save(path/'masks1b-binary'/f'{img_path.stem}.png')
```
#### Data loaders
`SegmentationDataloaders` were used to create fastai data loaders
```python
def label_func(fn): return path/'masks1b-binary'/f'{fn.stem}.png'
dls = SegmentationDataLoaders.from_label_func(
    path, bs=24, fnames = get_image_files(path/'images'),
    label_func = label_func,
    codes = list(range(2)),
    item_tfms=Resize(320),
    batch_tfms=aug_transforms(size=224, flip_vert=True)
)
```
An sample of training images:
![show_batch](path/to/image)

#### Learner
Create learner with Dice and JaccardCoeff metrics
```python
learn = unet_learner(dls, resnet34, metrics=[Dice, JaccardCoeff]).to_fp16()
```

#### Learning rate
Learning rate finder
![lr_find](path/to/image)

#### Fine tuning
Fine tuning for 12 epochs  
`learn.fine_tune(12, 1e-4)`
```
epoch 	train_loss 	valid_loss 	dice 	jaccard_coeff 	time
0 	0.582160 	0.433768 	0.593044 	0.421508 	00:38
epoch 	train_loss 	valid_loss 	dice 	jaccard_coeff 	time
0 	0.307588 	0.261374 	0.712569 	0.553481 	00:38
1 	0.261775 	0.232007 	0.714458 	0.555764 	00:38
2 	0.246054 	0.227708 	0.781048 	0.640754 	00:38
3 	0.224612 	0.185920 	0.796701 	0.662097 	00:39
4 	0.208768 	0.179064 	0.821945 	0.697714 	00:39
5 	0.192531 	0.171336 	0.816464 	0.689851 	00:39
6 	0.177166 	0.167357 	0.820771 	0.696023 	00:39
7 	0.168222 	0.158182 	0.838388 	0.721745 	00:39
8 	0.155157 	0.161950 	0.829525 	0.708709 	00:39
9 	0.148792 	0.164533 	0.828383 	0.707043 	00:38
10 	0.143541 	0.158669 	0.833519 	0.714559 	00:39
11 	0.140083 	0.159437 	0.832745 	0.713422 	00:38
```
![loss_graph](path/to/image)

#### Results
Visualization of results
![show_results](path/to/image)

Top losses
![top_losses](path/to/image)

#### Libraries used:
`huggingface_hub.__version__`  
`'0.8.1'`  

`fastai.__version__`  
`'2.6.3'`