卒論

4月

4/23

卒論テーマが決まった。

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

4/24

20250424-1.png

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

4/25

20250425-1.png

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

---変換行列ファイルはかなり細かい値まで書かれているためなぜそのような値に設定したのか一度聞いてみる必要がありそう
---各RGB値を入力するにあたりなにか根拠となるものがあるはず(ppm画像とか) → 探しておく必要がある

4/28

4/30 (手書き数字の判別)

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

5月

5/2

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

5/7

数字モデル数正答率
033/3
155/5
266/6
366/6
422/2
5109/10
621/2
732/3
821/2
9139/13

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

5/8, 9

0_0.png ー画像加工→ modified_0_0.png

5_0.png ー画像加工→ modified_5_0.png

7_2.png ー画像加工→ modified_7_2.png

Pythonコード (Gazou-Kakou.py)

0_100.png 5_100.png 7_100.png

数字正答率
010/10
110/10
210/10
310/10
410/10
510/10
610/10
710/10
810/10
910/10

0_101.png 5_101.png 7_101.png 0-8.png 5-8.png 7-2.png 0_201.png 5_201.png 7_201.png

数字点 正答率線 正答率図形 正答率(リスタート前)図形 正答率(リスタート後)
010/109/108/1010/10
110/104/105/106/10
210/109/108/1010/10
310/107/109/1010/10
410/109/108/108/10
510/109/1010/1010/10
68/103/101/103/10
710/107/107/108/10
810/1010/1010/1010/10
910/107/107/106/10

aikon.png

5/10

6_201.png 9_201.png

5/12

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

0_100.png 5_100.png 7_100.png

Pythonスクリプト (Mnist-Hanbetsu-Full_auto2.py)
数字正答率正解率-正答率--正解率---正答率----正解率--
015/15100.00%15/15100.00%15/15100.00%
115/1693.75%15/1693.75%16/16100.00%
215/1693.75%16/16100.00%15/1693.75%
316/16100.00%16/16100.00%16/16100.00%
415/1693.75%15/1693.75%15/1693.75%
515/1693.75%15/1693.75%15/1693.75%
612/1675.00%6/1637.50%8/1650.00%
715/1693.75%14/1687.50%16/16100.00%
816/16100.00%15/1693.75%15/1693.75%
915/1693.75%16/16100.00%15/1693.75%

5/13

0_0.png 5_0.png 7_2.png

20250513-1.png

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

noised_1_0.png noised_4_0.png noised_9_0.png →  noised_1_1.png noised_4_1.png noised_9_1.png

数字正答率正解率正答率正解率正答率正解率
020/20100.00%20/20100.00%20/20100.00%
120/20100.00%19/2095.00%19/2095.00%
220/20100.00%20/20100.00%19/2095.00%
320/20100.00%20/20100.00%20/20100.00%
420/20100.00%20/20100.00%20/20100.00%
520/20100.00%19/2095.00%19/2095.00%
620/20100.00%20/20100.00%20/20100.00%
719/2095.00%19/2095.00%20/20100.00%
820/20100.00%20/20100.00%20/20100.00%
920/20100.00%19/2095.00%20/20100.00%

Figure_1.png Figure_2.png Figure_4.png

5/14

自身の研究内容について

研究テーマ : 耐候性鋼橋の耐候性鋼材の錆の現地調査に参加しながら、撮影データに対して機械学習(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) Slide7.png

数字正答率正解率
numbercorrect response ratecorrect response rate
09/99/9
18/91/9
29/96/9
39/96/9
49/90/9
59/95/9
65/92/9
78/94/9
86/96/9
96/90/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.

数字正答率正解率
numbercorrect response ratecorrect response rate
010/10100.00%
10/100.00%
210/10100.00%
310/10100.00%
46/1060.00%
510/10100.00%
60/100.00%
710/10100.00%
810/10100.00%
910/10100.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.

数字正答率正解率
numbercorrect answer ratecorrect answer rate
10/100.00%
28/1080.00%
310/10100.00%
48/1080.00%
510/10100.00%
61/1010.00%
710/10100.00%
810/10100.00%
910/10100.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.)

数字正答率正解率
numbercorrect answer ratecorrect answer rate
015/15100.00%
115/1693.75%
215/1693.75%
316/16100.00%
415/1693.75%
515/1693.75%
612/1675.00%
715/1693.75%
816/16100.00%
915/1693.75%

Data used in 2-4 (example)

0_100.png 5_100.png 7_100.png

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.

数字正答率正解率
numbercorrect answer ratecorrect answer rate
020/20100.00%
120/20100.00%
220/20100.00%
320/20100.00%
420/20100.00%
520/20100.00%
620/20100.00%
720/20100.00%
820/20100.00%
918/2090.00%

Data used(example)

0_0.png 5_0.png 7_2.png

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

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

数字正答率正解率
numbercorrect answer ratecorrect answer rate
020/20100.00%
120/20100.00%
220/20100.00%
320/20100.00%
420/20100.00%
520/20100.00%
620/20100.00%
719/2095.00%
820/20100.00%
920/20100.00%

