オッサンはDesktopが好き

自作PCや機械学習、自転車のことを脈絡無く書きます

iOSで自作U-Net

 こんにちは.changです.

 前回に続いてiOSDeep Learningをやってみます. サンプルをベースに,自作U-Netの学習済みモデルを使ってSemantic Segmationします.

1. サンプルでSemantic Segmentation

 前回,公式からダウンロードしたソースを使います. ソースは,~/Tools/TensorflowLite下にあります.

環境変数を再設定

% echo export PATH='/opt/homebrew/bin:$PATH' >> ~/.bash_profile
% rbenv global 3.1.1
% source ~/.bash_profile
% rbenv versions

環境変数を設定しないとrbenvが動作しない.恒久設定の仕方も調べないと💦

% cd ~/Tools/TensorflowLite/examples/lite/examples/image_segmentation/iOS
% pod install

エラーになる

ç

ここ*1で紹介されている方法で解決

% xcode-select --install
% xcode-select --reset

workspaceを生成→プロジェクトを開く

% pod install
% open ./ImageSegmentation.xcworkspace

Bundle IdentifierとTeamを指定してビルド

今回も無料IDでやってます

出来ました😀

起動後にチュートリアル画面が出ます.Andorois版よりも凝った作りになっているのが不思議...

ちゃんとiPhoneカメラとリンクしました

2. 自作U-Netのtflite変換

 以前に作ったU-Net*2をそのまま使います. Tensorflowで生成されるpbファイルをTensorflowLiteのtfliteファイルに変換するソースのみを書き足しました. 今回は(高速化の為の)量子化等はせず,単純に変換だけ行います.

pb_to_tflite.py

import numpy as np
import os
import tensorflow as tf

dir = "./u-net"
input_model = dir + "/output"
output_model = dir + "/models/unet_dagm_256.tflite"

#to tensorflow lite
converter = tf.lite.TFLiteConverter.from_saved_model(input_model)
tflite_quant_model = converter.convert()
if not os.path.exists(dir + "/models"):
    os.mkdir(dir + "/models")
with open(output_model, 'wb') as o_:
    o_.write(tflite_quant_model)

Note: 変換はLinux上で行いました.

3. 自作U-NetをiPhone内で推論

(1) tfliteをプロジェクトに追加

 上で変換したtfilteをGoogleドライブ経由でMacに移植しました. 更に,examples/lite/examples/image_segmentation/ios/ImageSegmentation/modelにコピーし,プロジェクトに追加しました.

フォルダにコピーするだけでなく,明示的に追加する必要がありました

(2) 自作モデルの読み込み

 ソース内で定義されていたモデル名を指定.

ImageSegmentator.swift

  static let modelFileName = "unet_dagm_256"
  static let modelFileExtension = "tflite"

 デバッグ実行するとエラーになりました. ちなみに,Androidでは同様に変換したtfliteを読めました. iOSでは独自の変換が要るという事でしょうか?

tensorサイズで怒られている?

4. むすび

 時間掛かりそうなので,一度区切ります. 集中すれば出来そうなんだけどなぁ😮‍💨

iOSでTensorflowLite

 こんにちは.changです.

 ほぼ自分用のメモですが,MacでTensorflowLiteのサンプルをビルドして,iPhoneカメラでobject detectionするまでの記録になります.

1. 必要ツールのインストール

(1) Visual Studio Code

 今回は設定ファイルの編集に使うだけですが,必ず使うので入れておきます.

  • ここ*1からダウンロード
  • FinderのApplicationにコピー
  • Terminalから起動する為に,F1⇨Shell Command: Install 'code' command in Path

VScode.Applicationフォルダに実行ファイル毎(?)置くというのが,Linuxユーザーからすると新鮮です

(2) markdown

TensorflowLiteとは全く関係ないのですが,記事の下書きをするのに使いました.

(3) git

 Xcodeと一緒に入っていた為にインストール不要で,ver.確認だけしました.

% git --version

git のversionを確認

(4) rbenv

 これが無いとcocodpodsが入らない様です*2*3環境変数の追加まで行いました.

brewをインストール

% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"  
% echo export PATH='/opt/homebrew/bin:$PATH' >> ~/.bash_profile  
% source ~/.bash_profile
% brew update  
% brew install rbenv ruby-build

続いてrbenv

% rbenv versions
% rbenv install -l

インストール可能な最新版は3.1.1

% rbenv install 3.1.1
% rbenv versions

未だPathが通っていない

環境変数を設定

% rbenv global 3.1.1
% sudo code ~/.bash_profile

~/./bash_profile

[[ -d ~/.rbenv  ]] && \
  export PATH=${HOME}/.rbenv/bin:${PATH} && \
  eval "$(rbenv init -)"

  vimが苦手なので,VSCodeで編集しました.

% source ~/.bash_profile  
% rbenv versions

無事に入ったっぽい

  面倒なことに,環境変数設定はTerminalを再起動すると無効になってしまう様です

(5) CocoaPods

% sudo gem install cocoapods

CocoaPads.依存パッケージも色々入ります

% pod setup

ここまでが結構長かった...

2. 公式サンプルのビルド

 公式*4*5を見ながら進めます.

(1) ソースを取得

% cd ~/  
% mkdir Tools  
% cd Tools  
% mkdir TensorflowLite  
% git clone https://github.com/tensorflow/examples.git  

(2) workspace fileを生成.

% cd ~/Tools/TensorflowLite/examples/lite/examples/object_detection/ios  
% pod install

*.xcworkspaceができる

(3) いよいよXcode

プロジェクトを開く

% open ./ObjectDetection.xcworkspace

Xcodeが開く

TARGETを確認

Bundle Identifierを指定

ドメイン名というのが良く解ってないので,適当です

Apple ID

今回はDeveloper ID無し*6でやります.

Add count

Apple IDとパスワードを入力

Personal TeamにApple IDを指定

実機を繋いでいざビルドと思ったが...

ver.不整合でビルド出来ず

3. Xcodeを更新(付随的にiOSも)

Xcodeのver.を確認

ver. 12.5.1が入ってしました.何も意識せずに入れたな💦

App StoreからXcode 13.2.1に更新しようとしたら,先にOSの更新を求められた...

先は長そうですが,めげずにiOS ver.を更新

Montereryというのも良く解って無いので怖いな...

無事に更新されました.

いきなり12.3.1にはならず,2段階で入った感じでした.UIの外観もかなり変わりました

再度Xcodeを更新

更に新しい13.3.1が見つかりました.日が経ったからかな?💦

無事に13.3.1が入りました.

時間掛かりました...

4. 再びビルド

プロジェクトを開く

% cd ~/Tools/TensorflowLite/examples/lite/examples/object_detection/ios  
% open ./ObjectDetection.xcworkspace

実機を接続

エラーが消えました

デバッグ実行すると,iPhone側でエラーになる

セキュリティエラーが出ます

設定⇨VPNとデバイス管理からDeveloper(自身)を信頼します.

しっかりと自分のDeveloper IDが表示されます.良く出来ていますね🤔

出来ました😀

汚いデスクだなぁ...

5. むすび

 高々これだけの事をするのに,凄く時間がかかりました😮‍💨 めげずに続けていくしかないですね.

 次回はデバッガーを動かしてみようと思います.

富士チャレンジカップ 200 km,12位

 こんにちは.changです.

 1週間前の話になりますが,富士チャレンジカップ 200 kmに出場しました. 結果は12位. 良い意味で,新たな課題が見えてきました.

1. 前日まで

 初めての200 kmレースで,分からない事だらけでした. しかも,袖ヶ浦 160 km*1から2週間間隔での出走です. 疲れが残る事は無かったですが,どうしても2週間前→袖ヶ浦からの回復,レース週→軽めの調整となり,自身の調子を把握しにくかったです. 自分に合ったレース間隔とか,レース間隔に応じた調整方法なども身に着けていく必要がありそうです. 毎週レースをしているプロは本当にすごいと思います.

 4日前のインターバルではそこそこ踏めたので,調子が悪くない事は判っていました. でも,過度に気負わないでレースに臨みたかった為,軽めの調整に徹して,FTP値が明るみになる様なメニューは避けました. 気持ちの弱さなのかも知れないですが,稀なスーパーコンデションを狙うよりも,イーブンで自然体でいる方が良い気がします.

4日前.軽めの調整

2. 当日の展開

 今回,ポイントになったのは雨です.

 天気予報は悪かったですが,降ったとしても昼過ぎからだと思っていました. 会場への移動中に雨が降り出したときは,4年前の土砂降りが頭をよぎりました.

 店長選手権に出場した店長さんから,路面は極端にスリッピーでは無いと聞いていました. 実際,コーナーで滑る感覚は無かったです. 前回から導入しているPirelli 28 mmが良かったのかも知れません. ただ,兎に角寒くて,チームメートは皆肩をすぼめていました. 早々に試走を切り上げて冬用のレッグカバーに替え,レインウェアを着たまま出走することにしました.

 序盤は速かったです. 並んだ位置が後ろだった所為もありますが,ローリング直後に千切れかける様な状況でした. 最後尾にいるとどんどん削られてしまうので,脚を使って集団の中盤に上がります.

 集団の人数はどんどん減っていきます. 50 kmを過ぎた頃には,100 kmカテゴリの選手を含めて30人位しか残っていなかったと思います. 200 kmカテゴリに至っては,(レインウェアでゼッケンが見えない方もいたものの)数名しかいませんでした. このペースのまま200 kmは持たないと感じていました.

 弱気になった所為もあって千切れます. その後は第2集団に合流しました.

 100 kmを過ぎると,どっと選手が減ります. 集団を探して仕切り直そうと思っていたところへ,200 kmの先頭集団が来ます. ところが,リズムを合わせる事が出来ずに千切れます. 一人で走っても仕方がないと思い,ピットに入ってお手洗いに行きます. ついでに,レインウェアを脱ぎました.

 コースインして,先刻千切れた集団に再度乗ります. この時はペースが合いました. 集団は,レース参加者よりもサポートライダーの方が多い状態で,非常に安定していました. 僕と同様に周回遅れの方が殆どでしたが,皆さん上手い方で,走りやすかったです.

 周回遅れになっていない選手は3名しかいなかったそうです. 終盤に近付くと,この3名にレースをさせてあげようという雰囲気になります. サポートで並走してくれていた56店長の男気が発揮された感じでした. そうなるとペースは上がらなくなります. 大会スタッフがペースを作る時間帯が大半になり,レースっぽくは無かったです. 集団から千切れた時点でレース終了という事ですね. そのまま集団でゴールしました.

