How to start with monailabel for new models

I was able to install on Windows 10 by more or less following the installation instructions at
https://docs.monai.io/projects/label/en/latest/installation.html

with the following modifications:

# From an "Anaconda Prompt" console window
# Create conda environment named "monaiweekly"
conda create --name monaiweekly python=3.9
conda activate monaiweekly
# Follow install process steps from monailabel website
python -m pip install --upgrade pip setuptools wheel
pip install torch==1.9.0+cu111 torchvision==0.10.0+cu111 torchaudio===0.9.0 -f https://download.pytorch.org/whl/torch_stable.html
python -c "import torch; print(torch.cuda.is_available())" 
# ^^ above line should return true ^^
# Install monailabel
pip install monailabel-weekly 
# "pip install monailabel" failed due to SimpleCRF error, fixed in weekly
# Download radiology app for monailabel
monailabel apps --download --name radiology --output apps 
# Download sample data set (~27 GB, FYI)
monailabel datasets --download --name Task03_Liver --output datasets  
# Start monailabel server
monailabel start_server --app apps/radiology --studies datasets/Task03_Liver/imagesTr --conf models deepedit

Initially, I had some problems due, I think, to having installed previous versions of torch, monailabel, or some combination of the two, but these were resolved when I uninstalled the old versions and then reinstalled the new versions in this new clean conda environment.

In Slicer, I got the MONAILabel extension and restarted Slicer, then was able to connect to the locally running server (by just pressing the fetch/refresh button on the MONAI Label server line of the MONAILabel module in Slicer) . I think an initial image volume from the liver data set was automatically loaded when I connected to the server, but if not, one was loaded when I hit the Next Sample button.

So far, so good. For the next steps, I got a little lost in how things were supposed to work. I have not been able to get a liver segmentation model working yet, but now that I think all the back end stuff is working, I am going to reread this thread and other similar ones to see if I can figure out how to do what I want. For reference, I have a dataset of 20 liver segmentations with corresponding images as a starting point as well as some more images without segmentations which I would like to begin to segment using MONAILabel, then refine those segmentations and contribute back to improve the training of the model. I think this is exactly what MONAILabel is supposed to be for, but there is very very limited documentation, so it is not at all clear how to actually do this. If I figure it out, I’ll post back here, and if I can’t figure it out I will share the sticking points.

3 Likes

In case anyone on this thread didn’t know, the upcoming virtual Project Week June 27-July 1 2022 will be a good opportunity to work together on issues like this. There will also be another MONIA Label tutorial/workshop on June 22 9-11 EDT that you can sign up for with this form.

1 Like

To train a new model first organize your data.

  1. Create a folder (e.g., myMonai) and put all your volumes in there.
  2. Within this folder create a labels/original and a labels/final subfolder
  3. Put all your existing labelsmap (you need to export your segmentation as labelmaps) into labels/final folder

Next step is to edit the segmentation script in the apps folder to match your labels as well as modify the UNET resolution. FOr example I have been working with the multilabel app, and I edited the main.py so to reflect my labelIDs, and the resolution/spacing I wanted to use:

class MyApp(MONAILabelApp):
    def __init__(self, app_dir, studies, conf):

        # Zero values are reserved to background. Non zero values are for the labels
        self.label_names = {
            "interparietal": 5,
            "nasal": 6,
            "maxilla_R": 7,
            "molars_R": 8,
            "incisors": 9,
            "premaxilla": 10,
            "palatine_R": 11,
            "jugal_R": 12,
            "squamosal_R": 13,
            "occipital": 14,
            "parietal_R": 15,
            "frontal_R": 16,
            "basisphenoid": 17,
            "presphenoid": 20,
            "background": 0,
        }

        network = conf.get("network", "dynunet")

        # Use Heuristic Planner to determine target spacing and spatial size based on dataset+gpu
        spatial_size = json.loads(conf.get("spatial_size", "[192, 192, 192]"))
        target_spacing = json.loads(conf.get("target_spacing", "[1.09, 1.55, 0.71]"))

After this, fire up the moniaLabel server with these option (obviously you need to modify these to match your app name as well as specific folder structure)

monailabel start_server --app /workspace/apps/skullModel --studies ~myMonai