Data used(example)

noised_1_0.png noised_9_0.png →  noised_1_1.png noised_9_1.png

5/15

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

Pythonコード (Mnist-Hanbetsu-Full_auto5.py)
数字正答率正解率正答率正解率正答率正解率
019/2095.00%19/2095.00%18/2090.00%
18/2040.00%19/2095.00%6/2030.00%
219/2095.00%19/2095.00%19/2095.00%
320/20100.00%18/2090.00%19/2095.00%
418/2090.00%18/2090.00%20/20100.00%
519/2095.00%18/2090.00%20/20100.00%
620/20100.00%20/2095.00%20/20100.00%
718/2090.00%15/2075.00%19/2095.00%
817/2085.00%20/20100.00%17/2085.00%
918/2090.00%19/2095.00%18/2090.00%

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

Ver4.0.png Ver5.0.png Ver5.0_2.png Ver5.0_4.png

下記の内容が判別精度低下の主な原因ではないかと考えている。

以下は全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)と並んでいる。

Ver1.0.png Ver2.0.png Ver3.0.png Ver4.0_1.png Ver5.0_1.png

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

5/16 (ここから物体分類判別)

物体分類の判別

00.png 01.png

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

5/19

とりあえず

タグ正答率
airplane90.00 %
automobile100.00 %
bird85.00 %
cat80.00 %
deer95.00 %
dog55.00 %
frog95.00 %
horse100.00 %
ship100.00 %
truck95.00 %
Pythonコード① (Animal.py)
Pythonコード② (Yobidashi.py)
Pythonコード③ (Buttai-Bunrui.py)

5/20

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

目標を達成するために

より高精度・運用向けの改善アイデア

5/21~23

評価項目判別率(学習回数1回)判別率(学習回数60回)
airplane74.20%86.80%
automobile77.90%83.40%
bird43.00%80.00%
cat55.10%62.80%
deer67.60%85.30%
dog45.90%76.90%
frog66.40%89.40%
horse74.90%88.80%
ship76.00%92.50%
truck78.70%92.00%
平均65.97%83.79%

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

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

1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png 10.png

評価項目判別率(学習回数1回)判別率(学習回数10回)判別率(学習回数30回)判別率(学習回数60回)
airplane73.00 %100.00 %100.00 %88.20 %
automobile84.00 %100.00 %100.00 %74.50 %
bird53.00 %100.00 %100.00 %76.50 %
cat68.10 %100.00 %100.00 %58.90 %
deer71.60 %100.00 %100.00 %86.70 %
dog44.00 %100.00 %99.00 %75.80 %
frog69.00 %100.00 %100.00 %91.10 %
horse79.00 %100.00 %100.00 %90.10 %
ship83.00 %100.00 %100.00 %93.40 %
truck89.70 %100.00 %100.00 %91.10 %
平均71.30%100.00 %99.90%82.63 %

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

5/26 (ここから錆画像判別)

錆の一例

1.jpg 2.jpg

5/27, 28

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

20250527-1.png

この図から分かること

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

5/29 やること

5/29

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

評点枚数
16枚
212枚
315枚
49枚
58枚

1.png

2.png

5/30

3.png 4.png

6月

6/3

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

1.png

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

11.png 21.png

12.png 22.png

13.png 23.png

14.png 24.png

15.png 25.png

16.png 26.png

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

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

6/4

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を用いてグループ分けすると以下のようになった。

20250604-1.png

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

6/6

6/8

Main.py ーー軽量化ー> 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

1.jpg 2.jpg 3.jpg 4.jpg 5.jpg 6.jpg

6/9

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

RSRC.py (rust_score_regression_cluster.py)

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

1.png 2.png 3.png 4.png 5.png

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

6/10

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相当の殆ど錆の画像であった。 6.jpg

6/11

CNN+binning.py

今までの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='mean_squared_error' 

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

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

学習時は回帰(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)
                      CNN Backbone
            ┌───────────┐
            │ Conv2D → Pool → ...│
            └─────┬─────┘
                    ▼
            ┌───────────┐
            │ Flatten → Dense()   │
            └─────┬─────┘
                       ▼
        分類モデル            回帰モデル
     ┌─────────┐      ┌─────┐
     │ Dense(5, softmax)│      │ Dense(1) │
     └─────────┘       └─────┘
            ↓                     ↓
             argmax           float値 → binning → int

6/12

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

現時点(6/12現在)で使用している錆画像フォルダーとPythonスクリプト

                     1.png 

回帰スコアから評点の分類を行っていた。スクリプトのデフォルトでは回帰スコア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の層を厚くしても精度は変わらないことが分かった。

評点回帰スコア
12.30点以下
22.31点以上3.00点以下
33.01点以上3.40点以下
43.41点以上3.64点以下
53.65点以上

以下回帰スコア別に保存された錆画像を貼っておく

6/13

6/16

CNN+binning.py内のアンサンブル学習についての変更点

創造工房実習

4/18

 創造工房実習でI型断面等の三角形分布や塑性状態がどういう応力分布になっているのかを確認するのを忘れていたのでここに書いておく。

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

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

