#author("2025-06-18T14:22:39+09:00","default:kouzouken","kouzouken")
#author("2025-06-18T17:00:04+09:00","default:kouzouken","kouzouken")
&aname(Top);
#contents

*卒論 [#v045a40a]

**4月 [#j417c400]
***4/23 [#j417c423]
卒論テーマが決まった。
 耐候性鋼橋の耐候性鋼材の錆の現地調査(今年度から)(日本鉄鋼連盟、土木研究センター、東北の大学や高専の土木構造系研究室の共同研究)に参加しながら、撮影データに対して機械学習(AI)を用いた外観評価を行う。最終的にドローンで撮影した耐候性鋼橋の画像データに対して外観評点を行う方法も検討する(特定の距離や照明で撮影するといった制御ができるか)。

-jpg, ppmファイルから1点ごとのRGB値を確認する方法
--1,写真フィルを選択して"gimpで開く"をクリックする。
--2,gimpが開けたら上にあるバーから "ウィンドウ" → "ドッキング可能なダイアログ" → "ピクセル情報" と進んでいくと要素ごとにRGB値を確認できる。

-MATE端末のコマンド
--1, locate (ファイル名等) → (ファイル名)がどこにあるのかリストアップしてくれる
--2, gfortran -o (ファイル名) (ファイル名.拡張子) → あるファイルを変換する(gfortran -o)
--3, history → MATE端末内で過去にどんなコマンドを用いたか確認できる。
--4, hg (ファイル名等) → MATE端末内でどの部分に(ファイル名)が用いられているかを確認できる。(検索エンジン内での Ctrl + Fキー のようなもの)

-明日までにやっておくべきこと
 --佐藤さんの卒論日誌をはじめ耐候性鋼材にまつわるウィキを読んで分からなかった部分をリストアップする。ただ何が分かっていないか分からない 来週のゼミ報告に向けてなにか目標をたてなければ

***4/24 [#j417c424]
-これからしばらくはpythonになれることが必要 Python上で佐藤さんが作成したプログラムが正常に動作するか確認

-【質問内容】
--最初に取り組むべきステップは何か?
機械学習を使うにはどんなデータ整理や前処理が必要かがわかっていない。例えば、「画像をどう分類するか」「どんなラベルをつければいいか」など、考えるべきことを教えていただけるとありがたいです。

--過去の先輩方の研究でどの部分を参考にするのがよいか?
佐藤卒論日誌やRGBメモの中で、現在の作業と関連が深い部分があれば教えていただきたい。

--MATE端末からpythonを開くには → python と入力すれば入ることができる
--MATE端末から1つ上のディレクトリに上がりたい(戻りたい)場合 → cd .. と打つ (cdとコンマの間には半角スペースをいれること)

-python上で ホーム / hikitugi 内に保存された.pyファイルを動かすためには
--MATE端末にもどり( python の状態から脱出する) "python ファイル名.py" と打つと実行することができる。
--hikitugi内には RGBrironti.py , edge.py , henkan.py , matrix.py , svm.py の計5つのpyファイルがあった。それぞれ何を入力したら先に進むのか考えていく

-RGBrironti.py について (コマンド)
--1, MATE端末を開き py ファイルのある hikitugi に移動する (cd hikitugi)
--2, py ファイルを呼び出す (python3 RGByomitori.py) [3は ver のことであり入力しなくても呼び出せる]
--3, フォルダーのパス入力が求められるので錆の写真があるフォルダーを入力する → Enterキー  (一例: /home/kouzou/sato24/gr/data/1_ppm)
--4, 保存するファイル名を入力する → Enterキー (一例: RGBsyuturyoku0423 )
--5, その後ウィンドウのどこかしらに錆の画像が表示されるので、その写真のどこか適当な所をクリックするとMATE端末上に
 画像: ファイル名(.ppm) | クリック位置: (x座標, y座標), RGB値: (R(0~255), G(0~255), B(0~255),)
と表示される。またフォルダーパスの入力をしたファイル内に4で保存したファイルが保存されている(今回はhome/kouzou/sato24/gr/data/1_ppm に RGBsyuturyoku0423 というの文書ファイルが保存されている)
--6, 文書ファイルを開くと写真のようにMATE端末に表示されているのと同じ情報が文書ファイル内に保存される。

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250424-1.png,1000x);

--7, 写真の左下に写っている錆の写真は矢印キー(←, →)でフォルダー内の写真を切り替えることができる。
--補足:保存するファイル名を前に作成したファイル名と同じにすると新たに上書きされるのではなく、既存のデータに加えられる形で保存される。


-edge.py について(コマンド)
--1, MATE端末を開き py ファイルのある hikitugi に移動する (cd hikitugi)
--2, py ファイルを呼び出す (python3 edge.py) [3は ver のことであり入力しなくても呼び出せる]
--3, 入力ディレクトリパスの入力が求められる。なお edge.py はpgmファイルのみ対応しているのでpgmファイルで保存されていいる写真のあるフォルダーを入力する → Enterキー (一例: /home/kouzou/sato24/soturon/resize_pgm/k_data_ppm_resize/r1_pgm)
--4, 出力ディレクトリパスの入力が求められる。ここでは3で入力したファイルをエッジ処理したものをどこに保存するかを設定する。ここでは一例として(/home/kouzou/edge-syuturyoku0424)と入力しておく。
---/edge-syuturyoku0424はエッジ処理したものを入れておくファイル名であり、もしファイル名を入れずにEnterキーを押してしまうとこの場合kouzouのフォルダー内に保存されてしまうので注意すること。
--5, エッジ処理の閾値1, 2を入力してくださいと表示される
---エッジ処理の閾値1は "Cannyエッジ検出の「低い方のしきい値」" のことである。画像の中で「ここはエッジ」と判断するための数値で、5〜100くらいに設定しておくとよい。
---エッジ処理の閾値2は "Cannyエッジ検出の「高い方のしきい値」" であり、150〜200くらい に設定しておくとよい。
--6, 閾値1, 2 を入力して Enterキー を押してしばらくするとkouzouにedge-syuturyoku0424というフォルダーが作成される。そのフォルダーを開いて錆の写真が左下から右下のような感じに変換されていれば成功。

http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250424-2.png → http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250424-3.png

-明日までにやっておくべきこと
 --残りのPythonファイルについて使い方を学ぶ


***4/25 [#j417c425]

-svm.py について (コマンド)
--0, はじめに
--- svm = "s"upport-"v"ector-"m"achine のこと
--1, py ファイルを呼び出す前に svm.py ファイルを開く

--2, ファイルを開いたら13行目に書いてある data_dir = 〜 の部分を確認する
---デフォルトでは data_dir = "edge/250_300_edge" となっていると思う。基本的にこのsvm.pyと15行目に書いてあるフォルダー(の中身 = "mk1_pgm" , "mk2_pgm" , ...)は下の写真のように同じ階層で保存しておく必要がある。

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250425-1.png,600x);

この写真の場合 "mk1_pgm"等が入っている1番左にある "250_300_edge" フォルダーと1番右にある "svm-kaizou.py" が同じ階層にある。

-henkan.py について (コマンド)
--1, MATE端末を開き py ファイルのある hikitugi に移動する (cd hikitugi)
--2, py ファイルを呼び出す (python3 henkan.py) [3は ver のことであり入力しなくても呼び出せる]
--3, 変換行列ファイルのパスを入力してください と表示されるので入力する(一例: /home/kouzou/sato24/gr/henkanm/1_henkanm/m_rating1_1.txt ) → Enterキー
--- 変換行列ファイルは3 ☓ 3行列の .txtファイルで表されており、/home/kouzou/sato24/gr/henkanm にある。
---henkanm内にある 1_henkanm ~ 4_henkanmの .txt の名前と /home/kouzou/sato24/gr/data にある各ファイル[1_ppm~4_ppm]の .ppmの名前と対応している。

--4, 補正したいPPM画像のパスを入力してください と表示されるのでppm画像のパス入力する。(例: /home/kouzou/sato24/gr/data/hg_k2_5_5.ppm) → Enterキー
---基本的に/home/kouzou/sato24/gr/data内にある ○_ppm や hg_○_ppm と書かれたファイルから選択するはず (例: /home/kouzou/sato24/gr/data/1_ppm/rating1_1.ppm)

--5, 補正後の画像を保存するパスを入力してください と表示されるので変換後のppm画像をどのパスに保存したいか入力する (例: /home/kouzou/henkan-after.ppm と入力するとkouzouのフォルダー内に henkan-after というppmファイルが保存される) → Enterキー

 ---変換行列ファイルはかなり細かい値まで書かれているためなぜそのような値に設定したのか一度聞いてみる必要がありそう

-matrix.py について (コマンド)
--0, はじめに
 このpythonファイルは henkan.py で必要になる変換行列ファイルを作り出すためのものであり、henkan.pyよりも先にやっておく必要がある。
--1, MATE端末を開き py ファイルのある hikitugi に移動する (cd hikitugi)
--2, py ファイルを呼び出す (python3 matrix.py) → Enterキー
--3, 結果を書き込むファイルを入力してください と表示されるので入力する。ここでは保存する場所に加えて結果ファイルの名前も”名前 + .txt ”と入力する必要がある。(例: /home/kouzou/matrix-kekka.txt) → Enterキー
--4, シアン・イエロー・マゼンタの各RGB値を入力してください と表示されるので入力する。(0~255 の間)

 ---各RGB値を入力するにあたりなにか根拠となるものがあるはず(ppm画像とか) → 探しておく必要がある

-来週中にやること
--サポートベクターマシーン(優先)と畳込みニューラルネットワークについて調べる
--このページをまとめる(5つのpythonファイルをどういう順序で使っていくのか示す)
--佐藤さんへの質問をまとめておく


***4/28 [#j417c428]
-5つあるpythonファイルの使い方についてとそれぞれの役割
-錆の写真を撮影してそれをサポートベクターマシンを用いるまでの手順を知りたい
-SVMについて
-佐藤さんが研究していたファイル達(sato2024)は各フォルダーごとにどんな意味を持っているのか。

-佐藤さんから錆の写真からサポートベクターマシンを用いて用いて機械学習を行うまでの流れを教えて頂いた。
--耐候性鋼材のページに上記の事について詳しくまとめてある。
--機械学習のページは何か発見があったら随時更新していく必要あり。

-来週までにやること
--畳み込みニューラルネットワークについて調べる
--佐藤さんのファイル内にある手書き数字を使って機械学習
--それに加え動物の顔(一例)が判別できるかについても機械学習を行う。

***4/30 (手書き数字の判別) [#j417c430]
-畳込みニューラルネットワークを用いて手書き数字の機械学習
--手書き文字の機械学習は mnist という手書き数字を認識するために用いられる画像データセットで行った。
--1, MATE端末で "pip install tensorflow" と入力しEnterキーを押す。
--2, エラーが出なかったらmnistの画像データをCNNに読み込ませるのと同時にmnist_model.h5ファイルを保存するスクリプトを書いて実行する。(/home/kouzou/Morii25/hikitugi 内にある mnist.py)
 Pythonコード
--3, しばらくすると正答率が表示される。だいたい99%前後の正答率が得られると思う。畳み込みとプーリング層を2層にした時点で100%に近い正答率が得られているため、これらの層を多くしてもさらに100%に正答率が近づくことはないだろう。

-ある手書き文字を読み込ませて判別させる
--1, mnist等から28×28ピクセルで書いた数字のpngやjpgファイルを持ってきて以下のPythonコードを書く。ただしmnistに保存されているファイルは28×28ピクセルしかないため基本的にそれらの画像を拡張する方法を取らない限りPythonコードは28×28で書いておいたほうが良さそう。(/home/kouzou/Morii25/hikitugi 内にある suuji-hanbetsu.py)
 Pythonコード
--2, Enterキーを押せば判別してもらえる。

-複数枚の手書き文字を一度に判別させたい場合
--1, 複数枚ある手書き数字をどこか1つのフォルダーにまとめておき、以下のスクリプトを書いて実行する。(/home/kouzou/Morii25/hikitugi 内にある Hukusuu-hanbetsu.py)
--2, Enterキーを押せば一度に複数枚判別してもらえる。
 Pythonコード
---11行目で予め画像を保存していたフォルダー名を入力する
---12行目で画像ファイル形式を入力する

---7と書いた画像(右の写真)を読み込ませたところ0と出力されてしまった。もう少しピクセルの大きさを大きくする必要がありそう。
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/Slide7.png,150x);

-畳込みニューラルネットワーク(CNN)について
--特に画像認識や画像分類で優れた性能を発揮するディープニューラルネットワークの一種である。ディープニューラルネットワークとは通常のニューラルネットワークは層の数が3なのに対し、さらに畳込み層やプーリング層等多くの層から構成されているため層の深さによって"ディープ"がつくかどうか決まる。

-層の用語について
--畳み込み層 … 画像におけるエッジや色の変化といった局所的な特徴を抽出することで、空間構造を把握しながら高度な特徴の抽出が可能となる。
--プーリング層 … 画像の特徴と位置を紐付けてしまうとCNNの場合同じ特徴が画像の別の部分に現れたとしてもそれを抽出することができない。なので特徴から位置情報を削ぎ落とすことで畳み込み層で抽出された特徴が他の画像内のどこに移動(上下・左右)としても影響を受けないようにする。
--全結合層 … 畳み込み層・プーリング層で抽出された特徴から最終的にクラスの分類や予測を行う層のこと。


,手順 ,実行内容
,1,画像を入力する(ピクセルで) 
,2,畳み込み層で画像の特徴を検出する
,3,プーリング層で重要な情報を抽出する
,4,2と3を繰り返す
,5,全結合層で画像の特徴をもとに分類を行う
,6,出力する

-CNNとSVMの違いについて

, 比較項目 , SVM , CNN 
, モデル , すでに用意された特徴(数値)をもとにクラス分けする数式モデル ,画像の中から特徴を自動で学習して分類まで行うニューラルネットワーク
, 入力 , 数値データ (特徴量ベクトル) → 画像を数値に変換する必要あり ,生の画像そのまま(ピクセルデータ)
, 特徴の抽出方法 , 手動(人があらかじめ決めた特徴) ,自動(エッジ・色・形などを学習)
, モデル構造 , 数学的な式(境界面) ,多層のニューラルネットワーク
, 適用例 , 小規模なデータで分類(例:文字分類、小さな画像) ,大規模な画像分類・認識(例:顔認識、医療画像、サビ分類など)
, 学習の難易度 , 比較的簡単(実装も軽い) ,やや難しい(GPUや深層学習の知識が必要)
, 処理速度 , 小規模なら早い ,訓練に時間がかかる(推論は速い)

--SVM → 与えられた特徴を元に最適な境界線で分類する方法。この方法は手軽だが特徴量の選び方次第
--CNN → 画像の中から重要な特徴を自分で見つけて分類してくれる方法。学習に時間がかかるが精度が高く応用範囲が広い


**5月 [#j417c500]

***5/2 [#j417c502]
-手書き数字の機械学習(CNN, 判別)について
--mnistのテストデータに入っている数字を判別させたところ正答率が100%であったのに対し、mnistには保存されていない数字ファイルを判別させたところ正答率は67%となった。
--mnist以外の数字画像はまだ正確に判別できているとはいえず、これから判別制度の向上と様々な数字画像を学習させていく必要がありそう。
--また mnist.py または mnist-hosei.py を何度もMATE端末上で動かしてmy_mnist_model.h5ファイルを更新し続けると前のモデルにさらに学習を重ねることでモデルが過剰に記憶し汎化性能(正答率)が落ちてしまう(これを過学習と呼ぶ)。なので定期的にmy_mnist_model.h5ファイルを削除して更新する必要がある。または2つのPythonファイルで保存場所を変えるのも良いのではないか。

-mnistの画像を少し補正
--今までは画像の中心に数字を書いて機械学習を行ってきたが、home/kouzou/Morii25/hikitugi 内にある mnist-hosei.py ファイルでは画像の見た目を変えるため 回転・移動・拡大・変形 を行って機械学習させた。その結果以前よりも精度は上がった。

,学習方法 ,テストデータ正答率(%) ,判別精度(%)
,そのままの状態で画像を学習 ,99.14 ,44 (4/9)
,画像を回転・移動・拡大・変形させて学習 ,98.49 ,67 (6/9)

-エポック数を増やして学習させてみた

---そのままの状態で画像を学習させた時
,エポック数 ,テストデータ正答率(%) ,判別精度(%)
,10 ,99.20 ,67 (6/9)
,12 ,99.13 ,56 (5/9)
,13 ,99.26 ,89 (8/9)
,14 ,99.19 ,89 (8/9)
,15 ,99.16 ,89 (8/9)
,16 ,99.08 ,89 (8/9)

--エポック数が13を超えると判別精度が向上したがmnistにはない数字の画像を判別させると4の画像だけどうしても4と認識されない。エポック数によって4の画像のときだけ"1"や"9"と認識されてしまう。
--4の画像を識別させたときにどれくらいの確率でどの数字であるかをPythonで作成してみるのも1つの手かも

---画像を回転・移動・拡大・変形させて学習させた時
,エポック数 ,テストデータ正答率(%) ,判別精度(%)
,10 ,95.47 ,56 (5/9)
,12 ,87.01 ,56 (5/9)
,13 ,90.55 ,56 (5/9)
,14 ,96.15 ,56 (5/9)
,15 ,86.66 ,56 (5/9)
,16 ,74.12 ,56 (5/9)

--エポック数の大小に関わらず判別精度は変化せず、特に5, 7, 9の画像が"3"と認識されてしまった。これだけで比べるとテストデータ正答率, 判別精度ともにそのままの状態で画像を学習させた時の方が良い判別結果が得られそうだ。

-来週にやること
--GW中に手書き数字の機械学習は終わらせたい
---自身で手書き数字を書いてみてそれがどのくらいの精度であるか確かめる
--動物の顔(仮)が機械学習を通じて判別できるようになるスクリプトを書き始める
---とりあえず多くの動物の顔の写真が載っているサイトを探す。


***5/7 [#j417c507]
-MNISTについて
--MNISTを用いた手書き文字の画像判別はどのサイト・ホームページ (MNIST 判別 正解率と検索すれば確認できる) を見ても9割以上、特にCNNで学習させた場合99%前後まで精度が向上する。
--限りなく100%の正解率に持っていく手法はあるだろうが正解率100%になることはない。

-手書き数字の機械学習 (続き)
--とりあえず自身で作成した手書き数字を機械学習に判別させてみた

,数字 ,モデル数 ,正答率
,0 ,3 ,3/3
,1 ,5 ,5/5
,2 ,6 ,6/6
,3 ,6 ,6/6
,4 ,2 ,2/2
,5 ,10 ,9/10
,6 ,2 ,1/2
,7 ,3 ,2/3
,8 ,2 ,1/2
,9 ,13 ,9/13

本来は各数字のモデル数が揃っていることが望ましいが、こちらの諸事情により用意することができなかった。モデル数が 2 や 3 としかない部分は正確さに欠ける所があるが、1 ~ 3 はかなり正確性があると言って良いのではないか。特に 9 は 7 と間違えて識別するケースが多く見受けられた。


-来週までにやること
--手書き数字の画像に点や線、枠を入れても正確に判別できるのか
--自動的に画像内のどこか適当なところに点や図形を自動的に入れることができるプログラムを組む
--動物の顔を使った機械学習(できたら)

--自分の研究についてスライドを3枚程度作成する

-明日にやること
--数字に点や線, 図形を加えた結果の表を作成
--使用した画像を載せる
--色を白ではなく他の色にするとどうなるか (エラーを吐き出される可能性あり)


***5/8, 9 [#j417c508]
-画像に数字に点や線, 図形を加えてみた。これを判別してみる

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/0_0.png,150x); ー画像加工→
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/modified_0_0.png,150x);

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/5_0.png,150x); ー画像加工→
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/modified_5_0.png,150x);

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/7_2.png,150x); ー画像加工→
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/modified_7_2.png,150x);

 Pythonコード (Gazou-Kakou.py)


-5/7の続き
-- 0 ~ 9 の画像数をそれぞれ9枚に統一させた。表の真ん中の列は画像に何も加工せず数字ごとにおける正答率を表したものである。(上の画像の右側)
--表の右側の列は数字に点や線, 図形のすべてを画像に加え数字ごとにおける正答率を表したものである。(上の画像の左側)(Gazou-Kakou.py を使用)
,数字 ,正答率 ,正答率
,0 ,9/9 ,9/9
,1 ,8/9 ,1/9
,2 ,9/9 ,6/9
,3 ,9/9 ,6/9
,4 ,9/9 ,0/9
,5 ,9/9 ,5/9
,6 ,5/9 ,2/9
,7 ,8/9 ,4/9
,8 ,6/9 ,6/9
,9 ,6/9 ,0/9

---数字は太くはっきり書いてあること且つ線や図形と被っていなければ判別することはできそう
---ただ要素を加えすぎたせいか無加工と比べてかなり判別精度が低下してしまっている。なのでこれから点, 線, 図形のうちどれか1つか2つの要素だけを画像に取り込んでみて精度がどう変化するのか見ていく。

-改良版
--画像を10枚に統一させてフォントを太くした。以下の表はその画像に何も加工せず数字ごとにおける正答率を表したものである。(KGPrimaryPenmanship.ttfとSuuji-Gazou-Seisei.py を使用)

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/0_100.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/5_100.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/7_100.png,150x);

,数字 ,正答率
,0 ,10/10
,1 ,10/10
,2 ,10/10
,3 ,10/10
,4 ,10/10
,5 ,10/10
,6 ,10/10
,7 ,10/10
,8 ,10/10
,9 ,10/10

--数字を中心に持ってきたからなのかまたはほとんど形が変わらないからなのか、それともその両方なのか分からないが全て正確に判別することができた。

--次に点, 線, 図形のうち1つの要素だけを画像に加え数字ごとにおける正答率を表にしたものである。左の表から順に点, 線, 図形のみを加えた。

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/0_101.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/5_101.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/7_101.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/0-8.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/5-8.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/7-2.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/0_201.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/5_201.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/7_201.png,150x);
,数字 ,点 正答率 ,線 正答率 ,図形 正答率(リスタート前) ,図形 正答率(リスタート後)
,0 ,10/10 ,9/10  ,8/10  ,10/10
,1 ,10/10 ,4/10  ,5/10  ,6/10
,2 ,10/10 ,9/10  ,8/10  ,10/10
,3 ,10/10 ,7/10  ,9/10  ,10/10
,4 ,10/10 ,9/10  ,8/10  ,8/10
,5 ,10/10 ,9/10  ,10/10 ,10/10
,6 ,8/10  ,3/10  ,1/10  ,3/10
,7 ,10/10 ,7/10  ,7/10  ,8/10
,8 ,10/10 ,10/10 ,10/10 ,10/10
,9 ,10/10 ,7/10  ,7/10  ,6/10

