PageSourceSearch

https://affordance-policy.github.io/

html affordance-policy.github.io collected 2026-10-03 08:33:14 UTC 30,291 bytes, 553 lines download raw bytes

1<!DOCTYPE html>
2<html>
3
4<head>
5
6  <!-- Google tag (gtag.js) -->
vendor: 66 bytes, lines 6-7
6
7  <script async src="https://www.googletagmanager.com/gtag/js?id=
7G-MM5PQ9VB6G
vendor: 14 bytes, lines 7-8
7"></script>
8  
8<script>
9    
vendor: 140 bytes, lines 9-13
9window.dataLayer = window.dataLayer || [];
10    function gtag(){dataLayer.push(arguments);}
11    gtag('js', new Date());
12
13    gtag('config', '
13G-MM5PQ9VB6G
vendor: 6 bytes, lines 13-14
13');
14  
14</script>
14
15
16  <meta charset="utf-8">
17  <meta name="viewport" content="width=device-width, initial-scale=1.0">
18  <title>Affordance Policy Learning</title>
19
20  <link href="https://fonts.googleapis.com/css?family=Google+Sans|Noto+Sans|Castoro" rel="stylesheet">
21
22  <link rel="stylesheet" href="./static/css/bulma.min.css">
23  <link rel="stylesheet" href="./static/css/bulma-carousel.min.css">
24  <link rel="stylesheet" href="./static/css/bulma-slider.min.css">
25  <link rel="stylesheet" href="./static/css/fontawesome.all.min.css">
26  <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/jpswalsh/academicons@1/css/academicons.min.css">
27  <link rel="stylesheet" href="./static/css/index.css">
28  <link rel="icon" href="./static/images/vlmaps_icon.svg">
29  
29<script src="https://kit.fontawesome.com/7a7a763338.js" crossorigin="anonymous"></script>
29
30
31  
31<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
31
32  
32<script defer src="./static/js/fontawesome.all.min.js"></script>
32
33  
33<script src="./static/js/bulma-carousel.min.js"></script>
33
34  
34<script src="./static/js/bulma-slider.min.js"></script>
34
35  
35<script src="./static/js/index.js"></script>
35
36  
37  <style>
38    .img-responsive {
39      max-width: 100%;
40      height: auto;
41    }
42    .video-responsive {
43      width: 100%;
44      height: auto;
45    }
46
47    .gradient-text {
48    background: linear-gradient(to right,  red,yellow, cyan, blue);
49    -webkit-background-clip: text;
50    -webkit-text-fill-color: transparent;
51}
52
53  </style>
54</head>
55
56<body>
57  <!-- Google Tag Manager (noscript) -->
vendor: 70 bytes, lines 57-58
57
58  <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
58GTM-PFJ2DFW
vendor: 91 bytes, lines 58-60
58" height="0" width="0"
59      style="display:none;visibility:hidden"></iframe></noscript>
60  
60<!-- End Google Tag Manager (noscript) -->
61
62  <section class="hero">
63    <div class="hero-body">
64      <div class="container is-max-desktop">
65        <div class="columns is-centered">
66          <div class="column has-text-centered">
67            <h1 class="title is-1 publication-title" style="font-size: 2.5em;">
68              Learning from 10 Demos: </br>
69              <span style="font-size: 0.7em;">Generalisable and Sample-Efficient Policy Learning with Oriented Affordance Frames</span>
70            </h1>
71
72            <div class="is-size-5 publication-authors">
73              <span class="author-block">
74                <a href="https://krishanrana.github.io">Krishan Rana</a><sup>1</sup>,</span>
75              <span class="author-block">
76                <a href="https://jadchakra.github.io/">Jad Abou-Chakra</a><sup>1</sup>,</span>
77              <span class="author-block">
78                <a href="https://oravus.github.io/">Sourav Garg</a><sup>2</sup>,
79              </span>
80              <span class="author-block">
81                <a href="https://scholar.google.com.au/citations?user=1Vqlm0kAAAAJ&hl=en">Robert Lee</a><sup></sup>,
82              </span>
83              <span class="author-block">
84                <a href="https://cs.adelaide.edu.au/~ianr/">Ian Reid</a><sup>2</sup>,
85              </span>
86              <span class="author-block">
87                <a href="https://nikosuenderhauf.github.io/">Niko Suenderhauf</a><sup>1</sup>,
88              </span>
89            </div>
90  
91            <div class="is-size-5 publication-authors">
92              <span class="author-block"><sup>1</sup>QUT Centre for Robotics</span>
93              <span class="author-block"><sup>2</sup>University of Adelaide</span>
94            </div>
95
96
97            <div class="column has-text-centered">
98              <div class="publication-links">
99                <!-- PDF Link. -->
100                <span class="link-block">
101                  <a href="https://openreview.net/pdf?id=1K3kjo91Q1"
102                     class="external-link button is-normal is-rounded is-dark">
103                    <span class="icon">
104                        <i class="fas fa-file-pdf"></i>
105                    </span>
106                    <span>Paper</span>
107                  </a>
108                </span>
109
110                <!-- <span class="link-block">
111                  <a href=" "
112                     class="external-link button is-normal is-rounded is-dark">
113                    <span class="icon">
114                        <i class="ai ai-arxiv"></i>
115                    </span>
116                    <span>arXiv</span>
117                  </a>
118                </span> -->
119                <!-- Video Link. -->
120<!--                 <span class="link-block">
121                  <a href="#"
122                     class="external-link button is-normal is-rounded ">
123                    <span class="icon">
124                        <i class="fab fa-youtube"></i>
125                    </span>
126                    <span>Video</span>
127                  </a>
128                </span> -->
129                <!-- Code Link. -->
130                <!-- <span class="link-block">
131                  <a href="#"
132                     class="external-link button is-normal is-rounded ">
133                    <span class="icon">
134                        <i class="fab fa-github"></i>
135                    </span>
136                    <span>Code</span>
137                    </a>
138                </span> -->
139                <!-- Dataset Link. -->
140                <span class="link-block">
141                  <a href="https://x.com/krshnrana/status/1812517940790689852"
142                     class="external-link button is-normal is-rounded ">
143                    <span class="icon">
144                      <i class="fa-brands fa-x-twitter"></i>
145                    </span>
146                    <span>Thread</span>
147                    </a>
148              </div>
149            </div>
150
151              <br>
152
153
154
155
156
157              <section class="hero teaser">
158                <div class="container is-max-desktop">
159                    <div class="hero-body">
160                        <!-- First video, spans full width -->
161                        <div class="full-width-video" style="margin-bottom: 20px;">
162                            <video id="teaser1" autoplay controls muted loop playsinline width="100%">
163                                <source src="Images/main1.mp4" type="video/mp4">
164                            </video>
165                        </div>
166            
167                        <!-- Two videos in a row underneath -->
168                        <div class="two-videos-row" style="display: flex; justify-content: space-between;">
169                            <div class="carousel-item" style="flex: 1; margin-right: 10px;">
170                                <video id="teaser2" autoplay controls loop playsinline width="100%">
171                                    <source src="Images/coffee_making_FINAL_compressed.mp4" type="video/mp4">
172                                </video>
173                            </div>
174                            <div class="carousel-item" style="flex: 1; margin-left: 10px;" >                              
175                                <video id="teaser3" autoplay controls muted loop playsinline width="100%">
176                                    <source src="Images/shoe_racking_compressed.mp4" type="video/mp4">
177                                </video>
178                            </div>
179                        </div>
180                        
181                        <p class="has-text-centered" style="color:gray; margin-top: 20px;">
182                            Diffusion Policy solving <b>long-horizon, multi-object</b> tasks using the equivalent of only <b>10 full task demonstrations</b>. The colour <span class="gradient-text">gradient</span> of the diffused trajectory represents the predicted <b>self-progress</b> of the sub-policy for the current sub-task. We additionally overlay the current affordance-centric task frame that the sub-policy is operating with respect to.
183                        </p>
184                    </div>
185                </div>
186            </section>
187            
188            
189            
190
191  
192
193            <section class="section">
194              <div class="container is-max-desktop">
195                <div class="columns is-centered has-text-centered">                 
196                </div>
197                <br>
198                <div class="columns is-centered has-text-centered">
199                  <div class="column is-four-fifths">
200                    <h2 class="title is-3">Abstract</h2>
201                    <div class="content has-text-justified">
202                      <p>
203                        Imitation learning has unlocked the potential for robots to exhibit highly dexterous behaviours. However, it still struggles with long-horizon, multi-object tasks due to poor sample efficiency and limited generalisation. Existing methods require a substantial number of demonstrations to cover possible task variations, making them costly and often impractical for real-world deployment. We address this challenge by introducing oriented affordance frames, a structured representation for state and action spaces that improves spatial and intra-category generalisation and enables policies to be learned efficie
203ntly from only 10 demonstrations. More importantly we show how this abstraction allows for compositional generalisation of independently trained sub-policies to solve long-horizon, multi-object tasks. To seamlessly transition between sub-policies, we introduce the notion of self-progress prediction, which we directly derive from the duration of the training demonstrations. We validate our method across three real-world tasks, each requiring multi-step, multi-object interactions. Despite the small dataset, our policies generalise robustly to unseen object appearances, geometries, and spatial arrangements, achieving high success rates without reliance on exhaustive training data. 
204                      </p>
205                    </div>
206                  </div>
207                </div>
208                <br><br>
209                <div class="columns is-centered">
210                  <div class="column is-full-width">
211                    <h2 class="title is-3" style="text-align: left;">Overview</h2>
212                    <div class="content has-text-justified">
213                      <p style="text-align:center;">
214                        <img src="Images/main.png" class="img-responsive">
215                      </p>
216
217                      <p class="has-text-centered" style="color:gray;">
218                        We factorise <b>multi-object</b>, <b>long-horizon</b> manipulation tasks into a series of sub-policies trained with respect to an oriented affordance-centric task frame. The relative task frame allows us to learn policies that are spatially invariant, while the specifc placement of the frames at a task-relevant affordance-centric region on an object allows for intra-category invariance. Each diffusion policy is trained to additionally predict <b>self-progress</b> across a sub-task enabling it to autonomously transition between sub-tasks in order to complete longer-horizon tasks.
219                      </p>
220                      <p>
221                      </p>
222
223                        <!-- <h6> Affordance-Centric Policy Decomposition </h6>
224
225                          <p>In order to learn sample effient, and generalisable policies for long-horizon, multi-object manipulation tasks, we propose a novel method that leverages <b>affordance-centric task-frames</b>. We decompose policy learning for such tasks into a series of sub-policies each of which is trained to solve a sub-task with respect to an affordance-centric task-frame. To improve data efficiency, we re-orient this frame such that it's <b>funnel axis</b> always points towards the current tool-frame of the robot ensuring the robot consistently operates within the data support of the subsequent sub-policy. The relative task frame allows us to learn policies that are spatially invariant, while the specifc placement of the frames at a task-relevant affordance-centric region on an object allows for intra-category invariance. Each sub-policy is trained using Diffusion Policy from only 10 demonstrations using a fixed set of object instances.</p>
226
227                          <h6> Affordance-Centric Policy Chaining </h6>
228                          
229                          <p> To autonomously chain the sub-policies to solve longer-horizon tasks, we introduce the concept of <b>self-progress</b> to each sub-policy's action-space. This allows the sub-policy to autonomously transition to the next sub-policy upon completion of the current sub-task. This eliminates the need for a learned arbitrator and allows for seamless composition of sub-policies to solve complex, long-horizon, multi-object tasks.</p> -->
230                                                
231                      
232                    </div>
233                    <br/>
234
235                    <h2 class="title is-small" style="text-align: left; font-size: 1.8  rem;" >Key Insights</h2>
236
237                    <h2 id="oaf" class="title is-small" style="text-align: left; font-size: 1.2rem;">Oriented Affordance Frame</h2>
238
239                    <div class="columns is-centered">
240                      <div class="column">
241                      <p class="has-text-justified" style="color:gray;font-size: 0.9rem;">
242                        We introduce the <b>oriented affordance task frame</b> for training sample efficient and composable diffusion policies. Using an affordance-centric task frame for policy learning enables spatial and intra-category generalisation. By orienting this task frame towards the tool frame of the robot at the start of each episode, we can concentrate the data support of the sub-policy around a known 'funnel axis'. This allows us to maximise the utility of only 10 demonstrations, with the ability to compose sub-policies to solve longer-horizon tasks. Empirical results additionally show that the oriented frame anchors the task frame in tasks where the object is dynamic, preventing the robot from hitting joint limit violations.
243                      </p>
244
245                      <br>
246                    </div>
247                    <div class="column">
248                     <img src="Images/oriented_frame_gif_crop.gif" class="img-responsive" style="height: 250px; width: auto;">
249                      <br>
250                    </div>
251                    </div>
252
253                    <h2 id="selfprogress" class="title is-small" style="text-align: left; font-size: 1.2rem;">Policy Self-Progress</h2>
254
255
256                    <div class="columns is-centered">
257                      <div class="column">
258                      <p class="has-text-justified" style="color:gray;font-size: 0.9rem;">
259                        <br>
260                         We introduce a simple introspective mechanism for policy learning based on the idea of predicting <b>self-progress</b> across a sub-task as an additional action output. This allows us to train sub-policies that can autonomously transition between sub-tasks in order to complete longer-horizon tasks without the need to train an additional arbitrator policy. Given the expressive multi-modality of diffusion policies, we found that a simple linspace() operator over the length of each demonstration served as a well-behaved signal for self-progress prediction as shown in the video.
261                      </p>
262
263                      <br>
264                    </div>
265                    <div class="column">
266                     <img id="progress" src="Images/progress_ablation.gif" class="img-responsive">
267                      <br>
268                    </div>
269                    </div>
270
271
272
273                    <h2 class="title is-small" style="text-align: left; font-size: 1.8  rem;" >Results</h2>
274                    <h2 class="title is-small" style="text-align: left; font-size: 1.2rem;">Simplifying Data Collection</h2>
275                    <div class="columns is-centered">
276                      <div class="column">
277                      <p class="has-text-justified" style="color:gray;font-size: 0.9rem;">
278                        We simplify data collection for long-horizon, multi-object tasks by training simpler, spatially invariant sub-policies. This approach allows us to collect demonstrations from a subset of the full workspace. The spatial invariance and state-based representation enable compositional generalisation to longer horizon tasks with more objects and spatial variations. We use fiducial markers during data collection to track affordance frames on objects which simplifies dataset processing, later replacing them with keypoint detectors and tracking algorithms. <b>Note:</b> All video demonstrations below use a single set of sub-policies trained from just 10 demonstrations with the objects and spatial variations shown on the right.  
279                      </p>
280
281                      
282                    </div>
283                    <div class="column">
284                     <img src="Images/data_collection.png" class="img-responsive">
285                      <br>
286                    </div>
287                    </div>
288
289
290
291
292                    <h2 class="title is-small" style="text-align: left; font-size: 1.2rem;">Long-Horizon Manipulation</h2>
293
294                    
295                   
296                    <div class="content has-text-justified">
297                      <p style="text-align:center;">
298                        <img src="Images/task_composition.png" class="img-responsive">
299                    
300                        <p class="has-text-centered" style="color:gray;font-size: 0.9rem;">
301                          We demonstrate the ability to compose the resulting sub-policies to solve <b>long-horizon, multi-object</b> tasks involving prehensile and non-prehensile manipulation actions such as scooping, pouring and pushing. The spatial invariance exhibited by each policy allows for generalisation to compositional variations when solving longer-horizon tasks with multiple objects.
302                        </p>
303
304                      </p>
305                    </div>
306
307
308
309                    <h2 class="title is-small" style="text-align: left; font-size: 1.2rem;">Spatial Generalisation</h2>
310                    <div class="content has-text-justified">
311                      <p style="text-align:center;">
312                        <img src="Images/spatial.png" class="img-responsive">
313                      </p>
314                    </div>
315
316                    <div class="columns is-centered">
317                      <div class="column">
318                        <video class="video-responsive" autoplay controls muted loop playsinline>
319                          <source src="Images/spatial_1.mp4" type="video/mp4">
320                        </video>
321                      </div>
322                      <div class="column">
323                        <video class="video-responsive" autoplay controls muted loop playsinline>
324                          <source src="Images/spatial_2.mp4" type="video/mp4">
325                        </video>
326                      </div>
327                      <div class="column">
328                        <video class="video-responsive" autoplay controls muted loop playsinline>
329                          <source src="Images/spatial_3.mp4" type="video/mp4">
330                        </video>
331                      </div>
332                      
333                    </div>
334
335                    <p class="has-text-centered" style="color:gray;font-size: 0.9rem;">
336                      All policies are trained using demonstrations collected within a small workspace. We demonstrate the ability to generalise to a wide range of spatial variations beyond this training workspace, including object and intra-object placement variations.  
337                    </p>
338
339                    <br>
340
341                    
342
343
344                    <h2 class="title is-small" style="text-align: left; font-size: 1.2rem;">Intra-Category Generalisation</h2>
345                    <div class="content has-text-justified">
346                      <p style="text-align:center;">
347                        <img src="Images/intra_cat.png" class="img-responsive">
348                      </p>
349                    </div>
350
351
352
353                    
354
355                    <div class="columns is-centered">
356                      <div class="column">
357                        <video class="video-responsive" autoplay controls muted loop playsinline>
358                          <source src="Images/teapot_floral.mp4" type="video/mp4">
359                        </video>
360                      </div>
361                      <div class="column">
362                        <video class="video-responsive" autoplay controls muted loop playsinline>
363                          <source src="Images/cup_pink.mp4" type="video/mp4">
364                        </video>
365                      </div>
366                      <div class="column">
367                        <video class="video-responsive" autoplay controls muted loop playsinline>
368                          <source src="Images/cup_blue.mp4" type="video/mp4">
369                        </video>
370                      </div>
371                      <div class="column">
372                        <video class="video-responsive" autoplay controls muted loop playsinline>
373                          <source src="Images/red_teapot.mp4" type="video/mp4">
374                        </video>
375                      </div>
376                      <div class="column">
377                        <video class="video-responsive" autoplay controls muted loop playsinline>
378                          <source src="Images/cup_tasmania.mp4" type="video/mp4">
379                        </video>
380                      </div>
381                        <div class="column">
382                          <video class="video-responsive" autoplay controls muted loop playsinline>
383                            <source src="Images/red_cup.mp4" type="video/mp4">
384                          </video>
385                        </div>
386                    </div>
387
388
389                  
390    
391                    <p class="has-text-centered" style="color:gray;font-size: 0.9rem;">
392                      The specific placement of our affordance centric task frames allows us to capture the important task relevant regions on objects required for manipulation for a wide range of intra-category object variations. This allows us to abstract away from using images and learn state-based policies with the ability to generalise to a wide range of intra-category object variations from the 10 demonstrations collected on a single object category instance.
393                    </p>
394
395
396
397                    <br>
398                    <h2 class="title is-small" style="text-align: left; font-size: 1.2rem;">Policy Robustness</h2>
399
400                    <div class="columns is-centered">
401                      <div class="column">
402                        <p class="has-text-centered" style="color:gray;font-size: 1.0rem;">
403                          Perturbations
404                        </p>
405                        <video class="video-responsive" autoplay controls muted loop playsinline>
406                          <source src="Images/dynamic_final.mp4" type="video/mp4">
407                        </video>
408                        <p class="has-text-centered" style="color:gray;font-size: 0.9rem;">
409                          By training a closed-loop diffusion policy that operates on tracked affordance centric task frames, our policies can handle dynamic object disturbances during deployment.
410                        </p>
411                      </div>
412
413                      <div class="column">
414                        <p class="has-text-centered" style="color:gray;font-size: 1.0rem;">
415                          Distractor Objects
416                        </p>
417                        <video class="video-responsive" autoplay controls muted loop playsinline>
418                          <source src="Images/distractor_tea_pour.mp4" type="video/mp4">
419                        </video>
420                        <p class="has-text-centered" style="color:gray;font-size: 0.9rem;">
421                          Our simplified state representation allows us to learn policies that are robust to distractor objects in the environment.
422                        </p>
423                      </div>
424                    </div>
425                    <br>
426                    <p class="has-text-centered" style="color:gray;font-size: 1.0rem;">
427                      Robot Base Movements
428                    </p>
429                    <div class="columns is-centered">
430                      <div class="column">
431                        <video class="video-responsive" autoplay controls muted loop playsinline>
432                          <source src="Images/teacup_place_moving_base.mp4" type="video/mp4">
433                        </video>
434                      </div>
435
436                      <div class="column">
437                        <video class="video-responsive" autoplay controls muted loop playsinline>
438                          <source src="Images/teapot_pour_mobile_base.mp4" type="video/mp4">
439                        </video>
440                      </div>
441                    </div>
442                    <p class="has-text-centered" style="color:gray;font-size: 0.9rem; margin-top: -20px;">
443                      By training policies with respect to a relative task frame located on objects, we can learn policies that are robust to robot base movements during deployment with applicability to mobile manipulation.
444                    </p>
445                    
446                    <br>
447
448                    
449                    <h2 class="title is-small" style="text-align: left; font-size: 1.2rem;">Related Works</h2>
450
451                    <br>
452
453                    <p class="has-text-justified" style="color:gray;font-size: 0.9rem; margin-top: -20px;">
454                      This work is motivated and enabled by the significant progress made in prior works developing generalist vision systems for keypoint extraction, pose tracking and policy learning.<br> </p>
455
456                      <br>
457
458
459                    <div class="columns is-centered">
460                      <div class="column">
461                        <br>
462                        <img id=foundationpose src="Images/foundation_pose.gif" alt="Foundation Pose" class="image-responsive">
463
464                      </div>
465
466                      <div class="column">
467                        <br>
468                        <p class="has-text-justified" style="color:gray;font-size: 0.9rem; margin-top: -30px;">
469
470                          Keypoint identification:<br> <a href="https://arxiv.org/abs/1903.06684" target="_blank" style="color:rgb(88, 88, 244);">kPAM</a>, <a href="https://arxiv.org/abs/1806.08756" target="_blank" style="color:rgb(88, 88, 244);">Dense Object Nets</a>, <a href="https://arxiv.org/abs/2112.05814" target="_blank" style="color:rgb(88, 88, 244);">DINO ViT Features</a>, <a href="https://robopil.github.io/d3fields/" target="_blank" style="color:rgb(88, 88, 244);">D3Fields</a><br>
471
472                          <br>
473
474                          Pose estimation and tracking:<br> <a href="https://nvlabs.github.io/FoundationPose/" target="_blank" style="color:rgb(88, 88, 244);">Foundation Pose</a>, <a href="https://bundlesdf.github.io/" target="_blank" style="color:rgb(88, 88, 244);">BundleSDF</a><br>
475
476                          <br>
477
478                          Policy Learning:<br> <a href="https://diffusion-policy.cs.columbia.edu/" target="_blank" style="color:rgb(88, 88, 244);">Diffusion Policy</a>, <a href="https://umi-gripper.github.io/" target="_blank" style="color:rgb(88, 88, 244);">Universal Manipulation Interface</a><br>
479
480                          <br>
481                          
482                          <b>Left:</b> We leverage off-the-shelf foundation models for affordance frame localisation (DINO-ViT) and pose tracking (Foundation Pose) in our policy learning framework. This allows use to take advantage of the generalisation capabilities exhibited by these models for robot learning. <br>
483
484                        
485                      </div>
486                    </div>
487
488
489                  </div>
490                </div>
491
492              </div>
493            </section>
494          </div>
495        </div>
496      </div>
497    </div>
498  </section>
499
500
501  <section class="section" id="BibTeX">
502    <div class="container is-max-desktop content">
503        <h2 class="title">BibTeX</h2>
504        <pre><code>
505          @inproceedings{
506          rana2025learning,
507          title={Learning from 10 Demos: Generalisable and Sample-Efficient Policy Learning with Oriented Affordance Frames},
508          author={Krishan Rana and Jad Abou-Chakra and Sourav Garg and Robert Lee and Ian Reid and Niko Suenderhauf},
509          booktitle={9th Annual Conference on Robot Learning},
510          year={2025},
511          url={https://openreview.net/forum?id=1K3kjo91Q1}
512          }
513          }</code></pre>
514      </div>
515    </section>
516    
517    <footer class="footer">
518      <div class="container">
519        <div class="content has-text-centered">
520          <!-- <a class="icon-link" href="https://github.com/keunhong" class="external-link" disabled>
521            <i class="fab fa-github"></i>
522          </a> -->
523        </div>
524    
525        <div class="columns is-centered">
526          <div class="column is-8">
527            <div class="content has-text-centered">
528              <img src="./Images/qcr.png" alt="Institute 1" style="width:200
528px; margin:20px;">
529              <img src="./Images/uoa.png" alt="Institute 2" style="width:200px; margin:20px;">
530            </div>
531          </div>
532        </div>
533    
534    
535          <div class="columns is-centered">
536          <div class="column is-8">
537           <div class="content has-text-centered"> 
538              <p>
539                Website template borrowed from <a href="https://github.com/nerfies/nerfies.github.io">here</a>.
540              </p>
541          </div> 
542          </div>
543        </div>
544        
545      </div>
546    </footer>
547
548
549
550
551</body>
552
553</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.