Skip to content

mano000/Roomba_Neural_Network

Repository files navigation

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))

png

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()

png

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()

png

#interp = ClassificationInterpretation.from_learner(learn)

#interp.plot_top_losses(9, figsize=(15, 11))htop

Now, let's do some real testing

#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')
img

png

learn = 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

png

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')
img

png

pred_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')
img

png

pred_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])

About

Convolutional Neural Network for roomba navigation with a raspicam

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages