{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\"FMP\"\n", "\"AudioLabs\"\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\"C4\"\n", "

Scape Plot Representation

\n", "
\n", "\n", "
\n", "\n", "

\n", "Following Section 4.3.2 of [Müller, FMP, Springer 2015], we introduce in this notebook the concept of scape plots and apply them for visualizing the fitness of segments. These plots were originally introduced into the music processing area by Sapp and then applied for structure analysis by Müller and Jiang.\n", "\n", "

\n", "

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Triangular Representation of Segments\n", "\n", "In the context of [audio thumbnailing](../C4/C4S3_AudioThumbnailing.html), we computed a [fitness measure](../C4/C4S3_AudioThumbnailing.html) that assigns to each possible segment a fitness value expressing a segment-specific property. We now introduce a representation by which a segment-dependent property can be visualized in a compact and hierarchical way. Recall that a **segment** $\\alpha=[s:t]\\subseteq [1:N]$ is uniquely determined by its starting point $s$ and its end point $t$. Since any two numbers $s,t\\in[1:N]$ with $s\\leq t$ define a segment, there are $(N+1)N/2$ different segments. Instead of considering start and end points, each segment can also be uniquely described by its center \n", "\n", "$$\n", " c(\\alpha):=(s+t)/2\n", "$$\n", "\n", "and its length $|\\alpha|$. Using the center to parameterize a horizontal axis and the length to parameterize the height, each segment can be represented by a point in a **triangular representation**. This way, the set of segments are ordered from bottom to top in a hierarchical way according to their length. In particular, the top of this triangle corresponds to the unique segment of maximal length $N$ and the bottom points of the triangle correspond to the $N$ segments of length one (where the start point coincides with the end point). Furthermore, all segments $\\alpha'\\subseteq\\alpha$ contained in a given segment $\\alpha$ correspond to points in the triangular representation that lie in a subtriangle below the point given by $\\alpha$\n", "\n", "\"FMP_C8_F19\"\n", "\n", "Given a triangular representation of all segments within $[1:N]$, the following example visually indicates the following sets of segments (see Exercise 4.12 of [Müller, FMP, Springer 2015]):\n", "\n", "(a) All segments having a minimal length above a given threshold $\\theta\\geq 0$
\n", "(b) All segments that contain a given segment $\\alpha$
\n", "(c) All segments that are disjoint to a given segment $\\alpha$
\n", "(d) All segments that contain the center $c(\\alpha)$ of a given segment $\\alpha$\n", "\n", "\n", "\"FMP_C4_E12.png\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Scape Plot\n", "\n", "The triangular representation can be used as a grid for visualizing a specific numeric property $\\varphi(\\alpha)\\in\\mathbb{R}$ that can be computed for all segments $\\alpha$. This property, for example, can be the fitness values as used for audio thumbnailing (see Section 4.3 of [Müller, FMP, Springer 2015]). Such a visual representation is also referred to as **scape plot** representation of the property. More precisely, we define a scape plot $\\Delta$ by setting \n", "\n", "\\begin{equation}\n", "\\label{eq:AudioStru:Thumb:SPfitness}\n", " \\Delta(c(\\alpha),|\\alpha|):=\\varphi(\\alpha)\n", "\\end{equation}\n", "\n", "for segment $\\alpha$. As a toy example, we consider the function $\\varphi$ defined by $\\varphi(\\alpha):= (t-s+1)/N$ for $\\alpha=[s:t]$, which encodes the segment lengths relative to the total length $N$. In the following code cell, we provide a visualization function for plotting a scape plot representation of this function. \n", "\n", "
\n", "Note: In our implementation, we use an N-square matrix SP as data structure to the store the segment-dependent property $\\varphi(\\alpha)\\in\\mathbb{R}$. We use the first dimension of SP to encode the length and the second one to encode the center. Since indexing in Python starts with index 0, one needs to be careful when interpreting the length dimension. In particular, the entry SP[length_minus_one, start] contains the information for the segment having length length_minus_one + 1 for length_minus_one = 0, ..., N-1. Furthermore, note that only the left-upper part (including the diagonal) of SP is used.\n", "
" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2024-02-15T08:51:52.381981Z", "iopub.status.busy": "2024-02-15T08:51:52.381673Z", "iopub.status.idle": "2024-02-15T08:51:55.256927Z", "shell.execute_reply": "2024-02-15T08:51:55.256125Z" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import os, sys, librosa, math\n", "from scipy import signal\n", "from matplotlib import pyplot as plt\n", "import matplotlib\n", "import matplotlib.gridspec as gridspec\n", "import IPython.display as ipd\n", "import pandas as pd\n", "from numba import jit\n", "from matplotlib.colors import ListedColormap\n", "sys.path.append('..')\n", "import libfmp.b\n", "import libfmp.c4\n", "from libfmp.b import FloatingBox\n", "\n", "%matplotlib inline\n", "\n", "def visualize_scape_plot(SP, Fs=1, ax=None, figsize=(4, 3), title='',\n", " xlabel='Center (seconds)', ylabel='Length (seconds)', interpolation='nearest'):\n", " \"\"\"Visualize scape plot\n", "\n", " Notebook: C4/C4S3_ScapePlot.ipynb\n", "\n", " Args:\n", " SP: Scape plot data (encodes as start-duration matrix)\n", " Fs: Sampling rate (Default value = 1)\n", " ax: Used axes (Default value = None)\n", " figsize: Figure size (Default value = (4, 3))\n", " title: Title of figure (Default value = '')\n", " xlabel: Label for x-axis (Default value = 'Center (seconds)')\n", " ylabel: Label for y-axis (Default value = 'Length (seconds)')\n", " interpolation: Interpolation value for imshow (Default value = 'nearest')\n", "\n", " Returns:\n", " fig: Handle for figure\n", " ax: Handle for axes\n", " im: Handle for imshow\n", " \"\"\"\n", " fig = None\n", " if ax is None:\n", " fig = plt.figure(figsize=figsize)\n", " ax = plt.gca()\n", " N = SP.shape[0]\n", " SP_vis = np.zeros((N, N))\n", " for length_minus_one in range(N):\n", " for start in range(N-length_minus_one):\n", " center = start + length_minus_one//2\n", " SP_vis[length_minus_one, center] = SP[length_minus_one, start]\n", "\n", " extent = np.array([-0.5, (N-1)+0.5, -0.5, (N-1)+0.5]) / Fs\n", " im = plt.imshow(SP_vis, cmap='hot_r', aspect='auto', origin='lower', extent=extent, interpolation=interpolation)\n", " x = np.asarray(range(N))\n", " x_half_lower = x/2\n", " x_half_upper = x/2 + N/2 - 1/2\n", " plt.plot(x_half_lower/Fs, x/Fs, '-', linewidth=3, color='black')\n", " plt.plot(x_half_upper/Fs, np.flip(x, axis=0)/Fs, '-', linewidth=3, color='black')\n", " plt.plot(x/Fs, np.zeros(N)/Fs, '-', linewidth=3, color='black')\n", " plt.xlim([0, (N-1) / Fs])\n", " plt.ylim([0, (N-1) / Fs])\n", " ax.set_title(title)\n", " ax.set_xlabel(xlabel)\n", " ax.set_ylabel(ylabel)\n", " plt.tight_layout()\n", " plt.colorbar(im, ax=ax)\n", " return fig, ax, im\n", "\n", "N = 9\n", "SP = np.zeros((N,N))\n", "for k in range(N):\n", " for s in range(N-k):\n", " length = k + 1\n", " SP[k, s]= length/N \n", "\n", "plt.figure(figsize=(7,3))\n", "ax = plt.subplot(121)\n", "plt.imshow(SP, cmap='hot_r', aspect='auto') \n", "ax.set_title('Data structure (N = %d)'%N)\n", "ax.set_xlabel('Segment start (samples)')\n", "ax.set_ylabel('Length minus one (samples)')\n", "plt.colorbar() \n", "\n", "ax = plt.subplot(122)\n", "fig, ax, im = visualize_scape_plot(SP, Fs=1, ax=ax, title='Scape plot visualization', \n", " xlabel='Segment center (samples)', ylabel='Length minus one (samples)')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fitness Scape Plot\n", "\n", "We now use the scape plot representation for visualizing the fitness measure for all segments. As first example, we continue with our [Brahms example](../C4/C4S1_MusicStructureGeneral.html). Recall that this piece has the musical structure $A_1A_2B_1B_2CA_3B_3B_4D$. Using settings as in [FMP notebook on audio thumbnailing](../C4/C4S3_AudioThumbnailing.html), we compute a (normalized) self-similarity matrix (SSM), which serves as input of our fitness computation. " ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2024-02-15T08:51:55.292905Z", "iopub.status.busy": "2024-02-15T08:51:55.292585Z", "iopub.status.idle": "2024-02-15T08:52:00.585761Z", "shell.execute_reply": "2024-02-15T08:52:00.585138Z" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fn_wav = os.path.join('..', 'data', 'C4', 'FMP_C4_Audio_Brahms_HungarianDances-05_Ormandy.wav')\n", "tempo_rel_set = libfmp.c4.compute_tempo_rel_set(0.66, 1.5, 5)\n", "penalty = -2\n", "x, x_duration, X, Fs_feature, S, I = libfmp.c4.compute_sm_from_filename(fn_wav, L=41, H=10, \n", " L_smooth=8, tempo_rel_set=tempo_rel_set, penalty=penalty, thresh= 0.15)\n", "S = libfmp.c4.normalization_properties_ssm(S)\n", " \n", "fn_ann_color = 'FMP_C4_Audio_Brahms_HungarianDances-05_Ormandy.csv'\n", "fn_ann = os.path.join('..', 'data', 'C4', fn_ann_color)\n", "ann_frames, color_ann = libfmp.c4.read_structure_annotation(fn_ann, fn_ann_color, Fs=Fs_feature)\n", "\n", "cmap_penalty = libfmp.c4.colormap_penalty(penalty=penalty)\n", "fig, ax, im = libfmp.c4.plot_ssm_ann(S, ann_frames, Fs=1, color_ann=color_ann, cmap=cmap_penalty, \n", " xlabel='Time (frames)', ylabel='Time (frames)')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the next code cell, we compute the fitness measure $\\varphi(\\alpha)\\in\\mathbb{R}$ (as well as the score $\\sigma(\\alpha)$, normalized score $\\bar{\\sigma}(\\alpha)$, coverage $\\gamma(\\alpha)$, and normalized coverage $\\bar{\\gamma}(\\alpha)$) for all segments $\\alpha$. " ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2024-02-15T08:52:00.588381Z", "iopub.status.busy": "2024-02-15T08:52:00.588189Z", "iopub.status.idle": "2024-02-15T08:52:03.820113Z", "shell.execute_reply": "2024-02-15T08:52:03.819353Z" } }, "outputs": [], "source": [ "# @jit(nopython=True)\n", "def compute_fitness_scape_plot(S):\n", " \"\"\"Compute scape plot for fitness and other measures\n", "\n", " Notebook: C4/C4S3_ScapePlot.ipynb\n", "\n", " Args:\n", " S (np.ndarray): Self-similarity matrix\n", "\n", " Returns:\n", " SP_all (np.ndarray): Vector containing five different scape plots for five measures\n", " (fitness, score, normalized score, coverage, normlized coverage)\n", " \"\"\"\n", " N = S.shape[0]\n", " SP_fitness = np.zeros((N, N))\n", " SP_score = np.zeros((N, N))\n", " SP_score_n = np.zeros((N, N))\n", " SP_coverage = np.zeros((N, N))\n", " SP_coverage_n = np.zeros((N, N))\n", "\n", " for length_minus_one in range(N):\n", " for start in range(N-length_minus_one):\n", " S_seg = S[:, start:start+length_minus_one+1]\n", " D, score = libfmp.c4.compute_accumulated_score_matrix(S_seg)\n", " path_family = libfmp.c4.compute_optimal_path_family(D)\n", " fitness, score, score_n, coverage, coverage_n, path_family_length = libfmp.c4.compute_fitness(\n", " path_family, score, N)\n", " SP_fitness[length_minus_one, start] = fitness\n", " SP_score[length_minus_one, start] = score\n", " SP_score_n[length_minus_one, start] = score_n\n", " SP_coverage[length_minus_one, start] = coverage\n", " SP_coverage_n[length_minus_one, start] = coverage_n\n", " SP_all = [SP_fitness, SP_score, SP_score_n, SP_coverage, SP_coverage_n]\n", " return SP_all\n", "\n", "SP_all = compute_fitness_scape_plot(S)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we visualize the fitness values $\\varphi(\\alpha)$ using a scape plot representation, which we also refer to as **fitness scape plot**. Furthermore, we also plot the fitness-maximizing segment or [audio thumbnail](../C4/C4S3_AudioThumbnailing.html)\n", "\n", "$$\n", " \\alpha^\\ast := \\underset{\\alpha}{\\mathrm{argmax}} \\,\\, \\varphi(\\alpha).\n", "$$\n", "\n", "along with its path family and induced segments. Note that the thumbnail as well as the induced segments are represented by points (blue and green points, respectively) in the scape plot representation. " ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2024-02-15T08:52:03.823401Z", "iopub.status.busy": "2024-02-15T08:52:03.823184Z", "iopub.status.idle": "2024-02-15T08:52:04.320649Z", "shell.execute_reply": "2024-02-15T08:52:04.319983Z" } }, "outputs": [ { "data": { "text/html": [ "\n", " \n", "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Segment (alpha): [175, 197]\n", "Length of segment: 23\n", "Length of feature sequence: 205\n", "Induced segment path family:\n", " [[ 41 67]\n", " [ 68 90]\n", " [150 175]\n", " [176 197]]\n", "Fitness: 0.4286698296\n", "Score: 68.0249476604\n", "Normalized score: 0.5175281340\n", "Coverage: 98, 98\n", "Normalized coverage: 0.3658536585\n", "Length of all paths of family: 87\n" ] } ], "source": [ "def seg_max_sp(SP):\n", " \"\"\"Return segment with maximal value in SP\n", "\n", " Notebook: C4/C4S3_ScapePlot.ipynb\n", "\n", " Args:\n", " SP (np.ndarray): Scape plot\n", "\n", " Returns:\n", " seg (tuple): Segment ``(start_index, end_index)``\n", " \"\"\"\n", " N = SP.shape[0]\n", " # value_max = np.max(SP)\n", " arg_max = np.argmax(SP)\n", " ind_max = np.unravel_index(arg_max, [N, N])\n", " seg = [ind_max[1], ind_max[1]+ind_max[0]]\n", " return seg\n", "\n", "def plot_seg_in_sp(ax, seg, S=None, Fs=1):\n", " \"\"\"Plot segment and induced segements as points in SP visualization\n", "\n", " Notebook: C4/C4S3_ScapePlot.ipynb\n", "\n", " Args:\n", " ax: Axis for image\n", " seg: Segment ``(start_index, end_index)``\n", " S: Self-similarity matrix (Default value = None)\n", " Fs: Sampling rate (Default value = 1)\n", " \"\"\"\n", " if S is not None:\n", " S_seg = S[:, seg[0]:seg[1]+1]\n", " D, score = libfmp.c4.compute_accumulated_score_matrix(S_seg)\n", " path_family = libfmp.c4.compute_optimal_path_family(D)\n", " segment_family, coverage = libfmp.c4.compute_induced_segment_family_coverage(path_family)\n", " length = segment_family[:, 1] - segment_family[:, 0] + 1\n", " center = segment_family[:, 0] + length//2\n", " ax.scatter(center/Fs, length/Fs, s=64, c='white', zorder=9999)\n", " ax.scatter(center/Fs, length/Fs, s=16, c='lime', zorder=9999)\n", " length = seg[1] - seg[0] + 1\n", " center = seg[0] + length//2\n", " ax.scatter(center/Fs, length/Fs, s=64, c='white', zorder=9999)\n", " ax.scatter(center/Fs, length/Fs, s=16, c='blue', zorder=9999)\n", "\n", "def plot_sp_ssm(SP, seg, S, ann, color_ann=[], title='', figsize=(5, 4)):\n", " \"\"\"Visulization of SP and SSM\n", "\n", " Notebook: C4/C4S3_ScapePlot.ipynb\n", "\n", " Args:\n", " SP: Scape plot\n", " seg: Segment ``(start_index, end_index)``\n", " S: Self-similarity matrix\n", " ann: Annotation\n", " color_ann: color scheme used for annotations (Default value = [])\n", " title: Title of figure (Default value = '')\n", " figsize: Figure size (Default value = (5, 4))\n", " \"\"\"\n", " float_box = libfmp.b.FloatingBox()\n", " fig, ax, im = visualize_scape_plot(SP, figsize=figsize, title=title,\n", " xlabel='Center (frames)', ylabel='Length (frames)')\n", " plot_seg_in_sp(ax, seg, S)\n", " float_box.add_fig(fig)\n", "\n", " penalty = np.min(S)\n", " cmap_penalty = libfmp.c4.colormap_penalty(penalty=penalty)\n", " fig, ax, im = libfmp.c4.plot_ssm_ann_optimal_path_family(\n", " S, ann, seg, color_ann=color_ann, fontsize=8, cmap=cmap_penalty, figsize=(4, 4),\n", " ylabel='Time (frames)')\n", " float_box.add_fig(fig)\n", " float_box.show()\n", " \n", "def check_segment(seg, S):\n", " \"\"\"Prints properties of segments with regard to SSM ``S``\n", "\n", " Notebook: C4/C4S3_ScapePlot.ipynb\n", "\n", " Args:\n", " seg (tuple): Segment ``(start_index, end_index)``\n", " S (np.ndarray): Self-similarity matrix\n", "\n", " Returns:\n", " path_family (list): Optimal path family\n", " \"\"\"\n", " N = S.shape[0]\n", " S_seg = S[:, seg[0]:seg[1]+1]\n", " D, score = libfmp.c4.compute_accumulated_score_matrix(S_seg)\n", " path_family = libfmp.c4.compute_optimal_path_family(D)\n", " fitness, score, score_n, coverage, coverage_n, path_family_length = libfmp.c4.compute_fitness(\n", " path_family, score, N)\n", " segment_family, coverage2 = libfmp.c4.compute_induced_segment_family_coverage(path_family)\n", " print('Segment (alpha):', seg)\n", " print('Length of segment:', seg[-1]-seg[0]+1)\n", " print('Length of feature sequence:', N)\n", " print('Induced segment path family:\\n', segment_family)\n", " print('Fitness: %0.10f' % fitness)\n", " print('Score: %0.10f' % score)\n", " print('Normalized score: %0.10f' % score_n)\n", " print('Coverage: %d, %d' % (coverage, coverage2))\n", " print('Normalized coverage: %0.10f' % coverage_n)\n", " print('Length of all paths of family: %d' % path_family_length)\n", " return path_family\n", " \n", "figsize=(5,4)\n", "SP = SP_all[0]\n", "seg = seg_max_sp(SP)\n", "plot_sp_ssm(SP=SP, seg=seg, S=S, ann=ann_frames, color_ann=color_ann, \n", " title='Scape plot: Fitness', figsize=figsize)\n", "plt.show()\n", "path_family = check_segment(seg, S)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The resulting fitness scape plot reflects the musical structure in a hierarchical way. The **thumbnail segment** is $\\alpha^\\ast=[175:197]$, which musically corresponds to the $B_4$-part. The coordinates in the scape plot are specified by the center $c(\\alpha)=186$ and the length $|\\alpha|=23$. The **induced segment** family consists of the four $B$-part. Note that all four $B$-part segments have almost the same fitness and lead to more or less the same segment family. Recall that the introduced fitness measure slightly favors [shorter segments](../C4/C4S3_AudioThumbnailing.html). Therefore, since in this recording the $B_4$-part is played faster than, e.g., the $B_1$-part, the fitness measure favors the $B_4$-part segment over the $B_1$-part segment. In other words, our procedure chooses the shortest most representative segment as thumbnail." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Normalized Score and Coverage\n", "\n", "Next, we illustrate that in the [definition of the fitness measure](../C4/C4S3_AudioThumbnailing.html) (see also Section 4.3.1.3 of [Müller, FMP, Springer 2015]), the normalization of score and coverage as well as the combination (harmonic mean) of the two measures is of crucial importance. To this end, we look at the scape plots of the various measures (as well as the measure-maximizing segments) individually. We start the score measure $\\sigma$. The score-maximizing segment is $\\alpha=[1:N]$, which is the entire recording. " ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2024-02-15T08:52:04.324544Z", "iopub.status.busy": "2024-02-15T08:52:04.324276Z", "iopub.status.idle": "2024-02-15T08:52:04.797854Z", "shell.execute_reply": "2024-02-15T08:52:04.797185Z" } }, "outputs": [ { "data": { "text/html": [ "\n", " \n", "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Segment (alpha): [0, 204]\n", "Length of segment: 205\n", "Length of feature sequence: 205\n", "Induced segment path family:\n", " [[ 0 204]]\n", "Fitness: 0.0000000000\n", "Score: 205.0000000000\n", "Normalized score: 0.0000000000\n", "Coverage: 205, 205\n", "Normalized coverage: 0.0000000000\n", "Length of all paths of family: 205\n" ] } ], "source": [ "SP = SP_all[1]\n", "seg = seg_max_sp(SP)\n", "plot_sp_ssm(SP=SP, seg=seg, S=S, ann=ann_frames, color_ann=color_ann, \n", " title='Scape plot: Score', figsize=figsize)\n", "path_family = check_segment(seg, S)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Subtracting trivial self-explanations and normalizing with regard to the length of the optimal path family, yields the **normalized score** $\\bar{\\sigma}$. Since this measure expresses the average score of a path family without expressing how much of the audio material is actually covered, many of the small segments have a relatively high score. Using such a measure would typically result in false-positive segments of small length. This is also demonstrated by the following scape plot and the $\\bar{\\sigma}$-maximizing path family, " ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "execution": { "iopub.execute_input": "2024-02-15T08:52:04.801244Z", "iopub.status.busy": "2024-02-15T08:52:04.800956Z", "iopub.status.idle": "2024-02-15T08:52:05.116212Z", "shell.execute_reply": "2024-02-15T08:52:05.115558Z" } }, "outputs": [ { "data": { "text/html": [ "\n", " \n", "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Segment (alpha): [183, 188]\n", "Length of segment: 6\n", "Length of feature sequence: 205\n", "Induced segment path family:\n", " [[ 54 61]\n", " [ 76 81]\n", " [163 168]\n", " [183 188]]\n", "Fitness: 0.1680842515\n", "Score: 20.5560876154\n", "Normalized score: 0.6065036506\n", "Coverage: 26, 26\n", "Normalized coverage: 0.0975609756\n", "Length of all paths of family: 24\n" ] } ], "source": [ "SP = SP_all[2]\n", "seg = seg_max_sp(SP)\n", "plot_sp_ssm(SP=SP, seg=seg, S=S, ann=ann_frames, color_ann=color_ann, \n", " title='Scape plot: Normalized score', figsize=figsize)\n", "path_family = check_segment(seg, S)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The next figure shows the scape plot for the coverage measure $\\gamma$. As for the score, the coverage-maximizing segment is $\\alpha=[1:N]$, which is the entire recording. " ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2024-02-15T08:52:05.119222Z", "iopub.status.busy": "2024-02-15T08:52:05.118996Z", "iopub.status.idle": "2024-02-15T08:52:05.473328Z", "shell.execute_reply": "2024-02-15T08:52:05.472547Z" } }, "outputs": [ { "data": { "text/html": [ "\n", " \n", "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Segment (alpha): [91, 204]\n", "Length of segment: 114\n", "Length of feature sequence: 205\n", "Induced segment path family:\n", " [[ 0 92]\n", " [ 93 204]]\n", "Fitness: 0.1205737073\n", "Score: 128.2312836287\n", "Normalized score: 0.0697611943\n", "Coverage: 205, 205\n", "Normalized coverage: 0.4439024390\n", "Length of all paths of family: 204\n" ] } ], "source": [ "SP = SP_all[3]\n", "seg = seg_max_sp(SP)\n", "plot_sp_ssm(SP=SP, seg=seg, S=S, ann=ann_frames, color_ann=color_ann, \n", " title='Scape plot: Coverage', figsize=figsize)\n", "path_family = check_segment(seg, S)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Subtracting trivial self-explanations and normalizing with regard to the length $N$ of the yields the **normalized coverage** $\\bar{\\gamma}$. As an be seen by the following scape plot along with the $\\bar{\\gamma}$-maximizing segment, the coverage measures a property that is conceptually different to the score. Opposed to the normalized score, the normalized coverage typically favors segments which induced segment family covers large portions of the input sequence." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "execution": { "iopub.execute_input": "2024-02-15T08:52:05.476467Z", "iopub.status.busy": "2024-02-15T08:52:05.476186Z", "iopub.status.idle": "2024-02-15T08:52:05.809077Z", "shell.execute_reply": "2024-02-15T08:52:05.808115Z" } }, "outputs": [ { "data": { "text/html": [ "\n", " \n", "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Segment (alpha): [56, 76]\n", "Length of segment: 21\n", "Length of feature sequence: 205\n", "Induced segment path family:\n", " [[ 32 55]\n", " [ 56 76]\n", " [ 77 94]\n", " [140 163]\n", " [164 184]\n", " [185 204]]\n", "Fitness: 0.3370126523\n", "Score: 50.3634055074\n", "Normalized score: 0.2488424196\n", "Coverage: 128, 128\n", "Normalized coverage: 0.5219512195\n", "Length of all paths of family: 118\n" ] } ], "source": [ "SP = SP_all[4]\n", "seg = seg_max_sp(SP)\n", "plot_sp_ssm(SP=SP, seg=seg, S=S, ann=ann_frames, color_ann=color_ann, \n", " title='Scape plot: Normalized coverage', figsize=figsize)\n", "path_family = check_segment(seg, S)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example: Beatles Songs" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2024-02-15T08:52:05.812129Z", "iopub.status.busy": "2024-02-15T08:52:05.811835Z", "iopub.status.idle": "2024-02-15T08:52:06.354372Z", "shell.execute_reply": "2024-02-15T08:52:06.353817Z" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fn_ann_color = 'FMP_C4_Audio_Beatles_YouCantDoThat.csv'\n", "fn_ann = os.path.join('..', 'data', 'C4', fn_ann_color)\n", "fn_wav = os.path.join('..', 'data', 'C4', 'FMP_C4_Audio_Beatles_YouCantDoThat.wav')\n", "\n", "tempo_rel_set = libfmp.c4.compute_tempo_rel_set(0.66, 1.5, 5)\n", "penalty = -2\n", "x, x_duration, X, Fs_feature, S, I = libfmp.c4.compute_sm_from_filename(fn_wav, L=21, H=10, \n", " L_smooth=8, tempo_rel_set=tempo_rel_set, penalty=penalty, thresh= 0.15)\n", "S = libfmp.c4.normalization_properties_ssm(S)\n", "\n", " \n", "ann_frames, color_ann = libfmp.c4.read_structure_annotation(fn_ann, fn_ann_color, Fs=Fs_feature)\n", "color_ann = {'I': [1, 0, 0, 0.2], 'V': [0, 1, 0, 0.2], 'B': [0, 0, 1, 0.2], '': [1, 1, 1, 0.2]}\n", "\n", "cmap_penalty = libfmp.c4.colormap_penalty(penalty=penalty)\n", "fig, ax, im = libfmp.c4.plot_ssm_ann(S, ann_frames, Fs=1, color_ann=color_ann, cmap=cmap_penalty, \n", " xlabel='Time (frames)', ylabel='Time (frames)')" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "execution": { "iopub.execute_input": "2024-02-15T08:52:06.357366Z", "iopub.status.busy": "2024-02-15T08:52:06.357132Z", "iopub.status.idle": "2024-02-15T08:52:07.516539Z", "shell.execute_reply": "2024-02-15T08:52:07.515867Z" } }, "outputs": [ { "data": { "text/html": [ "\n", " \n", "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Segment (alpha): [30, 51]\n", "Length of segment: 22\n", "Length of feature sequence: 158\n", "Induced segment path family:\n", " [[ 8 29]\n", " [ 30 51]\n", " [ 67 88]\n", " [ 89 111]\n", " [127 148]]\n", "Fitness: 0.4542030981\n", "Score: 63.4758459114\n", "Normalized score: 0.3805123478\n", "Coverage: 111, 111\n", "Normalized coverage: 0.5632911392\n", "Length of all paths of family: 109\n" ] } ], "source": [ "SP_all = compute_fitness_scape_plot(S)\n", "figsize=(5,4)\n", "SP = SP_all[0]\n", "seg = seg_max_sp(SP)\n", "plot_sp_ssm(SP=SP, seg=seg, S=S, ann=ann_frames, color_ann=color_ann, \n", " title='Fitness scape plot', figsize=figsize)\n", "path_family = check_segment(seg, S)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Further Notes\n", "\n", "Within the field of music processing, scape plots were originally introduced by Craig Sapp to hierarchically represent harmony in musical scores. In this notebook, we used this concept for visualizing the fitness measure for all segments in a compact and hierarchical way. This allowed us to not only gain an overview of the repetitive structure of a music recording, but also to better understand the [construction of the fitness measure](../C4/C4S3_AudioThumbnailing.html) by looking at score and coverage values separately. In particular, we demonstrated the following:\n", "\n", "* **Normalization is important.** Without normalization (subtracting self-explanations), longer segments would typically dominate the shorter segments and the entire recording would have maximal score or fitness. \n", "* **Combination of score and coverage is important.** By combining score and coverage, the fitness measure balances out the two conflicting principles of having strong repetitions (high score)and of explaining possibly large portions of the recording (high coverage).\n", "\n", "The fitness scape plot can be further refined by indicating the relations between different segments using suitable color codings. [Müller and Jiang](https://www.audiolabs-erlangen.de/fau/professor/mueller/publications/2012_MuellerJiang_StructureVisualization_ISMIR.pdf) use the lightness component of the color to indicate the fitness of the encoded segment and the hue component of the color to reveal the relations between different segments. The result of this visualization for our Brahms example is shown in the following figure.\n", "\n", "\"FMP_C4_Teaser_Ann\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Acknowledgment: This notebook was created by Meinard Müller and Angel Villar-Corrales.\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "
\"C0\"\"C1\"\"C2\"\"C3\"\"C4\"\"C5\"\"C6\"\"C7\"\"C8\"
" ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 3", "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.8.16" } }, "nbformat": 4, "nbformat_minor": 1 }