0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

raspberry pi 4とinky impressionが入る筐体を作る(画像自動生成&更新フォトフレームの作成)その3

Last updated at Posted at 2023-03-31

AIに画像を書かせて定期的に更新されるフォトフレームを作りたい!!

raspberry pi 4でStable Diffusionを動かしてみる(画像自動生成&更新フォトフレームの作成)その2

の続きになります。

ここまで作業した内容

ここまでにStable Diffusionを使った画像生成と、
inky impressionへの画像描画がPythonで実行できるようになりました。

なのでその2つを統合してフォトフレームとして、放置していても画像が生成/表示され続けるものにしたいと思います。

構築作業1:プロジェクトディレクトリの作成

ホームディレクトリにプロジェクトフォルダを作り、そこに必要資材を構築していきます。

$ cd ~/
$ mkdir aiproject

// 画像保管用
$ mkdir aiproject/photo
$ cd aiproject

Python初心者ですがフォトフレーム用のコードを書いてみました。

$ vi aiPhotoFrame.py
aiPhotoFrame.py
from diffusers import StableDiffusionPipeline, EulerDiscreteScheduler
from PIL import Image
from inky.inky_uc8159 import Inky
from datetime import datetime
import time

model_id = "stabilityai/stable-diffusion-2"
scheduler = EulerDiscreteScheduler.from_pretrained(model_id, subfolder="scheduler")
pipe = StableDiffusionPipeline.from_pretrained(model_id, scheduler=scheduler)
pipe = pipe.to("cpu")
prompt = "space cat  Anthropomorphized cat, casting evil spell, magic the gathering artwork, D&D, fantasy, cinematic lighting, centered, symmetrical, highly detailed, digital painting, artstation, concept art, smooth, sharp focus, illustration, volumetric lighting, epic Composition, 8k, art by Akihiko Yoshida and Greg Rutkowski and Craig Mullins, heroic pose, oil painting, cgsociety, magic lab"
directory = "/home/pi/aiproject/photo/"

def makeArtWorker():
  try:
    # inky impression用に画像サイズを最適化(ここは64の倍数のピクセルのみ指定可能)
    image = pipe(prompt, height=448, width=640).images[0]
    date = datetime.now().strftime("%Y%m%d_%H%M%S")
    path = directory + date + ".png"
    image.save(path)
    time.sleep(1)
    displayArtWorker(path)
    
  except Exception as e:
    print("makeArtWorker error", e)
    time.sleep(10)

def displayArtWorker(photoPass):
  try:
    img = Image.open(photoPass)
    w, h = img.size
    h_new = 448
    w_new = int((float(w) / h) * h_new)
    w_cropped = 600
    img = img.resize((w_new, h_new), resample=Image.LANCZOS)
    x0 = (w_new - w_cropped) / 2
    x1 = x0 + w_cropped
    y0 = 0
    y1 = h_new
    img = img.crop((x0, y0, x1, y1))
    inky = Inky()
    # saturation 彩度
    saturation = 0.5 
    inky.set_image(img, saturation=saturation)
    time.sleep(1)
    inky.show()
    makeArtWorker()
  except Exception as e:
    print("displayArtWorker error",e)
    time.sleep(10)

makeArtWorker()

実行するとまず画像生成が走り、終わるとその画像をinky impressionに描画させるという一連の流れをループするだけの処理になっています。

スクリーンショット 2023-03-31 19.11.34.png

これで数時間まつとが更新されるフォトフレームが完成しました!

あとは電源が入った際に自動起動させたいので、

$ crontab -e

で最後の行に以下を追加しました。

@reboot python3 /home/pi/aiproject/aiPhotoFrame.py

これで起動すれば勝手に動いてくれると思います。

構築作業2:仕上げ

中身は無事にできましたがこのままだと飾りにくくそして、Raspberry Piの発熱ですぐにでも壊れてしまいそうなので外側も作っていきます。

まずファンを2つ購入しました。

こちらを組み込める筐体をFusion360で作っていきます。
スクリーンショット 2023-03-31 19.27.42.png

そしたらこれをdxfにしてレーザ加工していきます。(一応データも置いておきます)
https://drive.google.com/file/d/1XjsZMNlUbNHcT4E5DEM1hWlE9doUeUxR/view?usp=share_link

レーザー加工機は以下の記事に書いてるものを使っていて、カットする素材はMDFの2.5mm厚のものを使います。

加工が終わったらグルーガンとかで固定しつつ完成したものがこちらです。

20230330_230819 (1).JPG
20230330_231117 (1).JPG

ファンの電源はinky-impressionのここから5[v]を引きました。
スクリーンショット 2023-03-31 19.37.58.png

ファンを2つつけたこともあってかなり騒音ですが冷えてる感じがします、、!

この記事は以上です。

0
3
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
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?