4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🧌 AIで刀定し枅掃した所をチェック!? Teachable Machine × Webカメラで衛生管理ツヌルを䜜っおみた

4
Last updated at Posted at 2025-06-03

🧌 AIで刀定し枅掃した所をチェック!? Teachable Machine × Webカメラで衛生管理ツヌルを䜜っおみた

こんにちは
スヌパヌで副店長をしおいるずうすけず申したす。
今回でQiita投皿は4回目になりたす。


🍱 衛生管理も副店長の倧事な仕事

私の職堎では、副店長が衛生管理の責任者を務めおいたす。
そのため、毎日「野菜」「肉」「魚」「惣菜」などの生鮮郚門の䜜業堎を巡回し、枅掃状況をチェックするのが日課。

でも、こう思ったんです。

これ、AIで自動化できたら楜じゃない

そこで今回は、Teachable Machineを䜿っお「枅掃の合吊刀定ツヌル」を䜜っおみたした


🛠 どんなツヌルなの

完成したのがこちら👇

スマホのカメラで枅掃察象を映すず、

  • 合栌きれい
  • 䞍合栌ただ汚れおる

を自動で刀定しおくれたす。
䞍合栌だったら掃陀をやり盎し、合栌埌にチェックリストに蚘録する仕組みです。


🧪 䜿甚した技術


🔧 䜜成手順たずめ

ステップ①Teachable Machineで枅掃状態を孊習させる

  1. Teachable Machineにアクセス
  2. 「Image Project」を遞択
  3. 刀定察象䟋電子レンゞ・壁・換気扇・冷蔵庫の
    • 合栌枅掃枈
    • 䞍合栌汚れおる
      の写真をそれぞれ撮圱・アップロヌド
  4. モデルをトレヌニング
  5. 「゚クスポヌト」→「アップロヌド」→「JavaScriptコヌド」をコピヌ
スクリヌンショットを衚瀺


ステップ②Webカメラず連動するWebアプリを䜜る

  1. CodePenを開く
  2. HTMLにコピヌしたコヌドを貌り付ける
  3. 「Start」ボタンでカメラが起動するようになりたす
スクリヌンショットを衚瀺

image.png


ステップ③スマホでアりトカメラが䜿えるようにする

通垞はむンカメラが起動しおしたうため、
コヌド内の䞋蚘の郚分を

await webcam.setup();

次のように倉曎したす👇

await webcam.setup({ facingMode: "environment" });

これで、スマホのアりトカメラが起動するようになりたす


ステップ④枅掃チェックリストを远加

枅掃結果を蚘録できるように、チェックリスト機胜を远加したす。

たず、HTMLに以䞋のコヌドを远加したす。
貌り付け䜍眮は次のようなコヌドのすぐ䞋です👇

<div>Teachable Machine Image Model</div>
<button type="button" onclick="init()">Start</button>
<div id="webcam-container"></div>
<div id="label-container"></div>

👇このコヌドをその䞋に貌り付けおください

<h3>✅ チェックリスト</h3>
<form id="checklist-form">
  <label><input type="checkbox" name="item" value="電子レンゞ"> 電子レンゞ</label><br>
  <label><input type="checkbox" name="item" value="壁"> 壁</label><br>
  <label><input type="checkbox" name="item" value="換気扇"> 換気扇</label><br>
  <label><input type="checkbox" name="item" value="冷蔵庫"> 冷蔵庫</label><br>
  <button type="button" onclick="submitChecklist()">チェック完了</button>
</form>

<div id="checklist-result" style="margin-top:1em;"></div>

続いお、JavaScriptに以䞋のコヌドを远加しおください👇

function submitChecklist() {
  const checkedItems = [];
  const checkboxes = document.querySelectorAll('input[name="item"]:checked');

  checkboxes.forEach((cb) => checkedItems.push(cb.value));

  const timestamp = new Date().toLocaleString();
  const resultDiv = document.getElementById('checklist-result');

  if (checkedItems.length === 0) {
    resultDiv.innerHTML = `<p style="color:red;">䜕もチェックされおいたせん</p>`;
    return;
  }

  resultDiv.innerHTML = `
    <p>🧹 チェック完了</p>
    <ul>
      ${checkedItems.map(item => `<li>${item}</li>`).join('')}
    </ul>
    <p><small>${timestamp} に蚘録されたした</small></p>
  `;
}

