ホテルの朝食ビュッフェの料理台を定時に撮った写真から、残りの少ない料理と空の皿を見分け、厨房への補充の連絡とピーク時の補充の遅れの記録を作る
朝食ビュッフェの料理台を定点で撮った写真から、残りの少ない料理と空の取り皿を見分け、厨房の持ち場ごとに補充を知らせます。検知から補充までの時間を記録し、ピークの遅れを集計します。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/Power Automate
- 対象業界
- 宿泊/飲食
- 対象部門
- 総務
- 対象業務
- 内容確認・チェック/集計・分析
- 主な課題
- データ分析に時間がかかる/人手が足りない/期限・対応漏れが起きる
- AIで行う処理
- 画像認識
- 主な効果
- 対応スピード向上/工数削減/機会損失防止
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- ホールの担当が、決まった間隔で料理台の島を順に回る
- 料理ごとに残りの量を目で見て、少ないものを覚える
- 取り皿・カトラリー・グラスの残りも見る
- 島の近くの内線か、厨房の入口まで行って、持ち場の料理人に補充を頼む
- 紙の補充の記録表に、頼んだ時刻と料理を書く
- 補充された料理を料理台に置く(厨房の担当か、ホールの担当)
- 朝食の後、記録表を事務所に戻す
- 自動料理台の島ごとの定点のカメラが、5分ごとに静止画を Google ドライブのフォルダに保存する
- 自動Google Apps Script が5分ごとに起動し、新しい写真を取り出す
- 自動写真と、その島の配置表(料理の位置と補充の線)を Gemini API に渡し、料理ごとの残りの区分と取り皿の残りを返させる
- 自動配置表の補充の線と比べ、補充が要る料理を決める
- 自動厨房の持ち場ごとの Google Chat のスペースに、島・料理・残りの区分を知らせる
- 人厨房の担当が補充を用意し、ホールの担当か厨房の担当が料理台に置く
- 自動次の写真で残りの区分が戻ったら「補充済み」とし、検知から補充までの時間を記録する
- 自動2回続けて補充されていなければ、ホールの責任者のスペースにも知らせる
- 人ホールの責任者が、知らせの一覧で誤りに気づいたら訂正する
- 自動朝食の終了後、料理ごと・時間帯ごとの遅れを集計した日報を作る
各工程の詳しい説明を読む
- ホールの担当が、決まった間隔で料理台の島を順に回る
- 料理ごとに残りの量を目で見て、少ないものを覚える
- 取り皿・カトラリー・グラスの残りも見る
- 島の近くの内線か、厨房の入口まで行って、持ち場の料理人に補充を頼む
- 紙の補充の記録表に、頼んだ時刻と料理を書く
- 補充された料理を料理台に置く(厨房の担当か、ホールの担当)
- 朝食の後、記録表を事務所に戻す
(a)見回りの間隔が、混む時間ほど空く。 2番目と3番目の見回りは、席の案内や下げ物と同じ人が行います。客が多い時間ほど料理は早く減り、見回りの間隔は逆に空きます。 必要な時間ほど見られていない、という形です。
(b)頼み方が人によって違う。 「パンが少ないです」と頼むか、「クロワッサンが残り3個です」と頼むか。厨房は、何をどれだけ用意すればよいかを聞き返すことになり、補充が遅れます。
(c)記録が残らない。 紙の記録表は、忙しい時間ほど空欄になります。いちばん記録が欲しいピークの時間に、記録がありません。 書かれていても、頼んだ時刻だけで、補充された時刻は書かれていません。
(d)遅れの原因が話し合えない。 補充が遅れたのは、頼むのが遅かったのか、厨房の仕込みが間に合わなかったのか。記録が無いので、朝の振り返りの会議でも「忙しかった」で終わります。
- 【自動】 料理台の島ごとの定点のカメラが、5分ごとに静止画を Google ドライブのフォルダに保存する
- 【自動】 Google Apps Script が5分ごとに起動し、新しい写真を取り出す
- 【自動】 写真と、その島の配置表(料理の位置と補充の線)を Gemini API に渡し、料理ごとの残りの区分と取り皿の残りを返させる
- 【自動】 配置表の補充の線と比べ、補充が要る料理を決める
- 【自動】 厨房の持ち場ごとの Google Chat のスペースに、島・料理・残りの区分を知らせる
- 【人】 厨房の担当が補充を用意し、ホールの担当か厨房の担当が料理台に置く
- 【自動】 次の写真で残りの区分が戻ったら「補充済み」とし、検知から補充までの時間を記録する
- 【自動】 2回続けて補充されていなければ、ホールの責任者のスペースにも知らせる
- 【人】 ホールの責任者が、知らせの一覧で誤りに気づいたら訂正する
- 【自動】 朝食の終了後、料理ごと・時間帯ごとの遅れを集計した日報を作る
人の見回りは、無くしません。 料理台の汚れ、こぼれ、客の困りごとは写真では拾えません。ただし、残りの量を確かめるための見回りは、知らせを受けて動く形に変わります。
5番目で知らせる先を持ち場ごとに分けるのが、この構成の要です。 1つのスペースに全部の知らせを流すと、厨房の担当は自分の持ち場の知らせを探すことになります。パンの持ち場にはパンの知らせだけを送ります。
02今回想定するシステム構成
料理台の島ごとの定点カメラ(5分ごとの静止画) │ Google ドライブの島ごとのフォルダに保存 ▼【トリガー】Google Apps Script の時間主導型トリガー(5分ごと) Google Apps Script ├── 配置表(スプレッドシート)── 料理の位置/補充の線/持ち場 ▼ Gemini API ── 料理ごとの残りの区分(full/half/low/empty/not_visible) │ 取り皿の残り、配置表に無い器の有無 ▼ Google Apps Script ── 補充の線と比べる/前回の知らせとの重複を除く ├──▶ Google Chat(持ち場ごとのスペース)── 補充の知らせ ├──▶ 知らせの一覧(スプレッドシート)── 検知・知らせ・補充済みの時刻 └──▶ 朝食後の日報(料理ごと・時間帯ごとの遅れ)
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 処理 | Gemini API(料理ごとの残りの区分と、取り皿の残りの判定) | Claude API、OpenAI API |
| 連携 | Google Apps Script(写真の取り出し、呼び出し、補充の線との比較、知らせ、記録、日報) | Make、Power Automate |
| 連携 | Google Chat(持ち場ごとのスペースへの受信 Webhook) | Microsoft Teams |
| 連携 | Google スプレッドシート(配置表、知らせの一覧、日報) | Microsoft Lists |
| 撮影 | 料理台の上を写す定点のカメラ | スタンドに固定したタブレット |
| 保管 | Google ドライブ(島ごとの写真のフォルダ) | Microsoft OneDrive |
カメラの静止画をドライブのフォルダに保存する部分は、カメラの機種に合わせた個別の作り込みになります。 静止画をクラウドに保存する機能を持つ機種もあれば、小さなPCで定期的に静止画を取り出して保存する形もあります。この構成は、写真がフォルダに入ってから先を扱います。
判定の土台は、Gemini API の画像理解です。 対応する形式は PNG、JPEG、WEBP、HEIC、HEIF で、1回のリクエストに複数の画像を入れられます。 画像を直接入れる場合、指示などと合わせたリクエスト全体が20MBまでです。料理台の写真1枚と配置表の文なら、十分に収まります。 物体の位置は box_2d として [ymin, xmin, ymax, xmax] の形で、0から1000に正規化した座標で返せます。
呼び出しは、Interactions の書き方で行います。 公式のページの例は、POST https://generativelanguage.googleapis.com/v1beta/interactions を使っています。構造化出力も、response_format に mime_type: "application/json" とスキーマを入れて指定します。
定時の起動は、Apps Script の時間主導型トリガーで行います。 分単位の間隔は1・5・10・15・30分から選べ、この構成では5分を使います。 トリガーは作った人のアカウントで動き、起動の時刻は少しずれることがあります。
03どうやって実装するのか
処理の起点を決める
時間主導型トリガーを5分ごとに動かし、朝食の時間だけ処理します。 トリガー自体は終日動きますが、スクリプトの最初で時刻を見て、6時20分から10時10分の外なら何もせずに終わります。 開場前の10分は、料理を並べ終えた状態を「満杯」の基準として撮るためです。
5分を選んだのは、写真の間隔と合わせるためです。 カメラも5分ごとに撮り、スクリプトはその間に入った写真を処理します。1分ごとに動かしても、新しい写真が無ければ空振りになります。 起動の時刻は少しずれることがあるため、写真は撮影の時刻で並べ、スクリプトの起動の時刻では並べません。
1回の実行は6分までです。 2会場で島が7つなら、1回に処理する写真は7枚です。1枚ずつ呼び出しても6分には十分に収まりますが、念のため、処理しきれなかった写真は次の実行に回します。
トリガーの1日の合計の実行時間には上限があります。 Google Workspace のアカウントで1日6時間、一般のアカウントで90分です。この構成は Google Workspace のアカウントで動かします。 持ち場ごとのスペースへの受信 Webhook も、Business か Enterprise の Google Workspace のアカウントが要ります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 料理台の写真 | 島ごとの定点の静止画。撮影の時刻 | Google ドライブの島ごとのフォルダ |
| 配置表 | 島、料理の名前、写真の中の位置(枠)、補充の線、補充にかかる目安の時間、持ち場 | スプレッドシート |
| 開場時の写真 | その日の開場前の、並べ終えた状態の写真 | 同じフォルダの最初の写真 |
| 献立の差し替え | その日だけ入れ替えた料理と位置 | 配置表の「本日」の列 |
| 朝食の予定人数 | 日ごとの朝食の予定人数 | 宿泊の予約の管理システムから担当者が転記 |
質を決めるのは、配置表の位置の枠です。 料理の位置を枠で決めておけば、AIは「この枠の中の料理の量」だけを答えればよく、料理の名前を写真から当てる必要がありません。 枠は、カメラを据え付けたときに、開場前の写真の上で1回だけ引きます。
開場時の写真を渡すのは、「満杯」を料理ごとに示すためです。 同じ「半分」でも、大皿と深いホテルパンでは見え方が違います。その日の満杯の姿と比べさせると、区分がぶれにくくなります。
献立の差し替えは、配置表の「本日」の列に入れます。 差し替えが入っていないと、パンの位置にケーキが並んだ日に、パンの知らせが出続けます。
データの取得方法を決める
Apps Script が、島ごとのフォルダから前回の処理より後に保存された写真を取り出します。ファイルの名前に島と撮影の時刻を入れる決まりにし、名前で並べます。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 新しい写真 | 島ごとのフォルダ | 残りの区分の判定 |
| 開場時の写真 | 同じフォルダのその日の最初の写真 | 満杯の基準 |
| 配置表 | スプレッドシート | 枠・補充の線・持ち場 |
| 知らせの一覧 | スプレッドシート | 前回の知らせと補充済みの状態 |
| 予定人数 | スプレッドシート | 日報での比較 |
写真は、処理したら「処理済み」のフォルダに移します。 移すのは、判定と記録が終わったときだけです。島ごとのフォルダに残っている写真の数が、そのまま未処理の数になります。
AIへ渡す前に整形する
- 撮影の時刻の確認 … ファイルの名前の時刻が、今の時刻から15分以上古いものは、知らせを出さずに記録だけにします
- 写りの確認 … 真っ暗な写真や、同じ写真が続く場合は、カメラの不具合として事務所に知らせます
- 大きさの調整 … 長い辺を決めた大きさにそろえます。大きすぎる写真は、リクエストの大きさとトークンを増やすだけです
- 枠の座標の変換 … 配置表の枠を、
[ymin, xmin, ymax, xmax]の0〜1000の座標で持たせ、そのまま指示に入れます - 本日の差し替えの反映 … 配置表の「本日」の列で、料理の名前と補充の線を置き換えます
- 客が写る場合の扱い … カメラは料理台の上だけを写す画角に据えますが、手や体が写り込む前提で、写真は朝食の終了後に決めた期間で消します
1番目で古い写真に知らせを出さないのは、補充がすでに済んでいるかもしれないからです。 カメラの保存が遅れて15分前の写真がまとめて届くと、その間に人が補充した料理まで知らせが出ます。古い写真は記録にだけ使い、知らせは新しい写真から出します。
3番目は、費用のためでもあります。 Gemini API は、縦横とも384ピクセル以下の画像を258トークンで数え、それより大きい画像は768×768の区画に分けて区画ごとに258トークンで数えます。料理の量が見分けられる範囲で小さくそろえます。
AIに処理させる
させるのは、枠ごとに、その中の料理の残りを5つの区分のどれかで答えることと、取り皿の残りを答えることだけです。
| 見るもの | 答え方 | 判断できないときの扱い |
|---|---|---|
| 枠の中の料理の残り | full / half / low / empty | 手・トング・客の体で隠れていれば not_visible |
| 開場時の写真との比較 | 同じ枠の満杯の姿と比べて区分を決める | 開場時の写真が無ければ区分だけを返し、no_baseline の印 |
| 取り皿・ボウル・グラスの残り | enough / low / empty | 写っていなければ not_visible |
| 枠の中の器の入れ替わり | 配置表と違う料理・器が置かれていないか | 違えば layout_changed の印 |
not_visible を正直に返させるのが要です。 客がトングを持って料理の前に立っている写真で、AIは見えている端だけから「少ない」と答えがちです。隠れているなら答えず、次の写真を待ちます。 5分後にはたいてい客はいなくなっています。
区分を4段階にしているのは、補充の線を料理ごとに変えるためです。 揚げ物は half で頼み、果物は low で頼む。どこで頼むかはAIではなく配置表が決めます。 残りの量を細かい割合で答えさせても、写真からの割合はぶれます。4段階なら、人の目の感覚とずれにくくなります。
| させないこと | 理由 |
|---|---|
| 補充するかどうかの判断 | 補充の線は料理ごとに配置表で決める |
| 料理の名前の推定 | 位置は配置表の枠で決まっている |
| 鮮度・温度・衛生の判断 | 写真では分からない。人が見る |
| 客の行動の記述 | 料理台の状態だけを答えさせる |
| 料理の数の厳密な数え上げ | 数え上げは誤りやすい。区分で答えさせる |
指示内容を固定する
あなたはホテルの朝食ビュッフェで、料理台の残りの量を見る担当の補助です。
1枚目は今日の開場前の写真(満杯の状態)、2枚目は今の写真です。
渡した枠の中だけを見て、料理の残りを答えてください。
【枠】
枠ごとに slot_id と、[ymin, xmin, ymax, xmax] の0〜1000の座標を渡します。
枠の外にある料理や器は見ないでください。
【level の選び方】(1枚目の同じ枠の満杯の状態と比べる)
- full ......... 満杯に近い
- half ......... 半分くらい
- low .......... 底が見え始めている、または数個しか残っていない
- empty ........ 空、またはほぼ空
- not_visible .. 手・トング・人の体・湯気で隠れて判断できない
迷ったら、少ないほうの区分ではなく not_visible を選んでください。
【取り皿など】
plates_slot の枠の中の取り皿・ボウル・グラスの残りを enough / low / empty /
not_visible で答えてください。
【厳守事項】
- 料理の名前を答えないでください。slot_id で答えてください。
- 補充すべきかどうかを書かないでください。
- 人について何も書かないでください。
- 枠の中に、1枚目と違う料理や器が置かれていれば layout_changed を true にしてください。
- note には、判断の手がかりにした見た目を短く書いてください(例:「底の白い皿が見える」)。
【枠の一覧】{slots}
「迷ったら少ないほうではなく not_visible」が、誤報を減らす一文です。 誤って「少ない」と出ると、厨房は用意して運び、料理台の前で余ります。誤報が続くと、厨房は知らせを見なくなります。 知らせが信じられているかどうかが、この構成の生命線です。
「人について何も書かない」は、写真に客が写り込むことがあるためです。 判定の結果に客の様子が残らないようにします。
出力形式を固定する
構造化出力で、次の形のJSONを受け取ります。
{
"island_id": "western_bread",
"photo_time": "2026-10-08T07:45:00+09:00",
"slots": [
{ "slot_id": "W1-03",
"level": "full | half | low | empty | not_visible",
"layout_changed": false,
"note": "" }
],
"plates": { "level": "enough | low | empty | not_visible", "note": "" }
}
level を enum にして、5つ以外を返させません。 Gemini API の構造化出力では、enum と required が使えます。ただし、JSONとして正しくても値が正しいとは限らないため、アプリケーションの側で値を確かめるよう案内されています。 枠の数と返った slot_id が合うかを、Apps Script で確かめます。
補充の知らせは、Apps Script が配置表の線と比べて決めます。
| 状態 | 条件 | 動き |
|---|---|---|
| 知らせる | level が補充の線以下で、未知らせ | 持ち場のスペースに知らせる |
| 重ねて知らせない | 同じ枠に知らせ済みで、補充済みになっていない | 何もしない(記録だけ) |
| 責任者に知らせる | 知らせてから2枚続けて補充の線以下 | ホールの責任者のスペースにも知らせる |
| 補充済み | 知らせ済みの枠が、補充の線より上に戻った | 補充済みの時刻を記録する |
| 保留 | not_visible | 何もしない。3枚続けば事務所に知らせる |
持ち場のスペースに届く知らせは、短くします。
【補充】洋食 パンの島 W1-03 クロワッサン 残り:low(07:45の写真)
料理の名前は配置表から入れます。 AIは slot_id しか返さないので、名前の取り違えが起きません。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| Google ドライブ | Apps Script のドライブのサービス | 写真の取り出しと、処理済みへの移動 |
| Gemini API | Apps Script からの HTTP 呼び出し | 枠ごとの残りの区分 |
| 配置表・知らせの一覧 | スプレッドシート | 枠と線の読み取り、時刻の記録 |
| Google Chat | 持ち場ごとのスペースの受信 Webhook | 補充の知らせ |
| 訂正の画面 | Apps Script のウェブアプリ | 責任者が誤りを訂正する |
Google Chat への知らせは、受信 Webhook で送ります。 受信 Webhook は登録したスペースだけで動き、会話ができない一方通行の仕組みです。 厨房の担当は知らせに返事をする必要はなく、補充済みは次の写真で自動で記録されます。 1つのスペースへの送信は、そのスペースの Webhook 全体で1秒に1件までです。持ち場ごとにスペースを分けているので、同じ持ち場に同時に何件も知らせが重なる場面は、間を置いて送ります。
訂正には、Apps Script のウェブアプリを使います。 ウェブアプリには doGet か doPost が要り、HTML を返します。責任者のタブレットで知らせの一覧を開き、誤報に「誤り」を付けられるようにします。 「誤り」の付いた枠は、その日の日報から外し、配置表の枠や線を見直す材料にします。
人が確認する
この構成は、知らせのたびに人の承認を挟みません。 補充の知らせは、遅れるほど意味が無くなるためです。その代わり、人が見るのは次の3つです。
- 責任者の知らせ … 2枚続けて補充されなかった料理です。厨房の仕込みが間に合わないのか、知らせが見落とされたのかを確かめます
- 誤報の訂正 … 料理台で余っている補充に気づいたら、ウェブアプリで「誤り」を付けます
- 朝食後の日報 … 料理ごと・時間帯ごとの遅れを、翌朝の打ち合わせで見ます
目標は、1回の見回りに相当する確認を1分に収めることです。 知らせを見て、運ぶ料理を確かめ、誤りがあれば付ける。見に行く時間と、頼みに行く時間が無くなった分が、第10章の差になります。
1週目は、見回りを続けたまま並べて動かします。 見回りで見つけた少ない料理と、知らせの一覧を突き合わせ、知らせが出なかった料理と、誤って出た料理を数えます。 誤報が多い枠は、枠の引き方か補充の線を直します。
例外に対処する
| 起きること | 対応 |
|---|---|
| カメラの写真が届かない | 15分届かなければ事務所に知らせ、その島は人の見回りに戻す |
| 写真が真っ暗・同じ写真が続く | カメラの不具合として知らせる |
| 湯気や客で隠れる | not_visible として次の写真を待つ。3枚続けば事務所に知らせる |
| 配置と違う料理が置かれている | layout_changed を記録し、配置表の「本日」の列の入れ忘れを責任者に知らせる |
| Gemini API が応答しない | その回は判定せず次の回に回す。2回続けば人の見回りに戻す |
返った slot_id が配置表と合わない | その写真の判定を捨て、記録に残す |
| 実行時間が6分に近づく | 残りの写真を次の実行に回す |
| 朝食の時間の延長 | 配置表の「本日」の列に終了時刻を入れ、処理の時間を延ばす |
1行目と5行目で「人の見回りに戻す」を決めておくのが大事です。 機械が止まった朝に、誰も料理台を見ていない状態がいちばん危険です。止まったことが分かる知らせと、戻る手順を先に決めます。
記録を残す
- 写真ごとの判定の結果(枠ごとの区分、取り皿、
layout_changed) - 知らせの一覧:枠、料理、検知の時刻、知らせの時刻、補充済みの時刻、検知から補充までの分
- 責任者への知らせと、その理由
- 誤報の訂正の記録
- カメラ・APIの不具合と、人の見回りに戻した時間
- 日ごとの朝食の予定人数
写真そのものは長く残しません。 判定の結果と時刻が残れば、日報は作れます。写真は朝食の終了後、決めた期間(たとえば7日)で消し、誤報の見直しに要るものだけを残します。
日報は、たとえば次の形にします。
【朝食の補充の日報】2026-10-08(予定人数 412名)
洋食 パンの島
W1-03 クロワッサン 知らせ 6回 検知→補充 平均 9分 最長 18分(07:45)
W1-05 食パン 知らせ 3回 検知→補充 平均 5分
洋食 温かい料理の島
W2-02 スクランブルエッグ 知らせ 5回 平均 11分 責任者への知らせ 1回(08:05)
時間帯別(15分ごと、全料理)
07:30-07:45 知らせ 9回 平均 10分
07:45-08:00 知らせ 11回 平均 12分
誤報の訂正 2件(W3-04 ×2:湯気)
日報は、料理ごと・15分ごとの遅れを並べます。 「7時30分から8時15分に、クロワッサンの補充に平均12分かかっている」。予定人数の多い日と少ない日で比べれば、仕込みの量か、補充の線か、どちらを動かすべきかが見えてきます。
04実装レベルの3段階
最小構成では、朝食の時間に回せません。 確かめるための段階です。 半自動化で、①の見回りの多くがなくなります。 ただし、知らせの一覧を見て厨房に頼むのはホールの担当で、記録も一覧に頼る形のため、1回4分が2分程度にとどまります。本格構成で持ち場に直接知らせ、補充済みも自動で記録されて1分になるのが、本記事の想定です。 段階を飛ばさないでください。 半自動化を2週間回すと、誤報の多い枠と、補充の線が合っていない料理が分かります。直してから厨房に直接知らせるほうが、知らせが信じられます。
05工数削減シミュレーション
導入後 1,260件 × 1分 ÷ 60 = 21 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 朝食をビュッフェで出しており、料理台が複数の島に分かれ、ホールの担当が見回って残りを確かめ、内線や声で厨房に補充を頼んでいるホテル・旅館。朝の7時台から8時台に客が集中し、補充の遅れの苦情や、空の皿が続いたという口コミを受けたことがある場合。料理台の上を定点で撮れる場所にカメラを置ける場合。ランチビュッフェを出すレストランにも当てはまります。
- 料理台が1つで、厨房から料理台が直接見える場合。朝食の客が少なく、見回りの担当に余裕がある場合。料理を大皿ではなく小鉢で並べ、残りの量を上から見て判断しにくい場合。なお、料理の温度・鮮度・衛生の確認と、アレルゲンの表示の確認は、この構成では代替できません。
07最小構成で試す方法
- 1つの島の上に、スマートフォンを固定して、朝食の時間に5分ごとに撮る(1日分で約40枚)
- 同じ時間に、見回りの担当が「少ない」と判断した料理と時刻をメモする
- 手元のAIサービスに、開場前の写真と、各時刻の写真を2枚ずつ渡し、「料理ごとに、満杯・半分・少ない・空・見えない、のどれかで答えてください。隠れていて分からないときは『見えない』にしてください」と指示する
- AIの答えと、見回りのメモを突き合わせる
1日分で十分に分かります。 区分が見回りの感覚と合うか、隠れた料理を「少ない」と誤って答えていないかを見ます。
| 出てきた内容 | 判断 |
|---|---|
| 見回りの判断とおおむね合った | カメラの据え付けと配置表の作成に進む |
| 隠れている料理を「少ない」と答えた | 指示の書き方と枠の引き方で直る。構成は有効 |
| 料理の量が写真から見分けられない | 画角の問題。 真上に近い位置から撮り直す |
3行目は、深い器の料理で起きやすいです。 横から撮ると、ホテルパンの底が見えません。カメラの位置を決めるための試行だと考えてください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 客やトングで隠れた料理を「少ない」と判定する | not_visible を選ばせ、次の写真を待つ |
| 深い器の料理の量が見えない | 真上に近い位置から撮る。最小構成で画角を決める |
| 献立の差し替えで知らせが出続ける | 配置表の「本日」の列に入れる。layout_changed で入れ忘れを知らせる |
| 同じ料理の知らせが何度も届く | 知らせ済みの枠は、補充済みになるまで重ねて送らない |
| 誤報が続いて厨房が知らせを見なくなる | 1週目は見回りと並べて動かし、誤報の多い枠を直してから本番にする |
| 起動の時刻がずれて順番が乱れる | 撮影の時刻で並べる |
| カメラが止まったことに気づかない | 15分写真が届かなければ知らせ、人の見回りに戻す |
| 無料の枠で客の写り込んだ写真を送る | 有料の枠で使う |
| 写真を長く残しすぎる | 判定と時刻だけを残し、写真は決めた期間で消す |
| 一般のアカウントでトリガーの時間が足りない | Google Workspace のアカウントで動かす |
上の2行が、知らせの正確さを決めます。 どちらも、写真に料理が見えていないのに答えさせることから起きます。見えないものは見えないと答えさせ、見える位置にカメラを置く。 この2つで誤報の多くは防げます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 料理台の写真(客の手や体、ときには顔が写り込みうる)、料理の配置と献立、補充の時刻の記録です。
- カメラの画角を料理台の上に限る … 客の顔が写らない位置と向きに据えます。会場の入口に、料理台を撮影していることと目的を掲示します
- 写真を長く残さない … 判定の結果と時刻だけを残し、写真は決めた期間で消します。誤報の見直しに使う写真も、期限を決めて消します
- 有料の枠で使う … 無料の枠では、送った内容が製品の改善に使われ、人が読むことがあるとされています
- 判定の結果に人の情報を残さない … 指示で、人について書かないよう決めています。客の行動を記録する仕組みにしません
- 衛生と安全の確認を代替しない … 料理の温度・鮮度・異物、アレルゲンの表示は、写真では分かりません。見回りの担当と料理人が確かめます
- ホールの担当の評価に使わない … 補充の遅れの記録は、仕込みの量と補充の線を見直すためのものです。個人の動きを測るために使うと、知らせを見ても動かない理由を隠すようになります
誤りが起きた場合のリスクは、空の皿を見落とすことと、誤報で厨房の手を止めることの2つです。 前者はカメラの停止から、後者は隠れた料理の誤った判定から起きます。止まったら人の見回りに戻る手順と、not_visible の扱いを、最初に決めてください。
10まず何から始めるか
1週目:1つの島で撮ってみる
いちばん補充の遅れが出やすい島(多くはパンか温かい料理)の上にスマートフォンを固定し、1日分を5分ごとに撮ります。見回りの担当のメモと並べ、手元のAIサービスで区分を答えさせます。
2週目:カメラの位置と配置表を決める
試行の結果から、各島のカメラの位置と向きを決めます。開場前の写真の上で料理ごとの枠を引き、補充の線と持ち場を料理ごとに、料理長と決めます。
3週目:ドライブから判定、一覧までをつなぐ
カメラの静止画をドライブに保存する部分を作り、Apps Script の5分ごとのトリガーで判定して、知らせの一覧に書くところまで作ります。この時点では厨房に知らせず、見回りと並べて動かします。
4週目:持ち場のスペースに知らせる
誤報の多い枠を直したうえで、持ち場ごとのスペースに知らせを流し始めます。補充済みの自動の記録と、責任者への知らせも足します。
2か月目: 日報を足し、料理ごと・15分ごとの遅れを翌朝の打ち合わせで見始めます。3か月目以降: 予定人数と遅れを並べて、仕込みの量と補充の線を見直します。見回りの担当が残りを見に行かなくても空の皿が続かない朝が当たり前になり、日報の遅れが打ち合わせの材料として使われている時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
対応する画像の形式が PNG、JPEG、WEBP、HEIC、HEIF であること。画像を直接入れる場合、指示などと合わせたリクエスト全体が20MBまでであること。1回のリクエストに複数の画像を入れられること。物体の位置を box_2d として [ymin, xmin, ymax, xmax] の0〜1000の座標で返すこと。縦横とも384ピクセル以下の画像が258トークン、それより大きい画像は768×768の区画ごとに258トークンであること。例が /v1beta/interactions を使っていること | Gemini API: Image understanding | 2026-10-08 |
構造化出力を /v1beta/interactions の response_format に mime_type: "application/json" とスキーマを入れて指定すること。enum と required が使えること。JSONとして正しくても値はアプリケーションの側で検証するよう案内されていること | Gemini API: Structured output | 2026-10-08 |
| 18歳以上であることが必要なこと。無料の枠では送った内容が製品の改善に使われ、人が読むことがあり、機密や個人の情報を送らないよう求めていること。有料の枠ではプロンプトや応答を製品の改善に使わず、禁止事項の違反を見つけるために限った期間だけ記録すること | Gemini API Additional Terms of Service | 2026-10-08 |
| インストール型トリガーが作った人のアカウントで動くこと。時間主導型トリガーの時刻が少しずれることがあること | Google Apps Script: Installable triggers | 2026-10-08 |
everyMinutes(n) の n が 1、5、10、15、30 のいずれかであること | Google Apps Script: ClockTriggerBuilder | 2026-10-08 |
| 1回の実行時間が6分までであること。トリガーの合計の実行時間が一般のアカウントで1日90分、Google Workspace のアカウントで1日6時間であること | Google Apps Script: Quotas for Google Services | 2026-10-08 |
| 受信 Webhook に Business または Enterprise の Google Workspace のアカウントが要ること。登録したスペースだけで動き、会話ができない一方通行であること。スペースの Webhook 全体で1秒に1件の送信の上限があること | Google Chat: Send messages to Google Chat with incoming webhooks | 2026-10-08 |
ウェブアプリには doGet か doPost が要り、HtmlOutput か TextOutput を返すこと。実行するアカウントを選べること | Google Apps Script: Web Apps | 2026-10-08 |
会場での撮影の掲示と写真の保存期間は、施設の個人情報の取り扱いの決まりに合わせてください。 本記事は上の公開情報で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0909)についてのご相談はこちらから。
