ハッカソンでイラスト修正AIを作ってみたかった話

# 1. はじめに
その辺の学生です。
私が所属している部活動がピクシブ株式会社様の協賛のもとハッカソンを開催しまして、自分も出場しました！

https://x.com/pixiv_corp/status/1864218084682461636

↑このハッカソン

なお、本記事は
チーム copilust(実は本来はcopillustだった)
というイラスト支援ツールの作成を行ったチームのプロダクトの制作過程などなどをまとめた記事になります。
雑記:技術=7:3くらいを想定していますので悪しからず。

https://x.com/c0demattari/status/1871194322538033660
↑このプロダクトの話をするよ

ありがたいことにピクシブさんから優秀賞を頂きました！嬉しい！！！！

# 2. 作りたいもの、作ったもの
## 2.1 動機
まず、全人類絵を描けるようになりたいという欲望を持っているのは自明です。描けるようになりたくない人間なんて存在しません。
そんな、絵が上手くなりたい人に向けたイラスト上達支援ツールの作成を目指します。

とは言っても、画力の上達をどのように支援するのか。
そこで、私たちのチームは自分の経験上ほとんどの人が通るイラスト上達の壁に注目してみることにします。

ここで言うイラスト上達の壁とは、
#####  一人で描いていると自分の絵の違和感に気づかないor違和感に気づいても修正できない。
になります。
どうでしょうか、絵を描いている方は結構心当たりのある課題じゃないでしょうか。
自分がかつてそうだったり、イラストを教えているとこのような壁にぶち当たる人を結構見たりします。
今回はこの問題に焦点を当てて、解決できるようなプロダクトを作りたいという思いで制作を行いました。

## 2.2 作りたいもの
では具体的にどのようなものを制作するのか。
(~~絵師側の心情など~~)色々考慮した結果、イラストを入力させ、そのイラストの構図を推定した上でイラストのバランスの是正を行うアプリにします。

ここで重要なのは、イラストの”**修正**”を行うことが目的であり、このツールを使うだけで完成品のイラストを生成できちゃうみたいなものではありません。
そうですね、作るものはNOT画像生成AI、YES画像修正AIです。

## 2.3 作ったもの
二週間弱という短い期間の中で作りたいもの全てを完成させれるわけがなく、、
初めから全てを作る想定ではなく、ここまで作りたい！となる機能を段階分けして実装していく風に考えて制作していました。ハッカソンらしいプロダクトの作り方ですね。

実際に実現可能性として以下のようにまとめていました。
* 最低限作れそうなもの
    * 構図、ポーズを取得するモデルは存在するので、そこから描いた画像の修正点を提案する機能
* 期間内に作りたいもの
    * 上記の修正案の画像を出力する
* できたら嬉しいもの
    * 構図の修正も行なった画像の生成

このうち、実際に作れたのは...
#### 最低限作れそうなものの半分！！！！
AI開発恐ろしい...。
正確には、構図の推定とそれを利用した修正点を掴むためのツールをこちらで用意する形となりました(重心などなど)。
実質ハッカソンの期間内に生み出せた進捗はイラストの構図推定のみ...。
それでもデモを見せれるだけのものを制作できたのでなんとかなりました。

## 2.4 制作の過程
まず制作するのは構図の推定ということで、どのような方針で作っていくか。
これに関しては、自分のイラストの経験や実装難易度を考えて、イラストに対して骨格の推定を行うことで解決します。
また、修正点を見つけるために体の比率など様々なものに応用しやすいことも骨格推定を選んだ理由だったりします。

まず、骨格推定といえば[Openpose](https://github.com/CMU-Perceptual-Computing-Lab/openpose)というモデルがあります。
本来は人間の骨格のトラッキングだったりに使われるものですが、試しにイラストに使うとどうなるかやってみる。
結果は全く反応しない！そらそうといえばそらそうですね。
この段階で少なからず察してはいましたがリアルな人間とイラストの人間には想像の数十倍くらいの差がありました。

次に、Openposeに教師データを食わせてイラストに対応させてみようとしました。
教師データには[これ](https://github.com/dragonmeteor/AnimeDrawingsDataset)を使いました。イラスト画像と画像に対応するキーポイント(鼻、目、肩などの骨格を取るための点)が一緒になっているので学習しやすいことが選出理由です。
大体数千程度のイラストを教師データとして雑に放り込んでみましたけど...ダメでした。全く関係ない部分にキーポイントを出力し始めました。
原因としては、教師データの与え方がよくなかったか、そもそもデータが少ないか等々...考えられるものは色々あります。
これら未知の原因や教師データの不足などどうしようもない原因に当たった時のことを考えて早々に案を変更することに。

なんとか先行事例を探してそれに倣うのが一番早いのではないかと考え、一旦闇雲に作業するのではなく論文などを当たってみる。
すると、構図推定だけでなく動機まで近い論文を発見！[その論文](https://ipsj.ixsq.nii.ac.jp/ej/?action=pages_view_main&active_action=repository_view_main_item_detail&item_id=229999&item_no=1&page_id=13&block_id=8)を参考にすることに。
読んでみると、[bizarre-pose-estimator](https://github.com/ShuhongChen/bizarre-pose-estimator/tree/main)というモデルを使用している様子。このモデルの論文を読んだ感じ自分たちが作りたいものにぴったりなので採用！
...して解決だと思ったのですが、READMEの通りに動かす環境がなく、自力で調整して動かそうとしたのですが、謎のエラーにより動作しない。
haggingfaceからモデルの使用ができるそうですが、リポジトリのIssueにあるように、正常に動作しないらしく...。
動かせるなら万事解決でしたが、残念ながら今回のハッカソンでは使えなさそうです。他の解決策を探しましょう。

今までの方策とは一風変わって、生成AIの中のstable diffusionというモデルがあり、これを派生したcontrolnetというものがあります。その中に、openposeと同じような機能を持つものがあり、それを利用することで骨格推定を行なってみます。
それほど精度は高くないですが、イラストに対してある程度反応するようです。
ハッカソンの残り時間などを考慮して、これを採用することにしました。
デメリットとしては、今まではキーポイントの座標を推定することで骨格推定しているのですが、生成AIでの手法は拡散モデルなため座標などを推定せずに行なっているせいで骨格推定を行えても比率などを取ることが出来ないというものがあります。
これの影響でハッカソンでイラストの修正はともかく、比率などの方向性で修正案を提示するのが難しくなってしまいます。そのため、具体的な修正案の提示をするのは諦め、比較的座標によらない重心やパースの表示、使用している色を骨格推定と同時に動かせるように実装することにしました。

# 3. 終わりに
AI開発を短い期間で行うとなると、かなりモデルの学習だったり使えるものの選定などで困ることになりました。長期間での開発には向いてるし、最終的に見栄えのあるプロダクトを作れると思いますが、ハッカソンでの戦略としてはいかに簡単に精度の良いものを作った上で動作させるかが勝負の鍵だなと感じました。
これからもこのプロダクトを作っていって、本来作りたかったものを完成させれるようにしたい！！