{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Digital Slide Archive (DSA) Visualization Tutorial" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Welcome to the Digial Slide Archive (DSA) visualization notebook! \n", "\n", "Digital Slide Archive (DSA) is a platform where you can manage your pathology images and annotations. A set of CLIs are available to help you convert your pathologist or model-generated annotations and push them to DSA. For more details on the DSA platform, please refer to their [documentation](https://digitalslidearchive.github.io/digital_slide_archive/documentation/).\n", "\n", "In this notebook, we will use **dsa_viz** and **dsa_upload** CLIs to convert your annotations to a DSA compatible format and to upload them to DSA. We support results from [Qupath/Stardist dectection models](https://github.com/msk-mind/docker/tree/master/qupath), tile scores in a tabular format, and also expert annotations in geojson format. Here are the steps we will review:\n", "\n", "- Setup DSA\n", "- DSA Visuzaliation CLIs\n", "- Upload Slidveiewer regional annotations\n", "- Upload Qupath regional annotation results\n", "- Upload a heatmap generated from tile scores\n", "- Upload bitmasks PNGs\n", "- Upload Stardist object detection results\n", "- Upload Stardist cell detection results\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Setup DSA" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Before running this notebook, make sure you have your pathology slides organized in DSA under a collection/folder.\n", "\n", "For one of our examples, we use an SVS image from TCGA. This image file in *tcga* collection, in *slides* folder on the DSA platform.\n", "\n", "![DSA Organization Screenshot](img/dsa-organization-screenshot.png)\n", "\n", "The collection name (e.g. tcga) and image file name (e.g. TCGA-GM-A2DB-01Z-00-DX1.9EE36AA6-2594-44C7-B05C-91A0AEC7E511.svs) on DSA will be used while uploading the annotations.\n", "\n", "Be sure to modify the configuration files based on your DSA setup." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## DSA Visualization CLIs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Luna-pathology offers 2 CLIs to help convert your annotation results to a DSA compatible json format and to upload them to DSA. The conversion and upload is divided in to 2 separate steps, so each step can be parallelized based on your computing capabilities and DSA platform setup. \n", "\n", "`dsa_viz` CLI takes two inputs, and generates a DSA compatible annotation json.\n", "- *source_type* - describes the data source\n", "- *data_config* - a file detailing the input, output and visualization details\n", "\n", "`dsa_upload` CLI takes two inputs, and uploads the DSA compatible annotation json.\n", "- *config* - a file with DSA instance information\n", "We use a DSA token to push annotations to the platform. Make sure this token is generated via the HistomicsUI API (/api/v1/token/current) for the user with edit permission on the slides. HistomicsUI is the high-magnification viewer part DSA platform.\n", "- *data_confi*g - a file specifying the path to the DSA compatible annotation json and the collection/image file name from DSA. \n", "\n", "Once upload is done, we print the link to HistomicsUI viewer, so you can easily navigate to the uploaded annotation result.\n", "\n", "*Note: Pushing and rendering a large number of annotation elements can take a long time. Please refer to DSA [documentation](https://digitalslidearchive.github.io/HistomicsTK/examples/tips_for_scalable_annotation_rendering), for user expectations and some tricks for managing annotations.*" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Usage: dsa_viz [OPTIONS]\n", "\n", " DSA annotation builder\n", "\n", "Options:\n", " -d, --data_config PATH path to data config file [required]\n", " -s, --source_type TEXT string describing data source that is to be\n", " transformed into a dsa json. supports\n", " stardist-polygon, stardist-cell, regional-polygon,\n", " qupath-polygon, bitmask-polygon, heatmap [required]\n", "\n", " --help Show this message and exit.\n" ] } ], "source": [ "!dsa_viz --help" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Usage: dsa_upload [OPTIONS]\n", "\n", " DSA Annotation Upload CLI\n", "\n", "Options:\n", " -c, --config PATH json including DSA host, port and token info\n", " [required]\n", "\n", " -d, --data_config PATH path to data config file [required]\n", " --help Show this message and exit.\n" ] } ], "source": [ "!dsa_upload --help" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Upload Slideviewer regional annotations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Regional annotations made by expert pathologists are stored in our databases in a GeoJSON format that is compatible with many downstream analysis tools.\n", "\n", "With **regional-polygon** option, we can convert the GeoJSON annotations to DSA json annotation format, and upload the annotation to the DSA platform." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# Path to regional annotation in GeoJSON format \n", "input: ./input/regional_annotation.json\n", "\n", "# image file name from DSA\n", "image_filename: 2551571.svs\n", " \n", "# path to write converted json annotations\n", "output_folder: ./dsa_annotations/\n", "\n", "# annotation name to be shown in DSA \n", "annotation_name: Regional Annotation\n", "\n", "# line and fill colors in label:rgb/a format\n", "line_colors:\n", " lympho_rich_tumor: rgb(0,191,255)\n", " lympho_poor_tumor: rgb(0,255,0)\n", " necrosis: rgb(255,255,0)\n", " lympho_rich_stroma: rgb(255,0,0)\n", " veins: rgb(0,255,255)\n", " adipocytes: rgb(0,0,255)\n", " qc_tissue_fold: rgb(0,0,0)\n", " \n", "fill_colors:\n", " lympho_rich_tumor: rgb(0,191,255,100)\n", " lympho_poor_tumor: rgb(0,255,0,100)\n", " necrosis: rgb(255,255,0,100)\n", " lympho_rich_stroma: rgb(255,0,0,100)\n", " veins: rgb(0,255,255,100)\n", " adipocytes: rgb(0,0,255,100)\n", " qc_tissue_fold: rgb(0,0,0,100)\n", "\n" ] } ], "source": [ "# example data_config\n", "!cat configs/dsa_configs/regional_config.yaml" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Building annotation for image: 2551571.svs\n", "Time to build annotation 0.0010259151458740234\n", "Annotation written to ./dsa_annotations/Regional_Annotation_2551571.json\n" ] } ], "source": [ "# generate DSA annotation\n", "!dsa_viz -s regional-polygon -d configs/dsa_configs/regional_config.yaml" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Successfully connected to DSA.\n", "collection_id_dict {'_accessLevel': 2, '_id': '60807410150bd39c9df579cf', '_modelType': 'collection', '_textScore': 15.75, 'created': '2021-04-21T18:50:56.730000+00:00', 'description': 'test images', 'meta': {}, 'name': 'test-path', 'public': True, 'publicFlags': [], 'size': 2350018806, 'updated': '2021-04-21T18:50:56.730000+00:00'}\n", "Collection test-path found with id: 60807410150bd39c9df579cf\n", "Annotation successfully pushed to DSA.\n", "Time to push annotation 0.020156383514404297\n", "http://localhost:8080/histomics#?image=610aedc9150bd39c9d7adadd\n" ] } ], "source": [ "# push annotation to DSA\n", "!dsa_upload -c dsa_configs/dsa_config.yaml -d configs/dsa_configs/regional_upload.yaml" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Upload a heatmap generated from tile scores" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**heatmap** option provides means to visualize your tile scores from your classification model.\n", "\n", "The input here is a CSV file with a column of (0, 1) range and the tile coordinates. In this example, we visualize the \"otsu_score\" column.\n", "\n", "We use the color palette \"viridis\" where the output color ranges from purple to yellow, for scores from 0 to 1." ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "address,coordinates,otsu_score,purple_score\n", "x1_y1_z10,\"(1, 1)\",0.03125,0.03125\n", "x1_y2_z10,\"(1, 2)\",0.0,0.0\n", "x1_y3_z10,\"(1, 3)\",0.0,0.0546875\n", "x1_y4_z10,\"(1, 4)\",0.0,0.0\n" ] } ], "source": [ "# example CSV\n", "!head -5 input/tile_scores_and_labels.csv" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# path to CSV containing tile coordinates and tile scores\n", "input: input/tile_scores_and_labels.csv\n", "\n", "# image file name from DSA\n", "image_filename: TCGA-GM-A2DB-01Z-00-DX1.9EE36AA6-2594-44C7-B05C-91A0AEC7E511.svs\n", "\n", "# path to write converted json annotations\n", "output_folder: ./dsa_annotations/\n", "\n", "# column in CSV with value range (0, 1)\n", "column: otsu_score\n", "\n", "# annotation name to be shown in DSA\n", "annotation_name: tile-based heatmap\n", "\n", "# size of the tiles\n", "tile_size: 128\n", "\n", "# scale to match the image on DSA\n", "scale_factor: 4\n", "\n" ] } ], "source": [ "# example data_config\n", "!cat configs/dsa_configs/heatmap_config.yaml" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Building annotation for image: TCGA-GM-A2DB-01Z-00-DX1.9EE36AA6-2594-44C7-B05C-91A0AEC7E511.svs\n", "Annotation written to ./dsa_annotations/otsu_score_tile-based_heatmap_TCGA-GM-A2DB-01Z-00-DX1.9EE36AA6-2594-44C7-B05C-91A0AEC7E511.json\n" ] } ], "source": [ "# generate DSA annotation\n", "!dsa_viz -s heatmap -d configs/dsa_configs/heatmap_config.yaml" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Usage: dsa_upload [OPTIONS]\n", "Try 'dsa_upload --help' for help.\n", "\n", "Error: Invalid value for '-c' / '--config': Path 'dsa_configs/dsa_config.yaml' does not exist.\n" ] } ], "source": [ "# push annotation to DSA\n", "!dsa_upload -c dsa_configs/dsa_config.yaml -d configs/dsa_configs/heatmap_upload.yaml" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Upload bitmasks PNGs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Simple PNG bitmasks can also be visualized in DSA. Use **bitmask-polygon** option and provide pngs with the corresponding labels." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# paths to bitmask png images in label:path format\n", "input:\n", " Tumor: /gpfs/mskmindhdp_emc/user/shared_data_folder/ov-mind-project/input/Tumor.png\n", " Fat: /gpfs/mskmindhdp_emc/user/shared_data_folder/ov-mind-project/input/Fat.png\n", " Necrosis: /gpfs/mskmindhdp_emc/user/shared_data_folder/ov-mind-project/input/Necrosis.png\n", " Stroma: /gpfs/mskmindhdp_emc/user/shared_data_folder/ov-mind-project/input/Stroma.png\n", "\n", "# image file name from DSA\n", "image_filename: HobI16-670289739721.svs\n", "\n", "# path to write converted json annotations\n", "output_folder: ./dsa_annotations/\n", "\n", "# annotation name to be shown in DSA\n", "annotation_name: Full Res Tile-Based Pixel Classifier Inference,\n", "\n", "# line and fill colors in label:rgb/a format\n", "line_colors:\n", " Stroma: rgb(0,191,255)\n", " Tumor: rgb(0,255,0)\n", " Fat: rgb(255,255,0)\n", " Necrosis: rgb(255,0,0)\n", "\n", "fill_colors:\n", " Stroma: rgba(0,191,255, 100)\n", " Tumor: rgba(0,255,0, 100)\n", " Fat: rgba(255,255,0, 100)\n", " Necrosis: rgba(255,0,0, 100)\n", "\n" ] } ], "source": [ "# example data_config\n", "!cat configs/dsa_configs/bitmask_polygon_config.yaml" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Building annotation for image: HobI16-670289739721.svs\n", "Time to build annotation 138.78823733329773\n", "Annotation written to ./dsa_annotations/Full_Res_Tile-Based_Pixel_Classifier_Inference_HobI16-670289739721.json\n" ] } ], "source": [ "# generate DSA annotation\n", "!dsa_viz -s bitmask-polygon -d configs/dsa_configs/bitmask_polygon_config.yaml" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Successfully connected to DSA.\n", "collection_id_dict {'_accessLevel': 2, '_id': '60807410150bd39c9df579cf', '_modelType': 'collection', '_textScore': 15.75, 'created': '2021-04-21T18:50:56.730000+00:00', 'description': 'test images', 'meta': {}, 'name': 'test-path', 'public': True, 'publicFlags': [], 'size': 936444465, 'updated': '2021-04-21T18:50:56.730000+00:00'}\n", "Collection test-path found with id: 60807410150bd39c9df579cf\n", "Annotation successfully pushed to DSA.\n", "Time to push annotation 0.11921572685241699\n", "http://localhost:8080/histomics#?image=60807ad8150bd39c9df579d2\n" ] } ], "source": [ "# push annotation to DSA\n", "!dsa_upload -c dsa_configs/dsa_config.yaml -d configs/dsa_configs/bitmask_upload.yaml" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Upload Qupath regional annotation results" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Regional annotations generated by [Qupath](https://qupath.github.io/) includes regional polygons from object detection along with nuclear properties.\n", "\n", "For object and cell detection models in QuPath, please checkout our [Qupath/Stardist docker](https://github.com/msk-mind/docker/tree/master/qupath)." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# path to geojson file generated by Qupath\n", "input: input/qupath_annotation_results.json\n", "\n", "# image file name from DSA\n", "image_filename: HobI20-681330526186.svs\n", "\n", "# path to write converted json annotations \n", "output_folder: ./dsa_annotations/\n", " \n", "# annotation name to be shown in DSA\n", "annotation_name: Qupath Pixel Classifier Polygons\n", "\n", "# labels to visualize\n", "classes_to_include:\n", "- Adipocytes\n", "- Stroma\n", "- Necrosis\n", "- Tumor\n", "- Other\n", " \n", "# line and fill colors in label:rgb/a format\n", "line_colors: \n", " Stroma: rgb(0, 191, 255)\n", " Tumor: rgb(0, 255, 0)\n", " Adipocytes: rgb(255, 255, 0)\n", " Necrosis: rgb(255, 0, 0)\n", "\n", "fill_colors:\n", " Stroma: rgba(0, 191, 255, 100)\n", " Tumor: rgba(0, 255, 0, 100)\n", " Adipocytes: rgba(255, 255, 0, 100)\n", " Necrosis: rgba(255, 0, 0, 100)\n", "\n" ] } ], "source": [ "# example data_config\n", "!cat configs/dsa_configs/qupath_config.yaml" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Building annotation for image: HobI20-681330526186.svs\n", "Time to build annotation 0.0030074119567871094\n", "Annotation written to ./dsa_annotations/Qupath_Pixel_Classifier_Polygons_HobI20-681330526186.json\n" ] } ], "source": [ "# generate DSA annotation\n", "!dsa_viz -s qupath-polygon -d configs/dsa_configs/qupath_config.yaml" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Successfully connected to DSA.\n", "collection_id_dict {'_accessLevel': 2, '_id': '60807410150bd39c9df579cf', '_modelType': 'collection', '_textScore': 15.75, 'created': '2021-04-21T18:50:56.730000+00:00', 'description': 'test images', 'meta': {}, 'name': 'test-path', 'public': True, 'publicFlags': [], 'size': 2350018806, 'updated': '2021-04-21T18:50:56.730000+00:00'}\n", "Collection test-path found with id: 60807410150bd39c9df579cf\n", "Annotation successfully pushed to DSA.\n", "Time to push annotation 0.0221097469329834\n", "http://localhost:8080/histomics#?image=60807ad8150bd39c9df579d2\n" ] } ], "source": [ "# push annotation to DSA\n", "!dsa_upload -c dsa_configs/dsa_config.yaml -d configs/dsa_configs/qupath_upload.yaml" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Upload Stardist object detection results" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Stardist is a nuclear segmentation algorithm that is quite capable in detecting and segmenting cells/nuclei in pathology images. **stardist-polygon** option converts Stardist object detection results as polygons capturing different types of cells.\n", "\n", "*Note: this command can take a few minutes if object detection is run on the whole slide.*" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# regional annotation in GeoJSON format generated by Stardist\n", "input: input/object_detection_results.geojson\n", "\n", "# image file name from DSA\n", "image_filename: HobI20-681330526186.svs\n", "\n", "# path to write converted json annotations \n", "output_folder: ./dsa_annotations/\n", " \n", "# annotation name to be shown in DSA\n", "annotation_name: StarDist Segmentations with Lymphocyte Classifications\n", " \n", "# line and fill colors in label:rgb/a format\n", "line_colors:\n", " Other: rgb(0, 255, 0)\n", " Lymphocyte: rgb(255, 0, 0)\n", "\n", "fill_colors:\n", " Other: rgba(0, 255, 0, 100)\n", " Lymphocyte: rgba(255, 0, 0, 100)\n", "\n" ] } ], "source": [ "# example data_config\n", "!cat configs/dsa_configs/stardist_polygon_config.yaml" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Building annotation for image: HobI20-681330526186.svs\n", "Time to build annotation 251.02770948410034\n", "Annotation written to ./dsa_annotations/StarDist_Segmentations_with_Lymphocyte_Classifications_HobI20-681330526186.json\n" ] } ], "source": [ "# generate DSA annotation\n", "!dsa_viz -s stardist-polygon -d configs/dsa_configs/stardist_polygon_config.yaml" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Successfully connected to DSA.\n", "collection_id_dict {'_accessLevel': 2, '_id': '60807410150bd39c9df579cf', '_modelType': 'collection', '_textScore': 15.75, 'created': '2021-04-21T18:50:56.730000+00:00', 'description': 'test images', 'meta': {}, 'name': 'test-path', 'public': True, 'publicFlags': [], 'size': 936444465, 'updated': '2021-04-21T18:50:56.730000+00:00'}\n", "Collection test-path found with id: 60807410150bd39c9df579cf\n", "Annotation successfully pushed to DSA.\n", "Time to push annotation 584.9241287708282\n", "http://localhost:8080/histomics#?image=60807ad8150bd39c9df579d2\n" ] } ], "source": [ "# push annotation to DSA\n", "!dsa_upload -c dsa_configs/dsa_config.yaml -d configs/dsa_configs/stardist_polygon_upload.yaml" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is a screenshot form HistomicsUI, the high-magnification viewer. You can zoom in and view your annotation results with the desired opacity. As specified in `dsa_configs/stardist_polygon_config.yaml`, the red objects are classified as lymphocytes and the green cells are \"other\" cells.\n", "\n", "![Stardist Polygon Screenshot](img/stardist-polygon-screenshot.png)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Upload Stardist cell detection results\n", "\n", "Here we use cellular detection results generated from Stardist. The x,y coordinates of the cells in the input TSV file will be visualized as a point, as opposed to a more complex polygon that we saw in the previous step with **stardist-polygon**. You'll notice that the point annotation is faster to upload compared to the polygon represenation of the cells.\n", "\n", "We also set fill color alpha value to 0 makes annotation upload faster." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# TSV with cell coordinates generated by Stardist \n", "input: input/object_detection_results.tsv\n", " \n", "# image file name from DSA\n", "image_filename: HobI20-681330526186.svs\n", "\n", "# path to write converted json annotations\n", "annotation_name: Points of Classsified StarDist Cells\n", "\n", "# annotation name to be shown in DSA \n", "output_folder: ./dsa_annotations/\n", " \n", "# line and fill colors in label:rgb/a format\n", "line_colors:\n", " Other: rgb(0, 255, 0)\n", " Lymphocyte: rgb(255, 0, 0)\n", "\n", "fill_colors:\n", " Other: rgba(0, 255, 0, 0)\n", " Lymphocyte: rgba(255, 0, 0, 0)\n", "\n" ] } ], "source": [ "# example data_config\n", "!cat configs/dsa_configs/stardist_cell_config.yaml" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Building annotation for image: HobI20-681330526186.svs\n", "Time to build annotation 90.03980946540833\n", "Annotation written to ./dsa_annotations/Points_of_Classsified_StarDist_Cells_HobI20-681330526186.json\n" ] } ], "source": [ "# generate DSA annotation\n", "!dsa_viz -s stardist-cell -d configs/dsa_configs/stardist_cell_config.yaml" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Successfully connected to DSA.\n", "collection_id_dict {'_accessLevel': 2, '_id': '60807410150bd39c9df579cf', '_modelType': 'collection', '_textScore': 15.75, 'created': '2021-04-21T18:50:56.730000+00:00', 'description': 'test images', 'meta': {}, 'name': 'test-path', 'public': True, 'publicFlags': [], 'size': 936444465, 'updated': '2021-04-21T18:50:56.730000+00:00'}\n", "Collection test-path found with id: 60807410150bd39c9df579cf\n", "Annotation successfully pushed to DSA.\n", "Time to push annotation 202.15096521377563\n", "http://localhost:8080/histomics#?image=60807ad8150bd39c9df579d2\n" ] } ], "source": [ "# push annotation to DSA\n", "!dsa_upload -c dsa_configs/dsa_config.yaml -d configs/dsa_configs/stardist_cell_upload.yaml" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Below is another screenshot from HistomicsUI, from the link printed above. The results are the same as **stardist-polygon** visualization. Notice the cells are captured more minimally as circles, and not polygons. For rapid prototyping, **stardist-cell** offers faster annotation upload speed compared to **stardist-polygon**.\n", "\n", "![Stardist Cell Screenshot](img/stardist-cell-screenshot.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Congratulations! Now you can visualize your annotations and results on DSA platform." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.9" } }, "nbformat": 4, "nbformat_minor": 4 }