3. パワー分析

 比較対象が無いので正直良くわからないですwww. 平均パワー162.3 Wは高くない様な気がしますが,200 kmではこんなものなのかも知れないです. TSSは364.3でそこそこなので,自身の持てる力は出せたのかと思います.

サイコンのログ.平均パワーは高く無い様に見えますが,,,

 ラップ記録を見ると,おそらく13週目で千切れていますね. 昨年走った100 km*2のデータと比較しても,セレクションが掛かった様に見えます. この展開にこそ食らいつき,耐久戦で勝負できる様になりたいです!

ラップ記録.序盤は速めだったのかな?

昨年走った100 km前半のラップ記録

4. 改善点

雨対策

 レインウェアを持っていたのは良かったのですが,撥水処理を怠っていました. レース前半でびしょ濡れになってしまい,身体を冷やしてしまったと思います. レインウェアと靴には,日常的に撥水スプレーを使うべきですね. velotozeも携帯品リストに入れないとです.

補給食

 ショップの店長さんから,200 kmのレースでは固形食も必要だというアドバイスを受け,初めてジャムパンを持ちました. 咀嚼は何とかなりましたが,包装を剥がすのが若干大変でした. 包み紙の種類や,包み方を変える必要がありそうです.

携帯したジャムパン.3個ポケットに入れて,2個食べました

レース中の体温調整

 上述のレインウェアと重複する内容ですが,レース中の体温調整の重要さを実感しました. 今回,一度ピットインしてお手洗いに行っています. この時にレインウェアを脱いだ事で,調子が上向いた感覚があります. タラレバを言っても仕方ないですが,ピットインせずにレインウェアを脱げていれば,トップ10に入れた可能性があります.

 生理現象は我慢しようが無いですが,身体を冷やさなければマシになります. レースによっては手放しが禁止されるので注意が必要ですが,プロのレースではレース中にウェアを着脱することが当たり前です. 長袖のレインウェアだと危険かも知れませんが,ベストとかだったら何とかなる気がします.

5. むすび

 12位という順位は自身の最高成績です. 200 kmを走りきった達成感もあります. でも,レースの展開にもっと絡みたかった思いはあります. 引き続きトレーニングをして,レース経験を重ねていきたいと思います.

 次は富士ヒルです. 暫く登ってないので,ヒルクライムモードに切り替えます.

袖ヶ浦チャレンジ2022 ソロ160 km,16位

 こんにちは.changです. 袖ヶ浦チャレンジ 160kmにソロ参加しました. 結果は16位. この距離のレースを初めてまともに走りきる事が出来ました😀

f:id:changlikesdesktop:20220403112712p:plain:w400
袖ヶ浦フォレストレースウェイ.当日は寒くて,お手洗いを我慢するのが大変でしたwww

1. 袖ヶ浦チャレンジ

 袖ヶ浦フォレストレースウェイで行われるエンデューロです. 昨年,同様のイベントに2回に出ました. 良く解ってませんが,主催者が異なる別イベントの様です.

 袖ヶ浦フォレストレースウェイは,ドフラットではないものの登り(というか周回そのもの)が短く,コーナーの難易度が高いことから苦手としているコースです. ただ,もう走りたく無い程嫌いでは無いです. トレーニングというか,苦手克服の為に挑戦しようと思えるコースです.

2. 前日まで

 下総エンデューロ*1の2週間後でした. これ自体は問題なかったのですが,下総の翌日にチームの大学生と明神に行ったのがヤバかったです.

f:id:changlikesdesktop:20220403113017j:plain:w400
レースの翌日に明神.オッサン,年を考えようよ

 疲れが暫く抜けず,高強度のトレーニングが出来ませんでした. レースの3日前にようやく戻ったのですが,どの位踏めるか全く判らない状態でのスタートでした.

f:id:changlikesdesktop:20220403113215j:plain:w400
レースの3日前に復調