If you can successfully connect to the server with your Slicer MonaiLabel client, all you have left to train the model is to hit the train button and wait a few hours to see the accuracy increasing. I have trained the models for about couple days (~50000 iterations or so), that worked quite well… There are also other training options you want to explore (such as how you want to split your data into training/test/validation etc). But this should get you started with “a model”.

Once you get an ok model and you are ready to use it in new volumes that do not have segmentations, all you have to is to copy those volumes to the top level of the myMonai folder, and restart the monaiLabel server. Server will detect these new samples, and in the Slicer if you hit the Next Sample button it will automatically process them. If you like the segmentation, you can hit the upload label button to send it to the MonaiLabel server, and after a few more samples like that you can hit the train button again.

So far I only used the multiLabel deepedit app, so I am not sure how much of this carries over to other apps that are distributed with monaiLabel, but hopefully this will help you some…

4 Likes

Thanks so much for all of these details, @muratmaga! One thing I wondered about was since I am starting on just a single label, is there a pretrained model that I can start from? I read in @mangotee 's comment above that it sounds like this might be both possible and more quickly effective than training a new model from scratch. Back then (about 6 months ago), it sounds like there was more of a distinction between single label and multilabel models, and that the approach has become more unified since then. I understand that pretrained models are structured for a particular number of output labels, and that changing the number or labels means that a model needs to be trained from scratch. However, I also understand that when possible, transfer learning, where a model pre-trained on one task undergoes subsequent training to adapt it to another somewhat similar task, often works quite well. So, that’s why I’m interested in whether there is a way to start from some other single label model trained on another task (e.g. spleen segmentation). I am also interested in multilabel segmentations, so I will certainly also use the tips about starting from scratch in the future. Thanks!

4 Likes

corresponds to a labelmap color or labelmap value?
My inputs are segmentations - where would I encode the “5”?

I press the train button with my 67 lung datasets, but this takes only 10 minutes, accuracy increases but results are not good.
How do you train for hours or days ?

1 Like

They are the labelmap value. When you export the segmentation to labelmaps from the segmentation module, you can check what the assigned labelID to that segmentation. It should be consistent in all your samples.

The volume size as well as the UNET spatial size will defined for the segmentation model will determine how fast your training would go. In the end, I had about 70 full segmented volumes (they are about 400x600x300), and each labepmap had 50+ structures. The Unet I trained had the spatial size of 192x192x192 (I think originally deep edit was only something like 48x48x32). So it took a few days.

3 Likes

Thanks all for participating in this thread. This is a great conversation.
I haven’t replied to your comments as I just came back from a long weekend.

I’ll try to address the questions/comments.

Regarding this:

corresponds to a labelmap color or labelmap value?
My inputs are segmentations - where would I encode the “5”?

As @muratmaga suggested, the user should make sure that segments/labels consistently use the same number for each segment in all volumes.

It seems that Slicer assigns different numbering to each segment. We found that issue when working on teeth segmentation: NA-MIC Project Weeks | Website for NA-MIC Project Weeks

As there are several ways/software to create labels (i.e. 3D Slicer, ITK-SNAP, etc), having a standard is not easy. @lassoan opened an issue here to see whether we can address that.

There is another conversation about this here.

Regarding this:

I press the train button with my 67 lung datasets, but this takes only 10 minutes, accuracy increases but results are not good.
How do you train for hours or days ?

This is a good question @rbumm. This depends on many factors: number of volumes segmented, number of epochs, the difficulty of the segmentation, etc

There could also be the problem of having inconsistent numbering for the manual segmentations. I’d check whether that is the case. For this, I use ITK-SNAP or Python.

Regarding this:


Back then (about 6 months ago), it sounds like there was more of a distinction between single label and
 multilabel models, and that the approach has become more unified since then. I understand that 
pretrained models are structured for a particular number of output labels, and that changing the number 
or labels means that a model needs to be trained from scratch. However, I also understand that when 
possible, transfer learning, where a model pre-trained on one task undergoes subsequent training to 
adapt it to another somewhat similar task, often works quite well.

Thanks, @mikebind.
MONAI Label has changed a lot in the last weeks. We’re trying to make it as easy to use as possible. One of the things that we’ve updated is single and multiple label segmentation - they are now a single model that can work for both tasks.

Depending on the number of labels, you should first define the label names and numbering here: MONAILabel/deepedit.py at main · Project-MONAI/MONAILabel · GitHub

Then, deactivate the downloading of the pretrained model here: MONAILabel/deepedit.py at main · Project-MONAI/MONAILabel · GitHub

