The Art Project

Can AI be used to match and classify images? Of course! They do this all the time, looking at everything from paint chips to x-rays. In today’s post, I use an established model called ResNet-50 to match and classify post-impressionist artists. For example, Braque and Picasso have a 70% similarity score.

The “cosine similarity” between Braque and Picasso is 0.70.

ResNet-50 is a convolutional neural network (CNN) introduced in 2015. Normally, we would use it as the base for image interpretation, and then add layers to learn the specific application. In this case, we are only interested in the coding system it uses, called an “embedding.”

ResNet-50 encodes each image as a list of 2,048 numbers, known as a “vector” in machine learning. This vector is not simply a way to store the image – the JPEG file already does that – but to encode whatever features the model deems useful.

For this demonstration, I collected examples from fourteen artists. To avoid complications over the choice of subject, I used self-portraits by each artist.

Experiments with CNNs show that they recognize shapes, colors, styles, and textures – everything you would expect from “machine vision.” Our model is not going to know anything about the painters, though – not who cut off an ear, or who moved to Tahiti. It’s just the pixels.

With the fourteen paintings vectorized, we can do things like compute similarity scores. For instance, Braque, Chagall, and Picasso seem to hang together. I also ran a hierarchical clustering analysis.

It’s hard to imagine what the clustering algorithm “sees” in high-dimensional space so, wherever possible, I try to reduce down to three dimensions – using principal component analysis (PCA) or UMAP. In this case, because of the small sample, a three-D chart captures 40% of the variance.

The human eye naturally finds clusters – there are Picasso, Braque, and Chagall down at the bottom, and here is Kandinsky off by himself. Also note that Cezanne, Gauguin, and Schiele are spread out along the Y axis, but together on the X axis.

Unfortunately, these axes are completely arbitrary. ResNet-50 can’t tell us if Z is the “axis of cubism,” or whatever. That’s the knock against neural net reasoning being a “black box.” We can see, though, that the PCA plot roughly agrees with the cluster analysis.

So, that was about two hundred lines of code as a proof of concept, plus some fun charts. If you were really doing this for your MFA, you would want to use many more paintings, and stash them in a vector database. For more on vector databases, see Literary Analysis with RAG.

Today’s featured image nods to a common gaffe in generative AI. Yes, Marc Chagall really did paint a “Self-Portrait with Seven Fingers.”

My JSON Resume

No, this is not my resume for JSON skills, although you might want to check out my REST Primer for F&I.

This post came out of a running dialogue, on Twitter and LinkedIn, about how to format your resume. The observation, not original with me, is that it’s silly to worry about formatting when your resume will be parsed into an Applicant Tracking System (ATS) anyway.

There should be a global resume template, and you should be able to transmit it as JSON directly into the ATS.

There is general agreement that job seekers should be able to write their resume once, and then submit it effortlessly to job listings. Yes, I know, people may shotgun their resume indiscriminately, but that’s what the ATS is for. Relying on the “friction” of resume uploads is not a great way to filter applicants.

In this post, we’ll look at the HR Open standard, JSON Resume, and LinkedIn Easy Apply.

HR Open Standards Organization

The HR Open Standards Organization is an ambitious plan to put everything HR on an API, including screening, benefits, and payroll. I signed up and acquired release 4.4 of the schema. This release includes several features of interest to recruiters, such as:

  • The Learning Employment Record (LER-RS).
  • Focus on skills and competencies, versus job titles and duties.
  • Digital verification of credentials and achievements.

The resume-like elements are in the Person Profile type, which resides in the Candidate type.

Candidate may include data that is not typically included on a Resume, such as remuneration requirements and position preferences.

You can tell that much of the work was done in XML before adding JSON in release 4.0. The schema is intended for integration among commercial HR systems, and that’s who the organizers are. So, no surprise they’re SOAP oriented.

The schema has roughly 350 high-level elements, and nests down 28 levels. My automotive readers will note the analogy with STAR. When I was at AutoNation, we developed the first XML standard for credit applications (CAF). We had the top auto lenders onboard, including Chase Auto Finance.

Chase spun off Dealertrack, which launched on CAF and later went to STAR. STAR is deep and detailed. CAF, while thorough, was quick and dirty by comparison. Similarly, where HR Open is the official industry standard, JSON Resume is the scrappy startup.

JSON Resume Ecosystem

