微生物検査にAI導入!?　機械学習であなたも熟練の検査員に

こんにちは、仕事で食品検査を担当しています。
入社してまもなく半年、デジタルに関する知識はほぼ０ですが、家の遠い私が定時で帰宅するために業務の効率化ができないか模索中です。

前回の記事はこちら↓

https://qiita.com/mhsc/items/d4538fd699bd81aee3db

今回もデジタルで解決できそうな課題があったのでご紹介します。

# 1. 取り組み背景
突然ですが、私は食べることが大好きです！笑
みなさんも毎日食べ物を食べますよね！
私は、食品の品質検査の中でも微生物検査に従事しています。
食品が衛生的に作られたか、人に危害を与える食中毒菌は存在しないかなどを調べ、みなさまに安心して食事を楽しんでもらうための仕事です。

しかし、この**微生物検査**、現状ほぼほぼ人力で行われています。
簡単な検査の流れをお伝えします。
![スクリーンショット 2022-09-18 9.57.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/94b45927-c52b-28cb-352d-f8b97627bb10.png)



一部、菌数測定のところでは[自動コロニーカウンター](https://www.shashin-kagaku.co.jp/skp/sales/acc/)を使用することがありますが、それ以外の工程は全て手作業、目視による確認で行われています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/79979dfe-9780-58e0-93da-40b1e7396fde.png" width=30%>

特に測定や判定は、検査員の経験や技術が必要とされ、ぺーぺーの私はまだまだ力不足で役に立ちません…
こんなマンパワーで成り立っている職場ですが、デジタルの力を使って私も先輩方の役に立ちたい！
そして早く帰りたい！（笑）

そんなこんなで思いついたのが「<font color="Red">**画像認識AIによる判定**</font>」です！

熟練の技術が必要とされる工程に、画像の機械学習ができるツールを用いて、人間の代わりをしてもらおうというアイデアです。
新人、ベテラン問わず**誰が担当しても同じ結果**が得られますし、
現在この「判定」は２名の検査員でダブルチェックを行っていますが、AIの判定と目視の判定を照合するというフローになれば**人員・時間削減**にも繋がります。

というわけで、早速作ってみました！
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">サルモネラ判定AIモデル in TSI培地<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a><a href="https://twitter.com/hashtag/%E5%BE%AE%E7%94%9F%E7%89%A9%E6%A4%9C%E6%9F%BB?src=hash&amp;ref_src=twsrc%5Etfw">#微生物検査</a><a href="https://twitter.com/hashtag/TeachableMachine?src=hash&amp;ref_src=twsrc%5Etfw">#TeachableMachine</a> <a href="https://t.co/mE5pXvHScG">pic.twitter.com/mE5pXvHScG</a></p>&mdash; hosaka (@Rhosaka21) <a href="https://twitter.com/Rhosaka21/status/1572499048401338372?ref_src=twsrc%5Etfw">September 21, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



# 2. 使用ツール
[Teachable Machine](https://teachablemachine.withgoogle.com/)
[Node-RED](https://nodered.org/)
[Make](https://www.make.com/en)
[Google Sheets](https://www.google.com/intl/ja_jp/sheets/about/)

# 3. 実施内容
## 3.1. 検査概要
今回は感染すると腹痛、下痢などを発症してしまう食中毒菌の１種、「**サルモネラ**」の確認試験のうち、TSIという培地の判定に取り組みました。
サルモネラや培地の説明をすると長くなってしまうので、ざっくりとしたイメージを持っていただければと思います。
<img src="
https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/e04430f2-ea22-0c52-3042-ad856eacf6ba.png" width=80%>
この、**微生物の種類によって変化する培地の色**を識別して判定を行っていきます。

培地の組成や反応原理に興味のある方はこれらの記事を参考にしてください。



https://www.pref.kanagawa.jp/sys/eiken/002_kensa/02_microbe/baiyou.htm#:~:text=TSI%E5%9F%B9%E5%9C%B0%EF%BC%88Triple%20Sugar%20Iron%20Agar%EF%BC%89%E2%80%95%E9%AB%98%E5%B1%A4%E6%96%9C%E9%9D%A2%E5%9F%B9%E5%9C%B0&text=%E7%A1%AB%E5%8C%96%E6%B0%B4%E7%B4%A0%EF%BC%88H2S,%E5%BC%B7%E3%82%A2%E3%83%AB%E3%82%AB%E3%83%AA%E3%81%A7%E3%81%AF%E8%A7%A3%E9%9B%A2%E3%81%99%E3%82%8B%E3%80%82


https://miintt.com/food-designer-salmonella-inspection-tsi




## 3.2. モデルの作成
[Teachable Machine](https://teachablemachine.withgoogle.com/)にアクセスし、「使ってみる」→「画像プロジェクト」→「標準の画像モデル」を選択します。
Classに名前をつけ、その場でWebカメラで撮影するか、保存してある画像をアップロードする、たったこれだけです！

::: note info

撮影時のポイント  
背景は白地にするなど、ごちゃごちゃしていない方が精度がよくなると思われます！
:::
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/53c96b5d-c4e5-0ffa-213e-7840ab9ffcf1.png" width=70%>

Class名＝出てくる判定ワードは、実際の判定を紙に記入する形式ではなく、一目で結果がわかりやすいものにしています。

もう一つオススメなのが、「準備中」のClassを作ることです。
認識したいものと次の認識したいものの間に、関係ない判定ワードが出るのがスマートではなかったので、判定と判定の間用に使えるモデルも作成しました。

画像が準備できたら「トレーニング」開始です。
これでモデルが作成できます。

## 3.3. Node-REDでモデルをシステム化
まず、Node-REDで必要なノードを追加します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/704183c4-1b3c-58a6-469c-62f6e6106064.png" width=70%>


次にTeachable Machineで、トレーニング済みのモデルをアップロードします。
ここで出てくるリンクをコピーし、Teachable Machineノードをダブルクリックし、Url欄に貼り付けます。

写真のようにノード同士をつなぎ合わせてカメラボタンを押すと、、、
見事に判定してくれました！（写真オレンジの四角の下「**100%サルモネラ？H2S(+)**」）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/c62e63d8-7cb1-ae29-466d-8e288b36f9cf.png" width=80%>
ここまでで、写真を撮ったらそれが何に該当するか判定してくれるシステムが完成しました。

## 3.4. Makeと連携させて、AIと人間による判定システムを構築
続いて、実際の検査実施方法に近づけるため、Class名に登録した全体の結果ではなく、目視で検査員が判定する時と同様の方法でGoogle Sheetsに記入できるようにしました。
＜記入項目：斜面部（培地上部）の色、高層部（培地下部）の色、硫化水素を産生能力の有無（黒変の有無）＞

<details><summary>Node-REDとMakeの連携</summary>
①Makeで「Custom webhook」のモジュールを追加

②Addボタンを押して、Webhook nameに任意の名前をつけてSaveボタン
③Webhookで欲しい情報を自分で定義づけするため、出てきたURLを、ChromeやSafariなどの新しいタブを開き貼り付ける
④URLの後ろに「?判定するもの=結果」のような形で定義する
 ここでは`URL?TSI=サルモネラ陰性`としています。
⑤enterを押すと「Accepted」の表示になり、MakeモジュールのURLの下部にも「Successfully determined」と表示される
![スクリーンショット 2022-09-25 23.51.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/6b7b703c-1865-5f03-a138-13b0fcfe4c74.png)
⑥Node-REDの各ノードをつなげ、中身の設定をする
　http requestノードのURLは「？〜」の部分消してOK
![スクリーンショット 2022-09-26 0.07.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/2ce94894-3da5-8942-21ad-fcd4a822e533.png)

</details>

<details><summary>Google Sheetsの準備</summary>
４つのシートを用意しました。

![スクリーンショット 2022-09-26 0.31.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/b95336ee-8d12-12d4-36df-aafba4174d81.png)
Rは赤色、Yは黄色、＋は黒色、ーは黒色ではないことを示します。
AI判定用のところに自動で結果が入るよう、このあとMakeの設定をします。
検査員目視判定用はプルダウン形式で入力できるようにしました。
最終結果用は、AI判定のシートと目視判定のシートの値が同じであればAI判定用のシートの結果を、違っていれば「✖️」が入るようにしします。
E列には問題がなければ何も記入されず、３つの判定項目のうち1つでも異なる点があれば再判定を要求するように関数を設定しました。
</details>

Node-REDを起動させて得た結果を、MakeのWebhookで受け取って、結果に応じた判定をGoogle Sheetsに記入します。

Makeの完成図
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/c47adfc8-c8c6-6648-bd9e-b0126f5ea5e0.png" width=40%>
本当は「Search Rows」などを使ってかっこよくやりたかったのですが、わからなかったため、必殺！力任せ！笑
６つの結果ごとにフィルターをかけて、それぞれ新たな行に結果を記入させます。
フィルターと「Add a Row」モジュールの中身の例
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/57100e0e-903b-756b-6f7b-4d3da9e73c45.png" width=50%>
MakeのSCHEDULINGをONにします。
準備は整いました！
**いざ、Node-REDのcameraボタンで撮影！**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/f02a8902-ea50-8ab3-e40c-fc02e99d18dd.png" width=70%>
<font color="Red">**成功です！**</font>
嬉しい！

実際の判定をするときのPC画面イメージです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2792410/504839aa-911e-0fd5-1181-5c9cc1cc50fa.png" width=80%>
（Node-REDの画面で判定結果が見えてしまうと先入観で判定してしまう恐れがあるので、他のノードを重ねて判定文字部分隠すとよいかもしれません）


# 4. まとめ・今後の課題
この培地単独でしたら、現場で使えそうなところまで持っていくことができました。
しかし、実際には他の培地の結果も見て総合的に最終判断を下すため、その総合的な判定をどうさせるかという点と、Node-REDの撮影に３秒ほどかかるため、本当に時間削減できるか微妙という課題が残りました。

試作品を先輩方にみせたところ、
「すごい、こんなのできるの!?」
「近未来みたい」
「ちょっとついていけない…」
「すごく微妙な色の変化を見る必要がある他の培地もあるけどいける？」
「色の見え方は人それぞれだから、きちんと判定できるなら使えるかも」
などなど、たくさんのご意見をいただきました！

Teachable Machineの認識レベルの限界はわかりませんが、微生物試験にはたくさんの培地があります。
何度も学習させて精度をあげるのはもちろんのこと、認識できるもの、判定には使えないものをしっかり吟味して、いつか実際に使えたらなーなんてもくろんでいたりいなかったりしています。


ちなみにほぼ手作業とお伝えした微生物検査ですが、先端技術を利用している記事があったのでご紹介します。
完全自動化はなかなか難しいですが、検査室にも少しずつ技術を取り入れて、より正確で効率的な検査ができたらいいですね！



https://youtu.be/_yssPriBUsc



https://youtu.be/onZ8WZbxP8Y



https://www.asahiinryo.co.jp/company/newsrelease/2021/pick_1223.html

新入社員の挑戦はまだまだ続きます。
最後までお付き合いいただき、ありがとうございました！