--点は1画像あたり50個加えた(Gazou-Kakou-Ten_only.py を使用)
 Pythonコード (Gazou-Kakou-Ten_only.py)
--線は1画像あたり5本加えた(Gazou-Kakou-Sen_only.py を使用)
 Pythonコード (Gazou-Kakou-Sen_only.py)
--図形は1画像あたり三角形から十角形までの多角形を1〜3個ランダムに設置した。図形のリスタート前・後とは過学習状態をリセットした前後の時を指す。(Gazou-Kakou-Zukei_only.py を使用)
 Pythonコード (Gazou-Kakou-Zukei_only.py)

-判別させたい手書き文字を作成するには
--① GIMPで直接書きたい場合 (推奨)
---1, GIMPを開く
---2, 上のツールバーから ファイル → 新しい画像 の順にクリックする。そうするとピクセルのサイズを指定できるので両方に28と記入する。
---3, 左側に下のようなアイコンが現れたと思うがこれは背景色と描画色を表しており、右下の色アイコンが背景色, 左上が描画色である。それぞれクリックすると自身で色を選択できるようになり、基本的に背景色は黒, 描画色は白に 描画ツールは鉛筆に設定する。(壁画ツールは上のツールバーから "ツール → 描画ツール → 鉛筆で描画" で設定できる)

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/aikon.png,150x);

---4, アイコンの下にはサイズ, 縦横比, 角度, .... と大きさや強弱を設定できるパラメータが縦に並んでおり、サイズは必ず1.00(ピクセル)に設定しておくこと。そうしないと上手く文字を書くことができなくなる。
---5, 文字を書き直したいときはアイコンの上にある消しゴムを使って文字を消すことができる。
---6, 書き終えたら保存し、その際にどこに保存するかを指定する。続けて文字を書きたい場合は上のツールバーから ファイル → 新しい画像 の順に選択
---7, 保存はxcfファイルでされるため一度pngに変換する必要があるため変換してから判別してもらうようにする。
---※スクリプトでxcfファイルを直接判別してもらえるような文言を書いてみてもいいかも