3. レース展開

 全体的にまったりというか,一定ペースでした. 序盤はプロ選手がひいてくれたのですが,ホームストレースで40 km/h出ない周回もありました. ”チャレンジを楽しむ”というイベントの趣旨なのでしょう*2

 途中,更にペースが落ちます. 「100 kmカテゴリーがゴール直前だから,邪魔しないように」という事になったみたいです. この時は本当にゆっくりで,第2コーナからの登り返しで集団が詰まってしまう程でした.

 100 kmを過ぎてプロ選手の牽引が終わると,少しレースっぽくなりました. 有力チームが前に上がる動きも見られたので,警戒していました. ただ,集団の前方に留まり続ける事が出来ませんでした. 位置取りを少し下げたタイミングでアタックがかかりました. アタックは見えていたのですが,誰が行ったのかまでは判りませんでした. 結果的にはこの時に有力選手を逃がしてしまい,レースが終わっていました.

 思い返すと,アタックは数回掛かっていたのかも知れないです. アタックの直後に集団の前方に上がって追走に備えたのですが,誰も追おうとしませんでした. その時は,千葉でよく見る赤いジャージのチームを含む3人程度が逃げたと認識しています. でも,この逃げは最終盤で吸収したのですよ🤔

 なので,この前にもっと決定的な逃げがあったのかも知れないです. 集団の前に居られず,展開に絡めなかった事は少し残念です.

 最終盤,160 km参加者と強調して追走集団のペースを上げようとしましたが難しかったです. 登りで前に出ると千切ってしまいます. 自惚れかもですが,追走の160 km参加者の中では最も脚があると感じていました. ただ,一人で抜け出す程の力はありませんでした. スプリントが無いと,こういう時に厳しいです.

※ 後で判った事ですが,強豪チームは逃げに選手を送り込んでいたし,参加者の多くが200 kmカテゴリーだったので追う必要が無かったのです.

 最後は追走集団から諦め気味にスプリントしました. 追走集団の頭を取れば6位で,ギリギリ表彰台だったみたいですね.

4. パワー分析

 サイコンのログを見ると,平均パワーとNPが昨年惨敗したウィンターサイクルマラソン*3とほぼ同値でした.

f:id:changlikesdesktop:20220403102650p:plain:w400
サイコンのログ.こんなもんだなって感じです

 レースで重要なのはパワー値ではない無い,という事が良く解ります. 今回はインターバルが少なく,僕にとって有利な展開だったと言えます. 終盤になっても脚を残せてましたし,レース後もさほど疲れていませんでした.

 距離が長いレースになる程,今回と似た展開になる筈です. 序盤の振るい落としに耐え,後半の持久戦でアタックする(或いはアタックに反応する)というのが,僕がするべきレースと言えます. 富士チャレ200 kmが楽しみになってきました🔥

5. 機材

 オーバーホール明けだったのですが,羽が生えたかの様にバイクが軽かったです. ショップのスタッフさんに感謝しています.

f:id:changlikesdesktop:20220403114718p:plain:w400
愛車のIzalco max disc.バーテープをチームカラーのオレンジにしました

 大きなパーツ変更はしなかったのですが,タイヤをコルサ25 mmからピレリの28 mmに替えました. 28 mmにしたのは腰痛軽減の為,ピレリを選んだのは軽量化の為です. 4.3気圧で使用しましたが,素晴らしく良かったです. コーナーの安定感が格段に増しました. 腰痛も若干マシになった様な気がします. 空気圧を更に下げても良さそうです🔧 少しお高めではあるので,決戦レースタイヤとして使っていこうと思います.

6. 落車

 落車が多かったです.

 一件は僕の目の前で起きました. 転んだ選手の顔面が僕の前輪の前に落ちて来たので,少しヒヤッとしました. 転んだ方は救急車で運ばれました. 一日も早い回復を願っています.

 この他にも大規模な落車が在り,救急車が入りました.

 自身が落車をしない,落車のきっかけを作らない,落車に巻き込まれない為には,当たり前ですが,集団の前方に居る必要があります. ただ,自身が転ばなければそれで良いという訳でもありません. 怪我人が多いイベントでは楽しめないです.

 僕はあまり意識しないで走ってましたが,”4 hを切るとS級ライダー”という特別賞が設定されてたのですね. これを狙って走っていた方も多かったのでしょう. サポートライダーの集団コントロールも納得です. イベントのコンセプトを理解して,チャレンジに協力しないとですね👍

 ただ,団子状の大集団で走り続けるのは,個人的には危険だと感じました. もし,”S級チャレンジ”みたいなのをイベントの主目的にするなら,時間差とか,細切れでスタートさせた方が安全でしょう. (順位を競いたい人も含めて)イベントに沢山の人を集めるのは大切だけど,多様な目的を詰め込み過ぎるのは難しいのかも知れません🤔

7. むすび

 自身としては過去最高成績だったのですが,あっけなかった印象があります. 気負わずに自然体で走ったのが良かったのかなぁ. 再来週の富士チャレ 200kmも同じアプローチで行きたいです.

SuperCycleEnduro in 下総 ソロ3h,17位

 こんにちは.changです.

 SuperCycleEnduro in 下総のソロ3hに出場しました. 1.5h程で先頭集団からドロップし,17位でした. 昨年末よりは上がって来たかな...?という感じです.

