File size: 2,975 Bytes
48237d2
 
 
 
 
c39b8fc
48237d2
c39b8fc
 
48237d2
c39b8fc
 
48237d2
c39b8fc
 
 
 
 
48237d2
c39b8fc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
766fe3f
48237d2
c39b8fc
 
 
 
 
48237d2
c39b8fc
 
766fe3f
48237d2
c39b8fc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
766fe3f
48237d2
c39b8fc
7d4846a
 
766fe3f
48237d2
c39b8fc
766fe3f
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
91
---
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](show_batch.png)

#### 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](lr_find.png)

#### 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](loss_graph.png)

#### Results
Visualization of results  
Target/Prediction
![show_results](show_results.png)

Top losses
![top_losses](top_losses.png)

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

`fastai.__version__`  
`'2.6.3'`