Regarding transfer learning, you can easily get a pretrained model with MONAI Label using one of the available datasets here and then adjusted to the task you’re interested.

We agree the documentation needs more work. For this, we’re working on a MONAI Label tutorial that shows all the basic stuff. We’re creating short videos like this one: train-from-scratch.mp4 - Google Drive

Please let me know if there is I missed here.

Thanks again!!

3 Likes

I tried to get started with training from scratch and training began, but failed with a GPU memory error:

[2022-06-06 15:19:24,930] [33996] [MainThread] [INFO] (monailabel.tasks.train.basic_train:591) - 0 - Load Path C:\Users\mikeb\apps\radiology\model\pretrained_deepedit_dynunet.pt
Loading dataset:   0%|          | 0/15 [00:00<?, ?it/s]
Loading dataset:   7%|6         | 1/15 [00:01<00:26,  1.90s/it]
Loading dataset:  13%|#3        | 2/15 [00:04<00:30,  2.31s/it]
Loading dataset:  20%|##        | 3/15 [00:07<00:32,  2.67s/it]
Loading dataset:  27%|##6       | 4/15 [00:08<00:23,  2.13s/it]
Loading dataset:  33%|###3      | 5/15 [00:11<00:22,  2.25s/it]
Loading dataset:  40%|####      | 6/15 [00:12<00:18,  2.04s/it]
Loading dataset:  47%|####6     | 7/15 [00:15<00:16,  2.10s/it]
Loading dataset:  53%|#####3    | 8/15 [00:17<00:14,  2.01s/it]
Loading dataset:  60%|######    | 9/15 [00:18<00:11,  1.89s/it]
Loading dataset:  67%|######6   | 10/15 [00:20<00:09,  1.86s/it]
Loading dataset:  73%|#######3  | 11/15 [00:22<00:07,  1.88s/it]
Loading dataset:  80%|########  | 12/15 [00:26<00:07,  2.54s/it]
Loading dataset:  87%|########6 | 13/15 [00:28<00:04,  2.31s/it]
Loading dataset:  93%|#########3| 14/15 [00:29<00:02,  2.14s/it]
Loading dataset: 100%|##########| 15/15 [00:31<00:00,  2.09s/it]
Loading dataset: 100%|##########| 15/15 [00:31<00:00,  2.13s/it]
[2022-06-06 15:19:56,846] [33996] [MainThread] [INFO] (monailabel.tasks.train.basic_train:227) - 0 - Records for Training: 15
[2022-06-06 15:19:56,850] [33996] [MainThread] [INFO] (ignite.engine.engine.SupervisedTrainer:696) - Engine run resuming from iteration 0, epoch 0 until 50 epochs
[2022-06-06 15:19:57,257] [33996] [MainThread] [INFO] (ignite.engine.engine.SupervisedTrainer:138) - Restored all variables from C:\Users\mikeb\apps\radiology\model\pretrained_deepedit_dynunet.pt
2022-06-06 15:20:00,406 - INFO - Number of simulated clicks: 6
[2022-06-06 15:20:04,627] [33996] [MainThread] [INFO] (ignite.engine.engine.SupervisedTrainer:269) - Epoch: 1/50, Iter: 1/15 -- train_loss: 1.7812
[2022-06-06 15:20:05,039] [33996] [MainThread] [ERROR] (ignite.engine.engine.SupervisedTrainer:853) - Current run is terminating due to exception: CUDA out of memory. Tried to allocate 128.00 MiB (GPU 0; 4.00 GiB total capacity; 2.68 GiB already allocated; 0 bytes free; 2.93 GiB reserved in total by PyTorch)
[2022-06-06 15:20:05,040] [33996] [MainThread] [ERROR] (ignite.engine.engine.SupervisedTrainer:178) - Exception: CUDA out of memory. Tried to allocate 128.00 MiB (GPU 0; 4.00 GiB total capacity; 2.68 GiB already allocated; 0 bytes free; 2.93 GiB reserved in total by PyTorch)

Here is the command used to start the server:

monailabel start_server --app apps/radiology --studies datasets/liver_test_from_scratch/ --conf models deepedit --conf use_pretrained_model false --conf heuristic_planner true