f:id:changlikesdesktop:20220325074710j:plain:w400
下総運動公園.だいぶ春めいてきました(^^)

1. SuperCycleEnduro in 下総

 何度も出場しているイベントです. 1月には1.5hチームで優勝しました*1

 同じ会場(下総運動公園)で行われる別会社のレースもあります. 仲間内では,今回出たイベントを下総エンデューロ,別会社のイベントを下総クリテリウムと呼んでいます. 下総エンデューロは,下総クリテリウムに比べて小規模で,エントリーフィーがお安めです. その分サポートライダーがいなかったするのですが,,,良い意味で緩いというか,練習会な雰囲気のレースです. 今回は,本格的なシーズンインに向けてエントリーしました.

 千葉のレースには有力チームが集まる印象を持っています. 先頭集団がE1やツールド沖縄のそれでもおかしく無い様なメンバーになる事もあります. 事前に発表されたスタートリストから,今回も有力選手が何名か参加される事が判っていました. 胸を借りるつもりで先頭に付いて行こうと思っていました.

2. レース展開

 整列時にウッカリというか,タイミングも悪くて,スタートラインの左側に並んでしまいました. これ,追い抜き易い右側に並び,ローリング中に集団内での位置取りを整えるが正解です. 仕方がないので,1週目は1番手で走り,後ろからリアルスタートを切ってきたライダーに反応する仕方でレースインしました.

f:id:changlikesdesktop:20220325074851j:plain:w400
整列時.前に並んだのは良いが,うっかり左端に...

 通例ですが,セレクションのかかるレース前半は速かったです. 平均速度が45 km/h近い周回もありました. 脚を使いながらついて行きます.

 集団の前方に位置取っていたので,前方で起きる加速が見えていました. 「緑ジャージがペース上げたな」という感じで,素早く加速に反応できました. レースに参加している感があって楽しかったです. 今まで出場した耐久レースではこれが出来ていなくて,一列棒状の集団の後方でひたすら苦しむことが多かったと思います.

 インターバルには何とかついて行けたんですが,アタックが連続で掛かるとキツいです. 緑ジャージの方達が交代で加速をかけると,どうしても息が上がってしまいます. 腰痛が辛かった所為もあって,1.5hでドロップしました.

 ドロップした後は,脚を止めてゆっくり走りました. 一人で走っても意味が無いと割り切ったからです. 追いついて来た集団に2回飛び乗りました. フィニッシュにも集団で入りました.

 レース後半の先頭集団はペースが落ち着いていて,比較的楽に付いて行けました. 流石に,皆さん疲弊されていたのだと思います. 印象的だったのが,緑ジャージがチームメート同士で接触しそうになり,有名選手が怒っていたシーンです. この人達も人間だなぁ...と.

 前でゴールされた方達との力の差は勿論あります. でも,1.5h分の差がある訳では無いと感じました. ペースアップに対してあと数分粘れれば,最後まで残れたと思っています.

3. パワー分析

 サイコンのログです. (先頭集団でゴールした)昨年の富士チャレ*2と比べると,平均パワーもNPも上がっています. TSSも比較的高めでした. 高強度への対応が良くなったのだと思います.

f:id:changlikesdesktop:20220325063616p:plain:w400
サイコンのログ.これまでの実績と比較するとTSSが高めかと.高強度への対応が良くなったのだと思います.

 ラップデータを見ると,77周でした. 公式リザルトとも一致しています. おそらく,42~47と62~70の15週を単独で走ったと思います.

f:id:changlikesdesktop:20220325064948p:plain:w400
ラップデータ.やはり前半は速めです.

4. メモ

 今回ポイントになったと感じた要素について,記録しておきます.

(1) 短時間高強度

 昨年末の反省から,この冬はロングライドを止めて高強度のワークアウトとチーム練習(での削り合い?)に集中しました. 距離を走っていない不安はありましたが,やってきた事は間違いでは無かったと思います.

 相変わらず高強度インターバルが嫌いなので,気持ちを維持する工夫をしながらやって来ました. 根が真面目(?)なのでコンプリートに拘りがち(=TSS重視)なのですが,無理ゲーなメニューを行けるところまで行くやり方も楽しいかもです.

f:id:changlikesdesktop:20220325070435p:plain:w400
このワークアウトがマジで無理ゲー.まともにやり切れた事が未だに無い...

 1分間もがきの様なトレーニングは敬遠してきたんですが,やってみると以外にテンションが上がるし,効果も高いと感じます.

f:id:changlikesdesktop:20220325065651p:plain:w400
300Wは1 minでもオールアウトしてしまう...

 ロングの疲れが無いぶん,チーム練習に集中できたのが大きかったです. 昨年は一人で150~200 km走った翌日にチーム練に行って千切れたりしていたのですが,間違っていたかも知れません. 速いライダーと競い合うのが一番良いトレーニングですね. 何より楽しい! チームメートに感謝しています.

 チーム練習は70 km前後と比較的短めですし,カフェに寄る時間等も大切にしたいです. 「練習がキツくなった」という声も聞きます. 短時間インターバルをチーム練で,休憩無しのベーストレーニングをローラーでと,目的を絞ってメリハリを付けるのが良さそうです.