--② AIに書かせる場合 (ChatGPT)
--1, ChatGPTに"黒背景に白の線で 0 ~ 9 の数字を各5枚、合計50枚の手書き数字を書いてください” という旨のメッセージを送る。
--2, 画像が作成されるまで1, 2時間かかる場合があるためその間は待機 (この時間がもったいないため非推奨)
--3, 生成された画像は複数の文字(数字)が1枚の画像となって出力されるのでこれをGIMPで分割させる。詳しくは機械学習のWikiページを参照 (https://www.str.ce.akita-u.ac.jp/cgi-bin/pukiwiki/?%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92)
--4, 分割できたら各画像を保存 → png に変換 → 28×28ピクセルに変換


***5/10 [#j417c510]
-画像に点, 線, 図形をそれぞれ加えたときの正答率について

--点を加えたときに関してはかなり精度の高い判別ができたのではないかと思う。加工した後の画像を見るともう少し点の数を増やしてみても判別精度は維持できそうだ。
--線を加えると判別精度は点の時と比較してやや劣るが、その中でも"6"における精度の劣り方が良くない。ランダムに5本の線を引くようにプログラムしているので、再び画像に加工処理を行って判別させると精度は変化するのだろうか。下にある7に線を引いた画像を見てもらえると分かるがこれは文字の太さから辛うじて"7"と認識できる。機械でこの画像を"7"と判別させるにはやはりMNISTのデータ量以上の数字データが欲しい。
--最後に図形を加えた場合数字によって精度のばらつきがある。特に"1", "6", "9"は他の数字と比較して精度が低く、1の場合周囲に6角形以上の多角形が加わると"6", "8", "9"のように見えてしまい精度に影響が出たのではないか。"6"と"9"も同様で数字に重なるように図形が描かれることで"8"と判別されてしまったのではないか。また図形同士が上下に描かれることで"8"と認識される場合もありそうだ。

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/6_201.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/9_201.png,150x);

-次回やること
--MNISTで学習させてからある数字の画像を何と判別したかをフルオート化できるようなスクリプトを組みたい
  →大まかな内容は完了しこれから肉付け(5/11)
--動物の顔を使った機械学習(できたら)


***5/12 [#j417c512]
-とりあえずmnistで学習させた後 "判別したい画像を1つのフォルダーにまとめて画像加工, 判別(○ or ×), 数字ごとの判別率" までの " " で囲った一連の作業を全自動で行えるようにスクリプトを組んだ。画像加工については大きく分けて点, 線, 図形の3種類があり加工の有無(画像に入れるかどうか)と数を任意に設定できるようになっている。
-全自動スクリプトにmnistで学習させる作業を入れなかった理由としては常に新しい h5 ファイルを取り入れたいためである。Python上で何度もMnistファイルを実行してしまうと過学習が発生してしまい判別率が低下してしまうことがある。

 Pythonスクリプト (Hanbetsu-Full_auto.py)

-上記のスクリプトを実行すると "既存の画像を加工したフォルダー" と "判別結果のテキストファイル" が保存されていると思う。
--テキストファイルの中身
,0_7.png 予測: 0 正解: 0 一致: 〇
,1_5.png 予測: 8 正解: 1 一致: ×
,3_5.png 予測: 3 正解: 3 一致: 〇
,8_2.png 予測: 8 正解: 8 一致: 〇
,…
,--- 数字ごとの正答率 ---
,0: 正解 ○ / □ 枚 → 正答率 △ %
,1: 正解 △ / ○ 枚 → 正答率 □ %
, …

--以下の表は全自動スクリプトを3回用いて判別させた数字ごとの正答率である。(その都度mnistのh5ファイルは新しくしている)
,数字  ,正答率  ,正解率  ,-正答率-  ,-正解率-  ,--正答率--  ,--正解率-- 
,0 ,10/10 ,100.00%         ,10/10 ,100.00%          ,10/10 ,100.00%
,1 ,0/10 ,0.00%                ,8/10 ,80.00%                ,5/10 ,50.00%
,2 ,10/10 ,100.00%         ,5/10 ,50.00%                ,10/10 ,100.00%
,3 ,10/10 ,100.00%         ,10/10 ,100.00%            ,10/10 ,100.00%
,4 ,6/10 ,60.00%              ,4/10 ,40.00%                 ,5/10 ,50.00%
,5 ,10/10 ,100.00%         ,10/10 ,100.00%            ,10/10 ,100.00%
,6 ,0/10 ,0.00%                ,0/10 ,0.00%                    ,3/10 ,30.00%
,7 ,10/10 ,100.00%         ,1/10 ,10.00%                 ,9/10 ,90.00%
,8 ,10/10 ,100.00%         ,10/10 ,100.00%            ,10/10 ,100.00%
,9 ,10/10 ,100.00%         ,10/10 ,100.00%            ,10/10 ,100.00%


 Pythonスクリプト (Mnist-Hanbetsu-Full_auto.py)

-上記のスクリプトで出来ること
--mnistの数字画像を用いて学習し、その結果をh5ファイルに保存。 (もし前回のh5ファイルが保存されていたら上書きするのではなく削除して新規作成するようにした)
--判別させたい数字画像に図形を加える等の加工をする。
--加工した画像を見られるように別のフォルダーを作成して保存
--加工した図形を判別させて合っていたか、また数字別の正解率をテキストファイルで表示。
--→判別させたい画像をフォルダーに入れておき Mnist-Hanbetsu-Full_auto.py を実行するだけで正解率まで表示されるようにした。

--以下の表は"シン"・全自動スクリプトを3回用いて判別させた数字ごとの正答率である。
,数字  ,正答率  ,正解率  ,-正答率-  ,-正解率-  ,--正答率--  ,--正解率--        
,0 ,10/10 ,100.00%       ,10/10  ,100.00%       ,10/10  ,100.00%
,1 ,0/10 ,0.00%               ,0/10  ,0.00%               ,2/10  ,20.00%
,2 ,8/10 ,80.00%            ,9/10  ,90.00%             ,10/10  ,100.00%
,3 ,10/10 ,100.00%        ,7/10  ,70.00%            ,8/10  ,80.00%
,4 ,8/10 ,80.00%             ,9/10  ,90.00%            ,1/10  ,10.00%
,5 ,10/10 ,100.00%        ,10/10  ,100.00%       ,10/10  ,100.00%
,6 ,1/10 ,10.00%             ,4/10  ,40.00%            ,0/10  ,0.00%
,7 ,2/10 ,20.00%             ,7/10  ,70.00%             ,2/10  ,20.00%
,8 ,10/10 ,100.00%        ,10/10  ,100.00%        ,1/10  ,10.00%
,9 ,10/10 ,100.00%        ,9/10  ,90.00%             ,10/10  ,100.00%

--3回とも正答率が100%である数字もあれば判別を1回行うごとに正答率の差が激しいものも存在する。特に"7"はその差が顕著に表れており、常に100%に近い正答率を得るには何か別のアプローチから試してみる必要がある。

-2種類の全自動スクリプトで判別に使用した画像(画像加工前)

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/0_100.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/5_100.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/7_100.png,150x);


 Pythonスクリプト (Mnist-Hanbetsu-Full_auto2.py)

-上記のスクリプトの違い
--mnistの中にある画像を加工して学習させた  (加工方法と内容は判別画像と同様) → 判別率を上げるため
--以下の表は Mnist-Hanbetsu-Full_auto2.py を用いて判別させた数字ごとの正答率である。

,数字  ,正答率  ,正解率  ,-正答率-  ,-正解率-  ,--正答率--  ,--正解率--      
,0 ,15/15  ,100.00%  ,15/15  ,100.00%  ,15/15  ,100.00%
,1 ,15/16  ,93.75%     ,15/16  ,93.75%    ,16/16  ,100.00%
,2 ,15/16  ,93.75%     ,16/16  ,100.00%  ,15/16  ,93.75%
,3 ,16/16  ,100.00%  ,16/16  ,100.00%   ,16/16  ,100.00%
,4 ,15/16  ,93.75%     ,15/16  ,93.75%     ,15/16  ,93.75%
,5 ,15/16  ,93.75%     ,15/16  ,93.75%     ,15/16  ,93.75%
,6 ,12/16  ,75.00%     ,6/16  ,37.50%       ,8/16  ,50.00%
,7 ,15/16  ,93.75%     ,14/16  ,87.50%     ,16/16  ,100.00%
,8 ,16/16  ,100.00%   ,15/16  ,93.75%     ,15/16  ,93.75%
,9 ,15/16  ,93.75%     ,16/16  ,100.00%   ,15/16  ,93.75%

--今までと比べて作業効率も識別の精度も上がっていると思う。mnistのデータ数でも十分学習できるのだが、やはりもっと多くの手書き数字の画像データが欲しい。→ Pythonスクリプトを考えているが手書き文字に寄せるところに難あり
--どのスクリプトを実行しても"6"も識別が上手くいかない。明日は判別させたいデータを全てmnistから無作為に抽出したものに置き換えてやってみる。(今までは手書きとは言えない画像データで判別させていた)

-明日やること
--日誌に画像を貼り付ける
--mnistから抽出したデータで判別させる
--明後日に向けて自身の研究内容を英語で書いておく


***5/13 [#j417c513]
-mnistから抽出したデータで判別
--判別する画像の対象を以下の画像に変更した。(今までよりも手書き感を出した)

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/0_0.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/5_0.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/7_2.png,150x);

--以下の表は全自動スクリプトを用いて判別させた数字ごとの正答率である。
,数字  ,正答率  ,正解率  ,正答率  ,正解率  ,正答率  ,正解率  ,正答率  ,正解率  ,正答率  ,正解率
,0 ,20/20 ,100.00%  ,20/20  ,100.00%  ,20/20  ,100.00%  ,20/20  ,100.00%  ,20/20  ,100.00%
,1 ,20/20 ,100.00%  ,20/20  ,100.00%  ,20/20  ,100.00%  ,20/20  ,100.00%  ,20/20  ,100.00%
,2 ,20/20 ,100.00%  ,20/20  ,100.00%  ,20/20  ,100.00%  ,20/20  ,100.00%  ,19/20  ,95.00%
,3 ,20/20 ,100.00%  ,20/20  ,100.00%  ,20/20  ,100.00%  ,20/20  ,100.00%  ,20/20  ,100.00%
,4 ,20/20 ,100.00%  ,20/20  ,100.00%  ,20/20  ,100.00%  ,20/20  ,100.00%  ,20/20  ,100.00%
,5 ,19/20 ,95.00%     ,20/20  ,100.00%  ,18/20  ,90.00%    ,20/20  ,100.00%  ,20/20  ,100.00%
,6 ,20/20 ,100.00%  ,20/20  ,100.00%  ,20/20  ,100.00%  ,20/20  ,100.00%  ,20/20  ,100.00%
,7 ,17/20 ,85.00%     ,20/20  ,100.00%  ,19/20  ,95.00%    ,19/20  ,95.00%     ,19/20  ,95.00%
,8 ,20/20 ,100.00%  ,20/20  ,100.00%  ,20/20  ,100.00%  ,20/20  ,100.00%  ,20/20  ,100.00%
,9 ,19/20 ,95.00%     ,18/20  ,90.00%    ,19/20  ,95.00%     ,18/20  ,90.00%    ,20/20  ,100.00%

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250513/20250513-1.png,600x);

--全体的に高い判別精度が得られ0〜4と 6, 8はすべての回で100%近い判別率を達成しており、画像処理を行ってから機械学習させるとより良い結果が得られることが分かった。一方で5, 7, 9は精度にばらつきが生じており、これは処理の影響が強く出てしまったことで形が似ている数字(例:7と1、9と4など)との誤認識が起きやすい状況が発生している。

--精度をさらに上げるためには
---ノイズの位置をランダムではなく重要領域を避けるように設計する。ここでは数字が書かれている部分のことを指す = 画像中央付近へのノイズを減らす
---Dropoutの実装 (過学習の防止とアンサンブル効果を得るため)
---混同行列を作成しどの数字が判別に弱いのかを確認する

-アンサンブル効果とは
個々の学習モデルにはそれぞれ異なる「誤り」や「予測の癖」を持っており、それらをうまく組み合わせることで単体のモデルよりも高い性能(精度向上, 過学習のリスク減少)を得られる効果のこと。

 Pythonスクリプト (Hanbetsu-Full_auto3.py) 

--画像中央付近への点の描画を減らした。

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250513/noised_1_0.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250513/noised_4_0.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250513/noised_9_0.png,150x); → 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250513/noised_1_1.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250513/noised_4_1.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250513/noised_9_1.png,150x);


--混同行列ををpng形式で表示・保存できるように設定した。
--以下の表はそのスクリプトを用いて判別させた数字ごとの正答率である。

,数字  ,正答率  ,正解率  ,正答率  ,正解率  ,正答率  ,正解率 
,0  ,20/20  ,100.00%         ,20/20  ,100.00%         ,20/20  ,100.00%
,1  ,20/20  ,100.00%         ,19/20  ,95.00%           ,19/20  ,95.00%
,2  ,20/20  ,100.00%         ,20/20  ,100.00%         ,19/20  ,95.00%
,3  ,20/20  ,100.00%         ,20/20  ,100.00%         ,20/20  ,100.00%
,4  ,20/20  ,100.00%         ,20/20  ,100.00%         ,20/20  ,100.00%
,5  ,20/20  ,100.00%         ,19/20  ,95.00%           ,19/20  ,95.00%
,6  ,20/20  ,100.00%         ,20/20  ,100.00%         ,20/20  ,100.00%
,7  ,19/20  ,95.00%            ,19/20  ,95.00%           ,20/20  ,100.00%
,8  ,20/20  ,100.00%         ,20/20  ,100.00%         ,20/20  ,100.00%
,9  ,20/20  ,100.00%         ,19/20  ,95.00%            ,20/20  ,100.00%

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250513/Figure_1.png,500x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250513/Figure_2.png,500x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250513/Figure_4.png,500x);

-上記の行列の見方
--縦軸は True Label (画像に書いてある実際の数字 = 答え), 横軸は Predicted Label (機械によって判別された数字) であり、濃い青で塗りつぶされている部分は実際に書いてある数字を機械が正確に判別できた数を表している。
--濃い青で塗りつぶされていない部分は機械が実際の数字とは異なる数字を判別した数を表している。
--1番右の Recall は数字別の判別率を表している。


***5/14 [#j417c514]
自身の研究内容について

研究テーマ : 耐候性鋼橋の耐候性鋼材の錆の現地調査に参加しながら、撮影データに対して機械学習(AI)を用いた外観評価を行う。最終的にドローンで撮影した耐候性鋼橋の画像データに対して外観評点を行う方法も検討する

About his own research 
Research theme : While participating in a field survey of rust on weathering steel materials of weather-resistant steel bridges, he will evaluate the appearance using machine learning (AI) on the photographed data. Finally, a method to evaluate the appearance of weather-resistant steel bridges using image data taken by a drone will also be studied.

耐候性鋼材の錆の調査は来週の水曜日に行く予定であり、この研究に関しては錆のデータをもらわないと何もすることができないので現在は錆の画像をAIで外観評価する前段階として0~9までの手書き数字(mnist)をCNNを用いて学習させ、正確に判別できるかどうかを行っている。

The investigation of rust on weather resistant steel is scheduled to go next Wednesday, and since we cannot do anything about this research without receiving rust data, we are currently learning handwritten numbers (mnist) from 0 to 9 using CNN as a preliminary step to evaluate the appearance of rust images using AI to see if we can accurately identify the rust. We are now trying to see if it is possible to accurately discriminate the rust images.


1, 画像処理を加えてCNNで学習させたもの

1, The images of mnist, a data set containing nearly 60,000 handwritten digit images, were trained by CNN, and the correct answer rate was obtained by adding points, lines, circles, hexagons, and other shapes to the image to be discriminated.

使用したデータ Data used(example) &ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/Slide7.png,150x);

,数字  ,正答率  ,正解率 
,number ,correct response rate ,correct response rate
,0 ,9/9 ,9/9
,1 ,8/9 ,1/9
,2 ,9/9 ,6/9
,3 ,9/9 ,6/9
,4 ,9/9 ,0/9
,5 ,9/9 ,5/9
,6 ,5/9 ,2/9
,7 ,8/9 ,4/9
,8 ,6/9 ,6/9
,9 ,6/9 ,0/9


2, 判別したい画像を以下のように変更し 判別する画像の加工, 判別の正誤をテキストファイルに保存するまでを1つのスクリプトにまとめた。

2, Change the image to be discriminated as follows, process the image to be discriminated, and save the correct and incorrect discriminions to a text file, all in one script.

,数字  ,正答率  ,正解率 
,number ,correct response rate ,correct response rate
,0 ,10/10 ,100.00%   
,1 ,0/10 ,0.00%             
,2 ,10/10 ,100.00%      
,3 ,10/10 ,100.00%       
,4 ,6/10 ,60.00%      
,5 ,10/10 ,100.00%  
,6 ,0/10 ,0.00%    
,7 ,10/10 ,100.00%    
,8 ,10/10 ,100.00%    
,9 ,10/10 ,100.00%   


3, 2で用いたスクリプトはmnistをCNNで用いて学習させる機能を持っていなかった。そのため2のスクリプトにmnistをCNNで用いて学習させるスクリプトを追加した。それに加えて判別の正誤だけでなく数字別の正答率も出すようにした。