4/14

4/10

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)
00000
10.00014033234.49250.00018423844.0832
20.00028066168.98290.00036839188.1643
30.000420986103.4710.000552457132.243
40.000561308137.9570.000736434176.318
50.000701624172.440.000923909220.147
60.000842636206.5060.00123269241.658
70.00101987237.230.002051244.44
80.00130101257.8080.00765896243.452
90.00191133268.4320.0109555241.582
100.00377436280.5330.0148525239.658
110.0191575237.724
120.0237442235.762
130.0285207233.804
140.0333983231.819
150.0383132229.768
160.043212227.625

4/7

2/7

春休みの課題

12/20

今日はviを用いて論文に画像を貼る方法について学んだ。

12/13

今日は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

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

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

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

メッシュ長さ要素数先端変位(4隅の平均値)[mm]相対誤差(\( \frac{salome-手計算}{手計算} \))計算者
0.71554190.077226.943
0.81387340.077526.452
0.9829350.077426.614
1.1386710.076627.937森井
1.2320440.077027.273森井
1.3285990.076827.604森井
1.4239500.0764022.04米谷
1.5199980.0764122.03米谷
1.6194480.0771521.28米谷
1.7138010.0756722.79米谷
1.8126770.0773621.06沼野
1.9114640.0754623.00沼野
2106990.0740424.45沼野
335790.0841415.004國井
416280.0827916.37國井
510160.0830316.26國井
68390.0828816.26西澤
75540.0808718.28西澤
82850.0789819.20西澤
92610.0142185.49真庭
102320.0338065.51真庭
112080.0091390.68真庭

11/22

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.71719960.50682.9930.43013.141
0.81615610.50692.9990.43003.116
0.9941850.50212.0710.43013.139
1.1479980.49570.8140.41221.056森井
1.2473430.49520.7120.43003.217森井
1.3421120.49410.4880.42983.169森井
1.4389600.49370.4070.42993.193森井
1.5150410.48451.4600.42983.179米谷
1.6160710.48491.3800.42983.157米谷
1.7129330.48451.4600.42993.182米谷
1.8129930.48321.730.42983.19沼野
1.9112350.47832.730.42953.10沼野
2114560.49821.320.42963.12沼野
325140.43694.870.42933.05國井
414610.43414.200.42933.05國井
54330.280332.70.42842.83國井
63560.42832.800.343717.5西澤
71020.42602.260.222546.6西澤
8930.42602.260.112373.0西澤
9810.221254.90.42552.13真庭
10840.205158.30.42471.95真庭
11740.226054.00.42461.91真庭

11/15

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

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

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

メッシュ長さ要素数先端変位(4隅の平均値)[mm]相対誤差(\( \frac{salome-手計算}{手計算} \))計算者
0.71719960.42602.207
0.81615610.42562.115
0.9941850.41690.0719
1.1479980.41221.067森井
1.2473430.41181.166森井
1.3421120.41131.289森井
1.4389600.41121.313森井
1.5150410.39784.516米谷
1.6160710.39994.002米谷
1.7129930.39714.687米谷
1.8122030.39644.85沼野
1.9112350.39425.38沼野
2114560.39914.20沼野
325140.214121.4國井
414610.3402818.4國井
54330.135467.8國井
63560.213548.8西澤
71020.1173.6西澤
8930.11273.0西澤
9810.112573.0真庭
10840.079480.9真庭
11740.129768.9真庭

11/8

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

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

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

メッシュ長さ要素数先端変位(4隅の平均値)[mm]相対誤差(\( \frac{salome-手計算}{手計算} \))計算者
0.71073806.472.96
0.8578216.443.62
0.9576986.433.73
1.1579806.443.57
1.2521236.413.90森井
1.3455496.344.98森井
1.4269516.325.31森井
1.5169046.256.32米谷
1.6142966.207.05米谷
1.7135966.216.81米谷
1.862995.7413.9沼野
1.960015.7314.1沼野
256175.6515.3沼野
323095.4817.8國井
46173.6245.6國井
54943.8542.3國井
65812.5162.4西澤
71331.4178.8西澤
8781.2980.7西澤
9721.28880.69真庭
10601.22681.62真庭
11651.23181.54真庭

11/1

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.71551920.0837890524615.365安藤
0.81388080.0838038649115.350安藤
0.9825870.08370707398115.45兼田
1.1386710.08420120760214.95兼田
1.2319290.08368815.466柴田
1.3286210.08366915.4857柴田
1.4288540.0836815.47佐藤
1.5200150.08405215.10佐藤
1.6194480.083540293815.62皆川
1.7138010.083435509815.72皆川
1.8125280.08373315.42永山
1.9117690.08392415.23永山
2106990.08407687655915.074
335790.0841456175315.004
416280.08279416.37服部
510160.08303318.89服部
68390.08288216.26梶原
75540.08087118.28梶原
82850.07999519.20工藤
92610.07898020.22工藤
102320.08191117.26佐々木
112080.07567623.56佐々木

10/4

今日は顔合わせをした

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


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS