1
1

AWS環境でAI関連のシステムのPOC(2)

Posted at

はじめに

写真からストーリーテリングを作成できればと思い、写真をインプットにキャプションを付けてくれるサービスを作成していきます。キャプションを付けてくれるサービスはReplicateの「BLIP-2」というモデルを利用していきます。

アプリケーションの概要

PythonのWebアプリを開発する際に使うWebフレームワークであるDjangoを使い、画面からイメージをアップロードした時に、Replicateの「BLIP-2」というモデルを呼び出してキャプションを取得します。また、AWSのS3へのファイルアップロードも合せて行うようにしています。

■Djangoのフロー概要

アプリケーションの準備

Replicateの準備

Replicateにサインインしていきます。GitHubのコードでサインインできます。制限に達するまでは特にBillingへの登録は不要です。

API tokensでトークンをメモしておきます。
image.png

AWS S3の準備

AWSのアカウントがある前提となりますが、S3のバケットを作成。バケット名は任意です。AWSユーザのアクセスキーとシークレットキーをメモしておきます。

image.png

アプリケーションの作成

Djangoで画像のアップロード機能を作る方法についてはDjangoで画像のアップロード機能を作る方法を参考にさせて頂きました。

追加するライブラリ
pip install replicate 'replicate用
pip install boto3   'S3用

環境変数とenvに以下を指定

.env
REPLICATE_API_TOKEN=r8_xxxxxx
AWS_ACCESS_KEY_ID=AKxxxxxx
AWS_SECRET_ACCESS_KEY=Jbxxxxx
AWS_STORAGE_BUCKET_NAME=caption-image-sandbox
views.py
ReplicateおよびS3へのファイルアップロードを呼び出すviews.pyは以下の通り

import replicate
import boto3
from django.conf import settings
from django.shortcuts import render, get_object_or_404
from .forms import UploadForm
from .models import UploadImage

s3 = boto3.resource('s3')
bucket = s3.Bucket(settings.AWS_STORAGE_BUCKET_NAME)
print(settings.AWS_STORAGE_BUCKET_NAME)

def index(request):
  params = {
    'title': 'キャプションを付ける画像のアップロード',
    'upload_form': UploadForm(),
    'id': None,
    'caption': None,
  }

  if (request.method == 'POST'):
    form = UploadForm(request.POST, request.FILES)
    if form.is_valid():
      upload_image = form.save()
      params['id'] = upload_image.id
      # S3へアップロード
      bucket.upload_file(upload_image.image.path, str(upload_image.id)+'.png')
      img = open(upload_image.image.path, 'rb')
      output = replicate.run(
        "andreasjansson/blip-2:f677695e5e89f8b236e52ecd1d3f01beb44c34606419bcc19345e046d8f786f9",
        input=  {
            "image": img,
            "caption": True,
            "question": "",
            "temperature": 1,
            "use_nucleus_sampling": False
        }
      )
      params['caption'] = output

  return render(request, 'index.html', params)

def preview(request, image_id=0):

  upload_image = get_object_or_404(UploadImage, id=image_id)

  params = {
    'title': '画像とキャプションの表示',
    'id': upload_image.id,
    'url': upload_image.image.url
  }

  return render(request, 'preview.html', params)

参考資料

Djangoで画像のアップロード機能を作る方法

まとめ

今回はローカルでDjangoのアプリケーションを作成し、画像のキャプションを取得するアプリケーションを作りました。次回は複数の画層のキャプションからストーリーテリングをする機能を作っていきたいと思います。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1