3, The script used in 2, did not have the ability to train mnist with CNN. Therefore, we added a script for training mnist using CNN to the script used in 2. In addition, we added the ability to produce not only the correctness of the discriminant but also the percentage of correct answers for each number.

,数字  ,正答率  ,正解率 
,number ,correct answer rate ,correct answer rate
,1 ,0/10 ,0.00%          
,2 ,8/10 ,80.00%         
,3 ,10/10 ,100.00%      
,4 ,8/10 ,80.00%         
,5 ,10/10 ,100.00%      
,6 ,1/10 ,10.00%         
,7 ,10/10 ,100.00%
,8 ,10/10 ,100.00%      
,9 ,10/10 ,100.00%      


4, 判別したい画像に加工処理を施すだけでは正答率を100%に近づけるのに限界があると考え、学習データにも加工処理を施した。(mnistの画像にも点や直線, 円や六角形等の図形を加えた)

4, Since there is a limit to achieving a correct response rate close to 100% only by processing the images to be discriminated, we also processed the training data.  (Points, lines, circles, hexagons, and other shapes were added to the mnist images.) 

,数字  ,正答率  ,正解率   
,number ,correct answer rate ,correct answer rate
,0 ,15/15  ,100.00% 
,1 ,15/16  ,93.75%   
,2 ,15/16  ,93.75%    
,3 ,16/16  ,100.00%  
,4 ,15/16  ,93.75%  
,5 ,15/16  ,93.75%  
,6 ,12/16  ,75.00%  
,7 ,15/16  ,93.75% 
,8 ,16/16  ,100.00%  
,9 ,15/16  ,93.75%  

Data used in 2-4 (example)

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/0_100.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/5_100.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/7_100.png,150x);


5, 判別したい画像をmnistから抽出したデータに変更した。2~4で使っていた数字の画像と比較して精度に差が出るのか試してみたところmnistから抽出したもののほうが精度が高かったためこちらを使うことにした。

5, The image to be discriminated was changed to the data extracted from mnist, and the accuracy of the image extracted from mnist was higher than that of the image used in steps 2~4.

,数字  ,正答率  ,正解率
,number ,correct answer rate ,correct answer rate
,0 ,20/20  ,100.00%  
,1 ,20/20  ,100.00% 
,2 ,20/20  ,100.00%  
,3 ,20/20  ,100.00%  
,4 ,20/20  ,100.00%  
,5 ,20/20  ,100.00%
,6 ,20/20  ,100.00%  
,7 ,20/20  ,100.00%  
,8 ,20/20  ,100.00%  
,9 ,18/20  ,90.00%    

Data used(example)

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/0_0.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/5_0.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250508/7_2.png,150x);


6, 数字の書いてある部分(画像の中心部分)になるべく白い点を入れないようにした

6, I tried to avoid white dots in the numbered area (center of the image) as much as possible.

,数字  ,正答率  ,正解率 
,number ,correct answer rate ,correct answer rate
,0  ,20/20  ,100.00%  
,1  ,20/20  ,100.00%     
,2  ,20/20  ,100.00%   
,3  ,20/20  ,100.00%   
,4  ,20/20  ,100.00%    
,5  ,20/20  ,100.00%     
,6  ,20/20  ,100.00%  
,7  ,19/20  ,95.00%       
,8  ,20/20  ,100.00%  
,9  ,20/20  ,100.00%   

Data used(example)

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250513/noised_1_0.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250513/noised_9_0.png,150x); → 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250513/noised_1_1.png,150x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250513/noised_9_1.png,150x);


***5/15 [#j417c515]
-判別をするにあたって以下の要素を加えた
--mnistの画像を加工した状態で機械学習を行う
--学習の偏りを避けるため複数の学習モデルを構築 ( h5 → keras ファイルを3つ作成) ※kerasファイルはTensorFlowの標準形式をベースに構築された新しいファイル形式であり、h5ファイルは古い保存形式であるため場合によってPython上で実行するとエラーが出る可能性あり。
--過学習抑制のためDropout関数の実装
--エポック数を増やす
--機械学習によてどの数字が判別に弱いのかを知るために混同行列を作成し可視化
--判別させる画像にも加工を加える
--最良のモデルを保存するためにEarlyStoppingとModelCheckpointを実装

これら全てを取り込んだのが以下の Ver5.0 = Mnist-Hanbetsu-Full_auto5.py である。

 Pythonコード (Mnist-Hanbetsu-Full_auto5.py)

,数字  ,正答率  ,正解率  ,正答率  ,正解率  ,正答率  ,正解率 
,0 ,19/20 ,95.00%    ,19/20 ,95.00%    ,18/20 ,90.00% 
,1 ,8/20 ,40.00%      ,19/20 ,95.00%    ,6/20 ,30.00% 
,2 ,19/20 ,95.00%    ,19/20 ,95.00%    ,19/20 ,95.00% 
,3 ,20/20 ,100.00% ,18/20 ,90.00%    ,19/20 ,95.00% 
,4 ,18/20 ,90.00%    ,18/20 ,90.00%    ,20/20 ,100.00% 
,5 ,19/20 ,95.00%    ,18/20 ,90.00%    ,20/20 ,100.00% 
,6 ,20/20 ,100.00% ,20/20 ,95.00%    ,20/20 ,100.00% 
,7 ,18/20 ,90.00%    ,15/20 ,75.00%    ,19/20 ,95.00% 
,8 ,17/20 ,85.00%    ,20/20 ,100.00%  ,17/20 ,85.00% 
,9 ,18/20 ,90.00%    ,19/20 ,95.00%    ,18/20 ,90.00% 

Mnist-Hanbetsu-Full_auto4.py を実行したときと比較して明らかに判別精度が落ちてしまっている。しかし下に示した混同行列をみると訓練モデルは正確に判別できている。(左側1枚がVer4.0のとき 右側3枚がVer5.0)

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250516/Ver4.0.png,400x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250516/Ver5.0.png,400x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250516/Ver5.0_2.png,400x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250516/Ver5.0_4.png,400x);

下記の内容が判別精度低下の主な原因ではないかと考えている。
--学習方法を同一のCNNモデルから3種類のCNNモデルへ変更(アンサンブル学習) → 小さめ(層の薄い)のCNNモデル①と大きめ(層の薄い)のCNNモデル②, モデルの汎化性能を向上させる正則化を強化したCNNモデル③
--間違えて判別した画像を再学習させて精度の向上を図る

---1, 複数の学習方法の統合によるモデルの一貫性の欠如
→アンサンブル学習を行なうため3つの学習モデルで判別を行っているが、それぞれの学習結果や特性がうまく調和していないと予測の信頼性が落ちる可能性あり。

---2, 誤判別画像の再学習による過学習や偏り
→誤判別された画像のみを再学習させることで過剰に最適化され、汎化性能が落ちることがあるうえ再学習データが少数であったり偏っていると全体のバランスが崩れてしまうことがある。

---3, スクリプトの構成が複雑化したことでデータ処理や前処理の不整合が発生している可能性
→スクリプトの行が多くなるとどうしても学習データと推論データで画像サイズや正規化, ノイズの種類や強度といった前処理の定義が微妙に異なってしまうことがある。モデルが期待するデータと異なるものを判別してしまい精度が下がることがある。

-使用したCNNモデルについて
,要素 ,モデル① ,モデル② ,モデル③
,畳み込み層数 ,1 ,2 ,2
,カーネルサイズ ,3×3 ,3×3(2回) ,5×5 → 3×3
,プーリング ,あり(1回) ,あり(1回) ,あり(1回)
,Dropout ,なし ,あり(0.3) ,あり(0.25・0.5)
,BatchNorm ,なし ,あり(1回) ,あり(1回)
,全結合層 ,64ユニット ,128ユニット ,64ユニット

以下は全5バージョンのMnist-Hanbetsu-Full_autoを実行したときの判別率である。左から順にVer1.0(Mnist-Hanbetsu-Full_auto.py), Ver2.0(Mnist-Hanbetsu-Full_auto2.py), ... ,Ver5.0(Mnist-Hanbetsu-Full_auto5.py)と並んでいる。

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250516/Ver1.0.png,300x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250516/Ver2.0.png,300x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250516/Ver3.0.png,300x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250516/Ver4.0_1.png,330x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250516/Ver5.0_1.png,330x);

以上より手書き数字の画像判別はあまり要素を盛り込みすぎることなく判別させることが重要であるのではないか。 (Ver4.0が数字の画像判別に1番適していると考える)


***5/16 (ここから物体分類判別) [#j417c516]
物体分類の判別
-以下のサイト (CIFAR-10) にあるデータを用いて画像識別を行った。
 https://www.cs.toronto.edu/~kriz/cifar.html
-CIFAR-10には飛行機, 自動車, 鳥, 猫, 鹿, 犬, カエル, 馬, 船, トラック の10種類の画像が訓練データ(約5万枚) テストデータ(約1万枚)合わせておよそ6万枚の画像が保存されている。ここからMnistの時と同様にCNNを用いて機械学習を行っていく。

-Pythonスクリプトの実装
--とりあえずCIFAR-10上にある画像で学習を行い混同行列を作成してみた。

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250516/00.png,400x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250516/01.png,400x);

左側がエポック数20, 右側がエポック数50としたがあまり精度は向上しなかった。

-来週やること
--Animal.pyを改良して精度が向上するか確かめる
--今日はただCIFAR-10上にある画像を学習させただけなのでテストデータから画像を抽出して実際に判別させてみる。


