見出し画像

AI を自分好みに調整できる、追加学習まとめ (番外編 : データセットの集め方について)

 こんにちはこんばんは、teftef です。今回は主の追加学習用のデータセットの集め方と追加学習モデルを使えるようにした話について書いていきます。それでは行きます。

 『追加学習まとめ』の記事で書いたように追加学習をするために多くのデータを収集する必要があります。特にファインチューニング、転移学習、は多くのデータを必要とします。そのため学習元となる画像を大量に用意する必要があり、持っていないのであれば集めてこなければなりません。数千枚の画像データを持っている方なんか少ないと思います。主はもちろん持っていなかったので、何か他の方法を考えました。

データセットの集め方

 Web スクレイピングで持ってくる。という方法はおそらく楽なやり方ですが、商用利用したり公開したりするときに著作権が厳しいです。何よりほかの方のデータを引用なしに勝手にとってくるのはなんか個人的にやりたくなかったです。そこで今回は画像生成 AI である Nijijourney , Midjourney の生成した画像を使いました。AI がつく歌画像を使って AI を学習させるのはなんか違和感がありますが、好みの絵柄の画像大量に用意するとなるとこれが一番手っ取り早いのかもしれません。

Midjourney , Nijijourney 

 こちらのサイトが Midjourney と Nijijourney です。それぞれ discord サーバーがあるので、それに加入して画像生成をします。Midjourney もしくは Nijijourney の bot に対して /subsribe とコマンドを打つと URL が送信され、それをクリックすると以下のようにプラン選択の画面になります。主は数千枚の画像を生成したいので1か月 30$の無制限プランに加入しました。

画像を生成

  Midjourney , Nijijourney は4分割の画像が生成されます。アスペクト比が
1:2 , 2:3 , 3:2 のパターンがあり --ar コマンドで指定できます。この画像がを 4 分割すると 4 枚に増やすことができます。なので最初はいろんな Prompt を試して、400枚ほどの 4 分割画像を生成し、これを分割して 1600 枚にします。

画像をダウンロード

 生成した画像は Archive でダウンロードできます。

右上の ⊕ ボタンで全選択できます。

分割

 続いてダウンロードしてきた画像を分割します。今回は 4 分割した画像のみを選んで分割します。upscale された画像は今回は除外します。separate.py を書いておきます。

import cv2
import glob
import re
import os
import numpy as np
from PIL import Image
"""
15分で書いたコードだから雑なのは勘弁
dir構成(#dirの名前は指定の通りにしてね!)
datasets
    |
    result #結果の出力
    data   #この中に画像を全て入れる
    separate.py

1024*1024、4つ切り画像を4分割します。
"""

cnt=0

def separate(path):
    global cnt
    img = cv2.imread(path)
    img2 = Image.open(path)
    # print(img.shape[0],img.shape[1])
    height,width=img.shape[0],img.shape[1]

    r,g,b=0,0,0
    for i in range(0, height//2//100*100,5):
        r+=img2.getpixel((i,height//2))[0]-img2.getpixel((i,height//2-1))[0]
        g+=img2.getpixel((i,height//2))[1]-img2.getpixel((i,height//2-1))[1]
        b+=img2.getpixel((i,height//2))[2]-img2.getpixel((i,height//2-1))[2]
    # print(r/100,g/100,b/100)

    if abs(r/100)<10 and abs(g/100)<10 and abs(g/100)<10:#輝度の変化がない→分割しない
        path
    else : 
        cnt+=1
        height, width, channels = img.shape
        # print("./result/tl_"+path[7:])
        clp = img[0:height//20:width//2]     
        cv2.imwrite("./result/tl_"+path[7:], clp)   

        clp = img[0:height//2, width//2:width]     
        cv2.imwrite("./result/tr_"+path[7:], clp)   

        clp = img[height//2:height, 0:width//2]     
        cv2.imwrite("./result/ul"+path[7:], clp)   

        clp = img[height//2:height, width//2:width]     
        cv2.imwrite("./result/ur"+path[7:], clp)


def main():
    l = glob.glob('./data/*.png')##取得
    # print(l)
    global cnt
    for i in l:
        separate(i)
    print("分割枚数:",cnt)


if __name__ == "__main__":
    main()

 このコードで 4 分割しています。
ファイル構成は
・data …  ダウンロードしてきた画像
・result ... 結果を保存 (作っておく)
・separate.py … このコード
にして python separate.py でコード実行すると、4分割された画像のみを選んで 4 つに分けてくれます。(たまにミスることもある)

ファインチューニング

 続いてこのデータを Google Drive にアップロードします。今回は 1800 枚程度の画像を用いて、Stable Diffusion 1.5 二ファインチューニングしました。こちらの記事の通りに従ってファインチューニングしました。

ckpt から Diffusers の変更

 ファインチューニング後の ckpt は Diffusers 形式にも対応させるためにこちらのコードを使って Diffusers 形式に変換しました。

 これは今度詳しく記事を書きます。GPUは使用しないのですが、 ckpt ファイルが大きいとメモリを食うので 32 GB あると安心かもせれません。(5 GB 以上だとメモリ 16 GBでは足りない)

ファインチューニングモデルを試す

 今回ファインチューニングしたモデルを Google Colab で使用できるようにまとめました。852話様二階堂様Plat 様の協力を頂き、モデルを提供していただきました。

 ファインチューニングによってそれぞれの作者の作品の Style が色濃く反映されているのでいつも使っている Prompt を入れても違う Style が出力されるのが面白いです。

↓ファインチューニングモデルを使用できるようにしたもの

最後に

 最後まで読んでいただきありがとうございました。最後に少し宣伝です。主のteftefが運営を行っているdiscordサーバーを載せます。このサーバーではMidjourneyやStble Diffusionのプロンプトを共有したり、研究したりしています。ぜひ参加して、お絵描きAIを探ってみてはいかがでしょう。(teftef)

この記事が気に入ったらサポートをしてみませんか?