SatooRu's Profile

全ての記事梶研の進捗日常の記録制作物一覧

全ての記事

梶研 [伊達巻成功 & GCN, ST-GCN完全に理解した]

梶研 [伊達巻成功 & GCN, ST-GCN完全に理解した]

3年セミナー:??% []mocopiとお料理センシング [x]シーンとランドマークを決める(~2月上旬) [x]SVMで動作判別する []機械学習を深める [x]機械学習の手法を知る [x]使う手法を決める [x]データセットを探す [x]LSTMしてみる [x]主成分分析してみる [x]クラスタリング []自己相関 []お料理センシング [x]お料理でどんな動作があるかを知る [x]レシピを決める []センシングする []? []論文書く []発表 []BLEビーコンのuuidを書き換えたい [x]通信内容を読み解く []shellコマンドで通信してみる []実装してみる []BookWorm [x]Pasoriとデスクトップアプリを接続する(技術検証) [x]nfc読み込み機能&画面を作る []APIと連携させる [x]管理者画面を作る ~?月シーン検知?をする ~?月論文を書く ~?月論文発表したい 料理中の動作をmocopiを使ってセンシングする。 このデータから最終的に位置推定を行う。 一定の区間でどの動作をしているかを当てる(クラス分類) 料理の手順を元にシーン検知を補正する 例)焼く動作→卵割る動作はおかしい 位置とシーンを相補的に補正する 例)冷蔵庫の前で焼く動作はおかしい 完璧でした 生産者の顔 フライパン買ってください 横幅がもう少し広いフライパンが欲しい 動画からではないサンプルコードが欲しい https//colab.research.google.com/github/machineperceptionroboticsgroup/MPRGDeepLearningLectureNotebook/blob/master/15_gcn/03_action_recognition_ST_GCN.ipynb よく分からないけど学習が進んだ ... とても時間がかかったので10回目で止めた グラフを表示してくれた 斜め(縦と横の軸が同じところ)が濃いほど正確ぽい 追ってみたけど全く分かりませんでした. 仮でランダムに生成する py X=np.random.randn(num_node,in_channels)+1 TODO動作認識ではこの入力値がどう変わるのか py E=[[0,1],[0,2],[0,4],[1,2],[2,3]] reversed_E=[[j,i]for[i,j]inE] new_E=E+reversed_E A=edge2mat(new_E,num_node) $$ [1,1,1,0,1] left[ begin{array}{c} v_1 v_2 v_3 v_4 v_5 end{array} right] =v_1+v_2+v_3+v_5 $$ 隣接している部分だけ取り出すみたいな その結果が右側 (左のXはランダムのため変化しています) ノードによる偏りがある TODOなぜ偏りが良くないのか 平均を使うと多少解消される $$ tilde{mathbf{D}}^{1}tilde{mathbf{A}}mathbf{X} $$ 実際は正規化するべき $$ tilde{mathbf{D}}^{frac{1}{2}}tilde{mathbf{A}}tilde{mathbf{D}}^{frac{1}{2}}mathbf{X} $$ 畳み込みは特定のノードに隣接するノード間でいい感じに計算するぽい だから隣接行列を作って掛け算していた 動作認識において隣接行列は関節間の接続を入れればいいぽい 入力は... 加速度,角速度をうまい感じに入れる? 角速度から骨格の形(関節の角度)を生成して使う? https//disassemblechannel.com/deeplearninggcn/ ↓をみた感じ、人を正面から見た時の各関節の座標を持っているぽい py fig,ax=plt.subplots(2,3,figsize=(16.0,6.0)) foriinrange(6) r=i//3 c=i%3 foreinE ax[r,c].plot([X[i,e[0],0],X[i,e[1],0]],[X[i,e[0],1],X[i,e[1],1]],"c") ax[r,c].scatter(X[i,,0],X[i,,1],s=7) ax[r,c].set_xlim([0,width]) ax[r,c].set_ylim([0,height]) ax[r,c].set_aspect('equal','box') ax[r,c].set_xticks([]) ax[r,c].set_yticks([]) ax[r,c].invert_yaxis() https//zenn.dev/hash_yuki/articles/3b0f782ccffa54 入力値は、腰(ROOT)を原点とした各関節の座標とする? 伊達巻センシングする BVHの1フレームのデータを入力値として、各関節の座標を出力する関数をいい感じに実装する 体の向きをグラフで出せるようにする 体の向きから各関節の座標を修正するようにする 前に作成したBVHをPythonで扱うmcp_persorは大量のデータに対応できない問題に対処する 必要なフレームだけ読み込むみたいな? 下校中 渋谷 下北沢コメダ 弊社オフィス ボザロの聖地 セカオワの聖地 帰宅 いちねんせいたくさん

2024年4月16日

梶研 [伊達巻センシング&モーションデータから骨格比較序章]

梶研 [伊達巻センシング&モーションデータから骨格比較序章]