***5/19 [#j417c519]
-物体分類の判別について最終的な目標として

--1, 学習する画像には特に加工を加えることなく
--2, テストデータから何枚か画像を抽出して判別をさせて
--3, 10種類ごとに正答率の割合を算出することを目的とする。

とりあえず
-① 学習画像は無加工とし混同行列を表示させるスクリプトと
-② テストデータから画像を抽出するスクリプト, 
-③ 学習データを用いてテストデータを判別させるスクリプト
を組んでみた。3つとも独立(手動)で実行させてみて特に気になる箇所が無ければスクリプトをまとめる。

--③について①で作成された学習データをもとに判別した結果を以下の表に示す。(抽出したデータは各20枚)

,タグ ,正答率
,airplane   ,90.00 % 
,automobile ,100.00 % 
,bird       ,85.00 % 
,cat        ,80.00 % 
,deer       ,95.00 % 
,dog        ,55.00 % 
,frog       ,95.00 % 
,horse      ,100.00 % 
,ship       ,100.00 % 
,truck      ,95.00 % 

 Pythonコード① (Animal.py)

 Pythonコード② (Yobidashi.py)

 Pythonコード③ (Buttai-Bunrui.py)


***5/20 [#j417c520]
-1回の学習 (.py を実行させてから全て出力し終えるまで) で15時間近くかかるようになってきたため、下手な鉄砲も数打てば当たるという考え方が通用しなくなった。これからはスクリプトに間違いがないか慎重に確かめる必要がある。
--エポック数を1にして学習させれば20分ぐらいで結果が出力される事が分かった(5/23追記)
-その間に明日から本格的に始動する研究に向けて耐候性鋼材の錆をCNNを用いてどう判別するか考えていた。

目標に向けて大まかなステップ

--1, 100 枚/クラス を目標にデータ収集&CSV ラベリング
--2, .img .jpg形式で整理
--3, 整理した画像を 転移学習+EarlyStopping で試走
--4, 混同行列 と Grad‑CAM で失敗要因を可視化
--5, クラスあたりの枚数を増やし誤判定画像を追加収集 → 再学習

目標を達成するために
-1. データ収集 … 構造物の部位や照明条件, 距離を揃えて撮影し1 枚ごとに 1〜5 のラベル を付与させておく。同じ鋼材でも光の当たり方で見え方が変わる場合があるため、昼夜, 曇天, 逆光等といった様々な条件下を想定した撮影をする。
-- → 作業現場でスマホ等で撮影 → PCに画像データを移行すると同時に一括ラベリング(5段階でラベル付け  CSV に filename,label)表計算ソフト+Python で CSV 書き出し

-2. 前処理 … 画像を 224×224〜299×299 にリサイズまたは正規化(0‑1 もしくは ‑1〜1)する。
-- torchvision.transforms (PyTorch をインストールした場合 - 推奨) 
-- tf.keras.preprocessing (TensorFlow をインストールした場合) のどちらかを使用

-3. データ分割 … Train(訓練用) : Val(検証用) : Test(評価用) に用いるデータの比率を 70 : 15 : 15 としその際撮影順ではなくシャッフルして分割するようにする。また撮影した橋ごとに分割すれば「未知の橋写真に強いか」も検証することができるのでは。
-- → sklearn.model_selection.train_test_split を用いて分割させる。

-4. データ拡張 … ランダム左右反転・回転 ±15° 
-- → ColorJitter(彩度・明度)や Cutout or RandomErasing を用いて錆パターンを“水増し”し少ないデータでも CNN が汎化するようにする。始めは torchvision で画像の変換を行い、さらに穴あけやランダムぼかし等といった高度な加工を行いたい場合は Albumentations を使うようにする。
 
-5. モデル … 転移学習が最速 
-- 転移学習とは … 1から CNN を学習させるには何千〜何万枚の画像が必要となるため「一般画像(ImageNet)で事前に学習済みのモデル」を用いて学習時間の短縮を図り、最後の分類部分だけ自分のデータに合わせて学習することが目的の学習である。
-- ResNet‑50 / EfficientNet‑B0 (事前学習済みのCNN)などを ImageNet 重みで初期化し最終層を 5 ユニット(5段階評価)+softmax に置換する。そして学習しないように層を凍結を最後の数ブロックだけ微調整する。
--- → PyTorch Lightning / Keras を使用

-6.  学習 … EarlyStopping & ModelCheckpoint を用いる

-7.  評価 … 従来どおり混同行列を表示し学習は上手くいったのかと判別に弱い等級を確認
-- 以下のツールで判断根拠を可視化	
---① scikit‑learn … Pythonの定番機械学習ライブラリであり、分類, 回帰, クラスタリング(学習データを基に画像をグループに分ける), 評価指標など多数搭載している。深層学習では PyTorch と組み合わせて「評価や前処理」に使うことが多い。

---② torchmetrics … PyTorch 専用の 評価指標ライブラリであり、エポックごとにおける学習中/検証中にF1スコア, 精度, 平均絶対誤差などを自動で計算できることに加えてGPU 対応&バッチ間の統計も管理してくれる。

---③ grad‑cam … CNNが画像のどこを見てその点数であると判断したのかを可視化する手法で、モデルが「赤サビの剥がれ」を見て5点にしたのか?それとも「背景の空」を見て間違ったのか?を確認できる。

- 8. 推論 … 重みを .keras (推奨) で保存
-- CLIツールをPython上で作成して判別させたい画像のラベル(評点)を予測する。 

より高精度・運用向けの改善アイデア
--クラス間で枚数が偏ると “稀な酷い錆(5点)” を取りこぼすので意識的に集めるかクラス重みを掛ける。
-- 回帰併用 … 5 段階を「1〜5 の連続値」として MSELoss も同時に学習(マルチタスク)。誤差 ±0.5 を許容した評価がしやすい。
-- アンサンブル学習 … EfficientNet + ConvNeXt など 2–3 種を学習。また混同行列で間違えやすい写真だけ再収集/追加学習。


***5/21~23  [#j417c521]
-Animal-2.pyを実行して結果が出力されたので下の表に示す。

,評価項目 ,判別率(学習回数1回) ,判別率(学習回数60回)
,airplane   ,74.20% ,86.80%
,automobile ,77.90% ,83.40%
,bird       ,43.00% ,80.00%
,cat        ,55.10% ,62.80%
,deer       ,67.60% ,85.30%
,dog        ,45.90% ,76.90%
,frog       ,66.40% ,89.40%
,horse      ,74.90% ,88.80%
,ship       ,76.00% ,92.50%
,truck      ,78.70% ,92.00%
,平均       ,65.97% ,83.79%

自作したスクリプトが正常に動作するかどうかを調べたかったため、学習させる層を1層として実行させた。問題なく実行できた後は学習回数を60回にしてみてどのくらい精度が変化するのか見た。全10項目において判別精度は平均して凡そ18ポイント上昇したが、特に bird, cat, dog はもう少し精度を上げることはできないだろうか。また21日の午後は耐候性鋼材の講習会に参加した。

学習させたデータをもとに cifar10 上にあるテスト用画像を各項目100枚ずつ無作為に抽出してどのくらいの精度が得られるか検証した。以下はエポック数(= 学習回数)を変えながら行った項目ごとの判別率と判別に用いた画像である(抜粋)。

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250522/1.png,163x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250522/2.png,163x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250522/3.png,163x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250522/4.png,163x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250522/5.png,163x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250522/6.png,163x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250522/7.png,163x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250522/8.png,163x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250522/9.png,163x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250522/10.png,163x);


,評価項目 ,判別率(学習回数1回) ,判別率(学習回数10回) ,判別率(学習回数30回) ,判別率(学習回数60回)
,airplane   ,73.00 %  ,100.00 % ,100.00 % ,88.20 %
,automobile ,84.00 %  ,100.00 % ,100.00 % ,74.50 %
,bird       ,53.00 %  ,100.00 % ,100.00 % ,76.50 %
,cat        ,68.10 %  ,100.00 % ,100.00 % ,58.90 %
,deer       ,71.60 %  ,100.00 % ,100.00 % ,86.70 %
,dog        ,44.00 %  ,100.00 % ,99.00 % ,75.80 %
,frog       ,69.00 %  ,100.00 % ,100.00 % ,91.10 %
,horse      ,79.00 %  ,100.00 % ,100.00 % ,90.10 %
,ship       ,83.00 %  ,100.00 % ,100.00 % ,93.40 %
,truck      ,89.70 %  ,100.00 % ,100.00 % ,91.10 %
,平均       ,71.30%   ,100.00 % ,99.90% ,82.63 %

5/23現在エポック数を60にして判別した結果は記載していないが、エポック数が10でもかなり良い精度が出ているのでこれから学習をさせるには10とか12で良さそう。


***5/26 (ここから錆画像判別)  [#j417c526]
-午前中に高専の中島さん達と今後の動きについて話し合った。耐候性鋼材の調査は主に県内になりそうだが、もしかしたら庄内・最上にも行く可能性あり。
-東北各地から錆のデータが集まるまでまだ時間がかかりそうなので、それまでは過去の先輩方が行っていた耐候性鋼材の研究データから錆の画像を拝借してそれを機械学習させる。
--はじめに目視で評点を画像に入力するなどした後に機械がどう評価をするのかを確かめる。


錆の一例

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250526/1.jpg,400x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250526/2.jpg,400x);

***5/27, 28 [#j417c527]

過去の先輩が残してくださったセロハン試験の画像データがあったので、400ピクセル四方に切り取って学習させてみる。
以下の画像はUMAPという高次元データを低次元空間に圧縮し、データの構造や関係性を可視化するために用いられる次元削減手法を用いて錆の画像にパターンがあるかどうかを示したものである。

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250527-1.png,1000x);

この図から分かること
-1. 似た錆画像は近くに配置されている
--UMAPは元の画像の見た目の特徴の類似度を保持したまま、2次元(ある特徴の方向性 = 模様・粒子の粗さ・色味など)に圧縮しているため、図の中で近くに並んでいる点同士は錆の見た目(模様・粒子の粗さ・色味など)が似ていることを意味する。

-2. KMeansクラスタリングにより錆画像が5つのグループに分かれた
--色が異なる5つの「クラスタ (= 点)」は特徴的に似た錆画像同士が集まっているグループで、例えば緑色のクラスタは比較的上の方に固まっており同様に他のクラスタも明確に分かれている。茶色や青のクラスタは左側に密集していてそれぞれ緑色とは異なる特徴を持っている可能性がある。これは、「肉眼で似ている錆画像」がグループ化された結果であり以下のような傾向を含んでいる可能性がある。

--- 微細な粉状の錆
--- 鱗片状に剥がれた錆
--- 密集した粗い錆
--- 色調の異なる錆(赤錆、黒錆など)

-3. UMAPと2つの軸(UMAP-1とUMAP-2)の意味
--UMAP(Uniform Manifold Approximation and Projection)とはレーダーチャートのような高次元のデータを2次元等の低次元のデータに変換することを指し、データ間の関係性を分かりやすく可視化することが可能である。変換前においてある程度データが似ていたものは実際に変換後でも2次元平面内では距離的に近くなる(同じ位置に集まりやすい)ため実際に2つのデータが近い値を取っている事を視覚的に捉えることが出来る。逆に2つのデータが似ていない(別々の特徴を持っている)場合は2次元に変換しても互いに離れた位置に点がプロットされる。

--両軸は「人間が理解できる物理的意味」は持っておらずただし「見た目の特徴の次元」を2軸に圧縮したものなので、相対的な位置関係には意味がある。 ⇒   X軸・Y軸が近い点ほど見た目が似ている

 UMAPは錆の画像に評点をつけてから使うこととする。評点をつけ終えたらクラスタ別にフォルダーを作成してどのような分布になっているのかを確かめる。

5/29 やること
-評点を判別させるスクリプトの構築

***5/29 [#j417c529]
昨日UMAPによって分類された錆の画像からグループ毎に10枚 合計50枚の画像に評点を書き加えた。判断方法は画像と錆の見本写真・サンプルを見比べたため正確にできているかどうか怪しいが、とりあえず作成したスクリプトが実行されるかどうかを試したいため正確さは後回し。評点ごとの枚数は以下の通り

,評点 ,枚数
,1 ,6枚
,2 ,12枚
,3 ,15枚
,4 ,9枚
,5 ,8枚

-学習1回目
--錆の画像の一部にラベルをつけて機械学習させた後その結果からラベル付けしていない画像を評点1~5のフォルダーに保存するようスクリプトを作成した。以下に評点ごとに分類した画像をUMAPできれいにグループ分けできたかどうかを示す。

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250529/1.png,1000x);

---紫色 … 評点1   紺色 … 評点2   翠玉色 … 評点3   緑色 … 評点4   黄色 … 評点5

--評点2と3はある程度グループとして固まっているもののラベル付けに精彩を欠いてしまったのかどの評点も散らばってしまっている。これから評点ごとに保存された画像から再度ラベル付けを行って上記に示したUMAP図がどのくらい変化するのか見ていく。理想はここから2枚上の画像

-学習2回目

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250529/2.png,1000x);

---紫色 … 評点1   紺色 … 評点2   翠玉色 … 評点3   緑色 … 評点4   黄色 … 評点5

--1回目と比較してバラつきは少なくなったものの左上に固まっているグループをもっときれいに色分けしたい。


-明日やること
--学習の繰り返し

***5/30 [#j417c530]
-3回目と4回目

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250529/3.png,800x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250529/4.png,800x);

**6月 [#j417c600]

***6/3 [#j417c603]
評点付きの錆画像データを見つけたのでこれをUMAPを用いて分類した結果を以下に示す。

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250603/1.png,1000x);

-1. 点(クラスタ)の存在
--縦軸と横軸にそれぞれ注目するとUMAP-1(縦軸)で見ると広く分布しており、UMAP-2(縦軸) で見た場合は低い領域(0〜5周辺)に点が密集していることが見て取れる。
--画像の中央から左側は縦方向に伸びていることが確認できる。→ 様々な特徴量を考慮した結果縦に展開された可能性
--左上には4~5の評点が密に集まる領域があり比較的状態が良好な錆画像はそのあたりに分類される。

-2. UMAPとスコア(≠評点)について
スコアは完全分離しているわけではないが、スコアごとにある程度のパターンが見られる。
--スコア1 : 縦軸に注目すると殆どの点がUMAP2の1〜5に集中している。
--スコア2 : UMAP2の -1〜3に集中している。
--スコア3, 4 : どちらも画像の左側に密集しているもののスコア3の点が真ん中に多くある2方向のUMAPはそれぞれ何を基に分類を行っているか確認してみた。以下の画像群はUMAPと aspect_ratio,  sobel_x,  sobel_y,  orientation_std,  num_blobs,  roughness との間に相関関係があるかどうかを表したものである。右側がUMAP1, 左側がUMAP2となっている。一方でスコア4の点はその外側(上下)に分散してある。
--スコア5 : スコア4と同様な分布となっているが左上にかなり密集している箇所が見受けられる。

2方向のUMAPはそれぞれ何を基に分類を行っているか確認してみた。以下の画像群はUMAPと aspect_ratio, sobel_x, sobel_y, orientation_std, num_blobs, roughness との間に相関関係があるかどうかを表したものである。左側がUMAP1, 右側がUMAP2となっている。

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250603/11.png,800x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250603/21.png,800x);

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250603/12.png,800x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250603/22.png,800x);

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250603/13.png,800x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250603/23.png,800x);

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250603/14.png,800x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250603/24.png,800x);

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250603/15.png,800x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250603/25.png,800x);

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250603/16.png,800x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250603/26.png,800x);

-錆画像から抽出した各特徴量の意味
, 特徴量名 , 説明 , 数字の大小で何が分かるか 
, aspect_ratio , 縦方向エッジ量 ÷ 横方向エッジ量(= Sobel Y / Sobel X) , 値が大きいほど縦方向模様が強い(縦筋・縦のび)傾向にある 
, sobel_x , 横方向(左右)の輪郭強度(エッジ) , 値が大きいほど横縞や横模様が多い 
, sobel_y , 縦方向(上下)の輪郭強度(エッジ) , 値が大きいほど縦縞や縦模様が多い 
, orientation_std , 画像内の輪郭や模様の方向性のばらつき(標準偏差) , 値が小さいほど方向が揃っており、値が大きいほどランダム・雑多な模様 
, num_blobs , 二値化画像から検出された「斑点」や「模様のかたまり」の数 , 多いと細かい斑点が密集しており、少ないと大きな斑模様 
, roughness , 周辺の濃淡変化の激しさや表面のざらつき度(局所コントラストなどで算出) , 値が大きいと表面が粗くざらついた錆であり、小さいと滑らかで均一 

-UMAP1は sobel_x, sobel_y, roughness,  に強い負の相関が見られ「輪郭の強さ(エッジの濃さ)」と「粗さ」によって分類がされているのではないか。一方でUMAP2は orientation_std に正の相関が見られ「模様の方向性のバラつき(雑さ)」に影響されているのではないか。

-よってUMAP1の場合横・縦方向のエッジ(sobel_x・sobel_y)が強くなることに加えて表面がざらざらしている(roughness)とUMAP1は小さくなる。 → 全体として、エッジが強くざらついた錆は UMAP1 が小さく、方向性が乱れた模様では UMAP1 が大きい傾向にある。
-UMAP2の場合は模様の方向(orientation_std)がバラバラだとUMAP2が大きくなる。 → UMAP2は主に「方向性のバラつき」と「表面の粗さ」によって決まっている。

--UMAPの座標が意味するもの
, 軸 , 表すものの傾向 
, UMAP1 , 主に「模様の強さ(エッジ強度)」+「表面の粗さ(roughness)」 
, UMAP2 , 主に「模様の方向性のバラバラ度合い(orientation_std)」 

このことから、UMAPプロット上で:

--左下あたりにいる画像:鋭いエッジがあり、ざらざらした錆(典型的な斑模様)
--右上あたりにいる画像:模様がバラバラ・薄く滑らかな錆(方向性のない軽度な腐食)

といった分布傾向が読み取れる。

***6/4 [#j417c604]
1回の学習ごとに手動で評点を入力してはの繰り返しだと終わりが見えない&精度を上げるのに限界を感じたため別のアプローチで判別することを試みた。

評点付きの錆画像は何枚か同じ画像が存在したため重複していたものを削除したら全74枚あった錆画像が24枚(評点1から順番に 3 , 7 , 6 , 6 , 2枚)となってしまった。この枚数で機械学習させるには無理があるため、評点付きの錆画像に様々な処理を加えることで機械学習させる画像の枚数を増やしていくことにした。以下に具体的な処理とその内容について表形式で示しておく。

, 処理 , 内容 
, 画像の反転 , ただ画像を鏡写しにするだけ 
, 画像の回転 , ランダムで ±10°~±30°、±90°、±180°のいずれかを行なう 
, 類似画像の削除 , 画像処理分野で画像の類似度を数値化する際に用いられるSSIMを使用 

 MMLI (=More Machine Learning Images).py … 既存の画像を反転・回転等で学習させる画像枚数を増やすスクリプトのこと。

 Hyoutenhuriwake+UMAP2.py … ラベル付きの画像を学習させた結果をもとに画像の評点をつける。 あとUMAP画像の表示


上記のPythonスクリプトを実行させると24枚しかなかった画像を970枚近くまで増やすことができた。(SSIM=0.99のとき)このデータをUMAPを用いてグループ分けすると以下のようになった。

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250604-1.png,1000x);