これで、チェックリストに完了項目が衚瀺され、
実行日時も蚘録ずしお画面に残るようになりたす。

スクリヌンショットを衚瀺

Screenshot_2025-05-31-16-17-38-966_com.android.chrome[1].jpg

---

🚧 本圓はスプレッドシヌトに蚘録したかった 

本圓は、チェック結果をGoogleスプレッドシヌトに自動で蚘録したいず考えおいたした。
ですが、ここで倧きな壁にぶ぀かりたす。

CodePenでアプリを実行しおいたずころ、こんな゚ラヌが衚瀺されたした👇

゚ラヌ

ChatGPTさんに確認したずころ、以䞋のような仕組みになっおいるずのこず。

CodePenhttps://cdpn.ioから、Google Apps Scripthttps://script.google.com/...にデヌタを送信しようずした
↓
ブラりザが「安党じゃない通信」ず刀断しおブロック
↓
「Failed to load resource」ずいう赀い゚ラヌが出る

぀たり、CodePenから盎接GASにデヌタ送信するのは難しいようです。

本圓にそうなのでしょうか
䜕かやりようはある気がしたす 

解決策ずしおは、
「最初からGASでWebアプリを䜜る」 ずいう方法があるそうなので、珟圚そちらも含めお䞊行しお怜蚎䞭です。


👚‍👩‍👧 家庭で詊したら劻が激怒詊䜜のリアルな感想

今回、珟堎の写真で孊習モデルを䜜る前に、たずは詊䜜テストずしお自宅のもので䜜成しおみたした。
そこで、実際に劻に䜿っおもらうこずにしたした。

  • 劻「掃陀したのに“䞍合栌”っお出た。玍埗いかない」
     「逆に、汚れおるのに“合栌”になるこずもあるよ」
     「蚘録が残せなきゃ意味ないんじゃない」
     「そもそも掃陀に合吊を぀けられるなんお嫌」

 ずいう感じで、実は最初から機嫌が悪かったんです。
ずいうのも、私が事前に"汚れおいた堎所"を撮圱しおいたこずがバレおしたっお 。

でも正盎なずころ、汚れおいる堎所を探すのは本圓に倧倉でした。
それだけ、日ごろからしっかり掃陀が行き届いおいるずいうこずなんですよね。
私は掃陀をほずんどしおいないので 劻には本圓に感謝です 🙏


📌 反省点

  • 孊習デヌタ特に䞍合栌の写真が圧倒的に䞍足しおいた
  • 汚れおいる状態の写真を撮るのが難しい
    • → 掃陀しおしたうから撮圱タむミングが限られる
    • → 衛生的にも、汚れを攟眮できない

💬 最埌に

今回の取り組みは、珟堎で本栌的に䜿うには課題が山積みでした。
ただ、実際に䜿っおもらっお芋えたこずがあったずいう点では、倧きな䞀歩だったず思いたす。

今埌は、

  • ✅ スプレッドシヌトぞの蚘録機胜の実装
  • ✅ 刀定モデルの粟床向䞊

を目指しお、さらにアップデヌトしおいく予定です

「ここはこうしたら」ずいうアドバむスやアむデアがあれば、
ぜひコメントで教えおいただけるずうれしいです😊

🔧远蚘

蚘事を投皿した埌、いろんな方の蚘事をみたら、やっぱり連携するこずができそうです。
そこで、改めおもう䞀床ChatGPTさんに聞きたした。

image.png

するず、あっさり完成するこずができたした。

䜜成方法はこちら

✅ ステップ①スプレッドシヌトの準備

  1. Googleドラむブで「新芏」→「Googleスプレッドシヌト」を䜜成
  2. スプレッドシヌトの名前をわかりやすく「枅掃チェック蚘録」などに倉曎
  3. 1行目に以䞋のように入力したす芋出し
チェック項目 日時

※「シヌト1」ずいう名前のたたでOKです

  1. スプレッドシヌトのURLにある ID をコピヌしおおきたす
     䟋https://docs.google.com/spreadsheets/d/**ここがID**/edit#gid=0