(2) エアロポジション

 パワーの上げ幅には限界があると考え,この冬から重点的に取り組んでいます. サドルを約20 mm前に出して,深い前傾姿勢を取れるようにしました. ローラーをやるときにも出来るだけ下ハンを持つようにしています. ヘルメットに貼るエアロシェル(上の写真に写っている)もこの冬から導入しました.

 効果を実感していますが,下述の腰痛の原因にもなる様なのでバランスは必要です.

(3) 腰痛

 今回も序盤から苦しみました. 昨年の様に半身が痛い訳では無いので,体のバランスが崩れているのでは無いと思います. 単純に,高強度に身体が慣れていないのでしょう.

 長期的には練習で身体を慣らすしか無いですが,即効性を期待した対策も考えています. 先ず,タイヤを28 mmにしてみようと思っています. バイクが重くなるので敬遠してましたが,レースでも太めのタイヤを履いている方が多いと感じました. 平坦レースでの決戦用と割り切ります.

 また,前乗りに替えたことでハンドルが近くなり,上半身を脱力しにくくなった印象を持っています. 100 mmのステムを今は使っていますが,110 mm或いは120 mmに替えても良さそうです. Izalcoの新型ステムの販売が早く始まって欲しい...

(4) 先頭交代

 レース内での先頭交代が下手だと気付きました. 当然ですが,チーム練習での先頭交代とは違います. ローテするライダーの力を知らないと言うか,多くの場合,自分よりも圧倒的にパワーが高いライダーと回る事になります. 十分な余裕を残して交代する必要があります.

 周りのライダーさん,特に強い方は,必ずしも僕が引く事を望んでいないと感じました. 実際,「回れないなら下がって」と言われました. パワーが及ばない人間が引いても集団のペースが落ちるだけで,誰にもプラスになりません. 前に出るとテンションが上がって楽しいですが,集団内での自信を俯瞰する冷静さが大切ですね.

 レース後,元プロ選手のスタッフさんから「練習では出し切る.レースでは自分に有利になる様に走る」とアドバイスを受けました. 真理です.

(5) 補給

 レース前半が忙しくて,なかなか補給食を摂れませんでした. 速度に対して余裕が無く,手を離すのが怖いからです. 力の無いライダーから削られるという事です.

 今回,2本目のボトルをMag Onを溶かした高カロリー仕様にしていました. 次回からは,1本目を高カロリーにして前半から積極的に摂取することにします.

5. 結び

 レースは楽しいです.

 スイッチ入ったので,4/2の袖ヶ浦160 kmにもエントリーしました. これを経由して,4/17の富士チャレ200 kmに臨みます.

超今更だけど、kerasの旧ver.でマルチクラスのU-Netが書けない件

 こんにちは.changです. kerasでマルチクラスのU-Netを書くとちょっと変だな,と以前から気になっていました. 今回,それが解決したので記録します. 結果だけを言うと,ver.2になって不具合(?)が治ったという話です.

1. Tensorflow ver.1 + kerasによるU-Net

 個人的にU-Netを良く使うのですが,Tensorflow単独での記述からkerasに移行するときに少し苦労しました*1. また,マルチクラス化したとき*2,多少無理矢理にビルドを通した経緯がありました.

 問題になっているのは下記の箇所です.githubにソースが上がっています*3.

model.py

class MyModel:
  def __init__(self, input_size, batch_size, epochs):
    self.input_size = input_size
    ...(省略)...
  def create_model(self):
    inputs = Input(self.input_size)
    ...(省略)...
    self.model = Model(input=inputs, output=outputs) # ここがエラーになる

train.py

if __name__=='__main__':
  ...(省略)...
  model = model.MyModel((c.IMG_SIZE, c.IMG_SIZE, channel), batch_size, training_epochs)

クラスのインスタンスを作る際に,input_sizeには(c.IMG_SIZE, c.IMG_SIZE, channel)を指定していました. こうしないと,self.model = Model(input=inputs, output=outputs)がエラーになった為です.

 結果,ニューラルネットワークに画像を入力する際にクラス数ぶんだけ画像を複製する帳尻合わせが生じます. 上記の例の場合にはクラス数が6だったので,6枚の画像をニューラル・ネットワークに入力する事になります. 動きはするのですが,メモリを無駄に消費しますし,何より気持ちが悪いです. "RGBの3チャンネルを入力 & 出力クラスは3限定"なんて言うソースも散見します.

 ちなみに,Tensorflow単独ではこんな現象は無く,画像1枚をニューラル・ネットワークに入力出来ていました*4

train.py

if __name__=='__main__':    
    with tf.device("/gpu:0"):
        with tf.Graph().as_default():
            with tf.variable_scope("scope_model"):
                x = tf.placeholder(tf.float32, [None, IMG_SIZE*IMG_SIZE]) # inputs(gray image)
                y = tf.placeholder(tf.float32, [None, IMG_SIZE*IMG_SIZE*CATEGORY]) # teacher