以前よりもクラスタリング精度が向上したのではないか。

-1. 評点ごとの分離性
--この画像ではグループ5(黄色)が密集しており、他の評点と明確に分離されている。
--以前のUMAP図では評点ごとの混在が見られたのに対し今回はグループ1〜5が比較的分離かつ密集していると考えられ、UMAPの特徴抽出がより一致している可能性あり。

-2. 色の連続性
--カラーバーは評点1〜5の連続スケールとなっているが評点をつける関係上5段階スケールとなってしまっている。例としてUMAP上ではグループ2とグループ3が混在している箇所があるが、これは連続スケールに書き換えるとグラデーションが連続的に変化している部分であると考える。 → モデルが評点を「離散的なラベル」としてではなく「連続的なラベル」として学習できていることを示している。

-3. まとめ
--このUMAP可視化では以前よりも評点ごとのクラスタリングが明確になっており、モデル精度の向上が確認できた。特に評点5におけるクラス分離は顕著でありCNN+UMAPによる分類・可視化の成功例と言って良いのではないか。


-次回やること : CNN×スクリプトの作成
--augmented_imagesをCNNで機械学習させる (3層×3回 や 3通りの学習方法の構築 その結果は.kerasファイルで保存されるのが理想)
--評点付き教師画像はラベルの先頭が評点となっている。 例) 1-1_flipped_rot6_(-11°).png → 先頭の1が評点を表しているので、この場合は評点1のpng画像であると分かる。
--上記の学習結果を基に判別させたい画像(Fuji2として保存) に1点から5点の計5段階で評点をつけたい。またその判別した結果を評点ごとにフォルダーとして合計5つ保存したい。
--また判別した結果を評点別にUMAP + KMeans で可視化 & 伝播してほしい。UMAPは画像として保存。
--画像における2方向(x, y軸)のUMAPはそれぞれ何を基に分類を行っているか確認してほしい。UMAPごとに aspect_ratio, sobel_x, sobel_y, orientation_std, num_blobs, roughness との間に相関関係があるかどうかを確かめてもらいたい。画像は1つのフォルダーにまとめて保存してほしく、1つの画像でUMAPと何かしらの要素1つとすること。

***6/6 [#j417c606]
-CNNを用いて錆画像を判別させるスクリプトを作成中

***6/8 [#j417c608]
 Main.py ーー軽量化ー> Main2.py
-とりあえず評点付き錆画像を3タイプのCNNで判別させた学習結果をそれぞれ .keras ファイルとして保存する。さらに評点を付けたい画像が複数枚保存されているフォルダーごとその学習結果に基づいて評点を付け、点数ごとにフォルダーを作成して保存されるようなスクリプトを作成した。(Main2.py)

3パターンのCNNは以下の通り

 # === CNN構造定義(バリエーションを3通り用意) ===
 def create_model(version):
     model = models.Sequential()                                                  # 順次積み重ねるタイプのモデル(Sequential)を作成。
     model.add(layers.Input(shape=(*IMAGE_SIZE, 3)))                              #入力層を定義。IMAGE_SIZE = (64, 64) なら、入力は 64x64x3 のカラー画像(RGB)。
 
     if version == 0: (パターン1)
         model.add(layers.Conv2D(64, (3,3), activation='relu'))                   #64個の3×3フィルターで特徴抽出。ReLUで非線形性を付加。
         model.add(layers.BatchNormalization())                                   #出力を正規化し、学習の安定化と高速化を図る。
         model.add(layers.Conv2D(64, (3,3), activation='relu'))                   #さらに抽出を深める。
         model.add(layers.MaxPooling2D((2,2)))                                    #空間サイズを半分に圧縮(特徴量の要約+計算コスト削減)
         model.add(layers.Dropout(0.3))                                           #学習時にランダムに30%のノードを無効化(過学習防止)
         model.add(layers.Conv2D(128, (3,3), activation='relu'))
         model.add(layers.BatchNormalization())
         model.add(layers.Conv2D(128, (3,3), activation='relu'))                  #フィルター数を128に増やして、抽出する特徴の数を増加 (サイズは減っているが、意味的に濃い特徴を取る)

     elif version == 1: (パターン2)
         model.add(layers.Conv2D(64, (5,5), activation='relu'))                   #5×5の大きめフィルターで広い範囲の特徴を捉える
         model.add(layers.BatchNormalization())
         model.add(layers.MaxPooling2D((2,2)))
         model.add(layers.Dropout(0.3))                                           #正規化 → 縮小 → Dropout(典型的な畳み込みブロック)
         model.add(layers.Conv2D(128, (3,3), activation='relu'))
         model.add(layers.BatchNormalization())
         model.add(layers.Conv2D(128, (3,3), activation='relu'))
         model.add(layers.MaxPooling2D((2,2)))
         model.add(layers.Dropout(0.3))                                           #より深い特徴を抽出し、再び圧縮。Dropoutを通して過学習に強い深層CNNに。

     elif version == 2: (パターン3)
         model.add(layers.Conv2D(64, (3,3), activation='relu'))
         model.add(layers.Conv2D(64, (3,3), activation='relu'))                   #同じフィルター数で畳み込みを2回繰り返すことで、非線形表現力を高める
         model.add(layers.BatchNormalization())
         model.add(layers.MaxPooling2D((2,2)))
         model.add(layers.Dropout(0.3))                                           #出力を安定させて縮小し、汎化能力を保つ。
         model.add(layers.Conv2D(128, (3,3), activation='relu'))
         model.add(layers.Conv2D(128, (3,3), activation='relu'))
         model.add(layers.BatchNormalization())                                   #より抽象度の高い情報を取り出す2段構成。
 
     model.add(layers.GlobalAveragePooling2D())                                   #各チャンネルの特徴マップを平均化して、全結合層の前処理を簡潔に行う。Flattenより軽量。
     model.add(layers.Dense(128, activation='relu'))                              #最終的な判断のための全結合層
     model.add(layers.Dropout(0.5))                                               #強めのDropoutで過学習防止
     model.add(layers.Dense(NUM_CLASSES, activation='softmax'))                   #クラス数(評点1〜5)に対応した出力層。確率で予測を出す。
 
     model.compile(optimizer='adam',                                              #Adam:最もよく使われる最適化手法
                   loss='sparse_categorical_crossentropy',                        #sparse_categorical_crossentropy:ラベルが数値 (0〜4) のときの多クラス分類用損失関数
                   metrics=['accuracy'])                                          #accuracy:精度(正答率)を指標として追跡
 
     return model
 
-上記のCNNで学習させると特に評点1と評点2, 評点5の判別が上手く行かない。
-評点2には人間の目で評点1と捉えられてもおかしくない画像が混じっていたり、評点5に保存されている画像が1枚しかなかったりと判別精度の面からまだまだ不十分である。錆の判断方法について一度確認してみる必要がありそうだ。
--評点2に保存されていた評点1だと思われる画像(評点2の錆画像である可能性も0では無いがどこで線引きするか難しい)

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250608/1.jpg,270x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250608/2.jpg,270x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250608/3.jpg,270x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250608/4.jpg,270x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250608/5.jpg,270x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250608/6.jpg,270x);

***6/9 [#j417c609]
従来はラベルの付いた画像をそのまま学習させていたが、判別が上手く行かないため何か特徴量で分類したほうが良いのではないかと考えた。

 RSRC.py (rust_score_regression_cluster.py)

→ 錆画像にラベルをつける際に判断材料となるであろう錆の粒径, 色の濃さ, 錆が画像に占める割合, 錆の数, 画像内にある1番大きな錆と1番小さな錆の面積差の計5つの項目について、ある特徴量(前に示した5つの判断材料とは異なる)によって5グループに分けられたクラスタ(縦軸)と、実際の評点(横軸)との対応関係を可視化するスクリプト。以下に結果(各クラスタは評点1~5の画像でそれぞれどのくらい構成されているか)を示す。

&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250609/1.png,810x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250609/2.png,810x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250609/3.png,810x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250609/4.png,810x);
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250609/5.png,810x);

-1, Mennsekisa:錆の大きさのバラつき(面積差)
クラスタ2が評点2と完全一致しており非常に良い識別精度といえる。他クラスタはスコアがバラけているものの各クラスタごとに特徴が見受けられ(0は評点2〜4, 1は評点2と3, 3は評点3と4, 4は評点1と2)、クラスタ0を除けば中程度の分類力を持っている。

-2, Color_kosa:色の濃さ(グレースケール)
クラスタ2が評点2と完全一致している。クラスタ0と4も比較的明確な傾向を示しているがクラスタ1と3はバラけてしまっている。 評点2や4を分離するのに非常に有効な方法である。

-3, Mensekihi:錆面積比
錆を黒, それ以外の部分を白と区別させて面積比を求めた。クラスタ2が評点2に0.99、クラスタ4が評点2に0.66と集中。しかしクラスタ0, 1はすべての評点が分散しておりクラスタ3は真っ二つに分かれている。

-4, Sabi_kazu:錆の数
どのクラスタも比較的均等に分散しているため、錆の数と錆の面積差では評点の識別に弱くCNNに組み込んで学習には適していない。

-5, Ryukei:錆の大きさ・粒径
クラスタ2が評点2に1.00、クラスタ3が評点2に0.96  評点2, 3が分離できているが他のスコアがランダムに分布 → 評点2, 3以外では効果が限定的

以上よりクラスタ2のように明確に分類できているものもあったが全体的に見ると少数派で、クラスタが様々な評点で構成されている方が多くやはり錆に現れる特徴でラベル分けを行なうのは現時点で難しいことが分かった。正確かつ膨大なデータ数があれば別だと思うが。


***6/10 [#j417c610]
-特徴量付き CNN(ハイブリッドモデル)
--画像はCNNで処理しつつ、錆の形状・数などの特徴量を別入力としてモデルに加える。
--画像から抽出される“感性的”なパターンと、手動で抽出した“定量的”な情報を両方使う。

--CNN単体だと分類が不安定(特に評点1と2)
--面積・数・濃淡などの情報が評価に明らかに効いている場合

 rating_cnntrainer.py

上記のスクリプトで処理していることについて

, 項目 , 説明 
, 画像入力 , CNNで64×64の画像から特徴を抽出 
, 数値特徴量入力 , .npyファイルから読み込まれた錆特徴量(以下の表に記載) 
, ハイブリッド構造 , CNN特徴と手作り特徴を Concatenateで融合 
, モデルバージョン , 3種類のCNN構造を用意したアンサンブル 学習
, 予測 , 3モデルの出力平均で最終スコアを判定 1〜5の評点に分類して保存 



, 錆特徴量名 , 内容説明 , 特徴量例 
, rust_ratio , 錆の占有面積(全体に対する割合) , 平均輝度、標準偏差、2値化による錆割合 
, num_blobs , 錆のかたまり数(connected components) , 形状(個数) 
, np.mean(gray) , グレースケールの平均(明るさ) , GLCM(テクスチャ)	コントラスト・相関・エネルギー・同質性 
, np.std(gray) , グレースケールの標準偏差(濃淡の変動) , GLCM(テクスチャ)	コントラスト・相関・エネルギー・同質性 
, np.mean(sobel_edges) , エッジ強度(輪郭の激しさ) , Sobelエッジの平均 
, area_diff , 最大面積 - 最小面積の錆領域の差 , 形状(面積差) 


ラベル付き画像 (947枚) を学習させてラベルを付けていない画像(665枚)を分類させた結果 Score1から順に10, 73, 538, 1, 43枚となった。Score4はたった1枚しか保存されておらずしかもその1枚が評点1相当の殆ど錆の画像であった。
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250609/6.jpg,100x);

