Inference / Predict a Single Image

Hi everyone, I am still very new and really interested in learning more about fast.ai, but i’m currently stuck and has no where to find the answer after few hours of trying.

So here’s my problem
According Notebook, 02_production
After we are ready to inference,
we will use this

learn_inf.predict(‘images/grizzly.jpg’)
which results in 3 tuples
(‘grizzly’, tensor(1), tensor([9.0767e-06, 9.9999e-01, 1.5748e-07]))

But when i reach Notebook 04_mnist_basics

dls = ImageDataLoaders.from_folder(path)
learn = cnn_learner(dls, resnet18, pretrained=False,
loss_func=F.cross_entropy, metrics=accuracy)
learn.fit_one_cycle(1, 0.1)

Which results the train loss, time for each epochs.

However, when i wanna tried how to inference, i do this :

learn.predict(’/home/yogie/.fastai/data/mnist/training/8/58734.png’)

and Unfortunately it shows me a lot of error.

Which part did i do wrong?
Please help me solve , so that i could use that model for inference a single image just like Notebook 02
Thank you

Hi Yogie,

Can you maybe share the error message you get ?

Best,
Charles

Hi Charles,
Here’s my error log , and below i also include the print screen of my codes


IndexError Traceback (most recent call last)
in
3 img
4
----> 5 learn2.predict(img)

~/miniconda3/envs/venv37/lib/python3.7/site-packages/fastai/learner.py in predict(self, item, rm_type_tfms, with_input)
253 i = getattr(self.dls, ‘n_inp’, -1)
254 inp = (inp,) if i==1 else tuplify(inp)
–> 255 dec = self.dls.decode_batch(inp + tuplify(dec_preds))[0]
256 dec_inp,dec_targ = map(detuplify, [dec[:i],dec[i:]])
257 res = dec_targ,dec_preds[0],preds[0]

~/miniconda3/envs/venv37/lib/python3.7/site-packages/fastai/data/core.py in decode_batch(self, b, max_n, full)
79
80 def decode(self, b): return self.before_batch.decode(to_cpu(self.after_batch.decode(self._retain_dl(b))))
—> 81 def decode_batch(self, b, max_n=9, full=True): return self._decode_batch(self.decode(b), max_n, full)
82
83 def _decode_batch(self, b, max_n=9, full=True):

~/miniconda3/envs/venv37/lib/python3.7/site-packages/fastai/data/core.py in _decode_batch(self, b, max_n, full)
84 f = self.after_item.decode
85 f = compose(f, partial(getattr(self.dataset,‘decode’,noop), full = full))
—> 86 return L(batch_to_samples(b, max_n=max_n)).map(f)
87
88 def _pre_show_batch(self, b, max_n=9):

~/miniconda3/envs/venv37/lib/python3.7/site-packages/fastcore/foundation.py in map(self, f, gen, *args, **kwargs)
224 def range(cls, a, b=None, step=None): return cls(range_of(a, b=b, step=step))
225
–> 226 def map(self, f, *args, gen=False, **kwargs): return self._new(map_ex(self, f, *args, gen=gen, **kwargs))
227 def argwhere(self, f, negate=False, **kwargs): return self._new(argwhere(self, f, negate, **kwargs))
228 def filter(self, f=noop, negate=False, gen=False, **kwargs):

~/miniconda3/envs/venv37/lib/python3.7/site-packages/fastcore/basics.py in map_ex(iterable, f, gen, *args, **kwargs)
541 res = map(g, iterable)
542 if gen: return res
–> 543 return list(res)
544
545 # Cell

~/miniconda3/envs/venv37/lib/python3.7/site-packages/fastcore/basics.py in call(self, *args, **kwargs)
531 if isinstance(v,_Arg): kwargs[k] = args.pop(v.i)
532 fargs = [args[x.i] if isinstance(x, _Arg) else x for x in self.pargs] + args[self.maxi+1:]
–> 533 return self.fn(*fargs, **kwargs)
534
535 # Cell

~/miniconda3/envs/venv37/lib/python3.7/site-packages/fastcore/basics.py in _inner(x, *args, **kwargs)
551 if order is not None: funcs = sorted_ex(funcs, key=order)
552 def _inner(x, *args, **kwargs):
–> 553 for f in funcs: x = f(x, *args, **kwargs)
554 return x
555 return _inner

~/miniconda3/envs/venv37/lib/python3.7/site-packages/fastai/data/core.py in decode(self, o, full)
320 def iter(self): return (self[i] for i in range(len(self)))
321 def repr(self): return coll_repr(self)
–> 322 def decode(self, o, full=True): return tuple(tl.decode(o_, full=full) for o_,tl in zip(o,tuplify(self.tls, match=o)))
323 def subset(self, i): return type(self)(tls=L(tl.subset(i) for tl in self.tls), n_inp=self.n_inp)
324 def _new(self, items, *args, **kwargs): return super()._new(items, tfms=self.tfms, do_setup=False, **kwargs)

