Upwork Image Recognition

Like all other technologists, I share the dream of building something or finding a side hustle towards the goal of financial freedom. The common adage is to find problems, solve them, and the money follows. So in search of these problems, I created an Upwork account to find job listings.

Most listings were uninspiring. 90% of jobs wanted web scrapers that rotated IPs to get around banning, and others wanted to pay $5 an hour for a 10x, business revolutionizing engineer. I wanted to find a well-scoped and tractable problem to tackle and stumbled upon a request for an image recognition task.

Upwork Job

My previous experience with CV models have been primarily for classification purposes, so I thought this would be a fun opportunity to learn something new. So the provided training data consisted of single icon images like this: Emperor Image And then composite images that almost looked like a slot machine. Emperor Image

Given my rather uninitiated knowledge of object recognition, I googled the best frameworks for these problems. I landed on https://yolov8.com/ which seemed promising given its popularity in searches, and it appeared to outperform other methods while still being actively developed.

The main problem is that the sample job listing provided such few images for training. We ultimately wanted objection recognition on the screen images and then a print out of the objects list.

I was only provided 4 screen images and a handful of images with singular icons. I wanted to keep 2 images for training, 1 for validation (parameter fine-tuning), and 1 for holdout testing. So I carefully selected the 2 screen images for training that had each possible icon and took screenshots of each icon within the images. I did the same for the image in the validation set. I then used labelimg to label the images within the separate screenshots, and then also to label each icon in the holistic screen images. We initiated the model from the base yolov8s model and fine-tuned the model on the available image set. The result on the holdout test image was promising. I'm not sure of the image post-processing that made it appear more like a negative, but it worked reasonably well. Batch Validation

This was an interesting exercise in building an obviously overfit model for this specific task given the really limited training data. I initially only trained the model on the few single icons for too few epochs, and it returned nothing. However, it improved once I added the additional screenshotted icons from the screen composites. I also managed to improve performance by reducing the transformations. Typically, we want to transform the objects via rotation, reflection, etc. to prevent overwriting. But I knew additional constraints of the task such as the fact that we would never pass an upside or reflected "princess" image. It was a quick and nifty project that I can see actually being useful to know in the future.

NYC Marathon 2023

The NYC Marathon was the best consolation for not getting into Boston. I took a couple of weeks off after the race in August to give my legs and my brain a second to recover. I decided that breaking 3 hours again was the goal, but I also wanted to a chance to run without so much pressure in my hometown race. The spring is when I'll take on the ace race. An honest shift on race day was all I could ask for especially with friends and family coming to cheer!

I ended up running 3:01:03.

This was short of the goal, but I couldn't have asked for a more exhilrating race. I was overcome with waves of fatigue, inspiration, and emotion. I executed my race plan as well as I had hoped. The course is no joke, particularly the last 3 miles up 5th Ave and into Central Park. It was a party the entire time, and it's so inspiring to be out there with thousands of others. The fans make the New York Marathon. I'll never pass up the opportunity to run this race.

NYC run NYC finish

Tunnel Marathon: BQ but not quite

The journey to qualifying for Boston continues into 2024.

A better late than never recap.

In August 2023, I completed the Tunnel Vision Marathon in Snoqualmie, WA. We stayed out in Washington for an extra week after a wedding, and the course was rumored to be a BQ dream: 2000 ft of entirely downhill and cool summer running temperatures. The downhill part was accurate, but there had been a heat advisory issued with temperatures in the high 70s and 80% rH by finish time. I finished in 2:58:35 and absolutely beaming with joy going under sub-3 in my first marathon. Realistically, I had only processed this after crushing salt tablets with a cold towel under the medical tent.

The course is incredibly unique with views of the Snoqualmie mountains (ski resort in the winter), an old 2 mile railroad tunnel illuminated by runners' headlamps, and the sound of packed gravel crunching beneath your feet. It is a small race (510 marathon finishers) with only a handful of fans and park goers cheering you on. However, there is something comforting and simple about dumping your race bag on a tarp and then lining up for 26.2 miles without going through security, loading areas, or corrals of gates. What a contrast to even the smallest NYRR races in NYC. It also attracts an overwhelmingly friendly group of runners, volunteers, and fans! I couldn't recommend it enough especially if you're looking for something totally different from a large road race. Did I mention there is a large dunk tank and cake at the end of the race?

Many things learned as a first time marathoner. The old adage -- the race starts at mile 20. I don't think I've physically willed myself to do something harder than trudge the final 6 miles of the race especially after 24 mile never seemed to end (the marker went MIA). My hamstrings were locking up, and I was starting to do my signature dead runner lean to one side. I went out too hot in the first half (1:27 split) and paid for it in the second half as the heat, dehydration, and fatigue caught up. The last 4 miles were particularly painful and consisted of internal expletives. I will not forget the post-race shower and nap. Glorious!