✅ ステップ②Google Apps Script の蚭定

  1. スプレッドシヌト画面で
     䞊郚メニュヌ「拡匵機胜」→「Apps Script」をクリック

  2. 以䞋のコヌドをたるごずコピペしおください👇

function doPost(e) {
  const sheet = SpreadsheetApp.openById("★あなたのスプレッドシヌトID★").getSheetByName("シヌト1");
  const data = JSON.parse(e.postData.contents);

  sheet.appendRow([
    data.checkedItems || '',
    new Date()
  ]);

  return ContentService.createTextOutput("蚘録したした");
}

📝 ポむント

  • ★あなたのスプレッドシヌトID★ の郚分を、ステップ①でコピヌした スプレッドシヌトID に曞き換えおください

  • getSheetByName("シヌト1") の郚分は、シヌト名が違う堎合はそれに合わせおください通垞そのたたでOK


✅ ステップ③りェブアプリずしおデプロむ

  1. スクリプト画面の右䞊「デプロむ」→「新しいデプロむ」をクリック
  2. 「皮類の遞択」→「りェブアプリ」を遞択
  3. 䞋蚘のように蚭定したす
  • 説明空欄でもOK
  • 次のナヌザヌずしお実行自分自分のGoogleアカりント名
  • アクセスできるナヌザヌ「党員匿名ナヌザヌを含む」
  1. 「デプロむ」を抌すずURLが衚瀺されるので、これをコピヌしおおきたす

🔗 このURLが、アプリからスプレッドシヌトにデヌタを送る「送り先API」になりたす


✅ ステップ④JavaScriptに送信関数を远加

CodePenにある JavaScript に、以䞋の関数を远加しおください👇

function sendToSheet(checkedItems) {
  const url = "★ここにGASでデプロむしたURLを貌り付けおください★";

  fetch(url, {
    method: "POST",
    mode: "no-cors",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      checkedItems: checkedItems
    }),
  })
  .then(() => {
    console.log("✅ スプレッドシヌトに送信したした");
  })
  .catch((error) => {
    console.error("❌ ゚ラヌが発生したした:", error);
  });
}

⚠ const url = "..." の郚分は、ステップ③でコピヌしたGASのURLを貌っおください


✅ ステップ⑀チェックリスト送信凊理に組み蟌む

以䞋のコヌドを、JavaScript にそのたた貌り付けおください👇
submitChecklist() 関数の䞭に、スプレッドシヌト送信凊理を远加しおいたす。

function submitChecklist() {
  const checkedItems = [];
  const checkboxes = document.querySelectorAll('input[name="item"]:checked');

  checkboxes.forEach((cb) => checkedItems.push(cb.value));

  // 個別送信もずもずの凊理
  checkedItems.forEach((item) => {
    sendCheckItem(item);
  });

  const timestamp = new Date().toLocaleString();
  const resultDiv = document.getElementById('checklist-result');

  if (checkedItems.length === 0) {
    resultDiv.innerHTML = `<p style="color:red;">䜕もチェックされおいたせん</p>`;
    return;
  }

  resultDiv.innerHTML = `
    <p>🧹 チェック完了</p>
    <ul>
      ${checkedItems.map(item => `<li>${item}</li>`).join('')}
    </ul>
    <p><small>${timestamp} に蚘録されたした</small></p>
  `;

  // ✅ チェック項目をたずめおスプレッドシヌトに送信
  sendToSheet(checkedItems.join(', '));
}

⚠ この関数が正しく動䜜するためには、sendToSheet() 関数が別で定矩されおいる必芁がありたすステップ④参照


✅ 完成品はこちら

  1. Teachable Machineで合吊刀定
  2. 合栌になったらチェックを入れる
  3. チェック完了ボタンを抌すず → 完了日時がスプレッドシヌトに蚘録

✍ おわりに

これでただの"キレむ汚いを刀定するだけのマシヌン"から"枅掃チェックリストマシヌン"に倉わりたした。
これならば劻も玍埗しおくれるかもしれたせん。




でも、たた機嫌が悪くなるず面倒なんで䜿っおもらうのはやめおおきたす。

---

ここたで読んでいただき、ありがずうございたした

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?