Also, despite the use_pretrained_model false, inference seems to be using a pretrained model (I get a spleen segmentation when I press Next Sample, which must be coming from a pretrained model). I tried the heuristic_planner true option because it sounded like this would choose an appropriate image grid size/spacing to use for training, based on the available GPU memory.

However, I see this section in the output:

[2022-06-06 15:19:14,021] [33996] [MainThread] [INFO] (monailabel.utils.others.generic:147) - Using nvidia-smi command
[2022-06-06 15:19:14,345] [33996] [MainThread] [INFO] (monailabel.utils.others.planner:71) - Available GPU memory: {0: 2100} in MB
[2022-06-06 15:19:14,345] [33996] [MainThread] [INFO] (monailabel.utils.others.generic:147) - Using nvidia-smi command
[2022-06-06 15:19:14,393] [33996] [MainThread] [INFO] (monailabel.utils.others.planner:75) - Spacing: [1. 1. 2.]; Spatial Size: [1, 1, 256]

I see the default spatial size is [48,48,32], which makes me wonder if [1,1,256], presumably generated by the heuristics planner, is reasonable.

I am encouraged that training began (and that epoch 0 may have finished?), but am not sure how to go about troubleshooting this GPU memory error. I have an NVIDIA GeForce GTX 1050 Ti with Max-Q with 4 GB of memory on the GPU. If this is far too low specs for a segmentation problem like this, what would be a reasonable size down-sampled image volume I could try which would be able to run?

2 Likes

Thanks, @mikebind.

My reply inline:

Also, despite the ‘use_pretrained_model false’, inference seems to be using a pretrained model (I get a spleen segmentation when I press Next Sample, which must be coming from a pretrained model).

This could be because there is a .pt file downloaded in the model folder. Please make sure there is nothing in there.

I tried the ‘heuristic_planner true’ option because it sounded like this would choose an appropriate image grid size/spacing to use for training, based on the available GPU memory.

That’s right. It selects the image size based on the available GPU. From what you’ve shared, the actual available GPU is 2100 MB:

Available GPU memory: {0: 2100} in MB

I see the default spatial size is [48,48,32], which makes me wonder if [1,1,256], presumably generated by the heuristics planner, is reasonable.

Yes, [1, 1, 256] is what the heuristic planner recommends. However, this spatial size isn’t reasonable :confused:

I have an NVIDIA GeForce GTX 1050 Ti with Max-Q with 4 GB of memory on the GPU. If this is far too low specs for a segmentation problem like this, what would be a reasonable size down-sampled image volume I could try which would be able to run?

As I mentioned before, the actual GPU memory available is 2100 MB. MONAI Label could train a model with a minimum ~3200 MB of memory and on an image size of [64, 64, 32]. However, this size could be too small for some segmentation tasks.

Then, my suggestion is to try the Segmentation model instead. Different to DeepEdit model, the Segmentation model works on patches instead of the whole volume.

For the Segmentation model, you should first update the label name here, change these values to (32, 32, 32) and then run the following command:

monailabel start_server --app apps/radiology --studies datasets/liver_test_from_scratch/ --conf models segmentation --conf use_pretrained_model false

Hope the patch size fits into 2100 MB. You could also try reducing the network size here

Please keep us posted.

2 Likes

Thank you @diazandr3s! I have taken your suggestions to use the segmentation model instead of deepedit and changed the spatial size to (32,32,32) and was able to successfully train a model through 50 epochs with a reported accuracy of 91%. This created segmentation.pt in apps/radiology/model/. However, I now get Failed to run inference in MONAI Label Server errors when trying to load a new image volume using “Next Sample”. When this failed, I tried closing out Slicer and shutting down the monailabel server and restarting them (because I had changed a file name and thought that the problem might have been due to a cached list of file names). I copied the full output of the monailabel server into this gist: Troubleshooting output of monailabel when inference failed · GitHub
That seems like it might be complaining about using .nii.gz extension instead of .seg.nrrd for multichannel 4D label, but I’m not sure whether this actually is relevant or not. I am using a single label, and it trained fine using .nii.gz label image volumes. The “Result File” listed at the end is not present in the listed AppData/Local/Temp/ folder, but I’m not sure whether this is because it was never generated or because it was temporary and was cleaned up. The log for the associated Slicer session is available at this gist: Slicer error/info log associated with failed MONAILabel inference · GitHub

