ハッカソンで、スマホで撮影した画像を解析し、食事・食品の栄養素の情報を自動で表示するアプリケーションを作成しました。

<h1>開発の概要</h1>

一つの画像を読み取って、その食品の栄養素の情報をテーブル形式で表示してくれるアプリケーションを作成し、会場で発表を行いました。終わった後、まだ改善の余地があるなと思い、実用的になれるよう、色々機能を追加してみました。改良版では、朝、昼、夕食の3食の画像を読み取れるようにし、場合によっては、おやつや夜食をユーザーでフォームを追加できるようにし、その読み取った食品の画像の合計カロリーを算出し、基準と比較し、足りるかちょうどいいか不足しているかを判定してくれるアプリに改良しました。


<h1>開発の背景と目的</h1>
元々機械学習のモデルを組み込んだアプリケーションを作りたいと思っていました。そこで、「あすけん」という健康管理アプリを使っている友人に、撮影した定食の画像の結果が全くものが出て、いちいち自分で入れ直すのが、面倒で使うのをやめたという声を聞きました。私は、この読み取りの部分を転移学習でモデルを改良すれば、読み取れなかったものも読み取れるようになれるのでは？？と考え今回「おむくん」を作ろうと決意しました。


<h1>使用した技術</h1>

- Python (バックエンド), Flask (バックエンド) 
- YOLOv8（物体検出モデル）
- MySQL（データ管理）
- JavaScript + HTML/CSS（フロントエンド）


<h1>初期バージョンの概要</h1>

1枚の画像を読み取り、そこに写っている食品の栄養素をテーブル形式で表示する機能を実装しました。これにより、ユーザーは簡単に食品のカロリーや栄養情報を確認できるようになります。


## おむくんの機能の一連の流れ

 ### ① 画像を読み取る(スマホでは、自分で撮影して、その内容を読み取らせることも可能)


#### 今回はこの画像を読み取らせてみる
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825496/530ce0b9-2a7d-4aaa-a22a-55370e12c4e6.jpeg
" width=50%>

#### さっきの画像が保存された状態
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825496/3b2d8d18-135b-4aca-8f7e-f33ed116a61a.png
" width=50%>


### ② 解析ボタンを押す
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825496/46d39fde-b210-4e78-806c-184663377f71.png
" width=50%>
### ③ 画像の食品・食材の栄養素の情報をテーブル形式で表示される。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825496/24fa28ab-53bf-4539-864c-0f4021054770.png
" width=50%>


<h1>改良バージョンの概要（追加機能と改善点）</h1>
改良版では、以下の機能を追加しました。

- 3食の画像を読み取れるように改善（朝・昼・夕食の管理が可能）
- 合計カロリーを算出し、基準値と比較して「足りない・ちょうどいい・超過」などを判定する。
- ユーザーが3食以外の食事をとったときを考慮し、ユーザー自身がフォームを追加できる仕組みを導入（おやつや夜食の記録が可能に）。さらに追加したフォームの分のカロリーもしっかり計算されるようし、正確な結果を取得可能にしました。

これらの追加機能によって、ユーザーが1日単位で食事のカロリーや栄養バランスを把握できるようになりました。



## 改良おむくんの機能の一連の流れ

### ① 食事画像のアップロード
ユーザーは「朝食」「昼食」「夕食」のそれぞれの画像をアップロードする。場合によっては、追加の食事（おやつ・夜食）を記録する場合、新しくフォームを追加。

![スクリーンショット 2025-02-28 174501.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825496/a3005d6e-101e-4da7-9886-2df9de36d52c.png)


#### 今回はおやつを追加してみる
![スクリーンショット 2025-02-28 174535.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825496/d8e313f8-92f5-445f-b045-3eff0342d936.png)

#### おやつのフォームが追加された
![スクリーンショット 2025-02-28 174557.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825496/2f83d233-5fb7-4f7f-9bc6-3abd5ccc2f9c.png)



### ② 画像解析とカロリー計算
アップロードされた画像を解析し、食事の五大栄養素とそれぞれの処理のカロリー表示と合計カロリーの計算を行う。

#### 画像を保存された状態。これでさっきと同じように解析ボタンを押す。
![スクリーンショット 2025-02-28 174617.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825496/5a13b6df-8936-4d3a-934a-0020c8c8950f.png)





### ③ １日の総カロリーを表示し、基準値との比較と判定
今回は成人男性を基準値とし、計算された総カロリーと基準値を比較し、以下の3つの判定を表示する

- 「足りない」：摂取カロリーが基準値を下回る
- 「ちょうどいい」：摂取カロリーが基準値に近い
- 「超過」：摂取カロリーが基準値を超える

### 結果画面
![スクリーンショット 2025-02-28 174846.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825496/cca1d650-07fc-4649-97d4-0ee2d0c75e7c.png)

![スクリーンショット 2025-02-28 174859.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825496/0cdaa01c-ce46-4fb1-bdf3-479e40287f58.png)

![スクリーンショット 2025-02-28 174910.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825496/2eef0cd1-f9d6-4215-ae57-2f0baf2b6973.png)

![スクリーンショット 2025-02-28 174923.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825496/d8d4f307-76b7-462b-a734-e84e02cd60ed.png)

![スクリーンショット 2025-02-28 174935.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825496/afe9e5ef-2fcc-420d-99b2-f2086bc9eded.png)



<h1>反省点</h1>

今回の審査基準には「新規性」が含まれていました。これは 「誰も生み出したことのないアイデアで、この世に存在しないものを作り出しているか」 という観点です。しかし、私のアイデアはすでに 「あすけん」 など、類似したアプリが多く存在しており、新規性を強く打ち出すことができませんでした。そのため、私は 「類似アプリの改良」 に注力する形にならざるを得なかったと感じています。
この点について振り返ると、