2. Tensorflow ver.2によるU-Net

 ひょんなことから,Tensorflow ver.2では上記の不具合(?)が解消されている事に気づきました.

model.py

class MyModel:
  def __init__(self, input_size, num_classes, batch_size, epochs):
    self.input_size = input_size
    ...(省略)...

  def create_model(self):
    inputs = Input(self.input_size)
    ...(省略)...
    self.model = Model(inputs=inputs, outputs=outputs)

train.py

if __name__=='__main__':
  ...
  model = model.MyModel((c.IMG_SIZE, c.IMG_SIZE, 1), channel, batch_size, training_epochs)

 これに合わせて,ソース全体を書き直しました*5

3. むすび

 厳密には,どのver.から不具合が治ったのか判っていません. 明らかな変化があったのは下記のver.になります.

不具合あり: tensorflow-gpu ver. 1.14.0 & keras ver. 2.3.1

不具合なし: tensorflow-gpu ver. 2.3.0

 何だったんだ?って感じですが,,,モヤモヤが少し晴れました. ちなみに,U-Netの様な有名なモデルはライブラリ化されていることが多いです. 例えば*6. 多くの方は,ライブラリを上手に活用されているのでしょう. モデル構造を自分で書くという非効率な事をやっている為に招いた事態と言えますね(..)

4. おまけ

 記事の内容とは全く関係ないんですが,久しぶりにソースを書いたらgithubの使い方が変わっていました. 認証キーを発行しないとpush出来なくなったんですね. キーの更新の仕方等を理解していないので,慣れていかないとです.

ロード用シューズ: fi'zi:k VENTO INFINITE KNIT CARBON 2

 こんにちは.changです.

 ロードバイク用シューズを新調しました. fi'zi:k VENTO INFINITE KNIT CARBON 2(以後,KNIT2)です. 良い感じでクセのあるヤツに出逢えました🥰

f:id:changlikesdesktop:20220226201947j:plain:w400
INFINITE KNIT CARBON 2.ワインレッドな色味がツボです^^

1. 購入の経緯

 愛用していたS Works 7がヘタって来ました. 購入したのは2019年の6月頃です*1. 3年使っていないですが,塗装があちこち剥げています. ホールド感も弱くなりました. 未だ履けますが,シーズン中に壊れて履き替える羽目になるのは困り物です. このタイミングで購入することにしました.

f:id:changlikesdesktop:20220226194448j:plain:w400
3年弱愛用したS Works 7.ボロボロです...

 困ったことに,,,Specializedが買えません😔 ショップとメーカーの契約の問題です. 同様の悩みを抱える方もいらっしゃるかと推測します.

 自転車用シューズは,サドルと同様,選定がシビアなパーツです. 足の形やペダリングとの相性があり,高い物を買っても駄目な場合があります. 自分に合う製品に巡り会えたならば,長く使い続けたいです. S Works 7の先代からも含めて,僕はここ8年程Specializedを履いていました. こんな形でブランド変更を余儀なくされるとは思いませんでした💦

 Specializedを通販で買うという手段も考えました. ただ,お世話になっているショップさんとの関係も大切にしたいです. これも何かの縁だと思い,履き替える事にしました.

2. シューズ遍歴

 インプレ的な内容も書くので,これまでに履いたシューズを紹介しておきます.

(1) SHIMANO MT31

 ロードバイクを始める前に,クロスバイクで使っていました. 何年前の物か最早分かりません. オフロード用クリートで,比較的歩きやすいモデルです. 当時,片面クリートのペダルと組み合わせて通勤やサイクリングに使っていました.

f:id:changlikesdesktop:20220201034240j:plain:w400
SHIMANO MT31.奇跡的に残っていたので写真を撮りました

(2) SIDI

 写真が残っていないのですが,こんな感じの見た目でした*2

f:id:changlikesdesktop:20220225064641p:plain:w400
初めてのロード用シューズだったSIDI.指先が硬めでした

 1台目のロードバイクと同時に購入しました. ロード用の靴を履くのが初めてだったので,ソールの硬さと歩き難さに吃驚した記憶があります. 当時は競技をやっていなかったので拘りませんでしたが,小指の爪がボロボロになることがあって替えました.

(3) Specialized Comp

 僕の中では,この靴がターニングポイントでした. SIDIと比較すると踏み面に角度があるというか,ペダルを斜めに傾けた状態で踏みおろすイメージになります. これが僕のペダリングに合っているのです. セカンドグレードということもあって快適性も高く,全く不満がありませんでした. 5年以上使った所為でバンドが壊れてしまい,やむ無く,現役引退してもらいました. ローラーで今も使っています.

f:id:changlikesdesktop:20220225065854j:plain:w400
Specialized Comp.初めて”自分に合う”と感じた靴です