My interpretation is that something went wrong when generating the inference segmentation, but I don’t see a clear error message indicating where things went wrong. The monailabel sever seems to report that it created a temporary nii.gz file which I assume is the inferred segmentation volume, but Slicer seems to report 404 errors when trying to retrieve the inferred volume from the server (I assume the “original” tag for labels is the inferred one? whereas the “final” tag for labels is the gold-standard one for model performance evaluation).

Thanks everyone for the help so far! Any suggestions about how to troubleshoot this error?

3 Likes

Maybe the tags are not correct

Glad to hear you’ve trained a model, @mikebind. Thanks for sharing your experience.
Regarding your questions/comments:

However, I now get `Failed to run inference in MONAI Label Server` errors when trying 
to load a new image volume using “Next Sample”.

This is a bit strange :confused:
Are you using the latest Slicer version? (i.e. 5.X.X)
From what I can see in the logs, inference ran fine and the prediction has been created.

[2022-06-06 22:24:24,386] [13192] [MainThread] [INFO] (monailabel.interfaces.tasks.infer:294) - ++ Latencies => Total: 39.8244; Pre: 9.6867; Inferer: 7.8800; Invert: 0.0000; Post: 1.8089; Write: 19.5964

[2022-06-06 22:24:24,386] [13192] [MainThread] [INFO] (monailabel.interfaces.tasks.infer:318) - Result File: C:\Users\mikeb\AppData\Local\Temp\tmpz1nqaonu.nii.gz

[2022-06-06 22:24:24,388] [13192] [MainThread] [INFO] (monailabel.interfaces.tasks.infer:319) - Result Json Keys: ['label_names', 'latencies']

Regarding this:

That seems like it might be complaining about using .nii.gz extension instead of .seg.nrrd for multichannel 4D label, but I’m not sure whether this actually is relevant or not.

That’s just a warning. It is not causing any issue :slight_smile:

The “Result File” listed at the end is not present in the listed AppData/Local/Temp/ folder, but I’m not sure whether this is because it was never generated or because it was temporary and was cleaned up.

Exactly, the temp (C:\Users\mikeb\AppData\Local\Temp\) is created and cleaned up after Slicer reads it.

My interpretation is that something went wrong when generating the inference segmentation, but I don’t see a clear error message indicating where things went wrong.

I don’t see errors in the logs. Inference went well

The monailabel sever seems to report that it created a temporary nii.gz file which I assume is the inferred segmentation volume, but Slicer seems to report 404 errors when trying to retrieve the inferred volume from the server

Please try the latest Slicer version and let us know

(I assume the “original” tag for labels is the inferred one? whereas the “final” tag for labels is the gold-standard one for model performance evaluation).

That’s right, final tag is used for ground-truth and original for model prediction.

There is another way of checking that inference is running well. For this, do batch inference from the browser and check the generated files in original folder. In this video, I show how you can do that using the segmentation model. It takes a bit more time than usual to perform inference as the liver images I used for the video are quite big.

Hope that helps,

2 Likes

Yes, I am using a very recent Slicer (5.1.0-2022-06-01), downloaded at the same time as I got the weekly MONAILabel. @diazandr3s, I followed your video using the same monailabel server I had been using, and the inference ran successfully and created an image volume in the labels/original subfolder.
I tried to get this to load in Slicer by using the “Tools” → “Import label” function of the MONAILabel extension in Slicer, but got the following error:

Traceback (most recent call last):
  File "C:/Users/mikeb/AppData/Local/NA-MIC/Slicer 5.1.0-2022-06-01/NA-MIC/Extensions-30987/MONAILabel/lib/Slicer-5.1/qt-scripted-modules/MONAILabel.py", line 1360, in onImportLabel
    self.updateSegmentationMask(self.ui.labelPathLineEdit.currentPath, self.info["labels"])
  File "C:/Users/mikeb/AppData/Local/NA-MIC/Slicer 5.1.0-2022-06-01/NA-MIC/Extensions-30987/MONAILabel/lib/Slicer-5.1/qt-scripted-modules/MONAILabel.py", line 1658, in updateSegmentationMask
    labelImage = sitk.ReadImage(in_file)
  File "C:\Users\mikeb\AppData\Local\NA-MIC\Slicer 5.1.0-2022-06-01\lib\Python\lib\site-packages\simpleitk-2.2.0rc2.post15-py3.9-win-amd64.egg\SimpleITK\extra.py", line 357, in ReadImage
    return reader.Execute()
  File "C:\Users\mikeb\AppData\Local\NA-MIC\Slicer 5.1.0-2022-06-01\lib\Python\lib\site-packages\simpleitk-2.2.0rc2.post15-py3.9-win-amd64.egg\SimpleITK\SimpleITK.py", line 8126, in Execute
    return _SimpleITK.ImageFileReader_Execute(self)