~/miniconda3/envs/venv37/lib/python3.7/site-packages/fastai/data/core.py in (.0)
320 def iter(self): return (self[i] for i in range(len(self)))
321 def repr(self): return coll_repr(self)
–> 322 def decode(self, o, full=True): return tuple(tl.decode(o_, full=full) for o_,tl in zip(o,tuplify(self.tls, match=o)))
323 def subset(self, i): return type(self)(tls=L(tl.subset(i) for tl in self.tls), n_inp=self.n_inp)
324 def _new(self, items, *args, **kwargs): return super()._new(items, tfms=self.tfms, do_setup=False, **kwargs)

~/miniconda3/envs/venv37/lib/python3.7/site-packages/fastai/data/core.py in decode(self, o, **kwargs)
244 def iter(self): return (self[i] for i in range(len(self)))
245 def show(self, o, **kwargs): return self.tfms.show(o, **kwargs)
–> 246 def decode(self, o, **kwargs): return self.tfms.decode(o, **kwargs)
247 def call(self, o, **kwargs): return self.tfms.call(o, **kwargs)
248 def overlapping_splits(self): return L(Counter(self.splits.concat()).values()).filter(gt(1))

~/miniconda3/envs/venv37/lib/python3.7/site-packages/fastcore/transform.py in decode(self, o, full)
204
205 def decode (self, o, full=True):
–> 206 if full: return compose_tfms(o, tfms=self.fs, is_enc=False, reverse=True, split_idx=self.split_idx)
207 #Not full means we decode up to the point the item knows how to show itself.
208 for f in reversed(self.fs):

~/miniconda3/envs/venv37/lib/python3.7/site-packages/fastcore/transform.py in compose_tfms(x, tfms, is_enc, reverse, **kwargs)
148 for f in tfms:
149 if not is_enc: f = f.decode
–> 150 x = f(x, **kwargs)
151 return x
152

~/miniconda3/envs/venv37/lib/python3.7/site-packages/fastcore/transform.py in decode(self, x, **kwargs)
72 def name(self): return getattr(self, ‘_name’, _get_name(self))
73 def call(self, x, **kwargs): return self._call(‘encodes’, x, **kwargs)
—> 74 def decode (self, x, **kwargs): return self._call(‘decodes’, x, **kwargs)
75 def repr(self): return f’{self.name}:\nencodes: {self.encodes}decodes: {self.decodes}’
76

~/miniconda3/envs/venv37/lib/python3.7/site-packages/fastcore/transform.py in _call(self, fn, x, split_idx, **kwargs)
81 def _call(self, fn, x, split_idx=None, **kwargs):
82 if split_idx!=self.split_idx and self.split_idx is not None: return x
—> 83 return self._do_call(getattr(self, fn), x, **kwargs)
84
85 def _do_call(self, f, x, **kwargs):

~/miniconda3/envs/venv37/lib/python3.7/site-packages/fastcore/transform.py in do_call(self, f, x, **kwargs)
87 if f is None: return x
88 ret = f.returns_none(x) if hasattr(f,‘returns_none’) else None
—> 89 return retain_type(f(x, **kwargs), x, ret)
90 res = tuple(self.do_call(f, x, **kwargs) for x
in x)
91 return retain_type(res, x)

~/miniconda3/envs/venv37/lib/python3.7/site-packages/fastcore/dispatch.py in call(self, *args, **kwargs)
127 elif self.inst is not None: f = MethodType(f, self.inst)
128 elif self.owner is not None: f = MethodType(f, self.owner)
–> 129 return f(*args, **kwargs)
130
131 def get(self, inst, owner):

~/miniconda3/envs/venv37/lib/python3.7/site-packages/fastai/data/transforms.py in decodes(self, o)
243 except KeyError as e:
244 raise KeyError(f"Label ‘{o}’ was not included in the training dataset") from e
–> 245 def decodes(self, o): return Category (self.vocab [o])
246
247 # Cell

~/miniconda3/envs/venv37/lib/python3.7/site-packages/fastcore/foundation.py in getitem(self, k)
151 def init(self, items): self.items = items
152 def len(self): return len(self.items)
–> 153 def getitem(self, k): return self.items[list(k) if isinstance(k,CollBase) else k]
154 def setitem(self, k, v): self.items[list(k) if isinstance(k,CollBase) else k] = v
155 def delitem(self, i): del(self.items[i])

~/miniconda3/envs/venv37/lib/python3.7/site-packages/fastcore/foundation.py in getitem(self, idx)
181 def _xtra(self): return None
182 def _new(self, items, *args, **kwargs): return type(self)(items, *args, use_list=None, **kwargs)
–> 183 def getitem(self, idx): return self._get(idx) if is_indexer(idx) else L(self._get(idx), use_list=None)
184 def copy(self): return self._new(self.items.copy())
185

~/miniconda3/envs/venv37/lib/python3.7/site-packages/fastcore/foundation.py in get(self, i)
189 return (self.items.iloc[list(i)] if hasattr(self.items,‘iloc’)
190 else self.items.array()[(i,)] if hasattr(self.items,‘array’)
–> 191 else [self.items[i_] for i
in i])
192
193 def setitem(self, idx, o):

~/miniconda3/envs/venv37/lib/python3.7/site-packages/fastcore/foundation.py in (.0)
189 return (self.items.iloc[list(i)] if hasattr(self.items,‘iloc’)
190 else self.items.array()[(i,)] if hasattr(self.items,‘array’)
–> 191 else [self.items[i_] for i_ in i])
192
193 def setitem(self, idx, o):

IndexError: list index out of range