使用Hugging Face生成图片描述
通过Supabase边缘函数调用Hugging Face推理API,访问超过10万个机器学习模型。
我们可以将 Hugging Face 与 Supabase Storage 和 数据库 Webhooks 结合使用,为上传到存储桶的任何图片自动生成描述。
关于 Hugging Face
Hugging Face 是机器学习社区的协作平台。
Huggingface.js 提供了便捷的方式来调用超过 100,000 个机器学习模型,使您可以轻松地将 AI 功能集成到 Supabase 边缘函数中。
设置步骤
- 打开您的 Supabase 项目仪表盘或创建新项目
- 创建名为
images
的新存储桶 - 从远程数据库生成 TypeScript 类型
- 创建名为
image_caption
的新数据库表- 创建
uuid
类型的id
列,引用storage.objects.id
- 创建
text
类型的caption
列
- 创建
- 重新生成 TypeScript 类型以包含新的
image_caption
表 - 将函数部署到 Supabase:
supabase functions deploy huggingface-image-captioning
- 在 Supabase 仪表盘中创建数据库 Webhook,当
storage.objects
表添加记录时触发huggingface-image-captioning
函数
生成 TypeScript 类型
要为 storage 和 public 模式生成 types.ts 文件,请在终端运行以下命令:
1supabase gen types typescript --project-id=your-project-ref --schema=storage,public > supabase/functions/huggingface-image-captioning/types.ts
代码实现
完整代码请查看 GitHub。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849import { serve } from 'https://deno.land/std@0.168.0/http/server.ts'import { HfInference } from 'https://esm.sh/@huggingface/inference@2.3.2'import { createClient } from 'jsr:@supabase/supabase-js@2'import { Database } from './types.ts'console.log('来自 `huggingface-image-captioning` 函数的问候!')const hf = new HfInference(Deno.env.get('HUGGINGFACE_ACCESS_TOKEN'))type SoRecord = Database['storage']['Tables']['objects']['Row']interface WebhookPayload { type: 'INSERT' | 'UPDATE' | 'DELETE' table: string record: SoRecord schema: 'public' old_record: null | SoRecord}serve(async (req) => { const payload: WebhookPayload = await req.json() const soRecord = payload.record const supabaseAdminClient = createClient<Database>( // Supabase API URL - 部署时默认导出的环境变量 Deno.env.get('SUPABASE_URL') ?? '', // Supabase API 服务角色密钥 - 部署时默认导出的环境变量 Deno.env.get('SUPABASE_SERVICE_ROLE_KEY') ?? '' ) // 从存储构建图片URL const { data, error } = await supabaseAdminClient.storage .from(soRecord.bucket_id!) .createSignedUrl(soRecord.path_tokens!.join('/'), 60) if (error) throw error const { signedUrl } = data // 使用Huggingface进行图片描述生成 const imgDesc = await hf.imageToText({ data: await (await fetch(signedUrl)).blob(), model: 'nlpconnect/vit-gpt2-image-captioning', }) // 将图片描述存储到数据库表 await supabaseAdminClient .from('image_caption') .insert({ id: soRecord.id!, caption: imgDesc.generated_text }) .throwOnError() return new Response('ok')})