- アイデアの深掘りが足りなかった(独自のアプリにするにはどうすべきか)
- 開発経験が不足していたため、技術的な工夫を加えられなかった。
- 画像読み取りで、視野の狭さによって、yolov8以外の画像読み取りに目を向けることができなかった。（最新版のYOLOv11が出ている可能性がある）

が課題だと考えられます。

今後は、さらに多くの開発に挑戦し、技術力を高めるだけでなく、課題解決の視点を深めることを意識します。また、常にアンテナを張り、幅広い情報を取り入れながら、開発経験を積み重ね、新規性のあるアイデアを生み出せるようにします。



<h1>今後の展開</h1>
もし、「おむくん」をさらに改良するなら、

- 食品認識の精度向上（YOLOv11の導入や自分で食品識別に特化させたモデルを一から作る）
- ユーザーごとの食事履歴管理機能（日ごとの食事データを保存し、振り返りをしやすくする）
- UI向上（視野的な分かりやすさを追求するために、棒グラフや五角形グラフを導入）
- AIによるおすすめ食品の提示　（カロリーだけでなく、それぞれの栄養素を合計して、不足している栄養素に応じたおすすめ食品を提示）

これらを導入したいと思っています。



<h2>（補足）機械学習の転移学習について</h2>

今回は、2週間という短い時間の中で、確実に成功させたい思いがあったので、「ご飯」「味噌汁」「唐揚げ」「千切りキャベツ」この4つを識別できるように100 × 4 = 400枚の画像を収集し、ラベリングをし、転移学習させました。


<h1>ラベリングとは？</h1>

学習させる前に、ラベリングという作業が必要になります。これは、機械学習モデルが学習できるようにデータ（画像など）に正しい分類を付与する作業のこと。
今回では、食品の画像を1枚ずつ収集し、その画像が、「ご飯」「味噌汁」「唐揚げ」「千切りキャベツ」 のどれに該当するのかを手動でラベル付けしました。バウンディングボックスという領域を画像に付与し、例えば、ご飯ならこの領域にありますよとモデルに伝える作業がラベリングということになります。



### 例 唐揚げの画像をラベリングする場合
![スクリーンショット 2025-02-28 17.17.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825496/36c73f1e-85ec-432b-a92d-740c19954839.png)

唐揚げのある部分に領域(バウンディングボックス)を作成し、唐揚げ()という情報を保存しています。




<h1>転移学習後の結果は？</h1>

転移学習させたモデルを使って唐揚げ定食を識別できるかやってみました。
### この画像を読み取らせる
![Image (5).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825496/cbe1ca59-b942-4089-96c2-f8badd2845df.jpeg)


### 通常のyoloモデルで唐揚げ定食を読み取った場合
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825496/c11a35cf-a76f-4d00-a9ca-c064fab27943.jpeg
" width=100%>
全く関係ない結果が出てしまっている。。。


### 転移学習させたモデルを用いて唐揚げ定食を読み取った場合（同じ画像を読み取らせました）
![スクリーンショット 2025-02-28 170245.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825496/efca65fa-1c7e-46a9-8271-ed32e091ab03.png)
唐揚げやご飯、味噌汁だけでなく、唐揚げの個数までもしっかりと識別されている！！！


<h1>転移学習させたモデルの精度は？</h1>

![スクリーンショット 2025-02-28 165524.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825496/af45330b-3064-44a3-bd1f-4f7a492e4cd0.png)



今回のモデルの精度は約67%でした。
初めての機械学習にしては、高い精度を出すことに成功しました。しかし、元々は、80%を目指していたので、なぜ精度が80%にいかなかったのが、自分なりに分析してみました。

- 似たような画像が多かった：
    - 今回googleから収集した画像に加え、自分で撮影した画像も入れてみました。しかし、撮影した画像の 光の当たり方や角度が似通っていた ため、モデルの汎化性能が低くなってしまいました。より多様な環境で撮影 すれば、より柔軟な識別が可能なった、すなわち精度向上につながると思いました。
- そもそも100枚では少ない：
    - 特に機械学習モデルにおいては、データの量が精度に大きく影響されます。データが増えれば増えるほど、識別の精度は向上 するため、今後の課題としてデータ量の確保が重要だなと考えました。



<h1>今後精度を上げるには？</h1>

- YOLOv11の導入：
    - YoLOの最新版がv8までと思っていました。審査員の方にYOLOv11の最新版が出ているからそっちを使用すれば精度が上がるかも。と教えていただきました。自分で最新版に気づけなかったのは、情報収集不足だなと思いました。
- データセットの増加と多様化させる：
    - 画像枚数を増やし、 さまざまな角度や光の条件で撮影したデータを追加する。これにより、識別に柔軟性を持たせることができる、すなわり精度向上につながるのかなと思いました。
- 食品識別に特化した独自モデルの作成：
    - 今回は 機械学習モデルの作成だけでなく、フロントエンドやバックエンドの開発も並行 して行ったため、 一から独自のモデルを作成する時間がなかった。今後、時間が確保できれば、 食品識別に特化した独自モデルの作成にも挑戦 し、より高精度な分類を実現したいと思います。



<h1>まとめ</h1>

ハッカソン自体、初出場で、不安と緊張でいっぱいでしたが、なんとか最後まで作品を作り、無事に発表を終えることができました。
今回の経験を通じて、多くの学びがあり、自分の課題も明確になりました。
2025年は、自分の限界に挑戦する！そして、リスクを積極的にとって、成長する1年にしたいと思います。これからも様々なことに挑戦したいと思います！さらにスキルを磨いていきます！


<h1>作品のコード</h1>
コードを載せておきます。


作品のコード： https://github.com/annyouu/openHacku2025-improvement