You can tell JSON Resume is built by developers, for developers. In addition to the JSON schema, the ecosystem includes:

  • Command Line Interface (CLI)
  • Export utilities
  • Chrome extension
  • Latex rendering
  • Multiple “theme” formatters
  • Hosted registry
  • YAML, TXT, and QR Codes

This is so comprehensive that I had to laugh. My JSON resume is here. Now, I can generate it as a PDF in one of the thousand available themes. I used the included editor to develop this resume, which it automatically publishes as a Gist on my GitHub.

JSON Resume also hosts a registry. That is, it automatically generates a web page based on the JSON file. I didn’t have to lift a finger. Here is my resume online. Other great things are in prospect, like vectorizing resumes and using cosine similarity to match them with job listings.

The tools are user-friendly enough, and I’d love to see more people in the registry, but right now it seems to be mostly just developers.

LinkedIn Easy Apply

LinkedIn Easy Apply is basically a preprocessor for the client’s ATS. It does the work of parsing a PDF resume and merging it with the already-structured data in your LinkedIn profile. Then, it uses proprietary APIs to talk to Workday, Greenhouse, et al. If you’ve used it, you know the parsing is often bad.

The easiest enhancement would be to accept JSON as input, validating against the JSON Resume schema. LinkedIn could even allow users to edit their online profiles as JSON, basically cribbing the JSON Resume editor. They already have your profile in an object model, internally.

Input could also include the standard questions about race, nationality, disability, and work eligibility. While these are technically not part of the resume, they could be included as metadata in the same file. They’re already in the HR Open standard.

Agent Support for Menu Selling

As a software guy, I am always surprised to find F&I trainers doing generic menu training without attention to the specific menu system used in the dealership. There is some generic advice, which I covered in Best Practices for Menu Selling, but then your client’s next question is going to be: “How do I do that on Darwin?” Or Maxim. Or Tekion.

Controlling the menu means you control what products are on it, and how they’re presented.

Familiarity with the given menu system is even more important when you represent a provider or agent. Now, you’re not only training how to sell product, but to sell your product. As I told my boss at Safe-Guard, “you can put a gun to the guy’s head but if your product isn’t on the menu, he’s not selling it.”

And we have seen exactly this. “We don’t sell your coverage because it’s a lease deal.” Because it’s preowned. Because it’s highline. By “we,” I mean Safe-Guard’s ace menu trainer, Michele McMinn, and the menu support team we put together. Double your penetration with this one weird trick…

The easiest way to do this is to pay for the dealer’s menu system. Then, your trainers only have to be experts in one system, and you have a hotline to their tech support department.

Controlling the menu means you control what products are on it, and how they’re presented. If your dealer base is too diverse for that, then you will have to develop F&I trainers who are expert in all of them.

Setting Up the Menu Support Team

You also have to make sure your products are compatible with certain standards used by PEN and the menu-system community. If this is news to you, you’re not alone. Even in the year 2025, I still find providers and agents who think their product is a piece of paper.

Just because the art department added a checkbox for “Rebate” or “Sagittarius,” doesn’t mean that checkbox is going anywhere unless you know a little something about the PEN interface standards. Here’s what a good menu support team looks like:

  • Trainers who are rated on more than one menu system, in addition to generic F&I training.
  • Dedicated support, so the trainers can reach someone while they’re in the dealership. This is key. The menu support desk also looks for recurring issues and develops a knowledge base.
  • Tech people who can run tools like Postman and XML Spy and, ideally, get involved with coding on your menu-system API (the interface that PEN uses).

At Safe-Guard, I went so far as to hire a Product Manager to own the API and to liaise with PEN and the menu-system community.

Designing menu-friendly products starts at the very beginning, when the coverage product manager meets with my product manager. Let’s say you want to offer Tire, Key, and Dent on the same form. Do you want all seven possible combinations? What about the “cosmetic” upcharge?

It’s not enough to have the right boxes on the form. You need to think about how the product will flow through PEN, and how it will look on Darwin. And Maxim. And Tekion.

It’s not enough to have the right boxes on the form. You need to think about how it will look on Darwin.

You can see how this is a team effort. If your product is making the menu choke, support needs to run that issue back to the programmers. If your trainer isn’t rated on that menu, she shouldn’t be in that store.

By the way, you should keep track of which DMS, which menu, and which sales process is used in each store. Keep track of those, along with the training sessions, after-action reports, and your (rapidly improving) penetration scores.

When Michele and I started playing this game at a high level, we discovered we were competing with JM&A. That was it. Everyone else was unarmed.

