from fastai.vision import *Neuronal network for roomba by Mariano Miretta, using fastai
Dataset creation with roomba bumper
path = Path('/root/JupyterNotebooks/roomba/livingroom2/dataset_from_roomba')
path.ls()[PosixPath('/root/JupyterNotebooks/roomba/livingroom2/dataset_from_roomba/export.pkl'),
PosixPath('/root/JupyterNotebooks/roomba/livingroom2/dataset_from_roomba/FRONT_CRASH'),
PosixPath('/root/JupyterNotebooks/roomba/livingroom2/dataset_from_roomba/LEFT_BUMP'),
PosixPath('/root/JupyterNotebooks/roomba/livingroom2/dataset_from_roomba/RIGHT_BUMP'),
PosixPath('/root/JupyterNotebooks/roomba/livingroom2/dataset_from_roomba/YES'),
PosixPath('/root/JupyterNotebooks/roomba/livingroom2/dataset_from_roomba/models')]
classes = ['YES','FRONT_CRASH','LEFT_BUMP','RIGHT_BUMP']delete all the files that we cannot read
for c in classes:
print(c)
verify_images(path/c, delete=True, max_size=1024)YES
<div>
<style>
/* Turns off some styling */
progress {
/* gets rid of default border in Firefox and Opera. */
border: none;
/* Needs to be in here for Safari polyfill so background images work as expected. */
background-size: auto;
}
.progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {
background: #F44336;
}
</style>
<progress value='3794' class='' max='3794', style='width:300px; height:20px; vertical-align: middle;'></progress>
100.00% [3794/3794 00:11<00:00]
</div>
FRONT_CRASH
<div>
<style>
/* Turns off some styling */
progress {
/* gets rid of default border in Firefox and Opera. */
border: none;
/* Needs to be in here for Safari polyfill so background images work as expected. */
background-size: auto;
}
.progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {
background: #F44336;
}
</style>
<progress value='1760' class='' max='1760', style='width:300px; height:20px; vertical-align: middle;'></progress>
100.00% [1760/1760 00:12<00:00]
</div>
LEFT_BUMP
<div>
<style>
/* Turns off some styling */
progress {
/* gets rid of default border in Firefox and Opera. */
border: none;
/* Needs to be in here for Safari polyfill so background images work as expected. */
background-size: auto;
}
.progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {
background: #F44336;
}
</style>
<progress value='104' class='' max='104', style='width:300px; height:20px; vertical-align: middle;'></progress>
100.00% [104/104 00:00<00:00]
</div>
RIGHT_BUMP
<div>
<style>
/* Turns off some styling */
progress {
/* gets rid of default border in Firefox and Opera. */
border: none;
/* Needs to be in here for Safari polyfill so background images work as expected. */
background-size: auto;
}
.progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {
background: #F44336;
}
</style>
<progress value='1104' class='' max='1104', style='width:300px; height:20px; vertical-align: middle;'></progress>
100.00% [1104/1104 00:05<00:00]
</div>
bs=16
#def _flip_affine() -> TfmAffine:
# "Flip `x` horizontally."
# return [[-1, 0, 0.],
# [0, 1, 0],
# [0, 0, 1.]]
#flip_affine = TfmAffine(_flip_affine)
np.random.seed(42)
data = ImageDataBunch.from_folder(path, train=".", valid_pct=0.2,
ds_tfms=get_transforms(), size=640,bs=bs, num_workers=2).normalize(imagenet_stats)data.classes['FRONT_CRASH', 'LEFT_BUMP', 'RIGHT_BUMP', 'YES']
##data.show_batch()
#tfms = get_transforms(max_rotate=25); len(tfms#)data.show_batch(rows=7, figsize=(17,18))data.classes, data.c, len(data.train_ds), len(data.valid_ds)(['FRONT_CRASH', 'LEFT_BUMP', 'RIGHT_BUMP', 'YES'], 4, 5410, 1352)
learn = create_cnn(data, models.resnet34, metrics=error_rate)
#To enable on both GPUs
learn.model = nn.DataParallel(learn.model, device_ids=[0, 1])
#learn.model learn.fit_one_cycle(12)Total time: 47:21
| epoch | train_loss | valid_loss | error_rate | time |
|---|---|---|---|---|
| 1 | 1.148557 | 0.796722 | 0.306953 | 03:58 |
| 2 | 0.916633 | 0.724713 | 0.282544 | 03:57 |
| 3 | 0.887446 | 0.718112 | 0.262574 | 03:56 |
| 4 | 0.847031 | 0.631110 | 0.230769 | 03:56 |
| 5 | 0.764337 | 0.599229 | 0.222633 | 03:56 |
| 6 | 0.760102 | 0.562863 | 0.215976 | 03:56 |
| 7 | 0.658750 | 0.540209 | 0.207840 | 03:57 |
| 8 | 0.642802 | 0.481386 | 0.163462 | 03:56 |
| 9 | 0.621693 | 0.492348 | 0.180473 | 03:57 |
| 10 | 0.576502 | 0.457849 | 0.155325 | 03:56 |
| 11 | 0.604046 | 0.456322 | 0.158284 | 03:56 |
| 12 | 0.599447 | 0.452852 | 0.162722 | 03:55 |
learn.save('stage-1')learn.load('stage-1')
learn.unfreeze()learn.lr_find()LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.
learn.recorder.plot()learn.fit_one_cycle(2, max_lr=slice(1e-5,1e-4))
#learn.model = nn.DataParallel(learn.model, device_ids=[1])Total time: 08:23
| epoch | train_loss | valid_loss | error_rate | time |
|---|---|---|---|---|
| 1 | 0.589669 | 0.422360 | 0.150888 | 04:24 |
| 2 | 0.545735 | 0.392712 | 0.136095 | 03:59 |
learn.save('stage-2')Interpretation
learn.load('stage-2');interp = ClassificationInterpretation.from_learner(learn)interp.plot_confusion_matrix()#interp = ClassificationInterpretation.from_learner(learn)
#interp.plot_top_losses(9, figsize=(15, 11))htop#Export the model for production
learn.export()
data.classes['FRONT_CRASH', 'LEFT_BUMP', 'RIGHT_BUMP', 'YES']
defaults.device = torch.device('cuda')img = open_image('/root/JupyterNotebooks/roomba/livingroom/NO/2019-03-27 13:36:43.509640_no.jpg')
imglearn = load_learner(path)
print (path)/root/JupyterNotebooks/roomba/livingroom2/dataset_from_roomba
pred_class,pred_idx,outputs = learn.predict(img)
print (pred_class)
print (pred_idx)
print (outputs)FRONT_CRASH
tensor(0)
tensor([0.8356, 0.0082, 0.0865, 0.0696])
#Let's take an image from other day and at different resolution.img = open_image('/root/JupyterNotebooks/roomba/SI/2019-03-19 15:49:04.437812_si.jpg')
img
pred_class,pred_idx,outputs = learn.predict(img)
print (pred_class)
print (pred_idx)
print (outputs)YES
tensor(3)
tensor([1.2628e-02, 3.0800e-04, 7.3673e-03, 9.7970e-01])
#and another one... different resolution and not part of this training set
img = open_image('/root/JupyterNotebooks/roomba/NO/2019-03-19 16:16:34.340064_no.jpg')
imgpred_class,pred_idx,outputs = learn.predict(img)
print (pred_class)
print (pred_idx)
print (outputs)FRONT_CRASH
tensor(0)
tensor([0.7462, 0.0048, 0.0486, 0.2005])
img = open_image('/root/JupyterNotebooks/roomba/NO/2019-03-19 16:22:07.487264_no.jpg')
imgpred_class,pred_idx,outputs = learn.predict(img)
print (pred_class)
print (pred_idx)
print (outputs)FRONT_CRASH
tensor(0)
tensor([9.4754e-01, 4.4922e-04, 1.5409e-02, 3.6597e-02])