RuntimeError: Exception thrown in SimpleITK ImageFileReader_Execute: D:\D\P\S-0-build\SimpleITK\Code\IO\src\sitkImageReaderBase.cxx:105:
sitk::ERROR: Unable to determine ImageIO reader for "C:/Users/mikeb/datasets/liver_test_from_scratch/labels/original/test_ircad_e20_liver.nii.gz"

A separate Slicer instance also cannot open this file. When I tried to take a look at the nifti header information by un-gzipping the file using 7zip, 7zip reports that it is not a gzipped file. If I take a look at the original file with Notepad++, I can see that it is actually an NRRD file created by pynrrd, not a nii.gz file. So, it appears that perhaps monailabel created an NRRD label file, but because the source image was named with an nii.gz extension the created file was given the same name, creating a mismatch between the extension and the actual file type. If I change the extension to .seg.nrrd, then Slicer can load it. If I change the extension to .nrrd, Slicer complains that it has 2 components when only 1 is allowed (sizes in the header is 2 512 512 225, though there is only one segment)

Do I need to change the monailabel configuration in some way to fix or compensate for the mismatch between input and output formats here?

2 Likes

Thanks for the detailed info, @mikebind.

Last week I fixed an issue similar to/related to this one.

Let’s make sure you don’t have a weekly version that still has that issue.

Please check that the infer transforms in the segmentation model are exactly like these ones: MONAILabel/segmentation.py at main · Project-MONAI/MONAILabel · GitHub

If they’re not, that’s the issue. Changed those, remove the original folder and run inference again.

Please let us know.

2 Likes

Yes, that fixed the issue! I was able to re-run the inference successfully and get a segmentation. I was able to edit that segmentation using scribbles and segment editor tools and submit the new label. I ran the training again and that also completed successfully and increased the overall accuracy to 95%. Thanks so much for your quick help!!

4 Likes

Superb! Glad to hear this :slight_smile:
Thanks for letting us know, @mikebind

2 Likes

How did you re-run the inference @mikebind?

1 Like

Still not clear to me how the user should do this. Would be great if you could post your workflow on how to check/modify the “segment number”. You do not mean number of segments? It is clear that we should use always use the same segment count and should not modify the segment order or names.

2 Likes

This is a great question, @rbumm

I meant the number associated with each segment/label, not the number of segments. The number of segments you define or know when you start (i.e. only liver or lungs + airways, etc).

There is no single way of verifying this and it is not easy to thoroughly check all labels.

I see there are ‘label sources’:

1/ User has the segmentations already created

This case covers the use of publicly available datasets such as Medical Segmentation Decathlon, BTCV, or labels created by a different software than 3D Slicer

2/ User manually creates the labels using Slicer

3/ User creates more labels using MONAI Label + manual tools in 3D Slicer

The way I quickly verify this is by using:

1/ A Python algorithm that reads and lists the unique values in the label files, AND
2/ Use ITK-SNAP to check that a certain organ has the same value in different images

This is how I discover that teeth labels (NA-MIC Project Weeks | Website for NA-MIC Project Weeks) were not consistently segmented using the same number.

Here is a short video showing how I checked the label numbers in ITK-SNAP.

There should be a more efficient way of checking this.

I think the most important thing here is to make sure we consistently annotate the volumes in the first place.

Hope this helps. Please let me know.

3 Likes

Before starting, I deleted all the previously created label images in the labels/original/ folder (in my case this was just one image because I only had one unlabeled image I had added so far). To re-run the inference, I used the web browser interface to the server by going to http://127.0.0.1:8000/ in the browser URL bar.

I clicked on the
image
line, clicked on “Try it out”, and filled out “segmentation” as the model (because the server I started is using the “segmentation” rather than “deepedit” model, and then selected “unlabeled” to run inference on just all unlabeled images from the source folder (which, for me, was again just one image), and then clicked “Execute”.

I got this procedure from following along on this video that @diazandr3s shared above: batch-inference.mp4 - Google Drive

2 Likes