***6/11 [#j417c611]

 CNN+binning.py

-CNN回帰モデル + binning
--評点(1〜5)を離散ラベルではなく連続的な“点数”と捉えて学習させて予測後に5段階に「bin(分割)」して最終的な評点を決める。
--各評点の境界が曖昧で連続的なスコアで表現した方が自然
--評価者の意識が「点数感覚」に近い(例:2.3点 ≒ 評点2)

-構成内容
--1. 目的
画像を入力しCNNで連続的なスコア(評点1.0〜5.0の0.1点刻み)を予測。
そのスコアをbinning(1点〜5点)に変換して評点分類として扱う

--2. モデル構成(従来のCNN分類との違い)
, 項目 , CNN分類 , CNN回帰 + binning 
, 出力層 , Dense(NUM_CLASSES. activation='softmax') , Dense(1)(活性化なし or ReLU) 
, 損失関数 , sparse_categorical_crossentropy , mean_squared_error (MSE) 
, 出力形式 , クラス確率(0〜1) , 連続値スカラー(例:3.72) 
, 評点の扱い , クラス分類(0〜4) , binning により 1〜5 に変換 

---出力層・形式 , 評点の扱い

今までのCNNは NUM_CLASSES(出力次元数 = 何クラスに分類するか) , softmax(確率的なベクトル出力をする際に用いられる関数) を用いて例えば錆の画像を評点1~5点で付けたい場合
 model.add(Dense(5, activation='softmax')) → この場合NUM_CLASSES = 5
とスクリプトに入力すれば [0.1, 0.1, 0.7, 0.05, 0.05] のようなクラス(評点)ごとの確率(配列)で出力され、 argmax関数を用いてその配列の中で最大値のインデックスを返す。この配列の場合だと最大値は0.7になるので評点は3となる。このように錆画像の評点を1, 2, 3, 4, 5点と他クラスとの相対的な区別を学習するため人によって判断基準が異なる場合はこの分類方法はあまり適さない場合がある。一方でCNN回帰 + binningでは
 model.add(Dense(1))
と入力すれば錆画像の評点は3.27点というように連続スカラー値で出力される。評点の決め方はラベル付きデータをCNNで学習し画像のパターン(色、濃淡、エッジ、形など)から点数を最適化。3.27という値は"学習データの中で、最も似ている例が3点と4点の中間"であることを意味する。これを binning 関数で1点刻みの評点に変換する。その変換方法は2.5点から3.5点の間に出力された数値は評点3というような感じで評点±0.5「評点のスケール」を意識して学習する。

---損失関数
分類の場合
 loss='sparse_categorical_crossentropy'
で正解クラスだけ1、それ以外0のone-hotラベル (異なるグループに分けられたデータを数値として表現するための手法) を元に確率分布を学習。

回帰の場合
 loss='mean_squared_error' 
で予測値 3.27 とラベル 3.0 との差 0.27 を最小化し「正解と近いスコアなら許容」という発想になる。

--3. 学習データ(ラベル)の準備
.png などの画像を  Image.open → resize → 正規化 の順に変換した後、ラベル(fname[0])を int で読み取り、float型のスカラーにする。 [ 例:"3_xyz.png" → label = 3.0 ]

--4. binning(スコア→評点)
学習後の推論時に以下のような関数で連続値を離散化する (一例)

, def binning(score): 
, if score < 1.5: return 1 
, elif score < 2.5: return 2 
, elif score < 3.5: return 3 
, elif score < 4.5: return 4 
, else: return 5 

--5. 評価方法

学習時は回帰(MSE = 平均二乗誤差)で最適化されるが、推論後は binned 値に変換して accuracy_score (予測結果の正確さ) や confusion matrix (混同行列の可視化) を使って評価

 from sklearn.metrics import accuracy_score, confusion_matrix

 y_pred = model.predict(x_val).flatten()
 y_binned = [binning(p) for p in y_pred]
 acc = accuracy_score(y_val, y_binned)

--6. CNN回帰モデル + binning に追加で工夫できること
工夫	内容
出力に ReLU + offset	出力が1〜5に制限されるようにする(例:Dense(1) → ReLU() → +1)
Huber loss に変更	MSEよりも外れ値に強く安定
binning間隔を柔軟化	ヒストグラムを見て等間隔でない分割にも対応可


                       CNN Backbone
             ┌───────────┐
             │ Conv2D → Pool → ...│
             └─────┬─────┘
                     ▼
             ┌───────────┐
             │ Flatten → Dense()   │
             └─────┬─────┘
                        ▼
         分類モデル            回帰モデル
      ┌─────────┐      ┌─────┐
      │ Dense(5, softmax)│      │ Dense(1) │
      └─────────┘       └─────┘
             ↓                     ↓
              argmax           float値 → binning → int


***6/12 [#j417c612]
これまでの結果から錆画像を識別するのはCNN回帰 + binning が精度の観点から1番可能性がありそうなので現段階ではこのモデルを軸に画像分類を進めていく。行き詰まってしまう, これよりももっと優れたモデルが見つかれば乗り換える可能性あり。

現時点(6/12現在)で使用している錆画像フォルダーとPythonスクリプト
-錆画像フォルダー
--1, Fuji2 … ラベル付けを行っておらず学習結果を基にどのくらいの精度で評点1~5に分類できるのかを試すためのフォルダー
--2, train_images … ラベル付けされた画像のあるフォルダー
--3, augmented_images … train_imagesに入っているラベル付き画像は全評点合わせて24枚しかなくこの状態で機械学習させるにはデータが少なすぎるため MMLI.py を用いて画像を増やしたものが保存されているフォルダー
--4, Kekka_Reg … 下記の CNN + binning.py を実行した後に出力される評点別に分類されたフォルダー

-Pythonスクリプト
--1, MMLI.py …  train_images 内に保存されている画像に指定サイズでの切り出し, 左右反転や回転(任意の角度で設定可能)を加えて枚数を水増しするスクリプト。1枚あたり水増しする画像を設定することが可能であり似通った画像は自動的に削除してくれるシステム付き。例えば下の1番左側に示した画像を左右反転して時計回りに34°の回転を加えようとするとその右側に示した画像のように余白が表れてしまい、錆の判定・学習に影響を及ぼす可能性がある。画像を回転する以上どうしても余白が表れてしまうのでその部分には画像をさらに反転(シンメトリー 赤の線を軸に)させたものを付け加えることで錆の判定・学習に影響を及ぼすことなく画像を増やしている。

                     &ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/1.png,1080x); 

--2, CNN+binning.py … この学習で核となるスクリプトであり詳しくは6/11に記載。

回帰スコアから評点の分類を行っていた。スクリプトのデフォルトでは回帰スコア1.00〜1.50までを評点1, 1.51〜2.50までを評点2, 2.51〜3.50までを評点3, 3.51〜4.50までを評点4, 4.51〜5.00までを評点5としていたが、それでは上手いこと分類ができなかったので目視で錆画像を見ながら0.01点単位で評点の範囲を決めていた。その結果以下の表のように評点の分類を行なうこととした。またCNNの層を厚くしても精度は変わらないことが分かった。

, 評点 , 回帰スコア 
, 1 , 2.30点以下 
, 2 , 2.31点以上3.00点以下 
, 3 , 3.01点以上3.40点以下 
, 4 , 3.41点以上3.64点以下 
, 5 , 3.65点以上 

以下回帰スコア別に保存された錆画像を貼っておく
-評点1
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/11.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/12.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/13.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/14.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/15.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/16.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/17.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/18.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/19.jpg,150x);

-評点2
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/21.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/22.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/23.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/24.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/25.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/26.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/27.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/28.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/29.jpg,150x);

-評点3
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/31.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/32.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/33.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/34.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/35.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/36.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/37.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/38.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/39.jpg,150x);

-評点4
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/41.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/42.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/43.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/44.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/45.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/46.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/47.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/48.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/49.jpg,150x);

-評点5
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/51.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/52.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/53.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/54.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/55.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/56.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/57.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/58.jpg,150x); 
&ref(http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/20250612/59.jpg,150x);

-来週の外国語文献までに原稿と発表スライドを書く。


