倉庫が棚の列を撮った写真を Gemini で見て、入庫に使える空きのロケーションと置き方の乱れの一覧を作る
フロアのリーダーが毎朝パレットラックの列ごとに撮った写真を Gemini API で見て、段と間口ごとの空きの状態を返させます。翌日の入庫に使える空きのロケーションの一覧と、置き方の乱れの直しの一覧を作ります。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- EC/商社/物流/製造
- 対象部門
- 物流
- 対象業務
- 内容確認・チェック/台帳・マスタ管理
- 主な課題
- 人手が足りない/入力作業が多い/確認ミスが多い
- AIで行う処理
- 画像認識
- 主な効果
- 品質標準化/対応スピード向上/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- リーダーが空きの表を印刷し、30列を順に歩く
- 列の前で段ごとに間口を目で追い、使える空き・一部だけ空き・塞がれている間口に印を付ける
- 梁からのはみ出し、通路の仮置き、ラップの破れ、傾いた段積みが目に入れば、紙の余白にメモする
- 事務所に戻り、紙の印を空きの表に入力する
- 入庫の担当に空きの表を渡し、乱れのメモは口頭か作業の連絡板で伝える
- 入庫の担当が、空きの表と入庫予定を見て割り付ける
- 人リーダーが列の前で、決まった位置から列の写真を3〜4枚撮り、タブレットで列の番号を選んで送る
- 自動サーバーが倉庫管理システムのロケーションの一覧から、その列の段と間口の一覧を作る
- 自動写真の向きと大きさを整え、人の顔が写っていれば塗りつぶす
- 自動Gemini API が、間口ごとの空きの状態と、置き方の乱れの候補を枠つきで返す
- 自動サーバーが、間口の数がそろっているか、写っていない間口が残っていないかを見る
- 自動倉庫管理システムの在庫と並べ、「在庫なしなのに塞がれている」間口に印を付ける
- 人リーダーが列ごとの結果を写真で確かめ、空きの状態を直し、乱れの直しの担当を選ぶ
- 自動確かめた空きの表を入庫の担当へ、乱れの一覧を作業の連絡板へ出す
- 人入庫の担当が空きの表と入庫予定を見て割り付ける
各工程の詳しい説明を読む
- リーダーが空きの表を印刷し、30列を順に歩く
- 列の前で段ごとに間口を目で追い、使える空き・一部だけ空き・塞がれている間口に印を付ける
- 梁からのはみ出し、通路の仮置き、ラップの破れ、傾いた段積みが目に入れば、紙の余白にメモする
- 事務所に戻り、紙の印を空きの表に入力する
- 入庫の担当に空きの表を渡し、乱れのメモは口頭か作業の連絡板で伝える
- 入庫の担当が、空きの表と入庫予定を見て割り付ける
(a)空きの書き取りと入力が二度手間になる。 2番目で紙に付けた印を、4番目でもう一度打ち直します。30列で約400の間口を、毎朝2回なぞっています。 入力の途中で打ち間違えると、入庫の当日にその間口が塞がっていると分かります。
(b)見る目がリーダーごとに違う。 背の低い荷の上に余裕がある間口を「一部だけ空き」とするか「使用中」とするか、少しかかったはみ出しを「塞がれている」とするか。リーダーの経験で決まっていて、交代の日には空きの数が変わります。
(c)乱れが記録に残らない。 3番目のメモは、急いでいる朝ほど書かれません。同じ列のはみ出しが何日も続き、ある日フォークリフトが梁に当てて初めて話題になります。 誰がいつ見たのかも残っていません。
(d)見ていない段が分からない。 4段目は見上げる高さで、照明の陰になる間口もあります。見えなかった間口に印を付けずに通り過ぎると、紙の上では「使用中」と同じ空欄になります。
- 【人】 リーダーが列の前で、決まった位置から列の写真を3〜4枚撮り、タブレットで列の番号を選んで送る
- 【自動】 サーバーが倉庫管理システムのロケーションの一覧から、その列の段と間口の一覧を作る
- 【自動】 写真の向きと大きさを整え、人の顔が写っていれば塗りつぶす
- 【自動】 Gemini API が、間口ごとの空きの状態と、置き方の乱れの候補を枠つきで返す
- 【自動】 サーバーが、間口の数がそろっているか、写っていない間口が残っていないかを見る
- 【自動】 倉庫管理システムの在庫と並べ、「在庫なしなのに塞がれている」間口に印を付ける
- 【人】 リーダーが列ごとの結果を写真で確かめ、空きの状態を直し、乱れの直しの担当を選ぶ
- 【自動】 確かめた空きの表を入庫の担当へ、乱れの一覧を作業の連絡板へ出す
- 【人】 入庫の担当が空きの表と入庫予定を見て割り付ける
7番目が、この設計の分かれ目です。 AIが返すのは見え方までで、どの間口に入庫させるか、どの乱れを今日直すかはリーダーと入庫の担当が決めます。 リーダーの時間は、間口を目で追って印を付ける作業から、印の付いた写真を確かめる作業に移ります。
2番目で間口の一覧を先に作るのも、意図してのことです。 AIに「空いている所を探して」と頼むと、見つけた空きしか返ってきません。間口の一覧を渡して1つずつ答えさせることで、写っていない間口が記録に残ります。
02今回想定するシステム構成
列の写真(タブレットで撮り、列の番号を付けて送る) ▼【トリガー】列の写真の受け取り Python のサーバー ├── 倉庫管理システムのロケーションの一覧から、段×間口の一覧を作る ├── 写真の向き・大きさを整える、人の顔を塗りつぶす ▼ Gemini API(画像の理解・構造化出力)── 1列分の写真と間口の一覧 │ 間口ごとの空きの状態、置き方の乱れの候補と枠 ▼ Python ── 間口の数の確認、在庫との並べ、写真に印を描く ▼ 【人】リーダーが列ごとに確かめる ├──▶ 空きの表(入庫の担当へ) └──▶ 乱れの直しの一覧(作業の連絡板へ)
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 処理 | Gemini API(列の写真から間口ごとの空きの状態と、置き方の乱れの候補を返す) | Claude API、OpenAI API |
| 連携 | Python(写真の受け取り、間口の一覧の作成、前処理、呼び出し、印の描画、表の書き出し) | Google Apps Script |
| 在庫 | 倉庫管理システム(ロケーションの一覧と在庫の読み取りだけ) | - |
| 撮影 | 現場のタブレット(列の番号を選んで写真を送る画面) | - |
新しく足すのは、Python のサーバーと Gemini API の契約、写真を送る画面です。 倉庫管理システムには書き込みません。空きの表と作業の連絡板は今のものを使い、写真の撮り方の決まりだけを足します。
写真を見る土台は、Gemini API の画像の理解です。 公式の案内では、対応する形式は PNG、JPEG、WEBP、HEIC、HEIF で、画像を直接入れる場合は、指示の文や画像を合わせたリクエスト全体が20MBまでです。1回のリクエストに入れられる画像は最大3,600枚とされていますが、大きさの上限があるので、1列分ずつ呼びます。
位置は枠で返させます。 枠は [ymin, xmin, ymax, xmax] の順で、画像の大きさに対して0〜1000に正規化され、元の大きさに戻して使うよう案内されています。サーバーが元の大きさに戻し、はみ出しや仮置きの所に印を描きます。
出力は構造化出力で受けます。 /v1beta/interactions に送り、response_format で mime_type を application/json にし、schema にスキーマを入れます。文字列の enum、配列の minItems・maxItems が使えます。一方で minLength・maxLength は効かず、エラーにならずに外されるとされているので、メモの長さはサーバーで見ます。値が正しいかはアプリ側で検証するよう公式に書かれています。
03どうやって実装するのか
処理の起点を決める
列の写真が届いたときに、列ごとに動きます。 リーダーがタブレットで列の番号を選び、3〜4枚を撮って送ると、サーバーがその列を処理します。1枚ごとに動かすと、まだ撮っていない区間の間口を「写っていない」と返し、撮り直しの知らせが無駄に出ます。 送信のボタンを押したときに、その列の写真がそろったとみなします。
朝の見回りの締めの時刻に、1日分をまとめます。 締めの時刻(例:8時30分)になったら、30列のうち写真の届いていない列を数え、リーダーに知らせます。入庫の担当が空きの表を待っている間に、見ていない列が残っていないかを先に分かるようにします。
乱れの直しが済んだら、同じ列をもう一度撮ります。 直した担当が列の番号を選んで撮り直すと、その列の乱れの候補だけを前の写真と並べます。直したことの確認も、写真で残すためです。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 列の写真 | 決まった位置から撮った列の全体を3〜4区間に分けたもの。区間の左端と右端の間口の番号 | タブレット |
| 間口の一覧 | その列の段×間口のロケーションの番号(例:C07-3-12 は C列7番の3段目の12間口) | 倉庫管理システムのロケーションの一覧 |
| 在庫 | 間口ごとの在庫の有無、荷主、パレットの枚数 | 倉庫管理システム |
| 状態の種類 | 空き、使用中、一部だけ使用、塞がれている、写っていない | サーバーに持たせる |
| 乱れの種類の一覧 | 梁からのはみ出し、通路への仮置き、空のパレットの置きっぱなし、ラップの破れ、荷の傾き、間口の番号の表示の欠け | サーバーに持たせる |
| 空きの数え方の決まり | 「一部だけ使用」をどこから空きに数えるか、荷主ごとに混ぜてよいか | リーダーたちで書き出したもの |
質を決めるのは、撮る位置と間口の一覧です。 撮る位置は、列の通路の反対側の柱の前、床に貼った印の上、と決めます。1列を3〜4区間に分け、区間の左端と右端の間口の番号を写真に添えます。 番号が分かれば、AIは写真の中の間口を一覧の番号に当てはめられます。
間口の番号の表示がラックに付いていることが前提です。 梁に貼った番号の札が写真に写れば、AIは番号を読んで当てはめを確かめられます。札が欠けている間口は、乱れの一覧の「表示の欠け」として返させ、貼り直しの対象にします。
データの取得方法を決める
写真は、タブレットの画面からサーバーへ送ります。 画面では列の番号と区間を選ぶだけにし、撮った時刻と撮った人のIDを一緒に送ります。 写真のファイル名に頼ると、別の列の写真が紛れても気づけません。
間口の一覧と在庫は、倉庫管理システムから読みます。 毎朝の見回りの前に、ロケーションの一覧と在庫の一覧を書き出す機能があればそれを使い、無ければ前夜の締めの書き出しを読みます。倉庫管理システムとのつなぎ方は、使っている製品が出せる形式(CSVの書き出し、APIなど)に合わせて個別に作ります。
Gemini API へは、1列につき1回、区間の写真と間口の一覧をまとめて渡します。 写真には区間の番号と左端・右端の間口の番号を添え、段は下から1段目、2段目と数えることを指示の文に書きます。上から数えるか下から数えるかを決めないと、段の番号が入れ替わった結果が返ります。
有料の利用枠で使い、store を false にします。 Gemini API の規約では、有料のサービスではプロンプトと応答が製品の改善に使われないとされています。Interactions API は既定でやり取りを保存し(有料の枠で55日、無料の枠で1日)、store=false で保存しない動きにできると案内されています。store=false にすると前の回のやり取りを引き継ぐ使い方はできないので、呼び出しは毎回、必要な写真と一覧をそろえて送ります。
AIへ渡す前に整形する
- 向きの補正 … タブレットの写真の向きの情報で回転しているだけのものは、画素を回転させます
- 縮小 … 区間の写真は長い辺を2,000ピクセル程度に縮めます。4段目の間口の札が読める大きさは残します
- 塗りつぶし … 通路を歩いている作業者の顔、フォークリフトの運転者の顔を塗りつぶします
- 暗さとぶれの確認 … 照明の陰になった写真や、手ぶれの大きい写真は、AIに渡さずに撮り直しの候補にします
- 大きさの確認 … 1列分の写真と指示の文を合わせて20MBを超えないかを見ます。超えるときは区間を2回に分けます
- 間口の一覧の付け足し … その列の段×間口の一覧と、区間ごとの左端・右端の番号を指示の文に入れます
4番目を軽く見ないでください。 倉庫の照明は通路の真上にあり、ラックの奥と4段目は暗く写りがちです。 暗い写真では空のパレットと床の見分けがつかず、AIは「空き」と返しがちです。暗い写真で「空き」と出ることが、入庫の当日にいちばん困る誤りです。
AIに処理させる
させるのは、間口ごとに空きの状態を返すこと、置き方の乱れの候補を枠で返すこと、間口の札の番号を読むことだけです。
| 返すもの | 中身 | 判断できないときの扱い |
|---|---|---|
| 間口ごとの状態 | 間口の一覧の1行ずつに empty(空き)/occupied(使用中)/partly_used(一部だけ使用)/blocked(塞がれている)/not_visible(写っていない) | 奥が隠れていれば not_visible |
| 塞がれている理由 | 隣の荷のはみ出し、空のパレット、荷の仮置き、その他 | 分からなければ other |
| 置き方の乱れ | 写真の番号、枠、近くの間口、種類、見え方の短い説明 | 乱れか影か分からなければ unclear |
| 札の番号 | 写真に写った間口の札の番号の読み取り | 読めなければ空のまま |
empty と blocked と not_visible を分けて返させるのが、この構成の要です。 荷が見えない間口を全部 empty にすると、第1章で書いたとおり、入庫の当日に行き場の無いパレットが出ます。 not_visible が1つでも残る列は、サーバーが空きの表に「未確認」と書き、撮り直しの依頼を出します。
| させないこと | 理由 |
|---|---|
| ラックに載せてよい重さか、荷が安全かの判断 | 積載の条件はラックの製造元の表示と社内の決まりで決まる。写真の見た目からは分からない |
| どの間口に入庫させるかの決定 | 荷主ごとの保管の決まりや出荷の順番で決まる。入庫の担当が決める |
| 荷の中身や品番、荷主の名前を読むこと | 在庫の照合はこの構成の範囲外。ラベルの読み違いで在庫の話に紛れる |
| はみ出しの長さを数字で書くこと | 写真の角度で変わる。必要なら現地で測る |
| 作業者の名前や責任について書くこと | 乱れの一覧が人への評価の文になってしまう |
1行目がいちばん起きやすい失敗です。 傾いた段積みを見せると、AIは「崩れる危険があります」「すぐに撤去が必要です」と書きたがります。その言葉が作業の連絡板に載ると、リーダーが確かめる前に現場が止まります。 返すのは見え方までにし、危ないかどうかはリーダーが現地で決めます。 本当に危ない傾きを見つけたときは、AIの結果を待たずにその場で止めるのが先です。
空きの数え方は、サーバーが次のように振り分けます。
| 振り分け | 数え方の例(リーダーたちで決める) |
|---|---|
| 入庫に使える | empty |
| 条件つきで使える | partly_used(背の低い荷の上に余裕がある。荷主を混ぜてよい場合だけ) |
| 片付ければ使える | blocked のうち、空のパレットと仮置き |
| 使えない | occupied、blocked のうち隣の荷のはみ出し |
| 未確認 | not_visible |
指示内容を固定する
あなたは物流倉庫で、朝の見回りの写真を見る手伝いをする係です。
この列は C07 です。段は床に近い方から 1段目、2段目、3段目、4段目と数えます。
写真の区間と、左端・右端の間口の番号は次のとおりです。
{写真1: 区間A 左端 C07-*-01 右端 C07-*-04, 写真2: 区間B 左端 C07-*-05 右端 C07-*-08 ...}
【この列の間口の一覧】
{C07-1-01, C07-1-02, ... C07-4-16}
【やること】
1. 間口の一覧の1行ずつについて、empty / occupied / partly_used / blocked /
not_visible のどれかを選ぶ。一覧にない間口を足さない。一覧の間口を飛ばさない。
2. blocked のときは、理由を neighbor_overhang / empty_pallet / temporary_load /
other から選ぶ。
3. 次の種類の乱れを探し、写真の番号と枠を [ymin, xmin, ymax, xmax] の順で、
0〜1000 に正規化して返す。近くの間口の番号と、見え方を短く書く。
梁からのはみ出し、通路への仮置き、空のパレットの置きっぱなし、
ラップの破れ、荷の傾き、間口の番号の札の欠け
4. 写真に写った間口の札の番号を読めた分だけ返す。
【厳守事項】
- 奥が手前の荷で隠れている間口、暗くて床と荷の区別がつかない間口は、
empty にしないでください。not_visible にしてください。
- 荷が見えなくても、空のパレットや隣の荷がかかっていれば empty にしないでください。
- 乱れか影か分からないものは、kind を unclear にして候補に入れてください。
- 危険かどうか、撤去や積み直しが必要かを書かないでください。
- はみ出しの長さや荷の重さを数字で書かないでください。
- 荷の中身、品番、荷主の名前を書かないでください。
- 人については何も書かないでください。
「一覧の間口を飛ばさない」「隠れている間口を empty にしない」を並べているのは、どちらも同じ失敗を防ぐためです。 何も言わないと、AIは目立つ空きと乱れだけを返し、残りの間口について何も言いません。 その沈黙をサーバーが「使用中」と読んでも「空き」と読んでも、空きの表がずれます。
段の数え方を指示の文の先頭に書いているのは、段の番号の取り違えを防ぐためです。 倉庫によっては上から数える決まりもあり、指示の文とロケーションの番号の付け方を必ずそろえます。 札の番号が読めた間口は、サーバーがその番号と一覧の番号を突き合わせ、合わなければ列全体を needs_check にします。
乱れの直しが済んだ後の見比べは、別の指示で呼びます。 乱れの番号、前の写真の枠、撮り直した写真を渡し、「前の枠の所の見え方が、後の写真で直って見えるか、まだ残って見えるか、比べられないかを選ぶ」と指示します。「安全になった」とは書かせず、見え方の比較だけを返させます。
出力形式を固定する
1列ごとに、次の形の JSON で受け取ります。 status、reason、kind は enum で決まった文字列に絞り、slots は間口の一覧と同じ数を minItems・maxItems で求めます。
{
"aisle": "C07",
"slots": [
{ "location": "C07-3-12", "status": "empty | occupied | partly_used | blocked | not_visible",
"reason": "neighbor_overhang | empty_pallet | temporary_load | other | none", "photo": 3 }
],
"issues": [
{ "photo": 3, "box_2d": [380, 610, 520, 720], "near_location": "C07-3-12",
"kind": "beam_overhang | aisle_temporary | empty_pallet_left | wrap_torn | load_tilt | label_missing | unclear",
"note": "右隣の荷の手前の角が、梁の前に出て見える" }
],
"labels_read": [ { "photo": 3, "text": "C07-3-12" } ]
}
1つ目の理由は、slots をそのまま空きの表にできることです。 間口の数がそろっていなければサーバーが呼び直し、not_visible の間口は「未確認」として入庫の担当に見えるようにします。 第3章の(d)の「見なかった間口が空欄に紛れる」が、ここでなくなります。
2つ目は、倉庫管理システムの在庫と並べられることです。 サーバーは間口ごとに在庫の有無を横に置き、次の4つに分けて印を付けます。
| 在庫 | 写真の状態 | 印 |
|---|---|---|
| なし | empty | 入庫に使える |
| なし | blocked | 在庫なしなのに塞がれている。片付けの対象 |
| あり | empty | 在庫の側の確認に回す(本記事の範囲外。UC-0568 の運用へ) |
| あり/なし | not_visible | 未確認。撮り直し |
3行目を空きの表に入れないのは、意図してのことです。 在庫があるはずの間口が空に見える理由は、写真の見え方か在庫の登録の漏れか、ここでは分かりません。入庫に使うと、登録の漏れた荷の上にパレットを重ねる割付になります。
3つ目は、issues に番号を振れば、直しの依頼と後の見比べの鍵になることです。 サーバーは乱れに「C07-1028-03」のような番号を振り、作業の連絡板と撮り直しの写真に同じ番号を使います。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| タブレットの撮影の画面 | サーバーが受け取る | 列の番号、区間、写真、撮った時刻と人のID |
| 倉庫管理システム | 書き出しの読み取り | ロケーションの一覧、間口ごとの在庫の有無 |
| Gemini API | API呼び出し(/v1beta/interactions、store=false) | 間口ごとの状態、乱れの候補、直しの前後の見比べ |
| 空きの表 | 書き込み | リーダーが確かめた後の間口ごとの状態と印 |
| 作業の連絡板 | 投稿 | リーダーが選んだ乱れと、印の付いた写真、直しの担当 |
倉庫管理システムへは書き込みません。 この構成が出すのは空きの表までで、ロケーションの状態を書き換えるのは入庫の担当の操作です。 AIの結果をそのまま書き込むと、見え方の誤りが在庫の記録にまで入ります。
作業の連絡板へは、リーダーが選んだ乱れだけを出します。 影や梁の色の違いまで乱れとして出ると、現場がその一覧を読まなくなります。
人が確認する
not_visibleとblockedを先に見る … 撮り直しで済むか、片付けで空くかを写真で決めますemptyを写真でなぞる … 空きと出た間口に、空のパレットや床置きの荷が無いかを見ますpartly_usedを数え方の決まりに当てる … 荷主を混ぜてよい間口かを確かめ、使うかを決めます- 乱れの直しの担当を選ぶ … 今日直すもの、入庫の前に直すもの、様子を見るものに分けます
- 空きの表を入庫の担当に渡す … 未確認の間口の数を一緒に伝えます
2番目を省かないでください。 empty の誤りは、入庫の当日にフォークリフトの運転者が見つけることになります。 その時点ではパレットを持ったまま別の空きを探すことになり、朝の書き取りよりずっと時間がかかります。
目標は、660件をならして1件2分です。 撮る作業に1分、確かめる作業に1分という想定です。not_visible の多い列が続くなら、撮る位置か照明を見直します。
例外に対処する
| 起きること | 対応 |
|---|---|
| 暗い・ぶれた写真が多い | AIに渡さず、その区間を撮り直しの一覧に入れる |
間口の一覧と slots の数が合わない | 呼び直す。2回合わなければ、その列は紙の見回りに戻す |
| 札の番号と一覧の番号が合わない | 列全体を needs_check にし、区間の選び間違いを疑う |
| フォークリフトや人が間口を隠している | その間口は not_visible のまま、少し時間をおいて撮り直す |
| 列の写真が締めの時刻までに届かない | その列を空きの表で「未確認」とし、リーダーに知らせる |
| 指示に反して危険の判断や重さを書いた | その出力を保存せずに捨て、呼び直す |
JSON の値が enum に無い | 空きの表に入れず、リーダーが写真を見る |
| 倉庫管理システムの書き出しが古い | 在庫との並べを止め、写真の状態だけを出す |
| API が応答しない | 写真を残したまま時間をおいて呼び直す。締めに間に合わなければ紙の見回りの結果を使う |
上から2行目までが大半を占めます。 どれもAIの精度の問題ではなく、撮る位置と照明、間口の一覧の作り方の問題です。 6行目は、note に「危険」「撤去」「必要」の言葉や重さの数字が入っていないかをサーバーで見ます。
記録を残す
- 列ごとの元の写真と、塗りつぶして AI に渡した写真、撮った時刻と人のID
- 渡した間口の一覧と、Gemini API が返した JSON
- リーダーが直した間口の状態と、直した理由
- 乱れの番号ごとの直しの担当、直した日、前後の写真の組
- そのときの空きの数え方の決まりの版と、入庫の担当に渡した空きの表
3つ目が、数え方の決まりを直す材料になります。 リーダーが empty を blocked に直した間口を数えると、AIが空のパレットを床と見分けられていない列が分かります。列ごとの乱れの件数も出せますが、荷主ごとの片付けの依頼に使うか、作業者の評価に使うかは、別に話し合って決めます。
04実装レベルの3段階
最小構成では列の数がさばけません。 1列ずつ貼り付けるので、毎朝30列には使えません。確かめるための段階です。 半自動化で、1件5分が3分程度になります。 紙への印と表への入力は減りますが、在庫と並べる作業と乱れの連絡が手作業で残ります。 本格構成で2分になり、この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化の記録を1か月見ると、どの列で not_visible が多いか、リーダーがどの状態を直すことが多いかが分かります。
05工数削減シミュレーション
導入後 660件 × 2分 ÷ 60 = 22 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- パレットラックを数十列持ち、入庫の割付を前日か当日の朝に決めている3PLの倉庫や物流センター。倉庫管理システムの「在庫の無いロケーション」と、現場で実際に使える空きが合わず、フロアのリーダーが毎朝ラックを歩いて紙に空きを付けている場合。荷のはみ出しや通路への仮置きが、見回りの記録に残らないまま続いている場合。
- ラックが数列で、リーダーが入庫のたびに目で見れば足りる場合。自動倉庫や固定ロケーションだけで運用し、空きが倉庫管理システムの在庫と常に一致している場合。ラックに間口の番号の表示が無く、写真から間口の位置を決められない場合。なお、ラックの積載の可否や荷の安全の判断、入庫の割付の最終の判断は、この構成では代替できません。
07最小構成で試す方法
- 先週の朝の見回りから5日分を選ぶ(うち1日は、入庫の当日に空きが使えなかった日を入れる)
- その5日分について、当時の紙の空きの印と、入庫の当日に使えなかった間口を書き出す
- 同じ列を、決めた位置から区間に分けて撮り、手元の Gemini の画面に1列ずつ貼り付ける
- 「この列の間口の一覧の1つずつについて、空き・使用中・一部だけ使用・塞がれている・写っていない、のどれかを答えてください。荷が見えなくても空のパレットや隣の荷がかかっていれば空きにしないでください。危険かどうかは書かないでください」と指示する
- 出てきた状態を、紙の印と入庫の当日の結果と突き合わせる
5日分は必ずやってください。 サーバーを作る前に、「今の撮る位置と照明の写真から、間口ごとの状態が返せるのか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
紙の印とほぼ同じで、使えなかった間口が blocked に出た | サーバーと間口の一覧の作成に進む |
| 隠れた間口を「空き」と答えた | 指示の書き方で直る。構成は有効 |
| 4段目と奥が暗く、ほとんどが「写っていない」 | 撮る位置と照明が先。 AIの問題ではない |
3行目が出ることは珍しくありません。 失敗ではなく、リーダーが4段目を見上げて迷っていた理由が1つ分かったということです。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 隠れた間口が「空き」に紛れる | 間口の一覧を渡して1つずつ答えさせ、not_visible を分ける |
| 空のパレットを床と見分けられない | blocked の理由に empty_pallet を持たせ、暗い写真は渡さない |
| 段の番号が入れ替わる | 段を下から数えることを指示の先頭に書き、札の番号と突き合わせる |
| 区間の選び間違いで別の間口に当てはめる | 区間の左端・右端の番号を写真に添え、札の番号が合わなければ列ごと止める |
| 「危険」「撤去が必要」と書く | 指示で禁じ、note の言葉をサーバーで見る |
| 荷のラベルを読んで在庫の話に入る | 中身・品番・荷主を書かせず、在庫の照合は別の運用に分ける |
| 在庫ありで空に見える間口を空きにする | 空きの表に入れず、在庫の側の確認に回す |
| 4段目の札が読めない | 縮めすぎない。media_resolution と縮め方を最小構成で決める |
| 写真が多く20MBを超える | 1列を2回に分ける |
| 乱れの一覧が作業者への評価になる | 人について書かせず、見え方だけを連絡板に出す |
| 「一部だけ使用」の数え方が人ごとに違う | 1週目に書き出し、振り分けの表にしてから AI をつなぐ |
上の2行が、この構成の失敗のほとんどです。 どちらも「荷が見えない」を「空いている」と読むことから出ています。隠れている間口と塞がれている間口を、空きとは別の答えとして返させることが、指示と規則の両方で守る線です。
下の行も、早く効いてきます。 数え方が言葉になっていないまま状態を出すと、リーダーごとに直す・直さないが分かれ、第3章の(b)が残ります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 倉庫のラックの写真、ロケーションと在庫の有無、作業の連絡です。通路を歩く作業者やフォークリフトの運転者の顔、荷に貼られた荷主の名前や届け先のラベルが写り込みます。
- 写真に写った人を、個人情報として扱う … 個人情報保護委員会のガイドラインは、個人情報の例として本人が判別できる映像情報を挙げ、個人に関する情報には顔画像のように個人を識別する情報が含まれるとしています。前処理で顔を塗りつぶしてから渡し、元の写真は社内にだけ残します
- 荷主の情報を外に広げない … 荷のラベルには荷主の名前や品名、届け先が写ります。AIには読ませず、写真を見られる人をフロアのリーダーと入庫の担当に限ります。 荷主との契約に、倉庫内の写真の扱いの決まりがないかも確かめます
- この構成は安全の判断を代替しません … ラックに載せてよいか、荷の傾きが危ないかは、ラックの製造元の表示と社内の安全の決まりで決めることです。 この構成が出すのは、写真にどう見えたかという候補だけです
- 作業者への言葉に気を配る … 乱れの一覧には見え方だけを書き、誰が置いたかをAIに書かせません
- 使うのは社内の担当だけにする … AIの結果を見るのはリーダーと入庫の担当だけです。Gemini API の規約は、18歳以上であることを利用の条件とし、18歳未満の人に向けた、または使う見込みのあるアプリでの利用を認めていません。撮影の画面は写真を送るだけにし、AIの結果を表示する画面はリーダーと入庫の担当(18歳以上)に限ります
- AI側にやり取りを残さない … 有料の利用枠で使い、
store=falseを付けます
誤りが起きた場合のリスクは、塞がれている間口を空きとして割り付けることと、使える空きを見逃して保管の場所を余計に借りることの2つです。 前者は隠れた間口や空のパレットを empty と扱うと起き、後者は not_visible の撮り直しを放っておくと起きます。どちらも、見えない間口の扱いから出ているので、そこを設計で守ります。
10まず何から始めるか
1週目:数え方と撮る位置を決める
リーダーたちで、「一部だけ使用」をどこから空きに数えるか、空のパレットと仮置きをどう扱うかを書き出し、第7章の振り分けの表にします。あわせて、列ごとの撮る位置を決めて床に印を貼り、欠けている間口の札を貼り直します。
2週目:5日分で試す
先週の見回りの5日分の列を撮り直し、手元の Gemini の画面に貼って間口ごとの状態を答えさせます。隠れた間口を「空き」と答えていないか、危険の判断を書いていないかを最優先で見ます。
3週目:間口の一覧を作る
倉庫管理システムからロケーションの一覧を書き出し、列×段×間口の一覧と、区間ごとの左端・右端の番号の表を作ります。段の数え方を、指示の文とロケーションの番号でそろえます。
4週目:まとめて状態を出す
リーダーが見回りの後に写真をまとめて API に渡し、間口ごとの状態を空きの表に書き出すところまで作ります。この時点では在庫との並べも連絡板への投稿もせず、紙の見回りと並べて見ます。
2か月目: 撮影の画面とトリガーを足し、在庫と並べた印を出します。紙の見回りをやめる列を決めます。3か月目以降: 乱れの直しの一覧と前後の見比べを足し、1件5分が何分になったかを実測します。入庫の当日に空きが使えなかった回数を、not_visible と blocked の記録と並べて見直すようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
対応する画像の形式が PNG・JPEG・WEBP・HEIC・HEIF であること。画像を直接入れる場合は指示の文などを合わせたリクエスト全体が20MBまでであること。1回のリクエストの画像が最大3,600枚であること。位置が [ymin, xmin, ymax, xmax] の順で0〜1000に正規化されて返り、元の大きさに戻して使うこと。384ピクセル以下の画像が258トークンで、それより大きい画像はタイルに分けて数えること。media_resolution が画像1枚あたりのトークンの上限を決め、高い値が細かい文字や小さな部分に向くこと。呼び出しが /v1beta/interactions であること | Google AI for Developers: Image understanding | 2026-10-28 |
構造化出力を /v1beta/interactions の response_format(mime_type に application/json、schema)で指定すること。文字列の enum、配列の minItems・maxItems が使えること。minLength・maxLength はエラーにならずに外されること。値はアプリ側で検証するよう書かれていること | Google AI for Developers: Structured output | 2026-10-28 |
Interactions API が既定でやり取りを保存し(有料の枠で55日、無料の枠で1日)、store=false で保存しない動きにできること。store=false では前のやり取りを引き継ぐ使い方ができないこと | Google AI for Developers: Interactions API | 2026-10-28 |
| 利用には18歳以上であることが必要で、18歳未満の人に向けた、または使う見込みのあるアプリでの利用を認めていないこと。有料のサービスではプロンプトと応答が製品の改善に使われないこと | Gemini API Additional Terms of Service | 2026-10-28 |
| 個人情報の例として本人が判別できる映像情報が挙げられ、個人に関する情報に顔画像など個人を識別する情報が含まれること | 個人情報保護委員会: 個人情報の保護に関する法律についてのガイドライン(通則編) | 2026-10-28 |
どの状態を入庫に使える空きとするか、どの置き方を直すかは、自社の保管の決まりと安全の決まりに合わせて決めてください。 本記事は上の公式の情報で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-2186)についてのご相談はこちらから。
