wut-web-dev revert to main

master
ml server 2020-01-23 19:03:17 -07:00
parent 591a02952e
commit f87a677b19
1 changed files with 21 additions and 344 deletions

View File

@ -2,90 +2,34 @@
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# wut-web-dev --- What U Think? Web App: SatNOGS Observation AI, makes predictions, development version.\n",
"# wut-web --- What U Think? Web App: SatNOGS Observation AI, makes predictions.\n",
"#\n",
"# https://spacecruft.org/spacecruft/satnogs-wut\n",
"#\n",
"# GPLv3+\n",
"\n",
"from __future__ import print_function\n",
"import os\n",
"import random\n",
"import tempfile\n",
"import shutil\n",
"import tensorflow as tf\n",
"import numpy as np\n",
"from IPython.display import display, Image\n",
"from IPython.utils import text\n",
"from tensorflow.python.keras.models import load_model\n",
"from tensorflow.python.keras.preprocessing.image import ImageDataGenerator\n",
"from ipywidgets import interact, interactive, fixed, interact_manual\n",
"import ipywidgets as widgets"
"\n",
"display(Image(filename='/srv/satnogs/satnogs-wut/pics/spacecruft-bk.png'))"
]
},
{
"cell_type": "code",
"execution_count": 2,
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import ipywidgets as w\n",
"from IPython.display import display\n",
"import time\n",
"from jupyter_ui_poll import (\n",
" ui_events, \n",
" with_ui_events,\n",
" run_ui_poll_loop\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "1868d94f31f14ea481c93436c8e78de8",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Output(layout=Layout(border='5px solid lightblue'))"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"blueline = widgets.Output(layout={'border': '5px solid lightblue'})\n",
"blueline"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<H1><B>wut?<B></H1>\n"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%HTML\n",
"<H1><B>wut?<B></H1>"
@ -93,29 +37,9 @@
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"wut? --- What U Think? SatNOGS Observation AI.\n",
"\n",
"wut is an AI that rates SatNOGS Observations good or bad.\n",
"The training model was built from DUV transmissions recorded by the\n",
"SatNOGS network in December, 2019.\n",
"When the page loads, the AI processes a random image and rates it good or bad.\n",
"The test pool has 500+ DUV waterfalls the AI hasn't seen before.\n",
"The plan is to have models of all SatNOGS modes (65 at present),\n",
"and you can enter an arbitrary Observation ID and the AI will return a rating.\n",
"\n",
"Source Code:\n",
"https://spacecruft.org/spacecruft/satnogs-wut\n",
"Alpha stage.\n"
]
}
],
"outputs": [],
"source": [
"print(\"wut? --- What U Think? SatNOGS Observation AI.\")\n",
"print(\"\")\n",
@ -144,89 +68,30 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "2e6e4c84c4d9409fa9ac6b339902cf7a",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Output(layout=Layout(border='5px solid lightblue'))"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"blueline = widgets.Output(layout={'border': '5px solid lightblue'})\n",
"blueline"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'rfile' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-7-69bb47b72cd0>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0muniform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnumwater\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mrfile\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mroot\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mshutil\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrfile\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtest_dir\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m'/unvetted/'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mNameError\u001b[0m: name 'rfile' is not defined"
]
}
],
"outputs": [],
"source": [
"%%capture\n",
"numwater=0\n",
"n=0\n",
"random.seed();\n",
"for root, dirs, files in os.walk(sample_dir):\n",
" for name in files:\n",
" numwater=numwater+1\n",
" if random.uniform(0, numwater) < 1: rfile=os.path.join(root, name)\n",
" n=n+1\n",
" if random.uniform(0, n) < 1: rfile=os.path.join(root, name)\n",
"\n",
"shutil.copy(rfile, test_dir + '/unvetted/')"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"ename": "OSError",
"evalue": "SavedModel file does not exist at: /srv/wut/data/models/wut-DUV-201912.tf/{saved_model.pbtxt|saved_model.pb}",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mOSError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-8-e4a7d0db24c4>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mload_model\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel_file\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m~/.local/lib/python3.7/site-packages/tensorflow_core/python/keras/saving/save.py\u001b[0m in \u001b[0;36mload_model\u001b[0;34m(filepath, custom_objects, compile)\u001b[0m\n\u001b[1;32m 147\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 148\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msix\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstring_types\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 149\u001b[0;31m \u001b[0mloader_impl\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mparse_saved_model\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 150\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0msaved_model_load\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mload\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcompile\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 151\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.local/lib/python3.7/site-packages/tensorflow_core/python/saved_model/loader_impl.py\u001b[0m in \u001b[0;36mparse_saved_model\u001b[0;34m(export_dir)\u001b[0m\n\u001b[1;32m 81\u001b[0m (export_dir,\n\u001b[1;32m 82\u001b[0m \u001b[0mconstants\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSAVED_MODEL_FILENAME_PBTXT\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 83\u001b[0;31m constants.SAVED_MODEL_FILENAME_PB))\n\u001b[0m\u001b[1;32m 84\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 85\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mOSError\u001b[0m: SavedModel file does not exist at: /srv/wut/data/models/wut-DUV-201912.tf/{saved_model.pbtxt|saved_model.pb}"
]
}
],
"source": [
"%%capture\n",
"model = load_model(model_file)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%%capture\n",
"model = load_model(model_file)\n",
"\n",
"test_image_generator = ImageDataGenerator(\n",
" rescale=1./255\n",
")\n",
@ -239,21 +104,9 @@
},
{
"cell_type": "code",
"execution_count": 10,
"execution_count": null,
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'model' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-10-3a92d4c6bb36>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m prediction = model.predict(\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtest_data_gen\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mverbose\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m )\n\u001b[1;32m 5\u001b[0m \u001b[0mpredictions\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mNameError\u001b[0m: name 'model' is not defined"
]
}
],
"outputs": [],
"source": [
"%%capture\n",
"prediction = model.predict(\n",
@ -267,30 +120,9 @@
},
{
"cell_type": "code",
"execution_count": 11,
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"shutil.rmtree(test_dir)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'rfile' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-12-2dce8d4088c5>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mwaterfallpng\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbasename\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrfile\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Random waterfall:'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwaterfallpng\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtext\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mEvalFormatter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mobsid\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"{waterfall[slice(10,17)]}\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwaterfall\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mwaterfallpng\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Observation URL: https://network.satnogs.org/observations/{}'\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobsid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mNameError\u001b[0m: name 'rfile' is not defined"
]
}
],
"source": [
"waterfallpng=os.path.basename(rfile)\n",
"print('Random waterfall:', waterfallpng)\n",
@ -310,7 +142,8 @@
"metadata": {},
"outputs": [],
"source": [
"#display(Image(filename=rfile, width=300))"
"%%capture\n",
"shutil.rmtree(test_dir)"
]
},
{
@ -319,163 +152,7 @@
"metadata": {},
"outputs": [],
"source": [
"blueline = widgets.Output(layout={'border': '5px solid lightblue'})\n",
"blueline"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import IPython.display\n",
"from IPython.display import Audio\n",
"framerate = 44100\n",
"t = np.linspace(0,5,framerate*5)\n",
"data = np.sin(2*np.pi*220*t) + np.sin(2*np.pi*224*t)\n",
"IPython.display.Audio(data,rate=framerate)\n",
"\n",
"audiofile=('/srv/satnogs/download/1456893/satnogs_1456893_2019-12-30T10-35-46.ogg')\n",
"#Audio(filename=audiofile)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#obs_file='/srv/satnogs/download/1456893/1456893.json'"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from IPython.display import JSON\n",
"obs_file='/srv/satnogs/download/1456893/1456893.json'\n",
"obs_json=JSON(filename=obs_file, expanded=False)\n",
"foo=JSON(filename=obs_file)\n",
"#display_pretty(foo, raw=True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from IPython.display import HTML\n",
"obs_html = HTML(obs_file)\n",
"display(obs_html)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from IPython.utils import text\n",
"waterfallpng=os.path.basename(rfile)\n",
"print('Waterfall:', waterfallpng)\n",
"text.LSString(waterfallpng)\n",
"#text.SList(waterfallpng)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print('Waterfall:', waterfallpng)\n",
"f=text.EvalFormatter()\n",
"obsid=(f.format(\"{waterfall[slice(10,17)]}\", waterfall=waterfallpng))\n",
"print('Observation ID:', obsid)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(text.marquee('wut?',40,'*'))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"blueline = widgets.Output(layout={'border': '5px solid lightblue'})\n",
"blueline"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Cute SSTV: 1456893\n",
"# December, 2019 range: 1292461 \n",
"obsmin=1292461\n",
"obsmax=1470525\n",
"print(\"Minimum Observation ID: \", obsmin)\n",
"print(\"Maximum Observation ID: \", obsmax)\n",
"\n",
"print(\"Enter a value between the minimum and maximum Observation ID:\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"obsoutputText = widgets.Text()\n",
"obsoutputText"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"obsinputText = widgets.Text()\n",
"\n",
"def makeUpperCase(sender):\n",
" obsoutputText.value = obsinputText.value.upper()\n",
" print('dat:', obsinputText.value.upper)\n",
"\n",
"obsinputText.on_submit(makeUpperCase)\n",
"obsinputText"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"blueline = widgets.Output(layout={'border': '5px solid lightblue'})\n",
"blueline"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"blueline.clear_output()"
"display(Image(filename=rfile, width=300))"
]
}
],