(4) Specialzed S Works 7

 既に紹介した赤い(ロケットレッド)靴で,2019年のハルヒルから使用しています. これまでに出場した殆どのレースを,この靴で走った印象があります.

 サガン選手等のトッププロや,多くの強豪アマチュア選手が使用している人気モデルです. その軽さと剛性は他に類を見ないレベルでしょう. 何より,格好良い‼️ チームカラーや,同色のヘルメットとの相性も良くて最高に気に入っています.

 ただこの靴,,,僕には正直痛いんです💦 ヒルクライムレースやクリテリウムであれば問題ありませんが,3h級の長時間レースや,200 kmに及ぶロングライドでは足が痛くなります. この辺の悩みが在った事が,今回の履き替えの原因でもあります.

(5) SHIMANO XC5

 マウンテンバイクで現在使用しています. MTBレースを本格的にやっているわけではないので,エントリーグレードです. 間違って(?)かなり大きなサイズを買ってしまったのですが,クリートを踵側に付けているので問題はありません. 足を収めるのが若干面倒(履く時に靴下が捲れる)のがマイナスポイントです.

f:id:changlikesdesktop:20220226194624j:plain:w400
SHIMANO XC5.マウンテンバイクで使っています

3. 選定理由

 選択肢はあまり無かったです💦 チームのメンバーで最近履き替えた方は,ほぼSHIMANO S-PHYRE一択になってますね.

 SHIMANOでも良かったんです. MTBで使っているXC5に不満は無いし,チーム内でのS-PHYREの評判も上々です. ただ,,,S-PHYREは色が地味なんです😫 赤は限定でもう買えないらしく,青も品薄だと聞きました. 今更黒い靴はなぁ,,,と思ってお世話になっているショップに相談したところ,社長さんからfi'zi:kを薦められました.

 社長さんご自身も愛用されていて,何足か持っているそうです. サイズが同じだということで,私物のINFINITE R1を貸して下さいました. これが最高に良かったんです😀

f:id:changlikesdesktop:20220228054036j:plain:w400
社長さんからお借りしたINFINITE R1.ホールド感と剛性感が最高でした

 強烈なホールド感と剛性感が指先に来ます. ソールの厚みはS Works 7よりも大きく感じました. S Works 7ではダイヤルを締めると足が痛くなってしまう(=緩々で履いていた)のですが,INFINITE R1は違いました. 足の甲がソールに括り付けられる感じで,強く絞めても痛みがありません. 土踏まずががっちりとホールドされ,踵が擦れないのも良いです. お借りしたINFINITE R1は若干重かったのですが,これの後継のKNIT2は(カタログスペックで)ほぼS Works 7と同じ重量です. メーカーHPで見た赤(メーカー表記はCoral/Black)モデルの外見も大変気に入り,購入を決めました.

4. インプレ

 500 km位走った感想になります.

 生地がかなり薄めです. S Works 7よりも馴染み易いですが,その分,剛性感は小さ目です. また,冬はかなり寒いかもです. 秤が無いので正確な重さは分かりませんが,KNIT2の方が多少重いかも知れないです.

f:id:changlikesdesktop:20220228051403p:plain:w400
左: S-Works 7,右: fi'zi:k KNIT2.写真では判り難いですが,KNIT2の方が小振りです.KNIT2の方が生地が薄く,かつ半サイズ小さい所為です

 S Works 7とINFINITE R1は39.5でキツい位でしたが,KNIT2は39.0でピッタリでした. 3サイズを試着できるサービス*3のお陰で,適切なサイズを選べました.

 クリートの調整幅は前後左右に広いと思います. S Works 7よりも靴(=足)をクランク側に近づけることが出来ます. 真っ直ぐに踏み降ろせるので,脚への負担が少ないと感じます.

f:id:changlikesdesktop:20220228055000j:plain:w400
クリート調整中.調整幅が大きいです

 マイナス点を挙げるならば,,,お値段が高めではあります. S Works 7やS-PHYREに対して1万程の値段差でしょうか. 個人的には,この値段差であれば見た目がキュンと来る物を買いたいです.

 土踏まずのホールドが強いので,扁平足の方には合わない可能性があります. 日本人にとっては,大衆的な作りでは無いのかも知れません. 捻くれ者の僕にはむしろ,,,なんですが🤫

 もう一点申し上げておくと,用途によっては旧モデルのINIFINITE R1の方がハマると思います. KNIT2の方が軽いし,優しい履き心地である為,靴としての完成度は高いです. ただ,INIFINITE R1で感じた強烈なホールド感や合成感は削がれています. ヒルクライムレースで無ければ,INIFINITE R1の方が速い気がします. スプリントやクリテリウムをタッゲートにする方には,INIFINITE R1をお勧めします. 僕自身も,型落ちして安く買えるタイミングを伺って使い分けようと画策しています.

5. むすび

 またライドが楽しくなりますね. 今季は沢山レースを走るつもりです. 直近では,下総エンデューロ終戦,富士チャレ200 km,富士ヒルにエントリー済みです. 勿論,KNIT 2で走ります😀