receipt_indexer/code/autocropper/notebooks/helper_notebooks/dataset_viewer.ipynb
Ethan Wellenreiter 423b511dd9 Cleanup commit
Moving around the testing notebooks. Autocropping is about done
with exception to any new versions or converting the stuff to C
code.

Signed-off-by: Ethan Wellenreiter <ewellenreiter@gmail.com>
2023-10-18 22:48:24 -04:00

298 lines
32 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 52,
"metadata": {},
"outputs": [],
"source": [
"version=2.0\n",
"cachepath=\"../.cache/\"\n",
"savepath=\"./savespot/\""
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {},
"outputs": [],
"source": [
"import torch\n",
"from torch.utils.data import DataLoader\n",
"import torch.nn as nn\n",
"import torch.nn.functional as fn\n",
"import torch.optim as optim\n",
"import torchvision.transforms.functional as tvf\n",
"import torchvision.transforms.v2 as v2\n",
"import torchvision.models as models\n",
"import torchvision.transforms as t\n",
"\n",
"\n",
"from PIL import Image\n",
"\n",
"import datasets as ds\n",
"from tqdm.autonotebook import tqdm\n",
"\n",
"import random\n",
"\n",
"import matplotlib.pyplot as plt\n",
"\n",
"import numpy as np\n",
"\n",
"\n",
"torch.cuda.empty_cache()\n",
"\n",
"\n",
"import os\n",
"import cv2\n",
"import myfunctions as mf"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {},
"outputs": [],
"source": [
"# array = np.load(\"./testing_space/outputarray.npy\")\n",
"# counter = np.load(\"./testing_space/counter.npy\")"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [],
"source": [
"# print(array)\n",
"# print(counter)"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [],
"source": [
"# def ResizeWithAspectRatio(image, width=None, height=None, inter=cv2.INTER_AREA):\n",
"# dim = None\n",
"# (h, w) = image.shape[:2]\n",
"\n",
"# if width is None and height is None:\n",
"# return image\n",
"# if width is None:\n",
"# r = height / float(h)\n",
"# dim = (int(w * r), height)\n",
"# else:\n",
"# r = width / float(w)\n",
"# dim = (width, int(h * r))\n",
"\n",
"# return cv2.resize(image, dim, interpolation=inter)"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {},
"outputs": [],
"source": [
"working_dataset = ds.load_from_disk(cachepath + \"datasets/customrotation/\")\n",
"ogdataset = ds.load_dataset(\"aharley/rvl_cdip\")\n",
"\n",
"\n",
"prepimage = v2.Compose([v2.Grayscale(num_output_channels=3),v2.Resize(512), v2.CenterCrop(512),v2.ToImageTensor(), v2.ConvertImageDtype()])\n",
"tensorize = v2.Compose([v2.ToImageTensor(), v2.ConvertImageDtype()])\n",
"grayscaler = v2.Grayscale(num_output_channels=3)\n",
"\n",
"\n",
"working_dataset.set_transform(prepimage)\n",
"ogdataset.set_transform(prepimage)"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [],
"source": [
"active_dataset = ogdataset['train'] # working_dataset['train']\n",
"index = random.randint(0, len(active_dataset)-1)\n",
"index=0"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [],
"source": [
"# plt.imshow(t.ToPILImage()(working_dataset['test'][3]['image']), cmap='gray', vmin=0, vmax=255)\n",
"# plt.show()\n",
"# rotationapplier = model(working_dataset['test'][3]['image']).item()\n",
"# print(rotationapplier)\n",
"# img = tvf.rotate(working_dataset['test'][3]['image'], rotationapplier)"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {},
"outputs": [],
"source": [
"# plt.imshow(t.ToPILImage()(img), cmap='gray', vmin=0, vmax=255)\n",
"# plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0\n",
"1\n",
"2\n",
"3\n",
"4\n",
"5\n",
"6\n",
"5\n",
"6\n",
"7\n"
]
}
],
"source": [
"# To call the model on a bunch of the images and rotate them back\n",
"copied = False\n",
"while(True):\n",
" activeimage = active_dataset[index]['image']\n",
" # img = cv2.imread(active_dataset[index]['image'], 0)\n",
" open_cv_image = np.array(t.ToPILImage()(activeimage))\n",
" open_cv_image = mf.ResizeWithAspectRatio(open_cv_image, 1000)\n",
" # cv2.namedWindow(\"image\", cv2.WINDOW_NORMAL)\n",
" # cv2.setWindowProperty(\"image\", cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)\n",
" cv2.imshow(\"image\", open_cv_image)\n",
" if (copied == False):\n",
" print(index)\n",
" key = cv2.waitKey(0)\n",
"\n",
" if key == ord('c'):\n",
" # print(\"\\tCopying this one\")\n",
" copied = True\n",
" elif key == ord('x'):\n",
" index -= 1\n",
" copied = False\n",
" elif key == ord('v'):\n",
" index +=1\n",
" copied = False\n",
" elif key == ord('q'):\n",
" break\n",
" \n",
" if (index < 0):\n",
" index = len(active_dataset)-index\n",
" if (index >= len(active_dataset)):\n",
" index = 0 + (index-len(active_dataset))\n",
" \n",
" cv2.destroyAllWindows()\n",
"cv2.destroyAllWindows()"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"277943\n"
]
}
],
"source": [
"print(index)"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.imshow(t.ToPILImage()(ogdataset['train'][index]['image']), cmap='gray', vmin=0, vmax=255)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"# # for trying to call the model on the picture repeatedly to see if it will just get more and more straight if it's called multiple times\n",
"\n",
"# currentimage = working_dataset['test'][3]['image']\n",
"# while(True):\n",
"# rotationapplier = model(currentimage).item()\n",
"# print(rotationapplier)\n",
"# img = tvf.rotate(currentimage, rotationapplier)\n",
"# open_cv_image = np.array(t.ToPILImage()(img))\n",
"# cv2.imshow(f'current image', open_cv_image)\n",
"# key = cv2.waitKey(0)\n",
" \n",
"# if key == ord('q'):\n",
"# break\n",
"# elif key == ord('v'):\n",
"# currentimage = img\n",
"# # cv2.destroyAllWindows()\n",
"# cv2.destroyAllWindows()"
]
}
],
"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.10.12"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}