Unfortunately, the Boston Marathon had record all-time applicants for its 2024 race. I fell victim to the cutoff. I actually wasn't even close (2:54:30ish) which made me feel better honestly. Seconds off would've killed me. So revenge race it is spring 2024.

Start Line Photo Inside the Tunnel Inside the Tunnel

Curly Icenberg

I updated my DigitalOcean droplet and consequently, this website with intention of working on a new project related to the Housing Works NYC non-profit. The organization supports the fight against AIDs and homelessness. And one of their funding sources is via an auction. The auction often has incredible items, including unique artwork, but unfortunately, there's no means of staying updated about the items unless you visit the page every day. Consequently, I wrote a scraper that emails me all the items available in the next auction. It's not a bidding bot, just an alert system. But it's fun to see what random assortment of items is available. And our empty white apartment walls could use some personality.

So, 8 months later, I've finally bid in my first auction and actually won! It is a print signed and dated from 1968 by the artist John Ulbricht. For those who know, the artwork is painfully on brand. I've named it Curly Icenberg, who is a fictional head of lettuce that I created in a deck to explain the Blend Ratio Solver project I worked on at Bowery. It's an impressive work of art, much larger and vibrant than the images led me to believe. And the little dopamine hit of winning an auction was icing on the cake.

Curly Icenberg

NYC Half Marathon, BQ Fitness Test

NYC Half Marathon

Training

I started training for the NYC Half Marathon in early December, giving myself about a 14 week block. I took about two and a half weeks easy after the Staten Island Half to let my plantar issues subside. I decided to go with Hansons Advanced Half Marathon as my training plan. It has a good variety of workouts across 6 days a week including 1 interval workout, 1 tempo workout, and 1 long run. It peaks at about 55 mi/week. A nice thing about the plan is that you don't need to worry about going too fast on recovery days because you'll need them. I found the 3x2mi workouts at 10K were probably the hardest to pace out correctly. The long tempos (7-8mi) at slightly faster than target HMP (6:30) seemed to translate best to the race. I was always concerned with my cutdown long runs because I never quite managed to go fast enough, but I always did them late in my long runs to train running on tired legs.

Race Day

The conditions for the race weren't the best, roughly 28F at start with a 12-14 mph west to east wind. But overall, I'll take the cold over the heat any day. There's a picture of me wearing throwaway khakis and a hoodie to the start line. Unclear if I was racing or going to work... The course had quite a bit of elevation across the Manhattan Bridge and the segment from the UN building to Times Square. Central Park also has rolling hill segments, especially right before the finish line. The beginning of the race was a bit chaotic having to pass alot of folks who were going a bit slower. My heart rate and pace were all over the place as I worked to keep the 1:25 pace group in sight. I banked up some time on the downhill towards the Manhattan Bridge, kept my heart rate under control over the bridge, and then banked up some more time on the downhill. I tried to make up some time on the flat portions of the FDR knowing the uphills towards the end. The FDR section was probably the hardest as there was no wind protection, and it was dead silent.

The turn on to Times Square was such a unique New York moment: the roar of the crowd, the flashing lights, and all the buildings enveloping you. Even while gasping for air, I took some moments to appreciate running over the Manhattan Bridge, the FDR sightlines to the UN and Brooklyn, and then through a closed off Times Square. For this race, I didn't take any water and barely managed to get a quarter of the UCAN out of its packaging. The cold numbed the need for water, and I would've probably choked on water and miss my goal.

My goal coming into the race was sub 1:25, and I started having my doubts with the headwind and cold. But after checking my pace band at around mile 7, I was on pace for the time! I really had to clamp down on the austere FDR segment and double down on the goal. Flip the mentality to really get after it. I locked in to chasing the pace group ahead of me and passed them with about 800m left. I managed to finish in 1:24:48. I positive split the race, but I'm happy with the time considering that I felt like I was barely hanging on starting at mile 9. This was also my first half-marathon with the Alphaflys, and I must say that I am a believer, placebo or not. Legs just turnover, and I actually think they helped leave my legs intact after the race.

What's Next:

I told myself that I would only try to BQ this year if I managed to get sub 1:25, and I was actually really nervous that I would have to deliberate if I fell short. Thankfully, there's no discussion necessary! So now I'm excited to begin the Pftiz 18/70 plan for my next training block leading to the Tunnel Vision Marathon in August. The course in Washington is a steady downhill so I should have a bit of help hitting sub-3. Looking forward to the next block but will miss the days of running in cooler weather. Until next time!