3年セミナー:??% []mocopiとお料理センシング [x]シーンとランドマークを決める(~2月上旬) [x]SVMで動作判別する []機械学習を深める [x]機械学習の手法を知る [x]使う手法を決める [x]データセットを探す [x]LSTMしてみる [x]主成分分析してみる [x]クラスタリング []自己相関 []お料理センシング [x]お料理でどんな動作があるかを知る [x]レシピを決める []センシングする []? []論文書く []発表 []BLEビーコンのuuidを書き換えたい [x]通信内容を読み解く []shellコマンドで通信してみる []実装してみる []BookWorm [x]Pasoriとデスクトップアプリを接続する(技術検証) [x]nfc読み込み機能&画面を作る []APIと連携させる [x]管理者画面を作る ~?月シーン検知?をする ~?月論文を書く ~?月論文発表したい 料理中の動作をmocopiを使ってセンシングする。 このデータから最終的に位置推定を行う。 一定の区間でどの動作をしているかを当てる(クラス分類) 料理の手順を元にシーン検知を補正する 例)焼く動作→卵割る動作はおかしい 位置とシーンを相補的に補正する 例)冷蔵庫の前で焼く動作はおかしい 卵は4個のところ2個使ってた フードプロセッサーの前に越してた 濾す時にスプーンを使って最後までとる 材料入れてない 全ての定義 時間測ってない アルミの蓋をあらかじめ作っておく ひっくり返すタイミングが早かった 強さ1,時間不明 調味料が少なかった ちゃんと測る 濾しきれなかった もっとフードプロセッサーする 調味料が混ざりきってない 火力が強かった もっと強く巻く 2枚目が巻ききれなかった 調味料を入れ忘れて一回フードプロセッサー後に混ぜた 半分ずつフードプロセッサしていたのに調味料を1回目で全て入れてしまった 反転が少し早くてぐちゃっとしてしまった たくさんセンシングするのに時間掛かるので、BVH形式(mocopiの形式)のデータが欲しい 配布されたデータを使う HIMEHINAめっちゃ配布していてよさそう BVHそのままはあまりない→BlenderでFBXからBVHに変換する FBX形式をそのままimport 骨格がおかしい AutomaticBoneOr...にチェックを入れる export HIERARCHY ROOT__0 { OFFSET0.00.00.0 CHANNELS0 JOINTLeftUpLeg { OFFSET6.0160715.9917870.570599 CHANNELS6XpositionYpositionZpositionXrotationYrotationZrotation JOINTLeftLeg { OFFSET1.47388322.94072725.570656 CHANNELS6XpositionYpositionZpositionXrotationYrotationZrotation JOINTLeftFoot { OFFSET10.05401036.7214628.523235 CHANNELS6XpositionYpositionZpositionXrotationYrotationZrotation JOINTLeftToeBase { OFFSET0.1992652.57799510.048431 CHANNELS6XpositionYpositionZpositionXrotationYrotationZrotation JOINTLeftToeBase_end { OFFSET1.8527844.9288988.940361 CHANNELS6XpositionYpositionZpositionXrotationYrotationZrotation EndSite { OFFSET1.9587405.3570218.667324 } ... } } MOTION Frames13390 FrameTime0.016667 6.0160715.9917860.57060055.94017529.54657510.5906211.47399822.93941525.57191720.6263675.6406134.76024910.05401336.7214558.5232342.1040192.3274664.3353040.1992582.57799810.0484315.1017421.4452680.2021351.8527854.9288918.9403720.0000020.0000010.0000006.0160645.9920600.57069748.5661453.27276310.9616845.76404925.21038822.6609828.6801251.4209350.8433676.93587436.77893811.0177431.5684470.0937721.3300930.3595202.8231039.9778550.0000020.0000010.0000021.7858174.2531829.2939960.0000010.0000000.0000000.0000048.7828910.0000130.4478030.9595840.0128550.0100808.4120710.8293234.2250401.1604452.8751672.01508112.0334263.4282211.0828802.2662849.06121423.72878613.8387027.68719511.92530118.8445611.93148581.7149153.37948089.0224739.67470117.3027292.64857534.0897858.36957752.4217337.1739271.4590490.3282621.4931152.8231607.7222601.4095870.6592190.3830501.1285352.0330401.0736370.8960301.6505510.85089810.73428322.10645450.3984390.0000010.0000020.0000006.7005811.8758330.9513796.60998315.35038624.8071171.5436551.6057130.2516679.92283436.02599794.4190532.17916324.81125155.3091131.7909550.9732560.0679240.0000010.0000020.0000035.2457742.7199823.2283955.99284626.73719063.0289729.63210421.21568635.6732930.9135340.5940590.6730756.59763410.17717618.5275471.1272160.1944160.5762180.0000020.0000000.0000015.8692752.3861932.1591647.50856423.51063546.3988925.93086838.99395678.3182681.7197850.4427000.7391334.02884325.38394245.5744340.0000050.0000010.0000012.8680270.7913581.72917212.7005579.2529879.0389871.6299501.0277840.3830728.61949111.6540117.3312441.3003571.3005870.52916312.81800119.24816310.8221530.9860771.2358011.0783530.0000020.0000000.0000031.16801516.6626452.40667036.54062422.39334414.4791131.3050444.7909441.76290424.03813019.77641322.4443603.73496611.6453033.3246005.3394316.0792423.16716432.08850934.08749018.49830710.03807118.8332716.7556367.7928689.5734100.67957210.83291821.99897959.6927666.7766482.3483771.5048330.1064830.4644880.83370715.3562293.14500821.3172399.7536492.48661013.1542960.0000020.0000030.0000046.1193292.0854462.7434071.1373181.8428834.6773431.7726530.8007981.1140757.3134032.01388413.4060144.5660461.4743128.4446490.0000000.0000020.0000014.3318141.6298754.8906690.5410425.0965906.6884355.0234841.73543615.7423023.2518210.97201810.1057440.0000010.0000010.0000025.1009711.8923523.8992391.4803381.9927335.2282945.4198810.78086614.5109233.4318790.6715489.2422940.0000020.0000020.0000042.8130581.8453720.7319353.3763915.9804321.1801831.8225480.6912530.2455972.6343728.4719111.7156951.5694250.7133980.8309865.51721016.5839954.7286811.6005570.5860660.8702270.0000010.0000010.000004 6.0160705.9917860.57059960.07973013.18533921.4929951.47404922.93947025.57180019.9763096.8538826.87516910.05400936.7214438.5232302.1041062.2478314.3543280.1992602.57798710.0484255.0623901.4340550.2010711.8527844.9288858.9403700.0000040.0000010.0000006.0160635.9920610.57069848.5350993.24888010.9585475.76625325.22876422.6400438.5314401.3955420.8307446.93587836.77893111.0177491.5953500.0859341.3258480.3595252.8231289.9778681.8813790.4470620.1508341.7858164.2531709.2940090.0000040.0000000.0000000.0000048.7828920.0000130.4013570.9470660.0114340.0100808.4120720.8293234.2491751.1486912.8830572.01508012.0334253.4282211.0891132.2378409.06271223.77722413.9588957.65660511.92530318.8445661.93148781.5312713.43160489.0272269.67469817.3027322.64857534.2688908.30535952.4829997.1739241.4590530.3282641.4949872.8286137.7461071.4095850.6592110.3830523.27617741.24402690.5835060.8960321.6505500.85089712.01986123.09341949.3424410.0000000.0000000.0000026.7005821.8758340.9513796.57854215.28287324.7616301.5436611.6057070.2516739.92308336.02609994.4196742.17910224.81138455.3094411.7909630.9732530.0679270.0000000.0000020.0000035.2457732.7199873.2283945.90758026.72794663.1791829.61382621.06611235.4443280.9135330.5940590.6730786.55808210.08858618.3830171.1272160.1944170.5762210.0000000.0000010.0000035.8692742.3861982.1591637.46469123.45042046.4017995.91851338.98514278.2880111.7197840.4427000.7391354.02211625.43676245.5277150.0000020.0000000.0000012.8680220.7913621.72917312.7275459.2988109.0682341.6299531.0277840.3830728.57586811.5877157.2954551.3003531.3005840.52916612.74152419.11334210.7615680.9860731.2358041.0783500.0000030.0000030.0000021.16801316.6626072.40667436.62405822.43942514.4232471.3050444.7909371.76290024.10995519.81651022.4707213.73496611.6453043.3246005.2977466.0836473.13525032.07215434.06740918.44783210.03807218.8332716.7556367.8599369.5254780.75715510.84849122.05354459.7423056.7766462.3483751.5048350.5495340.1903291.18168114.7866003.13384220.5375549.3908512.43633912.6703820.0000030.0000000.0000006.1193262.0854462.7434041.5963251.6763675.1520061.7726560.8007941.1140807.1349831.98616513.0850484.4545651.4470078.2415320.0000030.0000030.0000004.3318121.6298744.8906650.5274345.0929256.7044455.0297371.73861215.7628903.2559490.97366510.1189230.0000010.0000050.0000045.1009731.8923493.8992371.6567351.8106895.2627545.1466160.77466613.7872143.2586670.6512748.7810450.0000030.0000010.0000012.8130601.8453700.7319353.3227975.6560941.2265711.8225480.6912450.2455962.6304648.4587821.7133281.5694230.7133990.8309885.49272716.5075634.7102591.6005580.5860650.8702250.0000040.0000010.000003 ... 軽く調べても動画や画像から骨格推定しているものばかりだった →論文漁ってみる https//waseda.repo.nii.ac.jp/record/76928/files/Rikoshuron_202209_t5120fg36.pdf STGCNとかいう機械学習の手法を使えばいいらしい グラフ畳み込みネットワーク 1.隣接行列を用いてノード特徴を集約 隣接行列グラフ上のとあるノード同士が接続しているかを表す行列.習った気がする ノード特徴分からない.サンプルコードでは仮で乱数を使っていた こんな感じで集約する$$ begin{bmatrix} 1,1,1,0,1 end{bmatrix} {times} begin{bmatrix} v_1 v_2 v_3 v_4 v_5 end{bmatrix} = v_1{times}v_2{times}v_3{times}v_5 $$ 平均を使うと偏りが少なくなる 実際は正規化を行うことが多いらしい 2.畳み込み演算 隣接ノード数では固定の重みを使えない エッジの重みを学習することで代用できる 数式はよく分からん とにかく重要度の低いノードの重みは小さく,重要度の高いノードの重みは大きくなる GCN(GraphConvolionalNetwork)にST(SpatialTemporal,時空間)方向で拡張したもの(?) 多分2次元平面+時間軸でやっている →いずれ3次元空間+時間軸でやる方法も必要? TODO理解する 参考https//zenn.dev/hash_yuki/articles/3b0f782ccffa54 1.軽くGCNする 1.STGCNで行動認識する 1.3次元空間+時間軸で行動認識する? ソロ花見をした ⚠️以下ライブのネタバレを含みます⚠️ センシング失敗した 保存できていなかった 欲しかったデータのイメージ(↓は8月のフェスの加速度)

2024年4月9日

AITガイド

AITガイド

学生課からの依頼により、新入生に向けて教室の場所を知れるアプリを制作しました。 いい感じの学内マップがなかったため自作するところから始めました。OpenStreetMapからPDFでダウンロード、illustratorでカスタマイズ、新14号館等を追加して、SVGで埋め込んでいます。 マップを自作すると経路情報がないため経路情報APIも自作しました。 しかし経路情報自体もないため、簡単に経路情報を生成するサイトも作成しました なんやかんや適当に作成して完成したのがAITガイドです ~~来年度も運用するなら作り直します~~ Next.js SCSSModules https//aitguide.sysken.net/ https//github.com/SystemEngineeringTeam/aitguide https//github.com/SatooRu65536/generateroadconnection

2024年4月5日

シス研名簿システム

シス研名簿システム

でメンバーを管理するために名簿アプリを制作しました Next.js FirebaseAuthentication reactqrcode Hono Cloudflare Pages Hono zod Cloudflare Workers D1 https//github.com/SystemEngineeringTeam/meibo_system/

2024年4月5日

梶研 [お料理センシング]

梶研 [お料理センシング]

3年セミナー:??% []mocopiとお料理センシング [x]シーンとランドマークを決める(~2月上旬) [x]SVMで動作判別する []機械学習を深める [x]機械学習の手法を知る [x]使う手法を決める [x]データセットを探す [x]LSTMしてみる [x]主成分分析してみる [x]クラスタリング []自己相関 []お料理センシング [x]お料理でどんな動作があるかを知る [x]レシピを決める []センシングする []? []論文書く []発表 []BLEビーコンのuuidを書き換えたい [x]通信内容を読み解く []shellコマンドで通信してみる []実装してみる []BookWorm [x]Pasoriとデスクトップアプリを接続する(技術検証) [x]nfc読み込み機能&画面を作る []APIと連携させる [x]管理者画面を作る ~?月シーン検知?をする ~?月論文を書く ~?月論文発表したい 料理中の動作をmocopiを使ってセンシングする。 このデータから最終的に位置推定を行う。 一定の区間でどの動作をしているかを当てる(クラス分類) 料理の手順を元にシーン検知を補正する 例)焼く動作→卵割る動作はおかしい 位置とシーンを相補的に補正する 例)冷蔵庫の前で焼く動作はおかしい GitHubが大好きなのでセンシングデータ(BVHファイル)もGitHubで管理したい 1ファイル100MBを超えてしまうとGitHubでは管理できない →ファイルを分割/復元するスクリプトを書く shell yarnsplit shell yarnrestore はんぺんと卵をペースト状にするために"フードプロセッサ"などが必要 梶先生<"すりこぎ"もいいかも →ダイソーを巡ったがいずれも見つからず諦めてamazonした 瀬戸のダイソーにあった 名電の情報システム部に混ざって参加した ものづくりの効率化の話と実践をしてきた(Sonyすごい) >ものづくりのWSでプログラミングではないけれど、いかに効率的に製品を制作するかのワークショップです。発想力と理系の力が必要です。特に資料はありませんが、量産ものづくりの世界を体験できるもので、簡単な箱の大量生産ですが奥が深いです。システムを開発する人は、こういった現場のことを知っておくことも私は大切なことだと思ってます。ちなみに主催はSONY創業者の血縁(孫)盛田さんです。関連会社の社長などをされているSONYのかなり凄い方です。そんな方とお会いして、いろいろお話しする機会は貴重ですので優秀な皆さんでぜひ。 NoPicture goodfirstissueがたくさんあるということでやってみた まじ簡単だけどとても親切でやりやすかったので是非

2024年4月2日

梶研 [お料理センシング(機械学習を深めた)]

梶研 [お料理センシング(機械学習を深めた)]

3年セミナー:??% []mocopiとお料理センシング [x]シーンとランドマークを決める(~2月上旬) [x]SVMで動作判別する []機械学習を深める [x]機械学習の手法を知る [x]使う手法を決める [x]データセットを探す []LSTM [x]機械学習(LSTM)する []精度を上げる []? []主成分分析 [x]主成分分析する []精度を上げる []クラスタリング [x]kmeans法 []自己相関 [] []? []お料理センシング [x]お料理でどんな動作があるかを知る [x]レシピを決める []データをとる? []? []論文書く []発表 []BLEビーコンのuuidを書き換えたい [x]通信内容を読み解く []shellコマンドで通信してみる []実装してみる []BookWorm [x]Pasoriとデスクトップアプリを接続する(技術検証) [x]nfc読み込み機能&画面を作る []APIと連携させる [x]管理者画面を作る ~?月シーン検知?をする ~?月論文を書く ~?月論文発表したい ペンギンのデータで主成分分析をした https//github.com/mwaskom/seaborndata/blob/master/penguins.csv 変数名詳細 islandペンギンが生息する島の名前('Torgersen','Biscoe','Dream') bill_length_mmペンギンのくちばしの長さ(mm) bill_depth_mmペンギンのくちばしの奥行き(mm) flipper_length_mmペンギンのヒレの長さ(mm) body_mass_gペンギンの体重(g) sexペンギンの性別('Male','Female') speciesペンギンの種類('Adelie','Chinstrap','Gentoo') yearデータが収集された年 かわいい 非階層的クラスタリング kmeans法 混合正規分布 階層的クラスタリング ウォード法 重心法 最短(最長)距離法 群平均法 クラスタリングデータ間の類似度に基づいてデータをグループ分けしていく手法 教師なし機械学習の一種 できた.第一主成分と第二主成分を使用した 星がクラスの重心 とあるデータたちを主成分分析してクラスタリングすることはできた とあるひとつのデータを入力として種類を出力する方法を知る必要がありそう ペンギンの場合はkmeans法で十分だったが、 お料理センシングとなるとやってみなければ分からない 似た形の波がどこにあるかを探し、それくらい一致しているか(相関係数)を出す 相関係数を表したグラフをコレログラムと言うらしい プロのレシピが良い kikkomanの方が親切 ハッカソンをゆるーくしたイベント 後輩もうひとり釣りました 写真撮ってなかったので引用 思いの外愛工大案内する蔵(仮)の反応が良くて嬉しかった Chatworkの新規事業でBPaaS云々を聞いた.社名を変えるほどの転換で案外面白そうだと思った

2024年3月26日

梶研 [お料理センシング & 主成分分析 & BookWorm]

梶研 [お料理センシング & 主成分分析 & BookWorm]

3年セミナー:??% []mocopiとお料理センシング [x]シーンとランドマークを決める(~2月上旬) [x]SVMで動作判別する []機械学習を深める [x]機械学習の手法を知る [x]使う手法を決める [x]データセットを探す []LSTM [x]機械学習(LSTM)する []精度を上げる []? []主成分分析 [x]主成分分析する []精度を上げる []? []? []お料理センシング [x]お料理でどんな動作があるかを知る []データをとる? []? []論文書く []発表 []BLEビーコンのuuidを書き換えたい [x]通信内容を読み解く []shellコマンドで通信してみる []実装してみる []BookWorm [x]Pasoriとデスクトップアプリを接続する(技術検証) [x]nfc読み込み機能&画面を作る []APIと連携させる []管理者画面を作る ~?月シーン検知?をする ~?月論文を書く ~?月論文発表したい fumaさんと軽く話した そんなに難しくないもの 初心者です 工程が多いもの 位置推定をするため移動がたくさんほしい 飽きないもの これから何度もやるため 材料費が高すぎないもの 材料費は研究費に含まれないとか →太巻き いろんな材料が必要 簡単な工程がいっぱい 第一主成分と第二主成分 第二主成分と第三主成分 第一主成分と第三主成分 あんまり別れきってない 一連の動作ではなく1フレームずつの加速度でやっているため、 0,0あたりに集まるのは当然 →ウィンドウに分けて標準偏差などの特徴量でやる 一旦ペンギンのデータでやってみる https//archive.ics.uci.edu/dataset/690/palmer+penguins3 ライブラリに任せっきりのため、何しているか理解する必要がある pca=PCA() pca.fit(dfs) feature=pca.transform(dfs) pd.DataFrame( feature,columns=["PC{}".format(x+1)forxinrange(len(dfs.columns))] ).head() 第何主成分まででどのくらいの情報を説明できるかという指標 ↓第二主成分までで十分そう センシングを始めようかと思ってます 必要な時にまとめて取るのは大変なので週1程度でやりたい 機械学習を深める LSTM 主成分分析 管理者画面を作った APIはまだなので仮 バイトで学んだことを活かして綺麗に書けた ts import{atom}from'jotai'; exportinterfaceItem{ idnumber; titlestring; idmstring; typestring; } constfetchItem=async(idItem['id'])Promise{ //仮 awaitnewPromise((resolve)=>setTimeout(resolve,1000)); return{ id, idmidm${id}, typetype${id}, titletitle${id}, }; }; constitemAtom=atom(undefined); exportconstselectItemAtom=atom( (get)=>get(itemAtom), async(_get,set,idItem['id'])=>{ set(itemAtom,undefined); constitem=awaitfetchItem(id); set(itemAtom,item); } ); ts import{itemAtomLoadable}from'@/store/items'; import{useAtomValue}from'jotai'; constuseItems=()=>{ returnuseAtomValue(itemAtomLoadable); }; exportdefaultuseItems; ts constAdminBody=()=>{ constitems=useItems(); return( {items.state==='hasData'&&} {items.state==='loading'&&} ); }; BookWormラズパイをセットアップした パスワードの設定 VNCの設定 ~~Nodeのインストール~~ 直接nodeがあったりnvmでバージョン管理してたり nvmがうまく動かなかったり Rustのインストール ラズパイのセットアップ 初期化しようかと思ってます(要相談) APIとの連携 就活たのしそうだったので逆求人登録してみた 何を聞けるのか、面談してみようと思います 企業の選択肢を広げれたら嬉しい 今の所mixiが気になってる なんか徹夜カラオケした https//ipsjone.org/#suda 学生課の依頼で作った愛工大案内するやつ 完成したのにchromeだけ位置情報がずれてしまった →GPSに加えてWiFi(SSID)も使って補正をしていた(WiFi位置推定)

2024年3月19日

梶研 [お料理やってない, BLE微妙..., NFC最高!]

梶研 [お料理やってない, BLE微妙..., NFC最高!]

3年セミナー:??% []mocopiとお料理センシング [x]シーンとランドマークを決める(~2月上旬) [x]SVMで動作判別する []機械学習を深める [x]機械学習の手法を知る [x]使う手法を決める [x]データセットを探す [x]機械学習(LSTM)する []精度を上げる []? []お料理センシング []お料理でどんな動作があるかを知る []? []論文書く []発表 []BLEビーコンのuuidを書き換えたい [x]通信内容を読み解く []shellコマンドで通信してみる []実装してみる []BookWorm [x]Pasoriとデスクトップアプリを接続する(技術検証) [x]nfc読み込み機能&画面を作る []APIと連携させる []管理者画面を作る ~?月シーン検知?をする ~?月論文を書く ~?月論文発表したい 前回)精度は置いといて、機械学習は一旦できたぽい お料理についてどんな動作があるかfumaさんと話す →気づいたら金曜日にだったので今週やる コンロや冷蔵庫,電子レンジ,まな板前など動き回る料理がいい 卵焼き→コンロ程度? 料理力が壊滅的 初心者でも(慣れれば)出来るような物がいい 現状 卵焼き🙆 目玉焼き🙅‍♀️ 今後たくさん作る必要がある 好きな食べ物がいい オムライスとか? どうやらPythonでGATT通信できるものがあるらしい https//pypi.org/project/BLEGATT/ https//micropythondocsja.readthedocs.io/ja/latest/library/bluetooth.html HTTPではなく、より低レイヤーのTCPを扱うイメージ なんやかんや調べた結果、一旦ペアリングする必要があるとか? Android端末とビーコンはそんなことしていないので違うはず? よく分からないので一旦手を動かしてみる BLEデバイスをスキャンする >$sudohcitoollescan 選択 >$gatttoolIb[address] 接続 >[address][LE]>connect エラーAttemptingtoconnect 使用法: ガットツール[オプション?] ヘルプオプション h,helpヘルプオプションを表示します helpallすべてのヘルプオプションを表示します helpgattすべてのGATTコマンドを表示します helpparamsすべてのプライマリサービス/特性引数を表示します helpcharreadwriteすべての特性を表示値/記述子読み取り/書き込み引数 GATTコマンド primaryプライマリサービスの検出 characteristics特性の発見 charread特性値/記述子の読み取り charwrite特性値応答なしの書き込み(書き込みコマンド) charwritereq特性値書き込み(書き込み要求) chardesc特性記述子の検出 listen通知と指示をリッスンします 主なサービス/特性の引数 s,start=0x0001開始ハンドル(オプション) e,end=0xffff終了ハンドル(オプション) u、uuid=0x1801UUID16またはUUID128(オプション) 特性値/記述子読み取り/書き込み引数 a,handle=0x0001ハンドルによる読み取り/書き込み特性(必須) n,value=0x0001書き込み特性値(書き込み操作に必要) アプリケーションオプション i,adapter=hciXローカルアダプターインターフェースを指定します b,device=MACリモートBluetoothアドレスを指定します t、addrtype=[パブリック[ランダム]LEアドレスの種類を設定します。デフォルトパブリック m,mtu=MTUMTUサイズを指定します p,psm=PSMBR/EDR上のGATT/ATTのPSMを指定します l,seclevel=[低中高]セキュリティレベルを設定します。デフォルト低 I,interactive対話モードを使用する bluetoothctlというコマンドもあるらしい. デバイス一覧を出す >$bluetoothctl >[bluetooth] でてこない. スキャンしたものの中から接続可能なものが出てくるらしい >[bluetooth] デバイス一覧が取れた gattというコマンドもあるのでそれを使えばできる? >[bluetooth] ねむい.つかれた.また今度やる 疲れたので楽なBookWromをやった Pasoriを使う方法として Tauriのバックエンド(Rust)で読み取る 一番美しい※個人の思想 本来あるべき姿 Rustという面で引き継ぎづらい? パッケージがあれば書く量は少なく引き継ぎやすい? Tauriのバックエンドからshellなどから他の言語(Pythonなど)で読み取る 現在の方法 美しくない 環境依存になる 正攻法ではない Pythonなどを使えるという面では引き継ぎやすい? Tauriのフロントエンド(ブラウザ/JavaScript)で読み取る 美しいとは言えない 正攻法ではある PasoriやMFCタグの低レイヤーを知る必要がある 参考https//sakurasystem.com/?p=3120 JavaScriptという面では引き継ぎやすい? 低レイヤーを知る必要があるため引き継ぎづらい RustでPasoriを扱う →良いパッケージがなかった nfc 古い https//github.com/dsgriffin/nfc libnfcを使って自分で実装 実装辛い 環境依存 https//github.com/segfo/smartcard 重いのでRustは諦める. WebUSBを使ってJavaScriptからPasoriを扱う 参考元 ライセンス ライセンスに則った上で改変しまくりました https//github.com/saturday06/webusbfelica/blob/ghpages/demo.html Pasori仕様書 https//kikakurui.com/x6/X63194201601.html USBデバイス全てに対応するAPIなのでとても低レイヤーを触っています コード一部抜粋 ts awaitsend(device,[0x00,0x00,0xff,0x00,0xff,0x00]); awaitsend(device,[0x00,0x00,0xff,0xff,0xff,0x03,0x00,0xfd,0xd6,0x2a,0x01,0xff,0x00]); awaitreceive(device,6); awaitreceive(device,13); awaitsend(device,[0x00,0x00,0xff,0xff,0xff,0x03,0x00,0xfd,0xd6,0x06,0x00,0x24,0x00]); awaitreceive(device,6); awaitreceive(device,13); awaitsend(device,[0x00,0x00,0xff,0xff,0xff,0x03,0x00,0xfd,0xd6,0x06,0x00,0x24,0x00]); awaitreceive(device,6); awaitreceive(device,13); カスタムイベントというやつを使ってみた イベントウェブページ上で発生するあらゆるアクションの総称 idmを読み取ったら発火するイベントを作成した ts //イベントを定義 constreadIdmEvent=newCustomEvent('readIdm',{detail{idm}}); //イベントを発火 window.dispatchEvent(readIdmEvent); //イベントリスナーを登録(idmが呼ばれる度にonReadIdmが実行される) window.addEventListener('readIdm',onReadIdm); カスタムフックにして扱いやすくなった ts constLendingPage=(propsLendingPageProps)ReactElement=>{ constsubscribeIdm=useCallback(handleReadIdm,[]);//カスタムフック const{start,stop}=usePasoriEvent(subscribeIdm); functionhandleReadIdm(idmstring){ console.log({idm}); handleNext(); } ... } mizutani先輩とのReactドキュメント輪読会が役に立ちました イベントリスナーを削除するには同じ関数を与える必要がある →useCallbackでいい感じに もう少しいい感じにしたい(strictモードではwebUSBの動作が不安定) せっかくJSだけで出来たので仮デプロイしました https//bookwormnfc.satooru.dev/ ほとんど完成してしまったのでAPIができ次第、続きをやります windowsのVScodeがあまりにも触りづらかったのでvimに慣れようと思います. ぼくのかんがえたさいきょうのIDEを構築しています 八草駅から5分程度の位置にある城 雨上がりで危なそうだったので攻城は諦めた 帰り道に竹島に寄るのが恒例と聞いたので寄った 楽しくなって浜名湖にも寄った 吉田城に行った 続日本百名城の一つで気になってた のんほいパークに行った DC0D300DFFCC https//www.mikantech.net/entry/blegattstudy https//www.mikantech.net/entry/raspisensortaggatttool https//jitaku.work/it/category/bluetooth/gatttool/

2024年3月12日

梶研 [LSTMで行動認識をする]

梶研 [LSTMで行動認識をする]

3年セミナー:??% []mocopiとお料理センシング [x]シーンとランドマークを決める(~2月上旬) [x]SVMで動作判別する []機械学習を深める [x]機械学習の手法を知る [x]使う手法を決める [x]データセットを探す [x]機械学習(LSTM)する []精度を上げる []? []お料理センシング []お料理でどんな動作があるかを知る []? []論文書く []発表 []BLEビーコンのuuidを書き換えたい [x]通信内容を読み解く []実装してみる ~?月シーン検知?をする ~?月論文を書く ~?月論文発表したい http//ec25225205214.uswest2.compute.amazonaws.com/files/activity_net.v13.min.json bookmark_vol36no2/ >Moreaux,M.,Ortiz,M.G.,Ferran´e,I.andLerasle,F.Benchmarkforkitchen20,adailylifedatasetforaudiobasedhumanactionrecognition,Int.Conf.ContentBasedMultimediaIndexing(CBMI),IEEE,pp.1–6(2019). > >https//ieeexplore.ieee.org/document/8877429 とても良さそうだったが論文が見れなかった... →モデル作成に用いるkitchen20データセット[11]の各音源の長さは5秒である音声だったかも 探すの飽きたので一旦適当なデータセットで試す ~~好きな物を題材にするのはやる気が出て良いと思います~~ 時系列データではないためLSTMでは使えなかった https//allisonhorst.github.io/palmerpenguins/ 行動認識してる研究があった >加速度データからの機械学習による行動認識 >福井大学大学院工学研究科研究報告第68巻2020年3月 https//www.eng.ufukui.ac.jp/wpcontent/uploads/vol68_5966.pdf >4.1用いるデータセット この節では、使用するデータセットの説明をする。 データセットは、スマートフォンによって収集された3軸加速度センサを用いたデータであるHASCコーパスを用る。このデータセットの対象としている行動は、停止(stay)、歩行(walk)、ジョギング(jog)、スキップ(skip)、階段を上がる(stUp)、階段を下る(stDown)の6種類であり、それぞれの3軸加速度信号データ(csv)、メタデータ(meta)、ラベルデータ(label)の3種類のデータ形式が記録されている。また、データセットは、大きく分けてセグメントデータとシーケンスデータに分けることができる。 梶先生らのを使っていた 簡単なLSTMをしている記事があった https//qiita.com/slothhobby/items/93982c79a70b452b2e0a 1.(三角関数のパラメーラを設定) 2.データセットを生成 値とラベル(と時間) 3.データセットを学習用とテスト用に分ける sklearn.model_selection.train_test_splitを使っている 4.値とラベルをシャッフルする sklearn.utils.shuffle 5.Tensor型にする torch.Tensor 6.損失を計算する? 7.損失に関する各パラメータの勾配を計算する? 8.予測する https//hilinker.hatenablog.com/entry/2018/06/23/204910 三角関数の連続する3点から続きの1点を出す→manytoone 分類問題はmanytoone 参考https//qiita.com/m__k/items/841950a57a0d7ff05506 BasicActivity/{index}_{label}/{PersonID}/HASCacc.csvtimexyz 複数のファイルに分かれているためひとつのファイルにまとめる BasicActivity/{PersonID}/{PersonID}acc.csvtimexyzlabel ~~面倒だったので~~加速度だけでやる py def__init__(self,person_idstr,pathstr)>None labels=['stay','walk','jog','skip','stUp','stDown'] files=[ { "label"l, "acc"str(list( pathlib .Path(f"{path}/{i+1}_{l}/{person_id}") .glob("acc.csv") )[0]), "gyro"str(list( pathlib .Path(f"{path}/{i+1}_{l}/{person_id}") .glob("gyro.csv") )[0]), "pressure"str(list( pathlib .Path(f"{path}/{i+1}_{l}/{person_id}") .glob("pressure.csv") )[0]), } fori,linenumerate(labels) ] df_acc=pd.concat([ pd.read_csv(f["acc"],header=None,names=["time","x","y","z"]) .assign(label=f["label"]) forfinfiles ]) df_gyro=pd.concat([ pd.read_csv(f["gyro"],header=None,names=["time","pressure"]) .assign(label=f["label"]) forfinfiles ]) df_pressure=pd.concat([ pd.read_csv(f["pressure"],header=None,names=["time","x","y","z"]) .assign(label=f["label"]) forfinfiles ]) self.df_acc=df_acc self.df_gyro=df_gyro self.df_pressure=df_pressure defmake_dataset(self,sequence_lengthint) dataset_inputs=[] dataset_labels=[] dataset_times=[] fori,rowinenumerate(self.df_acc.itertuples()) ifi+sequence_length>len(self.df_acc) break ifi>0andself.df_acc.iloc[i1].label!=row.label continue dataset_inputs.append(rforrinself.df_acc[ii+sequence_length]) dataset_labels.append(row.label) dataset_times.append(row.time) returndataset_inputs,dataset_labels,dataset_times py inputs,labels,_=train.make_dataset(sequence_length) train_inputs,test_inputs,train_labels,test_labels=train_test_split(inputs,labels,test_size=test_size,shuffle=False) 評価関数とは >評価関数とは学習させたモデルの良さを測る指標を指します。 py criterion=nn.CrossEntropyLoss() 二乗平均誤差(RMSE)みたいな役割ぽい 参考https//qiita.com/monda00/items/a2ee8e0da51953c24da8 最適化関数とは >損失関数を用いて正解値と予測値の差を微分することで、勾配を求めることができます。 この勾配を利用してどのくらいの強度でパラメータを更新するかを決めているのが最適化関数です。 とにかくパラメータの方向性をいい感じにしてくれるらしい 参考https//qiita.com/Lapinna/items/d5c331b74c99767ca04a ephoc数訓練データを何回繰り返して学習させるかの回数 batch数データセットを分割する.1度に処理を行う数 pyイメージ forephochinephoc数 forbatchinbatch数 学習の処理 py deftrain( self, train_inputslist, train_labelslist, test_inputslist, test_labelslist, epoch_numint, batch_sizeint, sequence_lengthint, ) train_batch_num=len(train_inputs)//batch_size test_batch_num=len(test_inputs)//batch_size forepochinrange(epoch_num) print(""20) print(f"Epoch{epoch+1}/{epoch_num}") train_loss=0.0 test_loss=0.0 shuffled_train_inputs,shuffled_train_labels=shuffle( train_inputs,train_labels ) np.savetxt( "shuffled_train_inputs.csv", np.array(shuffled_train_inputs).reshape( 1,np.array(shuffled_train_inputs).shape[1] ), delimiter=",", ) forbatchinrange(train_batch_num) start=batchbatch_size end=start+batch_size np_train_inputs=np.array(shuffled_train_inputs[startend]).astype( np.float64 ) np_train_labels=np.array(shuffled_train_labels[startend]).astype( np.int64 ) loss,_=self.train_step(np_train_inputs,np_train_labels) train_loss+=loss.item() forbatchinrange(test_batch_num) start=batchbatch_size end=start+batch_size loss,_=self.train_step( np.array(test_inputs[startend]).astype(np.float64), np.array(test_labels[startend]).astype(np.int64), ) test_loss+=loss.item() print(f"loss{train_loss/train_batch_num}") print(f'test_loss{test_loss/test_batch_num}') deftrain_step(self,inputs,labels) inputs_tensor=torch.tensor(inputs,dtype=torch.float32).to(self.device) labels_tensor=torch.tensor(labels).to(self.device) self.model.eval() preds=self.model(inputs_tensor) loss=self.criterion(preds,labels_tensor) returnloss,preds device:cpu Epoch1/100 loss1.80343093945269 test_loss1.7852103145498979 Epoch2/100 loss1.8034178761013768 test_loss1.7852103145498979 Epoch3/100 loss1.8034281317602123 test_loss1.7852103145498979 Epoch4/100 loss1.8034172628009528 test_loss1.7852103145498979 Epoch5/100 loss1.8034309844175975 test_loss1.7852103145498979 Epoch6/100 loss1.8034331908351497 test_loss1.7852103145498979 ... loss1.803422716103102 test_loss1.7852103145498979 Epoch12/100 lossが減らない. ChatGPTに聞いてみた >訓練がうまくいかない理由の一つは、学習率(lr)の値が適切でない可能性があります。学習率はモデルの訓練中に重要な役割を果たし、適切な値を見つけることが重要です。学習率が高すぎると、訓練が収束せずに振動する可能性があります。逆に、学習率が低すぎると、訓練が収束するまでに非常に長い時間がかかる可能性があります。 なるほど 0.0001から1にしてみた device:cpu Epoch1/100 loss1.7967431503429747 test_loss1.7872365692205596 Epoch2/100 loss1.796769555723458 test_loss1.7872365692205596 Epoch3/100 loss1.796803759901147 test_loss1.7872365692205596 Epoch4/100 loss1.7967799776478817 test_loss1.7872365692205596 Epoch5/100 loss1.7967207206968676 test_loss1.7872365692205596 Epoch6/100 loss1.79678154043984 test_loss1.7872365692205596 ... Epoch100/100 loss1.7967986835722338 test_loss1.7872365692205596 変わらない.0.01100なども試したが大差なかった 原因候補 最適化関数が良くない? sin波の予測と分類ではやり方が違うのかもしれない 適当にlabel渡したのが良くない optim.Adamからoptim.SGDにした 参考 py device:cpu Epoch1/100 loss1.809930482977315 test_loss1.721430358133818 Epoch2/100 loss1.8099145392576854 test_loss1.721430358133818 Epoch3/100 loss1.8099606868467832 test_loss1.721430358133818 Epoch4/100 loss1.8100076438042156 test_loss1.721430358133818 Epoch5/100 loss1.8099237277842404 test_loss1.721430358133818 Epoch6/100 loss1.8099288961343598 test_loss1.721430358133818 ... Epoch100/100 loss1.8099035244239003 test_loss1.721430358133818 変わらなかった.そもそも最適化関数が使えてる? →optimizer.step()を入れてなかった device:cpu Epoch1/100 loss1.4727532474095362 test_loss2.458821142043775 Epoch2/100 loss3.9363968978848374 test_loss47.90312148220191 Epoch3/100 loss22.853781702225668 test_loss350.9249111309386 Epoch4/100 loss43.75640468430101 test_loss69.1852414315207 Epoch5/100 loss172.5352889696757 test_loss838.7717777720669 Epoch6/100 loss140.68897648024978 test_loss245.76162933885004 ... loss222.82399281284265 test_loss668.8828098230194 Epoch10/100 変化したが爆上がりした 0.0001にしてみた 1回目 device:cpu Epoch1/1000 loss1.7136963245115782 test_loss2.322023772356803 Epoch2/1000 loss1.564926897224627 test_loss2.430806122328106 Epoch3/1000 loss1.6254029938003474 test_loss1.955993468301338 ... loss0.7991769483737778 test_loss3.40365913876316 Epoch104/1000 2回目 device:cpu Epoch1/1000 loss1.630137525629579 test_loss2.442890736094692 Epoch2/1000 loss1.7019225055711311 test_loss1.8877409361956412 Epoch3/1000 loss1.540266997458642 test_loss1.795748932319775 ... loss0.31551139612208334 test_loss0.7359745272092129 Epoch101/1000 ... loss1.1991943183698153 test_loss1.0757994573612355 Epoch167/1000 良い感じになってきた. Epoch数を上げすぎると過学習になった パラメータを変えて精度を上げる必要がありそう (主成分分析は) これをどう使えばいいかは分からない ある程度分かってくると機械学習も面白い 私のブックマーク「センサを用いた行動認識」 https//www.aigakkai.or.jp/resource/mybookmark/mybookmark_vol36no2/ なし 道中の犬山城 道中の大垣城 関ヶ原 道中の墨俣一夜城

2024年2月27日

梶研 [機械学習と動作判別の論文を探す]

梶研 [機械学習と動作判別の論文を探す]

3年セミナー:??% []mocopiとお料理センシング [x]シーンとランドマークを決める(~2月上旬) [x]SVMで動作判別する []機械学習を深める [x]機械学習の手法を知る []使う手法を決める []データセットを探す []機械学習する []? []お料理センシング []お料理でどんな動作があるかを知る []? []論文書く []発表 []BLEビーコンのuuidを書き換えたい [x]通信内容を読み解く []実装してみる ~?月シーン検知?をする ~?月論文を書く ~?月論文発表したい 今まで機械学習を嫌厭をしていたため、なにがあるか分からない →似たような論文を見てみる 何使えばよいか分かりません... →機械学習>分類>[主成分分析ナイーブベイズ] https//www.jstage.jst.go.jp/article/jsmemecj/2018/0/2018_S2310103/_pdf 検証方法なので違った(プロ演でやったようなやつ) >データから直接学習するディープラーニングのためのネットワークアーキテクチャ https//www.sbbit.jp/article/cont1/60675?previewpass=vhoehltpr3vm > https//ipsj.ixsq.nii.ac.jp/ej/?action=pages_view_main&active_action=repository_view_main_item_detail&item_id=232719&item_no=1&page_id=13&block_id=8 一人の動きというよりかは、人々全体の動きなのでちょっと違う? https//ipsj.ixsq.nii.ac.jp/ej/?action=pages_view_main&active_action=repository_view_main_item_detail&item_id=232693&item_no=1&page_id=13&block_id=8 今回使えるようなものではない? k個にグループ分けする 論文難しい 教師あり学習 回帰 木 ニューラルネットワーク(NN) ベイズ 時系列 クラスタリング アンサンブル学習 教師なし学習 クラスタリング ニューラルネットワーク(NN) その他 強化学習 深層強化学習 将来予測が可能 時系列解析ぽく見えたが、多分違う >回帰の主な目的は、連続値などの値の予測です 過去のデータを入力として、この先の動向を予測する 違いそう 入力したデータがどのクラスに属するかを分類する プロ演のirisのような これかも? >確率論の定理であるベイズの定理を基にしています。 すごい数式 >全ての推定の確率を計算し、最も確率の高いものを推定結果として出力 すごそうだが、全身の関節の動きは独立にはならなそう >たくさんの量的な説明変数を、より少ない指標や合成変数(複数の変数が合体したもの)に要約する手法 使えそう? >パターン認識でよく使われ、特徴空間における最も近い訓練例に基づいた分類の手法 >クラスタリングという、データを性質の近い分類同士でグループ分けする手法 機械学習どれ使えばいいか 一旦使えそうな手法をいろいろ試しても良いかも データセットはどのサービス(?)から拾えばいいか どんな英単語で調べれば良いか分からない なし ファンが暴走していないのはとても幸せです 手元が寒くなりました

2024年2月26日

梶研 [mocopiとaction slam(SVM)]

梶研 [mocopiとaction slam(SVM)]

3年セミナー:??% []mocopiとactionslam2 [x]シーンとランドマークを決める(~2月上旬) [x]SVMで動作判別する []? []論文書く []発表 ~?月シーン検知?をする ~?月論文を書く ~?月論文発表したい 梶研でいろんな動作をする中で冷蔵庫を開け閉めする動作をランドマークとする(仮) HASC2010corpusを用いた被験者数と人間行動認識率の相関. https//nagoya.repo.nii.ac.jp/record/13543/files/dt_hiro.pdf >認識の際には,平均,エネルギー,エントロピー,相関が特徴量として使用されている >>[2.関連研究の紹介(p.2)] >>Bao,L.andIntille,S.S.ActivityRecognitionfromUserAnnotatedAccelerationData.ProcofPERVASIVE2004,pp.117,2004. >認識の際には,特徴量として,窓幅5.12秒毎の平均,標準偏差,エネルギー,相関が用いられており >>[2.関連研究の紹介(p.3)] >>Ravi,N.,Dandekar,N.,Mysore,P.andLittman,L.M.ActivityRecognitionFromAccelerometerData.ProcofIAAI,pp.15411546,2005. >ノルムを計算し,得られた波形の平均と分散を特徴量として抽出 >加速度のノルムに対して,平均,分散,周波数帯域毎のエネルギー,零点交差率の7つの特徴量を用いた行動認識に関する評価実験も行った >加速度の積分値を8つ目の特徴量とした場合の評価実験を行った >>[4.2特徴量] 行動認識の特徴量 平均 分散 相関 エネルギー ? エントロピー 情報源がどれだけ情報を出しているか https//www.mnc.tohou.ac.jp/vlab/yobology/entropy/entropy.htm 零点交差率 一定区間内で0を横切る頻度 加速度の積分値 窓幅は3秒とする py bvhp=BVHparser('./logs/refrigerator.bvh') df=bvhp.get_motion_df() defcalculate_features(window) features=[] median_time=window['time'].mean() forjointincolumns X_rotate=window[joint+'_Xrotation'].values Y_rotate=window[joint+'_Yrotation'].values Z_rotate=window[joint+'_Zrotation'].values mean_value=np.mean([X_rotate,Y_rotate,Z_rotate]) variance_value=np.var([X_rotate,Y_rotate,Z_rotate]) correlation_value=np.corrcoef([X_rotate,Y_rotate,Z_rotate])[0,1] zero_crossings=np.sum(np.diff(np.signbit([X_rotate,Y_rotate,Z_rotate]))!=0) energy_value=np.sum(np.square([X_rotate,Y_rotate,Z_rotate])) features.extend([mean_value,variance_value,correlation_value,zero_crossings,energy_value]) return[median_time]+features window_size=3 window_stride=1 columns=[jforjinbvhp.get_joints()ifnotj.startswith('_')] windows=[df.iloc[ii+window_size]foriinrange(0,len(df),window_stride)ifi+window_size<=len(df)] result_columns=['time']+[f'{joint}_{metric}'forjointincolumnsformetricin['mean','var','corr','zero_cross','energy']] result_data=[calculate_features(window)forwindowinwindows] result_df=pd.DataFrame(result_data,columns=result_columns) labels=[ {'title''冷蔵庫を開ける','num'1,'times'[[10,12],[33,35],[39,41],[55,57],[77.5,79.5],[104,106],[133,135]]}, {'title''冷蔵庫を閉める','num'2,'times'[[14,16],[36,38],[42,45],[58,60],[82,84],[106.5,108.5],[135,137]]}, ] result_df['state']=0 forlabelinlabels fortime_rangeinlabel['times'] start_time,end_time=time_range result_df.loc[(result_df['time']>=start_time)&(result_df['time']<=end_time),'state']=label['num'] result_df.to_csv('./logs/refrigerator_with_state.csv',index=False) py df=pd.read_csv('./logs/refrigerator_with_state.csv') data=df.drop(['state','time'],axis=1).fillna(0) target=df['state'] clf=svm.SVC(gamma="scale") clf.fit(data,target) py test_data=df.drop(['time','state'],axis=1).fillna(0) ans=clf.predict(test_data) print(sum(ans==df['state'])/len(df['state'])) >正答率0.9063168562098862(約90.6%) ラベル付けが雑かった? 大まかな1s単位で付けた >背景は手動でラベル付けした結果 > 青冷蔵庫を開ける > 黄冷蔵庫を閉める > >0その他 >1冷蔵庫を開ける >2冷蔵庫を閉める >正答率0.8908906654656007(約89.1%) 下がった 1.動作を始める瞬間から終える瞬間までなるべく広めに取ったのが悪い? 確実に動作している 2.ウィンドウサイズが大きい? 1回の開ける・閉めるは1~2sに対してウィンドウは3s 3.特徴量はこれだけでいいのか? 4.データが少ない? >正答率0.9225312464812521(約92.3%) 正答率が上がったのはそもそも正解部分が少ないからだと思われる 開け閉め中もその他に含まれたり、含まれなかったりするため良くない window_size=1 window_size=2 window_size=3 window_size=4 window_size=5 window_size=10 変わらない →60fpsだから大差ない window_size=30(0.5s) 細切れの部分が減った データを沢山取ってやってみる 技術力の問題でNext.jsでブログを作れなかったためHUGOで別サイトにしていた(半年前) プロフィールとブログを統合した! カスタマイズ性が上がり、esaから記事を追加できるようになった 画像を全てwebp&幅820pxに変換し、パフォーマンスが向上した

2024年1月30日

satooru.me[最新版]

satooru.me[最新版]

プロフィールサイトをアップデートしました プロフィールをNext.js,ブログをHugoと使い分けていたのを、全てNext.jsで実装しました というサービスをCMSとしてSSGで運用しています Next.js(AppRouter) mantine graymatter CSSModules(SASS) CloudflarePages GitHubAPI

2024年1月24日

梶研 [mocopi と action slam2]

梶研 [mocopi と action slam2]

3年セミナー:??% []mocopiとactionslam2 []シーンとランドマークを決める(~2月上旬) []? []論文書く []発表 ~?月シーン検知?をする ~?月論文を書く ~?月論文発表したい 一旦ラベリングを楽にする関数を作った py defplot_joint(bvhp,joint,xlim=(0,0),ylim=(0,0),figsize=(12,3),labels=None,is_position=False) df=bvhp.get_joint_motion_df(joint,mode='relative') fig=plt.figure(figsize=figsize) gs=GridSpec(1,2,width_ratios=[11,1],wspace=0.5) ax1=fig.add_subplot(gs[0]) ax2=fig.add_subplot(gs[1]) joint_name=to_joint_name(joint) ax1.set_title(f'{joint_name}の位置'ifis_positionelsef'{joint_name}の回転') ax1.set_xlabel('time[s]') ax1.set_ylabel('rotation[deg]'ifis_positionelse'position[mm]') ax1.grid(color='k',linestyle='dotted',linewidth=1,alpha=0.5) ifxlim[0]<xlim[1] ax1.set_xlim(xlim[0],xlim[1]) ifylim[0]<ylim[1] ax1.set_ylim(ylim[0],ylim[1]) r_heads=['Xrotation','Yrotation','Zrotation'] p_heads=['Xposition','Yposition','Zposition'] heads=p_headsifis_positionelser_heads forheadinheads ax1.plot(df['time'],df[head],label=head) colors=['mediumblue','orange','green','red','purple','gray','olive','cyan'] iflabels fori,linenumerate(labels) color=colors[i%len(colors)] ax2.scatter([],[],color=color,label=l) fors,einlabels[l] ax1.axvspan(s,e,color=color,alpha=0.2) ax1.legend() legend=ax2.legend() ax2.axis('off') forhandleinlegend.legend_handles handle.set_alpha(0.5) plt.show() py幸せ.py bvhp=BVHparser('./logs/1.bvh') labels1={ '本を取る'[ [20,25], [35,40], ], '本を置く'[ [29,32], ], ... } forjinbvhp.get_joints() ifj[0]=='_' continue plot_joint(bvhp,j,(0,150),(0,0),labels=labels1) 項目が多く、ランドマークの探し方がわからない 全ての項目を使うのは不可能? 主に使ったライブラリ(フレームワーク) フロント Next.js LeafLet バック Hono CloudflareD1 スクレイピング BeautifulSoup TypstTexよりも書きやすく軽く環境構築しやすい組版処理システム マークダウンxCSSみたいな感覚でかけて幸せ

2024年1月23日

Castle Datastore

Castle Datastore

このアプリケーションは,城好きに向けた城巡りの計画をサポートするためのWebアプリケーションです。 このアプリケーションはマップ上で城の位置を示すことで、簡単に城の位置を知られます フロントエンド Next.js(AppRouter) leaflet sass CloudflarePages バックエンド Hono drizzleorm wrangler CloudflareWorkers CloudflareD1

2024年1月22日

梶研 [Unity で複数人の動作を可視化(完) & mocopi と action ]

梶研 [Unity で複数人の動作を可視化(完) & mocopi と action ]

3年セミナー:??% [x]mocopiでセンシング(~12月) [x]mocopixUnity [x]色んな動作をとる [x]誤差を計測(簡易) [x]動作をグラフ化 [x]bvhをパースするパッケージを作る [x]csvに書き出せるアプリを作る [x]複数人の絡みを取ってみる [x]ブラウザで動作を確認できるようにする(gLTF形式の理解) [x]Unityで複数人の動作を可視化する [x]一連のやり方をesaにまとめる []mocopiとactionslam2 []シーンとランドマークを決める(~2月上旬) []? []論文書く []発表 ~?月シーン検知?をする ~?月論文を書く ~?月論文発表したい 手順をesa&Qiitaにまとめました。 タイトルを決めたい。 actionslam2で合っているか分からない mocopiの長時間使用時の位置情報の誤差をなくす 一連の動作(シーン)から特定の動作(ランドマーク)を抽出し、シーン内の位置情報を推定する 第一段階(今年)ランドマーク抽出 第二段階ランドマークから位置推定 動きがあること 全身の動作である ランドマークと同様の動作がない お料理 具材がたくさんある料理をつくる 学会発表の費用を出せるかもしれない 切る,フランパン振るなどは腕の動きだけで十分そう?(mocopiである必要性) 料理ができない お買い物 棚から商品を取る 同様の動作を繰り返していそう 買い物何回も行きたくない 城,水族館 同じところ何度も通らないから良くないかもしれない? 大学 梶研 本を取る お湯を注ぐ 図書館 棚から本をとる 同様の動作を繰り返していそう 本の貸し借り スポーツする 卓球 動く範囲が狭い サッカー,野球 やりたくない テニス 動作の位置の関係性が薄そう サーブ,レシーブの位置の制限が広い 水泳 水没する さくら+moomooドメインは色々と管理が面倒だったのでcloudflareを始めた 今まで webサイト→さくらサーバー api→Renderor梶研/シス研サーバー DB→迷子(お金こわい) 全てcloudflareでできる! を置き換えた を取得した を持て余している webプロの課題も兼ねてcloudflareD1で大量に読み取りするwebアプリを制作してます

2024年1月16日

長崎ペンギン旅行

長崎ペンギン旅行

三原城 長崎ペンギン水族館 島原城 18切符1日分2410円x2日 新幹線約5000円 特急(小倉博多)800円 特急(博多武雄温泉)1200円 北九州新幹線3070円 バス約600円x4回 島原鉄道3000円 飛行機約13000円 三原城御城印300円 ペンギン水族館520円 島原城700円 島原城御城印300円 南大高駅545(始発) 米原駅727 京都駅 新大阪駅855 岡山駅 糸崎駅1210 三原駅1256 岩国駅1515 下関駅1847 小倉駅1923 博多駅2016 武雄温泉駅2309 長崎駅2339(終電) 長崎交通広場[バス]ペンギン水族館前 日見公園前[バス]長崎交通広場 長崎駅[JR]諫早駅 諫早駅[島原鉄道]島原駅 島原駅[島原鉄道]諫早駅 諫早駅[JR]新大村駅 新大村ターミナル[バス]長崎空港 長崎空港[ANA]中部国際空港 すごい疲れた ペンギン水族館に毎日通いたい 旅行にPCは要らない ペンギン水族館 島原城 長崎空港

2024年1月10日

梶研 [Unity で複数人の動作を可視化]

梶研 [Unity で複数人の動作を可視化]

3年セミナー:??% []mocopiでセンシング(~12月) [x]mocopixUnity [x]色んな動作をとる [x]誤差を計測(簡易) [x]動作をグラフ化 [x]bvhをパースするパッケージを作る [x]csvに書き出せるアプリを作る [x]複数人の絡みを取ってみる [x]ブラウザで動作を確認できるようにする(gLTF形式の理解) [x]Unityで複数人の動作を可視化する []一連のやり方をesaにまとめる []mocopiとactionslam2 ? 1月研究の方針を決める&進め方を決める 前回Unityちゃんでやってみたら、ピンク(テクスチャが無し)になってしまった 対応トゥーンシェーダーデータをインストールする 再生した時、Unity上の世界座標が原点なのか、モデルの初期位置が原点なのか モデルの初期位置が原点となることがわかった →モデルの位置を調整することで位置関係を再現できる bvhの最初のデータが(0,腰の位置,0)、 数フレーム後から正しい位置になっている →モデルの初期位置とデータの正しい位置は異なり、テレポートするため調整が面倒 最初の一瞬で近づいている このテレポートを考慮して初期位置を調整している bvhからUnityで再生できるfbx形式に変換する時に処理を行う 1.開始時の(x,z)=(0,0)となっているデータを削除 1.0フレーム目の位置が(x,z)=(0,0)となるように調整 1.bvhからfbxに変換する python frommcp_persorimportBVHparser importsys importargparse parser=argparse.ArgumentParser() parser.add_argument('file',type=str,help='inputmocopirecordfile.bvh') args=parser.parse_args(sys.argv[sys.argv.index('')+1]) bvhp=BVHparser(args.file) motion_df=bvhp.get_motion_df() motion_df=motion_df[ (motion_df['root_Xposition']!=0)(motion_df['root_Zposition']!=0) ] reset_channels=['root_Xposition','root_Zposition','root_Yrotation'] forcinreset_channels motion_df[c]=motion_df[c]motion_df.iloc[0][c] bvhp.set_motion_df(motion_df) new_file=f"{args.file[4]}reset.{args.file[3]}" bvhp.to_bvh(new_file) print(new_file) 一連のやり方をesaにまとめようとプロジェクトを作るところからやったところ、 再現ができなくなってしまいました... スケールが100倍になる 動作が反映されない 研究を始めたい >「mocopiは長時間動くと狂う」 >他のセンサと組み合わせて途中でキャリブレーションできないか > >例) >歩いているとき、足が一定間隔で伸びると仮定すると >歩いているのに膝が最小でも30度曲がっている→ー30度して調整(適当) 進め方が分からない 論文の流れを考えた方が良い? とりあえずどの場面にするか決める? 高校生のやる気が引き出せた なにも出来なかった 興国城の写真しか無かった 始発 終電の西九州新幹線 お土産屋で2万円溶けました...

