Spaces:
Build error
Build error
Iskaj
commited on
Commit
·
ed0180d
1
Parent(s):
58b39ad
add doc to app and plot
Browse files
app.py
CHANGED
|
@@ -9,8 +9,9 @@ from faiss import read_index_binary, write_index_binary
|
|
| 9 |
from config import *
|
| 10 |
from videomatch import index_hashes_for_video, get_decent_distance, \
|
| 11 |
get_video_index, compare_videos, get_change_points, get_videomatch_df
|
| 12 |
-
from plot import
|
| 13 |
|
|
|
|
| 14 |
logging.basicConfig()
|
| 15 |
logging.getLogger().setLevel(logging.INFO)
|
| 16 |
|
|
@@ -18,7 +19,15 @@ def transfer_data_indices_to_temp(temp_path = VIDEO_DIRECTORY, data_path='./data
|
|
| 18 |
""" The binary indices created from the .json file are not stored in the temporary directory
|
| 19 |
This function will load these indices and write them to the temporary directory.
|
| 20 |
Doing it this way preserves the way to link dynamically downloaded files and the static
|
| 21 |
-
files are the same
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 22 |
index_files = os.listdir(data_path)
|
| 23 |
for index_file in index_files:
|
| 24 |
# Read from static location and write to temp storage
|
|
@@ -29,9 +38,14 @@ def compare(url, target):
|
|
| 29 |
""" Compare a single url (user submitted) to a single target entry and return the corresponding
|
| 30 |
figure and decision (.json-esque list of dictionaries)
|
| 31 |
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 35 |
"""
|
| 36 |
target_title = target['url']
|
| 37 |
target_mp4 = target['mp4']
|
|
@@ -60,66 +74,84 @@ def compare(url, target):
|
|
| 60 |
return fig, segment_decision
|
| 61 |
|
| 62 |
def multiple_comparison(url, return_figure=False):
|
| 63 |
-
""" Compare a
|
| 64 |
-
figures and decisions (.json-style list of dictionaries)
|
|
|
|
| 65 |
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 69 |
# Figure and decision (list of dicts) storage
|
| 70 |
figures, decisions = [], []
|
| 71 |
for target in TARGET_ENTRIES:
|
| 72 |
-
# Make comparison
|
| 73 |
fig, segment_decision = compare(url, target)
|
| 74 |
|
| 75 |
# Add decisions to global decision list
|
| 76 |
decisions.extend(segment_decision)
|
| 77 |
figures.append(fig)
|
| 78 |
|
|
|
|
| 79 |
if return_figure:
|
| 80 |
return figures
|
| 81 |
return decisions
|
| 82 |
|
| 83 |
def plot_multiple_comparison(url):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 84 |
return multiple_comparison(url, return_figure=True)
|
| 85 |
|
|
|
|
|
|
|
| 86 |
# Write stored target videos to temporary storage
|
| 87 |
transfer_data_indices_to_temp() # NOTE: Only works after doing 'git lfs pull' to actually obtain the .index files
|
| 88 |
|
| 89 |
-
# Load stored target videos
|
| 90 |
with open('apb2022.json', "r") as json_file:
|
| 91 |
TARGET_ENTRIES = json.load(json_file)
|
| 92 |
|
|
|
|
| 93 |
EXAMPLE_VIDEO_URLS = ["https://www.youtube.com/watch?v=qIaqMqMweM4",
|
| 94 |
"https://drive.google.com/uc?id=1Y1-ypXOvLrp1x0cjAe_hMobCEdA0UbEo&export=download",
|
| 95 |
"https://video.twimg.com/amplify_video/1575576025651617796/vid/480x852/jP057nPfPJSUM0kR.mp4?tag=14",
|
| 96 |
"https://drive.google.com/uc?id=1XW0niHR1k09vPNv1cp6NvdGXe7FHJc1D&export=download"]
|
| 97 |
|
|
|
|
| 98 |
index_iface = gr.Interface(fn=lambda url: index_hashes_for_video(url).ntotal,
|
| 99 |
inputs="text",
|
| 100 |
outputs="text",
|
| 101 |
examples=EXAMPLE_VIDEO_URLS)
|
| 102 |
|
| 103 |
-
#
|
| 104 |
-
# inputs=["text", "text", gr.Slider(2, 30, 4, step=2)],
|
| 105 |
-
# outputs="plot",
|
| 106 |
-
# examples=[[x, example_video_urls[-1]] for x in example_video_urls[:-1]])
|
| 107 |
-
|
| 108 |
plot_compare_iface = gr.Interface(fn=plot_multiple_comparison,
|
| 109 |
inputs=["text"],
|
| 110 |
outputs=[gr.Plot(label=entry['url']) for entry in TARGET_ENTRIES],
|
| 111 |
examples=EXAMPLE_VIDEO_URLS)
|
| 112 |
|
|
|
|
| 113 |
auto_compare_iface = gr.Interface(fn=multiple_comparison,
|
| 114 |
inputs=["text"],
|
| 115 |
outputs=["json"],
|
| 116 |
examples=EXAMPLE_VIDEO_URLS)
|
| 117 |
|
|
|
|
| 118 |
iface = gr.TabbedInterface([auto_compare_iface, plot_compare_iface, index_iface], ["AutoCompare", "PlotAutoCompare", "Index"])
|
| 119 |
|
| 120 |
if __name__ == "__main__":
|
|
|
|
| 121 |
import matplotlib
|
| 122 |
-
matplotlib.use('SVG')
|
| 123 |
|
| 124 |
iface.launch(show_error=True)
|
| 125 |
-
#iface.launch(auth=("test", "test"), share=True, debug=True)
|
|
|
|
| 9 |
from config import *
|
| 10 |
from videomatch import index_hashes_for_video, get_decent_distance, \
|
| 11 |
get_video_index, compare_videos, get_change_points, get_videomatch_df
|
| 12 |
+
from plot import plot_segment_comparison
|
| 13 |
|
| 14 |
+
# Basic logging template only showing info, change to debug during debugging
|
| 15 |
logging.basicConfig()
|
| 16 |
logging.getLogger().setLevel(logging.INFO)
|
| 17 |
|
|
|
|
| 19 |
""" The binary indices created from the .json file are not stored in the temporary directory
|
| 20 |
This function will load these indices and write them to the temporary directory.
|
| 21 |
Doing it this way preserves the way to link dynamically downloaded files and the static
|
| 22 |
+
files are the same.
|
| 23 |
+
|
| 24 |
+
Args:
|
| 25 |
+
temp_path (str): Directory of temporary storage for binary indices.
|
| 26 |
+
data_path (str): Directory of the indices created from the .json file.
|
| 27 |
+
|
| 28 |
+
Returns:
|
| 29 |
+
None.
|
| 30 |
+
"""
|
| 31 |
index_files = os.listdir(data_path)
|
| 32 |
for index_file in index_files:
|
| 33 |
# Read from static location and write to temp storage
|
|
|
|
| 38 |
""" Compare a single url (user submitted) to a single target entry and return the corresponding
|
| 39 |
figure and decision (.json-esque list of dictionaries)
|
| 40 |
|
| 41 |
+
Args:
|
| 42 |
+
url (str): User submitted url of a video which will be downloaded and cached.
|
| 43 |
+
target (dict): Target entry with a 'url' and 'mp4' attribute.
|
| 44 |
+
|
| 45 |
+
Returns:
|
| 46 |
+
fig (Figure): Figure that shows the comparison between two videos.
|
| 47 |
+
segment_decisions (dict): JSON-style dictionary containing the decision information of the comparison between two videos.
|
| 48 |
+
|
| 49 |
"""
|
| 50 |
target_title = target['url']
|
| 51 |
target_mp4 = target['mp4']
|
|
|
|
| 74 |
return fig, segment_decision
|
| 75 |
|
| 76 |
def multiple_comparison(url, return_figure=False):
|
| 77 |
+
""" Compare a url (user submitted) to all target entries and return the corresponding
|
| 78 |
+
figures and decisions (.json-style list of dictionaries). These target entries are defined in the main
|
| 79 |
+
by loading .json file containing the videos to compare to.
|
| 80 |
|
| 81 |
+
Args:
|
| 82 |
+
url (str): User submitted url which will be downloaded and cached.
|
| 83 |
+
return_figure (bool): Toggle parameter to decide if to return figures or decision, needed for Gradio plotting.
|
| 84 |
+
|
| 85 |
+
Returns:
|
| 86 |
+
Either a Figure or a .json-style dictionary with decision information.
|
| 87 |
+
|
| 88 |
+
"""
|
| 89 |
# Figure and decision (list of dicts) storage
|
| 90 |
figures, decisions = [], []
|
| 91 |
for target in TARGET_ENTRIES:
|
| 92 |
+
# Make single comparison
|
| 93 |
fig, segment_decision = compare(url, target)
|
| 94 |
|
| 95 |
# Add decisions to global decision list
|
| 96 |
decisions.extend(segment_decision)
|
| 97 |
figures.append(fig)
|
| 98 |
|
| 99 |
+
# Return figure or decision
|
| 100 |
if return_figure:
|
| 101 |
return figures
|
| 102 |
return decisions
|
| 103 |
|
| 104 |
def plot_multiple_comparison(url):
|
| 105 |
+
""" Helper function to return figure instead of decisions that is needed for Gradio.
|
| 106 |
+
|
| 107 |
+
Args:
|
| 108 |
+
url (str): User submitted url which will be downloaded and cached.
|
| 109 |
+
|
| 110 |
+
Returns:
|
| 111 |
+
The multiple comparison, but then returning the plots as Figure(s).
|
| 112 |
+
|
| 113 |
+
"""
|
| 114 |
return multiple_comparison(url, return_figure=True)
|
| 115 |
|
| 116 |
+
|
| 117 |
+
|
| 118 |
# Write stored target videos to temporary storage
|
| 119 |
transfer_data_indices_to_temp() # NOTE: Only works after doing 'git lfs pull' to actually obtain the .index files
|
| 120 |
|
| 121 |
+
# Load stored target videos that will be compared to
|
| 122 |
with open('apb2022.json', "r") as json_file:
|
| 123 |
TARGET_ENTRIES = json.load(json_file)
|
| 124 |
|
| 125 |
+
# Some example videos that can be compared to
|
| 126 |
EXAMPLE_VIDEO_URLS = ["https://www.youtube.com/watch?v=qIaqMqMweM4",
|
| 127 |
"https://drive.google.com/uc?id=1Y1-ypXOvLrp1x0cjAe_hMobCEdA0UbEo&export=download",
|
| 128 |
"https://video.twimg.com/amplify_video/1575576025651617796/vid/480x852/jP057nPfPJSUM0kR.mp4?tag=14",
|
| 129 |
"https://drive.google.com/uc?id=1XW0niHR1k09vPNv1cp6NvdGXe7FHJc1D&export=download"]
|
| 130 |
|
| 131 |
+
# Interface to simply index
|
| 132 |
index_iface = gr.Interface(fn=lambda url: index_hashes_for_video(url).ntotal,
|
| 133 |
inputs="text",
|
| 134 |
outputs="text",
|
| 135 |
examples=EXAMPLE_VIDEO_URLS)
|
| 136 |
|
| 137 |
+
# Interface to plot comparisons
|
|
|
|
|
|
|
|
|
|
|
|
|
| 138 |
plot_compare_iface = gr.Interface(fn=plot_multiple_comparison,
|
| 139 |
inputs=["text"],
|
| 140 |
outputs=[gr.Plot(label=entry['url']) for entry in TARGET_ENTRIES],
|
| 141 |
examples=EXAMPLE_VIDEO_URLS)
|
| 142 |
|
| 143 |
+
# Interface to get .json decision list
|
| 144 |
auto_compare_iface = gr.Interface(fn=multiple_comparison,
|
| 145 |
inputs=["text"],
|
| 146 |
outputs=["json"],
|
| 147 |
examples=EXAMPLE_VIDEO_URLS)
|
| 148 |
|
| 149 |
+
# Interface consists of three tabs
|
| 150 |
iface = gr.TabbedInterface([auto_compare_iface, plot_compare_iface, index_iface], ["AutoCompare", "PlotAutoCompare", "Index"])
|
| 151 |
|
| 152 |
if __name__ == "__main__":
|
| 153 |
+
# To be able to plot in Gradio as we want, these steps are a fix
|
| 154 |
import matplotlib
|
| 155 |
+
matplotlib.use('SVG')
|
| 156 |
|
| 157 |
iface.launch(show_error=True)
|
|
|
plot.py
CHANGED
|
@@ -55,6 +55,7 @@ def plot_segment_comparison(df, change_points, video_mp4 = "Placeholder.mp4", vi
|
|
| 55 |
Returns:
|
| 56 |
fig (Figure): Figure that shows the comparison between two videos.
|
| 57 |
segment_decisions (dict): JSON-style dictionary containing the decision information of the comparison between two videos.
|
|
|
|
| 58 |
"""
|
| 59 |
# Plot it with certain characteristics
|
| 60 |
fig, ax_arr = plt.subplots(4, 1, figsize=(16, 6), dpi=300, sharex=True)
|
|
|
|
| 55 |
Returns:
|
| 56 |
fig (Figure): Figure that shows the comparison between two videos.
|
| 57 |
segment_decisions (dict): JSON-style dictionary containing the decision information of the comparison between two videos.
|
| 58 |
+
|
| 59 |
"""
|
| 60 |
# Plot it with certain characteristics
|
| 61 |
fig, ax_arr = plt.subplots(4, 1, figsize=(16, 6), dpi=300, sharex=True)
|