1 00:00:00,420 --> 00:00:05,910 [Music] 2 00:00:10,719 --> 00:00:17,720 Welcome to the education track, the 3 00:00:14,799 --> 00:00:21,780 student showcase. Yeah, 4 00:00:17,720 --> 00:00:21,780 [Applause] 5 00:00:22,400 --> 00:00:28,279 this is my favorite time of year where I 6 00:00:24,480 --> 00:00:28,279 have hope for the future. 7 00:00:29,119 --> 00:00:34,480 Uh we we love the student showcase. You 8 00:00:32,640 --> 00:00:36,559 love the student showcase. If you don't 9 00:00:34,480 --> 00:00:40,079 love it yet, you haven't been here 10 00:00:36,559 --> 00:00:42,320 before. These are students like of the 11 00:00:40,079 --> 00:00:45,520 high school variety and they do cool 12 00:00:42,320 --> 00:00:47,680 stuff. That's pretty cool. Um but before 13 00:00:45,520 --> 00:00:51,719 we do that, 14 00:00:47,680 --> 00:00:51,719 we thought we'd play a video. 15 00:00:54,399 --> 00:01:00,600 Fantastic day. I've had a fantastic day. 16 00:00:56,480 --> 00:01:00,600 Uh, we have a little bit of 17 00:01:04,159 --> 00:01:08,400 But before we do that, we thought we'd 18 00:01:05,840 --> 00:01:09,680 have some technical challenges. 19 00:01:08,400 --> 00:01:11,840 We're okay. We're okay. 20 00:01:09,680 --> 00:01:13,520 Okay. 21 00:01:11,840 --> 00:01:15,920 Um, I hope you've had a fantastic day. 22 00:01:13,520 --> 00:01:17,119 I've had a fantastic day. Uh, we have a 23 00:01:15,920 --> 00:01:19,200 little bit of a special thing that 24 00:01:17,119 --> 00:01:21,520 happens in the education track. Well, 25 00:01:19,200 --> 00:01:23,840 has happened for the last two years. uh 26 00:01:21,520 --> 00:01:26,000 in the afternoon session we hand over to 27 00:01:23,840 --> 00:01:27,759 high school students and find out what 28 00:01:26,000 --> 00:01:29,600 they've been doing with Python or what 29 00:01:27,759 --> 00:01:32,079 they've learned about programming and so 30 00:01:29,600 --> 00:01:34,320 we have some fantastic eight groups nine 31 00:01:32,079 --> 00:01:37,680 students to show you today their their 32 00:01:34,320 --> 00:01:39,680 work um and talk about their ideas. Hi 33 00:01:37,680 --> 00:01:41,119 Pon, I'm Summer Saunders and I spoke at 34 00:01:39,680 --> 00:01:43,040 the student showcase last year about 35 00:01:41,119 --> 00:01:45,040 cyber security and the pornogi. 36 00:01:43,040 --> 00:01:47,040 Currently I'm a first year at UTS for 37 00:01:45,040 --> 00:01:49,600 cyber security as well. 38 00:01:47,040 --> 00:01:51,360 Hi, I'm Jun and I did a student showcase 39 00:01:49,600 --> 00:01:53,600 last year on my program to take scans of 40 00:01:51,360 --> 00:01:55,600 trains from side. Right now I'm studying 41 00:01:53,600 --> 00:01:58,320 engineering at uni alongside learning 42 00:01:55,600 --> 00:01:59,920 computers for fun. And um at the 43 00:01:58,320 --> 00:02:01,680 conference last year, I really enjoyed 44 00:01:59,920 --> 00:02:04,000 some of the talks I listened to. So 45 00:02:01,680 --> 00:02:06,000 there was a one talk about implementing 46 00:02:04,000 --> 00:02:08,640 classes in Python 1.4 which I found 47 00:02:06,000 --> 00:02:10,959 really interesting. Um and I also really 48 00:02:08,640 --> 00:02:12,959 like meeting people. So the people from 49 00:02:10,959 --> 00:02:14,400 my student showcase and some of the 50 00:02:12,959 --> 00:02:17,200 people from my school that came to 51 00:02:14,400 --> 00:02:19,200 conference um I really liked hanging out 52 00:02:17,200 --> 00:02:22,319 with them at the conference. So that was 53 00:02:19,200 --> 00:02:24,239 really fun. I also um unexpectedly 54 00:02:22,319 --> 00:02:26,720 actually enjoyed like preparing for the 55 00:02:24,239 --> 00:02:28,720 talk a lot. So I found that really 56 00:02:26,720 --> 00:02:30,959 creative and really fun. So thank you so 57 00:02:28,720 --> 00:02:33,680 much for the opportunity and h um and 58 00:02:30,959 --> 00:02:36,720 happy 10th anniversary for PyCon. Hi 59 00:02:33,680 --> 00:02:38,640 PyCon, I'm Annabelle and in 2024 I 60 00:02:36,720 --> 00:02:40,720 presented my project Pythagoras at the 61 00:02:38,640 --> 00:02:42,160 student showcase. Uh Pythagoras is a 62 00:02:40,720 --> 00:02:44,480 small Python tool which you can use to 63 00:02:42,160 --> 00:02:46,879 generate SVGs that are themed from 64 00:02:44,480 --> 00:02:48,879 images. Uh anyways, now I currently 65 00:02:46,879 --> 00:02:51,360 volunteer at a nonprofit in the United 66 00:02:48,879 --> 00:02:53,599 States helping teenagers from all around 67 00:02:51,360 --> 00:02:55,680 the world build cool technical projects. 68 00:02:53,599 --> 00:02:57,680 Um yeah, I'm super grateful to have been 69 00:02:55,680 --> 00:02:59,280 able to attend PyCon and to show off my 70 00:02:57,680 --> 00:03:01,440 project as well as to see what other 71 00:02:59,280 --> 00:03:03,280 people in the Python uh Python community 72 00:03:01,440 --> 00:03:04,800 have been building. So, thanks for the 73 00:03:03,280 --> 00:03:06,959 opportunity. 74 00:03:04,800 --> 00:03:09,040 Hi, I'm Zach and I presented at PyCon 75 00:03:06,959 --> 00:03:10,480 2024 in the student showcase. I 76 00:03:09,040 --> 00:03:12,239 presented my Rocket League replay 77 00:03:10,480 --> 00:03:13,519 poster, which was a bot that spectates 78 00:03:12,239 --> 00:03:15,599 professional Rocket League player 79 00:03:13,519 --> 00:03:17,760 replays and posts them onto YouTube for 80 00:03:15,599 --> 00:03:20,159 everyone else to view. I am this year 81 00:03:17,760 --> 00:03:21,440 studying computer science at RMIT in the 82 00:03:20,159 --> 00:03:22,959 first year and I'm really looking 83 00:03:21,440 --> 00:03:25,120 forward to getting a job in tech or 84 00:03:22,959 --> 00:03:27,280 programming in the future. I really 85 00:03:25,120 --> 00:03:28,800 liked presenting at PyCon as I got to 86 00:03:27,280 --> 00:03:31,040 meet a bunch of cool people and present 87 00:03:28,800 --> 00:03:33,200 my project to everyone and it also made 88 00:03:31,040 --> 00:03:35,599 me refactor my code so it was more 89 00:03:33,200 --> 00:03:38,239 presentable to everyone. Thanks PyCon. 90 00:03:35,599 --> 00:03:41,200 Bye Pon. Happy 10 years of the education 91 00:03:38,239 --> 00:03:43,200 track. I'm Biana. I was in 2023 and I 92 00:03:41,200 --> 00:03:47,040 made a music recommendation system with 93 00:03:43,200 --> 00:03:50,480 the Spotify API. Um I loved PyCon because 94 00:03:47,040 --> 00:03:54,000 it started my sticker addiction. Yep. 95 00:03:50,480 --> 00:03:56,640 Um, right now I'm studying AI at UTS and 96 00:03:54,000 --> 00:03:59,519 I'm having a blast and I'm coaching a 97 00:03:56,640 --> 00:04:01,519 first robotics team. See you later. 98 00:03:59,519 --> 00:04:04,799 Hi, I'm Sean and for my education 99 00:04:01,519 --> 00:04:08,080 showcase, I demoed a script that I used 100 00:04:04,799 --> 00:04:10,080 to automate my attendance during co. Um, 101 00:04:08,080 --> 00:04:13,519 I'm currently studying CS and maths at 102 00:04:10,080 --> 00:04:15,680 UNSW and I enjoyed the showcase as it 103 00:04:13,519 --> 00:04:17,359 let me display this cool side project 104 00:04:15,680 --> 00:04:20,160 that I made. 105 00:04:17,359 --> 00:04:22,880 Hey, my name is Liv and for the 2021 106 00:04:20,160 --> 00:04:27,040 PyCon Education Showcase, I spoke about 107 00:04:22,880 --> 00:04:30,240 solar powered hearing aids. Um, and now 108 00:04:27,040 --> 00:04:32,400 I am studying engineering in the 109 00:04:30,240 --> 00:04:34,560 University of Technology Sydney along 110 00:04:32,400 --> 00:04:37,520 with a bachelor of arts in international 111 00:04:34,560 --> 00:04:40,400 studies. I'm currently in Zurich in 112 00:04:37,520 --> 00:04:42,880 Switzerland studying physics and I also 113 00:04:40,400 --> 00:04:47,280 work for a satellite company building 114 00:04:42,880 --> 00:04:49,120 satellites. Um, I really liked the 115 00:04:47,280 --> 00:04:51,440 student showcase because I got to see 116 00:04:49,120 --> 00:04:52,639 what everyone else was doing and 117 00:04:51,440 --> 00:04:56,080 everyone was really lovely and 118 00:04:52,639 --> 00:04:59,360 supportive. So, thanks to PyCon. 119 00:04:56,080 --> 00:05:01,840 Hi Pon, it's Manindra here. I was a 120 00:04:59,360 --> 00:05:04,320 student showcase three years ago at PyCon 121 00:05:01,840 --> 00:05:08,160 and I presented my project on uh 122 00:05:04,320 --> 00:05:10,560 debluring with deep learning. Um it was 123 00:05:08,160 --> 00:05:12,479 a group project which was taking digits 124 00:05:10,560 --> 00:05:14,479 and then we were basically blurring them 125 00:05:12,479 --> 00:05:16,720 and then debluring them using deep 126 00:05:14,479 --> 00:05:18,720 learning and my own neural network. 127 00:05:16,720 --> 00:05:20,560 Currently uh I'm a student at the 128 00:05:18,720 --> 00:05:24,639 Australian National University still 129 00:05:20,560 --> 00:05:26,560 doing more AI stuff. Um and yeah, ever 130 00:05:24,639 --> 00:05:29,520 since then I've been just loving AI and 131 00:05:26,560 --> 00:05:31,360 pursuing AI. Uh PyCon really helped build 132 00:05:29,520 --> 00:05:34,720 my confidence and text conferences 133 00:05:31,360 --> 00:05:38,240 weren't so scary. So I love PyCon for 134 00:05:34,720 --> 00:05:40,479 that. Anyways, bye guys. Bye PyCon. 135 00:05:38,240 --> 00:05:43,120 Hi everyone. My name's Angus. Back in 136 00:05:40,479 --> 00:05:45,280 2019, I participated in the PyCon AU 137 00:05:43,120 --> 00:05:47,600 education student showcase and it was 138 00:05:45,280 --> 00:05:48,960 really awesome. I got to share some of 139 00:05:47,600 --> 00:05:50,639 the adventures I've been having 140 00:05:48,960 --> 00:05:52,720 contributing to open source back in high 141 00:05:50,639 --> 00:05:54,320 school. And one of the things I really 142 00:05:52,720 --> 00:05:56,560 enjoyed about the conference was getting 143 00:05:54,320 --> 00:05:58,400 to meet a huge group of like-minded 144 00:05:56,560 --> 00:06:00,880 people who are really passionate about 145 00:05:58,400 --> 00:06:02,800 Python and about tech and sharing what 146 00:06:00,880 --> 00:06:05,600 they know with a community of awesome 147 00:06:02,800 --> 00:06:07,520 people. and I enjoyed it so much that I 148 00:06:05,600 --> 00:06:09,759 went on to study cyber security at uni. 149 00:06:07,520 --> 00:06:12,160 I now work in the field as a graduate 150 00:06:09,759 --> 00:06:14,000 and yeah, it's really awesome. I 151 00:06:12,160 --> 00:06:15,840 nowadays I contribute back to the 152 00:06:14,000 --> 00:06:18,240 community through by volunteering for 153 00:06:15,840 --> 00:06:20,400 our local hacker conference here in CRA 154 00:06:18,240 --> 00:06:22,319 and yeah, so I hope you guys really 155 00:06:20,400 --> 00:06:24,080 enjoy the conference. Give back what you 156 00:06:22,319 --> 00:06:26,000 can, help out. This is a really awesome 157 00:06:24,080 --> 00:06:28,000 community and everyone is willing to 158 00:06:26,000 --> 00:06:30,960 share so much and it's great. 159 00:06:28,000 --> 00:06:33,440 Hi, I'm Izzy. I'm 19. I'm in second year 160 00:06:30,960 --> 00:06:35,440 software engineering here in Sydney. I 161 00:06:33,440 --> 00:06:36,880 was part of the education track in 2018 162 00:06:35,440 --> 00:06:39,600 where I talked about my machine learning 163 00:06:36,880 --> 00:06:41,919 notes and crosses spot and 2023 where I 164 00:06:39,600 --> 00:06:44,560 talked about my year 12 major project. I 165 00:06:41,919 --> 00:06:46,000 then came back to PyCon last year as a 166 00:06:44,560 --> 00:06:48,160 volunteer where I did two lightning 167 00:06:46,000 --> 00:06:50,240 talks and I will be back again this year 168 00:06:48,160 --> 00:06:51,840 as the head of volunteers and I will be 169 00:06:50,240 --> 00:06:53,680 doing a full talk in the education 170 00:06:51,840 --> 00:06:55,120 stream. I just want to say thank you 171 00:06:53,680 --> 00:06:57,840 education track. 172 00:06:55,120 --> 00:07:02,080 Hi, I'm Sam. I presented at the student 173 00:06:57,840 --> 00:07:05,280 showcase in 2018, 2021, and 2022. I've 174 00:07:02,080 --> 00:07:07,039 been volunteering with AV for two years 175 00:07:05,280 --> 00:07:08,880 now, and this is going to be my fourth 176 00:07:07,039 --> 00:07:11,039 year presenting at PyCon. I'm doing a 177 00:07:08,880 --> 00:07:12,960 full talk this year. Uh I'll also be 178 00:07:11,039 --> 00:07:15,840 helping out with AV again this year. So, 179 00:07:12,960 --> 00:07:19,840 you might see me around. That's it. 180 00:07:15,840 --> 00:07:22,000 That's it. So, um we had a closing 181 00:07:19,840 --> 00:07:24,800 slide. The closing slide said thank you. 182 00:07:22,000 --> 00:07:29,319 Um, instead I will say thank you uh 183 00:07:24,800 --> 00:07:29,319 rather than risk uh more updates. 184 00:07:30,639 --> 00:07:36,880 What what was that technical challenges? 185 00:07:33,759 --> 00:07:39,360 I have no idea. Um I hope that gave you 186 00:07:36,880 --> 00:07:41,120 a little sense of how much the education 187 00:07:39,360 --> 00:07:42,319 track means to people who have gone 188 00:07:41,120 --> 00:07:44,479 through it in the community. We think 189 00:07:42,319 --> 00:07:47,440 it's really awesome. Um you're all here. 190 00:07:44,479 --> 00:07:50,560 You're stuck in the room anyway. Um so 191 00:07:47,440 --> 00:07:52,720 let's start. Our first speaker 192 00:07:50,560 --> 00:07:54,080 is not Ally. 193 00:07:52,720 --> 00:07:57,199 You'll be shocked to hear. Our first 194 00:07:54,080 --> 00:08:00,160 speaker is Arabella. Um she has been 195 00:07:57,199 --> 00:08:02,479 coding in Scratch since year three and 196 00:08:00,160 --> 00:08:06,879 in Python since oh sorry for seven 197 00:08:02,479 --> 00:08:11,080 years. Um her favorite emoji is 198 00:08:06,879 --> 00:08:11,080 definitely the skull emoji. 199 00:08:11,120 --> 00:08:17,919 I Yeah, sorry. Um uh something that she 200 00:08:15,360 --> 00:08:19,360 recently learned about computers. Um, I 201 00:08:17,919 --> 00:08:20,879 learned that when you access the cookies 202 00:08:19,360 --> 00:08:22,319 on a web page with JavaScript, they're 203 00:08:20,879 --> 00:08:24,160 not stored as a nicely formatted 204 00:08:22,319 --> 00:08:25,919 dictionary or anything, but literally as 205 00:08:24,160 --> 00:08:28,319 a big long string of names and values 206 00:08:25,919 --> 00:08:31,039 and are super super easy to set, but 207 00:08:28,319 --> 00:08:33,919 surprisingly hard to decode and get info 208 00:08:31,039 --> 00:08:40,839 from. Um, and she's going to be talking 209 00:08:33,919 --> 00:08:40,839 about the fact that phones aren't real. 210 00:08:43,039 --> 00:08:46,680 My name is Arabella Simpson and this is 211 00:08:45,600 --> 00:08:51,839 Phone 212 00:08:46,680 --> 00:08:53,920 [Music] 213 00:08:51,839 --> 00:08:56,399 A couple of years ago, I bought a 4G hat 214 00:08:53,920 --> 00:08:58,240 for my Raspberry Pi. Made a very simple 215 00:08:56,399 --> 00:09:00,320 SMS flask app to cure my phone 216 00:08:58,240 --> 00:09:02,480 addiction, which was lots of fun, but it 217 00:09:00,320 --> 00:09:04,959 was clunky and a bit useless. And then 218 00:09:02,480 --> 00:09:07,120 the hat broke. So last year, I decided 219 00:09:04,959 --> 00:09:09,279 to revamp the project into a smaller and 220 00:09:07,120 --> 00:09:10,560 more original form 221 00:09:09,279 --> 00:09:14,120 and incorporating one of my biggest 222 00:09:10,560 --> 00:09:14,120 passions, robotics. 223 00:09:14,160 --> 00:09:18,320 Now, the idea of a robot phone may seem 224 00:09:16,399 --> 00:09:20,320 shockingly creative to you, but it's an 225 00:09:18,320 --> 00:09:22,640 idea I've been considering for a while. 226 00:09:20,320 --> 00:09:25,120 Inspired by the YA novel Jinx by Amy 227 00:09:22,640 --> 00:09:29,000 Mulock and the satirical conspiracy 228 00:09:25,120 --> 00:09:29,000 theory Birds Aren't Real. 229 00:09:31,760 --> 00:09:35,920 I had seven requirements for this new 230 00:09:33,760 --> 00:09:38,800 project. Number one, it should have all 231 00:09:35,920 --> 00:09:41,600 the advantages of a modern mobile phone. 232 00:09:38,800 --> 00:09:44,160 Put that. Number two, should also have 233 00:09:41,600 --> 00:09:46,080 all the benefits of a robot. Number 234 00:09:44,160 --> 00:09:48,320 three, it should challenge the idea of a 235 00:09:46,080 --> 00:09:52,080 phone. And of course, it should be able 236 00:09:48,320 --> 00:09:56,279 to send text, take photos, record notes, 237 00:09:52,080 --> 00:09:56,279 and show the weather and time. 238 00:09:57,120 --> 00:10:01,760 To make my phone compact, I put all the 239 00:09:59,200 --> 00:10:03,600 Python code onto a Raspberry Pi Zero, 240 00:10:01,760 --> 00:10:05,680 and I designed and manufactured a custom 241 00:10:03,600 --> 00:10:07,279 PCB to mount all the electronic 242 00:10:05,680 --> 00:10:09,460 components and minimize the footprint 243 00:10:07,279 --> 00:10:13,029 and complexity of the design. 244 00:10:09,460 --> 00:10:13,029 [Music] 245 00:10:21,839 --> 00:10:27,440 To power my phone, I use 2,000 mAh 246 00:10:25,200 --> 00:10:29,120 battery, which is charged and provides 5 247 00:10:27,440 --> 00:10:31,519 vol power to the Raspberry Pi with the 248 00:10:29,120 --> 00:10:33,040 Adafruit Power Boost 500 board. This 249 00:10:31,519 --> 00:10:34,560 board has a switch soldered onto it, 250 00:10:33,040 --> 00:10:36,560 which allows me to turn the board on and 251 00:10:34,560 --> 00:10:37,839 off to save power so that it can last as 252 00:10:36,560 --> 00:10:40,240 long as possible without being 253 00:10:37,839 --> 00:10:41,920 recharged. Finally, the touchcreen 254 00:10:40,240 --> 00:10:44,480 interface is through an adorable round 255 00:10:41,920 --> 00:10:46,160 touchcreen LCD from Wisher. The 256 00:10:44,480 --> 00:10:48,320 documentation for the screen has some 257 00:10:46,160 --> 00:10:50,160 sample code on it, which I modified into 258 00:10:48,320 --> 00:10:53,320 a pillbased display class to generate 259 00:10:50,160 --> 00:10:53,320 the output. 260 00:10:53,440 --> 00:10:57,600 Right. So the second requirement I had 261 00:10:56,079 --> 00:11:00,399 was that it should have all the benefits 262 00:10:57,600 --> 00:11:03,360 of a robot which includes the Raspberry 263 00:11:00,399 --> 00:11:07,600 Pi which powers everything Python code 264 00:11:03,360 --> 00:11:12,000 and I wanted it to balance and move and 265 00:11:07,600 --> 00:11:13,760 stuff. Um yeah but in hindsight the self 266 00:11:12,000 --> 00:11:15,279 balancing was not such a great idea 267 00:11:13,760 --> 00:11:20,160 because this just launched itself off 268 00:11:15,279 --> 00:11:22,480 the table and um broke the broke the 269 00:11:20,160 --> 00:11:25,360 stand there. Also, the fact that I 270 00:11:22,480 --> 00:11:28,480 didn't make the stand tall enough, so it 271 00:11:25,360 --> 00:11:31,279 balances like has to be over the edge, 272 00:11:28,480 --> 00:11:33,680 which makes it more likely to launch 273 00:11:31,279 --> 00:11:36,320 yourself off the table. But the 274 00:11:33,680 --> 00:11:39,279 accelerometer balances 275 00:11:36,320 --> 00:11:42,240 as the roll and the angle of the servo 276 00:11:39,279 --> 00:11:45,480 trying to adjust for that, which is 277 00:11:42,240 --> 00:11:45,480 pretty good. 278 00:11:47,279 --> 00:11:54,079 I had lots of prototypes. started with 279 00:11:49,760 --> 00:11:58,240 sketches and then I did a really dodgy 280 00:11:54,079 --> 00:12:03,200 cardboard and tape model and some CAD 281 00:11:58,240 --> 00:12:05,920 modeling solid works and blender and 282 00:12:03,200 --> 00:12:07,440 made one out of core flute. I was 283 00:12:05,920 --> 00:12:09,920 originally going to do a pigeon, but 284 00:12:07,440 --> 00:12:12,240 pigeons, they have really tiny heads, 285 00:12:09,920 --> 00:12:14,320 weirdly long, skinny necks, which was 286 00:12:12,240 --> 00:12:17,200 quite a hassle for trying to deal with 287 00:12:14,320 --> 00:12:20,680 all the cables and trying to fit this 288 00:12:17,200 --> 00:12:20,680 massive camera. 289 00:12:22,079 --> 00:12:27,920 This is the final prototype. It's kind 290 00:12:25,040 --> 00:12:31,200 of inspired by Galar, although I didn't 291 00:12:27,920 --> 00:12:32,720 paint it, so the coloring is more cocku. 292 00:12:31,200 --> 00:12:35,279 we'd have like a conversation with the 293 00:12:32,720 --> 00:12:37,279 bird instead of interacting with the 294 00:12:35,279 --> 00:12:40,800 interface. So, what I've done is I've 295 00:12:37,279 --> 00:12:43,760 got a little PZO buzzer and originally 296 00:12:40,800 --> 00:12:47,279 on the Raspberry Pi 3B Plus, I connect 297 00:12:43,760 --> 00:12:49,120 that with a 3.5 mm connector to the 298 00:12:47,279 --> 00:12:51,600 audio jack. 299 00:12:49,120 --> 00:12:55,200 I use the ESE module as audio output to 300 00:12:51,600 --> 00:12:56,880 have the bird say the names of the apps 301 00:12:55,200 --> 00:13:00,000 that you're entering. The Raspberry Pi 302 00:12:56,880 --> 00:13:01,920 3B Plus doesn't have a 3.5 mil connector 303 00:13:00,000 --> 00:13:05,279 because it is so small than trying to 304 00:13:01,920 --> 00:13:08,399 save space. So instead, I've recreated 305 00:13:05,279 --> 00:13:11,200 on the PCB the original resistor 306 00:13:08,399 --> 00:13:13,200 capacitor circuit for the Raspberry Pi 307 00:13:11,200 --> 00:13:15,519 and I've got audio output through the 308 00:13:13,200 --> 00:13:18,160 GPIO pins. The audio is a little bit 309 00:13:15,519 --> 00:13:19,760 tiny 310 00:13:18,160 --> 00:13:21,680 because the transistors that I used 311 00:13:19,760 --> 00:13:23,440 didn't get wired correctly. So, I've 312 00:13:21,680 --> 00:13:26,399 actually bypassed them on the current 313 00:13:23,440 --> 00:13:28,639 prototype, but with the next PCB, I'll 314 00:13:26,399 --> 00:13:31,519 hopefully fix that issue. Number four 315 00:13:28,639 --> 00:13:34,800 was texts. I wanted to send and receive 316 00:13:31,519 --> 00:13:37,839 messages. Previously, I'd used the 317 00:13:34,800 --> 00:13:40,160 Raspberry Pi specific 4G hack. It's 318 00:13:37,839 --> 00:13:42,720 quite useful because there's dedicated 319 00:13:40,160 --> 00:13:45,360 Python libraries and it uses 80 320 00:13:42,720 --> 00:13:47,360 commands, which is how real life modems 321 00:13:45,360 --> 00:13:48,880 and phones work. 322 00:13:47,360 --> 00:13:53,440 I wanted to see if I could get it 323 00:13:48,880 --> 00:13:56,399 working just using a Telra 4G USB modem. 324 00:13:53,440 --> 00:13:58,880 And when I plug this into my PC, there's 325 00:13:56,399 --> 00:14:00,480 like a website that Telra has made that 326 00:13:58,880 --> 00:14:03,839 you connect to and then you can send 327 00:14:00,480 --> 00:14:05,760 text on there. But doesn't work so well 328 00:14:03,839 --> 00:14:07,360 for the Raspberry Pi, especially the 329 00:14:05,760 --> 00:14:11,680 Raspberry Pi Zero. It doesn't have 330 00:14:07,360 --> 00:14:13,680 enough RAM to actually use the browser. 331 00:14:11,680 --> 00:14:16,639 at commands that didn't work because of 332 00:14:13,680 --> 00:14:19,360 the software which is very user friendly 333 00:14:16,639 --> 00:14:21,600 if you have a PC not so user friendly if 334 00:14:19,360 --> 00:14:23,839 you're trying to make your own phone 335 00:14:21,600 --> 00:14:26,720 discovered that you could theoretically 336 00:14:23,839 --> 00:14:28,560 access the browser interface using 337 00:14:26,720 --> 00:14:32,240 Selenium which is an awesome Python 338 00:14:28,560 --> 00:14:34,160 library that um opens the browser and 339 00:14:32,240 --> 00:14:36,399 you can 340 00:14:34,160 --> 00:14:39,040 read stuff as you would with the request 341 00:14:36,399 --> 00:14:42,000 module but you can actually interact in 342 00:14:39,040 --> 00:14:43,680 real time um so I tried using that and I 343 00:14:42,000 --> 00:14:45,839 think it would be possible maybe to get 344 00:14:43,680 --> 00:14:50,519 working but haven't had any success at 345 00:14:45,839 --> 00:14:50,519 all even on a different Raspberry Pi. 346 00:14:52,800 --> 00:14:57,920 My fifth requirement was the camera app 347 00:14:55,600 --> 00:15:00,320 taking photos, recording videos and also 348 00:14:57,920 --> 00:15:02,800 looking back at the photos. Go into the 349 00:15:00,320 --> 00:15:06,680 menu and there's a camera app. This is a 350 00:15:02,800 --> 00:15:06,680 Raspberry Pi camera V2. 351 00:15:08,370 --> 00:15:15,580 [Music] 352 00:15:15,839 --> 00:15:22,480 Okay. So, the notes app, which is both a 353 00:15:20,560 --> 00:15:25,360 useful function to have on a phone, but 354 00:15:22,480 --> 00:15:28,399 also is sort of a template for how I'm 355 00:15:25,360 --> 00:15:30,560 going to implement the SMS for text if I 356 00:15:28,399 --> 00:15:32,160 ever get that working. So, the notes 357 00:15:30,560 --> 00:15:35,279 app, you've got two ways that you can 358 00:15:32,160 --> 00:15:37,120 make notes. Number one is through this 359 00:15:35,279 --> 00:15:39,519 microphone. microphone is mounted in the 360 00:15:37,120 --> 00:15:43,440 eye. USB microphone. You can dictate 361 00:15:39,519 --> 00:15:46,240 notes with that. Um, and I've got is it 362 00:15:43,440 --> 00:15:50,519 Google speech to text? I don't know. Um, 363 00:15:46,240 --> 00:15:50,519 anyway, you can dictate notes. 364 00:15:52,000 --> 00:15:56,240 Hello, this is some text. Please 365 00:15:54,240 --> 00:15:57,920 transcribe it. 366 00:15:56,240 --> 00:16:00,959 Three hours later. 367 00:15:57,920 --> 00:16:03,279 Uh, yeah, close enough, I guess. And the 368 00:16:00,959 --> 00:16:06,000 other type of note takingaking is a draw 369 00:16:03,279 --> 00:16:09,639 function where you can write notes like 370 00:16:06,000 --> 00:16:09,639 on an Apple Watch. 371 00:16:18,399 --> 00:16:23,120 Number seven was showing the weather and 372 00:16:20,880 --> 00:16:25,199 time on the home screen without having 373 00:16:23,120 --> 00:16:28,000 to open the phone or other apps and 374 00:16:25,199 --> 00:16:30,480 getting distracted. Yeah, I just used a 375 00:16:28,000 --> 00:16:33,040 basic weather API for that and the 376 00:16:30,480 --> 00:16:35,040 daytime module. But that's all I've got 377 00:16:33,040 --> 00:16:37,490 time for in this video. Thanks for 378 00:16:35,040 --> 00:16:40,730 watching. Bye. 379 00:16:37,490 --> 00:16:40,730 [Music] 380 00:16:45,199 --> 00:16:50,959 Yeah. How awesome was that? 381 00:16:48,480 --> 00:16:54,560 Okay, so um unfortunately Arabella is 382 00:16:50,959 --> 00:16:57,199 notably not here, but I know you all 383 00:16:54,560 --> 00:17:00,480 have questions. And I have I have 384 00:16:57,199 --> 00:17:03,440 questions. Um you can post those 385 00:17:00,480 --> 00:17:05,760 questions in the Discord. 386 00:17:03,440 --> 00:17:08,799 She's not there yet, but she will be 387 00:17:05,760 --> 00:17:10,720 hopefully soon. Also, that's a we're 388 00:17:08,799 --> 00:17:12,079 going to have uh we've got one more 389 00:17:10,720 --> 00:17:14,559 video presentation in a second and then 390 00:17:12,079 --> 00:17:16,880 we're going to have live physical 391 00:17:14,559 --> 00:17:19,520 located students and then hold all of 392 00:17:16,880 --> 00:17:21,280 your questions until the end. I don't 393 00:17:19,520 --> 00:17:23,919 know about you, but I have really bad 394 00:17:21,280 --> 00:17:27,280 memory. So if you want you should write 395 00:17:23,919 --> 00:17:30,160 your questions down and then at the end 396 00:17:27,280 --> 00:17:32,559 we can ask them live put them in the 397 00:17:30,160 --> 00:17:34,240 discord so that yeah we know where they 398 00:17:32,559 --> 00:17:35,200 are and then the students can feel 399 00:17:34,240 --> 00:17:38,880 special because then they'll get 400 00:17:35,200 --> 00:17:42,240 questions. Um cool. Next up we have not 401 00:17:38,880 --> 00:17:43,760 Ally again we have Hudson. Um he is 402 00:17:42,240 --> 00:17:45,919 going to be talking about the fact that 403 00:17:43,760 --> 00:17:49,520 words aren't really no words are 404 00:17:45,919 --> 00:17:52,000 vectors. Um he's been programming he 405 00:17:49,520 --> 00:17:54,000 started programming in 2023 at the start 406 00:17:52,000 --> 00:17:57,760 of year 9 and it's been a bit over two 407 00:17:54,000 --> 00:18:02,640 years now. Um Hudson's favorite emoji is 408 00:17:57,760 --> 00:18:04,640 the chicken emoji. Yeah. Uh and he 409 00:18:02,640 --> 00:18:06,240 recently learned that in his computer 410 00:18:04,640 --> 00:18:08,240 science class we were all studying 411 00:18:06,240 --> 00:18:10,480 different storage techniques. I learned 412 00:18:08,240 --> 00:18:14,320 that theoretically all of the data that 413 00:18:10,480 --> 00:18:17,120 humans will generate in 2025 over 33 414 00:18:14,320 --> 00:18:20,080 zetabytes could be compressed with DNA 415 00:18:17,120 --> 00:18:21,760 storage into the size of a pingpong 416 00:18:20,080 --> 00:18:24,960 ball. 417 00:18:21,760 --> 00:18:27,280 And now we all know that it's wild. 418 00:18:24,960 --> 00:18:29,760 Okay. Uh Hudson. 419 00:18:27,280 --> 00:18:31,200 Hi Pon. I'm Hudson Wolfford. Let me ask 420 00:18:29,760 --> 00:18:33,840 you something. Have you ever wondered 421 00:18:31,200 --> 00:18:35,840 how chatbt can understand your prompts? 422 00:18:33,840 --> 00:18:37,919 Or maybe how Outlook categorizes your 423 00:18:35,840 --> 00:18:39,760 emails? Or maybe you've questioned how 424 00:18:37,919 --> 00:18:43,600 Google can tell the difference between 425 00:18:39,760 --> 00:18:46,000 Apple and an apple. Well, there is one 426 00:18:43,600 --> 00:18:48,240 thing in common with all these word 427 00:18:46,000 --> 00:18:49,520 embeds. In this video, I'll walk you 428 00:18:48,240 --> 00:18:51,440 through my journey learning about word 429 00:18:49,520 --> 00:18:53,840 embeds and how I use them in my game 430 00:18:51,440 --> 00:18:55,919 linkm, an online puzzle about chaining 431 00:18:53,840 --> 00:18:58,640 semantically similar words to reach a 432 00:18:55,919 --> 00:19:01,039 target word. But first, some background 433 00:18:58,640 --> 00:19:03,120 on me and the project. I started coding 434 00:19:01,039 --> 00:19:05,360 a little over two years ago when I first 435 00:19:03,120 --> 00:19:07,919 moved to Australia. This was mostly in 436 00:19:05,360 --> 00:19:10,240 unity with C where I made fun games with 437 00:19:07,919 --> 00:19:12,880 my classmates. But this year I started 438 00:19:10,240 --> 00:19:15,120 IB computer science and as part of the 439 00:19:12,880 --> 00:19:17,760 class we were given a project to create 440 00:19:15,120 --> 00:19:19,679 anything using Python. Naturally during 441 00:19:17,760 --> 00:19:21,440 this ideation process I got a little 442 00:19:19,679 --> 00:19:23,679 distracted playing word games like 443 00:19:21,440 --> 00:19:25,520 semantle or contextto. If you've never 444 00:19:23,679 --> 00:19:28,000 played these before, the goal is to 445 00:19:25,520 --> 00:19:30,000 guess a target word where each guess is 446 00:19:28,000 --> 00:19:31,440 given a similarity ranking to the 447 00:19:30,000 --> 00:19:33,039 targets. 448 00:19:31,440 --> 00:19:34,400 While playing these, it struck me how 449 00:19:33,039 --> 00:19:36,559 well the computer could understand 450 00:19:34,400 --> 00:19:38,640 language. And I immediately knew I 451 00:19:36,559 --> 00:19:40,480 wanted to do something similar. So, I 452 00:19:38,640 --> 00:19:43,520 researched how they work and figured out 453 00:19:40,480 --> 00:19:45,679 that they rely on word embeddings. Put 454 00:19:43,520 --> 00:19:48,480 simply, these embeddings are vector 455 00:19:45,679 --> 00:19:51,039 representations of words. For example, 456 00:19:48,480 --> 00:19:56,160 the word king may have the coordinates 2 457 00:19:51,039 --> 00:19:59,679 and 4. Queen may be at 2.5 and 3.5. And 458 00:19:56,160 --> 00:20:02,160 Python may be at four and one. These are 459 00:19:59,679 --> 00:20:04,799 meant to capture the meaning of words 460 00:20:02,160 --> 00:20:06,880 with words of similar meaning possessing 461 00:20:04,799 --> 00:20:08,880 similar vectors. 462 00:20:06,880 --> 00:20:10,559 Many algorithms exist to create these 463 00:20:08,880 --> 00:20:12,799 word embeddings, but the one that I 464 00:20:10,559 --> 00:20:15,039 found the most success with was global 465 00:20:12,799 --> 00:20:18,000 vectors for word representation or 466 00:20:15,039 --> 00:20:21,120 glove. What glove does is take some 467 00:20:18,000 --> 00:20:24,080 text, a corpus. Here's an example corpus 468 00:20:21,120 --> 00:20:26,799 from Charles Dickens. Next, Glove scans 469 00:20:24,080 --> 00:20:29,039 this to generate a co-occurrence matrix 470 00:20:26,799 --> 00:20:31,200 between each word. This shows the 471 00:20:29,039 --> 00:20:34,159 frequency that each word appears in 472 00:20:31,200 --> 00:20:36,480 another word's context. Then through 473 00:20:34,159 --> 00:20:38,960 matrix factorization, they generate 474 00:20:36,480 --> 00:20:41,520 vector representations of each word that 475 00:20:38,960 --> 00:20:43,360 demonstrate semantic meaning. To really 476 00:20:41,520 --> 00:20:46,320 capture the meaning of words, you need 477 00:20:43,360 --> 00:20:48,159 an enormous corpus. Thankfully, the 478 00:20:46,320 --> 00:20:50,320 Stanford Natural Language Processing 479 00:20:48,159 --> 00:20:52,159 Group offers pre-trained vectors on 480 00:20:50,320 --> 00:20:54,400 Wikipedia, so I didn't have to train 481 00:20:52,159 --> 00:20:56,320 these vectors myself. Now that I had 482 00:20:54,400 --> 00:20:58,640 these vectors, I could measure the 483 00:20:56,320 --> 00:21:01,120 distance between two words to tell how 484 00:20:58,640 --> 00:21:02,480 close they are in meaning. However, this 485 00:21:01,120 --> 00:21:05,039 isn't done with your conventional 486 00:21:02,480 --> 00:21:07,440 uklidian distance operation. Using this 487 00:21:05,039 --> 00:21:09,120 actually provides inaccurate results as 488 00:21:07,440 --> 00:21:11,280 meaning is more associated with the 489 00:21:09,120 --> 00:21:13,760 direction of the word from the origin 490 00:21:11,280 --> 00:21:16,320 rather than position. Instead, we take 491 00:21:13,760 --> 00:21:18,320 what's called a cosine similarity. 492 00:21:16,320 --> 00:21:20,559 Cosine similarity leverages the vector 493 00:21:18,320 --> 00:21:23,280 form of the words to measure the angle 494 00:21:20,559 --> 00:21:26,480 between them. Here let's call the angle 495 00:21:23,280 --> 00:21:29,039 between queen and king theta. Then we 496 00:21:26,480 --> 00:21:31,200 can take the coine of this angle. 497 00:21:29,039 --> 00:21:33,600 Varying the position of the word vectors 498 00:21:31,200 --> 00:21:35,919 varies the cosine as well with farther 499 00:21:33,600 --> 00:21:39,120 words providing lower values and closer 500 00:21:35,919 --> 00:21:40,880 words producing higher values. Of course 501 00:21:39,120 --> 00:21:43,280 cosine provides a value between negative 502 00:21:40,880 --> 00:21:46,080 1 and one. But some simple operations 503 00:21:43,280 --> 00:21:47,600 can remap this to between zero and one. 504 00:21:46,080 --> 00:21:50,720 And hence we now have a percentage 505 00:21:47,600 --> 00:21:53,520 similarity of different words. This is 506 00:21:50,720 --> 00:21:55,520 how we determine word similarity. I've 507 00:21:53,520 --> 00:21:57,440 simplified these vectors to 2D, but in 508 00:21:55,520 --> 00:21:59,520 reality, these vectors are often over 50 509 00:21:57,440 --> 00:22:02,159 dimensions. In fact, the ones that I use 510 00:21:59,520 --> 00:22:04,159 in linking them are 100 dimensional. 511 00:22:02,159 --> 00:22:06,640 Finding the angle between two of these 512 00:22:04,159 --> 00:22:08,799 seems complex, but this is where the dot 513 00:22:06,640 --> 00:22:11,520 product comes in. Let's take the dot 514 00:22:08,799 --> 00:22:14,640 product of two two-dimensional vectors A 515 00:22:11,520 --> 00:22:17,360 and B. Expanded. This is simply a sum of 516 00:22:14,640 --> 00:22:19,520 the products of each dimension. And this 517 00:22:17,360 --> 00:22:22,080 value is actually the coine of the angle 518 00:22:19,520 --> 00:22:24,559 between the two vectors multiplied by 519 00:22:22,080 --> 00:22:26,799 their magnitudes. And therefore the 520 00:22:24,559 --> 00:22:29,280 cosine similarity is simply the 521 00:22:26,799 --> 00:22:32,960 dotproduct over the product of the 522 00:22:29,280 --> 00:22:35,120 magnitude of the two vectors. 523 00:22:32,960 --> 00:22:37,520 Implementing this in code is extremely 524 00:22:35,120 --> 00:22:40,799 simple. Thanks to PyTorch, the function 525 00:22:37,520 --> 00:22:42,880 that I use is only three lines. Now that 526 00:22:40,799 --> 00:22:45,679 I had a system to compare words, I 527 00:22:42,880 --> 00:22:47,520 planned the core idea of my game. The 528 00:22:45,679 --> 00:22:49,200 user would be given a random start and 529 00:22:47,520 --> 00:22:51,200 target word and then they would have to 530 00:22:49,200 --> 00:22:52,880 chain their way to the target by using 531 00:22:51,200 --> 00:22:55,440 words sufficiently similar to their 532 00:22:52,880 --> 00:22:58,159 previous guess. For example, to get from 533 00:22:55,440 --> 00:23:02,240 protest to jaguar, a chain might be 534 00:22:58,159 --> 00:23:06,480 protest to fight to hunt to animal to 535 00:23:02,240 --> 00:23:08,159 cat to panther and then to jaguar. 536 00:23:06,480 --> 00:23:10,640 It wasn't long before I had a console 537 00:23:08,159 --> 00:23:12,640 based version of the game working. All I 538 00:23:10,640 --> 00:23:14,400 had to do was generate a start and 539 00:23:12,640 --> 00:23:16,640 target word and have the user 540 00:23:14,400 --> 00:23:19,039 continuously guess within a specified 541 00:23:16,640 --> 00:23:20,880 boundary of similarity. 542 00:23:19,039 --> 00:23:23,039 And there we go. That's how I made 543 00:23:20,880 --> 00:23:26,240 Lincoln. Thanks for watching and I 544 00:23:23,039 --> 00:23:30,440 appreciate your time. 545 00:23:26,240 --> 00:23:30,440 Just kidding. I still do. Great. 546 00:23:37,440 --> 00:23:40,679 I'm confused. 547 00:23:42,559 --> 00:23:49,159 a fake ending. 548 00:23:45,280 --> 00:23:49,159 Hang on a second. 549 00:23:50,400 --> 00:23:54,960 Create an entire UI for the project, 550 00:23:52,720 --> 00:23:55,679 which of course ended up taking the most 551 00:23:54,960 --> 00:23:57,200 time. 552 00:23:55,679 --> 00:23:59,520 Since we're only allowed to code in 553 00:23:57,200 --> 00:24:02,000 Python, I chose to use the nice GUI 554 00:23:59,520 --> 00:24:04,080 Python library. It uses your browser to 555 00:24:02,000 --> 00:24:06,400 render the UI, allowing me to test it in 556 00:24:04,080 --> 00:24:08,559 a website environment. A lot of this 557 00:24:06,400 --> 00:24:10,559 code is boring text and formatting, so I 558 00:24:08,559 --> 00:24:12,720 won't waste time going over it. However, 559 00:24:10,559 --> 00:24:14,559 there were some interesting parts. For 560 00:24:12,720 --> 00:24:16,480 example, I wanted to create a hidden 561 00:24:14,559 --> 00:24:18,320 system for the user where the computer 562 00:24:16,480 --> 00:24:19,600 would automatically solve the puzzle. 563 00:24:18,320 --> 00:24:21,279 While this initially seems 564 00:24:19,600 --> 00:24:23,840 straightforward, it turned out to be a 565 00:24:21,279 --> 00:24:26,159 complex path finding problem. Imagine 566 00:24:23,840 --> 00:24:27,919 each word as a node and a graph with 567 00:24:26,159 --> 00:24:30,159 edges representing possible connections 568 00:24:27,919 --> 00:24:32,159 in the game. In order to get from one 569 00:24:30,159 --> 00:24:33,840 word to another in the shortest time 570 00:24:32,159 --> 00:24:36,400 possible, you need to search the graph 571 00:24:33,840 --> 00:24:38,320 for an optimal path. Many algorithms 572 00:24:36,400 --> 00:24:40,640 exist to achieve this and I experimented 573 00:24:38,320 --> 00:24:42,880 with breathford search or dystras, but 574 00:24:40,640 --> 00:24:45,279 these were too slow. Instead, I wanted 575 00:24:42,880 --> 00:24:47,200 almost instant feedback for the user. 576 00:24:45,279 --> 00:24:48,720 So, I opted for a greedy algorithm. 577 00:24:47,200 --> 00:24:51,039 While it doesn't always provide the 578 00:24:48,720 --> 00:24:53,679 shortest path, that was my goal. I only 579 00:24:51,039 --> 00:24:56,000 wanted to find a path quickly. How the 580 00:24:53,679 --> 00:24:57,840 greedy algorithm works is to check all 581 00:24:56,000 --> 00:24:59,679 connections from the start node and 582 00:24:57,840 --> 00:25:03,360 calculate the similarity to the target 583 00:24:59,679 --> 00:25:05,039 for each one. This is the heristic. Then 584 00:25:03,360 --> 00:25:07,679 it chooses the node with the most 585 00:25:05,039 --> 00:25:09,919 similarity to the target and repeats the 586 00:25:07,679 --> 00:25:12,159 process. This algorithm finds a path 587 00:25:09,919 --> 00:25:14,000 almost immediately to the target word. 588 00:25:12,159 --> 00:25:16,320 And so at this point I had both a 589 00:25:14,000 --> 00:25:18,400 functional game for the user and a hint 590 00:25:16,320 --> 00:25:19,919 system if they got stuck. The only next 591 00:25:18,400 --> 00:25:22,080 step was to release the game to the 592 00:25:19,919 --> 00:25:24,640 public. To do this, I transferred the 593 00:25:22,080 --> 00:25:26,559 linkinm code onto my Raspberry Pi and 594 00:25:24,640 --> 00:25:28,960 connected it to a Cloudflare tunnel to 595 00:25:26,559 --> 00:25:30,799 host it on my own custom domain. And 596 00:25:28,960 --> 00:25:33,279 that's it. You can play linkin by 597 00:25:30,799 --> 00:25:35,279 visiting linkinm.com or by searching for 598 00:25:33,279 --> 00:25:37,520 it on Google. But in case you don't have 599 00:25:35,279 --> 00:25:39,279 the time, here's a short demonstration. 600 00:25:37,520 --> 00:25:41,200 Here is an example of a randomly 601 00:25:39,279 --> 00:25:43,600 generated linkin game where the goal is 602 00:25:41,200 --> 00:25:45,360 to get from respondent to eradicate in 603 00:25:43,600 --> 00:25:47,120 the shortest amount of links possible. 604 00:25:45,360 --> 00:25:49,200 The progress bar here represents how 605 00:25:47,120 --> 00:25:52,320 similar you are to eradicate. So we can 606 00:25:49,200 --> 00:25:54,240 see that respondent is only 14% similar. 607 00:25:52,320 --> 00:25:56,559 To start, you would guess a word that is 608 00:25:54,240 --> 00:25:58,960 similar to respondent but is also on the 609 00:25:56,559 --> 00:26:00,960 way to eradicate. For example, you might 610 00:25:58,960 --> 00:26:02,559 guess defendant. 611 00:26:00,960 --> 00:26:04,320 And you can see here that that links 612 00:26:02,559 --> 00:26:06,480 successfully. Of course, if I guess 613 00:26:04,320 --> 00:26:08,480 something like run, this has no 614 00:26:06,480 --> 00:26:11,760 association with defendant. So 615 00:26:08,480 --> 00:26:13,919 therefore, it doesn't link. When I play 616 00:26:11,760 --> 00:26:15,760 these, I like to think backwards. So 617 00:26:13,919 --> 00:26:18,080 when I think of eradicates, I think of 618 00:26:15,760 --> 00:26:21,120 virus. When I think of virus, I think of 619 00:26:18,080 --> 00:26:25,039 immunity. Immunity ties into defense. So 620 00:26:21,120 --> 00:26:26,960 from defendant, I would go defense. 621 00:26:25,039 --> 00:26:30,880 Immunity. 622 00:26:26,960 --> 00:26:33,919 From here, I could go vaccines. 623 00:26:30,880 --> 00:26:37,440 And then we're very close now. 65%. So I 624 00:26:33,919 --> 00:26:39,919 think with virus eradicates. 625 00:26:37,440 --> 00:26:41,679 And there we go. That's licking in. 626 00:26:39,919 --> 00:26:43,600 Linkin was a great project to learn 627 00:26:41,679 --> 00:26:45,919 about word embeddings and Python in 628 00:26:43,600 --> 00:26:48,080 general. In fact, I plan to continue it 629 00:26:45,919 --> 00:26:49,600 into the future. Specifically, I'd like 630 00:26:48,080 --> 00:26:51,840 to learn how to train my own word 631 00:26:49,600 --> 00:26:54,960 vectors and also improve the hint system 632 00:26:51,840 --> 00:26:56,799 to use less obscure words. Anyways, I 633 00:26:54,960 --> 00:26:59,170 hope you enjoyed this video and thanks 634 00:26:56,799 --> 00:27:07,650 for watching. 635 00:26:59,170 --> 00:27:07,650 [Applause] 636 00:27:07,919 --> 00:27:13,840 For reals this time 637 00:27:11,120 --> 00:27:19,279 that was that was really awesome. Um, 638 00:27:13,840 --> 00:27:20,960 Kayn up on deck. Kalin is next. 639 00:27:19,279 --> 00:27:25,440 And 640 00:27:20,960 --> 00:27:28,640 Kayn has been programming for two years. 641 00:27:25,440 --> 00:27:31,840 His favorite emoji 642 00:27:28,640 --> 00:27:33,679 is a sad face. 643 00:27:31,840 --> 00:27:34,480 Is it Is it sad or is it 644 00:27:33,679 --> 00:27:37,440 It's one of those. 645 00:27:34,480 --> 00:27:38,720 H I mean Oh, it's Yeah, it's kind of 646 00:27:37,440 --> 00:27:39,039 shock sad. 647 00:27:38,720 --> 00:27:41,039 Sad. 648 00:27:39,039 --> 00:27:44,960 Shock sad. 649 00:27:41,039 --> 00:27:47,679 Yeah. Um, Kayn recently learned that 650 00:27:44,960 --> 00:27:50,480 Facebook's like button was originally 651 00:27:47,679 --> 00:27:52,159 called an awesome button, but they 652 00:27:50,480 --> 00:27:55,799 changed it before launch as they thought 653 00:27:52,159 --> 00:27:55,799 it was too childish. 654 00:27:56,080 --> 00:28:01,600 Boo. Um, Kayn is going to be talking 655 00:28:00,080 --> 00:28:05,760 about 656 00:28:01,600 --> 00:28:09,039 designing for dual audiences a study app 657 00:28:05,760 --> 00:28:11,600 for students and teachers. Are you 658 00:28:09,039 --> 00:28:13,440 trying to teach your teachers something? 659 00:28:11,600 --> 00:28:18,200 Ah. 660 00:28:13,440 --> 00:28:18,200 Uh, Kayen, off you go. Thank you. 661 00:28:18,880 --> 00:28:23,960 Let's get a round of applause while I 662 00:28:20,559 --> 00:28:23,960 sort this out. 663 00:28:31,120 --> 00:28:36,080 Thank you. Of course. Of course. Um, 664 00:28:34,000 --> 00:28:40,799 yeah. This is Ajura, my study app for 665 00:28:36,080 --> 00:28:43,360 teachers and students combined. Um, 666 00:28:40,799 --> 00:28:44,799 slides aren't. There we go. Yeah. So, 667 00:28:43,360 --> 00:28:46,559 why did I build Ajura? Well, I built 668 00:28:44,799 --> 00:28:48,240 Ajura in the first place obviously to 669 00:28:46,559 --> 00:28:50,320 keep track of studying, homework, and 670 00:28:48,240 --> 00:28:52,000 assignments, but most importantly to 671 00:28:50,320 --> 00:28:53,520 link students and teachers because 672 00:28:52,000 --> 00:28:55,360 typically, you know, study apps like 673 00:28:53,520 --> 00:28:57,279 Canvas obviously are very teacher 674 00:28:55,360 --> 00:28:58,720 one-sided and so you you kind of have 675 00:28:57,279 --> 00:29:01,279 this disconnect between the teacher and 676 00:28:58,720 --> 00:29:02,960 the student. Um and you know obviously 677 00:29:01,279 --> 00:29:04,960 through canvas teachers only see 678 00:29:02,960 --> 00:29:06,720 underlying marks and trends through 679 00:29:04,960 --> 00:29:08,240 something like marks which are you know 680 00:29:06,720 --> 00:29:10,640 very one-dimensional and very hard to 681 00:29:08,240 --> 00:29:12,159 see. So this is where Ajura comes in and 682 00:29:10,640 --> 00:29:13,600 and that's one of my assignments that I 683 00:29:12,159 --> 00:29:16,720 submitted late because I didn't keep 684 00:29:13,600 --> 00:29:18,640 track of it. Um but yeah this is Ajura. 685 00:29:16,720 --> 00:29:20,880 So, Ajura is a platform designed for 686 00:29:18,640 --> 00:29:22,240 both students and teachers. Um, where 687 00:29:20,880 --> 00:29:24,240 educators have the ability to both 688 00:29:22,240 --> 00:29:25,840 create and manage classes, use a join 689 00:29:24,240 --> 00:29:27,600 code to individually invite students as 690 00:29:25,840 --> 00:29:30,320 well as assign tasks, monitor task 691 00:29:27,600 --> 00:29:31,760 completion, and see studying trends. But 692 00:29:30,320 --> 00:29:33,360 also for students, as you can see, 693 00:29:31,760 --> 00:29:34,880 that's a student dashboard up there. 694 00:29:33,360 --> 00:29:36,559 Students can log their study time 695 00:29:34,880 --> 00:29:38,399 visualized in a variety of graphs, as 696 00:29:36,559 --> 00:29:40,640 well as create and receive their own 697 00:29:38,399 --> 00:29:42,399 tasks. Um, and graphs for me just kind 698 00:29:40,640 --> 00:29:45,200 of help visualize my data because you 699 00:29:42,399 --> 00:29:46,559 often spend I think it's a total of, you 700 00:29:45,200 --> 00:29:47,600 know, close to a thousand hours over 701 00:29:46,559 --> 00:29:49,039 your school career or something like 702 00:29:47,600 --> 00:29:50,559 that studying. And so seeing that data 703 00:29:49,039 --> 00:29:52,640 and actually visualizing that data for 704 00:29:50,559 --> 00:29:54,159 me was really nice to see and kind of 705 00:29:52,640 --> 00:29:55,679 rewarding for all the studying I was 706 00:29:54,159 --> 00:29:58,240 doing, especially in the leadup to the 707 00:29:55,679 --> 00:30:00,320 HSC. Um, but yeah, so this is what I 708 00:29:58,240 --> 00:30:02,399 did. So my main issue was designing a UI 709 00:30:00,320 --> 00:30:04,720 for two different groups of users. And 710 00:30:02,399 --> 00:30:06,960 doing this, I used Flask and Ginger, um, 711 00:30:04,720 --> 00:30:09,679 which is a Python backend for serving 712 00:30:06,960 --> 00:30:11,600 routes. Um and then Ginger to 713 00:30:09,679 --> 00:30:12,559 dynamically render the HTML pages. As 714 00:30:11,600 --> 00:30:14,640 you can see there, that's just some 715 00:30:12,559 --> 00:30:16,799 simple code on how it works. Um but 716 00:30:14,640 --> 00:30:18,799 let's actually see what it looks like. 717 00:30:16,799 --> 00:30:21,120 Um so in creating the studentf facing 718 00:30:18,799 --> 00:30:23,039 interface, I am for an intuitive easy to 719 00:30:21,120 --> 00:30:24,720 easy to use UI which provided broad data 720 00:30:23,039 --> 00:30:27,039 visualizations for all their studying 721 00:30:24,720 --> 00:30:28,960 and tasks in one place. As you can see, 722 00:30:27,039 --> 00:30:30,960 this also involves joining and joining 723 00:30:28,960 --> 00:30:33,919 classes as well as allocating studying 724 00:30:30,960 --> 00:30:35,679 towards classes as you can see here. Um 725 00:30:33,919 --> 00:30:37,919 and then also creating study sessions 726 00:30:35,679 --> 00:30:39,919 towards classes which you can track your 727 00:30:37,919 --> 00:30:41,679 per day studying and viewing and 728 00:30:39,919 --> 00:30:45,279 completing tasks assigned by teachers 729 00:30:41,679 --> 00:30:47,840 and also created by yourself. 730 00:30:45,279 --> 00:30:50,720 Yeah. And you can sort them as well but 731 00:30:47,840 --> 00:30:52,320 move on. Uh yeah in comparison my 732 00:30:50,720 --> 00:30:54,320 teacher facing interface was designed to 733 00:30:52,320 --> 00:30:56,159 be more functional and data inensive 734 00:30:54,320 --> 00:30:58,480 supporting class creation and editing as 735 00:30:56,159 --> 00:31:00,720 well as detailed class views. Each class 736 00:30:58,480 --> 00:31:02,559 view included task, session, and student 737 00:31:00,720 --> 00:31:04,640 filtering along with interactive data 738 00:31:02,559 --> 00:31:06,720 visualizations to highlight trends and 739 00:31:04,640 --> 00:31:09,679 provide insights into what students were 740 00:31:06,720 --> 00:31:11,039 actually doing in real time. Also, you 741 00:31:09,679 --> 00:31:13,200 can invite students and kind of like 742 00:31:11,039 --> 00:31:15,360 Cahoot, you can join classes via join 743 00:31:13,200 --> 00:31:17,279 codes. Um, and this is just the teacher 744 00:31:15,360 --> 00:31:20,679 interface for managing tasks across 745 00:31:17,279 --> 00:31:20,679 their different classes. 746 00:31:20,720 --> 00:31:24,640 Video is going to keep going, but I'll 747 00:31:22,559 --> 00:31:26,240 move on. Um, you know, there were a 748 00:31:24,640 --> 00:31:28,399 couple of issues when I was creating my 749 00:31:26,240 --> 00:31:30,799 app. Primarily it was the tasking 750 00:31:28,399 --> 00:31:32,320 system. Um and while it doesn't seem 751 00:31:30,799 --> 00:31:33,760 like a big issue, I wanted students to 752 00:31:32,320 --> 00:31:35,840 have the ability to create their own 753 00:31:33,760 --> 00:31:39,919 tasks as well as for teachers to assign 754 00:31:35,840 --> 00:31:41,440 tasks sort of wide wide classwide. Um 755 00:31:39,919 --> 00:31:43,279 and so initially I thought this sort of 756 00:31:41,440 --> 00:31:45,039 like iterative single table-based 757 00:31:43,279 --> 00:31:46,320 approach would work in which a teacher 758 00:31:45,039 --> 00:31:48,159 would iterate through students in a 759 00:31:46,320 --> 00:31:50,399 class creating different tasks as you 760 00:31:48,159 --> 00:31:52,159 can see here. Um, however, teachers have 761 00:31:50,399 --> 00:31:54,320 no reliable way to track these tasks 762 00:31:52,159 --> 00:31:56,399 once they've been output. Um, since each 763 00:31:54,320 --> 00:31:58,240 one has sort of this unique ID and 764 00:31:56,399 --> 00:31:59,600 storing them in a list of unique IDs, it 765 00:31:58,240 --> 00:32:01,279 proves inefficient when you have to 766 00:31:59,600 --> 00:32:02,880 iterate through different tasks to edit 767 00:32:01,279 --> 00:32:05,519 them or delete them or update anything 768 00:32:02,880 --> 00:32:07,840 about the task. Um, and so instead I 769 00:32:05,519 --> 00:32:10,159 opted for a two tablebased solution um, 770 00:32:07,840 --> 00:32:13,039 in which teachers upload this sort of 771 00:32:10,159 --> 00:32:15,120 template task to a template task table 772 00:32:13,039 --> 00:32:16,720 and then students have the ability to 773 00:32:15,120 --> 00:32:19,039 connect with this task via their own 774 00:32:16,720 --> 00:32:20,720 task with a foreign key. So basically 775 00:32:19,039 --> 00:32:22,080 teachers will create a task and then 776 00:32:20,720 --> 00:32:24,320 this iterates through students in the 777 00:32:22,080 --> 00:32:26,320 class creating a placeholder task within 778 00:32:24,320 --> 00:32:28,240 the individual student table and then 779 00:32:26,320 --> 00:32:29,840 these individual tasks have no values on 780 00:32:28,240 --> 00:32:32,720 their own and so they they sort of get 781 00:32:29,840 --> 00:32:33,840 their data from the teacher task. Um and 782 00:32:32,720 --> 00:32:35,279 yeah this just sort of makes 783 00:32:33,840 --> 00:32:36,799 interpreting the data and displaying the 784 00:32:35,279 --> 00:32:38,799 data really easy because you can sort of 785 00:32:36,799 --> 00:32:39,919 join the two tables. Um and then 786 00:32:38,799 --> 00:32:41,760 basically all I have to do to display 787 00:32:39,919 --> 00:32:44,399 this data is iterate through a 2D list 788 00:32:41,760 --> 00:32:47,919 as you can see here. Um and yeah you can 789 00:32:44,399 --> 00:32:50,799 just see all the tasking data. 790 00:32:47,919 --> 00:32:52,960 Um and yeah, so yeah, as Steve Jobs once 791 00:32:50,799 --> 00:32:54,080 said, technology is nothing. What's more 792 00:32:52,960 --> 00:32:55,600 important is that you have faith in 793 00:32:54,080 --> 00:32:57,200 people and that if you give them tools, 794 00:32:55,600 --> 00:32:59,440 they'll do wonderful things with them. 795 00:32:57,200 --> 00:33:00,720 Um in creating Endura, I I aimed for 796 00:32:59,440 --> 00:33:02,480 teachers and students to have the 797 00:33:00,720 --> 00:33:05,279 ability to interface with one another 798 00:33:02,480 --> 00:33:08,240 and connect via tasking, students, uh 799 00:33:05,279 --> 00:33:10,080 student tracking, and classes. Um and 800 00:33:08,240 --> 00:33:11,200 then I guess I can do a demo if time 801 00:33:10,080 --> 00:33:13,840 allows for it. 802 00:33:11,200 --> 00:33:15,760 Yeah, cool. Um I'll just do 803 00:33:13,840 --> 00:33:18,480 You're like going home late, right? 804 00:33:15,760 --> 00:33:20,640 Yeah, do a demo. 805 00:33:18,480 --> 00:33:22,240 Um, I don't know if this will actually 806 00:33:20,640 --> 00:33:23,840 work cuz 807 00:33:22,240 --> 00:33:24,960 blame the technology. 808 00:33:23,840 --> 00:33:29,760 Yeah, I I don't know if it's going to 809 00:33:24,960 --> 00:33:33,240 work cuz I think it's um I don't know. I 810 00:33:29,760 --> 00:33:33,240 don't know if it's sharing. 811 00:33:36,480 --> 00:33:40,880 Um, 812 00:33:38,640 --> 00:33:43,039 maybe I'll just like end the 813 00:33:40,880 --> 00:33:44,480 Yes. 814 00:33:43,039 --> 00:33:47,039 URL. 815 00:33:44,480 --> 00:33:48,399 Oh, yeah. Um, you can go to it. I'm just 816 00:33:47,039 --> 00:33:51,519 on localhost right now, but you can 817 00:33:48,399 --> 00:33:54,000 actually just go to Not that one. Yeah, 818 00:33:51,519 --> 00:33:55,919 this one here. And this is sort of the 819 00:33:54,000 --> 00:33:56,880 landing page. Yeah. So, yeah, this is 820 00:33:55,919 --> 00:33:58,880 the landing page, 821 00:33:56,880 --> 00:34:00,640 kaleng.pythanyware.com. 822 00:33:58,880 --> 00:34:02,320 It should be responsive for mobile as 823 00:34:00,640 --> 00:34:03,760 well. Um, so you can view it on your 824 00:34:02,320 --> 00:34:06,000 phones if you really want to. 825 00:34:03,760 --> 00:34:06,960 Can someone put that on Discord? 826 00:34:06,000 --> 00:34:08,240 Yeah, thank you. 827 00:34:06,960 --> 00:34:09,919 Um, I'm just going to use the local host 828 00:34:08,240 --> 00:34:11,760 version because it's a bit quicker. Um, 829 00:34:09,919 --> 00:34:13,919 and also I have data pre-loaded onto the 830 00:34:11,760 --> 00:34:15,359 database there, but you can view it in 831 00:34:13,919 --> 00:34:17,359 real time if you want to on the 832 00:34:15,359 --> 00:34:18,800 kaleng.pythany.com. 833 00:34:17,359 --> 00:34:20,240 Um, but yeah, I'm logged into a teacher 834 00:34:18,800 --> 00:34:22,079 view right now. As you can see, you have 835 00:34:20,240 --> 00:34:24,240 a variety of classes. You can create 836 00:34:22,079 --> 00:34:26,639 your own class like this. Um, and you 837 00:34:24,240 --> 00:34:28,320 can also view your current class. And in 838 00:34:26,639 --> 00:34:30,399 here, you can create tasks, as you can 839 00:34:28,320 --> 00:34:32,480 see, and distribute these tasks to the 840 00:34:30,399 --> 00:34:34,800 class as well as sort of view all these 841 00:34:32,480 --> 00:34:36,159 people in the class. Um, I kind of Yeah, 842 00:34:34,800 --> 00:34:38,480 these are random names. Don't worry 843 00:34:36,159 --> 00:34:40,879 about them. Um you can order study time 844 00:34:38,480 --> 00:34:43,280 like so as well as view past sessions of 845 00:34:40,879 --> 00:34:44,879 what students have been studying. Um and 846 00:34:43,280 --> 00:34:47,359 then obviously just manage your tasks in 847 00:34:44,879 --> 00:34:49,040 a wider task view. Uh and then from a 848 00:34:47,359 --> 00:34:51,679 student view and this is kind of where 849 00:34:49,040 --> 00:34:53,040 the main sort of issue I faced was 850 00:34:51,679 --> 00:34:54,800 designing these two different views. The 851 00:34:53,040 --> 00:34:56,560 student view you can obviously see your 852 00:34:54,800 --> 00:34:58,560 study for this month and track it day by 853 00:34:56,560 --> 00:35:01,040 day as well as join classes similar to 854 00:34:58,560 --> 00:35:02,720 who with join codes uh and create and 855 00:35:01,040 --> 00:35:05,280 manage your own tasks like this as you 856 00:35:02,720 --> 00:35:10,200 can see personal versus assigned tasks. 857 00:35:05,280 --> 00:35:10,200 But yeah, that's it. Thank you. 858 00:35:10,320 --> 00:35:19,160 Thank you so much. Evelyn, you're up. 859 00:35:14,240 --> 00:35:19,160 All right. Nice work. 860 00:35:23,839 --> 00:35:27,720 Give me another round of applause. 861 00:35:29,920 --> 00:35:37,440 Okay, up on deck now we have Evelyn. 862 00:35:35,040 --> 00:35:42,119 Evelyn has been programming for three 863 00:35:37,440 --> 00:35:42,119 years, specifically three years. 864 00:35:44,000 --> 00:35:48,240 I assume that's a loadbearing question 865 00:35:45,839 --> 00:35:52,240 mark. Um, 866 00:35:48,240 --> 00:35:55,760 uh, Evelyn recently learned about Temple 867 00:35:52,240 --> 00:35:57,839 OS, an operating system written 868 00:35:55,760 --> 00:36:00,800 Oh, yeah. 869 00:35:57,839 --> 00:36:03,680 entirely by one guy, Terry Davis, who 870 00:36:00,800 --> 00:36:07,520 also wrote the language it was coded in 871 00:36:03,680 --> 00:36:11,119 called Holy Sea. Uh, and Evelyn's 872 00:36:07,520 --> 00:36:14,400 favorite emoji is I really should have 873 00:36:11,119 --> 00:36:17,280 bumped the font of this particular 874 00:36:14,400 --> 00:36:21,280 uh Oh, 875 00:36:17,280 --> 00:36:23,520 it's the here no evil monkey. I like it. 876 00:36:21,280 --> 00:36:25,780 That's Evelyn's favorite emoji. Evelyn, 877 00:36:23,520 --> 00:36:30,929 thank you very much. 878 00:36:25,780 --> 00:36:30,929 [Applause] 879 00:36:31,040 --> 00:36:37,760 Um, hi. Is this working? Okay. Um, hi. 880 00:36:35,359 --> 00:36:40,960 I'm Evelyn and this is my presentation 881 00:36:37,760 --> 00:36:42,560 on using RMS and STFTs to visualize 882 00:36:40,960 --> 00:36:44,960 music. 883 00:36:42,560 --> 00:36:50,000 Um, to begin with, I'm a year 12 student 884 00:36:44,960 --> 00:36:52,160 at Bergman Anglican School. This is Oh, 885 00:36:50,000 --> 00:36:54,560 it's in the wrong order. A fun fact 886 00:36:52,160 --> 00:36:57,280 about me is that I play piano. And this 887 00:36:54,560 --> 00:36:59,680 is my self-portrait. 888 00:36:57,280 --> 00:37:02,079 Um, my project is a music visualizer. 889 00:36:59,680 --> 00:37:04,240 More specifically, it uses shorttime for 890 00:37:02,079 --> 00:37:07,440 transform to break down and analyze a 891 00:37:04,240 --> 00:37:09,440 song or any audio file really. Um, it 892 00:37:07,440 --> 00:37:11,119 plays this audio alongside a sine wave 893 00:37:09,440 --> 00:37:13,760 that changes amplitude based on the 894 00:37:11,119 --> 00:37:16,640 amplitudes of various frequencies at a 895 00:37:13,760 --> 00:37:18,720 given point in the song. 896 00:37:16,640 --> 00:37:20,240 So, why did I choose to make a music 897 00:37:18,720 --> 00:37:24,480 visualizer? 898 00:37:20,240 --> 00:37:26,079 Firstly, I like music a lot. Um, I'm 899 00:37:24,480 --> 00:37:27,839 really glad that I was able to come up 900 00:37:26,079 --> 00:37:29,920 with a project idea that combined my 901 00:37:27,839 --> 00:37:32,160 interest so well and it has made the 902 00:37:29,920 --> 00:37:35,760 whole process overall a lot more fun and 903 00:37:32,160 --> 00:37:39,760 rewarding. And secondly, I like pretty 904 00:37:35,760 --> 00:37:41,839 pictures. I mean, who doesn't? Um, 905 00:37:39,760 --> 00:37:43,520 before I get into the details, these are 906 00:37:41,839 --> 00:37:46,560 some important terms and their 907 00:37:43,520 --> 00:37:49,200 definitions. A time series is an audio 908 00:37:46,560 --> 00:37:51,119 signal denoted by Y, where Y of T 909 00:37:49,200 --> 00:37:55,280 corresponds to the amplitude of a 910 00:37:51,119 --> 00:37:57,680 waveform at sample t. A sample is a 911 00:37:55,280 --> 00:37:59,920 value of a signal at a point in time. 912 00:37:57,680 --> 00:38:02,320 The sample rate is the number of samples 913 00:37:59,920 --> 00:38:06,400 per second of a time series and defaults 914 00:38:02,320 --> 00:38:08,400 to 22,50 in my use case. And a frame is 915 00:38:06,400 --> 00:38:10,880 a short slice of a time series used for 916 00:38:08,400 --> 00:38:13,200 analysis purposes. The length of a frame 917 00:38:10,880 --> 00:38:18,000 in terms of samples is an integer 918 00:38:13,200 --> 00:38:20,960 variable and defaults to48 in my library 919 00:38:18,000 --> 00:38:23,680 that I used not that I made. 920 00:38:20,960 --> 00:38:26,079 Um just very quickly RMS is what I used 921 00:38:23,680 --> 00:38:28,079 for the sort of prototype of my project. 922 00:38:26,079 --> 00:38:30,000 It stands for root mean square and is 923 00:38:28,079 --> 00:38:32,079 calculated by squaring the amplitudes of 924 00:38:30,000 --> 00:38:33,760 a signal in a frame taking the average 925 00:38:32,079 --> 00:38:36,640 of that and then square rooting that 926 00:38:33,760 --> 00:38:38,880 average. This results in a sign a single 927 00:38:36,640 --> 00:38:41,200 sine wave that increases in amplitude if 928 00:38:38,880 --> 00:38:44,079 the music is louder and vice versa if 929 00:38:41,200 --> 00:38:46,160 the music is softer. 930 00:38:44,079 --> 00:38:48,079 Now onto the current version of my 931 00:38:46,160 --> 00:38:50,880 project that uses shorttime for 932 00:38:48,079 --> 00:38:52,800 transform. So short-time for transform 933 00:38:50,880 --> 00:38:55,119 is a technique that involves computing 934 00:38:52,800 --> 00:38:57,359 for transforms over a lot of small 935 00:38:55,119 --> 00:38:59,119 equally long windows of signal data. 936 00:38:57,359 --> 00:39:01,599 These transforms break the data down 937 00:38:59,119 --> 00:39:03,040 into its components. that is they tell 938 00:39:01,599 --> 00:39:04,720 you the frequencies and their 939 00:39:03,040 --> 00:39:07,040 corresponding amplitudes that make up 940 00:39:04,720 --> 00:39:09,920 the data. In the context of the library 941 00:39:07,040 --> 00:39:12,880 that I used called Labrosa, it returns a 942 00:39:09,920 --> 00:39:14,640 complex valued matrix denoted D where 943 00:39:12,880 --> 00:39:17,440 the absolute value of it is the 944 00:39:14,640 --> 00:39:20,079 magnitude of frequency bin F at frame T 945 00:39:17,440 --> 00:39:23,520 where frequency bin is just the segment 946 00:39:20,079 --> 00:39:25,839 of the frequency axis. 947 00:39:23,520 --> 00:39:27,599 This is the equation of a forer 948 00:39:25,839 --> 00:39:30,880 transform. 949 00:39:27,599 --> 00:39:32,880 um I don't really understand it but even 950 00:39:30,880 --> 00:39:34,960 though I don't understand how it works 951 00:39:32,880 --> 00:39:37,359 exactly I have been able to understand 952 00:39:34,960 --> 00:39:39,680 what they do and how I can input things 953 00:39:37,359 --> 00:39:42,160 in to get things I want out and then use 954 00:39:39,680 --> 00:39:46,079 that in my project. 955 00:39:42,160 --> 00:39:48,720 So this is how I use STF in my program. 956 00:39:46,079 --> 00:39:50,480 Um I get the complex valued matrix here 957 00:39:48,720 --> 00:39:53,119 and then absolute it so I get the 958 00:39:50,480 --> 00:39:54,720 magnitudes of different frequencies. 959 00:39:53,119 --> 00:39:56,480 Then using another function from the 960 00:39:54,720 --> 00:39:58,400 library, I convert it to a decibel 961 00:39:56,480 --> 00:40:01,520 matrix so the values are better to work 962 00:39:58,400 --> 00:40:03,440 with. Um then what I've done is split 963 00:40:01,520 --> 00:40:06,720 the data into five groups based on 964 00:40:03,440 --> 00:40:08,880 frequencies. Basically just made more 965 00:40:06,720 --> 00:40:11,119 frequency bins and put the frequency 966 00:40:08,880 --> 00:40:12,960 bins into the frequency bins. Um and 967 00:40:11,119 --> 00:40:14,640 then for each frame I get the average 968 00:40:12,960 --> 00:40:16,480 plus the minimum amplitude in the 969 00:40:14,640 --> 00:40:18,079 original matrix. So all the values are 970 00:40:16,480 --> 00:40:20,160 positive because amplitudes can be 971 00:40:18,079 --> 00:40:21,760 negative. Um, I did this so I wouldn't 972 00:40:20,160 --> 00:40:26,800 have to deal with every piece of data 973 00:40:21,760 --> 00:40:29,119 from all 1,025 frequency bins. 974 00:40:26,800 --> 00:40:31,040 Um, then using these sections, this 975 00:40:29,119 --> 00:40:32,880 function will draw a sine wave. 976 00:40:31,040 --> 00:40:35,040 Essentially, I put the sections into 977 00:40:32,880 --> 00:40:36,960 another list called all amplitudes. Then 978 00:40:35,040 --> 00:40:38,960 I get the relevant amplitudes of each 979 00:40:36,960 --> 00:40:41,520 frequency group based on the position of 980 00:40:38,960 --> 00:40:44,079 music you're at. Um, and put those in a 981 00:40:41,520 --> 00:40:45,839 list. I then feed that list into the 982 00:40:44,079 --> 00:40:48,400 sine wave drawing function on the right 983 00:40:45,839 --> 00:40:50,400 there. uh the program will run until 984 00:40:48,400 --> 00:40:54,000 completion of the song or if you just 985 00:40:50,400 --> 00:40:55,920 manually exit the Pygame window. 986 00:40:54,000 --> 00:40:58,000 Something interesting I learned or kind 987 00:40:55,920 --> 00:40:59,760 of just noticed through testing was that 988 00:40:58,000 --> 00:41:01,680 the lower frequencies were generally a 989 00:40:59,760 --> 00:41:04,160 lot more active, especially in purely 990 00:41:01,680 --> 00:41:06,319 instrumental parts of a song. Um to 991 00:41:04,160 --> 00:41:08,560 research this in more concrete terms, I 992 00:41:06,319 --> 00:41:12,560 turned to the piano. The lowest note on 993 00:41:08,560 --> 00:41:15,599 a piano A0 has a frequency of 27.5 htz 994 00:41:12,560 --> 00:41:18,599 and the highest C8 has a frequency of 995 00:41:15,599 --> 00:41:18,599 4,186.01 996 00:41:18,720 --> 00:41:24,240 hertz. Using the Nyquist Shannon theorem 997 00:41:22,319 --> 00:41:25,760 um we understand that the maximum 998 00:41:24,240 --> 00:41:28,400 frequency that can be accurately 999 00:41:25,760 --> 00:41:31,200 represented as a digital signal is half 1000 00:41:28,400 --> 00:41:33,200 of the sample rate of the signal. Given 1001 00:41:31,200 --> 00:41:36,079 that the sample rate in my case was 1002 00:41:33,200 --> 00:41:40,160 22,50, the range of frequencies that 1003 00:41:36,079 --> 00:41:42,319 data was collected for was 0 to 11,025. 1004 00:41:40,160 --> 00:41:44,560 So it all kind of makes sense. If the 1005 00:41:42,319 --> 00:41:46,880 piano keys and thus instrumental parts 1006 00:41:44,560 --> 00:41:48,960 of a song only reach around 4,000 hertz 1007 00:41:46,880 --> 00:41:51,359 at max and the entire line is 1008 00:41:48,960 --> 00:41:54,400 representative of frequencies from 0 to 1009 00:41:51,359 --> 00:41:58,240 11,000, instrumentals would just sit 1010 00:41:54,400 --> 00:42:00,400 around the bottom half of the line. 1011 00:41:58,240 --> 00:42:02,560 Um, then when vocals came in, the upper 1012 00:42:00,400 --> 00:42:04,640 end of the line became more active, 1013 00:42:02,560 --> 00:42:07,119 which also kind of makes sense because 1014 00:42:04,640 --> 00:42:10,079 our voices naturally contain those high 1015 00:42:07,119 --> 00:42:12,960 frequency pitches. Of course, this is 1016 00:42:10,079 --> 00:42:15,920 like grossly oversimplified um because 1017 00:42:12,960 --> 00:42:18,720 sound as a note on an instrument uh is 1018 00:42:15,920 --> 00:42:21,920 going to consist of various frequencies, 1019 00:42:18,720 --> 00:42:25,119 but the general idea is there. 1020 00:42:21,920 --> 00:42:27,359 Uh is there a correlation here? Yes, the 1021 00:42:25,119 --> 00:42:29,920 data and theory appear to match up and 1022 00:42:27,359 --> 00:42:32,640 there's not really any big issues. Is 1023 00:42:29,920 --> 00:42:36,079 this proof of causation though? I don't 1024 00:42:32,640 --> 00:42:39,200 know. Um I can't know for sure. This is 1025 00:42:36,079 --> 00:42:41,200 just um from research that I've put two 1026 00:42:39,200 --> 00:42:44,640 things together. But I think it was an 1027 00:42:41,200 --> 00:42:46,319 interesting investigation nonetheless. 1028 00:42:44,640 --> 00:42:47,680 Uh moving forward, there are still many 1029 00:42:46,319 --> 00:42:49,920 things I want to keep adding to this 1030 00:42:47,680 --> 00:42:52,079 project. Firstly, for assignment 1031 00:42:49,920 --> 00:42:54,640 purposes, my teacher's forcing me to 1032 00:42:52,079 --> 00:42:56,880 include a UI. 1033 00:42:54,640 --> 00:42:58,560 Why would I need that? The user can just 1034 00:42:56,880 --> 00:43:01,560 enter the file name directly into the 1035 00:42:58,560 --> 00:43:01,560 code. 1036 00:43:03,200 --> 00:43:08,240 And also, I'd like to figure out a 1037 00:43:05,200 --> 00:43:10,240 better way of visualizing um the music. 1038 00:43:08,240 --> 00:43:12,720 And with this, then I can represent all 1039 00:43:10,240 --> 00:43:17,680 or a lot more frequencies. 1040 00:43:12,720 --> 00:43:18,880 Um, I can give a live demo now 1041 00:43:17,680 --> 00:43:19,520 if 1042 00:43:18,880 --> 00:43:21,040 demo 1043 00:43:19,520 --> 00:43:24,040 it wants to work. 1044 00:43:21,040 --> 00:43:24,040 Yes. 1045 00:43:28,450 --> 00:43:42,240 [Music] 1046 00:43:39,119 --> 00:43:43,920 It's been raining. I swear I'm not 1047 00:43:42,240 --> 00:43:47,839 lonely. 1048 00:43:43,920 --> 00:43:49,920 Always complaining that you never see 1049 00:43:47,839 --> 00:43:54,790 me. 1050 00:43:49,920 --> 00:44:00,719 Um, yes, that's it. Thank you. 1051 00:43:54,790 --> 00:44:00,719 [Applause] 1052 00:44:03,680 --> 00:44:07,359 I was too busy taking a photo of like 1053 00:44:05,680 --> 00:44:09,520 demos that work because it makes me 1054 00:44:07,359 --> 00:44:11,680 excited every single time. Evelyn, come 1055 00:44:09,520 --> 00:44:14,880 and give me a Hang on. Yes. Microphone 1056 00:44:11,680 --> 00:44:17,920 here. High five here. Excellent. Give 1057 00:44:14,880 --> 00:44:21,079 Evelyn a massive round of applause. 1058 00:44:17,920 --> 00:44:21,079 Thank you. 1059 00:44:21,760 --> 00:44:24,800 Not like this. 1060 00:44:22,480 --> 00:44:30,160 Like that. 1061 00:44:24,800 --> 00:44:32,079 Okay, next up we have 1062 00:44:30,160 --> 00:44:38,960 Mars. 1063 00:44:32,079 --> 00:44:42,720 Uh here Mars is going to talk about 1064 00:44:38,960 --> 00:44:45,440 Bartholomew, the Roman numeral 1065 00:44:42,720 --> 00:44:47,040 13. 1066 00:44:45,440 --> 00:44:49,760 Had to think about that for a second. 1067 00:44:47,040 --> 00:44:53,760 Um, perhaps related, Mars's uh favorite 1068 00:44:49,760 --> 00:44:56,560 emoji is the troll emoji. Uh, Mars has 1069 00:44:53,760 --> 00:44:59,520 been programming for 5 years and Mars 1070 00:44:56,560 --> 00:45:03,359 learned about ray tracing and how it 1071 00:44:59,520 --> 00:45:06,400 actually works. Brackets just a bunch of 1072 00:45:03,359 --> 00:45:08,720 maths and intersections. 1073 00:45:06,400 --> 00:45:12,240 Computers. computers, 1074 00:45:08,720 --> 00:45:16,120 just a bunch of maths. I like it. U 1075 00:45:12,240 --> 00:45:19,440 Mars, uh applause. 1076 00:45:16,120 --> 00:45:21,839 [Applause] 1077 00:45:19,440 --> 00:45:23,599 Thank you guys. There is a lot more 1078 00:45:21,839 --> 00:45:26,880 people than I thought there were going 1079 00:45:23,599 --> 00:45:29,280 to be. Okay. Um hi everyone. My name is 1080 00:45:26,880 --> 00:45:31,040 Mars and this is Bartholomew the 13th, 1081 00:45:29,280 --> 00:45:34,720 my customuilt convolutional neural 1082 00:45:31,040 --> 00:45:37,440 network. Um most people train or yeah 1083 00:45:34,720 --> 00:45:39,839 train CNN's using TensorFlow or PyTorch. 1084 00:45:37,440 --> 00:45:41,680 I built mine entirely in raw Python and 1085 00:45:39,839 --> 00:45:44,960 Numpy. 1086 00:45:41,680 --> 00:45:47,760 Why? Because I hate myself apparently. 1087 00:45:44,960 --> 00:45:53,119 Um but first a little bit more about 1088 00:45:47,760 --> 00:45:54,880 myself. My my name is Mars Karola. I am 1089 00:45:53,119 --> 00:45:57,760 a student at Bergman Anglican School 1090 00:45:54,880 --> 00:46:00,000 ACT. Um I am going to AU for advanced 1091 00:45:57,760 --> 00:46:01,920 computing. There are three facts that 1092 00:46:00,000 --> 00:46:04,640 everyone needs to know about me. 1093 00:46:01,920 --> 00:46:08,400 I built my first I built my first Python 1094 00:46:04,640 --> 00:46:11,200 project and in Python obviously 1095 00:46:08,400 --> 00:46:14,880 and it was a calculator. Apparently 1 + 1096 00:46:11,200 --> 00:46:19,599 1 is equal to 11. 1097 00:46:14,880 --> 00:46:22,599 Um I love numpy and I hate tomatoes. 1098 00:46:19,599 --> 00:46:22,599 Yeah. 1099 00:46:22,720 --> 00:46:26,400 All right. So what is Bartholomew? 1100 00:46:24,640 --> 00:46:28,240 Bartholomew as I said before is a 1101 00:46:26,400 --> 00:46:30,560 convolutional neural network built to 1102 00:46:28,240 --> 00:46:32,880 read handwriting. Now, something CNN's 1103 00:46:30,560 --> 00:46:35,680 can compare to are very picky art 1104 00:46:32,880 --> 00:46:38,000 critics. 1105 00:46:35,680 --> 00:46:40,319 It just doesn't look at an image. It 1106 00:46:38,000 --> 00:46:42,800 analyzes it for shapes, features, and 1107 00:46:40,319 --> 00:46:46,319 textures layer by layer until it can say 1108 00:46:42,800 --> 00:46:48,560 with confidence, yes, that is a seven. 1109 00:46:46,319 --> 00:46:50,640 So, the network learns to recognize 1110 00:46:48,560 --> 00:46:53,280 digit patterns by extracting in 1111 00:46:50,640 --> 00:46:54,960 important features from input images 1112 00:46:53,280 --> 00:46:57,119 through multiple layers, including 1113 00:46:54,960 --> 00:46:59,200 convolution layers, activation layers, 1114 00:46:57,119 --> 00:47:00,480 reshaping, and tense layers. It's 1115 00:46:59,200 --> 00:47:02,079 trained using forward and backwards 1116 00:47:00,480 --> 00:47:04,319 propagation algorithms which optimize 1117 00:47:02,079 --> 00:47:07,359 the network's parameters to improve 1118 00:47:04,319 --> 00:47:10,240 prediction. Oh 1119 00:47:07,359 --> 00:47:11,599 that improve prediction accuracy. 1120 00:47:10,240 --> 00:47:13,920 But first let's start with what exactly 1121 00:47:11,599 --> 00:47:15,920 a layer is in this broad context of 1122 00:47:13,920 --> 00:47:18,240 neural networks. 1123 00:47:15,920 --> 00:47:19,920 So a layer is essentially a big function 1124 00:47:18,240 --> 00:47:21,520 and therefore we can represent it as a 1125 00:47:19,920 --> 00:47:22,720 box. 1126 00:47:21,520 --> 00:47:24,079 Now something that's true for every 1127 00:47:22,720 --> 00:47:26,800 single layer is that if you give it an 1128 00:47:24,079 --> 00:47:29,440 input you will always get an output. 1129 00:47:26,800 --> 00:47:31,040 That is called forward propagation. 1130 00:47:29,440 --> 00:47:34,640 For each layer, there is always an input 1131 00:47:31,040 --> 00:47:37,280 and output. Easy enough, right? The 1132 00:47:34,640 --> 00:47:39,680 other step when training CNN's is called 1133 00:47:37,280 --> 00:47:41,440 backwards propagation. This is when that 1134 00:47:39,680 --> 00:47:43,200 layer updates its parameters. It's how 1135 00:47:41,440 --> 00:47:44,720 the network learns from its mistakes by 1136 00:47:43,200 --> 00:47:46,720 adjusting its weights and biases to 1137 00:47:44,720 --> 00:47:48,880 improve performance. 1138 00:47:46,720 --> 00:47:51,280 Inside these layers are the weights. The 1139 00:47:48,880 --> 00:47:54,079 weights decide how much influence each 1140 00:47:51,280 --> 00:47:55,920 pixel has. If the networks if the 1141 00:47:54,079 --> 00:47:57,680 network gets something wrong, we notch 1142 00:47:55,920 --> 00:47:59,920 the weight slightly. Thousands of 1143 00:47:57,680 --> 00:48:01,680 notches later, it gets a little bit 1144 00:47:59,920 --> 00:48:05,839 smarter. 1145 00:48:01,680 --> 00:48:09,359 Now, this is Bolu's entire um blueprint. 1146 00:48:05,839 --> 00:48:11,200 If it looks a bit um much right now, 1147 00:48:09,359 --> 00:48:13,200 don't worry. It's just four layers on 1148 00:48:11,200 --> 00:48:16,000 repeat. It's just convolutional layers, 1149 00:48:13,200 --> 00:48:18,480 activation layers, reshape layers, and 1150 00:48:16,000 --> 00:48:20,960 dense layers. So let's start with 1151 00:48:18,480 --> 00:48:23,520 convolutional layers since it's the 1152 00:48:20,960 --> 00:48:26,559 point of the entire project. Say we're 1153 00:48:23,520 --> 00:48:28,960 given two matrices, one that is 3x3 in 1154 00:48:26,559 --> 00:48:32,960 size and one is and one that is 2x2 in 1155 00:48:28,960 --> 00:48:35,119 size. The 2x2 one is called a kernel. In 1156 00:48:32,960 --> 00:48:36,559 the convolutional process, we slide the 1157 00:48:35,119 --> 00:48:38,880 kernel over the image performing 1158 00:48:36,559 --> 00:48:40,319 multiplication at each step to highlight 1159 00:48:38,880 --> 00:48:42,960 important patterns like edges or 1160 00:48:40,319 --> 00:48:45,359 textures. This process helps the network 1161 00:48:42,960 --> 00:48:47,680 find important details in the image like 1162 00:48:45,359 --> 00:48:49,760 edges or shapes. These details are 1163 00:48:47,680 --> 00:48:51,119 called features and they help the 1164 00:48:49,760 --> 00:48:52,960 network understand what's actually in 1165 00:48:51,119 --> 00:48:56,400 the image like recognizing handwritten 1166 00:48:52,960 --> 00:48:58,000 digits. In short, convolutions let the 1167 00:48:56,400 --> 00:48:59,839 network automatically pick out useful 1168 00:48:58,000 --> 00:49:01,839 patterns from raw images so it can 1169 00:48:59,839 --> 00:49:04,240 classify them correctly and learn from 1170 00:49:01,839 --> 00:49:06,079 these classifications and classify a 1171 00:49:04,240 --> 00:49:08,800 digit. 1172 00:49:06,079 --> 00:49:09,920 Next up is the activation layer. This is 1173 00:49:08,800 --> 00:49:12,319 where we add a little bit of 1174 00:49:09,920 --> 00:49:14,559 personality. Without it, the network is 1175 00:49:12,319 --> 00:49:16,880 just a boring linear model. The 1176 00:49:14,559 --> 00:49:18,640 activation layer applies a mathematical 1177 00:49:16,880 --> 00:49:21,040 function to the output of the previous 1178 00:49:18,640 --> 00:49:23,920 layer, introducing nonlinearity into the 1179 00:49:21,040 --> 00:49:25,760 network. Without activation functions, 1180 00:49:23,920 --> 00:49:29,839 the network would not be able to 1181 00:49:25,760 --> 00:49:32,319 classify any image. It just say it say 1182 00:49:29,839 --> 00:49:35,040 the same thing over and over again. Um, 1183 00:49:32,319 --> 00:49:37,599 I use sig mode for my one. Don't ask me 1184 00:49:35,040 --> 00:49:39,520 how that works because I have no clue at 1185 00:49:37,599 --> 00:49:42,000 all. 1186 00:49:39,520 --> 00:49:43,920 Um, and the final one is the dense 1187 00:49:42,000 --> 00:49:45,839 layer. The dense layer, also called a 1188 00:49:43,920 --> 00:49:47,520 fully connected layer, takes in all of 1189 00:49:45,839 --> 00:49:49,359 the features learned by earlier layers 1190 00:49:47,520 --> 00:49:51,680 and uses them to make a final decision 1191 00:49:49,359 --> 00:49:53,280 about what the image actually is. Every 1192 00:49:51,680 --> 00:49:55,599 neuron in this layer is connected to all 1193 00:49:53,280 --> 00:49:57,599 the neurons from the previous layer. And 1194 00:49:55,599 --> 00:50:00,240 it adds up all the inputs, weighs them, 1195 00:49:57,599 --> 00:50:01,760 and adds in a little bit of bias. Uh, 1196 00:50:00,240 --> 00:50:03,520 and then at the end, it uses an 1197 00:50:01,760 --> 00:50:06,400 activation function to actually classify 1198 00:50:03,520 --> 00:50:08,880 what it is. It's basically a decision 1199 00:50:06,400 --> 00:50:12,319 maker. Based on all these features, I'm 1200 00:50:08,880 --> 00:50:14,800 95% sure this is a three or sometimes 1201 00:50:12,319 --> 00:50:16,800 it's definitely a cat. What is a bit 1202 00:50:14,800 --> 00:50:19,520 awkward since my data set has no cats in 1203 00:50:16,800 --> 00:50:22,240 it. 1204 00:50:19,520 --> 00:50:24,960 So training for bathon mu is two steps 1205 00:50:22,240 --> 00:50:28,079 on repeat forward pass and backwards 1206 00:50:24,960 --> 00:50:30,160 pass. Uh it normally just predicts gets 1207 00:50:28,079 --> 00:50:33,520 it wrong and you fix the weights from 1208 00:50:30,160 --> 00:50:35,680 that predict. Repeat this for around 40 1209 00:50:33,520 --> 00:50:38,079 times over the entire data set. And for 1210 00:50:35,680 --> 00:50:40,319 10 hours, Bartholomew learns digits with 1211 00:50:38,079 --> 00:50:42,400 95% accuracy. 1212 00:50:40,319 --> 00:50:44,480 So after all that, Bartholomew can now 1213 00:50:42,400 --> 00:50:47,599 read handwriting almost as well as me on 1214 00:50:44,480 --> 00:50:49,440 3 hours of sleep. 1215 00:50:47,599 --> 00:50:51,359 So I made this model for one thing and 1216 00:50:49,440 --> 00:50:53,680 one thing only, 1217 00:50:51,359 --> 00:50:56,880 to read my handwriting. And I am proud 1218 00:50:53,680 --> 00:50:58,880 to say that after 10 hours of 1219 00:50:56,880 --> 00:51:01,200 mind-numbing training, it still can't 1220 00:50:58,880 --> 00:51:02,880 read my handwriting. 1221 00:51:01,200 --> 00:51:04,400 It might just be my handwriting. I don't 1222 00:51:02,880 --> 00:51:06,800 know. 1223 00:51:04,400 --> 00:51:09,440 So, I made a little GUI as you can see 1224 00:51:06,800 --> 00:51:12,000 on the board uh to show button view off. 1225 00:51:09,440 --> 00:51:16,800 You press a button and it grabs 20 um 1226 00:51:12,000 --> 00:51:19,119 random test images alongside its um true 1227 00:51:16,800 --> 00:51:22,079 labels and the predicted labels. Um 1228 00:51:19,119 --> 00:51:24,559 Bartholomew is quite accurate, but 1229 00:51:22,079 --> 00:51:27,119 sometimes it gets things wrong. It 1230 00:51:24,559 --> 00:51:31,440 thought it was a two and a nine instead 1231 00:51:27,119 --> 00:51:34,640 of sevens. It's pretty stupid. 1232 00:51:31,440 --> 00:51:36,960 So now for the fun part, the challenges. 1233 00:51:34,640 --> 00:51:39,040 First, I had overfitting. Both me was 1234 00:51:36,960 --> 00:51:41,200 acing the training set but flunking the 1235 00:51:39,040 --> 00:51:42,240 test data. I fixed it with shuffling, 1236 00:51:41,200 --> 00:51:43,920 smaller tweaks, and better 1237 00:51:42,240 --> 00:51:46,480 regularization. 1238 00:51:43,920 --> 00:51:48,559 Second was my hardware. My laptop 1239 00:51:46,480 --> 00:51:51,119 trained very slowly. It was like 1240 00:51:48,559 --> 00:51:53,359 watching paint dry. Uh I eventually had 1241 00:51:51,119 --> 00:51:55,760 to upgrade to my dad's um better 1242 00:51:53,359 --> 00:51:57,119 computer to run my program, which meant 1243 00:51:55,760 --> 00:51:59,119 that I could only train it when he was 1244 00:51:57,119 --> 00:52:01,040 sleeping. 1245 00:51:59,119 --> 00:52:05,359 So, my sleep schedule during that time 1246 00:52:01,040 --> 00:52:08,720 was horrendous. So bad. 3:00 a.m. And my 1247 00:52:05,359 --> 00:52:11,200 personal favorite, I misspelled bias. 1248 00:52:08,720 --> 00:52:15,119 Um, 1249 00:52:11,200 --> 00:52:17,359 two entire weeks of panic rediving 1250 00:52:15,119 --> 00:52:19,200 equations only to re realize that it was 1251 00:52:17,359 --> 00:52:21,599 a typo. 1252 00:52:19,200 --> 00:52:23,359 The scariest bug in my entire network 1253 00:52:21,599 --> 00:52:25,440 wasn't the math or the theory. It was a 1254 00:52:23,359 --> 00:52:27,680 single typo. 1255 00:52:25,440 --> 00:52:31,400 But overall, it was a fun experience. I 1256 00:52:27,680 --> 00:52:31,400 don't recommend it though. 1257 00:52:31,839 --> 00:52:38,160 Um, so that's Bonu and Numpai only C CNN 1258 00:52:36,079 --> 00:52:40,480 that can read handwriting at 95% 1259 00:52:38,160 --> 00:52:42,240 accuracy after 10 hours of training, a 1260 00:52:40,480 --> 00:52:44,730 lot of coffee and two weeks lost to a 1261 00:52:42,240 --> 00:52:50,800 typo. Thank you. 1262 00:52:44,730 --> 00:52:53,520 [Applause] 1263 00:52:50,800 --> 00:52:55,440 That's amazing. What did your dad think 1264 00:52:53,520 --> 00:52:58,559 about having come up there? Come on. 1265 00:52:55,440 --> 00:53:00,160 Come go. Yes. Yeah. What did your dad 1266 00:52:58,559 --> 00:53:02,000 think about you just stealing his laptop 1267 00:53:00,160 --> 00:53:04,079 for for This is This is for work, I 1268 00:53:02,000 --> 00:53:06,079 swear. It's important learning. 1269 00:53:04,079 --> 00:53:07,119 He did not mind, actually, which is 1270 00:53:06,079 --> 00:53:08,720 surprising. 1271 00:53:07,119 --> 00:53:11,520 Possibly cuz you only used it while he 1272 00:53:08,720 --> 00:53:15,200 was asleep. 1273 00:53:11,520 --> 00:53:17,090 Amazing. Uh, hang. Yeah, another massive 1274 00:53:15,200 --> 00:53:22,389 round. Give me one of 1275 00:53:17,090 --> 00:53:22,389 [Applause] 1276 00:53:24,160 --> 00:53:28,559 up next 1277 00:53:26,160 --> 00:53:32,079 we have 1278 00:53:28,559 --> 00:53:35,359 Shri. Yes, I can read my table that I 1279 00:53:32,079 --> 00:53:39,440 did. Um, Shri is going to be talking 1280 00:53:35,359 --> 00:53:42,720 about this. Uh, Shri has been 1281 00:53:39,440 --> 00:53:45,440 programming for eight years. 1282 00:53:42,720 --> 00:53:48,800 Her favorite emoji 1283 00:53:45,440 --> 00:53:51,839 is the crying face emoji. 1284 00:53:48,800 --> 00:53:53,760 A uh and see I hope that's not 1285 00:53:51,839 --> 00:53:56,800 reflective of her experience in doing 1286 00:53:53,760 --> 00:53:58,720 this. I fear it. No. Um uh and she 1287 00:53:56,800 --> 00:54:00,960 recently found out that the very first 1288 00:53:58,720 --> 00:54:04,559 computer bug was in fact literally a 1289 00:54:00,960 --> 00:54:07,839 bug. Uh, in 1947, uh, Rear Admiral Grace 1290 00:54:04,559 --> 00:54:11,280 Hopper, legend, uh, and her team found a 1291 00:54:07,839 --> 00:54:13,359 moth stuck in the relays of a of the 1292 00:54:11,280 --> 00:54:16,559 Harvard MK2 computer, which was causing 1293 00:54:13,359 --> 00:54:18,960 the machines to malfunction, hence 1294 00:54:16,559 --> 00:54:22,079 debugging, just, you know, getting those 1295 00:54:18,960 --> 00:54:26,119 moths out. Uh, amazing, Shri, take it 1296 00:54:22,079 --> 00:54:26,119 away. Applause for Yeah. 1297 00:54:29,280 --> 00:54:34,240 So hi, my name is Shri and my project is 1298 00:54:32,319 --> 00:54:36,640 using CNN's for breast cancer 1299 00:54:34,240 --> 00:54:38,960 hisystologology detection. 1300 00:54:36,640 --> 00:54:41,599 So a little bit of background about me. 1301 00:54:38,960 --> 00:54:43,440 Um I'm a year 12 student in Berglin 1302 00:54:41,599 --> 00:54:45,040 Anglican School from Canra. I'm 1303 00:54:43,440 --> 00:54:47,119 currently studying a major in computer 1304 00:54:45,040 --> 00:54:49,119 science. And a fun fact about me is that 1305 00:54:47,119 --> 00:54:50,559 I love doing eye makeup. This was the 1306 00:54:49,119 --> 00:54:52,880 makeup I did when I dressed up as 1307 00:54:50,559 --> 00:54:55,040 Cleopatra for book week this year. And 1308 00:54:52,880 --> 00:54:58,720 yes, I did actually have this project 1309 00:54:55,040 --> 00:55:00,640 idea back in year 10. 1310 00:54:58,720 --> 00:55:02,480 So this year I finally got around to 1311 00:55:00,640 --> 00:55:04,559 image classification, which has been my 1312 00:55:02,480 --> 00:55:07,200 dream project since year 10. So finally 1313 00:55:04,559 --> 00:55:09,520 we're here. 1314 00:55:07,200 --> 00:55:12,000 So this project classifies breast tissue 1315 00:55:09,520 --> 00:55:14,400 biopsy images from the break data set 1316 00:55:12,000 --> 00:55:16,240 into either benign or malignant where 1317 00:55:14,400 --> 00:55:18,000 benign means there's no cancer present 1318 00:55:16,240 --> 00:55:20,480 and malignant means there is a cancer 1319 00:55:18,000 --> 00:55:22,800 present. So basically we're training the 1320 00:55:20,480 --> 00:55:26,599 computer to be a tiny pathologist just 1321 00:55:22,800 --> 00:55:26,599 without the copy addiction. 1322 00:55:27,440 --> 00:55:31,680 I used a convolutional neural network or 1323 00:55:29,680 --> 00:55:33,920 CNN which is perfect for image 1324 00:55:31,680 --> 00:55:35,920 classification. Stick with me and by the 1325 00:55:33,920 --> 00:55:38,160 end you'll know why it's basically magic 1326 00:55:35,920 --> 00:55:40,640 for images. 1327 00:55:38,160 --> 00:55:42,720 So now I'll briefly explain how a CNN 1328 00:55:40,640 --> 00:55:44,160 works using digit classification as an 1329 00:55:42,720 --> 00:55:46,640 example. 1330 00:55:44,160 --> 00:55:48,880 An image is just a grid of pixels with 1331 00:55:46,640 --> 00:55:52,559 each pixel's grayscale value fed into 1332 00:55:48,880 --> 00:55:57,040 the network as an input neuron. 1333 00:55:52,559 --> 00:56:00,079 For a 28x 28 pixel, that means 784 input 1334 00:55:57,040 --> 00:56:02,559 values. Sounds like a lot, right? Hidden 1335 00:56:00,079 --> 00:56:04,960 layers use filters to scan small patches 1336 00:56:02,559 --> 00:56:06,640 of pixels at a time for patterns. Kind 1337 00:56:04,960 --> 00:56:09,040 of like a mini Sherlock Holmes for 1338 00:56:06,640 --> 00:56:11,839 pixels. 1339 00:56:09,040 --> 00:56:13,920 A 3x3 filter multiply multiplies each 1340 00:56:11,839 --> 00:56:16,000 pixel by a weight and sums these dot 1341 00:56:13,920 --> 00:56:17,920 products. Basically, the network is 1342 00:56:16,000 --> 00:56:21,359 trying to figure out if this tiny patch 1343 00:56:17,920 --> 00:56:24,000 is part of a three or a seven. 1344 00:56:21,359 --> 00:56:26,319 Then we add a bias, apply an activation 1345 00:56:24,000 --> 00:56:28,160 function like relu or sigmoid, and boom, 1346 00:56:26,319 --> 00:56:30,799 we get a neuron value for the next 1347 00:56:28,160 --> 00:56:32,640 layer. This number tells the network how 1348 00:56:30,799 --> 00:56:35,440 strongly that patch matches the pattern 1349 00:56:32,640 --> 00:56:37,920 that it's looking for. 1350 00:56:35,440 --> 00:56:40,000 This process repeats through all hidden 1351 00:56:37,920 --> 00:56:42,799 layers using weights and dot products 1352 00:56:40,000 --> 00:56:45,119 from the previous layer. 1353 00:56:42,799 --> 00:56:47,440 As filters slide across the image, they 1354 00:56:45,119 --> 00:56:48,960 form feature maps. Pooling layers 1355 00:56:47,440 --> 00:56:50,480 condense these maps, keeping the 1356 00:56:48,960 --> 00:56:53,040 strongest signals and speeding up 1357 00:56:50,480 --> 00:56:55,040 training. Fully connected layers combine 1358 00:56:53,040 --> 00:56:57,119 everything for the final prediction. 1359 00:56:55,040 --> 00:56:59,359 Step by step, the network moves from raw 1360 00:56:57,119 --> 00:57:02,000 pixels to identifying edges to shapes 1361 00:56:59,359 --> 00:57:03,839 and then full patterns. 1362 00:57:02,000 --> 00:57:05,440 The same process applies to 1363 00:57:03,839 --> 00:57:07,760 hisystologology images, but features 1364 00:57:05,440 --> 00:57:10,160 learn but filters learn features like 1365 00:57:07,760 --> 00:57:12,319 cell shapes, textures, and staining. 1366 00:57:10,160 --> 00:57:14,400 With enough label data, the network 1367 00:57:12,319 --> 00:57:16,880 separate separates benign from malignant 1368 00:57:14,400 --> 00:57:18,559 tissue. This relies on a process driven 1369 00:57:16,880 --> 00:57:20,480 by the loss function, which is basically 1370 00:57:18,559 --> 00:57:22,400 the network's way of saying, "Oops, I 1371 00:57:20,480 --> 00:57:24,640 messed up." 1372 00:57:22,400 --> 00:57:27,119 At the start, weights are random, so 1373 00:57:24,640 --> 00:57:29,359 predictions are terrible. Think my first 1374 00:57:27,119 --> 00:57:31,359 cooking attempt terrible. 1375 00:57:29,359 --> 00:57:35,040 The loss function measures the error and 1376 00:57:31,359 --> 00:57:36,960 minimizing it slowly improves accuracy. 1377 00:57:35,040 --> 00:57:39,200 Gradient descent adjusts weights to 1378 00:57:36,960 --> 00:57:41,839 reduce loss by converging towards a 1379 00:57:39,200 --> 00:57:43,920 local minimum in the cost function. Back 1380 00:57:41,839 --> 00:57:46,160 propagation calculates which weights 1381 00:57:43,920 --> 00:57:48,559 caused errors and the optimizer updates 1382 00:57:46,160 --> 00:57:50,480 them. So in short the process is 1383 00:57:48,559 --> 00:57:52,160 predict, compare, adjust and then 1384 00:57:50,480 --> 00:57:54,720 repeat. 1385 00:57:52,160 --> 00:57:56,640 I use PyTorch which handles the math for 1386 00:57:54,720 --> 00:57:58,400 convolutions and back propagation 1387 00:57:56,640 --> 00:58:00,960 letting us focus on model design and 1388 00:57:58,400 --> 00:58:02,960 training. So without PyTorch, I'd still 1389 00:58:00,960 --> 00:58:07,640 be handwriting partial derivatives and 1390 00:58:02,960 --> 00:58:07,640 this talk would be in PyCon 2035. 1391 00:58:08,400 --> 00:58:12,960 During training, the model cycles 1392 00:58:10,400 --> 00:58:15,760 through data over many epochs, gradually 1393 00:58:12,960 --> 00:58:17,920 improving accuracy. And yes, many epochs 1394 00:58:15,760 --> 00:58:19,760 is secret code for 20 minutes of staring 1395 00:58:17,920 --> 00:58:22,079 at graphs on the screen, praying it 1396 00:58:19,760 --> 00:58:26,079 works. 1397 00:58:22,079 --> 00:58:27,760 My CNN integrates ResNet 18 and TinyBG. 1398 00:58:26,079 --> 00:58:30,559 As much as I'd like to claim I wrote 1399 00:58:27,760 --> 00:58:32,480 ResNet 18 from scratch, I didn't. 1400 00:58:30,559 --> 00:58:35,040 Pre-trained models are wonderful things, 1401 00:58:32,480 --> 00:58:37,520 especially for histologology. Most of my 1402 00:58:35,040 --> 00:58:39,280 work was integrating existing code for 1403 00:58:37,520 --> 00:58:41,760 pre-processing and importing these 1404 00:58:39,280 --> 00:58:45,440 models. And these were the tutorials I 1405 00:58:41,760 --> 00:58:48,400 used and code that I integrated. 1406 00:58:45,440 --> 00:58:50,319 ResNet 18 has 18 layers as the name 1407 00:58:48,400 --> 00:58:52,000 suggests and uses skip connections to 1408 00:58:50,319 --> 00:58:54,640 preserve information and speed up 1409 00:58:52,000 --> 00:58:56,559 learning. I've used ResNet as my feature 1410 00:58:54,640 --> 00:58:58,319 extractor to identify the patterns in 1411 00:58:56,559 --> 00:59:00,559 the image. 1412 00:58:58,319 --> 00:59:02,799 I've replaced its final fully connected 1413 00:59:00,559 --> 00:59:05,200 layer with a tiny BGG inspired 1414 00:59:02,799 --> 00:59:09,040 classifier head that flattens features, 1415 00:59:05,200 --> 00:59:11,520 applies RLU and outputs predictions. 1416 00:59:09,040 --> 00:59:13,680 And this is how I've integrated the two. 1417 00:59:11,520 --> 00:59:16,079 Basically, ResNet finds the features and 1418 00:59:13,680 --> 00:59:18,079 tiny VG makes the call. Teamwork makes 1419 00:59:16,079 --> 00:59:20,000 the dream work. 1420 00:59:18,079 --> 00:59:22,400 For simplicity, I worked with one 1421 00:59:20,000 --> 00:59:25,280 malignant and one benign subcategory at 1422 00:59:22,400 --> 00:59:29,520 40 times magnification. 1423 00:59:25,280 --> 00:59:34,079 An 8020 split gave 893 training images 1424 00:59:29,520 --> 00:59:36,160 and 224 testing images. 1425 00:59:34,079 --> 00:59:38,640 As seen in the graphs, augmentation of 1426 00:59:36,160 --> 00:59:41,680 data with applied rotations and flips 1427 00:59:38,640 --> 00:59:43,200 boosted testing accuracy to about 97%. 1428 00:59:41,680 --> 00:59:44,880 And yes, this is the part where I 1429 00:59:43,200 --> 00:59:47,880 quietly celebrated with a little happy 1430 00:59:44,880 --> 00:59:47,880 dance. 1431 00:59:48,559 --> 00:59:55,200 So here is project demo. 1432 00:59:52,799 --> 00:59:57,359 So here a random image from the testing 1433 00:59:55,200 --> 01:00:00,000 data set is selected and inputed into 1434 00:59:57,359 --> 01:00:01,920 the model. the prediction, true label, 1435 01:00:00,000 --> 01:00:03,760 and whether the whether the two matched 1436 01:00:01,920 --> 01:00:05,359 is displayed here. And we can continue 1437 01:00:03,760 --> 01:00:07,520 rerunning this as many times as we'd 1438 01:00:05,359 --> 01:00:09,440 like. Spoiler, sometimes it's wrong, 1439 01:00:07,520 --> 01:00:11,359 which is about 3% of times, and that's 1440 01:00:09,440 --> 01:00:14,760 okay. It gives us something to optimize 1441 01:00:11,359 --> 01:00:14,760 in the future. 1442 01:00:17,839 --> 01:00:22,720 So, in the hybrid CNN, I replaced only 1443 01:00:20,559 --> 01:00:25,839 the last layer of ResNet 18 with the 1444 01:00:22,720 --> 01:00:28,720 tiny BGG inspired classifier. 1445 01:00:25,839 --> 01:00:30,880 A tiny typo forgetting the colon made 1446 01:00:28,720 --> 01:00:32,880 the model select only the last layer 1447 01:00:30,880 --> 01:00:35,040 instead of all of the layers except the 1448 01:00:32,880 --> 01:00:36,880 final one. This meant that there was 1449 01:00:35,040 --> 01:00:39,760 actually no feature extraction going on 1450 01:00:36,880 --> 01:00:41,839 and accuracy dropped to 20%. 1451 01:00:39,760 --> 01:00:43,839 So after scanning for hours and 1452 01:00:41,839 --> 01:00:48,480 questioning my life decisions, I fixed 1453 01:00:43,839 --> 01:00:51,760 it and accuracy rose back up to 96%. 1454 01:00:48,480 --> 01:00:53,599 Okay, so this is actually a potential 1455 01:00:51,760 --> 01:00:55,520 issue, not something I actually face 1456 01:00:53,599 --> 01:00:57,839 because ResNet 18 is already pre-trained 1457 01:00:55,520 --> 01:01:00,079 model. But one of the biggest issues 1458 01:00:57,839 --> 01:01:01,920 with gradient descent is getting stuck 1459 01:01:00,079 --> 01:01:04,000 in local minima, especially in 1460 01:01:01,920 --> 01:01:06,000 relatively flat regions of the cost 1461 01:01:04,000 --> 01:01:08,160 curve instead of converging towards a 1462 01:01:06,000 --> 01:01:09,839 local minimum. The model thinks it's 1463 01:01:08,160 --> 01:01:12,240 done, but it hasn't actually found the 1464 01:01:09,839 --> 01:01:13,920 best solution yet. So I might encounter 1465 01:01:12,240 --> 01:01:16,079 this if I actually build ResNet from 1466 01:01:13,920 --> 01:01:18,079 scratch next semester instead of simp 1467 01:01:16,079 --> 01:01:20,000 simply importing it and using it and I 1468 01:01:18,079 --> 01:01:24,920 hope to explore solutions to such a 1469 01:01:20,000 --> 01:01:24,920 problem then. Thank you. 1470 01:01:26,799 --> 01:01:29,799 Amazing. 1471 01:01:29,839 --> 01:01:34,559 That was fantastic. 1472 01:01:32,880 --> 01:01:37,280 I hope you're all thinking up lots of 1473 01:01:34,559 --> 01:01:40,680 amazing questions. 1474 01:01:37,280 --> 01:01:40,680 I am 1475 01:01:48,640 --> 01:01:53,480 no. 1476 01:01:50,079 --> 01:01:53,480 Round of applause. 1477 01:01:53,920 --> 01:02:01,440 Thank you very much. Okay, 1478 01:01:56,880 --> 01:02:04,480 next up we have Leticia. Leticia is 1479 01:02:01,440 --> 01:02:07,680 going to be talking about a moodbased 1480 01:02:04,480 --> 01:02:10,319 playlist generator. 1481 01:02:07,680 --> 01:02:15,040 She's been programming for three years 1482 01:02:10,319 --> 01:02:19,960 and her favorite emoji is the 1483 01:02:15,040 --> 01:02:19,960 monle quizzical face. 1484 01:02:20,240 --> 01:02:25,119 Um, she recently learned about what deep 1485 01:02:23,119 --> 01:02:27,520 learning and neural networks are and 1486 01:02:25,119 --> 01:02:31,200 their applications, 1487 01:02:27,520 --> 01:02:33,920 which is pretty fantastic. 1488 01:02:31,200 --> 01:02:37,440 Beautiful. 1489 01:02:33,920 --> 01:02:37,440 Okay. Yes. 1490 01:02:42,559 --> 01:02:47,440 Um, good afternoon. My name is Leticia 1491 01:02:45,680 --> 01:02:49,040 and today I'm going to be presenting my 1492 01:02:47,440 --> 01:02:51,920 project, which is a moodbased playlist 1493 01:02:49,040 --> 01:02:53,839 generator. Some facts about me are that 1494 01:02:51,920 --> 01:02:56,000 I like to listen to lots of music in 1495 01:02:53,839 --> 01:02:58,160 different languages and genres. I 1496 01:02:56,000 --> 01:02:59,920 created this application to address my 1497 01:02:58,160 --> 01:03:03,599 personal issue with trying to find 1498 01:02:59,920 --> 01:03:06,000 varied songs that resonate with my mood. 1499 01:03:03,599 --> 01:03:07,920 Um, yes, I have studied IT and computer 1500 01:03:06,000 --> 01:03:10,000 science at school for almost four years, 1501 01:03:07,920 --> 01:03:12,079 and I'm currently doing a school-based 1502 01:03:10,000 --> 01:03:14,559 digital technologies apprenticeship at 1503 01:03:12,079 --> 01:03:17,200 DU and I may do a Bachelor of Science at 1504 01:03:14,559 --> 01:03:19,039 A&U next year. 1505 01:03:17,200 --> 01:03:20,720 Machine learning is creating models and 1506 01:03:19,039 --> 01:03:22,799 algorithms that enable computers to 1507 01:03:20,720 --> 01:03:24,160 learn from data automatically. Machine 1508 01:03:22,799 --> 01:03:25,920 learning models can make accurate 1509 01:03:24,160 --> 01:03:28,079 predictions and intelligent decisions 1510 01:03:25,920 --> 01:03:29,599 based on learned knowledge. I use a 1511 01:03:28,079 --> 01:03:33,039 supervised learning approach where all 1512 01:03:29,599 --> 01:03:35,039 data used to train the model is labeled. 1513 01:03:33,039 --> 01:03:37,280 The key libraries and models that my 1514 01:03:35,039 --> 01:03:39,359 program uses are TensorFlow, which is an 1515 01:03:37,280 --> 01:03:40,960 open- source machine learning library 1516 01:03:39,359 --> 01:03:43,359 with features for building and training 1517 01:03:40,960 --> 01:03:45,440 neural networks. Caris, which is 1518 01:03:43,359 --> 01:03:47,599 TensorFlow's API that provides a 1519 01:03:45,440 --> 01:03:49,839 user-friendly interface for building 1520 01:03:47,599 --> 01:03:52,240 network architectures. 1521 01:03:49,839 --> 01:03:54,079 Um, Open AI's Whisper, which is an 1522 01:03:52,240 --> 01:03:56,960 automatic speech recognition model 1523 01:03:54,079 --> 01:03:59,359 trained on multilingual data. It enables 1524 01:03:56,960 --> 01:04:01,200 transcription from 50 languages and 1525 01:03:59,359 --> 01:04:03,920 translation from those languages into 1526 01:04:01,200 --> 01:04:06,000 English. Labs is a model that can 1527 01:04:03,920 --> 01:04:09,200 produce dimensional sentence embeddings 1528 01:04:06,000 --> 01:04:11,280 for 109 languages. And lastly, Librosa 1529 01:04:09,200 --> 01:04:12,880 is a specialized Python library which 1530 01:04:11,280 --> 01:04:17,200 provides functions to manipulate and 1531 01:04:12,880 --> 01:04:20,079 extract key features from audio files. 1532 01:04:17,200 --> 01:04:21,440 So my program has two pipelines. One for 1533 01:04:20,079 --> 01:04:23,920 sound which is in the form of 1534 01:04:21,440 --> 01:04:26,799 spectrograms and one for lyrics. for the 1535 01:04:23,920 --> 01:04:29,440 spectrogram pipeline. MP3s are organized 1536 01:04:26,799 --> 01:04:31,119 into folders labeled by their moods in a 1537 01:04:29,440 --> 01:04:32,720 directory. They are converted into 1538 01:04:31,119 --> 01:04:34,880 spectrograms organized in a new 1539 01:04:32,720 --> 01:04:36,240 directory with a mirrored structure. The 1540 01:04:34,880 --> 01:04:38,000 classified spectrograms are used to 1541 01:04:36,240 --> 01:04:40,480 train a convolutional neural network 1542 01:04:38,000 --> 01:04:42,400 model and the CNN classifies the moods 1543 01:04:40,480 --> 01:04:44,559 of unclassified songs based on what it 1544 01:04:42,400 --> 01:04:46,160 learned from the training data. Lastly, 1545 01:04:44,559 --> 01:04:50,400 it generates playlists containing songs 1546 01:04:46,160 --> 01:04:53,200 classified at the user's desired mood. 1547 01:04:50,400 --> 01:04:55,039 So I use Librosa to process MP3 audio 1548 01:04:53,200 --> 01:04:57,440 data to create and display MEL 1549 01:04:55,039 --> 01:04:59,039 spectrograms. The spectrograms are 1550 01:04:57,440 --> 01:05:00,799 converted to a decibel scale which is 1551 01:04:59,039 --> 01:05:02,799 logarithmic. This makes it more 1552 01:05:00,799 --> 01:05:05,440 perceptually accurate as humans perceive 1553 01:05:02,799 --> 01:05:07,520 volume changes logarithmically. Neural 1554 01:05:05,440 --> 01:05:10,000 networks also train better with well 1555 01:05:07,520 --> 01:05:12,400 distributed data and logarithmic scaling 1556 01:05:10,000 --> 01:05:14,240 normalizes spectral input. This 1557 01:05:12,400 --> 01:05:16,079 transforms an audio classification 1558 01:05:14,240 --> 01:05:19,760 problem into an image classification 1559 01:05:16,079 --> 01:05:22,000 task which CNN's excel at. 1560 01:05:19,760 --> 01:05:24,400 For the data generation, the code 1561 01:05:22,000 --> 01:05:26,480 expects a directory structure where MP3s 1562 01:05:24,400 --> 01:05:28,799 are organized into subfolders labeled by 1563 01:05:26,480 --> 01:05:31,200 mood so classifications can be 1564 01:05:28,799 --> 01:05:32,640 automatically inferred from the program. 1565 01:05:31,200 --> 01:05:34,400 The outputed spectrograms are 1566 01:05:32,640 --> 01:05:37,280 automatically organized into a mirrored 1567 01:05:34,400 --> 01:05:39,680 directory for training. I implement an 1568 01:05:37,280 --> 01:05:41,520 80 to 20 training validation data split 1569 01:05:39,680 --> 01:05:44,319 to evaluate how the model would perform 1570 01:05:41,520 --> 01:05:46,400 on unclassified data. The classification 1571 01:05:44,319 --> 01:05:48,240 method I chose was categorical rather 1572 01:05:46,400 --> 01:05:51,200 than dimensional which I found more 1573 01:05:48,240 --> 01:05:52,799 achievable in the time frame I had. 1574 01:05:51,200 --> 01:05:54,960 Now I will talk about the training and 1575 01:05:52,799 --> 01:05:56,559 model creation. But before I get into 1576 01:05:54,960 --> 01:05:59,680 the codes I will talk about the model I 1577 01:05:56,559 --> 01:06:01,440 use which is a CNN. CNN's are directed 1578 01:05:59,680 --> 01:06:03,119 to cyclic graphs where each node 1579 01:06:01,440 --> 01:06:05,920 computes a function of its inputs and 1580 01:06:03,119 --> 01:06:08,000 passes the result to its successes. This 1581 01:06:05,920 --> 01:06:10,240 works as hierarchical feature detectors 1582 01:06:08,000 --> 01:06:13,440 which is why CNN's are good for computer 1583 01:06:10,240 --> 01:06:15,359 vision tasks like image classification. 1584 01:06:13,440 --> 01:06:17,760 Um, a convolution is where a 1585 01:06:15,359 --> 01:06:20,240 matrix/filter slides over input to 1586 01:06:17,760 --> 01:06:21,680 generate a feature map. Each filter has 1587 01:06:20,240 --> 01:06:24,000 weights and biases which are shared 1588 01:06:21,680 --> 01:06:25,680 across all neurons that use it, reducing 1589 01:06:24,000 --> 01:06:28,079 the number of trainable parameters 1590 01:06:25,680 --> 01:06:30,319 significantly. And weights are how much 1591 01:06:28,079 --> 01:06:32,799 an input influences an output and the 1592 01:06:30,319 --> 01:06:34,720 weight sharing enables features filters 1593 01:06:32,799 --> 01:06:37,119 to detect features in the input 1594 01:06:34,720 --> 01:06:38,640 regardless of their location. Many 1595 01:06:37,119 --> 01:06:41,280 filters can be generated to capture 1596 01:06:38,640 --> 01:06:43,280 unique features from the input. 1597 01:06:41,280 --> 01:06:45,599 Pooling is a function that generates 1598 01:06:43,280 --> 01:06:47,839 smaller output vectors of the input. I 1599 01:06:45,599 --> 01:06:49,520 used max pooling which takes the maximum 1600 01:06:47,839 --> 01:06:51,599 value of the feature map and is good at 1601 01:06:49,520 --> 01:06:53,839 detecting the most prominent features in 1602 01:06:51,599 --> 01:06:55,680 the input. Pooling increases 1603 01:06:53,839 --> 01:06:57,760 computational efficiency and reduces 1604 01:06:55,680 --> 01:07:00,480 overfitting. 1605 01:06:57,760 --> 01:07:02,240 Um, ReLU is a mathematical function 1606 01:07:00,480 --> 01:07:04,559 applied to neuron outputs that 1607 01:07:02,240 --> 01:07:06,000 determines activation. With ReLU, 1608 01:07:04,559 --> 01:07:08,400 positive inputs are passed through 1609 01:07:06,000 --> 01:07:10,079 unchanged otherwise zero is outputed. 1610 01:07:08,400 --> 01:07:11,920 This creates representations where only 1611 01:07:10,079 --> 01:07:13,359 the most salient features activate, 1612 01:07:11,920 --> 01:07:16,079 ignoring weaker features that can 1613 01:07:13,359 --> 01:07:17,839 complicate decision- making. Lastly, 1614 01:07:16,079 --> 01:07:19,920 softmax is an activation function 1615 01:07:17,839 --> 01:07:21,680 applied to the network's last layer and 1616 01:07:19,920 --> 01:07:25,839 enables input classification by 1617 01:07:21,680 --> 01:07:28,559 assigning probabilities to each class. 1618 01:07:25,839 --> 01:07:30,400 So my model has a basic CNN architecture 1619 01:07:28,559 --> 01:07:34,000 optimized for image classification with 1620 01:07:30,400 --> 01:07:36,960 the components explained before. 1621 01:07:34,000 --> 01:07:38,559 Now for the lyric pipeline, MP3 files 1622 01:07:36,960 --> 01:07:40,559 from the original directory are 1623 01:07:38,559 --> 01:07:42,880 transcribed, translated to English if 1624 01:07:40,559 --> 01:07:45,359 necessary, and saved as text files in a 1625 01:07:42,880 --> 01:07:47,599 mirrored directory. Mood lyric pairs are 1626 01:07:45,359 --> 01:07:49,440 compiled into a CSV file, and lyrics in 1627 01:07:47,599 --> 01:07:51,440 the CSV are converted into sentence 1628 01:07:49,440 --> 01:07:53,359 embeddings used to train a deep neural 1629 01:07:51,440 --> 01:07:56,240 network. 1630 01:07:53,359 --> 01:07:58,319 For the MP3 to text conversion, OpenAI's 1631 01:07:56,240 --> 01:08:00,319 whisper model is loaded and used for 1632 01:07:58,319 --> 01:08:02,799 transcription and translation of MP3 1633 01:08:00,319 --> 01:08:04,720 files. An empty list is initialized to 1634 01:08:02,799 --> 01:08:07,680 store mood lyric pairs to be at the end 1635 01:08:04,720 --> 01:08:09,440 compiled into a CSV. Some issues I 1636 01:08:07,680 --> 01:08:11,280 experienced is that Whisper can be 1637 01:08:09,440 --> 01:08:12,960 resource intensive and takes a few 1638 01:08:11,280 --> 01:08:15,520 minutes to transcribe and translate a 1639 01:08:12,960 --> 01:08:17,759 single song and it often mistranscribes 1640 01:08:15,520 --> 01:08:19,520 or fails with noisy audio and is better 1641 01:08:17,759 --> 01:08:21,199 at translating some languages over 1642 01:08:19,520 --> 01:08:23,120 others. 1643 01:08:21,199 --> 01:08:26,120 Here's some example of a strange 1644 01:08:23,120 --> 01:08:26,120 translation. 1645 01:08:27,279 --> 01:08:32,000 Um the model used for this pipeline is a 1646 01:08:29,520 --> 01:08:33,920 transformer which is a neural network 1647 01:08:32,000 --> 01:08:35,199 architecture that processes text by 1648 01:08:33,920 --> 01:08:37,600 converting it into numerical 1649 01:08:35,199 --> 01:08:39,759 representations called tokens. Each 1650 01:08:37,600 --> 01:08:41,520 token is mapped to a vector using a word 1651 01:08:39,759 --> 01:08:43,120 embedding table allowing the model to 1652 01:08:41,520 --> 01:08:45,920 understand the meaning and context of 1653 01:08:43,120 --> 01:08:47,679 words. My transformer uses the lab's 1654 01:08:45,920 --> 01:08:49,600 model to produce sentence embeddings on 1655 01:08:47,679 --> 01:08:51,279 the lyrics. This means the model doesn't 1656 01:08:49,600 --> 01:08:53,120 have to learn from raw text but more 1657 01:08:51,279 --> 01:08:56,159 informative embeddings and the model can 1658 01:08:53,120 --> 01:08:58,560 map meaning to mood. 1659 01:08:56,159 --> 01:09:00,159 And the last step is classification. And 1660 01:08:58,560 --> 01:09:02,960 the above images show the general 1661 01:09:00,159 --> 01:09:04,960 classification pipeline where the system 1662 01:09:02,960 --> 01:09:07,440 initializes a global playlist dictionary 1663 01:09:04,960 --> 01:09:09,839 with empty lists for each mood category. 1664 01:09:07,440 --> 01:09:11,600 For each MP3 file, a spectrogram image 1665 01:09:09,839 --> 01:09:13,600 or text file is generated through the 1666 01:09:11,600 --> 01:09:15,359 affforementioned processing techniques 1667 01:09:13,600 --> 01:09:17,759 and inputed to the trained models for 1668 01:09:15,359 --> 01:09:19,359 analysis. Each processed song is 1669 01:09:17,759 --> 01:09:21,520 automatically sorted into its mood 1670 01:09:19,359 --> 01:09:23,040 category within the playlist dictionary, 1671 01:09:21,520 --> 01:09:26,080 creating an organized collection of 1672 01:09:23,040 --> 01:09:28,880 playlists defined by mood. 1673 01:09:26,080 --> 01:09:31,880 And now I can show the product of my 1674 01:09:28,880 --> 01:09:31,880 code. 1675 01:09:37,359 --> 01:09:41,319 Um, does anyone know? 1676 01:09:51,279 --> 01:09:56,239 We're building suspense for the demo. 1677 01:10:02,000 --> 01:10:06,280 Yeah, I kind of want to show this one. 1678 01:10:13,679 --> 01:10:20,040 The quietest foot drum roll 1679 01:10:17,040 --> 01:10:20,040 spreads. 1680 01:10:21,040 --> 01:10:25,199 This is how you get your steps up. 1681 01:10:25,679 --> 01:10:28,679 Switch. 1682 01:10:44,719 --> 01:10:49,719 You didn't realize this was a fitness 1683 01:10:46,480 --> 01:10:49,719 boot camp. 1684 01:10:50,320 --> 01:10:52,800 Oh, 1685 01:10:51,199 --> 01:10:58,280 dope. 1686 01:10:52,800 --> 01:10:58,280 B. Yeah. Okay. Burpees now. Hey. 1687 01:10:59,520 --> 01:11:03,840 So, you can see there's two types you 1688 01:11:01,520 --> 01:11:06,640 can choose from. Either sound or lyrics 1689 01:11:03,840 --> 01:11:08,159 and it will generate different playlists 1690 01:11:06,640 --> 01:11:12,400 probably because it uses different 1691 01:11:08,159 --> 01:11:14,159 models. And then there's the moods here. 1692 01:11:12,400 --> 01:11:16,640 Some playlists don't have as many 1693 01:11:14,159 --> 01:11:19,440 because I guess the model was 1694 01:11:16,640 --> 01:11:22,920 overfitting or something. And yeah, 1695 01:11:19,440 --> 01:11:22,920 that's about it. 1696 01:11:25,679 --> 01:11:30,199 A massive round of applause. 1697 01:11:30,719 --> 01:11:35,199 The demo gods are smiling on us. They 1698 01:11:33,280 --> 01:11:36,719 are rewarding. 1699 01:11:35,199 --> 01:11:38,000 I was going to say they're rewarding our 1700 01:11:36,719 --> 01:11:42,040 patients, but really they're they're 1701 01:11:38,000 --> 01:11:42,040 rewarding the students efforts. 1702 01:11:44,719 --> 01:11:52,800 High five. Yes. Amazing. 1703 01:11:48,960 --> 01:11:54,480 One more massive round of applause. 1704 01:11:52,800 --> 01:11:56,800 Okay, 1705 01:11:54,480 --> 01:11:58,800 we have two talks left. I know you're 1706 01:11:56,800 --> 01:12:01,120 all tired, all of that stomping your 1707 01:11:58,800 --> 01:12:04,960 feet. It's okay. 1708 01:12:01,120 --> 01:12:06,800 It's all right. Uh, up next we have 1709 01:12:04,960 --> 01:12:10,000 Kevin. 1710 01:12:06,800 --> 01:12:13,679 Kevin is going to talk about Python 1711 01:12:10,000 --> 01:12:15,600 Flask as a backend framework. Um, Kevin 1712 01:12:13,679 --> 01:12:18,159 was first introduced to programming in 1713 01:12:15,600 --> 01:12:21,360 year four, eight years ago for first 1714 01:12:18,159 --> 01:12:25,199 Lego League. Uh, Kevin's favorite emoji 1715 01:12:21,360 --> 01:12:28,239 is eyes. 1716 01:12:25,199 --> 01:12:30,239 Shifty eyes. Uh, and Kevin recently 1717 01:12:28,239 --> 01:12:32,800 learned about MCP servers, which help 1718 01:12:30,239 --> 01:12:35,760 standardize how LM receive context from 1719 01:12:32,800 --> 01:12:38,159 external sources. and he's been working 1720 01:12:35,760 --> 01:12:41,040 on a project that uses XMCP, the MCP 1721 01:12:38,159 --> 01:12:43,600 framework, to develop a custom MCP for 1722 01:12:41,040 --> 01:12:45,280 your app, the link to which you'll drop 1723 01:12:43,600 --> 01:12:50,199 in the Discord, right? 1724 01:12:45,280 --> 01:12:50,199 Yeah. Massive round of applause. 1725 01:12:52,320 --> 01:12:56,880 Hello. Um, I'm here to talk about Flask 1726 01:12:54,560 --> 01:12:58,560 as a fashion framework and um, recently 1727 01:12:56,880 --> 01:13:00,000 I was tasked by my teacher to create a 1728 01:12:58,560 --> 01:13:01,280 web app and normally that'll be 1729 01:13:00,000 --> 01:13:03,280 straightforward. I would use like a 1730 01:13:01,280 --> 01:13:05,040 JavaScript framework like React, but 1731 01:13:03,280 --> 01:13:08,159 unfortunately there was one exception. I 1732 01:13:05,040 --> 01:13:10,560 had to use Python. And um so I decided 1733 01:13:08,159 --> 01:13:13,360 to go with a hybrid approach would which 1734 01:13:10,560 --> 01:13:15,199 would include using both. And so I'll 1735 01:13:13,360 --> 01:13:18,480 use Flask as my backend framework and 1736 01:13:15,199 --> 01:13:20,560 React as my front-end framework. Um so 1737 01:13:18,480 --> 01:13:22,239 there was just one problem. It was I'd 1738 01:13:20,560 --> 01:13:24,320 never built an app before with two 1739 01:13:22,239 --> 01:13:28,640 different back end. Oh, with one front 1740 01:13:24,320 --> 01:13:32,480 end and one separate back end. Um, 1741 01:13:28,640 --> 01:13:34,400 so sorry. Um, yeah. So, my app that I've 1742 01:13:32,480 --> 01:13:36,640 designed is Fineman and it basically 1743 01:13:34,400 --> 01:13:39,360 unifies workflows for students and it 1744 01:13:36,640 --> 01:13:41,679 interlinks tasks, notes as well as time 1745 01:13:39,360 --> 01:13:43,679 study sessions into one timeline so you 1746 01:13:41,679 --> 01:13:45,840 know exactly what you're working on, 1747 01:13:43,679 --> 01:13:47,440 when, and why. And this helps you to 1748 01:13:45,840 --> 01:13:49,040 further optimize your productivity 1749 01:13:47,440 --> 01:13:51,360 continuously. 1750 01:13:49,040 --> 01:13:53,920 Um, and this means that the app is 1751 01:13:51,360 --> 01:13:55,679 storing sensitive data such as personal 1752 01:13:53,920 --> 01:13:57,920 email addresses as well as personal 1753 01:13:55,679 --> 01:14:00,159 notes and reflections. So if an attacker 1754 01:13:57,920 --> 01:14:02,560 gained access to the system, it would 1755 01:14:00,159 --> 01:14:04,719 compromise the integrity of the app. And 1756 01:14:02,560 --> 01:14:07,120 this makes the browser server boundary 1757 01:14:04,719 --> 01:14:09,120 very important and critical to the app's 1758 01:14:07,120 --> 01:14:11,600 operation. 1759 01:14:09,120 --> 01:14:14,000 Um so initially since I had no previous 1760 01:14:11,600 --> 01:14:16,880 experience with blast I decided to put 1761 01:14:14,000 --> 01:14:19,199 all my validation on the client side and 1762 01:14:16,880 --> 01:14:21,440 unfortunately this is not very safe um 1763 01:14:19,199 --> 01:14:24,560 as it meant I had zero validation on the 1764 01:14:21,440 --> 01:14:26,880 server side. So as you can tell um this 1765 01:14:24,560 --> 01:14:28,640 could this meant that you could bypass 1766 01:14:26,880 --> 01:14:32,080 um all the security measures on the 1767 01:14:28,640 --> 01:14:35,280 client by making requests via like tools 1768 01:14:32,080 --> 01:14:37,600 such as Postmen and like the cult. And 1769 01:14:35,280 --> 01:14:40,320 um this meant that you could entirely 1770 01:14:37,600 --> 01:14:42,480 bypass all the chats and send all the 1771 01:14:40,320 --> 01:14:46,159 SQL injections or whatever code you want 1772 01:14:42,480 --> 01:14:47,920 directly to the server. Um now frankly 1773 01:14:46,159 --> 01:14:51,440 um I wasn't the only one who made this 1774 01:14:47,920 --> 01:14:53,040 mistake as um a couple of all um well 1775 01:14:51,440 --> 01:14:55,840 you've heard of British Airlines as well 1776 01:14:53,040 --> 01:14:59,440 as Uber. They've been fined and they've 1777 01:14:55,840 --> 01:15:02,239 um had significant reputational damage 1778 01:14:59,440 --> 01:15:05,360 as well as uh financial and legal uh 1779 01:15:02,239 --> 01:15:08,400 implications due to as a result of these 1780 01:15:05,360 --> 01:15:11,120 um security concerns. 1781 01:15:08,400 --> 01:15:13,199 Um so with that in mind, I decided to go 1782 01:15:11,120 --> 01:15:16,400 with a separate approach where I would 1783 01:15:13,199 --> 01:15:18,560 have an independent check on the server. 1784 01:15:16,400 --> 01:15:20,640 And so as you can see in the blue, um 1785 01:15:18,560 --> 01:15:22,880 there's an additional barrier for the 1786 01:15:20,640 --> 01:15:26,480 backend validation. 1787 01:15:22,880 --> 01:15:29,520 And this just processes and um verifies 1788 01:15:26,480 --> 01:15:32,000 inputs uh when the server receives uh 1789 01:15:29,520 --> 01:15:33,920 additional contacts. So um as you can 1790 01:15:32,000 --> 01:15:36,159 see I used a library called Cberus and 1791 01:15:33,920 --> 01:15:38,719 it has a validator which you can define 1792 01:15:36,159 --> 01:15:42,560 a schema and based off the schema it can 1793 01:15:38,719 --> 01:15:45,040 reject or um take in uh an input and 1794 01:15:42,560 --> 01:15:48,320 this runs regardless whether through the 1795 01:15:45,040 --> 01:15:50,159 UI or through an add an external API 1796 01:15:48,320 --> 01:15:54,000 request. 1797 01:15:50,159 --> 01:15:56,640 Um how oh and I also implemented cause 1798 01:15:54,000 --> 01:15:59,760 so um this aims to address cross origin 1799 01:15:56,640 --> 01:16:03,280 attacks. So these result from external 1800 01:15:59,760 --> 01:16:07,520 attacks from other sites where um you 1801 01:16:03,280 --> 01:16:09,760 could send uh malicious data um which 1802 01:16:07,520 --> 01:16:12,320 bypasses the cookie straight into the 1803 01:16:09,760 --> 01:16:14,239 server. So what causes it's a browser 1804 01:16:12,320 --> 01:16:16,159 rule that controls which websites and 1805 01:16:14,239 --> 01:16:18,560 addresses are able to read the response 1806 01:16:16,159 --> 01:16:20,719 from my back end. Um so as you can see 1807 01:16:18,560 --> 01:16:23,440 on the right with the Python code um 1808 01:16:20,719 --> 01:16:25,280 I've specifically defined the origins. 1809 01:16:23,440 --> 01:16:28,320 So I have the three main domains as well 1810 01:16:25,280 --> 01:16:30,719 as the local host server um to which are 1811 01:16:28,320 --> 01:16:34,080 the only domains that can take in and 1812 01:16:30,719 --> 01:16:37,280 read the requests from the back end. 1813 01:16:34,080 --> 01:16:38,960 Um however there is one downside um 1814 01:16:37,280 --> 01:16:41,520 cause does not stop the browser from 1815 01:16:38,960 --> 01:16:45,360 submitting HTML forms across sites. So, 1816 01:16:41,520 --> 01:16:48,159 this could expose uh my site to um 1817 01:16:45,360 --> 01:16:51,360 cross-sight forgery uh cross-sight 1818 01:16:48,159 --> 01:16:53,199 request forgery attacks. And this occurs 1819 01:16:51,360 --> 01:16:55,040 when a different site attempts to trick 1820 01:16:53,199 --> 01:16:57,600 the users's browser into sending a valid 1821 01:16:55,040 --> 01:17:00,080 cookie um which goes straight into the 1822 01:16:57,600 --> 01:17:03,280 back end. And since it uses the cookie 1823 01:17:00,080 --> 01:17:05,520 from the browser, uh it attaches all the 1824 01:17:03,280 --> 01:17:08,000 user data and basically is able to 1825 01:17:05,520 --> 01:17:10,000 effectively impersonate the user. And 1826 01:17:08,000 --> 01:17:12,239 this makes the user assume that it was 1827 01:17:10,000 --> 01:17:16,320 indeed the user rather than the militia 1828 01:17:12,239 --> 01:17:18,960 site. Um so as you can see um with a 1829 01:17:16,320 --> 01:17:22,239 simple demo on the right you can see a 1830 01:17:18,960 --> 01:17:24,000 simple form could basically like steal 1831 01:17:22,239 --> 01:17:28,239 your cookies from another site and 1832 01:17:24,000 --> 01:17:31,280 impersonate your um session to my site. 1833 01:17:28,239 --> 01:17:34,080 And again, this could lead to um attacks 1834 01:17:31,280 --> 01:17:36,640 such as like stealing information and as 1835 01:17:34,080 --> 01:17:40,400 well as deleting um personal details 1836 01:17:36,640 --> 01:17:43,040 which could lead to significant um in 1837 01:17:40,400 --> 01:17:47,120 data concerns. 1838 01:17:43,040 --> 01:17:50,080 So I moved on to my final iteration. Um 1839 01:17:47,120 --> 01:17:52,880 and this one I I implemented um 1840 01:17:50,080 --> 01:17:55,280 cross-ite refraudy request forgery 1841 01:17:52,880 --> 01:17:57,280 tokens. So this is a randomly generated 1842 01:17:55,280 --> 01:18:00,080 value which is issued by the server and 1843 01:17:57,280 --> 01:18:01,920 it's stored in the session and um this 1844 01:18:00,080 --> 01:18:04,719 makes it so that every request to the 1845 01:18:01,920 --> 01:18:06,800 API um must include the token in the 1846 01:18:04,719 --> 01:18:10,880 header or else it would return with a 1847 01:18:06,800 --> 01:18:13,760 400 403 error which is a forbidden um 1848 01:18:10,880 --> 01:18:15,280 error code and this made sure this 1849 01:18:13,760 --> 01:18:17,440 ensures that the back end and framework 1850 01:18:15,280 --> 01:18:19,199 uh back end and front end are able to 1851 01:18:17,440 --> 01:18:21,679 effectively and safely communicate 1852 01:18:19,199 --> 01:18:24,320 without issues. 1853 01:18:21,679 --> 01:18:26,640 Um well, was it was it worth it in the 1854 01:18:24,320 --> 01:18:29,440 end? Well, unfortunately, it turns out 1855 01:18:26,640 --> 01:18:31,199 not really because um there are 1856 01:18:29,440 --> 01:18:33,199 alternatives such as Django and Fast 1857 01:18:31,199 --> 01:18:35,600 API, which are also Python-based 1858 01:18:33,199 --> 01:18:38,000 frameworks that offer all of the 1859 01:18:35,600 --> 01:18:39,760 security implementations out of the box, 1860 01:18:38,000 --> 01:18:42,080 which means you wouldn't necessarily 1861 01:18:39,760 --> 01:18:43,840 have to implement this yourself. And as 1862 01:18:42,080 --> 01:18:46,719 you can see, they offer more than just 1863 01:18:43,840 --> 01:18:50,159 this. And they provide other benefits on 1864 01:18:46,719 --> 01:18:52,080 top of um the security measures. 1865 01:18:50,159 --> 01:18:54,640 But uh despite this, it was actually a 1866 01:18:52,080 --> 01:18:56,480 great learning experience um as it 1867 01:18:54,640 --> 01:18:59,120 provided me with a really in-depth and 1868 01:18:56,480 --> 01:19:01,199 foundational outlook on how security 1869 01:18:59,120 --> 01:19:03,280 works at a fundamental level. And 1870 01:19:01,199 --> 01:19:05,040 building it in FL in a FL environment 1871 01:19:03,280 --> 01:19:06,719 required me to make explicit and 1872 01:19:05,040 --> 01:19:09,520 intentional choices which gave me more 1873 01:19:06,719 --> 01:19:11,520 control over the intricacies of security 1874 01:19:09,520 --> 01:19:13,760 decisions. 1875 01:19:11,520 --> 01:19:15,600 Yeah. And um you can actually view the 1876 01:19:13,760 --> 01:19:19,360 site right now. Um the domain's on the 1877 01:19:15,600 --> 01:19:22,320 bottom right. It's fine. Um, and I'm 1878 01:19:19,360 --> 01:19:24,239 constantly making updates. Yeah. Um, as 1879 01:19:22,320 --> 01:19:27,280 mentioned earlier on, I'm working on 1880 01:19:24,239 --> 01:19:29,840 like adding MCP servers to the um, back 1881 01:19:27,280 --> 01:19:31,650 end so it works better with AI. And 1882 01:19:29,840 --> 01:19:38,000 yeah, thanks. 1883 01:19:31,650 --> 01:19:40,159 [Applause] 1884 01:19:38,000 --> 01:19:42,560 Amazing. 1885 01:19:40,159 --> 01:19:44,960 All right, you lot. Hang on. Hang on. I 1886 01:19:42,560 --> 01:19:46,320 need to high five you on the way out. I 1887 01:19:44,960 --> 01:19:50,679 have too many things in my hand. Yes, 1888 01:19:46,320 --> 01:19:50,679 thank you. But I need that as well. 1889 01:19:55,840 --> 01:20:01,400 Next up, we have a thing. So, we're 1890 01:19:57,840 --> 01:20:01,400 going to need a minute. 1891 01:20:11,520 --> 01:20:15,520 Now would be a fantastic time to think 1892 01:20:13,679 --> 01:20:17,199 of some questions and put them in the 1893 01:20:15,520 --> 01:20:20,199 Discord so you don't forget the 1894 01:20:17,199 --> 01:20:20,199 questions. 1895 01:20:20,239 --> 01:20:27,960 Um, oh, I've got so many people to 1896 01:20:22,880 --> 01:20:27,960 introduce. I should not be stalling. Um, 1897 01:20:28,000 --> 01:20:31,760 I should be stalling 1898 01:20:30,080 --> 01:20:35,280 with the proper stalling here. Hold 1899 01:20:31,760 --> 01:20:39,040 this. Thank you. Excellent. Okay, so 1900 01:20:35,280 --> 01:20:40,960 next up we have 1901 01:20:39,040 --> 01:20:43,600 Sigund. 1902 01:20:40,960 --> 01:20:47,440 This is Sigund. 1903 01:20:43,600 --> 01:20:48,960 Um, we have Alex, Haley, Lonnie, and 1904 01:20:47,440 --> 01:20:50,000 Ryland. 1905 01:20:48,960 --> 01:20:53,280 I'm gonna do that again. You're going to 1906 01:20:50,000 --> 01:20:56,000 wave at the right time, Alex. Hang on. 1907 01:20:53,280 --> 01:20:59,360 Yeah. Ah, there we go. Even nice. 1908 01:20:56,000 --> 01:21:03,280 Beautiful. Um, their favorite emoji 1909 01:20:59,360 --> 01:21:04,960 respectively are sunglasses colon 1910 01:21:03,280 --> 01:21:07,520 bracket bracket. I know it's not an 1911 01:21:04,960 --> 01:21:13,199 emoji, but I like it anyway. Hands 1912 01:21:07,520 --> 01:21:16,880 together. And gave me two options of 1913 01:21:13,199 --> 01:21:18,719 I eyes with no face. I don't know why I 1914 01:21:16,880 --> 01:21:22,640 closed my eyes but continued to have a 1915 01:21:18,719 --> 01:21:25,360 face then. I'm not really sure. um or 1916 01:21:22,640 --> 01:21:28,880 pro perhaps uh relevant kind of sad 1917 01:21:25,360 --> 01:21:31,360 looking um they recently they've they've 1918 01:21:28,880 --> 01:21:35,120 been programming a while eight years 1919 01:21:31,360 --> 01:21:37,120 since year seven four years uh and about 1920 01:21:35,120 --> 01:21:39,199 seven years ago. 1921 01:21:37,120 --> 01:21:42,080 Um they've learned that it's pronounced 1922 01:21:39,199 --> 01:21:45,040 GIF, not GIF. 1923 01:21:42,080 --> 01:21:47,040 Um 1924 01:21:45,040 --> 01:21:50,239 uh they've learned how neat algorithms 1925 01:21:47,040 --> 01:21:52,560 work. They've they funnily enough, it 1926 01:21:50,239 --> 01:21:56,719 was this question that taught me you can 1927 01:21:52,560 --> 01:22:00,560 combine emoji. Yeah. And they've learned 1928 01:21:56,719 --> 01:22:02,800 that writing the report is the least fun 1929 01:22:00,560 --> 01:22:05,360 bit of a coding project. 1930 01:22:02,800 --> 01:22:09,199 [Applause] 1931 01:22:05,360 --> 01:22:13,080 I'm gonna Yes. Round of applause. 1932 01:22:09,199 --> 01:22:13,080 I'm going to give you two microphones. 1933 01:22:13,120 --> 01:22:17,600 That is That's for Sigment. 1934 01:22:16,000 --> 01:22:20,600 I've been told this microphone is for 1935 01:22:17,600 --> 01:22:20,600 segment. 1936 01:22:22,400 --> 01:22:27,480 Uh good evening all. We are the team 1937 01:22:23,920 --> 01:22:27,480 behind Sigment. 1938 01:22:27,760 --> 01:22:33,040 So what is Sigman? Sigment is the 1939 01:22:30,560 --> 01:22:35,760 combines both software and hardware to 1940 01:22:33,040 --> 01:22:38,080 create a safe space where everyone can 1941 01:22:35,760 --> 01:22:40,239 share their troubles freely. 1942 01:22:38,080 --> 01:22:43,120 We built Sigund as a way to lower the 1943 01:22:40,239 --> 01:22:46,239 barriers to mental health care, a a 1944 01:22:43,120 --> 01:22:48,320 topic that touches us all. 1945 01:22:46,239 --> 01:22:49,840 Um so Sigman works as like a middleman 1946 01:22:48,320 --> 01:22:54,159 between 1947 01:22:49,840 --> 01:22:56,400 um the client and so you and him um 1948 01:22:54,159 --> 01:22:58,159 trying to 1949 01:22:56,400 --> 01:23:00,000 make make this way like to make therapy 1950 01:22:58,159 --> 01:23:01,920 more affordable, more accessible to 1951 01:23:00,000 --> 01:23:04,560 people, just make everything a lot 1952 01:23:01,920 --> 01:23:07,040 easier. So we have a little teaser just 1953 01:23:04,560 --> 01:23:10,360 for a start. 1954 01:23:07,040 --> 01:23:10,360 Go say hi. 1955 01:23:13,600 --> 01:23:18,679 Back on back. 1956 01:23:15,679 --> 01:23:18,679 Back. 1957 01:23:23,360 --> 01:23:26,360 Hi. 1958 01:23:30,960 --> 01:23:35,120 It is 1959 01:23:32,719 --> 01:23:37,040 Penny Prit. So great to hear from you. 1960 01:23:35,120 --> 01:23:39,520 How have you been doing since we last 1961 01:23:37,040 --> 01:23:41,760 spoke? I've been thinking about our 1962 01:23:39,520 --> 01:23:43,840 previous conversations and wanted to 1963 01:23:41,760 --> 01:23:46,840 check in on how things are going for 1964 01:23:43,840 --> 01:23:46,840 you. 1965 01:23:49,030 --> 01:23:52,560 [Applause] 1966 01:23:50,239 --> 01:23:54,080 Uh so, Sigment is made up of a bunch of 1967 01:23:52,560 --> 01:23:56,560 different components that all work 1968 01:23:54,080 --> 01:24:00,080 together in harmony to create the weird 1969 01:23:56,560 --> 01:24:04,480 thing you see in front of you. Um first 1970 01:24:00,080 --> 01:24:08,520 of all, uh I worked on the server and 1971 01:24:04,480 --> 01:24:08,520 the large language model. 1972 01:24:09,280 --> 01:24:15,360 Um, I worked on the GUI so it can be 1973 01:24:12,320 --> 01:24:19,960 more accessible for users. 1974 01:24:15,360 --> 01:24:19,960 I built the face and made it emotional. 1975 01:24:20,239 --> 01:24:24,840 And I did your your input and output. 1976 01:24:25,360 --> 01:24:30,560 Um, so the server is a Flask framework 1977 01:24:27,760 --> 01:24:32,239 with uh a SQL database as the back end 1978 01:24:30,560 --> 01:24:33,920 which allows users to communicate and 1979 01:24:32,239 --> 01:24:36,560 bring up previous history that they've 1980 01:24:33,920 --> 01:24:40,159 talked to with Sigman beforehand. Now 1981 01:24:36,560 --> 01:24:42,560 the LLM Sigman says that he is this 1982 01:24:40,159 --> 01:24:45,360 thing here. Uh it's very good, sounds 1983 01:24:42,560 --> 01:24:49,040 human. Unfortunately, it is all wrong. 1984 01:24:45,360 --> 01:24:50,480 Um Sigman is actually Llama 3.2, which 1985 01:24:49,040 --> 01:24:52,880 is a transformer model that's trained on 1986 01:24:50,480 --> 01:24:54,800 a very big corpus of text by Llama. It 1987 01:24:52,880 --> 01:24:58,719 makes the LLM not only responsive, but 1988 01:24:54,800 --> 01:25:00,560 also incredibly human. It's scary, but 1989 01:24:58,719 --> 01:25:02,639 it's really good for something like 1990 01:25:00,560 --> 01:25:04,800 talking to someone and maintaining that 1991 01:25:02,639 --> 01:25:07,199 connection. 1992 01:25:04,800 --> 01:25:09,920 So my job was to make the server pretty. 1993 01:25:07,199 --> 01:25:11,920 Alex over here wrote a basic client file 1994 01:25:09,920 --> 01:25:17,120 and I took it and made it pretty. So 1995 01:25:11,920 --> 01:25:19,199 it's now mine and legally distinct. So 1996 01:25:17,120 --> 01:25:22,239 the way I built it is using a library 1997 01:25:19,199 --> 01:25:26,000 called dear pi gy which is based off a 1998 01:25:22,239 --> 01:25:28,239 C++ library called dear I'm gy. And as 1999 01:25:26,000 --> 01:25:30,639 you can see here there's two input boxes 2000 01:25:28,239 --> 01:25:32,560 to input a username and a password. And 2001 01:25:30,639 --> 01:25:35,280 there's two buttons down here login and 2002 01:25:32,560 --> 01:25:37,360 register. So what login does is it will 2003 01:25:35,280 --> 01:25:40,080 take the username and password. It will 2004 01:25:37,360 --> 01:25:42,400 send it to the server and then it will 2005 01:25:40,080 --> 01:25:44,560 return a result whether it's it was 2006 01:25:42,400 --> 01:25:46,320 found in the database or not. What 2007 01:25:44,560 --> 01:25:48,239 register does is it takes the username 2008 01:25:46,320 --> 01:25:51,360 and password and makes a new login which 2009 01:25:48,239 --> 01:25:54,639 it then logs into. Once you log in or 2010 01:25:51,360 --> 01:25:56,400 register it takes you to a chat page. As 2011 01:25:54,639 --> 01:25:58,639 you can see here, there's a chat window 2012 01:25:56,400 --> 01:26:01,360 where you can see text from both you and 2013 01:25:58,639 --> 01:26:03,920 Siggment. And there's an input box where 2014 01:26:01,360 --> 01:26:06,560 you can type a message to Sigment or you 2015 01:26:03,920 --> 01:26:09,040 can hold that voice button to speak to 2016 01:26:06,560 --> 01:26:10,960 Sigment. But it doesn't, this library 2017 01:26:09,040 --> 01:26:13,920 doesn't really work on Dear Pi Gooey. 2018 01:26:10,960 --> 01:26:17,679 So, we've got like a 2019 01:26:13,920 --> 01:26:20,840 textbased GUI system. Over to Haley for 2020 01:26:17,679 --> 01:26:20,840 the face. 2021 01:26:21,840 --> 01:26:26,159 The reason we gave Sigman to face was to 2022 01:26:24,080 --> 01:26:27,520 differentiate ourselves from other AI 2023 01:26:26,159 --> 01:26:31,320 therapists that are already on the 2024 01:26:27,520 --> 01:26:31,320 market like 2025 01:26:31,840 --> 01:26:36,719 an actual example is on kids helpline 2026 01:26:34,639 --> 01:26:38,400 where they have an AI chatbot. We found 2027 01:26:36,719 --> 01:26:40,800 that these products while being useful 2028 01:26:38,400 --> 01:26:42,400 we thought that a face would allow um 2029 01:26:40,800 --> 01:26:43,920 the client to build a deeper connection 2030 01:26:42,400 --> 01:26:46,320 with it and improve outcomes for 2031 01:26:43,920 --> 01:26:48,239 therapy. So to further this, we tried to 2032 01:26:46,320 --> 01:26:50,159 make the face as emotional as possible 2033 01:26:48,239 --> 01:26:52,719 using things like eyebrows as well as 2034 01:26:50,159 --> 01:26:54,239 different colored LEDs. Uh we had the 2035 01:26:52,719 --> 01:26:56,719 best of intentions with this, but it 2036 01:26:54,239 --> 01:26:58,239 ended up just making it creepy as hell. 2037 01:26:56,719 --> 01:27:01,280 So 2038 01:26:58,239 --> 01:27:03,840 good job, I suppose. 2039 01:27:01,280 --> 01:27:06,000 So the way the eyebrows and eyelids work 2040 01:27:03,840 --> 01:27:08,000 is using I squared C to act as like a 2041 01:27:06,000 --> 01:27:10,080 middleman between the Raspberry Pi and 2042 01:27:08,000 --> 01:27:12,320 the servos. So we can just input the 2043 01:27:10,080 --> 01:27:14,639 angle we want them to be at rather than 2044 01:27:12,320 --> 01:27:18,400 have to put in the PW and signals 2045 01:27:14,639 --> 01:27:20,239 ourselves. And then with the RGB LEDs, 2046 01:27:18,400 --> 01:27:22,320 they change color based on the different 2047 01:27:20,239 --> 01:27:24,159 emotion of what like sign text is 2048 01:27:22,320 --> 01:27:27,679 showing. So we actually get the llama 2049 01:27:24,159 --> 01:27:29,760 model to perform uh textural analysis on 2050 01:27:27,679 --> 01:27:32,480 itself. Uh sentiment analysis, I forgot 2051 01:27:29,760 --> 01:27:34,400 the word. Um so that we can get 2052 01:27:32,480 --> 01:27:36,800 different emotions. So something like 2053 01:27:34,400 --> 01:27:38,800 blue for sad or yellow for happy. Moving 2054 01:27:36,800 --> 01:27:40,159 over to Ryland. 2055 01:27:38,800 --> 01:27:41,440 Great. So, um, if you actually want to 2056 01:27:40,159 --> 01:27:43,199 talk to Simmon, you have to have voice 2057 01:27:41,440 --> 01:27:44,960 recognition. Um, for us, we're just 2058 01:27:43,199 --> 01:27:47,120 using two main parts. We got, uh, 2059 01:27:44,960 --> 01:27:48,719 recording and transcribing. Um, the 2060 01:27:47,120 --> 01:27:50,880 recording parts of it is just using two 2061 01:27:48,719 --> 01:27:52,480 libraries, sound device and sound file, 2062 01:27:50,880 --> 01:27:54,880 where you can play and record your audio 2063 01:27:52,480 --> 01:27:55,920 or read and write your audio. Um, so we 2064 01:27:54,880 --> 01:27:57,600 use that microphone over there for 2065 01:27:55,920 --> 01:27:58,960 input, which has a lot of samples, and 2066 01:27:57,600 --> 01:28:01,040 we just shove all of those into a web 2067 01:27:58,960 --> 01:28:03,280 file. Um, so that's one part and then we 2068 01:28:01,040 --> 01:28:06,880 get to transcribing which we use farts 2069 01:28:03,280 --> 01:28:08,080 to whisper which is just a a local text 2070 01:28:06,880 --> 01:28:09,920 to speech module which will go through 2071 01:28:08,080 --> 01:28:11,760 that audio file and transcribe it into a 2072 01:28:09,920 --> 01:28:13,280 single string of text. That text would 2073 01:28:11,760 --> 01:28:15,120 go to the server and we generate a 2074 01:28:13,280 --> 01:28:17,600 response which is then we when we get to 2075 01:28:15,120 --> 01:28:19,120 the voice output. The voice output is 2076 01:28:17,600 --> 01:28:21,679 again just using two libraries. It's 2077 01:28:19,120 --> 01:28:23,920 very simple. Um goes through Piper which 2078 01:28:21,679 --> 01:28:25,600 has about 30 English voices and about 42 2079 01:28:23,920 --> 01:28:27,600 different languages we can choose from. 2080 01:28:25,600 --> 01:28:30,639 However, we only speak English so we 2081 01:28:27,600 --> 01:28:33,280 only focus on English. Um, so we give 2082 01:28:30,639 --> 01:28:35,120 that we give that to Piper and then it 2083 01:28:33,280 --> 01:28:36,800 that it turns that string of text into 2084 01:28:35,120 --> 01:28:39,920 another web file which we play through 2085 01:28:36,800 --> 01:28:42,320 wave and which is what you heard before. 2086 01:28:39,920 --> 01:28:45,800 So if we go to a more elaborate demo of 2087 01:28:42,320 --> 01:28:45,800 what we had before 2088 01:28:58,800 --> 01:29:02,639 I'm feeling very nervous about a 2089 01:29:00,639 --> 01:29:06,520 presentation I'm currently doing. What 2090 01:29:02,639 --> 01:29:06,520 can I do to feel better? 2091 01:29:19,360 --> 01:29:23,600 Pineipa, I can sense that you're putting 2092 01:29:21,440 --> 01:29:25,760 a lot of pressure on yourself for this 2093 01:29:23,600 --> 01:29:28,000 presentation, and it's completely 2094 01:29:25,760 --> 01:29:30,320 understandable to feel nervous when 2095 01:29:28,000 --> 01:29:32,719 facing a challenging situation like 2096 01:29:30,320 --> 01:29:35,280 this. Can you tell me more about what 2097 01:29:32,719 --> 01:29:37,040 specifically is causing your anxiety? Is 2098 01:29:35,280 --> 01:29:41,560 there something in particular that's 2099 01:29:37,040 --> 01:29:41,560 making you worry or feel uncertain? 2100 01:29:42,800 --> 01:29:46,440 Keep talking to him. 2101 01:29:47,760 --> 01:29:51,280 Speak your mind, Lonnie. 2102 01:29:49,520 --> 01:29:52,960 There's a lot of people staring at me 2103 01:29:51,280 --> 01:29:54,800 right now, and it's making me feel a 2104 01:29:52,960 --> 01:29:58,040 little self-conscious. What can I do to 2105 01:29:54,800 --> 01:29:58,040 feel better? 2106 01:30:06,800 --> 01:30:10,880 But it sounds like the attention from 2107 01:30:09,040 --> 01:30:13,199 others is contributing to your 2108 01:30:10,880 --> 01:30:16,000 nervousness. But also acknowledge that 2109 01:30:13,199 --> 01:30:18,800 as public speaking goes on, sometimes we 2110 01:30:16,000 --> 01:30:20,960 get caught up in our own reactions. And 2111 01:30:18,800 --> 01:30:22,880 this feeling of being self-conscious 2112 01:30:20,960 --> 01:30:25,040 might be a bit more about how you're 2113 01:30:22,880 --> 01:30:28,239 perceiving yourself in the moment rather 2114 01:30:25,040 --> 01:30:32,080 than an objective reality. 2115 01:30:28,239 --> 01:30:32,080 We think you're doing great. 2116 01:30:32,800 --> 01:30:37,239 So, I think that's it. I think that's 2117 01:30:34,239 --> 01:30:37,239 it. 2118 01:30:47,060 --> 01:30:55,350 [Applause] 2119 01:30:56,000 --> 01:31:00,320 Awesome. 2120 01:30:57,679 --> 01:31:03,320 Can I have the biggest Round of 2121 01:31:00,320 --> 01:31:03,320 applause. 2122 01:31:04,639 --> 01:31:08,800 Can I have the biggest round of Yes. The 2123 01:31:07,280 --> 01:31:09,920 biggest round of applause for this. And 2124 01:31:08,800 --> 01:31:11,199 you can leave it there for a second if 2125 01:31:09,920 --> 01:31:12,239 you want or you can take it because I'm 2126 01:31:11,199 --> 01:31:14,639 actually going to get the biggest round 2127 01:31:12,239 --> 01:31:16,880 of applause for all of the students to 2128 01:31:14,639 --> 01:31:20,400 stand up. Yeah. 2129 01:31:16,880 --> 01:31:23,679 Come on students. Come on up. 2130 01:31:20,400 --> 01:31:25,280 Come on up on stage. 2131 01:31:23,679 --> 01:31:30,480 Let's see what this stage was weight 2132 01:31:25,280 --> 01:31:32,880 rated for. um because 2133 01:31:30,480 --> 01:31:34,159 they all did a phenomenal job. And I 2134 01:31:32,880 --> 01:31:35,199 know there are questions in here. I'm 2135 01:31:34,159 --> 01:31:39,400 going to get out of the way so you can 2136 01:31:35,199 --> 01:31:39,400 all take photos. Um 2137 01:31:41,840 --> 01:31:46,080 excellent. You get fancy stickers. Uh 2138 01:31:44,560 --> 01:31:49,199 and 2139 01:31:46,080 --> 01:31:51,920 do they have what questions do we have 2140 01:31:49,199 --> 01:31:57,840 in the room? 2141 01:31:51,920 --> 01:31:57,840 Yes. Thank you. Here we go. 2142 01:31:58,800 --> 01:32:03,199 Uh so my question is for Leticia. Um 2143 01:32:01,199 --> 01:32:06,719 your one of the classifiers was based 2144 01:32:03,199 --> 01:32:09,520 upon the spectroscope data. How visually 2145 01:32:06,719 --> 01:32:11,360 distinct are those spec spectroscopic 2146 01:32:09,520 --> 01:32:13,120 images? Like could a human tell them 2147 01:32:11,360 --> 01:32:15,120 apart or is this something where the 2148 01:32:13,120 --> 01:32:16,639 neural network is seeing very very 2149 01:32:15,120 --> 01:32:20,080 subtle differences and is and is 2150 01:32:16,639 --> 01:32:24,280 differentiating based on that? 2151 01:32:20,080 --> 01:32:24,280 Hang on, hang on, hang on, hang on. 2152 01:32:28,719 --> 01:32:34,560 Um, it's called a spectrogram and some 2153 01:32:32,080 --> 01:32:37,520 songs you can tell them apart but others 2154 01:32:34,560 --> 01:32:40,520 it can capture like the nuances. 2155 01:32:37,520 --> 01:32:40,520 Yes, 2156 01:32:51,920 --> 01:32:56,880 this question is to the group that just 2157 01:32:54,560 --> 01:33:00,080 presented. Then 2158 01:32:56,880 --> 01:33:03,600 that that face is that based on any one 2159 01:33:00,080 --> 01:33:05,679 of four of you? 2160 01:33:03,600 --> 01:33:07,520 Uh, no. Actually, I got the face model 2161 01:33:05,679 --> 01:33:10,080 from Thingiverse. We did have an older 2162 01:33:07,520 --> 01:33:13,520 one that was based on him, but it didn't 2163 01:33:10,080 --> 01:33:17,239 end up working out. So, no, 2164 01:33:13,520 --> 01:33:17,239 it wasn't very pretty. 2165 01:33:26,400 --> 01:33:31,040 Uh this one's for Mars I think it was. 2166 01:33:28,320 --> 01:33:33,360 Um who spent your life uh doing back 2167 01:33:31,040 --> 01:33:36,719 propagation. Um did you consider using 2168 01:33:33,360 --> 01:33:38,239 anything like or number or jacks to try 2169 01:33:36,719 --> 01:33:40,159 and speed it up? 2170 01:33:38,239 --> 01:33:42,080 I have never heard of those things. 2171 01:33:40,159 --> 01:33:43,520 Okay. 2172 01:33:42,080 --> 01:33:44,400 I'm sorry to say it might have saved you 2173 01:33:43,520 --> 01:33:49,400 some time. 2174 01:33:44,400 --> 01:33:49,400 Um but I will look into it though. Yes. 2175 01:33:50,719 --> 01:33:57,840 Um this one's for Shri. How 2176 01:33:54,719 --> 01:34:01,120 how well did your uh model and analysis 2177 01:33:57,840 --> 01:34:04,560 compare to other models analyzing and 2178 01:34:01,120 --> 01:34:06,400 and classifying tumors 2179 01:34:04,560 --> 01:34:09,360 like other existing models? 2180 01:34:06,400 --> 01:34:11,280 Yeah. Like I'm I'm not I'm not expecting 2181 01:34:09,360 --> 01:34:13,679 you to be you know cutting edge although 2182 01:34:11,280 --> 01:34:15,840 if you are that's awesome but like you 2183 01:34:13,679 --> 01:34:19,280 you were getting sort of 90 96ish 2184 01:34:15,840 --> 01:34:21,120 percent I think. What are the other 2185 01:34:19,280 --> 01:34:23,920 models that you've heard of getting? Do 2186 01:34:21,120 --> 01:34:25,920 you know? So this was the first time I 2187 01:34:23,920 --> 01:34:27,520 did image classification. All the 2188 01:34:25,920 --> 01:34:30,239 projects before that I was just 2189 01:34:27,520 --> 01:34:33,600 classifying straight up CSVs which 2190 01:34:30,239 --> 01:34:36,080 weren't image data. And for those I've 2191 01:34:33,600 --> 01:34:38,719 experimented with using a bunch of um 2192 01:34:36,080 --> 01:34:43,040 libraries from sklearn 2193 01:34:38,719 --> 01:34:45,600 um like decision trees and linear 2194 01:34:43,040 --> 01:34:48,320 regression and they all had about the 2195 01:34:45,600 --> 01:34:49,920 same amount 96%. Um, for image 2196 01:34:48,320 --> 01:34:51,679 classification, I haven't actually 2197 01:34:49,920 --> 01:34:54,320 experimented with anything else, so I 2198 01:34:51,679 --> 01:34:57,840 might check that out now. But I haven't 2199 01:34:54,320 --> 01:35:02,080 really seen anything that scores above 2200 01:34:57,840 --> 01:35:06,040 96% to be honest. So, I think it it did 2201 01:35:02,080 --> 01:35:06,040 pretty good. Yeah, 2202 01:35:06,080 --> 01:35:10,639 I have a question on the Discord. 2203 01:35:08,080 --> 01:35:12,239 Yeah, that one. Uh, so for the link 2204 01:35:10,639 --> 01:35:14,480 talk, uh, you said you were going to 2205 01:35:12,239 --> 01:35:16,159 change, uh, so that the suggestions were 2206 01:35:14,480 --> 01:35:17,360 less esoteric. Do you have any thoughts 2207 01:35:16,159 --> 01:35:21,000 about 2208 01:35:17,360 --> 01:35:21,000 how to do that. 2209 01:35:21,679 --> 01:35:24,639 Oh, sorry. Okay, 2210 01:35:23,440 --> 01:35:26,560 that's okay. 2211 01:35:24,639 --> 01:35:29,360 Yeah, 2212 01:35:26,560 --> 01:35:31,920 if you Hudson's on the Discord if he can 2213 01:35:29,360 --> 01:35:33,920 answer that himself. Excellent. I like 2214 01:35:31,920 --> 01:35:36,000 this question that Anthony that I am 2215 01:35:33,920 --> 01:35:37,920 really bad at recogniz. But I I'm going 2216 01:35:36,000 --> 01:35:39,760 to put this question perhaps as it's 2217 01:35:37,920 --> 01:35:42,480 more homework than question. Anthony 2218 01:35:39,760 --> 01:35:44,800 asks, "What is your," and I assume 2219 01:35:42,480 --> 01:35:47,040 that's the plural, um, least favorite 2220 01:35:44,800 --> 01:35:50,430 thing about Python, and which of you 2221 01:35:47,040 --> 01:35:51,760 will fix it? 2222 01:35:50,430 --> 01:35:53,679 [Applause] 2223 01:35:51,760 --> 01:35:56,320 I also noticed that they're all standing 2224 01:35:53,679 --> 01:36:00,840 like right up against the screen, so no 2225 01:35:56,320 --> 01:36:00,840 one can step backwards first. 2226 01:36:00,880 --> 01:36:05,040 Uh, does anyone want to say what their 2227 01:36:03,440 --> 01:36:07,920 least thing about least favorite thing 2228 01:36:05,040 --> 01:36:10,800 about Python is? and how I think they 2229 01:36:07,920 --> 01:36:13,280 all love everything about Python. 2230 01:36:10,800 --> 01:36:16,400 Um, are there any other questions? 2231 01:36:13,280 --> 01:36:19,400 Otherwise, uh, yeah, two more questions. 2232 01:36:16,400 --> 01:36:19,400 Alyssa, 2233 01:36:20,560 --> 01:36:23,600 you have a Python core developer in the 2234 01:36:22,159 --> 01:36:27,719 room. So, is there anything you want to 2235 01:36:23,600 --> 01:36:27,719 know about contributing to CPython? 2236 01:36:31,040 --> 01:36:37,080 Does anyone else want to answer? 2237 01:36:34,080 --> 01:36:37,080 Could 2238 01:36:37,280 --> 01:36:40,960 you could you repeat the question, 2239 01:36:38,960 --> 01:36:42,800 please? 2240 01:36:40,960 --> 01:36:44,719 Again, I think the question was more 2241 01:36:42,800 --> 01:36:45,199 homework than a genuine question. 2242 01:36:44,719 --> 01:36:47,600 Okay. 2243 01:36:45,199 --> 01:36:50,719 Um, but if you'd like to learn how to 2244 01:36:47,600 --> 01:36:52,800 contribute to to Python itself, 2245 01:36:50,719 --> 01:36:56,400 essentially, 2246 01:36:52,800 --> 01:37:00,199 okay, come talk to these folks. Uh, 2247 01:36:56,400 --> 01:37:00,199 okay. Here we go. 2248 01:37:00,719 --> 01:37:07,920 Hey. Um, so this one's for Kevin. 2249 01:37:04,080 --> 01:37:09,840 Uh did you end up continuing with the uh 2250 01:37:07,920 --> 01:37:11,600 like Flask back end or did you end up 2251 01:37:09,840 --> 01:37:14,320 changing the the back end later on? 2252 01:37:11,600 --> 01:37:16,480 Oh yeah. Um so I ended up pivoting most 2253 01:37:14,320 --> 01:37:18,639 of the functionality to like a NetJS 2254 01:37:16,480 --> 01:37:22,719 back end but I'm still using Flask for 2255 01:37:18,639 --> 01:37:24,800 like my AI um MCP servers um which is um 2256 01:37:22,719 --> 01:37:27,119 AI I mean sorry Python has a larger 2257 01:37:24,800 --> 01:37:29,040 ecosystem for like machine learning as 2258 01:37:27,119 --> 01:37:31,440 well as AI. So I'm probably going to 2259 01:37:29,040 --> 01:37:34,880 stick with FL for those like um 2260 01:37:31,440 --> 01:37:34,880 functionalities. Yeah. 2261 01:37:40,480 --> 01:37:44,080 We're just conferring on the on more 2262 01:37:42,159 --> 01:37:45,679 questions 2263 01:37:44,080 --> 01:37:48,679 even though we've absolutely run out of 2264 01:37:45,679 --> 01:37:48,679 time. 2265 01:37:48,960 --> 01:37:52,320 Ah, and I've forgotten how to use the 2266 01:37:50,639 --> 01:37:54,080 internet. 2267 01:37:52,320 --> 01:37:54,400 Um, 2268 01:37:54,080 --> 01:37:57,440 yes. 2269 01:37:54,400 --> 01:38:02,320 So, for Kayn, uh, we just have a 2270 01:37:57,440 --> 01:38:05,119 question about the, um, CSS styling. Uh, 2271 01:38:02,320 --> 01:38:07,760 that's like pro. 2272 01:38:05,119 --> 01:38:08,960 So, people were asking how a a year 12 2273 01:38:07,760 --> 01:38:10,880 student gets to that level. 2274 01:38:08,960 --> 01:38:12,960 Oh, it's just Tailwind. Like, I don't 2275 01:38:10,880 --> 01:38:15,119 know. I didn't mention it, but like if 2276 01:38:12,960 --> 01:38:16,960 you just um like Yeah, Tailwind like 2277 01:38:15,119 --> 01:38:19,600 they support like CSS is like in line, 2278 01:38:16,960 --> 01:38:21,440 so you can it's really easy. Um, as long 2279 01:38:19,600 --> 01:38:22,800 like you just get the hang of it. Um, 2280 01:38:21,440 --> 01:38:23,920 yeah, just Tailwind. I don't know if you 2281 01:38:22,800 --> 01:38:26,080 want to like look it up, but it's a 2282 01:38:23,920 --> 01:38:29,080 library for CSS and yeah, it's really 2283 01:38:26,080 --> 01:38:29,080 good. 2284 01:38:29,600 --> 01:38:33,280 Okay, I've just heard the worst 2285 01:38:30,960 --> 01:38:35,040 question. 2286 01:38:33,280 --> 01:38:41,960 Um, it's for the last scene that 2287 01:38:35,040 --> 01:38:41,960 presented. Can you make him angry? Like, 2288 01:38:42,719 --> 01:38:46,000 now you see why it was the worst 2289 01:38:44,480 --> 01:38:48,080 question. 2290 01:38:46,000 --> 01:38:51,719 Look away if you don't want Sigman to 2291 01:38:48,080 --> 01:38:51,719 haunt your dreams. 2292 01:38:52,960 --> 01:38:58,320 Why do his cheeks glow? Like what is 2293 01:38:56,400 --> 01:39:01,920 Were you modeling this on a were you you 2294 01:38:58,320 --> 01:39:04,000 were trying to Why? 2295 01:39:01,920 --> 01:39:06,960 Uh the cheeks glow cuz that's like where 2296 01:39:04,000 --> 01:39:08,480 human blush is and stuff, but it's like 2297 01:39:06,960 --> 01:39:10,800 where else were we going to put like the 2298 01:39:08,480 --> 01:39:15,119 color for emotion? 2299 01:39:10,800 --> 01:39:17,600 Ah yes. Traditionally blushing blue. 2300 01:39:15,119 --> 01:39:19,360 Um I don't think we can make Sigman 2301 01:39:17,600 --> 01:39:22,920 angry, but we can definitely make him We 2302 01:39:19,360 --> 01:39:22,920 can. Oh god. 2303 01:39:23,199 --> 01:39:29,600 Wait, why do we have 2304 01:39:24,639 --> 01:39:31,920 I I think I think he's doing it live. 2305 01:39:29,600 --> 01:39:34,920 Like I think he's just programming it in 2306 01:39:31,920 --> 01:39:34,920 now. 2307 01:39:35,600 --> 01:39:41,760 I I I also have a question um for you. I 2308 01:39:40,400 --> 01:39:43,360 should have asked this question a lot 2309 01:39:41,760 --> 01:39:46,800 earlier. Have you sourced any of your 2310 01:39:43,360 --> 01:39:48,719 robot components from the tip? 2311 01:39:46,800 --> 01:39:50,800 Again, this is mostly a question for the 2312 01:39:48,719 --> 01:39:53,199 teacher in the room 2313 01:39:50,800 --> 01:39:56,159 and or a graveyard. Yeah, that's you 2314 01:39:53,199 --> 01:39:58,560 know, honestly, maybe. Yeah. 2315 01:39:56,159 --> 01:40:01,360 If you define parts of the classroom, 2316 01:39:58,560 --> 01:40:02,880 the tip. Yes. 2317 01:40:01,360 --> 01:40:06,080 Rude. 2318 01:40:02,880 --> 01:40:09,760 He's your teacher's right there. 2319 01:40:06,080 --> 01:40:13,520 My gosh. Um, okay. I look, I think we've 2320 01:40:09,760 --> 01:40:15,679 got we got we've got a few slides to say 2321 01:40:13,520 --> 01:40:17,679 thank you to everyone for coming. Uh, 2322 01:40:15,679 --> 01:40:21,080 oh, there's another qu I wasn't ignoring 2323 01:40:17,679 --> 01:40:21,080 you. You're just 2324 01:40:21,920 --> 01:40:25,760 Uh, this is a question for Evelyn. Just 2325 01:40:23,760 --> 01:40:27,520 on your musical graphing, I was 2326 01:40:25,760 --> 01:40:29,040 wondering if you had any other like 2327 01:40:27,520 --> 01:40:30,320 ambitions cuz like it's pretty cool to 2328 01:40:29,040 --> 01:40:31,920 see the bouncing, but like do you 2329 01:40:30,320 --> 01:40:35,119 imagine adding any other colors or other 2330 01:40:31,920 --> 01:40:37,360 like other modes of creation other than 2331 01:40:35,119 --> 01:40:39,760 just like the sine wave kind of shape? 2332 01:40:37,360 --> 01:40:43,360 Maybe some emoji on the Does Does this 2333 01:40:39,760 --> 01:40:45,760 work? Does this work? Oh, yeah. So, Huh? 2334 01:40:43,360 --> 01:40:49,119 Oh, I kind of mentioned it uh like 2335 01:40:45,760 --> 01:40:52,480 really briefly at the end, but um yeah, 2336 01:40:49,119 --> 01:40:55,440 since the sine wave can only like show 2337 01:40:52,480 --> 01:40:57,520 the five frequency groups, I do want to 2338 01:40:55,440 --> 01:40:59,199 change it to a different visualizer so I 2339 01:40:57,520 --> 01:41:02,639 can show the different frequency groups. 2340 01:40:59,199 --> 01:41:04,880 Colors would be nice. Um 2341 01:41:02,639 --> 01:41:08,440 yeah, so I do plan to do that. That 2342 01:41:04,880 --> 01:41:08,440 would be good. 2343 01:41:11,280 --> 01:41:16,360 Okay. Um 2344 01:41:13,360 --> 01:41:16,360 Applause.