Skip to content

Instantly share code, notes, and snippets.

@chatchavan
Last active January 8, 2016 23:36
Show Gist options
  • Save chatchavan/e6ccad639b4fe28d2cf7 to your computer and use it in GitHub Desktop.
Save chatchavan/e6ccad639b4fe28d2cf7 to your computer and use it in GitHub Desktop.
OpenVNAVI Image processing testbed
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Image processing testbed for OpenVNAVI\n",
"===\n",
"The following notebook contain the code used to convert the depth image to PWM signal. The depth image is captured from Asus Xtion camera (640 x 480 pixels; valid range: 800 - 3500 mm). The rendering function maps the depth to greyscale (0: furthest or invalid pixels - 255: nearest). The greyscale value is then mapped to PWM (20: weakest power to keep motor alive but no perceptible vibration - 3000: strongest vibration)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Get a test depth image\n",
"---\n",
"First, we execute the following code in Raspberry Pi to obtain a depth image (saved in `numpy` internal format). Uncomment the code before running in `python` CLI. "
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# import cv2\n",
"# import numpy as np\n",
"# capture = cv2.VideoCapture(sensor)\n",
"# capture.open(sensor)\n",
"# dontcare = capture.grab()\n",
"# success, rawFrame = capture.retrieve(channel = CV_CAP_OPENNI_DEPTH_MAP)\n",
"# np.save(\"rawFrame.npy\", rawFrame)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If you don't have access to the vest, obtain the example file from my [DropBox](https://dl.dropboxusercontent.com/u/782595/OpenVNAVI/ImageProcessingTestbed/rawFrame.npy)\n",
"The test scene looks like the following image:\n",
"\n",
"<img src=\"https://dl.dropboxusercontent.com/u/782595/OpenVNAVI/ImageProcessingTestbed/scene.JPG\" width=\"320\">"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Import necessary libraries\n",
"---"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import cv2\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Loading the raw file\n",
"---\n",
"Loading local file:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"rawFrame = np.load(\"rawFrame.npy\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Loading the example file (uncomment the code below):"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# ds = np.lib.DataSource()\n",
"# fp = ds.open(\"https://dl.dropboxusercontent.com/u/782595/OpenVNAVI/ImageProcessingTestbed/rawFrame.npy\")\n",
"# rawFrame = np.load(fp)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Either way, the results should be the same:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "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\ned/27dsHv3fs2OGSr60dum6ktMnc+5kbeD1ltxELCwsTC1a1jjQJVb4eqK1KIXgnl8t7+H0yKOSB\nlT8Panm+F54Dn76Tm/Sv5e/Z8ciS03JRjIM/+IM/GBw/9dRTZroUYaamFm0WgtV81ZbP2qPh113v\ntpDozp07JyZLK0lTaoDchO31embnJYKS1z1L+LQgkmd5JCfFkgneKchpPvy3RbKkKVv5aUjNViB4\n55rmYPmjLezatWvo0xB33HGHms4ighJrYLPBGgxyvtrSKVqp8pskqHGeyySIs5WkmdJoiDStfTCB\n0e+e56LJFqp8QbK0DILUCHhQJ/WFTGtAkCQo0+TmuHLkBoPSeZxSK7bq8Fd/9VcA1jfqeNnLXlZU\nRgk2K3lK8Pc8RWx1aJzSt18XvLECiUlqvK0kTSC9Lpwj57/h05G0ndtzD0fT4DhJWPdPT08PTVvK\nySu1S4LnsxZEspxoZSSdm3glU7JCCMVapvXi53yc/NrKygre+973Yn5+Hq9//etV/7KFqoPVZkFO\n5ibqlHILNEVYnnp873vfa6TsFFpFmrzjW/MUrakhmraSm6Lh3SwYOBaQkfMSU9uv8ft4Gsthz8lG\nIzcrmCJ9XVqk2jMIWZHmkm3uUmm0KUJy4xEe1FpdXU1+CM3qsCnfn5VPW2BN36JrTZThvSf1uyrk\nc+d5e8q44oorAKxvUi3R1HNtFWla4MTGG4IHfrQG4l+G1LS4Xq+H5eXlwZf9SjYA1gjZmpspTWFr\nB6XUtJyqAQwids80H20DFGrbqp9ItpAjcb67/He+8x3s379fzaN01kCbCNKL3DSi1ABcJ1Jkm4rm\n51DVJw1g8Anm+++/35W+DmwK0gSOdRBuLstllJoprb1Ua2trWF5eHhAmHfNPQMjVOdbHzry+0RxS\nOzaRDBqRSmhBJEtrpGterdD6rSHXiXN58F2OlpaWRia6pwYYnv9mJEkJrS29syKs8035IgmW1ZK6\npxQhBCwuLo6VRxW0jjRTI5kVmCFC4aY9Rb5XVlbQ6/XQ6/WwsrKCw4cP4/Dhwzh69OggqLSysoLn\nnntuQJq8HM3Us6LOcnqS/F5RCjlNUKs7r7OUO5WXvN9LmiXaZglJevy2mvmVg/YM+fmmo8BVIAmt\nxA/MMQ6pjgtN5rrbmfKbmVlfn6N9574ptG5FEDD64shdxrlfkTr9ysrKyAT1nE9Mljk/P5+dz5ki\n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\nAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x105730150>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.imshow(rawFrame, \"gray\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that the plotting library automatically scale the value to 0–255 before rendering the image above. The actual value in the array is still in 0-3500 range"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"min,max: 0, 4463\n"
]
}
],
"source": [
"print \"min,max: %d, %d\" % (rawFrame.min(), rawFrame.max())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Depth data processing\n",
"---\n",
"The function below crop the image to match the vest aspect ratio. Then, it omit the points that are too near and too far. Finally, it scales the pixels that are in the range that we are interested (800–2000 mm), to the 0–255."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# from OpenVNAVI code\n",
"def processDepth(inFrame):\n",
" # convert to appropriate data type for computation\n",
" frame = inFrame.astype(float)\n",
" \n",
" # crop to match actuator aspect ratio\n",
" frame = frame[15:475, 12:618] # TODO: this aspect ratio doesn't match the vest\n",
" \n",
" # scale to the distance that we are interested\n",
" minDist = 800 # in mm\n",
" maxDist = 2000 # in mm\n",
" frame[frame > maxDist] = 0\n",
" frame[frame < minDist] = 0\n",
"\n",
" # scale valid pixels\n",
" validIdx = (frame > minDist) & (frame < maxDist)\n",
" frame[validIdx] = (frame[validIdx] - minDist) / (maxDist - minDist) * 255 \n",
" \n",
" # reverse the mapping (0: farthest - 255: nearest)\n",
" frame[validIdx] = 255 - frame[validIdx]\n",
" \n",
" return frame"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here's how the post-processed depth image looks like."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x107f93090>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"outFrame = rawFrame.copy()\n",
"outFrame = processDepth(outFrame)\n",
"plt.imshow(outFrame, \"gray\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The following code take a look closer at a vertical line around the center of the image (x = 300, y = 100–250). This line crosses the blue folder and the desk. (See the reference image above.)\n",
"\n",
"The plot shows the sharp difference between the two depth levels."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x10a321ed0>]"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nmMPeLAFu45jD3iwBbuOYw94sAZ7Zm8PeLAHu2ZvD3iwBbuOYw94sAW7jmMPeLAGe2ZvD3iwB7tmb\nw94sAW7jmMPeLAFu45jD3iwBbuOYw94sAW7jmMPeLAFu41jVsJe0QtIuSR0VY1+TtEXSZkk/kTS1\nYt0SSdslbZM0fywLN7ORcxvHhpvZrwQWDBj764g4LSJOB+4FlgJImgVcBszK91kuye8czFqA2zhW\nNYwjYgPwyoCx31UsHgW8nD9eCKyOiJ6I2AF0AXPqV6qZFeU2jhV6+iX9H+BTwP+nP9AnAT+v2Kwb\nmFxTdWZWF57ZW6Gwj4gvA1+WdCPwHWDRUJsONrhs2bIDj0ulEqVSqUgZZjZC7tm3n3K5TLlcrtvx\nFDFoHvdvIE0D1kfEqYOsOxH4cUS8Pw9+IuKWfN0DwNKIeGzAPjHcOc2svj77WfjAB7Lv1p4kEREq\nuv+oL6BKmlGxuBDYlD9eB1wuabyk6cAM4PGihZlZ/biNY1XbOJJWA/OACZJ2kt158zFJ7wX2A88A\n1wBERKekNUAnsA9Y7Cm8WWtwG8eqhn1EfGKQ4RVVtr8ZuLnWosysvnw3jvk+eLMEuI1jDnuzBHhm\nbw57swS4Z28Oe7MEuI1jDnuzBLiNYw57swS4jWMOe7MEuI1jDnuzBLiNYw57swR4Zm8Oe7MEuGdv\nDnuzBLiNYw57swS4jWMOe7MEuI1jDnuzBLiNYw57swS4jWMOe7MEuI1jDnuzBLiNYw57swS4jWMO\ne7MEeGZvDnuzBLhnbw57swS4jWMOe7MEuI1jDnuzBLiNYw57swS4jWMOe7MEuI1jDnuzBHhmbw57\nswS4Z28Oe7NDXG8vSHCYf9uTVvXpl7RC0i5JHRVj35T0pKQtktZKOrpi3RJJ2yVtkzR/LAs3s5Fx\nC8dg+Jn9SmDBgLEHgfdFxGnA08ASAEmzgMuAWfk+yyV5LmHWZG7hGAwT9hGxAXhlwNhDEdGbLz4G\nTMkfLwRWR0RPROwAuoA59S3XzEbLd+IY1N6zvxr4cf54EtBdsa4bmFzj8c2sRm7jGNQQ9pK+DOyN\niFVVNouixzez+vDM3gAK/QhIugr4GPDhiuHngakVy1PysTdZtmzZgcelUolSqVSkDDMbAffs21O5\nXKZcLtfteIqoPvmWNA1YHxGn5ssLgFuBeRHxcsV2s4BVZH36ycDDwB/GgBNIGjhkZmPohRfgzDPh\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1098fb410>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"oneLine = outFrame[100:250, 300]\n",
"plt.figure()\n",
"plt.plot(oneLine)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Scaling down\n",
"----\n",
"We now scale the image down to the resolution of the vest (16 x 8 motors). We used the nearest neighbor scaling to prevent aliasing."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# from OpenVNAVI code\n",
"def scaleFrame(inFrame):\n",
" frame16 = cv2.resize(inFrame, (16,8))\n",
" return frame16"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here's the output in plot and in actual numbers."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10a34a610>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"array([[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
" 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
" 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 116, 113, 35, 39, 0,\n",
" 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 117, 113, 36, 39, 0,\n",
" 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 161, 160, 158, 157, 157,\n",
" 157, 162, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 160, 159, 157, 156, 157,\n",
" 157, 160, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 159, 158, 155, 154, 157,\n",
" 156, 156, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 157, 156, 154, 153, 154,\n",
" 152, 153, 0]])"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"frame16 = scaleFrame(outFrame)\n",
"frame16 = frame16.astype(int)\n",
"plt.imshow(frame16, \"gray\", interpolation=\"nearest\") \n",
"plt.show()\n",
"frame16"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Convert the image to PWM\n",
"---"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# from OpenVNAVI code\n",
"maxPWM = 3000 # TODO: determine proper max\n",
"minPWM = 20 # TODO: determine proper min\n",
"\n",
"\n",
"def depthToPWM(frame):\n",
" assert maxPWM > minPWM\n",
" \n",
" # NOTE: Assume that the image processing part already cut to the proper near and far planes\n",
" farDepth = 0\n",
" nearDepth = 255\n",
"\n",
" scaleFactor = (maxPWM - minPWM) / (nearDepth - farDepth)\n",
" PWM16 = scaleFactor * frame.astype(np.int16) # TODO: allow web to chang the mapping function\n",
" return PWM16"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Output"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10a437410>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"array([[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
" 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
" 0, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 1276, 1243, 385,\n",
" 429, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 1287, 1243, 396,\n",
" 429, 0, 0, 0, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 1771, 1760, 1738,\n",
" 1727, 1727, 1727, 1782, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 1760, 1749, 1727,\n",
" 1716, 1727, 1727, 1760, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 1749, 1738, 1705,\n",
" 1694, 1727, 1716, 1716, 0],\n",
" [ 0, 0, 0, 0, 0, 0, 0, 0, 1727, 1716, 1694,\n",
" 1683, 1694, 1672, 1683, 0]], dtype=int16)"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pwm = depthToPWM(frame16)\n",
"plt.imshow(pwm, \"gray\", interpolation=\"nearest\") \n",
"plt.show()\n",
"pwm"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# from OpenVNAVI code\n",
"def processDepthV3(inFrame):\n",
" # crop to match actuator aspect ratio\n",
" frame = inFrame[15:475, 12:618] # TODO: this aspect ratio doesn't match the vest\n",
" \n",
" # convert to appropriate data type for computation\n",
" frame = frame.astype(float)\n",
" \n",
" # scale to the distance that we are interested\n",
" minDist = 800 # in mm\n",
" maxDist = 2000 # in mm\n",
" frame[frame > maxDist] = 0\n",
" frame[frame < minDist] = 0\n",
"\n",
" # scale valid pixels\n",
" validIdx = (frame > minDist) & (frame < maxDist)\n",
" frame[validIdx] = (frame[validIdx] - minDist) / (maxDist - minDist) * 255 \n",
" \n",
" # reverse the mapping (0: farthest - 255: nearest)\n",
" frame[validIdx] = 255 - frame[validIdx]\n",
" \n",
" return frame\n",
"\n",
"outFrame = rawFrame.copy()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Optimization\n",
"===\n",
"Below is an optimized version of the depth processing code above. The differences are as follows:\n",
"\n",
"* Crop before copy.\n",
"* Calculate scale facto once\n",
"* Minimize and defer index-dependent operations (see `invalidIdx` variable)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# saves the old function\n",
"processDepthV1 = processDepth"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# from OpenVNAVI code\n",
"def processDepth(inFrame): \n",
" # crop to match actuator aspect ratio\n",
" frame = inFrame[15:475, 12:618] # TODO: this aspect ratio doesn't match the vest\n",
" \n",
" # convert to appropriate data type for computation\n",
" frame = frame.astype(float)\n",
" \n",
" # the distance that we are interested\n",
" minDist = 800 # in mm\n",
" maxDist = 2000 # in mm\n",
" \n",
" # save invalid pixels\n",
" invalidIdx = (frame < minDist) | (frame > maxDist)\n",
" \n",
" # scale the value of each pixel\n",
" # reverse the mapping (0: farthest - 255: nearest)\n",
" scaleFactor = 255.0 / (maxDist - minDist)\n",
" frame = 255 - ((frame - minDist) * scaleFactor)\n",
" \n",
" # set invalid pixels to zero\n",
" frame[invalidIdx] = 0\n",
" \n",
" return frame"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Correctness check"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"processDepthV1\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10a53cc90>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"processDepth\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10a5c0090>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"outFrame1 = rawFrame.copy()\n",
"outFrame2 = rawFrame.copy()\n",
"outFrame1 = processDepthV1(outFrame1)\n",
"outFrame2 = processDepth(outFrame2)\n",
"print \"processDepthV1\"\n",
"plt.imshow(outFrame1, \"gray\")\n",
"plt.show()\n",
"print \"processDepth\"\n",
"plt.imshow(outFrame2, \"gray\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Performance test:"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"outFrame1 = rawFrame.copy()\n",
"outFrame2 = rawFrame.copy()"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"100 loops, best of 3: 5.29 ms per loop\n"
]
}
],
"source": [
"timeit processDepthV1(outFrame)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"100 loops, best of 3: 2.97 ms per loop\n"
]
}
],
"source": [
"timeit processDepth(outFrame)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.11"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment