{ "cells": [ { "cell_type": "markdown", "id": "2c22cc5b", "metadata": {}, "source": [ "# Classification of table rows with custom measurements\n", "This notebook demonstrates using the apoc `TableRowClasifer`" ] }, { "cell_type": "code", "execution_count": 1, "id": "501dff50", "metadata": {}, "outputs": [], "source": [ "import apoc\n", "import numpy as np\n", "from numpy.random import default_rng\n", "from skimage import draw\n", "from skimage.measure import regionprops_table\n", "import pyclesperanto_prototype as cle\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 2, "id": "736b80bb", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cle.select_device()" ] }, { "cell_type": "markdown", "id": "d1153cc8-d27f-4755-8bb1-d5c0108c4bd2", "metadata": {}, "source": [ "## Example data\n", "We start by setting up an image with circles and squares" ] }, { "cell_type": "code", "execution_count": 3, "id": "63b93049", "metadata": {}, "outputs": [], "source": [ "def get_square_indices(center_row, center_column, half_width=5):\n", " \"\"\"Get the indices to fill in a square\"\"\"\n", " start = np.array([center_row, center_column]) - half_width\n", " extent = (2 * half_width, 2 * half_width)\n", " return draw.rectangle(start, extent=extent)\n", "\n", "\n", "def get_circle_indices(center_row, center_column, half_width=5):\n", " \"\"\"Get the indices to fill in a circle\"\"\"\n", " center = (center_row, center_column)\n", " radius = half_width\n", " return draw.disk(center, radius)\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "6e127674", "metadata": {}, "outputs": [], "source": [ "# create a label image with randomly placed squares and circles\n", "rng = default_rng(42)\n", "\n", "label_image = np.zeros((200, 200), dtype=np.uint16)\n", "\n", "label_index = 1\n", "ground_truth = []\n", "for center_row in np.arange(10, 200, 20):\n", " for center_column in np.arange(10, 200, 20):\n", " shape_type = rng.choice([\"square\", \"circle\"])\n", " if shape_type == \"square\":\n", " shape_function = get_square_indices\n", " ground_truth.append(1)\n", " else:\n", " shape_function = get_circle_indices\n", " ground_truth.append(2)\n", " shape_rows, shape_columns = shape_function(center_row, center_column, half_width=5)\n", " \n", " label_image[shape_rows, shape_columns] = label_index\n", " \n", " label_index += 1\n", "\n", "ground_truth = np.asarray(ground_truth)" ] }, { "cell_type": "code", "execution_count": 5, "id": "aa84dfbf", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# view the label image\n", "cle.imshow(label_image, labels=True)" ] }, { "cell_type": "markdown", "id": "fc6f4fb1-a90a-4bf1-b1f8-14737a733bee", "metadata": {}, "source": [ "## Feature extraction\n", "We now set up a table of measurements. Here we use [scikit-image's regionprops_table](https://scikit-image.org/docs/dev/api/skimage.measure.html#skimage.measure.regionprops_table)." ] }, { "cell_type": "code", "execution_count": 6, "id": "5f6786bd", "metadata": {}, "outputs": [], "source": [ "# measure the using skimage's regionprops_table function\n", "measurement_table = regionprops_table(label_image, properties=(\"label\", \"area\", \"perimeter\", \"extent\", \"eccentricity\"))\n", "labels = measurement_table.pop(\"label\")" ] }, { "cell_type": "code", "execution_count": 7, "id": "3ab6c6db-eaee-484d-bee5-531696ca5b2e", "metadata": {}, "outputs": [], "source": [ "# extract the first 50 measurements to use as training\n", "measurements_training = {key: values[0:50] for key, values in measurement_table.items()}\n", "ground_truth_training = ground_truth[0:50]" ] }, { "cell_type": "markdown", "id": "7ce025f3-3b16-4cba-babf-06db52218c3f", "metadata": {}, "source": [ "## Classifier training\n", "We next train a `TableRowClassifier` and save it to a `.cl` file." ] }, { "cell_type": "code", "execution_count": 8, "id": "ea6ee569-d058-42f1-ac02-41c78e5ab3b2", "metadata": {}, "outputs": [], "source": [ "# create the classifier and train it\n", "cl_filename = \"shape_classifier.model.cl\"\n", "num_trees = 1000\n", "max_depth = 1\n", "\n", "apoc.erase_classifier(cl_filename)\n", "classifier = apoc.TableRowClassifier(cl_filename, num_ensembles=num_trees, max_depth=max_depth)\n", "classifier.train(measurements_training, ground_truth_training)" ] }, { "cell_type": "markdown", "id": "af795580-2074-4de2-beac-41926b774308", "metadata": {}, "source": [ "## Prediction\n", "Next, we use the classifier to generate a prediction and visualize it as parametric / classification label image." ] }, { "cell_type": "code", "execution_count": 9, "id": "d01400b8", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# predict on the full table\n", "prediction = classifier.predict(measurement_table)\n", "\n", "# prefix class==0 for the background (first entry, label=0)\n", "annotation = [0] + prediction.tolist()\n", "\n", "# create an image where the objects are colored by the predicted shape\n", "shape_image = cle.replace_intensities(label_image, annotation)\n", "\n", "cle.imshow(shape_image, labels=True, min_display_intensity=0)" ] }, { "cell_type": "markdown", "id": "1aa51355-a754-4a39-b2d9-6c20cd4e9db6", "metadata": {}, "source": [ "## Classifier statistics\n", "We can also visualize the share of the decision trees take a given parameter into account when making their decision. This allows us to differentiate parameters that are useful for making the classification from those which are not.\n", "\n", "Note: Multiple of these parameters may be correleated. If you enter 11 parameters, which all allow to make the classification similarly, but 10 of those are correlated, these 10 may appear with a share of about 0.05 while the 11th parameter has a share of 0.5. Thus, study these values with care." ] }, { "cell_type": "code", "execution_count": 10, "id": "3cecdedd-3dbd-4c91-8e5d-fa330f31f9bd", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
 0
area0.309000
perimeter0.331000
extent0.360000
eccentricity0.000000
\n" ], "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def colorize(styler):\n", " styler.background_gradient(axis=None, cmap=\"rainbow\")\n", " return styler\n", "\n", "shares, counts = classifier.statistics()\n", "df = pd.DataFrame(shares).T\n", "df.style.pipe(colorize)" ] }, { "cell_type": "code", "execution_count": 11, "id": "a787b899-cd6f-42eb-a36f-26cb01901cba", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
 0
area0.483000
perimeter0.517000
\n" ], "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "classifier.train(pd.DataFrame(measurements_training)[[\"area\", \"perimeter\"]], ground_truth_training)\n", "shares, counts = classifier.statistics()\n", "df = pd.DataFrame(shares).T\n", "df.style.pipe(colorize)" ] }, { "cell_type": "code", "execution_count": 12, "id": "ec742e51-f48c-4d2f-994f-02953ee5eac9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'area': 0.483, 'perimeter': 0.517}" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "classifier.feature_importances()" ] }, { "cell_type": "code", "execution_count": null, "id": "23347429-dd18-429c-b4bc-31befc0b20e2", "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.9.13" } }, "nbformat": 4, "nbformat_minor": 5 }