2024年1月9日

熱海旅行

熱海旅行

興国寺城 熱海 興国寺城御城印500円 車 富士山の見える城って凄い良い 熱海の写真はとってなかった

2024年1月5日

satooru.dev

satooru.dev

2023年最後の開発としてJavaScriptの物理演算ライブラリmatter.jsを使ってみました Next.js(AppRouter) matter.js CloudflarePages sass

2023年12月31日

梶研 [action slam2の論文読みました]

梶研 [action slam2の論文読みました]

3年セミナー:??% []mocopiでセンシング(~12月) [x]mocopixUnity [x]色んな動作をとる [x]誤差を計測(簡易) [x]動作をグラフ化 [x]bvhをパースするパッケージを作る [x]csvに書き出せるアプリを作る [x]複数人の絡みを取ってみる [x]ブラウザで動作を確認できるようにする(gLTF形式の理解) []Unityで複数人の動作を可視化する []mocopiとactionslam2 ? 1月研究の方針を決める mocmopiを長時間使用していると誤差が積み重なり、 関節の角度などがおかしくなってしまう ↓ 特定の動作から補正をしたい 例 冷蔵庫を開ける時は肘を一定角度曲げる 膝と足先にウェアラブルセンサを付けて、 その値からトラッキング(動線と動作?)を行う研究 ウェアラブルセンサによって認識されたユーザアクションをランドマークとしてローカライゼーションとマッピングを同時に行う ウェアラブルセンサとは身につけて歩くことができるセンサのこと。今研究では膝とつま先につけたIMUを使用している 今研究でいうローカライゼーションはどこにいるかを特定すること? ~~マッピングはセンサの情報と特定の位置を紐づけること?~~ マッピングはセンサの情報から周辺のマップを生成すること?(参考 "headingdriftcompensation"と"stancedetectionadaptation"と"ellipselandmarks"で対処する 日本語は、方位ドリフト補正,スタンス検出適応,楕円ランドマーク? 座っているような長時間の静止状態で発生した角速度センサのドリフトに対応する 地磁場を利用して補正する 鉄骨の建物内理想的な磁場ではないが、一般に磁場の向きは時間経過で変化しないため今研究では使用できる つまり、静止しているのに回転していたら磁場をもとに修正する? スライディングや早歩きの状況で欠落する スタンス検出ができないタイミングができ、誤差が大きくなるという問題がある 歩行中の一歩毎の静止状態を検出しているが滑ると一歩だとわからなくなる? 閾値を段階的に増加させて基準を緩めることで対処する 何の閾値かわからない 閾値変えるだけではないはず... 何をしているか全くわからない 翻訳私たちは、人間の行動の場所依存性をよりよく反映する楕円形のランドマークを導入する 関連研究としてWifiSLAMとともに挙げられている 足の動作から位置推定すること? 関連のありそうな研究 ZeroVelocityUpdate(ZUPT)とは、歩行者の歩行中に静止状態を検出することである。(byCopilot) ZUPT処理を使ったPDR ZUPT処理はセンサで感知される値は、ランダムドリフトによるものであると装置に認識させ補正する方法 (参考 カルマンフィルタについて調べた時と同じ匂いがする おせちを食べる (冷めた)チキンを食べる おしるこを食べる お雑煮を食べる 除夜の鐘を聞く(Youtube) ケーキを食べる 書き初めする クリスマス飾りと正月飾りの共存 クリスマスケーキとお雑煮(奥) おせち 書き初め

2023年12月26日

梶研 [mocopi センシング の環境を整える (Unity完全に理解した)]

梶研 [mocopi センシング の環境を整える (Unity完全に理解した)]

3年セミナー:??% []mocopiでセンシング(~12月) [x]mocopixUnity [x]色んな動作をとる [x]誤差を計測(簡易) [x]動作をグラフ化 [x]bvhをパースするパッケージを作る [x]csvに書き出せるアプリを作る [x]複数人の絡みを取ってみる [x]ブラウザで動作を確認できるようにする(gLTF形式の理解) []Unityで複数人の動作を可視化する ブルーシートばたばたの使い道を考える ライブセンシングの使い道を考える PDRやりたい ~~できませんでした...~~ ↓ ~~既存のパッケージの組み合わせで出来そう~~ ↓ 出来ない ↓ スクリプトを自作できそう(一旦置いとく) ↓ ~~既存のパッケージに合うBVHファイルを生成するスクリプトを書く~~ ↓ 分からない(パッケージが壊れてる?) ↓ fbxに変換してからUnityに取り込めば再生できた 参考https//github.com/vrmc/UniVRM/releases UniVRMというパッケージを使用してVRMをHumanoidにする Assetsに取り込んで、MigrateToVrm1を押すだけでできる それっぽい攻撃をしてポーズをとってくれるカッコいい系のanimationファイル というのを拾ってきてvrmに適用に適用 プレビュー画面 実際にモデルに反映させたいがわからない... ↓ animationcontrollerを使う Animatorタブでコントローラーを指定したら動いた BVHをanimatoinclipにしてくれるUniVRMを使う ↓ モーションが消えてしまっている 原因互換性のないBVHだった( 実線丸が必須のボーン mocopiでのボーン名UniVRM(Humanoid)のボーン名(は任意) rootHips torso_1Spine torso_4Chest torso_7UpperChest neck_1Neck headHead l_shoulderLeftShoulder l_up_armLeftUpperArm l_low_armLeftLowerArm l_handLeftHand r_shoulderRightShoulder r_up_armRightUpperArm r_low_armRightLowerArm r_handRightHand l_up_legLeftUpperLeg l_low_legLeftLowerLeg l_footLeftFoot l_toesLeftToes r_up_legRightUpperLeg r_low_legRightLowerLeg r_footRightFoot r_toesRightToes 手動で置き換えてみたが動かなかった。 テストで使われているBVHを使ってみたがダメだった。 MusclePowerが全て0(デフォルト)の状態 Blenderを経由する必要があるのは面倒だけど物は試しとしてやってみる( ダメだった 原因RigのAnimationTypeをHumanoidに変更していなかった 動いた 初期位置を変更することもできた bvhからfbxへの変換が面倒だったので、Automatorで自動化した 体全体の位置が動いていない ぺこらモデルはツイスターゲームを再生するには問題があったので、 Unityちゃんで再生した(テクスチャがバグっている) ちゃんと屈んだり移動したりできていることは確認できた。 ブラウザで動かした時のように、BVHをパースしてモデルを動かすことができそう 腕を動かしてみた 「mocopiは長時間動くと狂う」 他のセンサと組み合わせて途中でキャリブレーションできないか 例) 歩いているとき、足が一定間隔で伸びると仮定すると 歩いているのに膝が最小でも30度曲がっている→ー30度して調整(適当) mocopiアプリとVRChat等の中間で処理を挟んで補正できたら嬉しいかも なし 先週、ぺこライブに行ったとき有明アリーナに落としてきた 特徴的な文字を書いておくと伝えやすくておすすめです

2023年12月19日

梶研 [mocopi センシング の環境を整える]

梶研 [mocopi センシング の環境を整える]

3年セミナー:??% []mocopiでセンシング(~12月) [x]mocopixUnity [x]色んな動作をとる [x]誤差を計測(簡易) [x]動作をグラフ化 [x]bvhをパースするパッケージを作る [x]csvに書き出せるアプリを作る [x]複数人の絡みを取ってみる [x]ブラウザで動作を確認できるようにする(gLTF形式の理解) []Unityで複数人の動作を可視化できるパッケージを作る PDRやりたい(1月~) ブルーシートばたばたの使い道を考える ライブセンシングの使い道を考える mocopiで研究するときの環境を整えたい. [x]BVHをPythonで扱いやすいように [x]ブラウザで動作を確認できるようにする(gLTF形式の理解) []Unityで動作を確認できるようにする 初期位置・向きが指定できない Unityで再生するとき、Blenderでfbxに変換する必要がある 複数人のBVHを扱えない BVHは度数法,gLTFは弧度法を使っている X軸回転とZ軸回転は反対方向になる 体全体(ROOT)のX回転は+180度する 複数再生はできるが、場合によっては時間がずれる カメラ移動が扱いずらい ブラウザで動かすことが目標ではなく、 BVHからgLTF形式のモデルを動かすことはできたため、Unityでの可視化を進める ※温かかったです OP らららラビット 最強女神ウーサペコラ サインはB トーク(Twitterの話題まで) ED アンコール いいわけバニー 君の知らない物語 お手紙 兎座ストーリー

2023年12月12日

梶研 [mocopi センシング の環境を整える]

梶研 [mocopi センシング の環境を整える]

3年セミナー:??% []mocopiでセンシング [x]mocopixUnity [x]色んな動作をとる [x]誤差を計測(簡易) [x]動作をグラフ化 [x]bvhをパースするパッケージを作る [x]csvに書き出せるアプリを作る [x]複数人の絡みを取ってみる []複数人の動作を可視化できるアプリを作る []Unityで複数人の動作を可視化できるパッケージを作る []研究をしたい []テーマを考える []研究する []論文を書く []発表する 1月~研究 12月WiNF2024 mocopiとgLTFの関節と回転の対応が分からない →一部分だけ動かす 1.右足を前にあげる 1.右足を左にあげる 1.右膝を曲げて上にあげる 1.足をつけたまま回転する タイムスタンプ取れば良かった r_up_leg足の付け根の回転 r_low_leg膝の回転 真上から見て 前へXrotation(負) 右へZrotation(負) 右回転Yrotation(負) r_foot足の付け根の回転 不明 r_toes足の付け根の回転 不明 いい写真は撮れませんでした. 楽しめなかったので、良いセンシングできませんでした. (ずっと手叩いてただけ) 明日もライブに行くので、今度こそセンシングしたい. 梶研でライブを見るために、DVDプレイヤーを買った.

2023年12月5日

サークルwebサイト

サークルwebサイト

シス研のサイトを制作しました! フロント Next14.0(AppRouter) PandaCSS ホスティングサービス GitHubPages CI/CDサービス GitHubActions CMS esa.io あるとき言われました。 mkn先輩「welcome.sysken.netを作り直してくれない?HUGOとかで簡単にでいいからさ」 僕「いいですよ」 このサイトを制作し始めたきっかけは多分これでした。 今まではGoogleサイトとか言うものを使っていたらしいです。入学前にこれを見た僕は味気の無さを感じました。なんというかこのサイト息してる?一度作って放置したみたいな... こうして僕は制作を開始しました。 実はこの計画2度目でその時はデザイナーが居たりしました。しかし僕は作りたいサイトを作る人。デザインから自分で考えることにしました。 といいつつもデザインでこだわったポイントはありません。 強いて言うならWebAPIを使いたいばかりに付けたMacのメニューバー風ヘッダー。細くねと何度も言われたが貫き通しました。 このサイトでは最近(2023年11月時点)で最新のNext14(AppRouter)を使用し、SSGとして運用しています。SSGとしたのは頻繁に更新されるわけでもなく、Vercel等だけでなくとも簡単にデプロイできるためです。 このサイトのポイントはコンテンツのほとんどをesaから管理できる点です。投稿や制作物の追加はもちろん、各ページの内容、ナビゲーションバーの並び順、そしてページの追加・削除まで行えます。 逆にできないことはトップページの画像とフッターのシスキャットくらいです。これによりwebフロントが出来ない人でも管理することができます。 そしてこのサイトを制作する上で欠かせない信念があります。 「個人の管理下に置くのは許されない」 esaをCMSとしていますが、Markdownファイルはもちろん、esaにアップロードされた画像も全てダウンロードしGitHubで管理するようにしています。これによりシス研の歴史が失われることなく、リポジトリがある限り残り続けるようになります。シス研にオンプレサーバがあるのにGitHubPagesを使用したのはこの意図によるものです。 ここでひとつ問題がありました。 esaに画像をアップロードした場合、esa上で保存されておりGitHubに追加されたマークダウンにはesaのURLが貼られているだけです。更には自分のサイト用に書いた記事をコピペする輩もいました。 これではその人の気分次第でドメインを変えたり削除した場合には画像が見つからなくなってしまいます。 そこで私はビルド前にマークダウンを走査し、画像を見つけた場合には全てリポジトリに追加するようにしました。これにより画像等を個人の管理の下から解放することに成功しました。 こうしてこのサイトはLighthouseというwebサイトの質を測定するツールを使用したところ、とても高い評価を得られました。パフォーマンスが低い原因は投稿に画像を投げる部員のせいが9割なので諦めます。ユーザー補助はaタグのコントラストのせい。面倒。 ついにはGoogleで「シス研」と検索すると2番目、「システム工学研究会」では1番目に表示されるようになりました!! このサイトを制作する前にも同じレイアウトのものをPagesRouterで作っていたりしました。しかしアーキテクチャやコンポーネントの分け方、ブランチの運用方法などが気に入らず1から作り直しました。 SSGはAppRouterの特長であるSSRを殺してしまうため相性が悪いと思っていました。しかし実際に全く同じサイトを両方で作ってみたところ圧倒的にAppRouterの方が良かったです。 やはり物は試してみると良いと実感でき、自分の満足いく開発ができて嬉しいです。 気が向いたら技術的なことも書きたいと思います。では🐧ノ

2023年12月1日

1
1234
4