Как получить прогноз по новым данным тестового изображения с помощью модели fastai2?

#machine-learning #computer-vision #fast-ai #unity3d-unet

Вопрос:

У меня есть приведенный ниже код для обучения модели и сохранения ее как model_7.pth с помощью fastai.

 from fastai import * from wwf.utils import state_versions state_versions(['fastai', 'fastcore', 'wwf'])   from fastai.vision.all import *   path = Path('data')    def n_codes(fnames, is_partial=True):  "Gather the codes from a list of `fnames`"  vals = set()  if is_partial:  random.shuffle(fnames)  fnames = fnames[:10]  for fname in fnames:  msk = np.array(PILMask.create(fname))  for val in np.unique(msk):  if val not in vals:  vals.add(val)  vals = list(vals)  p2c = dict()  for i,val in enumerate(vals):  p2c[i] = vals[i]  return p2c  p2c = n_codes(lbl_names)  def get_msk(fn, pix2class):  "Grab a mask from a `filename` and adjust the pixels based on `pix2class`"  #fn = path/'GT_png'/f'{fn.stem}_mask.png'  fn = path/f'trainval/train/tile/label/{fn.name}'  msk = np.array(PILMask.create(fn))  mx = np.max(msk)  for i, val in enumerate(p2c):  msk[msk==p2c[i]] = val  return PILMask.create(msk)  codes = ['Background', 'car']   get_y = lambda o: get_msk(o, p2c)  binary = DataBlock(blocks=(ImageBlock, MaskBlock(codes)),  get_items=get_image_files,  splitter=RandomSplitter(),  get_y=get_y,  item_tfms=Resize(224),  batch_tfms=[Normalize.from_stats(*imagenet_stats)])  dls = binary.dataloaders(path/'trainval/train/tile/label', bs=4, num_workers=0)#num_workers=0 to make it work in windows    dls.show_batch(cmap='Blues', vmin=0, vmax=1)   learn = unet_learner(dls, resnet34) learn.load(r'model_7')  learn.fit(n_epoch=8, cbs=SaveModelCallback(every_epoch=True))  

Теперь у меня есть папка с тестовым изображением под названием TEST_FOLDER.

Я попробовал приведенный ниже код.

 TEST_FOLDER = r"testtileimage" files = get_image_files(TEST_FOLDER)[:1] test_dl = learn.dls.test_dl(files) preds = learn.get_preds(dl=test_dl)  

но выходные данные имеют форму

 preds[0].shape Out[43]: torch.Size([1, 2, 224, 224])  

Я использую этот код, чтобы увидеть прогноз ожидаемого результата

 p = preds[0][0] plt.plot(p[0]) plt.savefig('myfig_p0')  

но я получаю изображение с 4 подзаголовками и не уверен, какая из них является предсказанной маской. Кроме того, нижнее левое изображение не соответствует входному изображению. введите описание изображения здесь

Вопрос

  1. Как я могу предсказать маску сегмента для каждого тестового изображения?
  2. Как получить пиксельную вероятность для каждого тестового изображения?