***6/13 [#j417c613]
-外国語文献の原稿と発表スライド作成(6/13〜18まで)
-CNN+binning.py内のアンサンブル学習に少し手を加えた
  CNN+binning3.py

***6/16 [#j417c616]
CNN+binning.py内のアンサンブル学習についての変更点(CNN+binning3.pyについて)
-CNNモデルの変更, 今までは
--1, EfficientNetV2S... 高精度なのに学習が早い・モデルが軽い。錆の「濃さ」「粒度」「面積」など多様な特徴 に対応できる階層性を持つ。
--2, ConvNeXt Tiny / Small... 錆の非局所的な形や面積的な特徴にも強い。
--3, ResNet101... 非常に安定して動く、学習が失敗しにくい。深くすればするほど精度は上がる傾向。

 def load_images_and_scores(folder):                                            #指定した folder 内にある画像ファイルを読み込んで、画像と評点をそれぞれ images・scores として返す。
     images, scores = [], []                                                    #画像データと評点(連続値)をそれぞれ格納するための空のリストを作成。
     for fname in sorted(os.listdir(folder)):                                   #フォルダ内のすべてのファイル名を取得し、名前順に並べて処理。
         if fname.endswith(".png") or fname.endswith(".jpg"):                   #拡張子が .png または .jpg のファイルのみ処理対象.。
             try:                                                               #以下の処理で万が一エラーが出てもスクリプトが止まらないようにする。
                 score = float(fname[0])                                        # Soft Labeling を有効化
                 score += np.random.uniform(-0.3, 0.3)                          # 評点のぼかし
                 path = os.path.join(folder, fname)                             #フォルダ名とファイル名を結合して、画像ファイルのフルパスを作成。
                 img = Image.open(path).convert("RGB").resize(IMAGE_SIZE)       #Image.open():画像ファイルを開く
                                                                                #.convert("RGB"):RGBカラーに変換
                                                                                #.resize(IMAGE_SIZE):指定サイズ(例:224x224など)にリサイズ
                 images.append(np.array(img) / 255.0)                           #np.array(img):画像を数値配列に変換(高さ×幅×3チャンネル)
                                                                                #/ 255.0:画素値を 0~1 の範囲に正規化
                                                                                #append(...):画像リストに追加
                 scores.append(score)                                           #ぼかし済みのスコアを scores リストに追加
             except:
                 print(f"スキップ: {fname}")                                    #画像の読み込みなどでエラーが出た場合、そのファイルは読み込まずスキップされる。
     return np.array(images), np.array(scores)                                  #学習に使える形式(NumPy配列)で画像とスコアを返す。

 def create_model(version):                                                                                                   #モデルを作成する関数の定義。引数 version によって使用するベースモデル(CNN)が変わる。
     input_img = Input(shape=(*IMAGE_SIZE, 3))
     if version == 0:  # EfficientNetV2S
         base = EfficientNetV2S(include_top=False, weights="imagenet", input_tensor=input_img)
     elif version == 1:  # ResNet101(精度重視)
         base = ResNet101(include_top=False, weights="imagenet", input_tensor=input_img)
     elif version == 2:  # ConvNeXt Tiny
         base = ConvNeXtTiny(include_top=False, include_rescaling=False, input_shape=(*IMAGE_SIZE, 3), pretrained="imagenet")
     base.trainable = False
     x = base.output
     x = layers.GlobalAveragePooling2D()(x)
     x = layers.Dense(512, activation='relu')(x)
     x = layers.BatchNormalization()(x)
     x = layers.Dropout(0.5)(x)
     x = layers.Dense(256, activation='relu')(x)
     x = layers.BatchNormalization()(x)
     x = layers.Dropout(0.3)(x)
     x = layers.Dense(128, activation='relu')(x)
     x = layers.Dropout(0.2)(x)
     output = layers.Dense(1)(x)
     model = Model(inputs=input_img, outputs=output)
     model.compile(optimizer='adam', loss=custom_penalizing_loss, metrics=['mae'])
     return model


***6/18 [#j417c618]
明日やること
-CNN+binning3.pyの回帰スコア調節

























































































*創造工房実習 [#v035a40a]
**4/18 [#j417c418]
 創造工房実習でI型断面等の三角形分布や塑性状態がどういう応力分布になっているのかを確認するのを忘れていたのでここに書いておく。
-I型断面に10Nの面載荷をかけたとき
--梁の断面に赤と青で濃く色分けされており、上下縁の両方は降伏に達していると確認できた。
--固定端近くでは、直応力σxxがほぼ対称に上縁で圧縮、下縁で引張になっており三角形状の応力分布に近い。一方で真ん中付近が少し平坦になっている部分もあるため全体的に見ると三角形分布ではないといえる。
http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/1/tejun31.png 
http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/1/tejun32.png 
http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/1/tejun33.png 
-15Nの面載荷をかけたとき
--10Nの荷重をかけたときよりも梁の上下縁にかなりの力がかかっている。ただ解析ステップを10に設定しているところParavis上では22ステップになっているため各種データの信憑性は100%とは言い切れない。→10ステップにならないのは解析がうまく行っていない証拠。ちなみに面載荷を20N以上に設定するとエラーが出る。
--固定端近くでは10Nのときと同様、真ん中から先端付近にかけて上縁部分は三角形に近い形で応力分布が現れている。固定面付近ではかなりの直応力がかかっているがそれ以外の部分は三角形に近い形で応力分布が現れているといって良いのではないか。

http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/1/tejun34.png 
-5N, 6Nの面載荷をかけたとき
--固定面側は最大281MPaの直応力が加わっている上縁がありこの時点で塑性状態に入っていることが分かった。(6N)
--下端側よりも上端側のほうが直応力の値が高く出る傾向にある。面載荷にしているのになぜなのか。もしかしたら面載荷 = 等分布荷重として捉えることができ、それを1点にかかる集中荷重に置き換えるとたわんでいない状態での梁における中立軸よりも下端側にかかるため上端側のほうが直応力の値が高く出るのではないか。

http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/1/tejun35.png 
http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/1/tejun36.png 

 上端

 ・ーーーーーーーーーー

 |          ーーーーー

 ・ーーーーーーーーー      ーーーー|

 下端        ーーーーー     |↓集中荷重位置   このように上端ー集中荷重位置の距離が下端よりも長いことから上端側のほうが直応力が大きい。

                ーーーーー|          逆方向に面載荷をかければ下端側の直応力が大きくなるだろう。

**4/17 [#j417c906]
-SALOME2021でメッシュが計算されない事例が発生
--1, メッシュの編集画面を開く
--2, アルゴリズムで"NETGEN 1D-2D-3D" を選択
--3, その下にある詳細設定右側の歯車をクリックして "NETGEN 3D Parameters" を選択すると最大サイズと最小サイズが任意で選択できる
--4, 最大サイズと最小サイズに数値を入れてOKをクリック (最小サイズは0にしても問題なくメッシュ計算ができる)
--5, メッシュの編集画面に戻るので"適用して閉じる"をクリック
--6, 左側のオブジェクトブラウザーにある"Mesh_1"を右クリックして"メッシュを作成"を選択するとメッシュの計算が開始される

**4/14 [#ja17c906]
-載荷点での荷重、たわみのプロット
   1ステップごとに面に載荷した荷重の10分の1を加えたものーDEPLとのグラフを作成
-軸方向直応力が最大となる点での直応力-直ひずみのプロット(降伏点付近で折れ曲がるか)
  知りたい方向のEPSI_NOEUーSIGM_NOEUとのグラフを作成 (0ならx軸 1ならy軸 2ならz軸)
-その点での相当応力(ミーゼス応力)―相当ひずみのプロット(上記との違いは)
  知りたい方向のSIEQ_NOEUーEPSI_NOEUのx,y,zの直ひずみ,せん断ひずみの計6つのひずみを相当ひずみの計算式に代入して算出されたものとのグラフを作成
-曲げモーメントが最大となる断面の軸方向直応力$\sigma_{zz}$を各荷重レベルでプロット($yz$の2次元と、できれば3次元も)し応力の三角形分布を確認する
  曲げモーメント最大は固定端(片持ち梁の場合)なので0に限りなく近い所でスライスし、SIGM_NOEUが最大になっている点を探し面に載荷した荷重の10分の1と理論値(荷重×荷重をかけた箇所からの距離)とのグラフを作成


**4/10 [#ja87c906]
-片持ち梁にかける荷重を6.25N以上にするとParavisでtime stepが0.8sあたりから0.25s間隔になる。→解析が上手く行っていないのこと
-6.25Nで解析を行うと実際の結果が降伏応力に収束しなくなる。グラフを描くなら7.5~8.0Nが望ましい。

-明日やること
--応力(ミーゼス)-ひずみ,応力-たわみのグラフを作成
--スライドの作成

http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/kekka6.2N.png
http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/kekka8.0N.png

,経過時間,↖たわみ(mm),↖応力(MPa),↗たわみ(mm),↗応力(MPa)
,0,0,0,0,0
,1,0.000140332,34.4925,0.000184238,44.0832
,2,0.000280661,68.9829,0.000368391,88.1643
,3,0.000420986,103.471,0.000552457,132.243
,4,0.000561308,137.957,0.000736434,176.318
,5,0.000701624,172.44,0.000923909,220.147
,6,0.000842636,206.506,0.00123269,241.658
,7,0.00101987,237.23,0.002051,244.44
,8,0.00130101,257.808,0.00765896,243.452
,9,0.00191133,268.432,0.0109555,241.582
,10,0.00377436,280.533,0.0148525,239.658
,11,ー,ー,0.0191575,237.724
,12,ー,ー,0.0237442,235.762
,13,ー,ー,0.0285207,233.804
,14,ー,ー,0.0333983,231.819
,15,ー,ー,0.0383132,229.768
,16,ー,ー,0.043212,227.625



**4/7 [#ja87c006]
-Paravisでのグラフ作成方法
--https://www.rccm.co.jp/icem/pukiwiki/index.php?%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%9F%E7%AF%80%E7%82%B9%E3%81%A7%E3%81%AE%E6%99%82%E7%B3%BB%E5%88%97%E3%83%97%E3%83%AD%E3%83%83%E3%83%88
--https://www.rccm.co.jp/icem/pukiwiki/index.php?%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%20Plot%20Data%20Over%20Time

--Salomeで荷重をかける段階を設定する際に1.0と入力する箇所に小数点が入力できず01と入ってしまう。
 ⇒一度01と入力しOKを押した後再度1.0と入力する画面に戻ると小数点を入力できるようになっている。
--また弾塑性解析を行う際にSalome-Meca演習_弾塑性解析(2021)に書いてある手順で進めると解析を回した際にエラーを吐かれる。
 ⇒原因は関数がある範囲までしか定義されていないの事。Function and ListsのDEFI_FONCTIONにおいて関数の外側も定義できるようにCONSTANTまたはLINEARを追加しておく必要がある。





**2/7 [#ja87c596]
春休みの課題
-弾塑性班 
--鋼材の長方形断面の梁(想像しやすい大きさ)の片持ち梁と単純梁を曲げる
--軸方向:$z$, たわみ方向:$y$
--SS400ぐらいのヤング率と降伏応力で弾塑性解析の設定
--載荷点での荷重、たわみのプロット
--軸方向直応力が最大となる点での直応力-直ひずみのプロット(降伏点付近で折れ曲がるか)
--その点での相当応力(ミーゼス応力)―相当ひずみのプロット(上記との違いは)
--曲げモーメントが最大となる断面の軸方向直応力$\sigma_{zz}$を各荷重レベルでプロット($yz$の2次元と、できれば3次元も)し応力の三角形分布を確認する
--上記の三角形分布において、上下縁から徐々に降伏が入ってきて、最終的に全塑性の状態になるか。
--上記を確認できたら、I型断面とかの三角形分布や全塑性が、どういう応力分布になっているのかを確認。


**12/20 [#w0335ea2]
今日はviを用いて論文に画像を貼る方法について学んだ。


**12/13 [#w0335ea3]
今日はviを用いた論文の書き方を学んだ。


・文頭に%をつけるとその行に書かれた文章は反映されない


・強制改行したい場合は"\\"を入力する


・更新→:!pdfplatexsibup2


○式を書く(書き方は編集画面から)

$v=\frac{P\ell^{3}}{48EI} + \frac{P\ell}{4kGA}$

\begin{eqnarray}
v=\frac{P\ell^{3}}{48EI} + \frac{P\ell}{4kGA}
\\
I=\int_{A}y^{2}dA
\end{eqnarray}

**11/29 [#ceb57a7c]
http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/sand.png

今回は鋼材で木材を挟んだサンドイッチ梁の解析を行い、縦軸に変位(mm), 横軸にボリューム数をとって上のグラフを作成した。
メッシュ長さの大小関係なく理論値と20%の誤差が生じ、これ以上メッシュ長さを短くしても理論値には近づくことがないと推測する。サンドイッチ梁は多分見たことがない以上イメージが湧かず誤差の推測をしようがないので実物にこの目で見て実験を行いたい。今回は鋼材で木材を挟んだサンドイッチ梁を解析したが、実用性を一旦置いて木材で鋼材を挟んだサンドイッチ梁の場合結果はどうなるのだろうか。

全員で作成した解析結果のグラフを下に示しておく

,メッシュ長さ,要素数,先端変位(4隅の平均値)[mm],相対誤差($\frac{salome-手計算}{手計算}$),計算者
,0.7,155419,0.0772,26.943,湊
,0.8,138734,0.0775,26.452,湊
,0.9,82935,0.0774,26.614,湊
,1.1,38671,0.0766,27.937,森井
,1.2,32044,0.0770,27.273,森井
,1.3,28599,0.0768,27.604,森井
,1.4,23950,0.07640,22.04,米谷
,1.5,19998,0.07641,22.03,米谷
,1.6,19448,0.07715,21.28,米谷
,1.7,13801,0.07567,22.79,米谷
,1.8,12677,0.07736,21.06,沼野
,1.9,11464,0.07546,23.00,沼野
,2,10699,0.07404,24.45,沼野
,3,3579,0.08414,15.004,國井
,4,1628,0.08279,16.37,國井
,5,1016,0.08303,16.26,國井
,6,839,0.08288,16.26,西澤
,7,554,0.08087,18.28,西澤
,8,285,0.07898,19.20,西澤
,9,261,0.01421,85.49,真庭
,10,232,0.03380,65.51,真庭
,11,208,0.00913,90.68,真庭

**11/22 [#ceb57a7d]
http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/kadai1122.png

今回は単純異方性と等方性の解析を行い、縦軸に変位(mm), 横軸にボリューム数をとって上のグラフを作成した。異方性は上2つのグラフであるが、メッシュ長さを2以下で解析を行うと理論値(緑)と近しい値をとるようになる。一方で等方性の場合はメッシュ長さが5までなら理論値と似たような値をとる結果となった。前回まではメッシュを細かくするほど理論値に近づいたが異方性の場合はメッシュ長さを1.3にした時が理論値に一番近づき、等方性の場合は理論値と平行関係になってしまった。さらに長さを小さくして解析しても理論値には近づくことがないのではないか。

全員で作成した解析結果のグラフを下に示しておく

,メッシュ長さ,要素数,変位(異方性)[mm],相対誤差-異方性($\frac{salome-手計算}{手計算}$),変位(等方性)[mm],相対誤差-等方性($\frac{salome-手計算}{手計算}$),計算者
,0.7,171996,0.5068,2.993,0.4301,3.141,湊
,0.8,161561,0.5069,2.999,0.4300,3.116,湊
,0.9,94185,0.5021,2.071,0.4301,3.139,湊
,1.1,47998,0.4957,0.814,0.4122,1.056,森井
,1.2,47343,0.4952,0.712,0.4300,3.217,森井
,1.3,42112,0.4941,0.488,0.4298,3.169,森井
,1.4,38960,0.4937,0.407,0.4299,3.193,森井
,1.5,15041,0.4845,1.460,0.4298,3.179,米谷
,1.6,16071,0.4849,1.380,0.4298,3.157,米谷
,1.7,12933,0.4845,1.460,0.4299,3.182,米谷
,1.8,12993,0.4832,1.73,0.4298,3.19,沼野
,1.9,11235,0.4783,2.73,0.4295,3.10,沼野
,2,11456,0.4982,1.32,0.4296,3.12,沼野
,3,2514,0.4369,4.87,0.4293,3.05,國井
,4,1461,0.4341,4.20,0.4293,3.05,國井
,5,433,0.2803,32.7,0.4284,2.83,國井
,6,356,0.4283,2.80,0.3437,17.5,西澤
,7,102,0.4260,2.26,0.2225,46.6,西澤
,8,93,0.4260,2.26,0.1123,73.0,西澤
,9,81,0.2212,54.9,0.4255,2.13,真庭
,10,84,0.2051,58.3,0.4247,1.95,真庭
,11,74,0.2260,54.0,0.4246,1.91,真庭

**11/15 [#ceb57a7e]
http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/kadai1115.png

単純梁の解析結果から縦軸に変位(mm), 横軸にボリューム数をとって上のグラフを作成した。
前回と同じくメッシュの長さを長くすると接点変位は小さくなり、相対誤差は大きくなった。前回は√nに近い形のグラフが描けた一方で今回は歪な形のグラフができてしまった。変曲点はメッシュ数が小さい(1メッシュあたりの長さを長くした)方もといグラフ左側に偏っており、メッシュ長さを長くして解析を行うほど解析結果の信憑性は低くなるのではないか。他のPCと同じ解析を行った場合結果は一緒になるのだろうか?機会があればやってみたいものだ。

全員で作成した解析結果のグラフを下に示しておく

,メッシュ長さ,要素数,先端変位(4隅の平均値)[mm],相対誤差($\frac{salome-手計算}{手計算}$),計算者
,0.7,171996,0.4260,2.207,湊
,0.8,161561,0.4256,2.115,湊
,0.9,94185,0.4169,0.0719,湊
,1.1,47998,0.4122,1.067,森井
,1.2,47343,0.4118,1.166,森井
,1.3,42112,0.4113,1.289,森井
,1.4,38960,0.4112,1.313,森井
,1.5,15041,0.3978,4.516,米谷
,1.6,16071,0.3999,4.002,米谷
,1.7,12993,0.3971,4.687,米谷
,1.8,12203,0.3964,4.85,沼野
,1.9,11235,0.3942,5.38,沼野
,2,11456,0.3991,4.20,沼野
,3,2514,0.2141,21.4,國井
,4,1461,0.34028,18.4,國井
,5,433,0.1354,67.8,國井
,6,356,0.2135,48.8,西澤
,7,102,0.11,73.6,西澤
,8,93,0.112,73.0,西澤
,9,81,0.1125,73.0,真庭
,10,84,0.0794,80.9,真庭
,11,74,0.1297,68.9,真庭

**11/8 [#ceb57a7f]
http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/kadai2.png

全員で行った解析の結果を縦軸に変位, 横軸にボリューム数をとってグラフを作成した。
メッシュの長さを長くすると接点変位は小さくなり、相対誤差は大きくなった。
一方でメッシュの長さを小さくするほど接点変位は断面二次モーメントで算出された6.67mmに近づいた。
メッシュ長さを0.5や0.3として解析を行えばもっと理論値に値が近づくのではないか。

全員で作成した解析結果のグラフを下に示しておく

,メッシュ長さ,要素数,先端変位(4隅の平均値)[mm],相対誤差($\frac{salome-手計算}{手計算}$),計算者
,0.7,107380,6.47,2.96,湊
,0.8,57821,6.44,3.62,湊
,0.9,57698,6.43,3.73,湊
,1.1,57980,6.44,3.57,湊
,1.2,52123,6.41,3.90,森井
,1.3,45549,6.34,4.98,森井
,1.4,26951,6.32,5.31,森井
,1.5,16904,6.25,6.32,米谷
,1.6,14296,6.20,7.05,米谷
,1.7,13596,6.21,6.81,米谷
,1.8,6299,5.74,13.9,沼野
,1.9,6001,5.73,14.1,沼野
,2,5617,5.65,15.3,沼野
,3,2309,5.48,17.8,國井
,4,617,3.62,45.6,國井
,5,494,3.85,42.3,國井
,6,581,2.51,62.4,西澤
,7,133,1.41,78.8,西澤
,8,78,1.29,80.7,西澤
,9,72,1.288,80.69,真庭
,10,60,1.226,81.62,真庭
,11,65,1.231,81.54,真庭


**11/1 [#w68ec49g]
http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/abc.png

http://www.str.ce.akita-u.ac.jp/~gotouhan/j2024/morii/123.png

今日(11/1)はwikiにグラフの貼り付けとviとlinuxを使ってグラフの作成を行った

上のグラフは自身で作成したもの、下のグラフは過去の先輩方が作成したグラフの数値を拝借した。

先輩方が作成したグラフの数値を下に示しておく

,メッシュの長さ	,要素数	,変位[mm],相対誤差,計算者
,0.7,155192,0.08378905246,15.365,安藤
,0.8,138808,0.08380386491,15.350,安藤
,0.9,82587,0.083707073981,15.45,兼田
,1.1,38671,0.084201207602,14.95,兼田
,1.2,31929,0.083688,15.466,柴田
,1.3,28621,0.083669,15.4857,柴田
,1.4,28854,0.08368,15.47,佐藤
,1.5,20015,0.084052,15.10,佐藤
,1.6,19448,0.0835402938,15.62,皆川
,1.7,13801,0.0834355098,15.72,皆川
,1.8,12528,0.083733,15.42,永山
,1.9,11769,0.083924,15.23,永山
,2,10699,0.084076876559,15.074,辻
,3,3579,0.08414561753,15.004,辻
,4,1628,0.082794,16.37,服部
,5,1016,0.083033,18.89,服部
,6,839,0.082882,16.26,梶原
,7,554,0.080871,18.28,梶原
,8,285,0.079995,19.20,工藤
,9,261,0.078980,20.22,工藤
,10,232,0.081911,17.26,佐々木
,11,208,0.075676,23.56,佐々木

**10/4 [#w0335eb3]
今日は顔合わせをした

頑張りたい
"いきものがかり"についた

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS