U-NetでPASCAL VOC 2012のImage Segmentation
この記事の内容
この記事では、U-Netを使って、PASCAL VOC 2012データセットのセグメンテーションをしてみます。PyTorchで実装したソースコードは以下で公開しています。
https://github.com/shioili/unet_voc/tree/master
はじめに
前回の記事では、Deep Learning向けのGPUマシンを作成しました。 cinnamell.hatenablog.com
今回は、これを使って、画像のセグメンテーションタスクを学習させてみます。セグメンテーションとは、画像に写っているオブジェクト(例えば、犬、猫、車、など)を、ピクセル単位でクラス分けするタスクです。例えば、下の写真を入力とすると、飛行機や、車、人などを識別して、それぞれに色を塗った画像を出力します。
セグメンテーションの学習に使えるデータセットは、上の画像のように、写真と、それに対応するセグメンテーションの正解データから構成されます。いくつか有名なオープンデータセットがあるのですが、今回はPASCAL VOC 2012を使います。
セグメンテーションに使うネットワークは、とりあえずU-Netを実装してみることにします。U-Netは比較的単純なネットワークなので、実装が容易だと考えたからです。U-Netの詳細については、ネットに詳しい記事がいっぱいあるので、そちらをご覧ください(手抜き)。
学習
学習にはPASCAL VOC 2012には、セグメンテーションデータがついている画像が2913枚用意されています。今回は、このうち、ランダムに選んだ2713枚を学習に使います。その他の200枚は、テスト用に使います。
学習時には、前処理として、画像から256x256サイズをランダムに切り出して(Random Crop)使います。画像のサイズを揃えておかないと、バッチを作ることができないのが1つの理由ですが、ランダムに切り出すことでデータ量を水増しする効果も期待できます(ただし、ランダムにクロップしない場合に比べて、本当に汎化性能が良くなるのかはわかりません。)
学習時のLossの遷移は下のグラフのようになりました。ちなみに、390 epoch学習するのに、およそ9時間ほどかかりました。
ちゃんと学習できてますね。ただ、ここまで来るまでにいくつかハマりポイントがありました。
1つ目はBatch Normalizationです。U-Netの元論文では、Normalizationに関する記述は何もありません(その代わり、初期値の与え方について記述がある)。しかし、実際には、畳み込み層の後にBatch Normを入れてやらないと、学習がほとんど進みませんでした。Batch Normを入れる知恵は、こちらの記事を参考にさせていただきました。
qiita.com2つ目は、Random Cropのサイズです。上で書いたとおり、学習時には、画像を256x256に切り出して使っています。最初、128x128で切り出していたのですが、これでは全く学習できませんでした。256x256なら学習できます。U-Netは完全に畳み込みだけで構成されたネットワークなので、クロップのサイズはあまり関係がないようにも思うのですが・・・結局、なぜ256x256にする必要があるのか、理由はよく分かっていません。小さいサイズではPaddingが悪さをするのでしょうか。
テスト
学習したモデルで200枚のテスト画像を評価してみました。平均Accuracyは80%ということで、まずまずセグメンテーションできていると言えるのではないでしょうか。もっとも、なんのオブジェクトも属しないバックグラウンドも含めたAccuracyなので、実際に絵を見てみると、まだ識別ミスが多いなーという印象です。
最後に
とりあえず、それなりにセグメンテーションができていることが確認できたのは満足です。ただ、まだ精度に課題がありますので、次はPSPNetあたりを試してみたいところです。
RTX 2070で組むDeep Learning向けPC
初めに
最近、Deep Learningを使った仕事をしています。この分野は進歩が速いのもそうですが、意外と歴史も深いので、勉強しないとなかなかついていけません。そんなわけで、家でちょっと勉強してみようかなと思ったわけですが、先立つものがなければ始まりません。GPUマシンです。これがないと、機械学習を実際にコーディングしたり動かしたりすることは非現実的です。もちろん、論文を読むだけならば、そんなものは必要ありませんが、自分で実装して動かしてみるのが一番理解が進みますし、なにより楽しいですからね。
というわけで、自宅でもDeep Learningの学習・推論ができるように、GPUマシンを組むことにしました。
パーツ
今回使うパーツたちです。メモリとケースはAmazon、それ以外は秋葉原のツクモで買ったのですが、全部含めて15万円弱です。意外と安いですね。
一番大切なGPUにはmsi製のRTX 2070 Superを選びました。GeForceで最高スペックのGPUを選ぶなら2080 Superがありますが、プラス2~3万の出費はちょっとつらかったので妥協して2070 Superです。安さ重視ならGTX 10xx系もありますが、Turinigから採用された機械学習向けのTensorコアがないので、機械学習用とならばRTX 20xxが良いのかなと思います(ただ、実測としてどの程度速度の差があるのか比較できないので、コストに見合う価値があるのかは不明です)。
CPUは第9世代のcore i7 9700です。OCする気はないのでKなしモデルです。それにしても、第8世代も第9世代もCoffee Lakeなので、ややこしいです。
ストレージのSSDにはSamsungの860 QVOを選択です。現在一般に普及しているSSDは、1つの記録セルに3bitの情報を詰め込むTLC NANDを採用しているのですが、この860 QVOは4bitを詰め込めるQLC NANDを採用しています。容量効率が高い分、お値段はTLCよりも安めに設定されています。もっとも、同じ1TのTLC SSDが1.1万程度なのにたいして、860 QVOは9千円程度なので、そこまで劇的に安いというわけではありません。QLCによる性能や信頼性の低下を考えると、QLCを選ぶ価値があるのか微妙なところです。
電源は少し余裕を見て750Wのものを用意しました。ちなみに、OSはUbuntuを使うので、Windowsは買ってません。
組み上げ
それではどんどん組み上げていきます。
マザボにCPUをはめ込んで
ケースに電源とマザボを取り付けて、
ケースの背面に電源やSATAケーブルを配線していきます。それにしても背面に配線できるのはいいですね。見た目がすっきりするのはもちろんですが、ファンにケーブルが干渉したりするのを気にしなくて良いのでとても楽です。
今回の目玉のGPUです。
GPUをPCIeに差し込んで、蓋をしたら、、、完成!!
最後に
無事組みあがって、電源を挿して、電源ボタンをプッシュ・・・起動しました!よほどのことがなければ起動しないということはないと思いますが、それでも最初の通電時はちょっと緊張します。
今後の記事では、このマシンで実験した結果などを報告したいと思います。
IN WIN ChopinとM.2 SSDで組むコンパクトPC
自宅で使っているPCは2011年に買ったものでだいぶ年季が入ってきた。ブラウジングする程度では大して不自由していなかったが、ストレージがHDDだから起動に少し時間がかかるのが不満だ。それになによりPCを組んで遊びたい。そんなわけで久々にPCを自作することにした。今回作るPCのコンセプトは「コンパクト」だ。
ケースにはIN WINのChopinを使用し、デスクの上にも置いておけるコンパクトさに仕上げる。ChopinはMini-ITX専用ケースで電源を内蔵している。
ストレージにはM.2 SSDを使う。別にSSDを小さくしたところで外から見えるサイズは変わらないけれど、ケーブルフリーだから内部のケーブリングが少しすっきりするはずで、そういう意味ではコンパクトだ。まあM.2を使う一番の理由は単にM.2を使ってみたかったからってだけなんだけど。
せっかくM.2 SSDを使うならNVMeのやつが欲しい。SATAでも体感は変わらない気がするが、どうせなら新しい技術を試したい。そんな動機で選んだのはIntel 600pシリーズ。NVMe SSDとしては控えめな性能だが、その分お手頃価格に抑えられている。
マザボはツクモの店員におススメされたASUSのSTRIX B250I GAMINGを採用する。NVMe SSDは発熱が大きいという噂だったが、このマザーはM.2スロットにヒートシンクがついているので、SSDの冷却の点で嬉しい。
Chopin内蔵の電源は150Wと小さいので、CPUはTつきのCore i5 7600Tを選んだ。
組み立て開始
秋葉原を徘徊してパーツ一式を購入してきた。Chopinは小さくて軽量なので全部のパーツを手で持って帰れた。
上記のパーツにメモリとOS(Windows 10)を含めた全部の予算は11万弱くらい。
まずはケースにマザーボードを固定。ChopinはMini-ITXのマザーがギリギリ入るサイズに作られている。
CPUとメモリを乗っけて電源回りを配線。CPUファンはとりあえずリテールクーラーを使う。Chopinは高さ(幅?)があまりないのでファンがケースに収まるか少し心配していたが、さすがにリテールクーラーは余裕で収まった。
SSDをM.2スロットに装着する。単に挿してネジで固定するだけなので楽ちん。
SSDの上からマザボ付属のヒートシンクを被せてSSDの取り付けは完了!
残りもろもろのケーブルを配線して完成!しかしこのChopin、ケースが小さいくせにケーブル類が無駄に長くてかなり持て余す。もう少し短くてもいいのになぁ。
デスクに置いておいても全く邪魔にならないサイズに仕上がった。
Intel 600p 512Gの性能実測
せっかくNVMe SSDを入れたのでCrystalDiskMark 5.2.2で性能を計ってみた。味見程度なのでザクっとデフォルト設定(1Gx5)で計測する。
Sequential Readの高さが際立つ。この指標ではSATA SSDに対してアドバンテージが大きいといえそうだ。ただWrite系は下の記事で報告されているSATAのPlextor S3Cと比べて多少いい程度か。
とはいえ値段を考えればコスパは良いといえるのかな。正直SSDを追い込むような使い方しないし。
最後に
とりあえず今のところ快適に利用できている。
それにしても久々にPC自作できて楽しかった。PCを作ったらモニタも新調したくなってきたなー
【箱根ハイキング】飛龍の滝と浅間山【箱根湯本→畑宿→湯坂路入口→宮ノ下】
ここ最近、秋めいて涼しくなってきた。運動するにはぴったりの気候だ。そんなわけで、久々に箱根にハイキングに行ってきた。
今回は以下のようなルートで歩く。
①旧東海道:箱根湯本→畑宿
②ハイキングコース:畑宿→飛龍の滝→湯坂路入口
③ハイキングコース:湯坂路入口→浅間山→宮ノ下
ちなみに、ハイキングコースは箱根町観光協会が公開している以下の地図が分かりやすい。
http://www.hakone.or.jp/hiking/pdf/hike.pdf
旧東海道:箱根湯本11:30→12:30畑宿
今日も箱根湯本からスタート。旧東海道は何度も歩いた道だが、江戸時代の石畳が残っている箇所があり、何度歩いても楽しい。
とはいえ、半分以上はこんな感じの普通の道路を歩かなければならない。それなりには車も通るし、ちょっと気を使う。
須雲川の集落からハイキングコースや石畳を歩くコースになる。昨晩はそれなりに雨が降ったのだが、石畳のおかげで快適に歩けた。さすがは幕府が整備させた主要道路である。
約一時間ほどで畑宿に到着。
飛龍の滝:畑宿13:00→13:30飛龍の滝→13:50湯坂路入口
ちょうどお昼の時間だったので桔梗屋でとろろ蕎麦を頂いて腹ごなし。さて、飛龍の滝に向かおう。
飛龍の滝へ通じるハイキングコースは旧東海道を畑宿の集落の端まで登り切った辺りから分岐している。写真の左側に伸びている道がそれである。しばらくは細い舗装道路が続くが、少し登るとハイキングコースになる。
およそ30分ほどで飛龍の滝の到着。正直そんなに綺麗な滝ではないかなぁ。ここなら足柄峠の夕日の滝のほうが垂直に水が流れ落ちていて綺麗だったと思う。
滝から先も二子山の東側をずんずん登っていく。滝の周辺は倒木があったりと少しワイルドな道が続くのだが、
10分も登ると勾配も緩やかになる。
飛龍の滝から30分弱、畑宿から1時間弱で湯坂路入口に到着。このすぐ近くに湯坂路入口バス停があるので、バスに乗って帰ることもできるのだが、まだ歩き足りないので宮ノ下まで歩くことにする。
浅間山ハイキングコース:湯坂路入口14:20→14:55浅間山→15:50宮ノ下
芦之湯のあたりにあるトイレに寄ってからハイキング再開。トイレが意外と遠く、30分ぐらいロスしてしまった。
湯坂路入口から、千条の滝と浅間山の分岐点までは尾根伝いの明るい道が続く。
途中、鷹巣城跡なる場所があったり(ベンチがあるだけで見所は皆無)、
一瞬だけ木の合間から展望が開ける場所があったりと歩いていて楽しい道だった。
分岐から10分ほどで浅間山に到着。一応山頂だが、眺望とかは全く無いので期待してはいけない。
浅間山からは大平台・宮ノ下・小涌谷方面にそれぞれ抜ける道が出ている。前回は大平台方面を歩いたので、今回は宮ノ下方面に下ってみることにした。
前回の大平台へ抜ける道もそうだったが、空は快晴だというのに鬱蒼としていて薄暗い。おまけに誰も歩かないのか、登山道をさえぎるように蜘蛛の巣が張っていて、あまり快適な道ではなかった。実際、湯坂路入口から宮ノ下までの道で人間とは1人も出会わなかった。
途中見晴らし台があり、雲の影から富士山が見えた。
下山開始から50分ほどで登山電車の線路に出くわした。簡易的な踏切があり、線路を横切るようにハイキングコースが通っている。
浅間山の頂上から1時間弱ほどで宮ノ下に到着!
ホテルやおしゃれな店が立ち並んでいて、さっきまでの鬱蒼とした空間が嘘のようだ。
おわり
宮ノ下からほど近い底倉温泉にある「ての湯」で汗を流して帰る。宮ノ下の他の日帰り施設と違い、広い露天風呂があるのは嬉しいが、1700円はちょっと高いかなー
いつものように登山電車で小田原まで帰って、今回のハイキングもおしまい!
夏の青春18きっぷ 中国四国旅行
青春18きっぷで中国四国地方を旅行して来ました。この記事はその備忘録です。
旅程
8/15(火)
①東海道線[321M]:戸塚558→727沼津
②東海道線[1851M]:沼津735→830静岡
③東海道線[737M]:静岡849→1000浜松
名古屋で途中下車してお昼ご飯。何度か利用している華明閣で台湾ラーメン。駅から近いからよく使っているけれど、正直ここの台湾ラーメンは辛さやにんにくのパンチがいまいちなんだよなぁ。
⑥東海道線[2317F]:名古屋1245→1316大垣
姫路の駅そばは独特でとても美味しい。
⑨山陽本線[3477M]:姫路1707→1727相生
⑩山陽本線[1331M]:相生1728→1839岡山
⑪山陽本線[379M]:岡山1840→2041白市
⑫山陽本線[1575M]:白市2056→2143広島
8/16(水)
①山陽本線[513M]:広島1000→1051岩国
②山口線[665D, 2545D]:新山口1333→1517津和野
津和野で途中下車して散策。
③山口線[2549D]:津和野1656→1740益田
今晩は益田に泊まる。お世辞にも都会とはいえないが、コンビニや飲食店があり滞在するには十分な街だ。
折角の山陰なので、のど黒の寿司。
8/17(木)
①山陰本線[3450D]:益田743→905温泉津
山陰本線の車窓。この区間は断崖の海岸沿いを走るため眺望がとても良い。よくこんなところに鉄道通したなぁ。
温泉津で途中下車してちょっと散策。薬師湯に浸かったのだがお湯はかなり熱め。
②山陰本線[3452D]:温泉津1046→1219松江
松江の町を散策。山陰一の大都会だし観光名所も多いので、泊まるなら益田とかよりも松江の方がおすすめだ。(今回は石見地方に行ってみたかったので敢えて益田に泊まった)
③山陰本線[286M]:松江1454→1534米子
④伯備線[828M]:米子1608→1802新見
伯備線の県境区間は普通列車の本数が少ないので、青春18きっぷで陰陽を移動するのは少し不便だ。
⑤伯備線[864M]:新見1850→2037岡山
8/18(金)
①瀬戸大橋線[3107M]:岡山710→808高松
高松は意外と都会だった。
うどん県に来たからには朝うどんでしょ。というわけで、さか枝で朝っぱらからうどん。これで300円は安い!
②高徳線[4323D]:高松1002→1206徳島
フェリーで和歌山へ渡る予定なのだが、16時半の出航までは時間がある。駅前の駐輪場でレンタサイクルを借りて徳島の街をぶらぶら回る。やっぱり瀬戸内地方の高松に比べると街の規模は小さい印象。
④南海フェリー:徳島1630→1835和歌山
やっぱり船旅は楽しいなぁ。特にこの南海フェリーは淡路島に沿って通るため、景色をずっと眺めていても飽きない。
駅前の串カツ屋で一杯。串カツはガッツリ飲み食いしても安く上がるのでうれしい。
梅田は大都会。
8/19(土)
①東海道線[704K]:大阪639→713京都
⑦東海道線[786M]:浜松1227→1238磐田
焼津で途中下車してみたけれど、あまり見所は無いかな。ってか熱すぎ。
浜松からここまで211系3両編成ばっかりなんだけど、313系はどこへ行ったんだろう。静岡の211系はトイレ無しだし窓が汚い車両が多いから、ちょっと外れを引いた気持ちになる。
⑩東海道線[442M]:焼津1518→1701熱海
熱海駅前温泉で汗を流す。ここの温泉は駅近で便利なのにお湯が濃くておすすめ。
⑪東海道線[1638E]:熱海1812→1928戸塚
これにて今回の旅行はおしまい。
【箱根ハイキング】湯坂路で箱根湯本から大平台まで
久々に箱根にハイキングに行きたい。しかしもう8月である。がっつりハイキングするには暑すぎる。そこで箱根湯本から2時間程度で歩けるコースに出かけた。
今回は箱根湯本から湯坂路を通り城山まで登り、そこから大平台へ下る。ルートは下のリンクのマップが分かりやすい。
http://www.hakone.or.jp/hiking/pdf/hike.pdf
箱根湯本出発[10:40]
夏空の箱根湯本を出発。
地図では湯坂路は地図の赤いピンの場所にあるように描かれている。しかし、どこを探してもハイキングコースなどない。周辺を少しうろうろしてようやく青いピンの場所に入り口を見つけた。どうも地図で描かれていた点線はハイキングコースではなく、普通の道路だったらしい。
ハイキング開始[11:00]
入り口も見つかったことだし、さっそくハイキングを始めよう。上の写真のように入り口は細く心細いが、すぐにハイキングコースらしいコースになる。
等高線が見れば分かるとおり、このルートは最初が一番急勾配になっている。夏も盛りの8月である。登りはじめてから10分ほどしか経っていないのに汗が吹き出す。
ひとしきり登り切ると、勾配も少しなだらかになる。湯坂路は尾根伝いのルートなので、写真のように両側が下り斜面になった道が続く。
とはいえ木の根がむき出しになった区間や
草に挟まれた区間など、ルートの表情が豊かなので歩いていて退屈しない。
大平台へ下山[12:10]
しばらく歩くと大平台方面と浅間山方面の分岐がある。今回は浅間山までは行かず、大平台へ下る。
湯坂路では数組のハイカーとすれ違ったのだが、大平台へ行くルートでは誰とも出会わなかった。あまり人気のないルートなのかな?
大平台まではそれなりの勾配の下り坂が続く。落ち葉もかなり積もっていたし少し歩きづらい。距離こそ短いものの、登ると結構辛そうだ。
45分ほどで大平台に到着!
箱根湯本から大平台までちょうど2時間くらいだった。
全身汗だくになってしまったので温泉で汗を流そう。大平台温泉の姫之湯。口コミではお湯がすごく熱いとあったが、たしかに熱かった。熱すぎて1分以上入っていられない。なんか汗を流しに来たのか、かきに来たのか分からなくなってしまった。暑い!
登山電車。今日歩いたルートはたぶん後ろに見えてる山の尾根筋のはず。
さいごに
今日歩いた湯坂路は、時間的にもほどほどだし登山電車の駅に出られるしでお手軽度はとても高いルートだった。ただ眺望が全くないのは残念な点だったかな。
京急の三浦半島1DAYきっぷで行く城ヶ島ショートトリップ
三浦半島1DAYきっぷ
京急からは面白いおトクなきっぷがいろいろと出ている。一番有名なのは恐らく「みさきまぐろきっぷ」だろう。フリーエリア内の鉄道とバスに乗れるだけでなく、提携している飲食店でマグロ料理が食べられるという切符だ。また、油壺マリンパークなどの提携のレジャー施設1箇所を利用することができる。
みさきまぐろきっぷ | おトクなきっぷ | PICK UP 京急 | 【KEIKYU WEB】京急電鉄オフィシャルサイト
それと比べると少し地味な印象なのが三浦半島1DAYきっぷ。フリーエリア内の京急線とバスが乗り降り自由というものだ。
三浦半島1DAY・2DAYきっぷ | おトクなきっぷ | PICK UP 京急 | 【KEIKYU WEB】京急電鉄オフィシャルサイト
しかしこの切符、レジャー施設は利用せず、マグロを食べるだけであればマグロ切符よりもおトクだと思っている。
上大岡からだとマグロ切符が2850円なのに対して、1DAYきっぷは1300円。マグロ料理とレジャー施設の分、マグロ切符のほうが1550円高くなっている。もし油壺マリンパークなどに行くのであれば、マグロ切符が圧倒的におトクだ。一方で、もしレジャー施設を利用しないのであれば、マグロ料理に1550円を払っていることになる。マグロ切符で注文できる料理はそんなに高くないはずなので、この場合はマグロ切符のメリットが活かせない。
逆に、1DAYきっぷはフリーエリア内乗り降り自由(マグロきっぷは後戻り不可)だし、葉山方面のバスや逗子線や浦賀方面の電車にも乗れる。マグロも好きな店で好きな料理を注文することができる。
そんなわけで、マグロを食べに行くだけだとか、京急線の乗り潰しに行くといった目的では1DAYパスの方がおトクなのだ。
上大岡から城ヶ島へ
1DAYきっぷを手に上大岡から城ヶ島へ行った。快特に揺られて三崎口へ行き、そこからバスに乗り換えて城ヶ島を目指す。それにしても京急は転換クロス車に乗せてくれるから旅行者には嬉しい。
バスを終点で降りて早速お昼ごはん。
今回はバス停目の前のしぶき亭でマグロとイカの海鮮丼を頂いた。マグロは漬けになっていたのだが、弾力もありおいしかった。
折角なので海辺を散策。この辺は地層が露出していて面白い。
横浜から1時間強の場所とは思えないような景観。
気づいたら城ヶ島大橋の辺りまで歩いていたので、そのまま三崎港まで歩くことにした。
のんびりしてるなー
横須賀で途中下車
三崎口からは国道の下を抜けて線路が少しだけ延びている。これは、油壺まで線路を通す計画があったことに由来するものだ。しかし環境保護などの問題もあって延伸は凍結となっている。
折角なので三崎口から上大岡までは適当に途中下車しながら帰る。
こちらは京急久里浜。意外と都会。
パタパタ掲示板が素敵。
こちらは横須賀中央。ショッピングモールの名前がmikasaなのが横須賀らしい。
さいごに
たった1300円で都会の喧騒とは無縁ののんびりした時間を過ごすことができた。やっぱり三浦半島はコスパがいい。そもそも、1DAYきっぷを使わなくても京急は安いので気軽にマグロを食べにいらしては如何だろうか。