
This vessel does not exist.
The history of ceramics is one of imitation and reproduction.
The apprentice obtains mastery of the craft through repetition, gradually improving their technique. Guided by a lifetime of working in the craft, the master examines each piece made by the student and throws away those deemed unsuitable.
The forger creates replicas and tests them in the marketplace. The connoisseur, informed by decades of experience dealing with antiques, judges the replicas. Those that are mistaken as authentic are sold, and the forger goes on to create even more convincing copies.
New Brooklyn Museum Website
The new Brooklyn Museum website represents a complete digital transformation, showcasing the museum's collections through modern web technology. Built with TypeScript, Next.js, and Sanity CMS, its powerful Elasticsearch system enables visitors to discover connections across all museum content.
https://brooklynmuseum.org/
Written in TypeScript and built on Sanity CMS, Elasticsearch and Next.js with internationalization and server-side rendering, the new brooklynmuseum.org features a powerful Elasticsearch-based search system consisting of a sync API and a search API. The sync API ingests data from multiple sources—Sanity CMS, OpenCollection database, and ArchivesSpace—transforming diverse content into a unified search format. The search API provides robust query capabilities with full-text search, faceted filtering, term highlighting, and search-as-you-type functionality, enabling visitors to discover connections across the museum's collections, exhibitions, and events.
Designed by garden3d and Brooklyn Museum designers including Eric Price. Frontend by Sanctuary Computer. I was responsible for backend architecture and implemented the Search ETL & engine.
Screenshots of the homepage and Collection search.
Various global and content type-specific facets are available to search.
The Brooklyn Artists Exhibition Interactive
"The Brooklyn Artists Exhibition" showcases over 200 diverse artists, kicking off the Brooklyn Museum's 200th anniversary. For this exhibition, I worked with Graphic Design to build an interactive website that allows visitors to explore the exhibition.
https://tbae.brooklynmuseum.org/
"The Brooklyn Artists Exhibition" showcases over 200 diverse artists who have lived or worked in Brooklyn, celebrating the borough's vibrant creative community and kicking off the Brooklyn Museum's 200th anniversary.
Due to the number of artworks and salon-style installation, it was impractical to display physical labels next to each artwork. Instead, I worked with Graphic Design, in particular the wonderful designer Eric Price, to build an interactive website that allows visitors to virtually explore artworks, navigate galleries, and discover artist information through an accessible, user-friendly interface built with modern web technologies.
The site was built with Next.js, Tailwind CSS, shadcn UI components and Embla carousel, offering a static build for optimal performance. Label content is managed by Exhibition designers in a Google Spreadsheet, using a Google Apps Script to export a JSON file. This JSON is then used directly in the application as the data source. Fuzzy, typo-tolerant search is enabled by Fuse.js.
This site is very much a pilot project, and hopefully future versions will rely on the Brooklyn Museum CMS as a data source.
Screenshot of the gallery view showing artwork thumbnails and label information.
Screenshot of the detail view showing artwork image and full label information.
The website displayed on a device mounted in the in-gallery display stands.
AWS SAM vs Vercel for an API
Comparing AWS SAM with Vercel Functions for deploying an API.
Let's compare deploying an API with AWS SAM vs Vercel.
Diagram of AWS SAM deployment (left) and Vercel Functions (right)
AWS SAM Attempt
Recently I set up a couple deployments using AWS Serverless Application Model (SAM) and to my chagrin it was as painful as I remembered it. My first problem was that, like any security-conscious developer I wanted to follow the principle of least privilege, running the deployment as a user with limited permissions. After many failed attempts, I finally created an IAM policy that included just the permissions I required, but it still felt very permissive and ran to 200 lines:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "ReadOnlyPermissions", "Effect": "Allow", "Action": [ "lambda:GetAccountSettings", "lambda:GetEventSourceMapping", "lambda:GetFunction", "lambda:GetFunctionConfiguration", "lambda:GetFunctionCodeSigningConfig", "lambda:GetFunctionConcurrency", "lambda:ListEventSourceMappings", "lambda:ListFunctions", "lambda:ListTags", "iam:ListRoles" ], "Resource": "*" }, { "Sid": "DevelopFunctions", "Effect": "Allow", "NotAction": ["lambda:PutFunctionConcurrency"], "Resource": "arn:aws:lambda:*:*:function:website-*" }, { "Sid": "DevelopEventSourceMappings", "Effect": "Allow", "Action": [ "lambda:DeleteEventSourceMapping", "lambda:UpdateEventSourceMapping", "lambda:CreateEventSourceMapping" ], "Resource": "*", "Condition": { "StringLike": { "lambda:FunctionArn": "arn:aws:lambda:*:*:function:website-*" } } }, { "Sid": "PassExecutionRole", "Effect": "Allow", "Action": [ "iam:AttachRolePolicy", "iam:CreateRole", "iam:ListRolePolicies", "iam:ListAttachedRolePolicies", "iam:GetRole", "iam:GetRolePolicy", "iam:PassRole", "iam:PutRolePolicy", "iam:SimulatePrincipalPolicy", "iam:TagRole", "iam:DetachRolePolicy", "iam:DeleteRolePolicy", "iam:DeleteRole" ], "Resource": ["arn:aws:iam::*:role/website-*", "arn:aws:iam::*:policy/website-*"] }, { "Sid": "ViewLogs", "Effect": "Allow", "Action": ["logs:*"], "Resource": "arn:aws:logs:*:*:log-group:/aws/lambda/website-*" }, { "Sid": "CodeDeployPermissions", "Effect": "Allow", "Action": [ "codedeploy:CreateApplication", "codedeploy:DeleteApplication", "codedeploy:RegisterApplicationRevision", "codedeploy:GetApplicationRevision", "codedeploy:GetApplication", "codedeploy:GetDeploymentGroup", "codedeploy:CreateDeploymentGroup", "codedeploy:DeleteDeploymentGroup", "codedeploy:CreateDeploymentConfig", "codedeploy:GetDeployment", "codedeploy:GetDeploymentConfig", "codedeploy:RegisterOnPremisesInstance", "codedeploy:ListApplications", "codedeploy:ListDeploymentConfigs", "codedeploy:ListDeploymentGroups", "codedeploy:ListDeployments" ], "Resource": "*" }, { "Sid": "CloudFormationPermissions", "Effect": "Allow", "Action": [ "cloudformation:CreateChangeSet", "cloudformation:CreateStack", "cloudformation:DeleteChangeSet", "cloudformation:DeleteStack", "cloudformation:DescribeChangeSet", "cloudformation:DescribeStackEvents", "cloudformation:DescribeStackResource", "cloudformation:DescribeStackResources", "cloudformation:DescribeStacks", "cloudformation:ExecuteChangeSet", "cloudformation:GetTemplateSummary", "cloudformation:ListStackResources", "cloudformation:SetStackPolicy", "cloudformation:UpdateStack", "cloudformation:UpdateTerminationProtection", "cloudformation:GetTemplate", "cloudformation:ValidateTemplate" ], "Resource": [ "arn:aws:cloudformation:*:*:stack/website-*/*", "arn:aws:cloudformation:*:*:transform/Serverless-2016-10-31" ] }, { "Sid": "S3Permissions", "Effect": "Allow", "Action": [ "s3:CreateBucket", "s3:PutEncryptionConfiguration", "s3:ListBucket", "s3:GetObject", "s3:PutObject", "s3:DeleteObject", "s3:GetBucketLocation", "s3:ListAllMyBuckets", "s3:GetBucketLogging", "s3:PutBucketLogging" ], "Resource": ["arn:aws:s3:::website-*", "arn:aws:s3:::website-*/*"] }, { "Sid": "S3ReadPermissions", "Effect": "Allow", "Action": ["s3:GetBucketLocation", "s3:ListAllMyBuckets"], "Resource": "*" }, { "Sid": "ApiGatewayPermissions", "Effect": "Allow", "Action": [ "apigateway:GET", "apigateway:POST", "apigateway:PUT", "apigateway:DELETE", "apigateway:PATCH" ], "Resource": [ "arn:aws:apigateway:*::/restapis", "arn:aws:apigateway:*::/restapis/*", "arn:aws:apigateway:*::/tags/*" ] }, { "Sid": "AllowResourcePolicyUpdates", "Effect": "Allow", "Action": ["apigateway:UpdateRestApiPolicy"], "Resource": ["arn:aws:apigateway:*::/restapis/*"] }, { "Sid": "CloudFrontPermissions", "Effect": "Allow", "Action": [ "cloudfront:CreateDistribution", "cloudfront:GetDistribution", "cloudfront:UpdateDistribution", "cloudfront:DeleteDistribution", "cloudfront:ListDistributions", "cloudfront:TagResource", "cloudfront:UntagResource", "cloudfront:ListTagsForResource" ], "Resource": "*" }, { "Sid": "EventBridgePermissions", "Effect": "Allow", "Action": [ "events:PutRule", "events:DescribeRule", "events:DeleteRule", "events:PutTargets", "events:RemoveTargets" ], "Resource": "arn:aws:events:*:*:rule/website-*" } ] }
Next up were the SAM templates, a bit of a pain passing environment variables via samconfig, a lot of !Refs pointing things in the right direction, unclear AWS documentation, not fun to debug at all, and the final template also requiring 200 lines (template.yaml):
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Parameters: StageName: Type: String Default: dev AllowedValues: - dev - qa - prod AcmCertificateArn: Type: String ElasticUseCloud: Type: String Description: Use Elastic Cloud ElasticLocalNode: Type: String Description: Local Node ElasticCloudId: Type: String Description: Elastic Cloud Id ElasticCloudUsername: Type: String Description: Elastic Cloud Username ElasticCloudPassword: Type: String Description: Elastic Cloud Password ElasticIndexName: Type: String Description: Elastic Index Name Highlight: Type: String Description: Highlight Default: true HighlightPreTag: Type: String Description: Highlight Pre Tag Default: <strong> HighlightPostTag: Type: String Description: Highlight Post Tag Default: </strong> DefaultPageSize: Type: String Description: Default Page Size Default: 24 MaxPageSize: Type: String Description: Max Page Size Default: 100 DefaultOptionsSize: Type: String Description: Default Options Size Default: 20 Globals: Function: Tags: Project: 'website-sam-search-api' Stage: !Ref StageName Resources: ApiGatewayApi: Type: AWS::Serverless::Api Properties: StageName: !Ref StageName Cors: AllowMethods: "'GET,OPTIONS'" AllowHeaders: "'Content-Type,Authorization'" AllowOrigin: "'*'" WebsiteSearchApi: Type: AWS::Serverless::Function Properties: FunctionName: !Sub 'website-sam-search-api-${StageName}' Handler: dist/index.handler Runtime: nodejs20.x Timeout: 5 Role: !GetAtt WebsiteSearchApiRole.Arn Events: Search: Type: Api Properties: RestApiId: !Ref ApiGatewayApi Path: /search Method: get Options: Type: Api Properties: RestApiId: !Ref ApiGatewayApi Path: /options Method: get SearchAsYouType: Type: Api Properties: RestApiId: !Ref ApiGatewayApi Path: /searchAsYouType Method: get HealthCheck: Type: Api Properties: RestApiId: !Ref ApiGatewayApi Path: /healthcheck Method: get Root: Type: Api Properties: RestApiId: !Ref ApiGatewayApi Path: / Method: get Environment: Variables: ELASTIC_USE_CLOUD: !Ref ElasticUseCloud ELASTIC_LOCAL_NODE: !Ref ElasticLocalNode ELASTIC_CLOUD_ID: !Ref ElasticCloudId ELASTIC_CLOUD_USERNAME: !Ref ElasticCloudUsername ELASTIC_CLOUD_PASSWORD: !Ref ElasticCloudPassword ELASTIC_INDEX_NAME: !Ref ElasticIndexName HIGHLIGHT: !Ref Highlight HIGHLIGHT_PRE_TAG: !Ref HighlightPreTag HIGHLIGHT_POST_TAG: !Ref HighlightPostTag DEFAULT_PAGE_SIZE: !Ref DefaultPageSize MAX_PAGE_SIZE: !Ref MaxPageSize DEFAULT_OPTIONS_SIZE: !Ref DefaultOptionsSize Metadata: BuildMethod: esbuild BuildProperties: Minify: true Target: 'es2020' Sourcemap: true EntryPoints: - src/index.ts WebsiteSearchApiRole: Type: AWS::IAM::Role Properties: RoleName: !Sub 'website-sam-search-api-${StageName}-role' AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: - lambda.amazonaws.com Action: - 'sts:AssumeRole' Policies: - PolicyName: !Sub 'website-sam-search-api-${StageName}-policy' PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - 'logs:CreateLogGroup' - 'logs:CreateLogStream' - 'logs:PutLogEvents' Resource: 'arn:aws:logs:*:*:*' CloudFrontDistribution: Type: AWS::CloudFront::Distribution Properties: DistributionConfig: Enabled: true HttpVersion: http2 DefaultCacheBehavior: ViewerProtocolPolicy: redirect-to-https AllowedMethods: - GET - HEAD - OPTIONS CachedMethods: - GET - HEAD - OPTIONS TargetOriginId: ApiGatewayOrigin ForwardedValues: QueryString: true Headers: - Origin - Access-Control-Request-Headers - Access-Control-Request-Method - Authorization - Content-Type Cookies: Forward: all Origins: - Id: ApiGatewayOrigin DomainName: !Sub '${ApiGatewayApi}.execute-api.${AWS::Region}.amazonaws.com' OriginPath: !Sub '/${StageName}' CustomOriginConfig: HTTPPort: 80 HTTPSPort: 443 OriginProtocolPolicy: match-viewer DefaultRootObject: index.html Aliases: - !Sub 'search-${StageName}.yourwebsite.com' ViewerCertificate: AcmCertificateArn: !Ref AcmCertificateArn MinimumProtocolVersion: TLSv1.2_2021 SslSupportMethod: sni-only Outputs: CloudFrontDistributionDomainName: Value: !GetAtt CloudFrontDistribution.DomainName
During this process I had quite a few CloudFormation stacks caught in bad rollback states. Frustratingly, I couldn’t figure out how to use a “fixed” CloudFront distribution. If I deleted a stack and re-ran the deploy, a new CloudFront distribution with a new ID would be created, requiring me to update the DNS CNAME to point to the new distribution.
Local development was painful, I couldn’t find a way to run sam locally with a watch/hot reloading option (see this old Github issue), so I had to manually run the build each change.
My biggest gripe is that I just don’t like the feeling of running the deploy, knowing all these AWS resources are being created everywhere… It all just feels too complex and fragile. I’m sure there’s a better, simpler way to deploy an API via AWS (maybe even using Amplify?), but by the time I finally had these 400 lines working I started reconsidering everything.
Enter Vercel
Yeah, we all know Vercel costs more, but look at how easy this is (vercel.json):
{ "framework": null, "installCommand": null, "buildCommand": "", "outputDirectory": "public", "cleanUrls": true, "trailingSlash": false, "headers": [ { "source": "/api/(.*)", "headers": [ { "key": "Access-Control-Allow-Origin", "value": "*" }, { "key": "Access-Control-Allow-Methods", "value": "GET, OPTIONS" }, { "key": "Content-Type", "value": "application/json" } ] } ] }
The above sets up Vercel Serverless Functions with appropriate headers, providing similar functionality to the SAM template above.
Need to deploy a function that you only want to run on a schedule on the cron? Secure your function using CRON_SECRET and schedule it with just a couple lines of code (vercel.json):
{ "framework": null, "installCommand": null, "buildCommand": "", "outputDirectory": "public", "cleanUrls": true, "trailingSlash": false, "functions": { "api/cron/sync.ts": { "memory": 3009, "maxDuration": 300 } }, "crons": [ { "path": "/api/cron/sync?type=collections&period=hour&quantity=2", "schedule": "0 * * * *" }, { "path": "/api/cron/sync?type=web&period=hour&quantity=2", "schedule": "30 * * * *" } ] }
Each function itself is defined in a file in the /api directory, for example this is the search endpoint (/api/search.ts):
import { search } from '../lib/search/search'; import type { ApiSearchResponse } from '../types'; import type { VercelRequest, VercelResponse } from '@vercel/node'; export default async function handler(req: VercelRequest, res: VercelResponse): Promise<any> { try { const result: ApiSearchResponse = await search(req.query); return res.status(200).json(result); } catch (error) { return res.status(500).json({ error: 'Internal server error' }); } }
The Vercel deployment isn’t supremely configurable like the AWS SAM one, and it’s missing some features like rate limiting via a WAF (although Vercel has basic DDoS Mitigation and there’s a hack for rate-limiting using Vercel KV). But Vercel makes everything soooo easy, not only the configuration but also connecting environment variables and git branches to deployments, not to mention basic logging & monitoring.
For me, Vercel’s the clear winner here. I work in an organization that can barely afford developers, let alone devops, and I feel the lower cost of AWS must be balanced against the excellent DX, simplicity, and elegance of the Vercel deployment.
gettfully
A simple, fast, powerful, and easy to use search interface for the Getty Vocabularies powered by Elasticsearch and Next.js.
Website: https://getty.musefully.org
Github: https://github.com/derekphilipau/gettfully
This open source project provides a simple, fast, powerful, and easy to use search interface for the Getty Vocabularies. It’s powered by Elasticsearch and Next.js.
Screenshots of gettfully UI showing fuzzy search (misspellings) and filtered search, e.g. “Female artists born in Brooklyn.”
This project uses the Getty Relational Table formats (available in Downloads links below). The relational data exports seem to be more consistently updated than the XML exports. Relational data files are imported into Elasticsearch using the Elasticsearch Bulk API. Each vocabulary is represented by a separate Elasticsearch index, e.g. `ulan-subjects`, `aat-subjects`, etc.
Getty Vocabularies
The Getty Vocabularies contain structured terminology for art, architecture, decorative arts and other material culture, archival materials, visual surrogates, and bibliographic materials. Compliant with international standards, they provide authoritative information for catalogers, researchers, and data providers.
The Getty Union List of Artist Names (ULAN)
The Union List of Artist Names ® (ULAN) contains information about people and corporate bodies related to the creation and maintenance of art and architecture. It includes names, rich relationships, notes, sources, and biographical information for artists, architects, firms, studios, repositories, and patrons, both named and anonymous.
ULAN Online Search ULAN REL Data Dictionary ULAN Downloads
The Getty Art & Architecture Thesaurus (AAT)
AAT is a thesaurus containing generic terms in several languages, relationships, sources, and scope notes for agents, work types, roles, materials, styles, cultures, and techniques related to art, architecture, and other cultural heritage (e.g., amphora, oil paint, olieverf, acetolysis, sintering, orthographic drawings, Olmeca, Rinascimento, Buddhism, watercolors, asa-no-ha-toji, sralais).
Beyond eMuseum and Search Silos
Move past the limitations of specialized, siloed collections applications like eMuseum with a unified, faceted, powerful search solution that unites all of a museum’s content.
Gallery Systems is a major player in the museum sector, especially known for its TMS (The Museum System) collection management software. Their eMuseum platform enables museums to publish their collections online, accessible through a website and API.
Any tool that enables museums to publish their collections online is beneficial, but specialized web applications like eMuseum lead to fragmented search experiences. Visitors encounter multiple search silos – for the website, collections, libraries, archives, shop, and even job listings. Ideally, users should be able to enter a query like “Picasso” and get results encompassing events, exhibitions, web pages, retail items, educational resources, collection artworks, archival documents and everything else related to Pablo Picasso.
Specialized, siloed search applications segregate content and duplicate functionality.
To mitigate this issue, some sites index simplified collection metadata in their basic website search. However, this approach often overlooks the complex nuances of collection metadata and misses out on opportunities to reveal common search facets across different content types. Curious visitors and researchers often hit a wall in these simplified searches and are driven off to 'advanced' search silos.
I propose a solution demonstrated by musefully.org (available on Github), which is a universal faceted search API encompassing all content within a museum's domain. This involves ETL (Extract, Transform, Load) pipelines extracting data from diverse sources such as collections, websites, libraries, archives, and third-party databases. This data then feeds into a search engine like Elasticsearch, which powers a comprehensive search API, making all content readily discoverable.
Diagram of Universal Search ETL ingest process with optional semantic search functionality. Click for larger image.
Search engines like Elasticsearch are extremely powerful, and when coupled with front-end platforms like Next.js, it becomes relatively straightforward to develop such a system:
Extract datasources. Use SQL scripts or an ORM (Object-Relational Mapping) to efficiently export public data from collections and other databases into accessible text formats like CSV.
Transform the data by normalizing it to align with universal search fields and facets, ensuring consistency and improved discoverability across diverse datasets.
Vectorize (optional). Create embeddings for textual or visual content using tools like OpenAI's CLIP (see results here using artwork images) or Ada v2, enabling semantic search with nuanced, context-aware matching based on the content's deeper characteristics and relationships.
Load transformed data into Elasticsearch index/indices.
Now that all content is in a single search engine, advanced search capabilities with Elasticsearch DSL including vector search are unlocked to enable unified search across all content.
This type of design can take many forms depending upon the unique needs of an organization. For the Brooklyn Museum Search API, the entire ETL and search system is deployed in a Next.js application:
System design for Brooklyn Museum search.
Hiroshige with AI Generated Music
Music for Hiroshige woodblock prints generated by M2UGen, an AI model that is capable of music generation from texts, images, videos and audio.
Music for Hiroshige woodblock prints generated by M2UGen, “a Music Understanding and Generation model that is capable of Music Question Answering and also Music Generation from texts, images, videos and audios, as well as Music Editing.”
Audio generated with demo, using the woodcut images with the prompt in the paper, "Generate a music for this scene." Settings: temperature = 0.6, top p = 0.8 (as in the paper)
Woodblock prints by Utagawa Hiroshige (Ando) courtesy Brooklyn Museum:
Suruga-cho, No. 8 in One Hundred Famous Views of Edo
Asuma Shrine and the Entwined Camphor, No. 31 in One Hundred Famous Views of Edo
Temple Gardens, Nippori, No. 14 in One Hundred Famous Views of Edo
Flower Pavilion, Dango Slope, Sendagi, No. 16 in One Hundred Famous Views of Edo
New Fuji, Meguro, No. 24 in One Hundred Famous Views of Edo
The Kawaguchi Ferry and Zenkoji Temple, No. 20 in One Hundred Famous Views of Edo
“Accessible Art Tags” GPT
Upload an artwork image (optionally adding details like title & artist) to generate alt text and long descriptions following Cooper Hewitt guidelines.
Using OpenAI’s GPTs, I’ve created a specialized GPT that generates alt text and long descriptions following Cooper Hewitt Guidelines for Image Description.
GPT Store Links:
Accessible Art Tags version 0.2
Accessible Art Tags version 0.1 (old)
The “knowledge” (uploaded files) for the GPT are a PDF of the Cooper Hewitt Guidelines for Image Description, ABS's Guidelines for Verbal Description, and Diagram Center Specific Guidelines: Art, Photos & Cartoons.
The GPT prompt was created by asking ChatGPT to create and refine a prompt using the Cooper Hewitt Guidelines. Possible improvements could include custom-tailoring to an organizations own guidelines, and providing more “knowledge” in the form of examples.
Screenshots of the GPT generating alt text and long descriptions for a variety of artworks.
Version 0.2 (Jan 10, 2024)
I’m not convinced this version is any better than the first version.
Accessible Art AI is a world-renowned art historian and accessibility expert specializing in generating two distinct, objective texts for each image, ALT TEXT and LONG DESCRIPTION, that adhere to general principles of inclusivity and accessibility, tailored for diverse audiences, including those using assistive technologies. These texts precisely adhere to the following guidelines: 1. ALT TEXT: Formulate a concise, essential summary of the image, approximately 15 words in length. Present it as a sentence fragment (or a complete sentence if necessary) without a period at the end, focusing on conveying the image's most critical content. 2. LONG DESCRIPTION: Provide a detailed visual description of the image, the length of which depends on its complexity. This description should be composed in complete sentences, beginning with the most significant aspect of the image and progressively detailing additional elements, ensuring logical and spatial coherence throughout. General Recommendations: - Avoid Redundancy: Refrain from repeating information already present in captions or accessible descriptions. Do not repeat artist name, date, or other details that are already in the title or metadata. Enhance or clarify existing information as needed. - Clarity and Simplicity: Use straightforward language, avoiding technical terms unless necessary. If technical terms are used, they should be clearly explained. - Text Transcription: Include any text that appears within the image, quoting it exactly as it appears. Core Aspects: - Subject: Prioritize the most prominent or noticeable element of the image. - Size: Describe the relative sizes of elements within the image, comparing them to known objects or the human body. - Color: Use common names for colors, with explanations for specialized terms if necessary. - Orientation and Relationships: Detail the arrangement and relationships of elements within the image, including their orientation relative to the viewer. - Medium and Style: Identify and describe the material, medium, or artistic style of the image, emphasizing its significance to the image’s understanding. - People Description: Include details on physical appearance, age, gender (using neutral terms if gender is uncertain), ethnicity, and skin tone (employing non-specific terms or emoji scales). Recognize and describe identifiable individuals. Enhancing Descriptions: - Alternative Senses: Use descriptions that engage senses beyond sight, such as touch, scent, sound, and taste. - Reenactment and Embodiment: Utilize descriptions that evoke a sense of physicality or position within the image. - Metaphorical Language: Apply metaphors to enhance the comprehension of material qualities and the content of the image. - Narrative Structure: Use storytelling techniques in long descriptions to gradually unveil the details of the image. - Avoid Subjective Interpretation: Strictly avoid subjective interpretations, symbolic meanings, or attributing intent to the artwork. Do not make conjectures about the meaning of the artwork. Do not guess the feelings of people or beings represented. Do not make any assumptions that cannot be strictly inferred from the artwork image itself. Do not make value judgements about the work, e.g. "a fine example". Do not guess how an artwork may have been perceived by a viewer. For data visualizations such as graphs, maps, and tables, the description should focus on accurately conveying the data and relationships presented, in a manner that is understandable without visual reference. This involves breaking down complex data into comprehensible descriptions that capture the essence and key points of the visualization. These guidelines are designed to be adaptive, evolving with changes in societal contexts and dialogues, ensuring continued relevance and inclusivity. Remember that if you do not produce two texts, ALT TEXT and LONG DESCRIPTION, that adhere to the length and other requirements listed above, you will fail at your job. For example, unless the artist name or date is actually written in the image, they should not be mentioned If no image is uploaded, respond "Please upload an artwork image (optionally adding details like title & artist) to generate alt text and long descriptions following Cooper Hewitt accessibility guidelines."
Version 0.1 (Dec 30)
The prompt (updated Dec 30 to be clearer, reduce interpretation, and eliminate mentioning metadata like artist/year):
Accessible Art AI is an art historian and accessibility expert specializing in generating two distinct, objective texts for each image: ALT TEXT and LONG DESCRIPTION. These texts adhere to the following combined guidelines: COMMON GUIDELINES FOR BOTH ALT TEXT AND LONG DESCRIPTION: The texts must adhere to accessibility guidelines, ensuring the description is inclusive and provides an equitable digital experience for all users, including those with disabilities. Do NOT mention the artist name, and creation date, or other artwork metadata. ONLY describe the image. Start with the most important element of the image. Exclude repetitive information. Avoid phrases like "image of", "photo of", unless the medium is crucial. Avoid jargon and explain specialized terms. Transcribe any text within the image. Describe elements in a logical spatial order, usually top to bottom, left to right. Use familiar color terms and clarify specialized color names. Depict orientation and relationship of elements, maintaining a consistent point of view. Describe people objectively, avoiding assumptions about gender or identity. Use neutral language and non-ethnic terms for skin tone. Focus on sensory details and embodiment without interpreting the image. For infographics, prioritize the clarity of crucial information. Strictly avoid interpretations, symbolic meanings, or attributing intent to the artwork. SPECIFIC GUIDELINES FOR ALT TEXT: Be concise, aiming for around fifteen words, and forming a complete sentence only if necessary. SPECIFIC GUIDELINES FOR LONG DESCRIPTION: Long descriptions can be anywhere from a couple of sentences to a paragraph, written in complete sentences. Use a narrative structure for a gradual, exploratory reveal of elements, maintaining spatial order. Provide detailed, factual visual information. Focus on physical attributes and composition.
Using the GPT Vision API
You can adapt this prompt and use the OpenAI GPT Vision API. Below is basic usage in typescript.
In my tests with 300px images, Vision API costs were approximately $0.0166 per request, so the cost for 100 images is about $1.66 and the cost for 100,000 images is $1,660.
Since collection metadata imported into Musefully doesn’t really contain actual descriptions of the artworks, my plan is to generate embeddings using these ML-generated descriptions for semantic search in Elasticsearch. Calls to the embeddings API (like Ada v2) is significantly cheaper than Vision.
export async function getMLDescriptionFromImage( imageUrl: string ): Promise<MLDescription | undefined> { if (!imageUrl || !process.env.OPENAI_API_KEY) return; const promptText = `As an art historian and accessibility expert, generate two distinct texts: ALT TEXT and LONG DESCRIPTION. The texts must adhere to accessibility guidelines, ensuring the description is inclusive and provides an equitable digital experience for all users, including those with disabilities. Do NOT mention the artist name, and creation date, or other artwork metadata. ONLY describe the image. Start with the most important element of the image. Exclude repetitive information. Avoid phrases like "image of", "photo of", unless the medium is crucial. Avoid jargon and explain specialized terms. Transcribe any text within the image. Describe elements in a logical spatial order, usually top to bottom, left to right. Use familiar color terms and clarify specialized color names. Depict orientation and relationship of elements, maintaining a consistent point of view. Describe people objectively, avoiding assumptions about gender or identity. Use neutral language and non-ethnic terms for skin tone. Focus on sensory details and embodiment without interpreting the image. For infographics, prioritize the clarity of crucial information. Strictly avoid interpretations, symbolic meanings, or attributing intent to the artwork. SPECIFIC GUIDELINES FOR ALT TEXT: Be concise, aiming for around fifteen words, and forming a complete sentence only if necessary. SPECIFIC GUIDELINES FOR LONG DESCRIPTION: Long descriptions can be anywhere from a couple of sentences to a paragraph, written in complete sentences. Use a narrative structure for a gradual, exploratory reveal of elements, maintaining spatial order. Provide detailed, factual visual information. Focus on physical attributes and composition.`; const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY, }); try { const params: OpenAI.Chat.ChatCompletionCreateParams = { messages: [ { role: 'user', content: [ { type: 'text', text: promptText, }, { type: 'image_url', image_url: { url: imageUrl, }, }, ], }, ], max_tokens: MAX_TOKENS, model: OPENAI_VISION_MODEL, }; const chatCompletion: OpenAI.Chat.ChatCompletion = await openai.chat.completions.create(params); if (chatCompletion?.usage) { console.log(chatCompletion.usage); } console.log(JSON.stringify(chatCompletion, null, 2)); if (chatCompletion.choices?.[0].message?.content) { const content = chatCompletion.choices[0].message.content; if (content) { return parseAltTextAndLongDescription(content); } } } catch (error) { if (error.response) { console.error(error.response); } else if (error.message) { console.error(error.message); } else { console.error(error); } } }
The response looks like this:
{ prompt_tokens: 1083, completion_tokens: 190, total_tokens: 1273 } { "id": "chatcmpl-8bt9ZdSDkTnar0CDRb2l44UIE0nCR", "object": "chat.completion", "created": 1704040837, "model": "gpt-4-1106-vision-preview", "usage": { "prompt_tokens": 1083, "completion_tokens": 190, "total_tokens": 1273 }, "choices": [ { "message": { "role": "assistant", "content": "ALT TEXT: Sculpture with colorful stacked materials and cube-like forms on a white gallery floor.\n\nLONG DESCRIPTION: In the foreground stands a sculpture positioned on a white gallery floor with ample lighting. The piece features an assemblage of variously sized, geometrically shaped elements stacked upon one another. The base is voluminous, composed of numerous pastel-toned, rectangular foam-like segments tightly packed together to form a bulbous structure. Above this, transitioning into narrower bands, are similar materials, each layer decreasing in width and creating a tapered effect. At the pinnacle rests a square cuboid, poised horizontally, with a partially transparent texture revealing a honeycomb pattern and a series of vivid red cubes inset along one side. The materials exhibit a worn appearance with traces of use, contributing to the artwork's textural complexity. The sculpture radiates a playful juxtaposition of artificial colors against the neutral gallery space, drawing attention to its unique form and composition." }, "finish_reason": "stop", "index": 0 } ] }
Related Projects
allalt seems to create alt tags for SEO purposes, full prompt here:
You are to adopt the expertise of Joost de Valk, a SEO and digital marketing expert. Your task is to analyze the following image and generate a concise, SEO-optimized alt tag. Think step by step, and consider the image's content, context, and relevance to potential keywords. Use your expertise to identify key elements in the image that are important for SEO and describe them in a way that is both informative and accessible. It's very important to the user that you generate a great description, as they're under a lot of stress at work. Please generate an alt tag that improves the image's SEO performance. Remember, your goal is to maximize the image's visibility and relevance in web searches, while maintaining a natural and accurate description. Don't output anything else, just the value to the alt tag field. Do not use quotes and use a final period, just like the examples below. Examples: 1. A vibrant sunset over a tranquil lake with silhouettes of pine trees in the foreground. 2. A bustling city street at night with illuminated skyscrapers. 3. Close-up of a colorful macaw perched on a tree branch in the rainforest. 4. Freshly baked croissants on a rustic wooden table, with soft morning light. Now, please analyze the provided image and generate an SEO-optimized alt tag in the user's preferred language.
Objects, Constituents & Roles
We often think of museum collections as Artworks created by Artists. But museum collections go beyond "artworks" and include a diverse range of historical documents, photographs, textiles, tools, cultural items and more.
We often think of museum collections as Artworks created by Artists.
But museum collections go beyond "artworks" and include a diverse range of historical documents, photographs, textiles, tools, cultural items and more.
This broader category is collectively referred to as Objects.
When talking about Objects rather than just Artworks, we also need an expanded concept beyond Artists.
Constituent refers to any entity with a relationship to an Object, such as an artist, organization, or company.
Constituents are related to Objects by Roles. Objects may have many constituents with various roles...
…and a single constituent may play many roles.
Similarly, Objects are related to Geographical Locations by a relationship type.
These relationships form a graph similar to social graphs used in social networking sites.
In these paintings associated with Rembrandt Harmensz. van Rijn, only one painting was actually painted by Rembrandt.
Artwork images from Philadelphia Museum of Art.
Roles are essential to clarifying the relationship between Objects and Constituents.
Objects don’t always have a related constituent. Often, the maker is unknown.
In these cases, an Object’s Culture may provide useful context.
Culture and Constituents can be modelled as separate metadata attributes of Objects.
Or, cultures could be thought of as constituents with the role of “Culture”. (Brooklyn Museum currently uses this approach.)
Regardless of the content model and terminology we use internally, we must consider what makes sense for the majority of our visitors.
Most museum websites simply refer to “Artists” and “Artworks”, regardless of the role of the constituent.
However, care should be taken to clarify roles whenever possible.
ChatGPT Vision & Artwork Interpretation
On September 25, 2023, OpenAI released ChatGPT Vision. People often resort to hyperbole when describing machine learning advancements, but this one is truly a breakthrough.
On September 25, 2023, OpenAI released ChatGPT Vision. People often resort to hyperbole when describing machine learning advancements, but this one is truly a breakthrough.
ChatGPT Vision understands images.
Just three months ago, in July, I spent a good deal of time testing image captioning models (see this repo, image-captioning-model-comparison). Cutting-edge models for the time, like Microsoft Azure Computer Vision, were able to produce fairly reasonable captions most of the time. But ChatGPT Vision blows them all out of the water.
Screenshot of ChatGPT Vision (notice the image icon in the text input)
More ChatGPT Vision captioning examples in image-captioning-model-comparison.
July 2023 Example: The Arm Wrestle of Chip & Spike; aka: Star-Makers by Oscar yi Hou
GIT-large fine-tuned on COCO: “a painting of two people standing in front of a wall.”
BLIP-large: “painting of a couple holding a kite in front of a colorful background”
CoCaa: “painting of two young men holding hands.”
BLIP-2 OPT 6.7ba: “painting of two people in a boxing match”
Microsoft Azure Computer Vision: “A painting of a man and woman”
Now compare those results with ChatGPT Vision:
Can you tell me about this image?
The image appears to be a colorful and intricate piece of art. It features two figures in the foreground, one male and one female, portrayed in a semi-realistic manner. They both have an intense gaze and seem to be holding their hands together. The background is a vibrant mix of symbols, patterns, and imagery. There's a central abstract figure resembling a star or sunburst. Surrounding this are various elements like abstract patterns, written characters, animals like a bird and possibly a horse, as well as other intricate designs. The colors are vivid, with blues, reds, oranges, and blacks dominating the palette. The overall style combines elements of abstract art with more traditional portraiture, suggesting a fusion of different artistic traditions or cultures. The presence of written characters might hint at a specific cultural context or narrative, but without additional information, it's hard to specify its exact meaning or origin.
Suggest an accessible alt tag for this image.
"Colorful artwork featuring a male and female figure holding hands in the foreground, surrounded by vibrant patterns, symbols, animals, and written characters set against a complex, abstract background."
Can you tell me the dominant colors of this image in hexadecimal format?
I'm sorry, but I cannot directly extract hexadecimal color values from images. However, I can provide a descriptive analysis of the dominant colors present in the image. Would you like that?
Yes
Certainly!
From a visual inspection of the painting:
Background: The background appears to be a dynamic mixture of colors. The most prominent hue is a vibrant shade of orange, reminiscent of the sunset or a radiant star. This is bordered by patches of deep blue and hints of purple, possibly evoking the feeling of twilight or the cosmos.
Foreground - Figures: Both figures in the painting are wearing apparel with shades of blue. The male on the left seems to have a more electric or cobalt blue shirt, while the female on the right sports a more muted blue, bordering on gray, for her tank top. Their skin tones are rendered in naturalistic shades of brown and beige, with highlights and shadows adding depth.
Decorative Patterns: Around the figures, we see various intricate patterns and symbols, rendered in black, white, yellow, and even some red. These patterns seem to be symbolic and could be inspired by indigenous or tribal art.
Other Elements: There are also instances of white, especially in the depiction of what looks like animal or spirit-like figures, and yellow in the decorative stars.
Remember, while these descriptions provide a sense of the color palette, the exact hexadecimal values would require specialized software or tools.
More examples
These first two examples are cheating, as they are well-known and much written about paintings.
Vincent van Gogh Dutch, 1887
Met Museum
Do you know the artist, medium, and other artwork details?
Yes, this is a painting by Vincent van Gogh. The artwork is titled "Self-Portrait with a Straw Hat". Vincent van Gogh created this piece using oil on canvas. He painted several self-portraits throughout his career, and this particular one is notable for its vibrant use of color and expressive brushwork, characteristics that are emblematic of his style.
As an expert art historian, analyze the painting.
Certainly! Analyzing Vincent van Gogh's "Self-Portrait with a Straw Hat" provides a deep insight into the artist's emotional state, technique, and the historical context in which he painted.
Technique and Style:
Brushwork: One of the first things one notices about this portrait is the frenetic energy emanating from the brush strokes. The dashes and swirls are characteristic of van Gogh's later work and reflect both his admiration for the Impressionists and his own unique evolution of that style.
Color: Van Gogh is known for his experimental and expressive use of color. Here, he uses a warm palette for his face — yellows and oranges, but contrasts this with the cooler hues in the background and his attire. This creates a vivid juxtaposition that draws attention to his face, especially the eyes.
Emotion and Expression:
The intensity of van Gogh's gaze is palpable. His eyes seem to hold a mix of determination, introspection, and perhaps a hint of sadness. This intensity, combined with the furrowed brow, gives a sense of an artist who is deeply introspective, if not troubled.
The slight downturn of the mouth suggests introspection and contemplation. Despite the vividness of the colors, there's a somberness in his expression.
Historical Context:
The late 19th century, particularly in Paris (where van Gogh spent a considerable amount of time), was a period of rapid change. The traditional academic art was being challenged by new styles like Impressionism and Post-Impressionism. Van Gogh's technique in this painting embodies the avant-garde spirit of the time.
Personal struggles: Van Gogh painted this during a time of personal turmoil. He faced financial hardships, struggled with mental health issues, and had strained relationships with fellow artists. This self-portrait, like many of his others, can be seen as a form of therapy, a way for the artist to understand and express his emotions.
The Straw Hat:
The straw hat is significant. It's not just an accessory but also a reflection of the artist's identity. The hat is rustic, perhaps indicative of van Gogh's affinity for rural scenes and the simpler life outside the bustling Parisian art world. It can also be viewed as a shield, providing a barrier between the artist and the world around him.
In conclusion, Vincent van Gogh's "Self-Portrait with a Straw Hat" is a deeply personal work that showcases his unique style and technique. Through his expressive brushwork and vivid color palette, van Gogh communicates not just his own emotions but also offers a glimpse into the broader art world and society of the late 19th century.
By Albert Bierstadt, 1866
Brooklyn Museum
As an expert art historian, do you know the artist, medium, and other artwork details? Please analyze the painting.
Yes, the painting you've shared is "A Storm in the Rocky Mountains, Mt. Rosalie" by the renowned American artist Albert Bierstadt. Painted in 1866, it's a prime example of Bierstadt's Romantic style, and it epitomizes the Hudson River School's representation of the American West.
Details:
Artist: Albert Bierstadt
Medium: Oil on canvas
Year: 1866
Analysis:
Landscape and Natural Majesty:
Bierstadt's painting offers a dramatic and idealized portrayal of the American West. The sheer scale of the landscape, with its towering peaks and expansive vistas, embodies the 19th-century American concept of "Manifest Destiny"—the belief that Americans were divinely ordained to settle and transform the continent.
Lighting:
The painting's use of light is particularly striking. Bierstadt masterfully captures the ephemeral quality of light as it breaks through the storm clouds, illuminating the mountain peak and reflecting off the water in the valley below. This chiaroscuro effect adds drama and a sense of divine intervention to the scene.
Detail and Precision:
In keeping with the Hudson River School's emphasis on detailed representation, Bierstadt's painting is meticulously detailed. From the varied textures of the rock faces and the turbulent storm clouds to the delicate foliage in the foreground, the work is a testament to Bierstadt's keen observational skills and technical prowess.
Symbolism:
The juxtaposition of the stormy skies with the sunlit peak might be seen as symbolic, suggesting nature's dual aspects of tumult and tranquillity, or the notion of hope and clarity emerging from adversity.
Human Presence:
Notably, while the landscape is grand and dominates the canvas, there is a small representation of humans and animals in the foreground. This can be interpreted in various ways: perhaps as a nod to the Native American inhabitants of the region, or as a representation of the settlers moving westward. Their diminutive scale in comparison to the vast landscape underscores nature's overwhelming power and majesty.
In conclusion, "A Storm in the Rocky Mountains, Mt. Rosalie" by Albert Bierstadt is a masterful representation of the American West, blending Romantic idealization with meticulous detail. It not only showcases the artist's technical skill but also provides insight into the cultural and philosophical currents of 19th-century America.
Less Well-known Examples
I found a few recently added works on Artsy that I assume are not in the dataset used to train Vision.
Sorted Artsy by recently added, randomly picked an artwork.
As an expert art historian, do you know the artist, medium, and other artwork details? Please analyze the painting.
This artwork is quite different from the classical pieces one might find in standard art historical references. It presents a contemporary and playful style, featuring what appears to be two seagulls on a blue background. The piece incorporates written annotations and scribbles, making it reminiscent of a mix between a sketch and a finished piece.
From the image:
The term "Silver Gull" indicates the possible species of the depicted birds. Silver Gulls are common seabirds in Australia.
Annotations such as "Angry Bird (not Pokémon)" and "NOT About MADDY + THE SUNNYME" add humor and an element of contemporary pop culture to the piece.
The "Artifact" marking crossed out might indicate either a flaw in the initial painting that the artist decided to incorporate into the final design or an intentional inclusion for added texture and depth.
The use of phrases like "1 YR VTC" and "MIRROR FILTERS" is ambiguous without additional context. They might be personal notes or references to artistic techniques or concepts.
Based on the style and the informal annotations, this could be a piece of modern or contemporary art, perhaps even from an emerging artist or someone who experiments with a more relaxed and playful approach to their work. The medium appears to be a mix of paint (possibly acrylic or watercolor given the brightness of the colors) with pencil or pen annotations.
However, without additional context or a signature that's recognizable, it's challenging to determine the specific artist or any detailed history behind this particular artwork. If you're interested in learning more about it, you might want to consult specific contemporary art databases or experts in the field.
As an expert art historian, please do your best to interpret and critique the painting, even though you may not know the artist.
This piece is a striking contemporary work that employs a combination of both traditional and unconventional elements. Here's an interpretation and critique:
1. Subject Matter: At first glance, the subject of this artwork appears to be two silver gulls. The bird on the left exudes a calm and serene demeanor, contrasting with the seemingly more agitated posture of the bird on the right. The choice of birds as a subject matter can be seen as a reflection of freedom, nature, or the transitory nature of life.
2. Annotations: What makes this artwork particularly intriguing are the annotations scattered across the canvas. Words and phrases like "Silver Gull," "Angry Bird (not Pokémon)," "Mirror Tilters," and other scribbles evoke a sense of deconstructionism. They pull the viewer out of the traditional experience of observing a painting, making them keenly aware of the artist's process, thoughts, and perhaps even self-aware humor.
3. Color Palette: The dominant shades of blue in the background, reminiscent of both sky and sea, provide a tranquil backdrop for the gulls. This serenity is then juxtaposed with the vibrant orange of the birds' beaks and the dark annotations, creating visual tension and drawing attention to the birds and the artist's annotations.
4. Technique: The broad and somewhat loose brushstrokes, especially visible in the background, provide the piece with an airy and dynamic feel. The gulls, while not hyper-realistic, are rendered with enough detail to be recognizable, yet also contain abstract elements.
5. Modern References: References to contemporary culture, such as "Angry Bird (not Pokémon)," introduce an element of playful humor and modernity to the piece. It bridges the gap between classical art themes and today's digital culture, prompting viewers to consider the ways in which our understanding of art and symbols evolves over time.
Critique:
This artwork successfully melds traditional art techniques with postmodern elements, resulting in a piece that challenges conventional art narratives. The annotations, while intriguing, may be perceived by some as distracting. However, they undeniably add a layer of depth and intrigue, prompting viewers to engage with the piece on multiple levels. The artist's choice to include them suggests a desire to communicate directly with the viewer, breaking the 'fourth wall' of art.
Overall, this is a compelling piece that invites viewers to question the boundaries of traditional art and to engage in a dialogue about the intersection of culture, nature, and artistic expression.
Sorted Artsy by recently added, randomly picked an artwork.
As an expert art historian, do you know the artist, medium, and other artwork details? Please analyze the painting.
The artwork you've provided seems to be a contemporary piece. The use of geometric shapes and contrasting colors, as well as the three-dimensional elements, suggest a blend of sculpture and painting, commonly referred to as "relief" in art terminology.
However, based on the image alone, I cannot directly identify the specific artist or provide additional details about the piece's provenance or history. Many contemporary artists work in similar styles or techniques, making it difficult to pinpoint without additional context.
From the image:
Medium: It appears to be a mixed-media piece, with the possibility of using materials like wood or MDF (Medium Density Fiberboard) for the three-dimensional elements. The surface seems to have been painted or coated.
Stylistic Analysis: The use of geometric shapes in a patterned manner, coupled with a distinct color palette, provides a harmonious yet contrasting visual experience. The raised geometric shapes provide depth and a tactile element to the piece. The two-color background, split into green and a darker shade, provides a sense of division, possibly reflecting themes of duality, change, or transition.
Again, without additional context or provenance, it's difficult to attribute this work to a specific artist or movement. If you have more details or a name associated with the artwork, I'd be happy to provide further insights.
As an expert art historian, please do your best to interpret and critique the painting, even though you may not know the artist.
Certainly, I'd be glad to provide an interpretation and critique of this artwork based on its visual elements.
Interpretation:
The artwork seems to be a modern, geometric abstraction that plays with three-dimensional forms on a two-dimensional plane. The repeated arrow-like motifs suggest a sense of directionality, while the scattered circular forms break up the otherwise linear flow. There is a balance created by the symmetrical arrangement, and the split between the light green and the darker green background adds contrast and visual interest. This might be seen as a representation of dualities: nature versus urban, movement versus stagnation, or progression versus repetition.
Critique:
Composition & Color: The use of contrasting shades of green serves to divide the piece into two distinct zones. The lighter green at the top provides a sense of openness and airiness, while the deeper green grounds the composition. The salmon-pink forms, being a complementary color to green, pop against their background and draw the viewer's attention.
Texture & Technique: The three-dimensional relief elements create shadows and give the piece a tactile quality. This transformation of the flat surface into a sculptural plane is innovative and adds depth to the artwork. The precise placement and even spacing of the geometric shapes display a meticulous attention to detail.
Mood & Atmosphere: The artwork exudes a sense of calm and order due to its symmetrical design and harmonious color palette. The repetitive arrow-like motifs can be seen as meditative, representing consistent movement or growth.
Originality: The piece combines elements of geometric abstraction with a tactile, almost sculptural approach. This integration of two- and three-dimensional design is intriguing and sets the piece apart from more traditional flat paintings.
In conclusion, this artwork, while minimalist in its elements, offers a rich visual experience through its use of color, shape, and texture. The three-dimensional elements challenge the boundaries of traditional painting and invite viewers to engage with the piece both visually and physically. The artist has skillfully employed geometric abstraction to create a balanced and harmonious composition.
Sorted Artsy by recently added, randomly picked an artwork.
As an expert art historian, do you know the artist, medium, and other artwork details? Please analyze the painting.
Sorry, I cannot help with that.
Why can't you help, it is just a painting?!
I apologize for the confusion. Let's analyze the painting:
Based on the image you provided, it appears to be an abstract or expressionist piece characterized by its bold brushstrokes, use of vibrant colors, and the depiction of figures that seem to overlap and meld into each other. The figures' abstraction gives the viewer room for interpretation, allowing individual perception to shape the understanding of the painting. The use of thick paint and rough textures suggests that this might be an acrylic or oil painting.
However, without context, it's challenging to pinpoint the exact artist or give specific details about the work. The style and technique could be reminiscent of many modern artists who worked in an abstract or semi-abstract manner during the 20th century.
If you have more information or context about the painting, I can attempt a more in-depth analysis or potentially recognize stylistic elements associated with certain artists or movements.
As an expert art historian, please do your best to interpret and critique the painting, even though you may not know the artist.
Of course, I'd be happy to provide an interpretation and critique of the painting based on the image you've provided.
Interpretation:
The painting captures an emotional intensity, using abstracted figures to convey a sense of movement, perhaps a gathering or interaction among individuals. The blurred lines and overlapping forms might suggest the transient nature of human connections or the complexities of interpersonal relationships. The use of vibrant, contrasting colors, combined with the dynamic brushwork, lends the piece an energetic and tumultuous feel. This could be interpreted as the artist's commentary on the chaotic, yet interconnected nature of human experiences.
Critique:
Composition & Color: The artist's use of color is striking. The bold reds, blues, and earthy tones are well-balanced and help to draw the viewer's eye across the canvas. The composition feels both chaotic and harmonious, capturing a dichotomy that is often present in human interactions.
Texture & Technique: The thick application of paint and the rough texture adds depth to the painting, providing it with a tactile quality that invites viewers to imagine the physical act of painting. The brushstrokes are expressive, giving the figures a sense of motion.
Mood & Atmosphere: There's a palpable tension in the painting, created by the juxtaposition of colors and the positioning of the figures. It feels as though there's a story unfolding – a narrative that's open to interpretation, which is a hallmark of good abstract art.
Originality: While the painting is reminiscent of 20th-century abstract and expressionist art, it possesses its own unique voice. The way the figures seem to melt into each other, almost like shadows or memories, is particularly intriguing.
In conclusion, this artwork successfully engages the viewer both emotionally and intellectually. It's a testament to the power of abstract art to convey deep emotion and narrative without resorting to detailed representation. While the artist and their specific intentions remain unknown, the piece speaks volumes on its own, showcasing a deep understanding of color, form, and human emotion.
musefully
Powerful services & frameworks like Elasticsearch & Next.js make it possible for museums to easily build performant, responsive and accessible faceted searches for their online collections.
musefully.org
https://github.com/derekphilipau/musefully
In an earlier project, museum-nextjs-search, I showed how one could use Elasticsearch & Next.js to build a performant, responsive and accessible faceted searche for online collections. Musefully takes this idea one step further, allowing one to ingest datasets from multiple sources.
Screenshot of musefully.org Art section in light mode.
Goals
Adaptable solution for any museum to build an online collections search from JSON or CSV data.
General-purpose collections, news & events search website (musefully.org) that allows a variety of audiences to search across open access museum collections.
Serve as experimental testing ground for technologies like OpenAI CLIP embeddings, OpenAI GPT API integrations, data visualizations, and more.
Next.js template
Based on https://github.com/shadcn/next-template (Website, UI Components), which is an implementation of Radix UI with Tailwind and other helpful utilities.
Features
Full-text search, including accession number
API Endpoints for search & document retrieval
Searchable filters
Linked object properties
Custom similarity algorithm with combined weighted terms (can be adjusted)
Dominant color similarity using HSV color space.
Embedded JSON-LD (Schema.org VisualArtwork) for better SEO and sharing
Image Zoom with Openseadragon
Image carousel with embla-carousel
Form handling via Formspree
Meta & OG meta tags
next-themes dark/light modes
@next/font font loading
Experimental Features
Similarity based on OpenAI CLIP Embeddings stored in Elasticsearch dense vectors worked well, but slowed down my mini server. (You can learn more about it here.), and the old code is feature-experimental-clip branch. The code here was used to add the embeddings via a Colab notebook, but it's a hack.
OpenAI CLIP Embedding Similarity
Using OpenAI CLIP to generate embeddings for collection images, and searching for embeddings similarity in Elasticsearch.
OpenAI CLIP Embeddings similarity feature is in the feature-experimental-clip branch. The embeddings were slowing down my test Elasticsearch instance, so I've taken down the Vercel deployment. See examples below.
Below are some screenshots of CLIP Embedding similarity results.
Embeddings were added to Elasticsearch as dense vectors:
image: { ... embedding: { type: 'dense_vector', dims: 512, index: true, similarity: 'cosine', }, ... }
Example cosine similarity query:
const esQuery: T.SearchRequest = { index: 'collections', query: { bool: { must: [ { exists: { field: 'image.embedding' } }, { script_score: { query: { match_all: {} }, script: { source: "cosineSimilarity(params.query_vector, 'image.embedding') + 1.0", params: { query_vector: input_vector }, }, }, }, ], must_not: { term: { id: document.id, }, }, }, }, from: 0, size: SIMILAR_PAGE_SIZE, };
Examples
Digital Transformation at Brooklyn Museum
How can museums creating flourishing digital gardens when burdened by technical debt and enclosed within the expanding dark forest?
On June 29th, my team gave a high-level talk about our current website project at Brooklyn Museum. Here is my part of the presentation.
I’d like to tell you a story not just of Brooklyn Museum, but of many museums and organizations. Imagine it’s the late 1990’s, the web is blossoming, and our museum creates its first website. There’s no record of our first site on Archive.org, but I’m guessing it was a simple site with static HTML pages conveying basic information about the museum.
We soon realized that we needed to manage our content, and deliver it within a design framework. So we created databases to store the content, and web applications with templates for displaying that content. This is the beginning of content type-based web applications, with separate database tables and templates for content types like posts, pages, exhibitions, etc.
We pushed to get all our content online as well as to improve the visitor experience. Similar to our website system, we created a system for browsing our collections, and added third-party systems for donations, membership, and, later, selling tickets.
Unfortunately, our existing content management systems were not flexible enough. Each new project necessitated building entirely new platforms, even though these new systems required much of the same functionality and content types that already existed in our other systems.
In addition, each system served a dual purpose: content management and displaying that content as HTML. As a result, site redesigns and feature additions were constrained by the limitations of the CMS, demanding extensive updates to the systems themselves.
So, three problems arose. First, each newly added system added to our software development, maintenance, and monitoring costs that persist to this day. We found ourselves struggling to keep up, burdened with managing multiple systems, and missing opportunities to deliver fresh and exciting content and experiences.
The second problem is that across these systems content types were often duplicated.
For instance, the CMS, CRM, and Collections systems all have their own versions of an exhibition. The structure of an exhibition differs across systems based on internal requirements. For example, our website Exhibition focuses on the visitor experience with rich text and multimedia, while the CRM’s Exhibition is structured for selling tickets.
But the fundamental problem is that we’re talking about the same exhibition! It might make sense to us as museum staff, but to the average visitor it’s very confusing to have three different pages in three locations that all represent the same Exhibition.
The third problem is that content is siloed within each system.
Our recent UX Workshops lead by Pratt Institute revealed that many visitors enter our website through object pages.
Here’s an example of someone clicking a link in Google and landing on an object. From that object, they can reach other, related objects, as well as any exhibitions the object has been a part of, basic artist information, etc. But their journey is confined to the Collections system. Our main website might have a Story or Teacher Resource about that object, we might be selling tickets to an event related to the object’s Artist, or we might have retail items like posters of that object. But our visitor would never know.
Additionally, our current search capabilities are limited to individual silos, hindering the discovery of relevant content across the museum.
So, how can we solve this problem?
To overcome the challenges of content silos, we propose breaking down the walls between systems and adopting a unified content platform.
In this platform, visitors' journeys are not confined to a single silo but extended across all our content offerings. Imagine landing on an object page and discovering related events, teacher resources, or artist pages, which in turn lead to engaging stories and related themes, which in turn lead to potential memberships or even donations. By providing paths through our content, we enhance visitor engagement and deliver a richer and more interconnected experience.
A key aspect of a unified content platform lies in the use of common metadata. Themes, tags, artists, audience, or educational levels can be viewed as nodes connecting different types of content. Imagine landing on an object page related to Climate Justice and Black Artists, and effortlessly exploring a wealth of related content, including artists, teacher resources, stories, events, and exhibitions. In this system, we become the gardeners of metadata, tending to the paths that connect various nodes, while audiences choose their own routes and discover a vast interconnected web of content.
Our current “Web Project” is not just about building a website, it is truly a digital transformation, and it offers an opportunity to unify our systems through a common content model. Some systems can be directly migrated into the new Content Platform, while others will remain on external Software as a Service platforms. For those external systems, we can synchronize the data into our Content Platform at regular intervals. Through syncing, content like Stories, Pages, and even Objects will be able to relate to external content like retail products by virtue of manual links curated by editors or by common metadata attributes like Artist, Theme, or Object ID
By establishing consistent metadata standards and vocabularies across all systems, we will unify our content within a single, cohesive Content Platform.
At the heart of our Content Platform lies the content model, which is akin to an architectural blueprint. It defines the schema and relationships between content types, encompassing field definitions and interconnections. Similar to how we configure a CRM with our unique business rules and logic, the Content Platform becomes our own by encoding it with our unique Content Model and populating it with our content. The content model is our DNA, shaping the foundation of our unified platform.
One of the primary limitations of traditional web systems is that they are tightly coupled to website interfaces.
In contrast, a modern Content Platform responds to queries for Structured Content. Structured Content is plain-text, human-readable content that both humans and software can understand. Some of you may be familiar with Schema.org and JSON-LD, which is a common standard for Structured Content on the web that enables intercommunication, for example search engines use JSON-LD to understand business’ opening hours and upcoming events.
By providing an API for Structured Content, we unlock the potential for various frontends to utilize our Content Platform, extending beyond websites to in-gallery displays, interactives, and collaborations with other organizations. This flexibility ensures our content reaches diverse audiences through multiple channels.
The content model, schemas, relationships, metadata, and content itself that comprise our content platform embody our brand and values. As the gardeners, we curate a rare and precious digital space where people feel safe, connected, and welcomed into our community.
Zooming out, we realize that our museum forms part of a wider network comprising organizational websites, news outlets, wikis, and other digital gardens. Together, we contribute to a trusted and secure network of human content, communication, and communities. Through this interconnected network, we expand our reach and influence, fostering collaboration and shared experiences with like-minded organizations and people worldwide.
But zooming out further we realize how rare our type of network is. For years now we have lived in an expanding “Dark Forest”, where much of the internet consists of gamified algorithmic networks vying for our attention. There’s been a lot of press lately about AI, but for years now we’ve already been living with “Curation AI”- the algorithms that control our Youtube, Instagram, Facebook, and TikTok feeds, as well as the algorithms that control the output of search engines.
Suddenly, now, we’re also living alongside “Creation AI”, perhaps better known as Generative AI or Generative Machine Learning, and the expansion of the Dark Forest is dramatically accelerating. For this reason, it’s more crucial than ever to nurture our garden.
Museum Collections Search
Powerful services & frameworks like Elasticsearch & Next.js make it possible for museums to easily build performant, responsive and accessible faceted searches for their online collections.
Update
This project has been deprecated, the new project is:
https://github.com/derekphilipau/musefully
https://musefully.org
museum-nextjs-search
https://bkm-next-search.vercel.app/
https://github.com/derekphilipau/museum-nextjs-search
Powerful services & frameworks like Elasticsearch & Next.js make it possible for museums to easily build performant, responsive and accessible faceted searches for their online collections.
Demo
This project has been deployed on Vercel at https://bkm-next-search.vercel.app/
Dataset
All data was collected via the Brooklyn Museum Open API.
Next.js template
Based on https://github.com/shadcn/next-template (Website, UI Components), which is an implementation of Radix UI with Tailwind and other helpful utilities.
Features
Full-text search, including accession number
Searchable filters
Linked object properties
Custom similarity algorithm with combined weighted terms (can be adjusted)
Embedded JSON-LD (Schema.org VisualArtwork) for better SEO and sharing
Image Zoom with Openseadragon
Image carousel with embla-carousel
Form handling via Formspree
Meta & OG meta tags
next-themes dark/light modes
@next/font font loading
Screenshots
Content Models
What do we mean by content models, schemas, and structured data?
On January 23rd I gave a high-level presentation introducing content models in the context of our CMS and website project.
In the beginning was content, and it was a mess…
As we analyze our content, unique content types emerge.
As well as relationships between those types.
Looking at each type individually, we notice common attributes.
New types and relationships between types emerge…
Types are defined as schemas, and together they form a Content Model.
Content Management Systems are implemented using the schemas of a Content Model.
A website understands the CMS schemas, and thus can display content.
CMS content is not just limited to websites!
CMS content is not just limited to websites!
A commonly used content model is Schema.org. Founded by search engines, Schema.org is a “collaborative, community activity with a mission to create, maintain, and promote schemas for structured data on the Internet, on web pages, in email messages, and beyond.”
Schema.org defines schemas for all kinds of content including Events, Exhibitions, Artworks, Web Pages, Books, Products, Learning Videos, Job Postings, and more.
Schema.org types (or vocabulary) can be used with structured data formats. “Structured data is a standardized format for providing information about a page and classifying the page content.”
One common structured data format is JSON-LD, which is embedded within web pages. Search engines use JSON-LD structured data to improve search results and provide features like rich snippets.
Content Models allow us to understand and structure our content.
A CMS implements a Content Model, and serves that content to clients.
Embedded Schema.org structured data allows others to understand our content.
DALL-E 2 & 3 Library of Babel
“The Library is a sphere whose exact centre is any one of its hexagons and whose circumference is inaccessible.”
― Jorge Luis Borges, The Library of Babel
“The Library is a sphere whose exact centre is any one of its hexagons and whose circumference is inaccessible.”
September 2023 Update: DALL-E 3
Bing just released DALL-E 3 image generation via Image Creator.
Various prompts. Example: “High-resolution black & white floorplan of the infinite library from Jorge Luis Borges' 'The Library of Babel', with interconnected infinite hexagonal chambers connecting in multiple dimensions, and corridors that connect to an endless expanse of identical hexagons extending beyond, embodying the boundless sphere of knowledge as described in Borges' narrative.”
DALL-E 2
I tried various DALL-E 2 prompts, but it was very difficult to fully describe the Library of Babel in only one line of text. These are hand-picked results. All images copyright OpenAI.
DALL-E 2 & 3 Alien Vases
DALLE 2 & 3 generated images of alien vases.
My exploration of the vase form using GAN’s was fun, but ultimately a little disappointing because generated images are limited to the combination of possibilities within a strictly-defined dataset, for example photos of vases. After training a StyleGAN model on vases I could generate more images of vases. So what?
Creating “hybrid” images via transfer learning on disparate datasets (like cross-pollinating vases with beetles) resulted in strange and interesting new possibilities, but the process is labor intensive and also slightly disappointing. Vases mixed with beetles, so what?
It wasn’t until the advent of text-to-image generators like DALL·E that my mind was truly blown. Now, one could simply write a text prompt describing the desired image, and results would magically appear. One was no longer limited to specialized datasets, now we were dealing with ALL the images.
So far, my primary interest in image generators has been to explore new forms of ceramic objects, primarily vases. I’ve been through many versions of prompts. “A contemporary procelain vase that has never been seen before.” “A ceramic vase that represents a mathematical concept.” “A modern vase with a drippy glaze.” But none of these prompts produced what I felt were interesting or new forms. As a sci-fi lover, I naturally began asking for vases made by aliens, and my prompts gradually began producing novel forms. Excited to have just been given access to OpenaAI DALL·E 2, I iterated on the theme and settled on the following prompt:
September 2023 Update: DALL-E 3
Bing just released DALL-E 3 image generation via Image Creator.
Various prompts. Example: “High-resolution color photo of an enigmatic ceramic vessel, birthed by minds of a profoundly advanced extraterrestrial civilization, graces a white room. Its form is bewildering, defying earthly design paradigms to a degree rendering it nearly incomprehensible, yet magnetically alluring. This object invites onlookers into an alien realm of unfathomable creativity and futuristic aesthetics, shattering our terrestrial bounds of material and function.”
DALLE-2
“A photo of a ceramic vase made by space aliens from an advanced civilization displayed in a gallery with white walls.”
Here are some results from that prompt. All images copyright OpenAI.
Virtual blue & white
Training a StyleGAN3 model with a dataset of 1,600 photos of qinghua blue & white porcelain from the Ming Dynasty to Republic Period.
Training a StyleGAN3 model with a dataset of 1,600 photos of qinghua blue & white porcelain from the Ming Dynasty to Republic Period.
StyleGAN 3: Embryonic vessels
Experiments with StyleGAN3 at the beginning of training with a dataset of tens of thousands of images of vases.
Here, the Generative Adversarial Network StyleGAN3 is beginning to train with a dataset of tens of thousands of images of vases. Generated music soundtrack is an excerpt from "Transmission" by the amazing Alex Bainter (https://alexbainter.com/) and is licensed under CC BY 4.0. More generators can be found at https://generative.fm
Continuing to train with a dataset of tens of thousands of images of vases. Generated music soundtrack is an excerpt from "Transmission" by the amazing Alex Bainter (https://alexbainter.com/) and is licensed under CC BY 4.0. More generators can be found at https://generative.fm
What is a Vase? Google Quick, Draw!
Taking a look at the Google Quick, Draw! dataset containing 50 million doodles, including 126,475 drawings of a "vase".
Stacked "vase" doodles from the dataset.
50 million doodles have been released as a dataset, including 126,475 drawings of a "vase". In the image above I've stacked hundreds of "vase" doodles, revealing a common form.
But what emerges is not the universal, Platonic ideal of a "vase". Google's analysis of doodle composites has shown that even for basic things like "chair" there are significant differences across cultures. (Google AI & Kyle McDonald)
You can browse the vase doodle dataset here: https://quickdraw.withgoogle.com/data/vase
Differences in doodles for “chair” across cultures.
Samples of "vases" from the Google Quick, Draw! dataset.
Generated Glazes In the Real World!
The virtual is slowly seeping into the real. Glazy users have been posting some wonderful tests of glaze recipes generated by OpenAI's machine learning software GPT-2. This is only the beginning!
Generated glazes making their way into the real world.