プログラミング素人医学生のあゆみ・制作物まとめ
こんにちは!はるなしです。
プログラミングをしたりロボットを作ったりしている田舎の医学部6年生です。
最近は国試の勉強に苦しんでいます(泣)
この記事ではプログラミングに初めて触れてからの僕の制作物を時系列順にまとめていきます。
「プログラミングの勉強法」ではなく、ただの僕の記録です。
僕がプログラミングに挑戦していた時、周りに仲間や成功例がありませんでした。
「プログラミングを『勉強』しているけど何かを作るイメージが沸かない」
「うまくいかない、これを続けて何かが作れるのだろうか」
「Twitterの凄い人達は凄すぎて参考にならない」
と、孤独に苦しんでいました。
その当時の僕を振り返ると、「自分はこういうふうにやったよ」という体験談を聞くだけでも、かなりの励みになったのかなと思います。
なので、
- プログラミングを初めたいけど何ができるようになるのかイメージできない人
- 入門の教材をやってみたけど何ができるのかよくわからない人
- 他人の成長を眺めて目を細めてみたい人
などがこの記事の想定読者です!
2年生 冬 じゃんけんゲーム
プログラミングに興味を持ち、入門の教材である「Progate」を修了しました。
これは非常に良い教材だったと思いますし、「勉強」した気にもなれました。
いきなり高額な何かを受講するより、とりあえずこれ1周したほうがなんぼかマシ
ただ、この後「勉強したことを生かしてなにか役に立ちそうなものを作る」イメージが全く湧きませんでした。
で、とりあえず教材内で作った「じゃんけんゲーム」を自分でもう一度作ってみよう、と思い立ちました。
(教材内ではテキストを埋める形で進めるだけで、実際パソコン上で動くものではなかった)
自分のパソコンでこのゲームを再現するために、「Atom」というコードエディタを入れて環境構築をしました。
結果↓↓↓
内容は、なんてことないです。
当時「環境構築」なんて大層な事はできなくて、Atomは「普通のアプリみたいに入れただけでなんか動いた」というのが使った理由だったと思います。
結局この次になにかを作ることはできず、プログラミングはやめてしまっていました。
3年生 秋 Google ColabでtSNE
僕の大学では3年生の秋に「研究室研修」というのがあり、自分は免疫学教室で実験していました。大雑把には、「T細胞にある刺激をしたときの分化を調べる」ということをしていました。
当時免疫学、ひいては「複雑系」「創発」としての生命現象に興味があり、
「いま1つの条件を変えただけの実験をしているけど、それでは現象の説明に限界があるのではないか。たくさんの変数を同時に扱って、それでいて現象の全体的な方向を同時に理解することはできないだろうか」
ということを考えていました。生意気!!!!!!
また、同時に「Google Colab」というものでpythonを動かせると知り、「tSNE」という次元削減手法を知ったので、とりあえず手元にあるデータでtSNEをやってみたい、と考えました。
試行錯誤した結果↓↓↓
いろいろツッコミどころはあるのですが、ともかく出力ができたのです。
ここで「じゃんけんゲーム」からけっこう難易度が飛躍していますが、この解析を実装できたのは以下のような理由があると思います。
- プログラミングが「勉強するもの」から「何かを作るための手段」に変化したこと
- Google Colabのおかげで、「環境構築」を飛ばしてプログラミングできるようになったこと。
とくに「1」が大事です。このおかげで「真似したいコードを探す」とか「エラー解決のためにググる」というような具体的な作業ができるようになりました。
「入門の教材をやってみたけど何ができるのかよくわからない人」は「もっと勉強する」よりも「自分が作りたいものを見つける」ほうが重要だと思います。
ここから先は作りたいものがある→とりあえずコピペなどで動かす→エラーを解決する→教材やオンライン講義を受けまくる
といったかんじで背景は単純なので、作ったものをどんどん紹介していきます。
4年生 5月 はじめてのCNN
いわゆるAIというやつですね。
COVIDの影響もあって公開されている胸部X線の画像がたくさんあり、それを利用しました。
これもツッコミどころいろいろありますが、初めてエラーなく動いた記念写真です。
この後いろいろ教科書、論文、オンライン講座で勉強し、麻酔科の先生と一緒に救急の領域で論文を書きました。実装と解析を全担当しました。めちゃ勉強になりました。
4年生 6月 FXの予測
僕は貧乏学生なので、「FXは勝率51%になったら勝ちなんだから、AI最強じゃん!」みたいなことを考えました。
わりと誰でも通る道なんじゃないか、と思ってます。
↓なんかちゃんと予測できてそうな感じがしますね!!!大金持ちか??
取り組んでいる対象の良し悪しは置いておいて、これはめちゃくちゃ勉強になりました。
挙げるとキリが無いですが、
- 評価値ではうまく行っているように見える予測モデルでも、実際にはうまく行かない場合があること
- 複雑なモデルよりも、簡単な(古典的な)予測モデルのほうがうまくいく場合があること
- 時系列予測ならではの難しさ
- もろもろの基本的表データの操作、APIを通じたデータ取得
などなど学びました。
後輩にプログラミング教えると「AIでなんかの取引すれば最強じゃないですか?」という話をたまにするのですが、僕は必ず「やってみたらいいんじゃない?大金持ちなれるかもよ?」と焚き付けています。
4年生1月 体温報告LineBot
僕の大学では毎朝「体温報告」というものをGoogleFormから行う必要がありました。
毎回学籍番号や名前などを記入する必要があり、かなり手間で、報告忘れをしてしまうことが結構有りました。
で、自分の名前や学籍番号を登録しておいて、毎朝Lineに記入催促の通知が来、体温を返信するとサーバー経由でGoogleFormに自動で記入をする、というBotを作りました。
↓↓↓
体温報告botアップデートしました!目玉はデータベース作って利用者情報保持できるようになったことです。(複数人で使えるようになりました)毎朝報告催促する通知も来ます。
— はるなし (@kk_mdimm) 2021年1月4日
まだまだやりたいことあるけど割と実用では。 pic.twitter.com/ayXrfEAd5m
これはかなり好評で、最終的に利用者は300人を超えました。
5年生 5月 iPhoneアプリでAIをやる
データを集めてAIに学習させても、パソコンの上でしか動かないのはつまらない、スマホで動かせるようにしよう、ということでiPhoneのアプリ開発を勉強しました。
これはスクレイピングで犬猫画像を集めて、ColabでCNNに学習させて、重みをiPhoneが読み込める形に変換して、アプリにしたものです。
結構苦労しました。
Kerasで作った犬猫分類モデルをSwiftでiPhoneアプリにしました!!デザインは無視で…。
— はるなし (@kk_mdimm) 2021年5月20日
大変だった!swiftむずすぎ! pic.twitter.com/w3ka74rhHY
5年生6月 電子カルテ検査値整形アプリ
電子カルテから血液検査の値を得てレポートなどに書く時、電子カルテからの出力の形が独特で、手打ちで転記する必要がありました。
それがめんどくさく、検査項目と単位と結果を自動で検出して、レポートの形式に書き換えて出力する、というデスクトップアプリを作りました。
例外がけっこう多様で、正規表現だけではうまく対応できず、「うまく検出できなかった部分」はそのまま出力する、という工夫をしました。
とりあえず完成!余計な機能もついた。
— はるなし (@kk_mdimm) 2021年6月15日
例外がけっこ多様なので、正規表現でうまく取り出せなかったもの、をそのまま吐き出す仕組みにしました。 pic.twitter.com/2I0tRUR4yf
半角スペースなどちゃんとレポートの様式に合うようにしているのが良いポイント。
5年生9月 ノートアプリの開発(無期限凍結)
国家試験の勉強などするなかで、「GoodNoteより良いノートアプリ」を作りたいと思いました。
紙のノートのように、ノートの「厚み」をアプリ上で表現できたら、もっと直感的に使えるのではないか、という発想でした。
これはけっこう頑張ってそれらしいものができたのですが、データの管理で苦戦してしまい、途中で断念しました。
でも失敗はしていないです。無期限に凍結しているだけです。時間が割ければ完成させれると思う。一緒にやりたい人いたら声かけてください。
いまこんなかんじ!!!🔥🔥🔥
— はるなし (@kk_mdimm) 2021年9月4日
ノートの最低限の機能は実装できた。
この次は「アプリ内のデータ管理」が大きな壁。それを越えたらリリースしちゃう。 pic.twitter.com/vhl1MjGjGs
5年生9月 ARアプリの開発
ノートアプリを作る際に、いろいろな他のアプリのソースコードを参照するのですが、iPhoneでARアプリをかなり高精度に、簡単に作れることに気が付きました。
これくらいのものは数時間で作れるようになる↓
swiftのARKitで3Dのガイコツを表示するARアプリを作りました。画像をマーカーにしてその上に乗っけた。
— はるなし (@kk_mdimm) 2021年9月17日
これはちょっとすごい。(自分がすごいんじゃなくてappleがすごい pic.twitter.com/rhExx6OCfb
CTのデータから立体再構成をして、空中に表示する、といったアプリも作りました
こうしてこうしてこうじゃ! pic.twitter.com/PFTXVzZxDz
— はるなし (@kk_mdimm) 2021年10月21日
5年生12月 はじめてのUnity
さらに本格的なARアプリの開発をしたくなり、Unityに手を出しました。
(このあと脱線してUnityで強化学習の勉強をしました)
はじめてのunity!ブロック崩し!
— はるなし (@kk_mdimm) 2021年12月23日
これは面白い予感がする。(また脱線して強化学習とかしてみたくなる pic.twitter.com/1L4V0VG6xj
5年生3月 Hololensのアプリ開発
研究室でHoloLensを使った研究をしよう、ということになりその実装を担当しました。
HoloLensで手技を支援する、というおもしろ研究です。
↓これは基本的な実装をなんやかんや試しているところ
これはHololensで基本の実装。地味だけど画像トラッキング、座標の管理、保持、トラッキングの有効化、無効化などいろいろ含まれてる。録画してるから重いけどほんとはもっとぬるぬる動くよ。 pic.twitter.com/EuyohTYVu8
— はるなし (@kk_mdimm) 2022年3月5日
5年生3月 はじめてのロボット開発
さまざまな背景、アイデアがあって、医療用ロボットを作りたくなりました。(雑)
なぜかそれまで「ロボットだけは難しそうで無理」と思っていたのですが、手を出してみると難しいなりに案外なんとかなりました。
ロボットの関節の角度をリアルタイムで取得できた!サンプルをとりあえず動かすんじゃなくて自分で通信やらデータ取得やらをちゃんと書いたのがえらい。#mycobot pic.twitter.com/koQcF73VbC
— はるなし (@kk_mdimm) 2022年3月13日
5年生3月 ロボットで遠隔エコーをする
さまざまな実装、調整があって、遠隔エコーロボットを作りました(雑)
「マスタースレーブ」といって、操作側のロボットを手動で動かすと、遠隔側のロボットが同じ動きをする、というロボットです。
大枠では手術ロボットダヴィンチと似ています。
先生方の協力ありここまでできた。この後、心エコーの長軸像など出すことができました。
— はるなし (@kk_mdimm) 2022年3月21日
腕が短いのでこれだけでFASTとかは無理かも。学生1人がここまで作れる。時代は変わりつつある。
今後どうやると実際に使ってもらえるようになるだろうか、ということをずっと考えてる。#mycobot pic.twitter.com/gEQ0bS06gA
ここから「エコー検査をロボットで行う」ということを一生懸命がんばり始めます。
6年生7月 コーヒー生豆自動選別マシンの開発
いきなりぜんぜん違うことに手を出している。
モーターやセンサー、マイコンの取り扱いに詳しくなりたかったのと、機械の「ハード部分」を作る、という経験をしたかったので作りました。
コーヒー豆の良し悪しをCNNで判別するモデルを作って、ラズパイに載せ、モーターで豆を次々選別する、という仕組みですね。
というわけで完成しました!コーヒーの生豆自動選別機です!!夏休みの自由工作です(何やってんだ pic.twitter.com/Z7UYmT2ATA
— はるなし (@kk_mdimm) 2022年7月20日
6年生 8月 エコー検査を自動で行う
さまざまな実装、調整があって、自動エコーロボットを作っています(雑)
これが現在僕が一生懸命開発しているロボットです。
エコー検査を自動で行います。↓↓↓
エコー検査の自動化を行なっています。体表面の任意の位置で撮像を行い、AIがより良い画像を撮るための移動を自動で行います。特許出願済みです。
— はるなし (@kk_mdimm) 2022年8月16日
まだまだ個人開発の範囲で道のりは長いですが頑張ります!! pic.twitter.com/Rprs9pCTMg
以上 おわりに
これで制作物は以上です!ほかにもいろいろありますが、公開して良いものはすべて載せたと思います。
まず、プログラミングをはじめてみたい人、やってみたけどうまく行かない人がこれを読んで、「なんか面白そうだな」と思ってもらえたらこれを書いたかいがあります。
自分がまともにプログラミング初めたのが3年生の終わり頃なので、3年弱でもろもろ作れるようになります。ぜひ、自分が作りたいものを見つけて取り組んでもらえたらと思います。
自分はいまエコー検査自動化ロボットを開発しています。優秀な仲間が集ったチームを作っていて、製品として、事業として開発を行っています。興味ある方はぜひ声をかけてください!
mycobot320(pro) (37万円)を購入しました。開封とレビュー。
こんにちは!はるなしです。
えーあいやらロボットやらを作るのが好きな医学生です。
このたび、mycobot320(pro)を購入したのでそのレビュー記事です。
mycobot280の記事はいろいろありますが、320は情報少なく、購入に際してかなり悩みました。280を所有している人が、320を検討する際の参考になればと思って書いています。
専門の人ではないので書き方等もやもやするとこあるかもしれませんが、お許しください。検証の仕方で間違いがあれば指摘してください。
開示すべき利益相反はありません。
mycobot 320(pro)を購入しました。 pic.twitter.com/qKg78IuPte
— はるなし (@kk_mdimm) 2022年8月2日
誰向けの記事なのか
mycobot280を所有している人で、320の購入を検討している方を想定しています。どんな感じで届くのか、性能は実際どんなもんなのか、また、私の印象(感想)を書きます。
ダイレクトティーチングやROSでの制御もやりますが、詳しい方法は書きません。レビューが目的で、実装のための記事ではありません。
もくじ
- 概要
- 前情報
- 開封
- 動かしてみる
- その他
概要
・印象として、280よりかなり大きい
・パワーは280と比べ物にならないくらい強い
・バックラッシュ(関節のあそび)はある程度ある
・位置決め精度は申し分ない。
・280で環境をつくれていればすぐにでも移行できる(ROS)
個人的には値段に対して、かなり満足しています。
前情報
私が購入したのはmycobot 320 M5です。以前はmycobot pro の名称だったようです。スイッチサイエンス社経由で購入しました。
重量は3 kg、ペイロードは1 kg、作業半径は320 mmとなっており、値段は約37万円(2022年8月)です。私が調べたうちでは、市販されているものでこの金額・このスペックは破格の安さです。
購入の背景として、私がやりたいことに対して280の性能が追いつかなくなっており、悩んでいました。特に重さがかかったときの位置決め性能の悪さと、反力(?)がかかったときの280の「遊び」(バックラッシュ)の大きさが悩みでした。
私個人としては、320にホンマにパワーが有るのか、遊びはどれくらいあるのだろうか、というのが主な心配事でした。
開封
スイッチサイエンスで注文して、振り込み当日に発送、次の日の午前中に到着しました。はやい。14時までに振り込みをすればその日のうちに発送されるそうです。(2022年8月)
到着。
初手の印象、「でかい、重い」です。
280と違って、固定するための吸盤と緊急停止ボタンがついています。
とにかく大きいです。
280と並べてみました。
最初の組み立てに関しては、スイッチサイエンス社の動画を参考にしました。これがなかったら少し戸惑ったかも。
吸盤で固定というのが不安でしたが、実際固定してみるとかなりしっかりしています。外れそうな感じは一切ないです。
動かしてみる
案外公式がわかりやすいです。280と変わらない。
ダイレクトティーチングで動かしてみる。
ダイレクトティーチング。ぬるぬるしてる。素晴らしい。けっこう静か。 pic.twitter.com/2R3dUb5Dhw
— はるなし (@kk_mdimm) 2022年8月2日
slider_controlで動かす
slider_control
— はるなし (@kk_mdimm) 2022年8月2日
すんなり。 pic.twitter.com/GzUvGqxx1y
moveitとsync_plan.pyで動かす
(ほんとうにMoveitしているわけではない)
moveitと公式提供のsync_planで動かせた。すんなり。はんなり。 pic.twitter.com/p9V4v2ZUyO
— はるなし (@kk_mdimm) 2022年8月2日
パワーは?
250gほどのパーツを取り付けても余裕です。
ホントは1kgの負荷などもするべきなのですが、万が一でも破損したら泣いちゃうので手加減しました。
すげーーー!!楽々だ!すげえ!何でもできるぞ。やり直したい実験いっぱいある!!! pic.twitter.com/utU2VgxNSs
— はるなし (@kk_mdimm) 2022年8月2日
遊び(バックラッシュ)はどうなのか
slider_controlで位置決めをした後に確かめてみます。
遊びの原因はほとんどjoint1?? pic.twitter.com/0ijOZRzI8A
— はるなし (@kk_mdimm) 2022年8月4日
280と比べて各関節はかなりしっかりしている、が、ぶれるにはぶれます。いろいろ触ってみると、一番下(joint1)の遊びだけやたら大きいよう。
joint1の回転軸方向に力がかかるとかなり動いてしまいそうだが。他の関節はほとんどぶれない。
その他
レゴ・テクニカルパーツとの互換はありません。が、付属のネジでパーツをむりやり削って、取り付けることは一応可能ではありました。
こんなん想定していないと思うので非推奨ですが、一応可能ではあったという情報だけ。
とりあえず以上です。
追加でやったことなどは適宜追記していきます。
本業の研究にすでに使い始めている関係もあり、ところどころ甘いのですが、参考になれば幸いです。
個人的にはかなり満足しています。安いわけではないですが、価格に対しての性能は充分なのではと感じます。280で作った環境からROSですぐに動かせたのも好印象でした。
なにか指摘、やってほしい検証などあれば対応します。
お読みいただきありがとうございました。
iPhoneとMacがあるならあなたもARアプリを作れます RealityKitとBlenderで初めてのARアプリを作る【初心者向け】
はじめに
こんにちは!はるなしです。
最近はAR(拡張現実)の技術が面白いと感じていて、医療に応用できないかな、というところも見据えてかんたんなARアプリの開発を行っています。
僕はswift(Appleの製品で動くアプリを作るための言語)を使ってアプリ開発をしています。Appleが提供しているARKit、RealityKitというフレームワーク(ARアプリを作るための便利道具箱)を使うことで簡単にARアプリを作ることが可能で、今回は初心者向けに、簡単なARアプリ作成の記事を書こうと思います。
少しでも興味があるならば、ぜひ実際に手を動かしてアプリを作って欲しいです。特にARのアプリは実際に体験しないと凄さがわからないし、開発の難しさも自分でやらないとわからないです。自分で作ってみれば、何に応用できそうか、また限界はどのあたりにあるのかの勘所がつかめて、世界の解像度が上がると思います。想像したり、勉強したり、喋るだけではなく、「作ること」が重要だと僕は思います。
書くこと、書かないこと
書くこと
・簡単なARアプリ(自分で用意した3D モデルを平面上に出す)の作成
・しつこいくらいスクショを使った初心者向けの解説(真似するだけで作れる、を目指す)
書かないこと
・プログラミング言語(swift)の詳細
対象
最適
・macでアプリ開発の勉強は簡単にしたことあるけど、特に自分でなにか作ったことはないひと。
・swiftに限らず、なにかプログラミング言語を勉強したことがあるひと
少し頑張れば作れる
・アプリ開発は全くやったことがない。AR開発に興味がある
・プログラミング完全初心者
想定していない
・windowsパソコンしかもっていない(今回はapple限定です)
・つよのひと。
作るアプリ
平面に、Blenderで編集した3D球体を出現させるアプリ。
必要なもの・事前準備
必要なもの
mac or macbook 、iPhone or iPad
事前準備
Xcode(13.1)のダウンロード
→普通にApp Storeにあります。めちゃくちゃにダウンロードに時間がかかります(1日くらい)。導入の解説記事はいっぱいあるので参考に。※1
初めてのアプリをつくる
さっそくXcodeを開いてみましょう。
・Create a new Xcode projectをクリック
・Augumented Reality App (ARアプリのテンプレートが準備されている)
→Nextをクリック
・ProductNameを適当につける
interfaceはstoryboard
LanguageはSwiftに設定
→Next
・好きな場所に保存する
→Create
・こんな画面です。
じつは、テンプレートを使用したので、アプリはすでに完成しています。
どんなアプリが準備されているのか確認します。macとiPhone or iPadを接続して、さっそくビルド(アプリを実際のデバイスで動かすこと)してみましょう。iphoneをMacにつなぐと信頼しますか?と聞かれるので信頼する、で。
・上の方にデバイスの名前(iPod touchとか)が表示されている部分があります。そこをクリックすると、デバイスがたくさん選べます。その中から自分の「〇〇のiPhone」を選択しましょう。表示されない場合は接続し直したり、xcodeを再起動すると認識してくれます。
・選択できたら左上の再生ボタンをクリックするとアプリをデバイスに転送し始めます。初回は時間がかかることが多いので気長に待ちましょう。※2,3
・カメラを許可して・・・
ばばーーん!!
これは「デバイス起動後に最初に検知した水平面に四角い箱を置く」アプリです。
けっこう「そこにある感」がありませんか??iPhone,iPadをうりうり動かして遊んでください。
※1「Xcode ダウンロード 初心者」とかでいろいろ出てきます
※よくあるエラー The run destination 〇〇のiPad is not valid for Running the scheme 'sample_app'.The run destination 〇〇のiPad is not valid for Running the scheme 'sample_app'.
→iPhone,iPadのOSのバージョンが低すぎる、と怒っている。
左上のアプリ名クリックして、Deployment info のiOS を自分のデバイスに合わせてあげると解決します。
※よくあるエラー Could not launch “sample_app”
設定→一般→デバイス管理→Apple Development〜→青字のApple Development〜をタ ップ→信頼する
を設定したあともう一回再生ボタンを押してください
何がおこっているのか
アプリ作れたはいいですが、なんで動いているのかよくわからんですね。
このテンプレートアプリの仕組みを少し調べてみましょう。
・まず、左の「Experience」をクリックしてください。
・見覚えのある四角い箱です。右上の「open in reality composer」をクリックしてください
・こんなかんじ。
・Reality Composerは(おおまかには)表示する3Dモデルを編集するための画面です。黒い立方体があって、よく見ると、「アンカー」が「水平方向」と設定されていますね。
・この3Dモデルが配置されていろんな設定がされているものを「シーン」と呼びます。たとえば、ここに球体をもう一個追加したら、平面に立方体と球体が置かれます。(右上の「追加」から。)
・「シーン」には名前がついています。右上でシーンの名前が確認できます。このシーンの名前は「Box」です。
・ほかにも、立方体をクリックすると3Dモデルの大きさや「素材」を変更できます。
(ぜひ、いろいろと追加、変更してみて、もう一度再生マークからアプリをビルドし直してください。変更が反映されます。)
・他のファイルも確認しましょう。Reality composer(Experience.rcproject)はバツで閉じてください
・左の「View Controller」をクリックしてください。
コードが書かれていますね!!
・あまりびびらないでください。やってることは簡単です。(まだ理解できなくてOKです。なんとなくの把握だけ。)以下、ちょっと解説します。
・@IBOutlet var arView: ARView!
デバイス(iPhone,iPad)の画面に映すものを「arView」というものにまとめて取り扱いますよ、という意味。いきなり抽象的でよくわかんないですね。「arView」とはデバイスが認識する世界(平面とか画像マーカーとか)のことで、そこに準備した3Dモデルを追加していきます。
・override func viewDidLoad()
「アプリが起動されたときに以下のことを行いますよ」という意味。
・let boxAnchor = try! Experience.loadBox()
Experienceファイルから「Box」というシーンを読み込んで、boxAnchorという変数の中に入れますよ、という意味。先程確認したシーンには「Box」と名前がついていたことを思い出してください。
・arView.scene.anchors.append(boxAnchor)
「arView」に「boxAnchor」を追加しています。
ようするに画面上に読み込んだシーンを表示しますよ、ということです。
なんか難しいですね!!簡単のために厳密さは犠牲になっています。要するにExperienceファイルにある「シーン」を読み込んで、画面に表示していますよ、という処理です。
発展させる
ここまででけっこう盛り沢山でしたが、もうすこし頑張りましょう。
いままでの開発で、Reality Composerから立方体やら球体やらを追加することはできそうですが、実際になにか作りたいときに、それでは物足りないです。
どんなアプリを作るのかはアイデア次第ですが、もっと複雑な形の3Dモデルを取り扱いたいですよね。たとえば解剖の3Dモデルとか、3DCTとか、そんなんです。
これから、「Blender」と呼ばれる3Dモデルを編集するソフトを使って、球体をARアプリ上に表示させましょう。最終的な完成品はテンプレートアプリと変わりなく見えますが、内容はかなり高度になっています。自分で3Dモデルを用意しているので、配布されているモデルや、複雑な形をアプリ上で表現することができます。
おおまかには
・Blender上で3Dモデルの用意
・ファイルの書き出し
・ファイルの変換
・Xcodeに読み込み
・コードを少し書き換える
という流れです。難しいことはしないですが、Blenderを勉強すれば難しいこともできるようになります。
それではやっていきましょう。
3Dモデルの準備
・Blenderというソフトをダウンロードしてください
簡単なんで詳細省きます
・起動して、「全般」を開きます
・最初から、立方体が用意されてるかと思います。(されてない場合もあるかも)
さすがに同じもの表示してもつまらないので、右クリックから削除してください
・削除できたら左上の「追加」「メッシュ」「UV球」を選択します
(好きなやつでいいです)
・Blenderの機能を使ったらいろんな形の3Dもでるを作ったり、誰かが作った3Dモデルを利用できたりする(自分で作るよりこっちのほうが重要)のですが、今回は簡単のために球体追加しただけで次に進みます。
・いまからBlenderで編集したファイルを、Xcodeが読み込めるように変換してあげます。変換するだけなので難しいこと考えずに手順に従ってください。
・追加した球体を選択した状態(クリックして、周囲が黄色くなった状態)で左上の「ファイル」「エクスポート」「Universal Scene Description」を選択してください。
・好きな場所を選んでファイルに名前をつけ、「USDをエクスポート」をクリックします。あとからファイルを開く必要があるのでどこに保存したか覚えておいてください。今回はわかりやすさのためにデスクトップに置いています。
・さっき保存したファイルを開きます。usdcファイルとして保存されています
・じつはこのままではまだダメで、もう一度変換をする必要があります。手がかかるのです。usdcファイルを開き、左上の「File」「Export」を選択します
・「File Format」を「Universal Scene Description Package」に変更し、「where」から保存場所を指定し、「save」をクリックします。
・道のりながかったですがこれでファイルの準備はOKです。次に準備したファイルをXcodeに取り込み、アプリに反映させます。
アプリを更新する
Blenderで準備した3Dモデルをアプリに反映させます。大まかな作業としては、まず新しい「シーン」を作成し、「ViewController」を書き換えて新しいシーンを読み込みます。
・Xcodeに戻ります。左からExperience、Open in Reality Composerをクリックしてください。
・Reality Composerが開けたら、上の「シーン」を選択、「+」を押してください。
・「アンカーを選択」が出ると思うので、「水平方向」を選択します
・こんなかんじ。
白い箱と「選択して編集」は最初から用意されている3Dモデルです。不要なのでクリックして選択したあと削除します。
・用意したファイルをReality Composerに読み込みます。右上の「追加」「読み込む」をクリックして、さっき準備したファイルを選択します。
・するとRealityComposerに球体が読み込まれます。
実は、Blenderではメートル単位でモデルを作成しているので巨大な球体が追加されます。「追加されないな??」と思ったら、視点を遠くからにして動かしてみてください。
・サイズを調整します。球体をクリックして選択し、「サイズ調整」で大きさを変更します。僕は10%まで縮小しました。
・球体を原点に移動させます。○が書かれているところが原点です。球体を選択すると矢印が現れ、軸に沿って移動ができるので原点にドラッグしてください。
・シーンに名前をつけます。ViewControllerからシーンを読み込めるように、新しく作ったシーンに名前をつけます。右上に「シーン」と書かれているのでこれを「mySphere」に変更しましょう。
※このとき、球体を選択「しないで」名前をつけてください。球体を選択した状態だと、「シーン」ではなくて「モデルそのもの」に名前がついてしまいます。
・いよいよ大詰めです。Reality Composer を閉じて、ViewControllerを開いてください。
・解説したとおり、テンプレートのアプリでは「Box」というシーンを読み込んでいました。これを準備した「mySphere」に変更します。
・まず
let boxAnchor = try! Experience.loadBox()
の.loadBox()を削除します。
削除したところから続けて.loadと入力すると、入力候補が出てきます。
.loadmySphere()を選択してください。
Xcodeは賢いので、追加されたシーンを認識して、「こっちのシーンと入れ替えたいんやろ」というのを予測してくれるのです。※
※設定によっては予測候補が出現しない場合があります。そのときは.loadmySphere()と手打ちしてください。
※Type 'Experience' has no member 'loadmySphere'というエラーが出るときには、RealityComposerを開き直して、シーンの名前が変更されているか確認してください
・これでやっと完成です!!
最初と同じようにiPhone,iPadとつないで、再生ボタンからビルドしてみましょう。
・できました!!!
・けっこう大変だったかもしれません。お疲れさまです。
今後何をすればいいか
・今回の開発で一番基本のアプリ開発はできたと思います。
・もちろん、他にもできることはまだまだいっぱいあります。(画像マーカーとか)需要ありそうなら続編も書きます。
・つかれたので今後、は追記で書きます・・・
M1 MacBookでTensorFlowとXGBoostを動かす!!
M1がすごい、ということでsurfaceからmacbookに乗り換えました。大学の勉強関係で使うには素晴らしいのですが、プログラミングの環境構築に関しては悪夢でした。文字通り悪夢でした。
悪夢を乗り越えどうにかこうにかtensorflowとxgboostを動かしたので、mac初心者、環境構築なんもわからん、の環境構築を紹介したいと思います。
何もわからんまま環境構築、ではなく少しわかって環境構築したいので僕が勉強したこともちょいちょい挟んで書きます。
メニューは
1,最初の確認
2,HomeBrew導入
3,MiniForgeでTensorFlow-MacOSを動かす
4,CMakeによるビルドでXGBoostを動かす
です。いろんな方の記事を参考にしました。いろいろ間違っていることも書くかもしれないので、指摘してくださると幸いです。(とくに用語に関してひどいと思いますが、簡単を優先するのである程度お許しを。)
1,最初の確認
すばらしきM1 MacBookですが、インテルのCPU→アップル製CPUに変わった※ことでいろいろとめんどくさい事が起こります。
かんたんには、従来のアプリやパッケージはインテル向けに作られているので、それをM1で動かそうとすると色々噛み合わなくて困るわけです。
参考(動画めちゃわかりやすい)
※ほんとはCPUが変わったというよりコンピューターを動かす上でのCPUとかいろんなものをひっくるめた設計(アーキテクチャ)が変わっている
ちょっとこの辺確認してみます。Rosettaはすでに入っている前提です※2。
まず、アプリケーション→ターミナルを開いて
uname -m
というコマンドを打ちます。システムの情報を教えてくれるコマンドです。
arm 64ってのが「M1で動いてますよ」という意味です
次にアプリケーション→ターミナルを右クリックして情報を見る→Rosettaを使用して開く、にチェックします。
で、もういっかいターミナル開き直して uname -m を入力すると
x86_64に変わっています。Rosettaが有効になっているので、ホントはM1だけど、インテルのCPUとして認識できてますよ、という意味です。
なんとなくイメージ湧きますでしょうか。
参考
※2 Rosettaが必要なアプリを使おうとすると「Rosetta入れますね」と自動でやってくれます。僕はANKIというアプリを入れたらRosettaが入りました。
あと、事前知識として必要なのは
コマンドラインの基礎
PATHってなに??
ビルドってなに?(イメージ)
https://wa3.i-3-i.info/word12775.html
などなどです。目を通しておくと「ちょっとわかる」になる。
2,HomeBrew導入
ここが非常にわかりやすかったです
arm64(M1)版とx86(Rosetta経由)版両方を入れます。入れる場所が違います。
arm版を入れる
ターミナルをRosettaから開く、のチェックを外してから開く
arm版は/opt以下に入っていないといけないので、場所を指定してインストールする
cd /opt
sudo mkdir homebrew
sudo chown $USER /opt/homebrew
curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
PATHを通します。
シェルはzshなので.zshrcを編集します。
ホームディレクトリに戻る
cd
touch .zshrc
で設定ファイルを作る
ls -a
で確認
ファインダーから確認。
.zshrcは隠しファイルなので表示されていない場合は
shift+command+. で表示
.zshrcに
export PATH=/opt/homebrew/bin:$PATH
を追加します。
再びターミナル
バージョン確認、最新にアップデートしておく。
x86版のhomebrewをインストール
Rosettaを使用して開く、にチェックしてターミナルを開き直す。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
これで入ります。
export PATH=/opt/homebrew/bin:/usr/local/bin:$PATH
をzshrcに追加。
確認↓
opt/にarm版のhomebrew
usr/localにx86版のhomebrewが入っている
参考
3,MiniForgeでtensorflow-macosを動かす
やっとこさ本題。
この記事を参照。ありがたや。
やってることおなじなのですが、一応書かせてください。
MiniForge(Anacondaの軽量版みたいなもの)を入れます。
arm64で
wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh
bash Miniforge3-MacOSX-arm64.sh
なんか色々聞かれるが全部enterかyes
miniforgeのPATHの確認↓
echo $PATH
自動でconda環境にならないようにする
conda config --set auto_activate_base false
以下、上で紹介した記事(Apple Silicon(M1) Mac+tensorflow-macosでディープラーニングする)と全く同じなので割愛します。
conda create --name python38 python=3.8
conda activate python38
から
・・・
pip install tensorboard
pip install --upgrade -t "$env/lib/python3.8/site-packages/" --no-dependencies --force "$libs/tensorflow_macos-0.1a2-cp38-cp38-macosx_11_0_arm64.whl"
をひたすら打ち込みます。
VSCodeからtensorflowが動くか確認
(VSCodeはuniversal版を入れました)
tf_test.py
とか作る。Pythonの拡張は言われたやつを適当に入れとく。
実際に学習してみる
tf_test.py
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation=tf.nn.relu),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)
環境指定すると右上の実行ボタンから実行できる。
ターミナルからも。
動きましたー!めでたし。
4,XGBoostによるビルドでCMakeで動かす
Cmakeなるものを使ってビルドします。
これはあんましわかっていないのでなにか変なことをしているかも。
参考
VSCodeから作業ディレクトリに入って
さっきのconda環境に入る。
以下コマンドを実行していく。
git cloneで左にxgboostのディレクトリが出てくるので、ディレクトリの構造を参照しながら進めてください。
brew install cmake
git clone --recursive https://github.com/dmlc/xgboost
cd xgboost
mkdir build
cd build
cmake ..
make -j4
cd ..
cd python-package
ここで、python3をフルパスで指定できるように
which python3
でPythonのパスを調べて、
python3のパスのあとに
setup.py install
で実行する。
これで準備OK
sklearnを入れる。
conda install scikit-learn
サンプルコード
import xgboost as xgb
print(xgb)
print('OK!!)
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
dataset = datasets.load_breast_cancer()
X, y = dataset.data, dataset.target
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.3,
shuffle=True,
random_state=42,
stratify=y)
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)
xgb_params = {
'objective': 'binary:logistic',
'eval_metric': 'logloss',
}
bst = xgb.train(xgb_params,
dtrain,
num_boost_round=100,
)
y_pred_proba = bst.predict(dtest)
y_pred = np.where(y_pred_proba > 0.5, 1, 0)
acc = accuracy_score(y_test, y_pred)
print('Accuracy:', acc)
実行すると・・・
こんなかんじで動きます。
やったー。
M1での環境構築、本当に地獄でした。いまはpipで入らない、とかいろいろありますがそのうち解消されるのでしょう。いろんな方の記事を参考にしてどうにか自分でやりきることができました。ありがとうございます。
PATHってなに?とかコマンドってなんで実行できるの?とかいろいろと勉強にはなりました。この記事が誰かの役に立ったなら幸いです。
医学生的深層学習実装優先勉強法!!
こんにちは!はるなしです。
医局の研究に参加して、機械学習(深層学習)でデータ解析をしている地方の医学生です。深層学習を臨床に応用した論文が1本(共著です)出るめどがつきました。興味持ってくれた方はTwitterフォローしてあげてください。
さて、前回「一般平均地方医大生が深層学習を実装するまで」という題で記事を書きました。
この記事は単純な僕の体験談です。今回は、これをもっと抽象化して、「プログラミングの勉強ってこういう風にするべきだよね(医学生向け)」という勉強法のお話をしていこうと思います。
先に書いてしまうと、この記事でお伝えしたいことは
Pythonの最低限の基礎が終わったらとにかく何か作れ!作るのだ!!具体的な何かを!!「プログラミング基礎のお勉強」をどれだけ丁寧にしても何も作れないぞ!!!
です。
以上です。それではまた。
・・・実際のところ、ほんとにこれが全てです。基礎を丁寧にやる、というのは我々が受験時代から大事にしてきた勉強法ですが、どうもプログラミングに関してはこの考え方が通用しないようです。基礎がわからなくても、いきなり応用問題を解くのが実装への近道のようだ、と感じています。
今回の記事は、最初のほうは「プログラミングの勉強はこのように考えるべき」という総論的な、抽象的な話になっていて、後半に行くにつれて「実際に何したらいいのか」という具体的な話になっていく、という構成になっています。
対象とする人
・プログラミング初心者(おもに医学生)
・Pythonの基礎を昔勉強したけど、何も作れないからやめちゃった、の人
・とにかく、何かを作りたい人(実装が優先)
対象としない人
・プログラミングで何か実際に生み出せている人
・プログラミングの「勉強」が楽しい人
(これはこれでアリですがこの記事の対象ではない)
・理工学系の学生と同等の実装力をつけたい、最新論文を自力で実装したい人
じゃんけんゲームの先に進むために
Pythonの基礎(Progate修了レベル)を終えた人って、よほどセンスがないとみんなこうなると思います。
僕もこの状態から脱出できずに、一度挫折しました(前記事参照)
ここを抜け出すために、何をすればいいでしょうか?講師付きのプログラミングコースはお高くてなかなか手が出ないし、(僕はやってないので安易に言及するべきではないですが)、巷にあふれている安めの教材では、「それやったから何ができるの?」つまり「丁寧な基礎のお勉強」以上の段階に進めない気がします。
前回の記事でも触れたのですが、プログラミング勉強において「目標をはっきりさせる」ことがとっても重要です。もっと言えば、「何作りたいのか」をはっきりさせる、ということです。
この記事では話に具体性を持たせるために、以下、題名の通り「深層学習の実装」に話を絞ります。そのうえで、どのように勉強するべきか、というお話を深めていきます。
解糖系知ってても治療はできない
みなさん「ライブラリ」を知っているでしょうか。
おおざっぱに言うと「ある機能を持ったプログラムをひとまとめにしたもの」です。
Progateでじゃんけんゲーム作る際、ランダムな整数値を取得する際に、自分で丁寧にコードを書くのではなく、
こんなかんじで「random」を「import」することで簡単に実装することができました。ランダムな整数値を取得するコード、なんてのは誰が書いたって同じなので、このように「random」の中にまとめておいて、簡単に使えるようになっているのです。
ランダムな数値を取得する、という機能をまとめたものが「random」というライブラリなわけです。
便利なライブラリはほかにもあって、厳密ではないですが、行列計算を扱いやすくしたのが「numpy」、表形式のデータに関して「pandas」、深層学習を書きやすくしたものが「keras」といった感じです。深層学習を実装するぞ!となった時、自分でコードをゼロから書くというよりは、これらライブラリの機能を使いこなしていく、というのが実際の作業になっていきます。
これをイメージとしてまとめるとこんな感じです↓
厳密じゃないんで見る人が見たら怒られそうですが、イメージとしてはまあこんな感じです。
で、実際に深層学習のコードを書いてみて、Pythonの勉強って少し医学の勉強と似ているな、と思ったんです。どういうことかというと、
こんな風に対応するな、と思ったのです。このイメージが、「Pythonの基礎を延々と勉強しても役立つ何かは作れないでしょ」という考え方の根拠になります。
つまり、僕らがしたいのはとにかく治療なんです(kerasを使って深層学習)。それを分子生物学(Pythonの基礎)から積み上げ方式で勉強すると、数年は余裕でかかってしまいます。(たぶん、理工系とかプログラミング専門の人は積み上げ方式で勉強するのでしょう)
ですが僕ら医学生で「実装優先」なので、基礎を丁寧に、「積み上げ方式」で勉強する時間はないです。たぶんその必要性もあんまりないです。
したがって、僕が提案したい勉強法のイメージは以下のようになります
まず、わからなくてもいいから何か具体的なものを作って、それに必要な知識を掘り下げていこう、という戦略です。こうすれば、役立つ何かを最小限の勉強量で実装することができますね。
じゃあ具体的に何するのか、を説明していこうとおもいます!!
写経と課題設定
先に全体像を示しておきます。
この図で全部っちゃ全部ですが、もう少し掘り下げて話します。
まず、どうやってコードを書くか、ですがGoogle Colabを強くお勧めします。環境構築は初心者に難しすぎます。パソコン得意な人はAnacondaなど入れてやってもいいと思いますが、深層学習で表データはともかく画像を扱いだすと普通のパソコンで学習させるのは不可能です。ColabはGPU(めっちゃ計算速いやつ)を無料で使えるので、どのみちColab にお世話になることになります。自分のパソコンで始めることに最初こだわらなくてもいいと思います。
コードを書く場所が整ったところで、今度はコードの「写経」をします。写経するための経本が必要なので、この段階で1冊深層学習を実装するための本を買いましょう。深層学習の理論の解説、というよりは実装を目的とした本(つまりコードがいっぱい書いてある本)が良いと思います。自分に合いそうな本を選べば良いと思いますが、「pythonによるAI・機械学習・深層学習アプリの作り方」が個人的なおすすめです。
実際に写経をしましょう。入門書には簡単な機械学習の実装(ロジスティック回帰とか)のコードがあるので、写経してColabで動かしてみましょう。最初、何で動くのかよくわからないと思いますが、とにかく期待される出力が実際に得られることを確認してください。
その次に簡単な、表データを使った深層学習をやりましょう。多くの本で「アヤメデータの分類」を最初の課題にしていることが多いようです。データの読み込みから出力まで写して、同じくコードが動くことを確認してください。
そしていよいよ自分で課題を設定し、取り組みましょう。アヤメの分類、と近い課題がやりやすいので、データが表形式になっていて、その分類を課題とするとよいと思います。僕は公衆衛生の講義で配られた健診データを使って深層学習(心血管イベント発生の予測)をやりました。このように自分で興味を持てるデータを準備するのがベストですが、オープンデータとしてタイタニック乗客の表データやボストン住宅価格の表データがあるので、それを利用してもいいと思います。
データの読み込み部分をアヤメデータから自分のデータに差し替えて、写経したコードが動けばよいわけです。これができると、少なくとも表データに関しては実際の研究にもつなげることができそうですね。
おそらく皆さん「写経をしただけでいきなり自分で用意したデータを解析できるのか?そんなにうまくいくか?」と思っていると思います。その通りです。そんなにうまくいきません。
延々と出現するエラーを感謝の気持ちで迎え撃つ
写経したコードのデータ入力部分を差し替えたくらいで、コードは動かないです。「エラー」が出ます。
たとえば、こんな感じです↓
これを頭から一個一個ぜーんぶ解決していくと、そのうちちゃんと動くコードが書けるだろう、というわけです。 しかもエラーを解決するためにはそのコードに関わる周辺知識や、深層学習モデル全体の理解も必要になってくるので、プログラミングの勉強の「掘り下げ」ができるでしょう、という戦略なわけです。
じゃ、プログラミングの勉強を基礎しかやっていないのに、このエラーをどうやって解決するのか?ということになります。みなさんは困ったことがあった時に何に頼るでしょうか?友人?両親?いえ、Google大先生です。
エラーが出るときに「こんなエラーですよ」という文が出てくるので、これをググります。するとエラーに関する解説記事が必ず出てくるので、それを読みます。その解説記事に書いてあることを理解するための知識が足りないなら、足りない知識をググって補完します。頑張って解説を読むと何が間違っているのか わかってくるので、そこを修正します。すると次に進むことができるわけです。
100個エラーが出ているなら100回これを繰り返せ、というわけですね。
脳みそ筋肉なの?馬鹿なの?という声が聞こえてきそうですが、とにもかくにも僕がやったのはこれの繰り返しです。100回繰り返す、と言っても同じエラーが出た時はすぐ解決できるようになるので、だんだん成長し、効率化することはできます。さらに、エラー解決と同時に周辺知識もついてくるので、コードの意味も全体を通してわかってくるようになります。僕は今画像の深層学習をしていますが、コードのほとんどの意味を理解しているつもりですし、簡単な応用ならできるようになってきています。
おおまかなところ、僕が提案する勉強法は以上のような感じです。まとめると
という流れです。
このやり方が最適解なのかはわかりませんが、とにかく、何かが作りたいなら「勉強」の段階をどこかのタイミングで超えて、「実際に作る」という作業をしなければ何も生み出せないとは思います。
補足とデメリットの事
上の勉強法の解説ではコードを書く部分について話を深めていますが、そもそも「深層学習ってなんなん?」ということをわかってないと実装は難しいです。エラー解決をしながら、本を買ったり、解説記事を読み漁ったりして理論側の知識を増やすべきです。
具体的にどんなコードを書けばいいのか、は皆さんが知りたがっているところだと思います。そのレベルになると「教材」になるので、今回の勉強法の解説記事としては具体的なコードには触れないです。ただ、何かしらの方法で僕が今まで書いたコードはすべて公開してだれでも見れる状態にしようと思っています。
また、現在大学のプログラミング勉強会を立ち上げていて、そこでの教材として深層学習実装テキスト、なるものを僭越ながら作っています。めっちゃ評判いいので、もしかしたら公開するかもしれないです。
この勉強法のデメリットについてです。
この方法だと最短で実装まで到達できる代わりに、プログラミングに関して網羅的な知識を得ることができないです。必要な部分だけを虫食い状態で知っている、ということになります。なのでこの先「わからないこと」に出くわすのは明らかで、その都度エラー解決をし、必要な知識の吸収をしないといけません。
また、このやり方だとほかの人が書いたコードを読む力、があまり養われないように思います。自分で書いたコードが動けばいいや、という思考になりがち。人から教わるときに苦労しました。
最新論文の実装、などはすぐにできるようにはなりません。写経が最初なので、基本的にはほかの誰かがやったことを真似する、ということになります。深層学習を臨床応用する際、最新の手法を実装する必要はないと思いますが(むしろある程度確立されて実績ある手法が良い)、最新手法を試したい!という人は地道な基礎の勉強をするべきかもしれません。
終わりに
ここまで読んでくださって本当にありがとうございます!勉強法って無限にあるので、合う、合わないがあるのは仕方がないことです。ですが、僕の経験をもとに、こう考えるべきでは、という部分を言語化しました。なにかを「作ることができる」のはとっても楽しいことです。初めてCNNが動いた時の感動を忘れてないですし、その感動を皆さんにも味わってほしいです。挫折しちゃうくらいなら、まず一冊本を買って写経してみてはいかがでしょうか!?
最後にデメリットについて触れたように、自分自身のプログラミング技術の限界を感じ始めている部分があって、これから解決しないといけない課題はたくさんあるのだと思います。そのあたり、今後の僕の課題と成長を含めて記事にできたら、後輩たちの参考になるのかなと思っています。
今後とも何かしらを記事にしていこうと思っています!読んでくださってありがとうございます!!
一般平均地方医学生が深層学習を実装するまで
こんにちは!はるなしです。地方大学の医学部4年生です。
最初の記事ということで、「平均的な医学生が深層学習を実装するまで」というテーマで書いてみようと思います。駄文お許しください。
書くこと、書かないこと
「深層学習を実装するまで」はおおざっぱですね。この記事のゴール、すなわち今の僕の到達地点を正確に書くなら
インターネット上の新型コロナウイルス肺炎X線画像をつかって、Google Colabでプログラミングをし、CNNや転学習を用いてコロナウイルス肺炎/その他の肺炎を判別する正解率82%のモデルを作ることができる。
その後、医局にお願いして実際の医療データをいただき、臨床に応用できそうなモデルを作ろうとしている。
です。
今回は僕がこのゴールに至るまでの道のりを記事にしようと思います。
記事の趣旨は、プログラミング知識皆無の医学生の学習経過を失敗、無駄を含めてリアルに伝えることであって、最短学習法の紹介などではありません。過去の僕はその手の記事を読んでも、「そんなにうまくいかないよ、やっぱ素人にはプログラミングは無理だ」と心が折れることが多々ありました。そんな僕があえて泥臭い記事を書くことで、勉強を始めた人の励まし、あるいは勉強中の方の学習法見直しにつなげてもらえればと思います。
AI、なんかすごいね
プログラミングやろうかな、と思ったきっかけは2年生の時に東京大学松尾豊先生の「人工知能は人間を超えるか」を読んだことです。
最近AIがすごいらしい、医者の仕事も奪われてしまうかも!?というぼんやりとした不安を抱えていた僕でしたが、その本を読んで深層学習を具体的な問題解決の手法としてイメージすることができるようになりました。不安は期待に変化し、あれもできそう、これもできそう、と妄想は膨らみ、「プログラミング勉強して人工知能を作ってやろう!」と決意しました。
Progate、その先にあるもの
鼻息荒くプログラミング勉強法を検索し、初心者にはProgateというサービスが良いらしい、やってみよう、ということになりました。
無料版を試してみると確かに完全初心者にわかりやすく、「学習している実感」みたいなものを得ていました。すぐに1000円課金して毎日せっせと勉強し、1か月後にはコースを修了し、pythonで動く「じゃんけんゲーム」をつくることに成功していました。
じゃんけんゲームです。
その先がありませんでした。次に何を勉強するべきなのか、何を検索したらいいのかすらわからず、途方に暮れました。何かしないといけないな、と思い、コードを覚えていないから、ということでProgateの2周目をしたりしました。しかしだからと言って何かができるようになるわけもなく、つまらなくなり、やがて勉強するのをやめました。このようにして僕の第一次プログラミングブームは終焉を迎え、冬の時代へと突入しました。
Google Colabと理解を求める時代
僕が冬眠している間にも医療に関わるAIは様々な成果を上げていました。消化管の授業で早期腫瘍を高精度で発見するAIが紹介されたり、AIで医者がいらなくなる、とネットニュースで特集があったりしました。それらの話題は徐々に僕の心を揺さぶり、温め、「やっぱAIはこれから重要だ、もう一度勉強して今度こそ何か作るぞ」と心に決めることとなりました。(冬眠期間約1年)
Progateを離れてとにかくコードを書けるようになりたい、ということで探し回るとGoogle Colabに出会いました。初めて自分のパソコンでPythonが動き、勉強のテンションも上がりました。
僕は前回の勉強が失敗した理由を「深層学習に対する理解が足りないからだ」と考えました。じゃんけんゲームは仕組みを理解していたから作ることができた、深層学習も具体的なすべての計算を理解することで自作できるはずだ、と考えたのです。
言うまでもなくこれは完全に沼でした。
僕は頭が悪い
体系的な教科書が欲しいと思い、「pythonによるAI・機械学習・深層学習アプリの作り方」という本を買いました(3200円)。そのおかげでアヤメやMNISTなど有名な問題があることには気づき、具体的なコードの存在を把握することができました。
ためしに、MNISTのコードをColabで丸写し(写経)してみると確かに動きました。しかし当時の僕はそこに書いてあるコードをひとつも理解することができませんでした(だって、Progateで習ってない!)。なにやらわちゃわちゃとコードが書いてありますが、結局大事なのはmodel.fit()という行だけのようです。・・・(´゚д゚`)ハァ?もっと計算式とかあれよ!なにやってるのか「わからない」だろうが!
ということで僕はもっと詳しい解説を求めてネットを放浪しました。深層学習については解説記事がたくさんあり、それぞれについて理論はわかるのですが、実際のコードでなぜそれを再現できるのか意味不明でした。当時の僕の状態は
「実際に動くコードを丸写ししたけど、何をやっているのか全く分からない。応用のめども立たない。やっぱプログラミングって難しいな」
という感じです。何度かコードを理解しようと頑張ってみましたが、結局挫折しました。今度こそ、という決意をもって始めただけあって、失望も大きかったです。世の中にはプログラミングできる人はいっぱいいるのに、僕には無理だ。その理由はおそらく、僕の頭が悪いからだ、と結論しました。僕はがっかりして、あきらめ、情けなくなり、プログラミングから離れました。こうして僕の心は凍り付き、2度目の冬が訪れます。
プログラミングをする必要性と最も重大な転機
少し、深層学習の話から外れます。
これは完全に個人的な事情なのですが、僕の大学では3年生の秋に研究室実習というものがあり、1か月好きな研究室に配属されます。僕は免疫学講座で研究の手伝いをすることになりました。
講座でやった研究を大さっぱに言えば、Tcellに様々な刺激を与え、その分化(Th1とか17とか)を見てみよう、というものです。こうなるはず、という予想があったのですが、その予想がことごとく外れてよくわからない結果となりました。なのでちょっとずつ条件を変えたりして、何回も実験を繰り返しました。しかし何回やってもうまくいかず、そのたびに条件を変え、ますますわけわからなくなりました。
ということでサンプル数ばかり増え、実験条件もとんでもない数になりました。で、間抜けなのですが僕は最終的にそのデータが意味するところが全然分からなくなってしまいました。何とかしてレポートを書かないといけないのですが、このままだと「いっぱい実験したけどよくわかりませんでした」という情けない内容になってしまいます。データを眺めると、様々な実験条件があるものの、なんとなく分化は結局2パターンになるような気がしました。これを何とかして客観的に説明できないでしょうか。
いろいろ調べるとtSNEという次元削減方法にぶち当たりました。要するに「いろんな実験条件があったけどそれら加味して全体的な結果の分布はこんなかんじ」という説明をしてくれる機械学習の手法です。これをやりたいと思いました。医学生がよく使う統計ソフトEZRではできないようです。調べてみると、Pythonを使ってtSNEをやっている人がネット上にいました。これをマネできたら僕のレポートは少しはまともになるかもしれません。僕は再びColabを立ち上げ、若干の期待と不安を胸にプログラミングの世界へと足を踏み入れたのでした。
実は、これが最も重要な転機です。僕は解析したい生データを得て、プログラミングによって実装したい具体的な目標(tSNE)ができたのでした。
なんか、できたわ!
前回までのプログラミングブームとの違いは、「解決したい具体的な問題がある」ということです。この問題が解決さえすれば極論中身はどうだっていいのです。tSNE解析にあたっていろんな人のブログを読みましたがやはり少し難しく、Aidemyの機械学習講座(2000円くらい)を購入しました。いろんな機械学習の方法が紹介されていて正直よくわからなかったのですが、tSNEの部分だけ読みました。そこに書かれているコードの写経を行い、与えられたデータでtSNE解析をすることができました。いよいよ自分のデータで解析したい、のですがColabで自分のパソコンにあるファイルを読み込むことができません。ここで結構途方にくれたのですが、以前に買った「深層学習アプリ本」にColabにデータを読み込む方法が書いてあったな、と思い出し、「データ読み込み部分」と「Aidemyの写経部分」を組み合わせてColabで動かしました。なんやかんやエラーがあったのち、、、できました!正直よくわからずにコードが動いたのですが、ともかく初めて自分で書いたプログラムが動いたのです。かなり感動しました。
初めての成果物がこちら↓
とにかく、ちゃんと出力ができたのです。
※後日談 実はtSNE解析、EZRでできるそうです。なんじゃそりゃ。ちなみにちゃんと勉強すると今回のデータに対してtSNEを使うのはあんまり適切じゃないようです。おいおい。さらに、Colabでの解析は結局レポート提出期限には間に合わず、何が言いたいのかよくわからない実験と結果をつらつら並べた悲惨なものとなったのでした・・・。トホホ・・・。
コピペでいいんだ。ほかにもできることありそう
ここで僕が悟りを開いたのは、「プログラミングは問題解決の手法であって、目的ではない」ということです。第一次、第二次ブームではプログラミングで何をしたいのか、すなわち目標をまったく考えていませんでした。免疫学講座の実習で学んだのは、プログラミングはまず動かす、実装することが大事、ということです。少なくとも素人がプログラミングをしたいなら、プログラミングの勉強→やりたいこと→実装 ではダメで、やりたいこと→コピペ・組み合わせ→実装→プログラミングの勉強、のほうが効率が良いようです。
それを踏まえて「深層学習アプリ本」、その他のブログ記事などを読むといろんな知識がするする入ってきて、勉強が進みました。例えば、まず、アヤメデータの分類がしたい、という目標があり、ブログ記事などのコードを真似=写経し、実際に動くことを確認、その後それぞれの行が何を意味しているのか勉強しました。わからない部分があってもこだわりすぎず、先に進めました。お手本のコードが大方理解できたら、自分オリジナルの課題を見つけて、その課題を解いてみました。
以下に、僕がその後やったことを簡単にまとめます。
アヤメデータの分類(写経)
健診データの分類(オリジナル課題)
MNISTをニューラルネットワークで分類(写経)
MNISTをCNNで分類(写経)
肺X線画像の男女判別(オリジナル課題)
特に、自分で達成したい課題を決めて、具体的な問題に取り組みながら勉強する、という手法が良かったのだと思います。
挫折しかける、先駆者の講演
上にやったことを簡単にまとめましたが、それぞれの項目で問題なく進んだわけではないです。様々なわからないことがあり、解決できないエラーがあり、苦労しました。深層学習モデルそのものに対するエラーより、データの読み込みや整形などで手間取ることが多かったように思います。一つのエラーに1週間引っかかる、なんてこともざらにありました。
いくつかのエラーがどうしても解決できなくて、冬の時代に入りかけたことがありました。そんな時、ある医局の掲示板に「プログラミング初心者がAI研究をはじめるには」という内容で講演があるよ、というポスターがありました。今思えばそれは外部から講師を呼んだ医局内の勉強会で学生向けではなかったのですが、興奮した僕はその場で困惑する秘書さんを捕まえ、参加させてください、とお願いしたのでした。
講演してくださったのは東京大学循環器内科の小寺聡先生でした。先生は完全初心者からプログラミングの勉強をはじめ、心不全の判断をX線画像から機械学習で行う研究をされていました(最近論文が出版されています)。医療者がプログラミング勉強をする難しさにも触れられ、そのうえで皆さんにもできますよ、ということを伝えていただきました。
そこで紹介されていた勉強法が僕が行っているものと似ていたので、非常に勇気をもらいました。おおざっぱに言えば、初心者がコードをゼロから書く必要はなく、ネット上で公開されている記事やKaggleのコードをまずコピペして、それを自分の課題に対応させるのが良い、ということです。僕は教室の隅で講演を聞き、今やっていることは間違っていない、勉強を続けるぞ、と決意を新たにしたのでした。
その後と具体的な研究への参加
そんなこんなで僕はコロナウイルスの肺炎判別、を作ることができました。最初は精度低かったですが、データを増やしたり、転学習を行ったりしてだんだん良いものになっています。
僕は実際の現場に関わるデータを扱いたい、と思い、学生の研究参加を歓迎しているある講座に突撃しました。教授と相談し、この講座では深層学習をすぐには活かせないけど、他の講座でやりたがってるところがあるから紹介してあげるよ、ということになりました。その後実際に紹介があり、ある医局で現在、生の臨床のデータを扱って研究を進めようとしています。(まだ環境構築の段階です)
ここがゴール(僕の現在地)です
終わりに
ここまで読み進めていただいてありがとうございます。思っていた数倍長くなってしまいました。
おそらく、Prpgateなど基礎的な勉強をしたものの、次が続かない、という冬の時代にいる医学生は多いのではないでしょうか。そのような方々が、僕の軌跡を少しでも参考にしていただけるとありがたいです。医学生のプログラミング勉強法、みたいな話はまた別で書こうと思います。今回はある平均大学生の「うまくいかなかった感じ」を伝えることを主眼としました。
また、この記事でいくつかのサービスだったり本だったりを紹介しましたが、それらが無意味、というわけではありません。それぞれ必要な勉強だったと考えています。それらの組み合わせが重要ということです。
実際に研究を進めた実感、医学生がプログラミングすることについての意義、将来性、勉強法、これから先にやろうとしていることは別記事とします。機会があれば書きます。今回はここまで!どうもありがとうございます。