Google Colabのpix2pixスクリプトを自前で作成した画像データを用いて実行させた

## 概要

Google Colabのpix2pixのスクリプトに、自前で用意した学習用画像データを渡して実行した。
学習用画像は、プログラムを作成してpix2pixのスクリプトに合わせて準備した。

https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/tutorials/generative/pix2pix.ipynb


### デフォルトで用意されている画像を確認
自分で学習データを用意する前に、Google Colab内でロードされているデータセット「facades.tar.gz」をダウンロードして中身の画像を確認した。

たてよこ256pxの画像が左が出力画像(真の画像)、右が入力画像の組み合わせで結合されていた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284235/e8a1222c-fc74-fdfa-c84e-20d7dff13605.png)


フォルダ構成は、testフォルダに106枚のjpg、trainフォルダに400枚、valフォルダに10枚の画像が入っていた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284235/02aebd95-b713-13ef-c6d3-77498786a6e8.png)

### 自分で用意した画像

デフォルトで用意されている画像と同じサイズ、同じ構成（左が出力画像、右が入力画像）になるように変換するプログラムを作成する。
変換もとの画像は、次のものを使用した。

https://www.kaggle.com/datasets/splcher/animefacedataset

以下の順で変換するプログラムを作成して、フォルダ内に配置した画像にたいして処理を実行した。

* 画像を256x256にリサイズ。出力画像とする。
* リサイズ画像を白黒画像
* 白黒画像から輪郭をとる
* リサイズ画像と輪郭画像を結合


元の画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284235/bc35bb2d-a3be-e78f-b5c6-7e164072de6a.png)

作成した学習用の画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284235/30872f18-44b1-d868-6efa-7e4c162100fa.png)

使用したプログラムは以下のものでgocvを使用した。

```go
package main

import (
	"fmt"
	"image"
	"image/draw"
	"image/jpeg"
	"io/ioutil"
	"os"

	"gocv.io/x/gocv"
)

func main() {
	inputdir := "./images/"
	out := "./outdata/"

	imgSize := 256
	outImgWidth := 512
	outImgHeight := 256

	fmt.Println("image convert start")
	files, err := ioutil.ReadDir(inputdir)

	if err != nil {
		panic(err)
	}

	// エッジ抽出の閾値
	edge_thresh := 40
	for _, file := range files {

		filename := inputdir + file.Name()
		// 画像のリサイズ
		resizeMat := gocv.IMRead(filename, gocv.IMReadAnyColor)
		gocv.Resize(resizeMat, &resizeMat, image.Point{imgSize, imgSize}, 0, 0, gocv.InterpolationDefault)
		// グレースケールさせてからエッジ抽出
		gray := gocv.NewMat()
		gocv.CvtColor(resizeMat, &gray, gocv.ColorBGRToGray)
		edge := gocv.NewMat()
		gocv.Canny(gray, &edge, float32(edge_thresh), float32(edge_thresh*3))

		// 画像の結合　左：リサイズ　右：エッジ抽出
		outImg := image.NewRGBA(image.Rect(0, 0, outImgWidth, outImgHeight))
		resizeImg, _ := resizeMat.ToImage()
		rectLeft := image.Rect(0, 0, imgSize, imgSize)
		draw.Draw(outImg, rectLeft, resizeImg, image.Point{0, 0}, draw.Over)

		edgeImg, _ := edge.ToImage()
		rectRight := image.Rect(imgSize, 0, imgSize+imgSize, imgSize)
		draw.Draw(outImg, rectRight, edgeImg, image.Point{0, 0}, draw.Over)

		// 画像の保存
		outname, _ := os.Create(out + file.Name())
		qt := jpeg.Options{
			Quality: 100,
		}
		err6 := jpeg.Encode(outname, outImg, &qt)
		if err6 != nil {
			fmt.Fprintln(os.Stderr, err6)
			return
		}

		resizeMat.Close()
		gray.Close()
		edge.Close()
	}

	fmt.Println("image convert end")
}
```

testフォルダに100枚。trainフォルダに1000枚いれてfacades.tar.gzに圧縮した。valフォルダはColab内で使用されてなさそうなので削除した。


### S3に配置

Goolgle Colabからダウンロードさせるため、作成したfacades.tar.gzをS3に配置し、access control listを編集してアクセス可能なように、Everyone (public access)にReadを設定した。Colab側に貼り付けるため、Object URLをメモっておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284235/5f0b2e69-56d6-fcd1-d4d6-9e5a5f3c1bfb.png)


###  画像ダウンロード先の書き換え

Colab側の学習画像ダウンロード先のURLを、メモっておいたs3のObject URLに書き換えて、実行させた。

下は書き換え済み
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284235/feca1836-ee6e-e37f-133d-da5e0a5eeaa7.png)


### 学習結果

最終的な学習結果は、次のような画像が生成された。テスト画像のほうも似たような感じだった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284235/22d47bc6-be7c-68ca-7cf6-9e6059e2d376.png)

training_checkpointsフォルダ配下に、学習済モデルができているので、googleドライブにコピーしてからダウンロードした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284235/1ef70fcd-621f-75e2-375b-5bc8cc7c2c92.png)