{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Computer vision"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"hide_input": true
},
"outputs": [],
"source": [
"from fastai.gen_doc.nbdoc import *"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The [`vision`](/vision.html#vision) module of the fastai library contains all the necessary functions to define a Dataset and train a model for computer vision tasks. It contains four different submodules to reach that goal:\n",
"- [`vision.image`](/vision.image.html#vision.image) contains the basic definition of an [`Image`](/vision.image.html#Image) object and all the functions that are used behind the scenes to apply transformations to such an object.\n",
"- [`vision.transform`](/vision.transform.html#vision.transform) contains all the transforms we can use for data augmentation.\n",
"- [`vision.data`](/vision.data.html#vision.data) contains the definition of [`ImageDataBunch`](/vision.data.html#ImageDataBunch) as well as the utility function to easily build a [`DataBunch`](/basic_data.html#DataBunch) for Computer Vision problems.\n",
"- [`vision.learner`](/vision.learner.html#vision.learner) lets you build and fine-tune models with a pretrained CNN backbone or train a randomly initialized model from scratch.\n",
"\n",
"Each of the four module links above includes a quick overview and examples of the functionality of that module, as well as complete API documentation. Below, we'll provide a walk-thru of end to end computer vision model training with the most commonly used functionality."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Minimal training example"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, import everything you need from the fastai library."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from fastai.vision import *"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, create a data folder containing a MNIST subset in `data/mnist_sample` using this little helper that will download it for you:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"PosixPath('/home/ubuntu/.fastai/data/mnist_sample')"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"path = untar_data(URLs.MNIST_SAMPLE)\n",
"path"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Since this contains standard [`train`](/train.html#train) and `valid` folders, and each contains one folder per class, you can create a [`DataBunch`](/basic_data.html#DataBunch) in a single line:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"data = ImageDataBunch.from_folder(path)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You load a pretrained model (from [`vision.models`](/vision.models.html#vision.models)) ready for fine tuning:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"learn = cnn_learner(data, models.resnet18, metrics=accuracy)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And now you're ready to train!"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"Total time: 00:09
\n",
"
\n",
"
epoch
\n",
"
train_loss
\n",
"
valid_loss
\n",
"
accuracy
\n",
"
\n",
"
\n",
"
1
\n",
"
0.140444
\n",
"
0.097685
\n",
"
0.968597
\n",
"
\n",
"
\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"learn.fit(1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's look briefly at each of the [`vision`](/vision.html#vision) submodules."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Getting the data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The most important piece of [`vision.data`](/vision.data.html#vision.data) for classification is the [`ImageDataBunch`](/vision.data.html#ImageDataBunch). If you've got labels as subfolders, then you can just say:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"data = ImageDataBunch.from_folder(path)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It will grab the data in a train and validation sets from subfolders of classes. You can then access that training and validation set by grabbing the corresponding attribute in [`data`](/vision.data.html#vision.data)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ds = data.train_ds"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Images"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"That brings us to [`vision.image`](/vision.image.html#vision.image), which defines the [`Image`](/vision.image.html#Image) class. Our dataset will return [`Image`](/vision.image.html#Image) objects when we index it. Images automatically display in notebooks:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/jpeg": "/9j/4AAQSkZJRgABAQEAZABkAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCAAcABwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+f+vtr4ff8G5v/BaH4o/D/Q/ih4L/AGH9Tn0bxHDHNpM114t0W1mkikyUkeCe9SaFGA3BpEUbSrZwwJ+Ja/fD/g13+Dtzq/w6l/b6/ae/4Kna9o+gaP4jTSNL+GUnxZezs3a32LGNVWeYfuzJND5VsuFdSu8usnl0AfjV+2R+wp+1l/wT9+J8Pwc/a/8Ag1feDPEFzp6X1nbXF5bXcN1buSBJFcWsssEoBBVtjkqwKtg8V5JX6a/8HYmq/tMt/wAFVb7w5+0L8RtB1nT7bwta3XgDTPDaSxwaPo000yxwTRykkXbNC0krbmDl1ZdqFY0/MqgAr9b/APgkv+xl8Hf+Cb/7Jeuf8Fwv+CjHw1g1KbRV8v4BfC3Xo2t7nV9XWVEj1FoZk5VZGTy5MOI1WSbaWWGvyQr2f9rD/goV+2T+3DpPhHw/+1H8cb7xTp3gPR10zwlpp0+0s7bT7dVVRiK0iiR5CqqpmcNIyqoLEAAAGX+2p+2F8Zf29f2mPFP7Vfx71G1uPEvim8WS4jsbcRW9rDGixQW0S8kRxRIkalizEICzMSSfLKKKAP/Z\n",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAABHNCSVQICAgIfAhkiAAAAbBJREFUSInt1rGKwkAQBuBfuUJMRK0FQbYxoGBpLQimDAg+goVPIFrY29iYykoQfAEraxFDhBRW2lmJVqaV7Fxl0BPNrp42dwtTJOzOl1lmk4QAED44wp/E/sE/AubzebRaLXDOwTkHEWGxWMCyLP8e5xyNRkMYpUfRbrfJ87zAOB6PVKvVHuYCQF9BT2PbNvr9vn9dKpWgadrNPFVVwRh7vcKfwRijYrFI1Wr1qsL5fE6pVEokhxwIgDRNo9VqdQUWCgXR9eJQLBYj0zRpu9360G63o2w2S5FI5PfBwWBw0yyu61K32xXdTnGw0+nQ6XS626Wz2Uwoj/DBVxQF4fD96fF4XChP4LE4j2aziWQy6Sfu9XrI5XIwTRMAYFmWaCr5LgVAiqKQbdvv7dJzZDKZK8xxHEqn0+8BE4kELZdLH1uv18QYk8khB14eDcdxZDE50DAMOhwO5HkebTYbmW2UB3VdJ9d1/eoMw3iq2YRAVVVpNBr52GQyoWg0+h5Q13Uaj8c+NhwOqVKpPIsFg5cf4P1+T+Vy+RVM/NUGAPV6HdPpVGbJzQidy/zU+Phf2zcGKKJjocPzywAAAABJRU5ErkJggg==\n",
"text/plain": [
"Image (3, 28, 28)"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"img,label = ds[0]\n",
"img"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can change the way they're displayed:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"img.show(figsize=(2,2), title='MNIST digit')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And you can transform them in various ways:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/jpeg": "/9j/4AAQSkZJRgABAQEAZABkAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCAAcABwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD8BL29vNSvJtR1G7luLi4laSeeeQu8jscszMeSSSSSeSTX15+zX/wQr/4KM/tS/sq63+2Z4A+EdvYeBdIsZLy0vfEGorZzavBEheWW1hYb5I1Vf9YQqsSAhbDbfJf2Avj/APBH9l39qHw/8dvj58B7X4kaL4d826tvCmobGtbm9CHyGmjkBSWNXwxRgQcDp1H9FP8AwSB/4KA/FP8A4KRfsSfHf9pv9vr4kaF4K+Fk1nc+GLLRNCsVtYdGsVtpWu7pZBuaWRkn252ZzEdq4woAP5cHVkYowwQcEUlfbP8AwXh/4J1/CH/gnN+1/pngb9nvxDqGoeBfF/gyx8ReHH1e8SW6SOYMrByArYLJuG5VPzEAYAr4moAK9A+CnxF+JX9taJ8GbD4h6zbeF9Z8U2L6j4fj1eWOxuJPPRQ8kQJRiOOSp6Dg4Fef1sfD7xz4g+GPjrR/iL4Umjj1PQ9ShvrB5Yw6CWJw67lPUZHIoA/Sj/g7R1C8uP8Agp3p2lSa0Li2034Y6NbWtsFdRajY7soDgHBL7geSQ3tivy/r2D9sT9sD45/8FAvjdrn7T/7SXiG1v/E9/Fa2x/s3TorS2gt4omSKGOKMYCqqDkksSSWJJzXj9AH/2Q==\n",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAABHNCSVQICAgIfAhkiAAAAv5JREFUSInVlr1LK1sUxX9nzGSiMXFInAgJYmGVImAjNhFEESysbMTWUksrQeH9ASKCvYW1Fn6gqWxsLRSLIEEQMYpfmARJMklm9m3eC+9dfObDe4W7YWBmz+y9Zi3WOWczPT0twLdd6u+bbwvtO8H+HEDLstoG7AD+avbjaDTKxsYGIyMjDAwM8P7+zuvra8ugTblrdnZWnp6exHEcKZfLkslkZH5+XgzDaMmlnkZ/4/F4WFpaYnFxkXA4jIig6zqhUIhwONwyu08BJyYmWFtbwzRNotEoAEopRITOzk7u7+/RtNZt8CH11dVVcRxHHMeRUqkkjuPIycmJZLNZcRxH8vm8zMzMiN/vF6VU+5J6vV6SySRTU1MAnJ2dUSwWSaVSpNNpVlZW6Ovro1KpkEgk8Hg8uK7Lzs5OU+w+lNSyLILBIPv7+xwfH3N0dIRt24RCIXw+H0opAoEACwsLGIZBNpulWq2yt7fXnqTxeFzm5uZkfHy8nrMsSzY3N+Xt7U1qtVpdbsdxJJfLydbWlgSDwfZcmk6nubm5oVQq1XNKKeLxOIFAAKVUPV8oFAgGg/T09GCaJoVC4VN2/2uxf4MBxGKx/+wwt7e3LC8vk0qlAEgmkyQSCXRdbw/w54hEIti2DUAmk+H09JTd3V1KpRK2bfPy8sLd3R3VavXTPg0X/j9xeXnJwcEBV1dXpNNptre3MQyDoaEhdF2nUqngOE5TvZpeQ7qui2VZ9efh4WG5uLiQYrEoh4eHYppmwx4tbRPVapXn52cANE2jVqthWRZKKc7PzxvKCV84D13Xpb+/n3w+j+u6aJqGSOPhoW1ApRSPj490dHTg9Xrx+/24rvv7AEWEwcFBYrEYruvS29vb1MHctEt/DqUUruvy8PCA3+/n+vqaSqXSsK5thpqmUSgU6OrqwjRNyuXy7wWMRCKMjo7i8XiwbZtisUgul2tY9yVJbdumu7sbwzDIZDJNuRS+MEVPTk7K+vq6jI2NtVL3a0d5y7LE6/WKz+f78P0PYSDjwf35LC8AAAAASUVORK5CYII=\n",
"text/plain": [
"Image (3, 28, 28)"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"img.rotate(35)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data augmentation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[`vision.transform`](/vision.transform.html#vision.transform) lets us do data augmentation. Simplest is to choose from a standard set of transforms, where the defaults are designed for photos:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Help on function get_transforms in module fastai.vision.transform:\n",
"\n",
"get_transforms(do_flip: bool = True, flip_vert: bool = False, max_rotate: float = 10.0, max_zoom: float = 1.1, max_lighting: float = 0.2, max_warp: float = 0.2, p_affine: float = 0.75, p_lighting: float = 0.75, xtra_tfms: Union[Collection[fastai.vision.image.Transform], NoneType] = None) -> Collection[fastai.vision.image.Transform]\n",
" Utility func to easily create a list of flip, rotate, `zoom`, warp, lighting transforms.\n",
"\n"
]
}
],
"source": [
"help(get_transforms)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"...or create the exact list you want:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"tfms = [rotate(degrees=(-20,20)), symmetric_warp(magnitude=(-0.3,0.3))]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can apply these transforms to your images by using their `apply_tfms` method."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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14xtPXDQoEEuV976YKwZ25pFbLew7VO2fiziT/2xp0khM2wrWawF/vzzzxrHk712796tcVl/E4cPH3bXtlYV2+1iOxwq74svvnDXL7/8ssb2ORfxfwszZ850Ofs8T5gwweXsd0XsSUGomObNm7trO8L0wQcfdLn4vYvyKuv7PfYZzYZxprwZAwCQGIsxAACJ5dQ2tT3YWkTklltu0ThOdamosqY02a/u2xNDRHz7FNvUlRdbHG6++WaNb731Vpez7Wg9evRwOXsiTGQngMVpQrNmzdJ41apVLrdnz55SfyYqJk6wmzZtmsZ2epOILynEKW7jx48vNWf/pmbPnl3xm4WIiFxxxRXu+s4779T40ksvzcjvsC1uo0aNcjnbIvXoo4+63MKFCzPy+zOJN2MAABJjMQYAIDEWYwAAEsupmnFsMbF1poMHD7qcvY65xYsXa7x//36X69y5s8bXXHONy9mv2f/www8uV9ZJMigfW/e3p/aI+Na1eIqP/buItWbbwmJboERE9u7dq7GtNYqIrFixQuPt27ef8N6RWfbULBuL+FO6HnjgAZez7TW23igisnnzZo3ts4yKsd+rEBG54IILNI7PWv369TW27YYiIj/++KPGsQ4d29osO/LSPstVFX9xAAAkxmIMAEBiObV3umzZMnc9btw4je+//36Xs1tbsdXITsuyU7VERLp06VLq77fbXkuWLHE5DpyvPNseVlhY6HIFBQUalzU1LbJtMAsWLHC5Z555RuOSkhKXi9dIJ5aA7N/GPffc43K2lS1uXb7yyisab9myJZO3WC3FSXRvv/32cWMRXxaIz+uAAQM0Hj58uMvZZz2WG1999VWNt27dWq57Tok3YwAAEmMxBgAgMRZjAAASy6masf0qu4ivIa9evbrU/2zNmjVdLj8/X+OOHTu6XNu2bTWONRH7lfw4ai8bTg2p6r7++muNV65c6XJNmjTRuFmzZqX+jPi52BN+mjZt6nL258RWDFQdrVq1cteDBw/W2H6XQMTXFadOnepydqzmgQMHMniHiOxzJyLSu3dvje+9916Xs22LDRs2dDlb91+6dKnLLVq0SONs+Dx5MwYAIDEWYwAAEsupberITlcq67DwuPVx1113aWxPGhHxU2Ts4dUi/qSX7777zuXiFjpOni0LPPfccy73/fffaxzbz2rVqqXxsGHDXM62UcSJ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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig,axes = plt.subplots(1,4,figsize=(8,2))\n",
"for ax in axes: ds[0][0].apply_tfms(tfms).show(ax=ax)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can create a [`DataBunch`](/basic_data.html#DataBunch) with your transformed training and validation data loaders in a single step, passing in a tuple of *(train_tfms, valid_tfms)*:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"data = ImageDataBunch.from_folder(path, ds_tfms=(tfms, []))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Training and interpretation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now you're ready to train a model. To create a model, simply pass your [`DataBunch`](/basic_data.html#DataBunch) and a model creation function (such as one provided by [`vision.models`](/vision.models.html#vision.models) or [torchvision.models](https://pytorch.org/docs/stable/torchvision/models.html#torchvision-models)) to [`cnn_learner`](/vision.learner.html#cnn_learner), and call [`fit`](/basic_train.html#fit):"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"Total time: 00:08
\n",
"
\n",
"
epoch
\n",
"
train_loss
\n",
"
valid_loss
\n",
"
accuracy
\n",
"
\n",
"
\n",
"
1
\n",
"
0.194779
\n",
"
0.131709
\n",
"
0.950932
\n",
"
\n",
"
\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"learn = cnn_learner(data, models.resnet18, metrics=accuracy)\n",
"learn.fit(1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we can take a look at the most incorrect images, and also the classification matrix."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"interp = ClassificationInterpretation.from_learner(learn)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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fiM0lzicQkRUCTCIExE5jEGciMhhleZXDLPNHgN9++23U35ecOoTpW/69Omxy5nWvHlzL33eeef58oYPH+6l7fHyBQsW+MrZNwWhzLLHtrt27erLu//++710cNqvPTXRBTwTJyJyGIM4EZHDOJySIf379/fSwelsNvsmEwDw008/Za1NVHb2EAngHxY54ogjIss2bNjQl1daWuql77jjDi89fvx4X7n//ve/6TeWYh111FFeOjgFNDiEYvv888+z1qZs4Jk4EZHDGMSJiBzGIE5E5DCOiZdBs2bNvHS/fv18ebfddltKddh3mwH8X7um/AveAahTp06RZe07CQV/gfC9997z0sFphVSxBe++VNHxTJyIyGEM4kREDuNwSoA9LQkAhgwZ4qXtX8k7/PDDfeVS/fW7u+66K/3GUcbYN5AYNWqUlw7e8Pjaa6/10sEhE/uGEVQ+9i89BpftG6cA/l+n7NmzZ7nXPXbsWN+yfaMOF/BMnIjIYQziREQOqzTDKfYl8/XXX1/u+qpU8b//pfqjOY8++qhvOZ8/Ol+Z9O7d27dsf3PSniHUt29fX7k1a9Zkt2EEADjxxBN9y0899ZSXTvfGNcEbcNhuuOEGL33vvfemVX9FwTNxIiKHMYgTETmMQZyIyGGVZkzcvhlucJyzcePGZa4vOAZuj9t99913vryff/7ZS996661lXheV34033uhbrlGjhpfu06ePl163bl3O2kS7zZ4927c8evRoLx0cE7enHwa/DVurVi0vfc0113hp+1clAeDdd99Nv7EVDM/EiYgcxiBOROSwSjOcMmDAAC/dvXt3X97+++/vpZ988klfXu3atVOq356mdu655/ry7Hv9UX4Eb9pgs7+9+cQTT+SiORQwc+bM2OVUFRUVhT6+efNm3/LcuXPTqr8i4pk4EZHDGMSJiBzGIE5E5LBKMyZumzp1qm+5R48eXjruq7q2r776yrd8xhlneOmVK1em3zjKCvsGDoD/Zg/jxo0LTQPAxx9/7KWPP/74LLWO0lWzZk3fcvBnExJefPHFXDQnL3gmTkTkMAZxIiKHVcrhlOC0wcsvv9xL29/4inPqqaf6lvlNv4pt5MiRvuWBAwd66fr163vp4LcDFy5cmN2GUbkccsghvuUuXbqEltu2bVsumpMXPBMnInIYgzgRkcMYxImIHFZpxsTtcfDOnTv7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\n",
"text/plain": [
"