tag:crieit.net,2005:https://crieit.net/tags/DeepLearning/feed 「DeepLearning」の記事 - Crieit Crieitでタグ「DeepLearning」に投稿された最近の記事 2021-09-05T02:48:18+09:00 https://crieit.net/tags/DeepLearning/feed tag:crieit.net,2005:PublicArticle/17254 2021-05-25T03:18:42+09:00 2021-09-05T02:48:18+09:00 https://crieit.net/posts/AI-60abee023cb44 夢を掴むため駆け抜けろ! ウマ娘達よ!ニャッー🐈【AIを学べる簡単なゲーム】 <p>どうも!<br /> 最近、同期の間で、<strong>動きがセクシーとささやかれている</strong>私です👋</p> <p>さて、巷では<strong>ウマ娘</strong>🐎なるウマを育てる育成ゲームが流行っているそうで…<br /> そこで私も<strong>猫を大量に育成</strong>し最強の猫、ヌッコイーターを育て上げたので今回記事に残しますぎょぴ。</p> <p>今回はお手軽に<strong>AI</strong>を感じられるゲーム(?)について少し紹介したいと思うのにゃー!</p> <p><strong>※画像をクリックで動く画像があるからぜひクリックしてみてにゃ~</strong></p> <hr /> <h4 id="v目次にゃv"><a href="#v%E7%9B%AE%E6%AC%A1%E3%81%AB%E3%82%83v">v目次にゃv</a></h4> <p>1.AIについて少々<br /> 2.今回やること<br /> 3.概要<br /> 4.や゛って゛み゛た゛ー(秘密道具をだす効果音は各自で想像してください)<br /> 5.結論</p> <hr /> <h4 id="AIについて少々"><a href="#AI%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E5%B0%91%E3%80%85">AIについて少々</a></h4> <p>昨今、大きなトレンドとなっているAIですが、みなさんはAIについて正しく理解している猫か~?<br /> 実は某にゃんこ型ロボット、ドラ〇もんのように万能なAIは存在しないぎょぴー…</p> <p>最近は「AIを使った学習支援システムを…」や「AIを使って最適な商品を…」なんて広告でよく見かけるけど、私からすれば、それはただの<strong>条件分岐にかけて最適解を導き出しているに過ぎない</strong>きんぎょ。<br /> これは<strong>自分で考えている訳ではなく</strong>て、ただルールブックに従ってあみだくじをしただけぎょぴね…<br /> この機会にAIの認識をただすと良いかもねこ~。</p> <hr /> <h4 id="今回やること"><a href="#%E4%BB%8A%E5%9B%9E%E3%82%84%E3%82%8B%E3%81%93%E3%81%A8">今回やること</a></h4> <p>今回はWEBにあがっている簡単なAI(深層学習)を使ったゲームをするぎょぴよ!<br /> 実はブログ用のAIネタはたくさんあるのだけど、どれも時間がかかってしまうので、今回は簡単にゲームでご紹介しますぎょぴぼー。</p> <hr /> <h4 id="概要"><a href="#%E6%A6%82%E8%A6%81">概要</a></h4> <p>さて、今回はこの<a target="_blank" rel="nofollow noopener" href="https://www.thebigcb.com/projects/CreatureCreator/">サイト</a>の<strong>Creature Creator</strong>を試すにゃ</p> <p>このゲームは<br /> ・簡単なモデルを作成する<br /> ・関節や可動域の設定をする<br /> ・<strong>たくさんのモデルを配置し適当に動かす</strong><br /> ・画面左から右へレーザーが迫り、モデルにあたると死亡<br /> というゲームきんぎょ~</p> <p>AI要素としては<br /> レーザーにあたらず、1番右まで動いたモデルを参考に<strong>学習</strong>し、<strong>世代を重ねて</strong>より右へ動くモデルの動きを<strong>学び</strong>、<strong>再現</strong>するところにあるキツネ~。</p> <p>これは<strong>遺伝的アルゴリズム(GA</strong>)といわれる手法を用いているきんぎょっ<br /> 環境に応じて進化していき、そこで生まれる突然変異による進化と比較し、より最適な方を選択…という風に生き残っていく手法ぎょぴぼー</p> <hr /> <h4 id="や゛って゛み゛た゛ー"><a href="#%E3%82%84%E3%82%9B%E3%81%A3%E3%81%A6%E3%82%9B%E3%81%BF%E3%82%9B%E3%81%9F%E3%82%9B%E3%83%BC">や゛って゛み゛た゛ー</a></h4> <p>まずはモデルをつくるぎょぴー🐡<br /> 今回は大好きなヌッコを作ってみたきんぎょ~!</p> <h5 id="1.モデル作り"><a href="#1.%E3%83%A2%E3%83%87%E3%83%AB%E4%BD%9C%E3%82%8A">1.モデル作り</a></h5> <p><a href="https://crieit.now.sh/upload_images/2311c3031f1215d968f42e9bd3d3c1f160abde2d5c742.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/2311c3031f1215d968f42e9bd3d3c1f160abde2d5c742.png?mw=700" alt="c01" /></a><br /> 胴体、手足、顔、耳、しっぽを作って、関節の可動域を選択するにゃー<br /> <a href="https://crieit.now.sh/upload_images/7a415954d0e506de9dc4a0e1028136a360abde4e1da8a.gif" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7a415954d0e506de9dc4a0e1028136a360abde4e1da8a.gif?mw=700" alt="g01" /></a><br /> かわE (⁎˃ᴗ˂⁎)</p> <hr /> <h5 id="2.お勉強させる猫①"><a href="#2.%E3%81%8A%E5%8B%89%E5%BC%B7%E3%81%95%E3%81%9B%E3%82%8B%E7%8C%AB%E2%91%A0">2.お勉強させる猫①</a></h5> <p>続いて、さっき作った<strong>ヌッコイーター1号店</strong>を大量に降らせて、<br /> ”<strong>昇天するまで歩かせる→一番歩いた優秀な子を集める→昇天するまで(以下略</strong>”を繰り返すぎょぴぼー。<br /> <a href="https://crieit.now.sh/upload_images/bf51c34133905508b235453092646b2160abe0f029c88.gif" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/bf51c34133905508b235453092646b2160abe0f029c88.gif?mw=700" alt="g02" /></a><br /> ※初めなので全然歩きません😢まだ脳みそは1歳児くらいです。<br /> ちなみに画面上のパラメーターは<br /> <strong>Generation</strong> → <strong>世代</strong><br /> <strong>Best Score</strong> → <strong>今まで歩いた最長距離</strong><br /> ですにゃー。<br /> <a href="https://crieit.now.sh/upload_images/4cf0dc760c5ffef3496a5c062d8f28bd60abe1f46932b.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4cf0dc760c5ffef3496a5c062d8f28bd60abe1f46932b.jpg?mw=700" alt="c02" /></a><br /> ヌッコイーター1号店くんの記録は<br /> 世代 →→→ 33<br /> 最長距離 → 3.35<br /> でした。う~ん、伸びが悪いきんぎょね…( ̄д ̄) エ-</p> <hr /> <h5 id="3.モデル改変"><a href="#3.%E3%83%A2%E3%83%87%E3%83%AB%E6%94%B9%E5%A4%89">3.モデル改変</a></h5> <p>あまりに学習が進まないので、そもそもの<strong>モデルに問題あり</strong>と判断しましたねこ…😿<br /> 20世紀の発達した我が文明の力をフル活用して新たな生命を吹き込みますにゃ!<strong><em>えい!!</em></strong><br /> <a href="https://crieit.now.sh/upload_images/ca6b6aa41dfa7a07f07f7518c6af3ade60abe3065f20d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ca6b6aa41dfa7a07f07f7518c6af3ade60abe3065f20d.png?mw=700" alt="c003" /></a><br /> じゃじゃぁーん!!!<strong>20世紀の発達した文明の利器</strong>、<strong>タイヤ</strong>を付けましたきんぎょ!!<br /> これで早く走れるね!ヌッコイーター2号店くん!!やったね!٩(๑> ₃</p> <hr /> <h5 id="4.お勉強させる猫②"><a href="#4.%E3%81%8A%E5%8B%89%E5%BC%B7%E3%81%95%E3%81%9B%E3%82%8B%E7%8C%AB%E2%91%A1">4.お勉強させる猫②</a></h5> <p>さて、前回と同様に大量のヌッコイーター2号店くんを降らせて、進化、突然変異を観察しますねこ🐈<br /> <a href="https://crieit.now.sh/upload_images/1379b1cfac7218ed9097eaf0da52d96660abe5e1d4f44.gif" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/1379b1cfac7218ed9097eaf0da52d96660abe5e1d4f44.gif?mw=700" alt="g3 " /></a><br /> なんと、<strong>世代数1にして前進する猛者</strong>が生まれましたきんぎょ!!<br /> やはり、<strong>ねこ+タイヤ</strong>は素晴らしい発明だったようだ…</p> <hr /> <h5 id="5.a few minutes later"><a href="#5.a+few+minutes+later">5.a few minutes later</a></h5> <p>その後、<strong>約50世代</strong>まで学習させましたねこ🐱<br /> それでは<strong>ハイライト</strong>をご覧くださいねこ~。<br /> <a href="https://crieit.now.sh/upload_images/bb6b5c05feac37874fa5664fa2dd896660abe74338b2e.gif" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/bb6b5c05feac37874fa5664fa2dd896660abe74338b2e.gif?mw=700" alt="g05" /></a><br /> 学習の結果、<strong>タイヤを転がすのではなく、自分を転がす</strong>が1番効率の良い進み方だったみたいですぎょぴぼー<br /> <a href="https://crieit.now.sh/upload_images/fdc313a7fee5b05e1677a08c04445a2860abe7d1962f7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/fdc313a7fee5b05e1677a08c04445a2860abe7d1962f7.png?mw=700" alt="結果" /></a><br /> 結果、ヌッコイーター2号店くんが<br /> 世代 →→→ 44<br /> 最長距離 → 364.15<br /> で1号店くんの記録を大きく塗替えたのにゃー!!(世代数が違うから実験としてどうなんだ)</p> <hr /> <h4 id="結論"><a href="#%E7%B5%90%E8%AB%96">結論</a></h4> <p><strong>猫は4本足で走るより、丸まって自分自身が転がった方が早い!</strong><br /> <a href="https://crieit.now.sh/upload_images/7b53731d1581f47b3a04e9b65d73ba2d60abe8a906644.gif" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7b53731d1581f47b3a04e9b65d73ba2d60abe8a906644.gif?mw=700" alt="g06" /></a><br /> ↑クリックで走ります↑</p> <hr /> <p>はい。ごめんなさい。<br /> 今回は難しく捉えがちなAIについて興味を持っていただけたでしょうか?<br /> 実は<strong>こんな簡単で馬鹿馬鹿しいことにAIが使えて、身近に出来る</strong>なんて素敵だと思いませんか?<br /> 是非、みなさんで僕の<strong>ヌッコイーター2号店くん</strong>の記録を超すクリーチャーを作ってみてくださいきんぎょ!</p> <p><em>※ブログのデータサイズの制限により、gifがかなりカクついたり、色が変です。<br /> 是非、ご自身の環境で試して見て下さい!<br /> ※ゲームができる<a target="_blank" rel="nofollow noopener" href="https://www.thebigcb.com/projects/CreatureCreator/">サイト</a>自体が少し重いようでプレイ可能になるまで時間やリロードがいるかも…</em></p> <p>今回はここまで🐾<br /> 今回はなんの捻りなく、かなり適当な記事で申し訳ないですが、少しでも楽しんでいただけて、<br /> AIに興味を持っていただけると嬉しく思います。</p> <p>次回も頑張るきんぎょー…</p> keito_woood tag:crieit.net,2005:PublicArticle/16216 2020-11-15T16:51:00+09:00 2020-11-19T10:35:05+09:00 https://crieit.net/posts/module-cupy-has-no-attribute-scatter-add 解決方法メモ_module 'cupy' has no attribute 'scatter_add'(ゼロから作るDeepLearning②) <h2 id="概要"><a href="#%E6%A6%82%E8%A6%81">概要</a></h2> <p>ゼロから作るDeepLearning 2 第4章で、train.pyを動かした際、下記エラーが出ました。</p> <pre><code class="console">module 'cupy' has no attribute 'scatter_add' </code></pre> <h2 id="原因"><a href="#%E5%8E%9F%E5%9B%A0">原因</a></h2> <p>cupyが新しすぎることが、原因だったようです。<br /> 私の場合、cupy 8.1でエラーが出ました。</p> <h2 id="対策"><a href="#%E5%AF%BE%E7%AD%96">対策</a></h2> <p>cupyのバージョンを、8.0より前にすることです。</p> <blockquote> <p><a target="_blank" rel="nofollow noopener" href=""https://github.com/explosion/spaCy/issues/5193"">spacy[cuda100] installs cupy-cuda100 8.0.0b1, which has a breaking change</a></p> </blockquote> <p>私の場合、7.0をインストールすることで、エラーがなくなりました。<br /> 例えば、下記コマンドを実行しました。</p> <pre><code class="shell">$ pip install cupy==7.0 </code></pre> pizza3900 tag:crieit.net,2005:PublicArticle/15584 2019-12-06T06:29:41+09:00 2019-12-06T06:29:41+09:00 https://crieit.net/posts/GCP-AutoML-12 GCPのAutoMLを使っていたら12万の請求がきてしまった話 <h2 id="はじめにGoogleCloudPlatformの運営の方々に感謝"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%ABGoogleCloudPlatform%E3%81%AE%E9%81%8B%E5%96%B6%E3%81%AE%E6%96%B9%E3%80%85%E3%81%AB%E6%84%9F%E8%AC%9D">はじめにGoogleCloudPlatformの運営の方々に感謝</a></h2> <p>GoogleCloudPlatformのAutoML(AutoML Vison)を使って学習モデルを作っていたら12万円の請求が来てしまいました...。</p> <p>AutoMLはとても便利で素晴らしいサービスですが、内容をしっかりと理解しないまま使っていると、私のように10万以上の請求が発生します(当たり前)。</p> <p>今回、私の確認ミスから高額の請求が発生しましたが、Googleg社のご好意で金額調整の適用処理をしていただきました。</p> <p>本当に感謝を申し上げます。ありがとうございました。</p> <p>今回の内容についてGoogleCloudPlatform側に公開してよいか確認したところ、構わないとお返事をいただいたので、AutoMLを使った開発者が、今後同じミスに陥らないために、この事案をアーカイブとして、残しておこうと思います。</p> <h2 id="AutoMLについて"><a href="#AutoML%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">AutoMLについて</a></h2> <p>AutoMLは、機械学習エンジニアでなくても、高度かつ高品質でカスタマイズされた機械学習モデルの構築が可能なGoogleが提供しているサービスです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://cloud.google.com/automl/?hl=ja">AutoML</a></p> <h3 id="AutoML Visionについて"><a href="#AutoML+Vision%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">AutoML Visionについて</a></h3> <p>すでにGCPには「Vision API」というサービスを提供していますが、これは事前にGoogleが学習させているモデルを使っているため、まだ学習していない写真・モノについては認識することができません。</p> <p>AutoML Visionは、ほぼノンプラミングで独自の画像認識モデルを作れ、そのモデルを使ったAPI公開することができるサービスです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://cloud.google.com/vision/automl/docs/?hl=ja">AutoML Vision</a></p> <h2 id="作ったもの"><a href="#%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE">作ったもの</a></h2> <p>今回はAutoML Visionを使ってウォーリーを探すモデルを作ることにしました。<br /> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147291/96693052-ff91-b0dc-dcd3-5fb91478bb42.jpeg" alt="10879641157221.jpg" /></p> <h4 id="元ネタ"><a href="#%E5%85%83%E3%83%8D%E3%82%BF">元ネタ</a></h4> <p><a target="_blank" rel="nofollow noopener" href="https://gigazine.net/news/20180809-wheres-waldo-finding-robot/">「ウォーリーを探せ!」のウォーリーを最短4.45秒で見つけて指し示すロボットが開発される</a></p> <h2 id="手順"><a href="#%E6%89%8B%E9%A0%86">手順</a></h2> <h4 id="1. ウォーリーの素材集め &amp; トリミング"><a href="#1.+%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AA%E3%83%BC%E3%81%AE%E7%B4%A0%E6%9D%90%E9%9B%86%E3%82%81+%26amp%3B+%E3%83%88%E3%83%AA%E3%83%9F%E3%83%B3%E3%82%B0">1. ウォーリーの素材集め & トリミング</a></h4> <p>ウォーリーを探せを3冊購入。全部で60程のウォーリーの顔のサンプルを取得。<br /> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147291/12dcf246-2731-1099-ef45-aa11e8ae766b.jpeg" alt="IMG_20191107_213803.jpg" /></p> <h4 id="2. GCPにプロジェクトを作成しAutoML Visionから「新しいデータセットの作成」"><a href="#2.+GCP%E3%81%AB%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97AutoML+Vision%E3%81%8B%E3%82%89%E3%80%8C%E6%96%B0%E3%81%97%E3%81%84%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90%E3%80%8D">2. GCPにプロジェクトを作成しAutoML Visionから「新しいデータセットの作成」</a></h4> <p><img width="1274" alt="スクリーンショット 2019-12-05 8.04.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147291/5ac820c0-7567-3e9b-7668-7043948bf769.png"></p> <h4 id="3. ウォーリーの画像データを整理して投入"><a href="#3.+%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AA%E3%83%BC%E3%81%AE%E7%94%BB%E5%83%8F%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E6%95%B4%E7%90%86%E3%81%97%E3%81%A6%E6%8A%95%E5%85%A5">3. ウォーリーの画像データを整理して投入</a></h4> <p><img width="908" alt="スクリーンショット 2019-12-05 7.59.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147291/2ee40cc5-200c-e894-2f07-49a31fd578f8.png"></p> <h4 id="4. マシンラーニング(2時間ほど)"><a href="#4.+%E3%83%9E%E3%82%B7%E3%83%B3%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%EF%BC%882%E6%99%82%E9%96%93%E3%81%BB%E3%81%A9%EF%BC%89">4. マシンラーニング(2時間ほど)</a></h4> <h2 id="できたもの"><a href="#%E3%81%A7%E3%81%8D%E3%81%9F%E3%82%82%E3%81%AE">できたもの</a></h2> <h3 id="完成!!"><a href="#%E5%AE%8C%E6%88%90%EF%BC%81%EF%BC%81">完成!!</a></h3> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147291/3e8c43c3-b65e-b276-a652-8520b0befc5e.png" alt="スクリーンショット 2019-11-08 10.02.46.png" /></p> <p>アウトプットとしては、画像をアップロードすると、ウォーリーのオブジェクトとして認識した位置を予想してくれる画像認識モデルが出来上がりました。学習モデルと同時に、APIを公開することも可能で、これを使い、何かアプリケーションを作ろうと思い、デプロイしたまま放置することにしました。</p> <h3 id="このモデルを作るためにかかった金額"><a href="#%E3%81%93%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E3%81%8B%E3%81%8B%E3%81%A3%E3%81%9F%E9%87%91%E9%A1%8D">このモデルを作るためにかかった金額</a></h3> <ul> <li>ウォーリーを探せ:3冊 1,485×3= <strong>¥4455円</strong></li> <li>AutoML Image Object Detection Online Prediction:<strong>¥7,944円(無料枠内なので実質0円)</strong></li> <li>AutoML Image Object Detection Model Training:<strong>¥4,628円(無料枠内なので実質0円)</strong></li> </ul> <p>※ マシーンラーニングについて、正確な時間は残っていないのですが画像60枚で3時間〜4時間だったと記憶しています。</p> <p><img width="935" alt="スクリーンショット 2019-12-05 8.27.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147291/72aa6277-094c-6ea6-1bdf-7a4b658bc358.png"><br /> 無料枠なのでしっかりと割り引かれています🙌</p> <h3 id="AutoML Visionの料金について"><a href="#AutoML+Vision%E3%81%AE%E6%96%99%E9%87%91%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">AutoML Visionの料金について</a></h3> <p><a target="_blank" rel="nofollow noopener" href="https://cloud.google.com/vision/automl/pricing?hl=ja">AutoML Vision料金</a></p> <div class="table-responsive"><table> <thead> <tr> <th align="left">画像分類</th> <th>無料</th> <th>有料</th> </tr> </thead> <tbody> <tr> <td align="left">トレーニング</td> <td>40 ノード時間まで無料(1 回限り)  </td> <td>*ノード時間あたり USD $3.15</td> </tr> <tr> <td align="left">デプロイメントとオンライン(個別)予測</td> <td>40 ノード時間まで無料(1 回限り)</td> <td>**ノード時間あたり USD $1.25</td> </tr> <tr> <td align="left">will</td> <td>will</td> <td>will</td> </tr> </tbody> </table></div> <div class="table-responsive"><table> <thead> <tr> <th align="left">画像分類</th> <th>無料</th> <th>有料</th> </tr> </thead> <tbody> <tr> <td align="left">トレーニング</td> <td>毎月最初のモデル 10 個については、アカウントごとに 1 ノード時間まで無料です。  </td> <td>以後のトレーニング時間については、1 時間あたり USD $20.00 の料金が発生します。</td> </tr> </tbody> </table></div> <p><img width="798" alt="スクリーンショット 2019-12-04 12.28.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147291/c0d2b69d-1523-d0a5-1ceb-68331c7961fb.png"></p> <p>※ 無料枠のプロモーションクレジットについてはGCPの管理画面からも確認することが可能です。</p> <h2 id="しばらく経って悲劇は起こった..."><a href="#%E3%81%97%E3%81%B0%E3%82%89%E3%81%8F%E7%B5%8C%E3%81%A3%E3%81%A6%E6%82%B2%E5%8A%87%E3%81%AF%E8%B5%B7%E3%81%93%E3%81%A3%E3%81%9F...">しばらく経って悲劇は起こった...</a></h2> <p>月末になりGoogleCloudPlatformをの金額が気になり確認してみました...。</p> <p><img width="551" alt="スクリーンショット 2019-12-02 16.29.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147291/a11a2af5-ad1a-4685-bef1-bf618d2a2cac.png"></p> <p>...?</p> <p>桁が一桁増えている...??</p> <p><img width="663" alt="スクリーンショット 2019-12-02 16.29.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147291/240375e3-c0e5-b9e5-47bc-e0360a670433.png"></p> <p><strong>...小計 ¥129,306円</strong></p> <p>ちょっとまってくれ。確認したときは確かに¥7,944円だったぞ...。すぐさま動かしていたプロジェクトを削除しました。</p> <p><img width="639" alt="スクリーンショット 2019-11-26 13.10.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147291/4bd77785-7d24-26b3-a4d0-caa2628a14b3.png"></p> <p>月末合計費用(予測)のグラフが凄まじいことに...😭(最初は何かのバグかと思った)</p> <h3 id="GCPサポートセンターに連絡"><a href="#GCP%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%82%BB%E3%83%B3%E3%82%BF%E3%83%BC%E3%81%AB%E9%80%A3%E7%B5%A1">GCPサポートセンターに連絡</a></h3> <p><a target="_blank" rel="nofollow noopener" href="https://support.google.com/cloud/contact/cloud_platform_billing?hl=ja">Google Cloud Platform の課金に関するサポート</a></p> <p>その日にすぐ、これまでの経緯をまとめてGCPのサポートセンターにメールをすると、その日に連絡がきました。</p> <blockquote> <p>プロジェクト「◎◎◎-◎◎◎」のAutoMLモデルが削除されてから48時間後、最終的な金額が確定されます。請求情報が更新され次第、担当部署に11月分請求金額の調整依頼を提出致します。進捗につきまして、11月26日 (火) に改めてご連絡させていただきます。</p> </blockquote> <p>指定の11月26日(火)に連絡がなかったので催促をしました。</p> <blockquote> <p>弊社担当部署に金額調整依頼を提出させていただきましたが、調整金額は高額になっているため、承認されるには長時間を要する可能性がございます。進捗につきまして、11月29日 (金)に改めてご連絡させていただきます。</p> </blockquote> <p>このときは祈ることしかできませんでした🙏</p> <h3 id="祈りの結果..."><a href="#%E7%A5%88%E3%82%8A%E3%81%AE%E7%B5%90%E6%9E%9C...">祈りの結果...</a></h3> <p>後日GCPのサポートセンターから連絡がありました...。</p> <blockquote> <p>弊社にて適用可能な金額調整は一度限りに対応になっております。今後はご利用頂きますGCPリソース全てに対してのご利用料金が発生いたしますので、ご留意願います。</p> </blockquote> <p><img width="933" alt="スクリーンショット 2019-11-27 17.07.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147291/865d9b92-7c08-8968-3d12-c7056dd97c81.png"></p> <p>料金表を確認したところ、調整金額が反映されていました😭<br /> Google社の方々、本当にありがとうございます🙇‍♂️</p> <p>最初に気づいてから、金額調整をしていただくまでの2週間は精神的に疲弊していました...。本当にありがとうございました。</p> <h2 id="今回の原因"><a href="#%E4%BB%8A%E5%9B%9E%E3%81%AE%E5%8E%9F%E5%9B%A0">今回の原因</a></h2> <p>今回は <code>AutoML Image Object Detection Online Prediction</code> に対して12万円の請求が発生してしまいました。</p> <p>マシンラーニングが終わった後にデプロイするかどうかをチェックすることができます。今回はどんなモデルが作られたのかを試したかったこともあり、チェックをつけてデプロイをしました。デプロイするとGPUノードを1つ使い続けるのです。これが今回の原因です。</p> <p><img width="779" alt="スクリーンショット 2019-12-05 17.41.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147291/9785ad31-a2be-3078-0ef4-eb59d56aadd4.png"><br /> 上にも書いていますが、デプロイ後に確認が終わったら<strong>「デプロイの解除を行う必要があります。」</strong></p> <p>完全に見落としていました...。</p> <h2 id="再発防止策"><a href="#%E5%86%8D%E7%99%BA%E9%98%B2%E6%AD%A2%E7%AD%96">再発防止策</a></h2> <h3 id="公式のドキュメントを読もう"><a href="#%E5%85%AC%E5%BC%8F%E3%81%AE%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%82%92%E8%AA%AD%E3%82%82%E3%81%86">公式のドキュメントを読もう</a></h3> <p>再発防止策としては、まずは「とりあえずやってみよう」ではなく、最初にドキュメントを読むことが大切だと思いました(当たり前)。そして、どんな仕組みなのか?料金体系はどうなっているのか?を公式ドキュメントを理解を深めることが大切です。(自分への戒め)</p> <h3 id="過去の失敗から学ぼう"><a href="#%E9%81%8E%E5%8E%BB%E3%81%AE%E5%A4%B1%E6%95%97%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%BC%E3%81%86">過去の失敗から学ぼう</a></h3> <p>料金体系が複雑でクラウド破産しそうなサービスを使う場合は、過去に失敗した人のブログや記事などを調べておくことによって、注意する点などがまとめられています。そういうったブログやQiitaの記事をまとめて読み、つまずきやすいポイントを事前に学んでおくのは有効かと思います。</p> <p><a target="_blank" rel="nofollow noopener" href="http://natsutan.hatenablog.com/entry/2019/06/02/151747">AutoMLで破産しないように気をつけたいポイント</a></p> <p>※ この方と同じ失敗をしてしまいました...😭</p> <h3 id="GCPの「予算とアラート」を使おう"><a href="#GCP%E3%81%AE%E3%80%8C%E4%BA%88%E7%AE%97%E3%81%A8%E3%82%A2%E3%83%A9%E3%83%BC%E3%83%88%E3%80%8D%E3%82%92%E4%BD%BF%E3%81%8A%E3%81%86">GCPの「予算とアラート」を使おう</a></h3> <p>GCPには「予算とアラート」という機能があります。アッパーの金額を決めて、指定した金額の割合に達したときのメールで通知をしてくれる機能があります。この機能を活用して、沢山メールが送るように設定しましょう。(金額に達したらサービスをストップする機能欲しいですね🙏もしくはさくらクラウドのような定額のサービスも切望🙏)</p> <p><img width="864" alt="スクリーンショット 2019-12-05 17.55.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147291/cf453986-f2c4-4128-0216-9e5a8a597d71.png"><br /> ↑予算の設定</p> <p><img width="945" alt="スクリーンショット 2019-12-05 18.19.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147291/40cce2b3-32bf-d87f-9e3e-1163e8b52b7b.png"><br /> ↑予算割合の設定</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>AutoMLはGoogleCloudPlatformの中でも特に料金が高く設定されているサービスです。そのため、使用する際は事前にしっかいと調べた上で使いましょう!</p> <h2 id="参考🙇‍♂️"><a href="#%E5%8F%82%E8%80%83%F0%9F%99%87%E2%80%8D%E2%99%82%EF%B8%8F">参考🙇‍♂️</a></h2> <p><a target="_blank" rel="nofollow noopener" href="http://natsutan.hatenablog.com/entry/2019/06/02/151747">AutoMLで破産しないように気をつけたいポイント</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://www.apps-gcp.com/cloud-automl-vision/">Cloud AutoML Vision が本当にノンプログラミングで使えるのか試してみた</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/iss-f/items/c93bd07b2413cb7f3507">AutoML Visionをためしてみた</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://gigazine.net/news/20180809-wheres-waldo-finding-robot/">「ウォーリーを探せ!」のウォーリーを最短4.45秒で見つけて指し示すロボットが開発される</a></p> フジワラ@CLOCK tag:crieit.net,2005:PublicArticle/14702 2018-12-30T23:51:11+09:00 2018-12-30T23:58:47+09:00 https://crieit.net/posts/AI-waifu2x-multi 画像・動画の解像度をあげてくれるAI「waifu2x-multi」を支える技術 <p>この記事は<a href="https://crieit.net/advent-calendars/2018/technology">個人開発サービスに用いられている技術 Advent Calendar 2018</a> の24日目です。</p> <hr /> <p><a href="https://crieit.now.sh/upload_images/b7cd2a7b0390f16e647143ecb198b14b5c28d9ba696b5.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b7cd2a7b0390f16e647143ecb198b14b5c28d9ba696b5.png?mw=700" alt="waifu2x_ogp_jp.png" /></a></p> <hr /> <p>こんにちは、2z(Twitter: <a target="_blank" rel="nofollow noopener" href="https://twitter.com/2zn01">@2zn01</a> )です。</p> <p>普段は会社員でWeb系の開発エンジニアとして働き、週末に趣味で個人開発をしています。</p> <p>昨年末に、画像・動画の解像度をあげてくれる「waifu2x-multi」というサービスを開発しました。</p> <p>■waifu2x-multi<br /> <a target="_blank" rel="nofollow noopener" href="https://waifu2x.me/">https://waifu2x.me/</a></p> <ul> <li>Before</li> </ul> <p><a href="https://crieit.now.sh/upload_images/b276150e28d0ae3f2595f098f39280945c28d9d887bf8.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b276150e28d0ae3f2595f098f39280945c28d9d887bf8.png?mw=700" alt="miku_small_noisy_lanczos3.png" /></a></p> <p>    ↓</p> <ul> <li>After</li> </ul> <p><a href="https://crieit.now.sh/upload_images/b347814fd79c210e5bfa6cced5ce00055c28d9f7d8951.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b347814fd79c210e5bfa6cced5ce00055c28d9f7d8951.png?mw=700" alt="miku_small_noisy_waifu2x.png" /></a></p> <hr /> <p>デモ動画は以下のYouTubeからご覧ください。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.youtube.com/embed/7O_BMgC0DjI">https://www.youtube.com/embed/7O_BMgC0DjI</a></p> <hr /> <blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">※今さらリリース報告です!画像をきれいに拡大する「waifu2x」というサービス/OSSがあります!一つ一つの画像を指定して変換するのが面倒なので、複数画像のアップロードに対応し、一括で変換できるサービスを作りました!!(2016年2月に)ぜひ使ってみてください!<a target="_blank" rel="nofollow noopener" href="https://t.co/REOo3XOEgV">https://t.co/REOo3XOEgV</a> <a target="_blank" rel="nofollow noopener" href="https://t.co/yTUh63Nvmw">pic.twitter.com/yTUh63Nvmw</a></p>— 2z@みんなのAI「AIメーカー」開発中 (@2zn01) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/2zn01/status/1033628537033437184?ref_src=twsrc%5Etfw">2018年8月26日</a></blockquote> <blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">※今さらリリース報告の第2弾です!画像をきれいに拡大する「waifu2x」ですが、動画対応させてリリースしました!!(2018年2月ぐらいに)動画のコマごとに拡大するため、めっちゃ時間かかりますが、このプレビューではGPUサーバを10台同時に立てて並列処理させてます!<a target="_blank" rel="nofollow noopener" href="https://t.co/cCDWUcaS2X">https://t.co/cCDWUcaS2X</a> <a target="_blank" rel="nofollow noopener" href="https://t.co/mSID2DjUE4">pic.twitter.com/mSID2DjUE4</a></p>— 2z@みんなのAI「AIメーカー」開発中 (@2zn01) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/2zn01/status/1033652915364233217?ref_src=twsrc%5Etfw">2018年8月26日</a></blockquote> <hr /> <p>この後に開発することになるAIメーカーはこの「waifu2x-multi」の開発を通して学んだことを活かして作っています。</p> <p>難易度的には、「 waifu2x-multi > AIメーカー 」だと思っているので、AIメーカーを1か月ほどでリリースできたのはこの開発をしてたところが大きいです。</p> <p>この記事では、この「waifu2x-multi」で使っている技術をまとめたいと思います。</p> <h2 id="作ったもの"><a href="#%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE">作ったもの</a></h2> <p>waifu2xというサービス/OSS(オープンソースソフトウェア)はご存知でしょうか?<br /> 簡単にいえば、AI(人工知能)を使って小さな画像を綺麗に拡大するサービスです。</p> <p>公式のwaifu2xは以下のURLでサービス提供されています。</p> <p><a target="_blank" rel="nofollow noopener" href="http://waifu2x.udp.jp/">http://waifu2x.udp.jp/</a></p> <p>また、GitHubでプログラムもオープンソースで公開されています。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/nagadomi/waifu2x">https://github.com/nagadomi/waifu2x</a></p> <p>私が作ったものは、「waifu2x」のOSS(オープンソースソフトウェア)へ以下の機能を追加した、公式とは別の派生サービスになります。</p> <ol> <li>複数ファイルのアップロード・拡大機能</li> <li>動画の拡大機能</li> <li>専有サーバによる高速な拡大処理</li> <li>サイズ制限の緩和</li> </ol> <p>こちらは以下のURLで公開しています。</p> <p>■waifu2x-multi (上記1のみ対応)<br /> <a target="_blank" rel="nofollow noopener" href="https://waifu2x.me/">https://waifu2x.me/</a></p> <p>■waifu2x-multi Pro (上記1~4のすべてに対応)<br /> <a target="_blank" rel="nofollow noopener" href="https://mng.waifu2x.me/">https://mng.waifu2x.me/</a></p> <h2 id="画面/利用イメージ"><a href="#%E7%94%BB%E9%9D%A2%EF%BC%8F%E5%88%A9%E7%94%A8%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8">画面/利用イメージ</a></h2> <p>デモ動画は以下のYouTubeからご覧ください。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.youtube.com/embed/7O_BMgC0DjI">https://www.youtube.com/embed/7O_BMgC0DjI</a></p> <h5 id="・まとめて一括変換"><a href="#%E3%83%BB%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E4%B8%80%E6%8B%AC%E5%A4%89%E6%8F%9B">・まとめて一括変換</a></h5> <blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">※今さらリリース報告です!画像をきれいに拡大する「waifu2x」というサービス/OSSがあります!一つ一つの画像を指定して変換するのが面倒なので、複数画像のアップロードに対応し、一括で変換できるサービスを作りました!!(2016年2月に)ぜひ使ってみてください!<a target="_blank" rel="nofollow noopener" href="https://t.co/REOo3XOEgV">https://t.co/REOo3XOEgV</a> <a target="_blank" rel="nofollow noopener" href="https://t.co/yTUh63Nvmw">pic.twitter.com/yTUh63Nvmw</a></p>— 2z@みんなのAI「AIメーカー」開発中 (@2zn01) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/2zn01/status/1033628537033437184?ref_src=twsrc%5Etfw">2018年8月26日</a></blockquote> <h5 id="・動画対応"><a href="#%E3%83%BB%E5%8B%95%E7%94%BB%E5%AF%BE%E5%BF%9C">・動画対応</a></h5> <blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">※今さらリリース報告の第2弾です!画像をきれいに拡大する「waifu2x」ですが、動画対応させてリリースしました!!(2018年2月ぐらいに)動画のコマごとに拡大するため、めっちゃ時間かかりますが、このプレビューではGPUサーバを10台同時に立てて並列処理させてます!<a target="_blank" rel="nofollow noopener" href="https://t.co/cCDWUcaS2X">https://t.co/cCDWUcaS2X</a> <a target="_blank" rel="nofollow noopener" href="https://t.co/mSID2DjUE4">pic.twitter.com/mSID2DjUE4</a></p>— 2z@みんなのAI「AIメーカー」開発中 (@2zn01) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/2zn01/status/1033652915364233217?ref_src=twsrc%5Etfw">2018年8月26日</a></blockquote> <h2 id="なぜ開発したか?"><a href="#%E3%81%AA%E3%81%9C%E9%96%8B%E7%99%BA%E3%81%97%E3%81%9F%E3%81%8B%EF%BC%9F">なぜ開発したか?</a></h2> <h3 id="・waifu2xの凄さに驚いた"><a href="#%E3%83%BBwaifu2x%E3%81%AE%E5%87%84%E3%81%95%E3%81%AB%E9%A9%9A%E3%81%84%E3%81%9F">・waifu2xの凄さに驚いた</a></h3> <p>「waifu2x」は2015年5月17年に公開され、瞬く間に話題になりました。<br /> 作者の方が以下のブログ記事にまとめていらっしゃいます。</p> <p>■二次元画像を拡大したいと思ったことはありませんか?<br /> <a target="_blank" rel="nofollow noopener" href="http://ultraist.hatenablog.com/entry/2015/05/17/183436">http://ultraist.hatenablog.com/entry/2015/05/17/183436</a></p> <p>画像を綺麗に拡大する精度の凄さに驚きました。</p> <p>ちょうどディープラーニングが話題になり出した時期でもあり、私も興味を持ち、早速触ってみたのが開発のきっかけです!</p> <h3 id="・複数画像へ対応すればもっと便利!"><a href="#%E3%83%BB%E8%A4%87%E6%95%B0%E7%94%BB%E5%83%8F%E3%81%B8%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8C%E3%81%B0%E3%82%82%E3%81%A3%E3%81%A8%E4%BE%BF%E5%88%A9%EF%BC%81">・複数画像へ対応すればもっと便利!</a></h3> <p>「waifu2x」を触っているうちに、一つ一つの画像ごとにアップロードするのが大変と感じてました。</p> <p>そこで、複数画像の拡大に対応すれば、もっと便利に使えるのではと考えました!</p> <h3 id="・技術的な興味で動画対応させてみたかった"><a href="#%E3%83%BB%E6%8A%80%E8%A1%93%E7%9A%84%E3%81%AA%E8%88%88%E5%91%B3%E3%81%A7%E5%8B%95%E7%94%BB%E5%AF%BE%E5%BF%9C%E3%81%95%E3%81%9B%E3%81%A6%E3%81%BF%E3%81%9F%E3%81%8B%E3%81%A3%E3%81%9F">・技術的な興味で動画対応させてみたかった</a></h3> <p>「waifu2x」を使って動画拡大する試みをやっている方がいて、自分も挑戦してみたいと考えました。</p> <p>ただ、その試みもLinuxのコンソール上でスクリプトをたたいて実行するものしかなかったため、web上でできるようにすれば、利用者のハードルも下がると思い、作りました!</p> <h2 id="システム構成"><a href="#%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%A7%8B%E6%88%90">システム構成</a></h2> <h3 id="・waifu2x-multi"><a href="#%E3%83%BBwaifu2x-multi">・waifu2x-multi</a></h3> <p><a target="_blank" rel="nofollow noopener" href="https://waifu2x.me/">https://waifu2x.me/</a></p> <p><特徴></p> <ul> <li>GPUインスタンスは全ユーザで共有</li> </ul> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/273248/a0874370-13e9-3721-b353-996264c4c44d.png" alt="waifu2x-multi-システム構成図.png" /></p> <ul> <li>ユーザがアップロードした画像はひとつのGPUインスタンスで変換処理してレスポンスを返すため、複数のユーザが同時に利用した場合は、その分、変換待ちが発生してしまう</li> </ul> <h3 id="・waifu2x-multi Pro"><a href="#%E3%83%BBwaifu2x-multi+Pro">・waifu2x-multi Pro</a></h3> <p><a target="_blank" rel="nofollow noopener" href="https://mng.waifu2x.me/">https://mng.waifu2x.me/</a></p> <p><特徴></p> <ul> <li>ユーザごとに専有のGPUインスタンスを生成</li> <li>複数インスタンスを同時に立てることもでき、その場合は画像/動画を並列に処理できる</li> </ul> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/273248/6add224c-a474-d563-fb64-424d9d0f9b21.png" alt="waifu2x-multi-Pro-システム構成図.png" /></p> <ul> <li>ユーザがアップロードした画像/動画はフロントサーバによってAmazon EFSへ格納してタスク化</li> <li>裏側で控えているバックエンドサーバによって、専有のGPUインスタンス(waifu2xサーバ)を立ち上げ、画像/動画の変換処理をwaifu2xサーバへ投げかける</li> <li>waifu2xサーバはタスクがすべて終わるまで、Amazon EFSに格納された画像/動画を変換処理していく</li> <li>変換処理がすべて終わったら、バックエンドサーバによってwaifu2xサーバのインスタンスを停止</li> </ul> <h2 id="動画変換の仕組み"><a href="#%E5%8B%95%E7%94%BB%E5%A4%89%E6%8F%9B%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF">動画変換の仕組み</a></h2> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/273248/6f7343a8-5f9b-0ad7-1484-24dc90101aeb.png" alt="waifu2x-multi-Pro-動画変換の仕組み.png" /></p> <ul> <li>ユーザからアップロードされた動画ファイルはwaifu2xサーバ上で、ffmpegを使って「各コマごとの画像」と「音声」へ分割</li> <li>各コマごとに分割された画像はすべてwaifu2xサーバで拡大処理</li> <li>すべてのコマ画像を拡大後、ffmpegを使って「変換後の各コマ画像」と「音声」を結合して動画を生成</li> </ul> <p>インスタンスの設定で起動数を指定できるようにしており、複数インスタンスを立ち上げた場合には、上記の画像の各コマの拡大は複数インスタンスで並行して処理されます。</p> <h2 id="使用している技術"><a href="#%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E6%8A%80%E8%A1%93">使用している技術</a></h2> <h3 id="Linux"><a href="#Linux">Linux</a></h3> <p>クラウドのホスティングは、Amazon Web Services(以下、AWS)を使用しており、Amazon EC2でサーバを立てています。<br /> サーバのOSはLinuxでAmazon Linux 2を使っています。</p> <p><a target="_blank" rel="nofollow noopener" href="https://aws.amazon.com/jp/ec2/" target="_blank" rel="noopener">Amazon EC2(安全でスケーラブルなクラウド上の仮想サーバー)| AWS</a></p> <h3 id="Apache"><a href="#Apache">Apache</a></h3> <p>フロントエンドのwebサーバはApacheを使っています。</p> <p><a target="_blank" rel="nofollow noopener" href="https://httpd.apache.org/" target="_blank" rel="noopener">Welcome! - The Apache HTTP Server Project</a></p> <h3 id="Nginx"><a href="#Nginx">Nginx</a></h3> <p>バックエンドのwebサーバはNginxを使っています。</p> <p><a target="_blank" rel="nofollow noopener" href="https://nginx.org/">https://nginx.org/</a></p> <h3 id="MySQL"><a href="#MySQL">MySQL</a></h3> <p>Amazon RDSを使ってMySQLを立てています。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.mysql.com/jp/" target="_blank" rel="noopener">fw_error_www</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://aws.amazon.com/jp/rds/" target="_blank" rel="noopener">Amazon RDS(マネージドリレーショナルデータベース)| AWS</a></p> <h3 id="Amazon EFS"><a href="#Amazon+EFS">Amazon EFS</a></h3> <p>有料版ではマルチインスタンスで動くので、複数のインスタンスでデータを共有できるようにAWSのAmazon EFSというネットワークファイルシステムを使っています。</p> <p><a target="_blank" rel="nofollow noopener" href="https://aws.amazon.com/jp/efs/" target="_blank" rel="noopener">Amazon EFS(EC2 用フルマネージド型ファイルシステム)| AWS</a></p> <p>データが残り続けるとヤバイことになるので、1か月を経過したらデータは削除するようにしています。</p> <h3 id="PHP"><a href="#PHP">PHP</a></h3> <p>フロントサーバ側のプログラムはPHPを使って実装しました。<br /> フレームワークはZend Frameworkを使用しています。</p> <p><a target="_blank" rel="nofollow noopener" href="http://www.php.net/" target="_blank" rel="noopener">PHP: Hypertext Preprocessor</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://framework.zend.com/" target="_blank" rel="noopener">Home - Zend Framework</a></p> <h3 id="LuaJIT"><a href="#LuaJIT">LuaJIT</a></h3> <p>バックエンドサーバ側のプログラムはLuaJITを使って実装しました。<br /> 僕もそんなに詳しくわけではなく、TorchがLuaJITで動くので、それで使っているだけです。</p> <p><a target="_blank" rel="nofollow noopener" href="http://luajit.org/" target="_blank" rel="noopener">The LuaJIT Project</a></p> <h3 id="Torch"><a href="#Torch">Torch</a></h3> <p>学技術計算の為の、機械学習ライブラリです。</p> <p><a target="_blank" rel="nofollow noopener" href="http://torch.ch/" target="_blank" rel="noopener">Torch | Scientific computing for LuaJIT.</a></p> <h3 id="waifu2x"><a href="#waifu2x">waifu2x</a></h3> <p>waifu2xのプログラム、学習済みモデルはGitHub上でオープンソースで公開されています。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/nagadomi/waifu2x" target="_blank" rel="noopener">GitHub - nagadomi/waifu2x: Image Super-Resolution for Anime-Style Art</a></p> <h3 id="ffmpeg"><a href="#ffmpeg">ffmpeg</a></h3> <p>動画と音声、画像の変換に使用しています。</p> <ul> <li>動画 → 音声、コマごとの画像</li> <li>音声 + コマごとの画像 → 動画</li> </ul> <p><a target="_blank" rel="nofollow noopener" href="https://www.ffmpeg.org/">ffmpeg</a></p> <h3 id="jQuery"><a href="#jQuery">jQuery</a></h3> <p>クライアント側のJavaScriptは、jQueryを使って実装しました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://jquery.com/" target="_blank" rel="noopener">jQuery</a></p> <h3 id="Stripe"><a href="#Stripe">Stripe</a></h3> <p>有料版の課金の仕組みはStripeを使っています。<br /> JavaScirptとPHPの短いコードで導入できるので、簡単でした。</p> <p><a target="_blank" rel="nofollow noopener" href="https://stripe.com/jp">Stripe</a></p> <h3 id="Paypal"><a href="#Paypal">Paypal</a></h3> <p>海外の人からクレジットカードが使えないからPaypalも使えるようにしてよ!とお問い合わせがあったので、Paypalからの課金にも対応しました。<br /> これも実装の手間はそんなになく、Stripeと同じくくらい簡単に導入できました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.paypal.com/">Paypal</a></p> <p>また、日本の方からはクレジットカードの情報を入れたくないので、Paypal対応してという声もありました。</p> <p>ちなみにStripeとPaypalの使用比率は半々ぐらいです。<br /> ただし、Paypalの使用率が高いのは海外の方が多いですね。</p> <h2 id="最後に"><a href="#%E6%9C%80%E5%BE%8C%E3%81%AB">最後に</a></h2> <p>今回、waifu2x-multiで使っている技術についてご紹介しました。</p> <p>ちなみにAWSのインスタンスを起動から停止まで管理するプログラムを書いたのはこのときが初めてです。<br /> リリースする前のデバッグ時には、インスタンスの制御に失敗してインスタンスが起動しっぱなしになってしまったこともあり、開発には色々と苦労しました。</p> <p>でも、そのときのノウハウがAIメーカーに活かされ、AIメーカーではインスタンスの管理に悩まされることはほとんどありませんでした。</p> <p>サービスを開発したときには、そのときに得られたノウハウ、ソースコードが自分の資産となります。<br /> サービスの開発スピードは、どれだけサービス作りの経験を積んできたかに尽きるかと思っています。自分の中でこうやれば作れるなというイメージができたら、こっちのもんです。</p> <p>最初はそのイメージが現実と乖離してリリースまで大変な目にあうこともあるかもしれませんが、やればやったほど、あ!これはあのときのこれを使えばいけるなぁ~!とかイメージがどんどん具体化していきます。</p> <p>また、それはソースコードの資産が貯まっているのもあいまって、指数関数的に開発スピードが速くなる可能性もあります。<br /> (これはもちろん、資産として使えるようにプログラムを書いていることが前提にはなりますが、、)</p> <p>なので、皆さんもどんどん自分のサービス作りをやっていきしましょう!</p> <hr /> <p>この記事に少しでも興味をもって頂けましたら、本ブログの<a target="_blank" rel="nofollow noopener" href="http://blog.hatena.ne.jp/no2z1/sukimanote.hatenablog.com/subscribe">読者登録</a>やTwitter: <a target="_blank" rel="nofollow noopener" href="https://twitter.com/2zn01">@2zn01</a>をフォローして頂くと更新の励みになります!</p> <p>よろしくお願いします!</p> 2z@AIメーカー tag:crieit.net,2005:PublicArticle/14587 2018-10-27T08:17:30+09:00 2018-10-31T11:32:04+09:00 https://crieit.net/posts/AI-LINE-BOT 画像認識AIを使ったLINE BOTの作り方 <p><img width="418" alt="AIメーカー-LINEBOT-チュートリアルタイトル.png" src="https://qiita-image-store.s3.amazonaws.com/0/273248/8b69f70a-e8e4-8457-b611-962a55d3b18f.png"></p> <hr /> <p>こんにちは、2z(Twitter: <a target="_blank" rel="nofollow noopener" href="https://twitter.com/2zn01">@2zn01</a> )です。</p> <p>先日、AIメーカーのAPIを公開しましたので、今回はそのAPIを活用してLINE BOTを作ってみました!</p> <p>■今注目のAIアプリを簡単に作れる、「AIメーカー」のAPIを公開しました!<br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/2zn01/items/c324c7f4d42e0b335bed">https://qiita.com/2zn01/items/c324c7f4d42e0b335bed</a></p> <p>自分だけで作ってても面白くないので、APIを使って誰でも作れるようにチュートリアルとしてまとめておきたいと思います。</p> <h2 id="作ったもの"><a href="#%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE">作ったもの</a></h2> <p>あくまで一例ですが、以下のLINE BOTを作ってみました。</p> <p><strong>「スケベ診断」</strong></p> <ul> <li>LINEに画像をアップすると、アップされた画像からどんなスケベかを判定します。</li> </ul> <blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【お知らせ】AIメーカーのAPIを活用した、LINE BOT「スケベ診断」を作りました!アップされた画像からどんなスケベかを判定します。以下のURLから友達追加できます!<a target="_blank" rel="nofollow noopener" href="https://t.co/Oo8JCH1FYX">https://t.co/Oo8JCH1FYX</a>こんな感じで、画像認識AIを使ったLINE BOTを簡単に作れるチュートリアルを書こうと思っています! <a target="_blank" rel="nofollow noopener" href="https://t.co/oqUcCBRyy6">pic.twitter.com/oqUcCBRyy6</a></p>— 2z@AIメーカー開発者 (@2zn01) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/2zn01/status/1048848021868359681?ref_src=twsrc%5Etfw">2018年10月7日</a></blockquote> <h2 id="システム概要"><a href="#%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%A6%82%E8%A6%81">システム概要</a></h2> <ul> <li>LINE Messaging API</li> <li>Google Apps Script</li> <li>AIメーカー API</li> </ul> <p><img width="483" alt="AIメーカー-LINEBOT-システム概要図.png" src="https://qiita-image-store.s3.amazonaws.com/0/273248/d62cec8c-a078-2de3-135b-8e91ff99cb2f.png"></p> <p>以下の流れで処理が行われます。</p> <ol> <li>LINEに画像がアップされたらwebhookによりGoogle Apps Scriptのプログラムが呼び出される</li> <li>Messaging APIで画像を取得してAIメーカーのAPIへ送信する</li> <li>AIメーカーのAPIから診断結果を受け取り、Messaging APIで結果を返す</li> </ol> <h2 id="作り方"><a href="#%E4%BD%9C%E3%82%8A%E6%96%B9">作り方</a></h2> <h3 id="1.AIメーカーで画像認識AIを作る"><a href="#%EF%BC%91%EF%BC%8EAI%E3%83%A1%E3%83%BC%E3%82%AB%E3%83%BC%E3%81%A7%E7%94%BB%E5%83%8F%E8%AA%8D%E8%AD%98AI%E3%82%92%E4%BD%9C%E3%82%8B">1.AIメーカーで画像認識AIを作る</a></h3> <p>まずはLINE BOTで画像診断させたいネタを考え、AIメーカーで画像認識AIを作ってみてください。<br /> (Twitterのアカウントが必要になります)</p> <p>■AIメーカー<br /> <a target="_blank" rel="nofollow noopener" href="https://aimaker.io/">https://aimaker.io/</a></p> <p>作成後、作成したモデルのIDとAPIキーをメモしておいてください。<br /> スケベ診断の場合は以下のURLの「APIを使う!」の欄で確認することができます。<br /> <a target="_blank" rel="nofollow noopener" href="https://aimaker.io/app/image-classification/id/2438">https://aimaker.io/app/image-classification/id/2438</a></p> <p>なお、AIを作成せずとも、既に他の人が作成されたAIを使うこともできます。<br /> 以下のみんなのAIから探してみてください。<br /> <a target="_blank" rel="nofollow noopener" href="https://aimaker.io/app/search/">https://aimaker.io/app/search/</a></p> <h3 id="2.Google Apps Scriptの設定"><a href="#%EF%BC%92%EF%BC%8EGoogle+Apps+Script%E3%81%AE%E8%A8%AD%E5%AE%9A">2.Google Apps Scriptの設定</a></h3> <p>LINEとAIメーカーの仲介役プログラムとなるGoogle Apps Scriptの設定を行います。</p> <p>1.以下のURLからGoogle Driveを開きましょう。<br /> (Googleアカウントがない場合は、作成してください)<br /> <a target="_blank" rel="nofollow noopener" href="https://drive.google.com/">https://drive.google.com/</a></p> <p>2.左上の「新規」ボタンよりGoogleスプレットシートを開いてください。</p> <p>3.メニューバーの「ツール」 -> 「スクリプトエディタ」を選択します。</p> <p>これでGoogle Apps Scriptのエディタが開いたと思います。</p> <p>一旦、この状態で公開してしまいます。</p> <p>4.メニューバーの「公開」 -> 「ウェブアプリケーションとして導入」を選択し、<br /> プロジェクト名を入力して、以下の設定で公開します。</p> <ul> <li>次のユーザーとしてアプリケーションを実行:自分</li> <li>アプリケーションにアクセスできるユーザー:全員(匿名ユーザーを含む)</li> </ul> <p>ここで現在のウェブ アプリケーションの URLに表示されたURLをコピーして控えておきます。</p> <h3 id="3.Googleドキュメントの作成"><a href="#%EF%BC%93%EF%BC%8EGoogle%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90">3.Googleドキュメントの作成</a></h3> <p>デバッグログの出力用にGoogleドキュメントを作成します。</p> <p>1.以下のURLからGoogle Driveを開きましょう。<br /> <a target="_blank" rel="nofollow noopener" href="https://drive.google.com/">https://drive.google.com/</a></p> <p>2.左上の「新規」ボタンよりGoogleドキュメントを開いてください。</p> <p>3.作成されたドキュメントに任意の名前をつけて保存します。</p> <p>GoogleドキュメントのURLの中から「{ドキュメントID}」の部分をメモしておいてください。<br /> <a target="_blank" rel="nofollow noopener" href="https://docs.google.com/document/d/{ドキュメントID}/edit">https://docs.google.com/document/d/{ドキュメントID}/edit</a></p> <h3 id="4.LINE Developerの設定"><a href="#%EF%BC%94%EF%BC%8ELINE+Developer%E3%81%AE%E8%A8%AD%E5%AE%9A">4.LINE Developerの設定</a></h3> <h4 id="・LINE Developerへ開発者登録し、プロバイダーを登録する"><a href="#%E3%83%BBLINE+Developer%E3%81%B8%E9%96%8B%E7%99%BA%E8%80%85%E7%99%BB%E9%8C%B2%E3%81%97%E3%80%81%E3%83%97%E3%83%AD%E3%83%90%E3%82%A4%E3%83%80%E3%83%BC%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B">・LINE Developerへ開発者登録し、プロバイダーを登録する</a></h4> <p>まずはLINE Developerへアクセスしましょう!<br /> <a target="_blank" rel="nofollow noopener" href="https://developers.line.me/ja/">https://developers.line.me/ja/</a></p> <p>以下の公式ドキュメントに従って手順1~3まで登録しましょう。<br /> <a target="_blank" rel="nofollow noopener" href="https://developers.line.me/ja/docs/messaging-api/getting-started/">https://developers.line.me/ja/docs/messaging-api/getting-started/</a></p> <h4 id="・チャネルを作成する"><a href="#%E3%83%BB%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">・チャネルを作成する</a></h4> <ol> <li>作成したプロバイダーへアクセス</li> <li>「新規チャネル作成」をクリック</li> <li>「Messaging API」を選択</li> <li>以下の事項を入力し、チャネルを作成する <ul> <li>アプリアイコン画像</li> <li>アプリ名</li> <li>アプリ説明</li> <li>プラン(※フリーを選択)</li> <li>大業種、小業種</li> <li>メールアドレス</li> </ul></li> </ol> <p>作成したチャネルの「チャネル基本設定」で以下の設定をします。</p> <h5 id="・メッセージ送受信設定"><a href="#%E3%83%BB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E9%80%81%E5%8F%97%E4%BF%A1%E8%A8%AD%E5%AE%9A">・メッセージ送受信設定</a></h5> <ul> <li>アクセストークン(ロングターム):発行する(発行されたアクセストークンはメモしておいてください)</li> <li>Webhook送信:「利用する」へ変更</li> <li>Webhook URL:Google Apps Scriptの設定でメモしたURLを指定</li> </ul> <h5 id="・LINE@機能の利用"><a href="#%E3%83%BBLINE%40%E6%A9%9F%E8%83%BD%E3%81%AE%E5%88%A9%E7%94%A8">・LINE@機能の利用</a></h5> <ul> <li>自動応答メッセージ:「利用しない」へ変更</li> <li>友だち追加時あいさつ:任意のメッセージを設定ください。</li> </ul> <p>以上でLINE側の設定は完了です。</p> <h3 id="5.Google Apps Scriptのソースコード"><a href="#%EF%BC%95%EF%BC%8EGoogle+Apps+Script%E3%81%AE%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89">5.Google Apps Scriptのソースコード</a></h3> <p>ソースコード上部の「\$~~~\$」の箇所はこれまでの説明の中でメモして頂いた値へ書き換えた上でご利用ください。</p> <pre><code>var AIMAKER_MODEL_ID = $AIメーカーで作成したモデルのIDを指定してください$; var AIMAKER_API_KEY = "$AIメーカーのAPIキーを指定してください$"; var LINE_ACCESS_TOKEN = "$LINE Developerで発行されたアクセストークンを指定してください$"; var GOOGLE_DOCS_ID = "$GoogleドキュメントのドキュメントIDを指定してください$"; var doc = DocumentApp.openById(GOOGLE_DOCS_ID); function doPost(e){ Logger.log("Post request."); try { var json = JSON.parse(e.postData.contents); var token= json.events[0].replyToken; var url = 'https://api.line.me/v2/bot/message/'+ json.events[0].message.id +'/content/'; var image = getImage(url); var base64 = Utilities.base64Encode(image.getContent()); var message = getResult(base64); if (message == '') { message = "識別できませんでした。"; } sendLineMessage(message, token); } catch (e) { Logger.log("ERROR: %s", e) message = "処理に失敗しました。" sendLineMessage(message, token); doc.getBody().appendParagraph(Logger.getLog()); } doc.getBody().appendParagraph(Logger.getLog()); } function getImage(url){ return UrlFetchApp.fetch(url, { 'headers': { 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': 'Bearer ' + LINE_ACCESS_TOKEN, }, 'method': 'GET' }); } function getResult(base64){ var result = ''; var url = 'https://aimaker.io/image/classification/api'; var payload = { "id": AIMAKER_MODEL_ID, "apikey": AIMAKER_API_KEY, "base64": base64 }; var response = UrlFetchApp.fetch(url, { method: 'POST', payload: payload, muteHttpExceptions: true }); response = response.getContentText(); Logger.log(response); var json = JSON.parse(response); var labels = sortLabel(json.labels); if (labels[0].label && labels[0].score){ result = 'この画像の診断結果は、「' + labels[0].label + ': ' + (Math.round(labels[0].score * 10000) / 100) + "%」です!\n\n"; } for (var i in labels) { if (labels[i].label && labels[i].score) { result = result + labels[i].label + ': ' + (Math.round(labels[i].score * 10000) / 100) + "%\n"; } } return result; } function sortLabel(labels){ labels.sort(function(a,b){ if (a.score > b.score) return -1; if (a.score < b.score) return 1; return 0; }); return labels; } function sendLineMessage(message,token){ var url = "https://api.line.me/v2/bot/message/reply"; return UrlFetchApp.fetch(url, { 'headers': { 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': 'Bearer ' + LINE_ACCESS_TOKEN, }, 'method': 'POST', 'payload': JSON.stringify({ 'replyToken': token, 'messages': [ { "type": "text", "text": message } ], }) }); } </code></pre> <h2 id="最後に"><a href="#%E6%9C%80%E5%BE%8C%E3%81%AB">最後に</a></h2> <p>手順を参考に画像認識AIを使ったLINE BOTをぜひ作ってみてください。</p> <p>この記事はあくまでもテンプレートと思って頂き、画像認識AIのネタを変えたり、診断結果をカスタマイズしてみたり、などをしてみるともっと面白いものができるかと思います。</p> <p>AIメーカーに少しでも興味をもって頂けましたら、ぜひフォローやいいね、リツイートで応援お願いします!</p> <ul> <li>Twitter: <a target="_blank" rel="nofollow noopener" href="https://twitter.com/2zn01">@2zn01</a></li> <li>note: <a target="_blank" rel="nofollow noopener" href="https://note.mu/2zn01">@2zn01</a></li> </ul> <p><strong>・文字起こし</strong></p> <blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">みんな~!「AIメーカー」で文字起こし機能をリリースしたよー!以下の方法で簡単に文字起こしを試せるので、ぜひ使ってみて~!!📺YouTubeから文字起こし🔗画像、音声、動画から文字起こし🎙️録音で文字起こしAIをうまく使って少しでも面倒な作業から解放だぁ~!<a target="_blank" rel="nofollow noopener" href="https://t.co/qo13Wo6Yli">https://t.co/qo13Wo6Yli</a> <a target="_blank" rel="nofollow noopener" href="https://t.co/gsRigVROnK">pic.twitter.com/gsRigVROnK</a></p>— 2z@みんなのAI「AIメーカー」開発中 (@2zn01) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/2zn01/status/1030652280914173953?ref_src=twsrc%5Etfw">2018年8月18日</a></blockquote> <p><strong>・画像認識</strong></p> <blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">今話題のAIをweb上で誰でも気軽に作れる「AIメーカー」を開発しました!①AIに覚えさせたいタグを入力②タグから自動で画像データを収集③AIがデータから学習の3ステップで誰でも簡単にAIを作れます!動画では手相占いのAIに挑戦!みんなもAIを作って遊んでみてね!<a target="_blank" rel="nofollow noopener" href="https://t.co/66DFU7GRZ2">https://t.co/66DFU7GRZ2</a> <a target="_blank" rel="nofollow noopener" href="https://t.co/ie1LmioyA1">pic.twitter.com/ie1LmioyA1</a></p>— 2z@AIメーカー (@2zn01) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/2zn01/status/1019741210217365504?ref_src=twsrc%5Etfw">2018年7月19日</a></blockquote> 2z@AIメーカー