Notes on GenAI

Generative AI isn’t really my thing. To me, AI means machine learning for quantitative applications, like predictive analytics. Nonetheless, people seem to be having fun over here, so I thought I’d give it a try. Here are some notes from Project Avatar.

Tools in this space overlap a lot. Synthesia, for instance, aims to be one-stop shopping for training videos and the like. The video tools overlap with the image generation tools, while others, like Eleven Labs, have carved out niches where they’re best in class.

Create Your Avatar

With HeyGen, I was able to create custom avatars from photos, video, and generated images. It also features prefab avatars, based on their own actors. For a training video, you can choose from a wide variety of these. If you want to be differentiated, however, you will need to create a custom avatar.

I know of one company that simply adopted “Ada” from Synthesia, and made her the face of their application. Ada is a very popular avatar, so – no differentiation. With Synthesia, you can create custom avatars from video, but not photos.

Avatars from Still Images

Video avatars are generally more expressive, so why would you want to create one from still images? I can think of two reasons. First, making a good video avatar is a lot of work, and you need a model. I did one of myself, and it looks like hell.

Second, you might want to create a completely unique persona – to specifications – that you control. This is how I created Hadley, and here is where it gets interesting. Midjourney has a character reference flag so that, once you have the face you want, it can reliably reproduce her in different settings.

Close shot of a 52-year-old man, strong-looking, bald, square jaw with short beard, captured with a 70-200mm f/2.8E FL ED VR lens, with high-key lighting and a shallow depth of field.

Stability AI is arguably better at images but, without the cref feature, it is useless for this application. On the other hand, while Midjourney is great at creffing AI images, it won’t do photos. The image of me in Project Avatar is from HeyGen.

After training on a dozen recent photos, HeyGen can reproduce my likeness accurately about 25% of the time. These are called “looks.” So, “Mark seated in library wearing a dress shirt” is a look. I also did a video avatar, which included cloning my voice.

Synthetic Voice

Eleven Labs has a wide array of professional voices, plus you can clone your own voice. You can generate audio in Eleven Labs, and then upload it to HeyGen for animation. If you’re working from a script, you can paste the script into HeyGen and then link to voices in Eleven Labs using its API. HeyGen also has its own voice library.

Please write a short, motivational speech, roughly 75 words in length, on how to navigate life transitions. Include a narrative hook at the outset, and a punchy conclusion that recaps the hook.

Both systems are a little bit robotic when reading a script. There are some things you can do with the script to improve this. To get the best pacing and intonation, you might want to read the script yourself, and then use speech-to-speech conversion. This, unfortunately, will gum up your automation.

Automate Your Workflow

If you’re doing this at scale, you can’t be the one reading the scripts. This energetic bot is Jordan from LipDub. You can imagine the pace at which he is pumping out these ad spots. LipDub and Akool are both more expressive than HeyGen but, again, you need a live model.

All these tools are richly supplied with APIs so, if you are a non-coder, you can easily string together a workflow using Make (formerly Integromat). Here is my draft workflow for the Bruno channel:

  1. Call ChatGPT to generate topic and prompt
  2. Call Powerful Thinking to generate script
  3. Pass script to Eleven Labs and call TTS to generate audio
  4. Pass audio to HeyGen, selecting Bruno avatar by ID
  5. Optional: generate new “look” for Bruno
  6. Add captions
  7. Post to Instagram reel using Meta API

By “richly,” I mean that HeyGen wants $100 per month for their API – on top of the monthly Creator subscription. CapCut doesn’t have an API, but JSON2Video does. Also, there are libraries in Python that will do captions. Bold captions add a nice touch.

Step two of the workflow calls my custom GPT, Powerful Thinking. This, unfortunately, does not yet have API support, so I was reduced to using Selenium.

Write the Script

Scripts are the easiest thing in the world to generate, and the LLMs (apart from Powerful Thinking) are equipped with APIs. You can give them specific instructions, and they’ll even do product research for you.

I am a ChatGPT guy, myself (the other camp is the Claude people) and I have also used Google’s Notebook LM. Hadley’s libertarian scripts, I write myself.

One last caveat: GenAI is a rapidly-evolving space. Synthesia had it to itself for a while, and now there is a raft of new entrants. Eleven Labs faces competition from Murf and Speechify. I am on a list for the LipDub beta. If you want to work in this space, you must be ready to learn a new tool every week.