包装に印字した賞味期限とロット番号を生産ラインのカメラ画像で読み取り、印字の欠け・かすれと生産計画との食い違いを見つけてラインを止める
包装ラインを流れる袋や箱をカメラで撮り、印字された賞味期限とロット番号を読み取って、生産計画から作った正しい印字と照らします。欠け・かすれ・食い違いがあればその包装を排出し、続けば止めます。
- 連携・自動化
- Python
- 対象業界
- 物流/製造
- 対象部門
- 品質管理/生産
- 対象業務
- 内容確認・チェック/記録・議事録作成
- 主な課題
- 人手が足りない/属人化している/確認ミスが多い
- AIで行う処理
- 画像認識
- 主な効果
- 品質標準化/工数削減/機会損失防止
- 導入難易度
- ★★★★★
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 品目の切り替えのとき、作業者が生産計画を見てプリンタの印字の設定を変える
- 切り替えの直後、包装を数個取り出し、印字を生産計画の写しと照らす
- 印字確認記録に、日時・品目・印字の内容・良否を書いて押印する
- 以後1時間ごとに、同じように包装を取り出して印字を見る
- かすれや欠けがあれば、ラインを止めてプリンタのヘッドを清掃し、前の確認からの包装を見直す
- 直の終わりに、品質保証部が記録を確かめて承認する
- 自動生産計画と品目マスタから、ラインごとに「いま印字されているべき文字列」を作る
- 人品目の切り替えのとき、作業者がプリンタの設定を変え、検査の画面で切り替えを登録する
- 自動包装の通過をセンサーで捉え、カメラが印字の面を撮る
- 自動Python が、画像の中の印字の位置を合わせて、印字の領域を切り出す
- 自動印字の領域の濃さと文字の画素の割合から、印字の有無と濃さを測る
- 自動文字の読み取りのモデルが、賞味期限とロット番号を読み、確からしさを返す
- 自動正しい文字列と1文字ずつ照らし、`ok` / `mismatch` / `faint` / `missing` / `uncertain` を付ける
- 自動`ok` 以外の包装を排出装置で外し、同じ判定が続けばラインの停止の信号を出す
- 人作業者が停止の理由と画像を見て、プリンタの清掃や設定の直しをする
- 自動切り替えの直後、1時間ごとの時点で、判定の集計と代表の画像を印字確認記録にする
- 人品質保証部が記録と排出・停止の履歴を確かめて承認する
各工程の詳しい説明を読む
- 品目の切り替えのとき、作業者が生産計画を見てプリンタの印字の設定を変える
- 切り替えの直後、包装を数個取り出し、印字を生産計画の写しと照らす
- 印字確認記録に、日時・品目・印字の内容・良否を書いて押印する
- 以後1時間ごとに、同じように包装を取り出して印字を見る
- かすれや欠けがあれば、ラインを止めてプリンタのヘッドを清掃し、前の確認からの包装を見直す
- 直の終わりに、品質保証部が記録を確かめて承認する
(a)間の包装を見ていない。 1時間ごとの抜き取りでは、その間に流れた数千個の包装は誰も見ていません。 インクの詰まりでかすれ始めても、次の確認まで気づかず、見つかったときには1時間分を見直すことになります。
(b)切り替えで設定を変え忘れる。 1番目の設定の変更は人の手です。前の品目の賞味期限のまま印字が続くと、2番目の確認で見落とせば、その品目のロット全体が誤った表示になります。 印字の誤りによる回収は、包装の作り直しより何倍も重い失敗です。
(c)かすれの良し悪しが人で違う。 「読めるからよし」とする作業者と、「薄いから止める」作業者がいます。同じ印字でも、直によって判定が変わります。
(d)記録が後から書かれる。 忙しい時間帯は、3番目の記録を後でまとめて書くことがあります。品質保証部の承認は、書かれた記録を信じるしかありません。
- 【自動】 生産計画と品目マスタから、ラインごとに「いま印字されているべき文字列」を作る
- 【人】 品目の切り替えのとき、作業者がプリンタの設定を変え、検査の画面で切り替えを登録する
- 【自動】 包装の通過をセンサーで捉え、カメラが印字の面を撮る
- 【自動】 Python が、画像の中の印字の位置を合わせて、印字の領域を切り出す
- 【自動】 印字の領域の濃さと文字の画素の割合から、印字の有無と濃さを測る
- 【自動】 文字の読み取りのモデルが、賞味期限とロット番号を読み、確からしさを返す
- 【自動】 正しい文字列と1文字ずつ照らし、
ok/mismatch/faint/missing/uncertainを付ける - 【自動】
ok以外の包装を排出装置で外し、同じ判定が続けばラインの停止の信号を出す - 【人】 作業者が停止の理由と画像を見て、プリンタの清掃や設定の直しをする
- 【自動】 切り替えの直後、1時間ごとの時点で、判定の集計と代表の画像を印字確認記録にする
- 【人】 品質保証部が記録と排出・停止の履歴を確かめて承認する
1番目が、この設計の分かれ目です。 正しい文字列を生産計画から作るので、作業者が設定を変え忘れれば、切り替えの直後の1個目から mismatch が出ます。 画像どうしを比べる作りでは、これは捕まりません。
2番目の登録を、プリンタの設定の変更と分けているのも意図してのことです。 検査の側の切り替えは生産計画に従い、プリンタの側は人が変えます。両方を同じ人が同じ操作で変えると、同じ誤りが両方に入ります。
02今回想定するシステム構成
生産計画(日ごと・ラインごとの品目と製造日)/品目マスタ(賞味期間・表示の形式) ▼ 正しい文字列の作成 ── 例「賞味期限 2027.04」「ロット A0412K3」 ▼ 包装ライン ── プリンタで印字 → 【トリガー】通過のセンサー → 産業用カメラと照明 ▼ Python(OpenCV) ├──▶ 位置合わせ(matchTemplate)と印字の領域の切り出し ├──▶ 印字の濃さ・文字の画素の割合 ▼ PaddleOCR の文字の読み取りのモジュール(自社の印字で追加学習) │ rec_text(読んだ文字列)/rec_score(確からしさ) ▼ 照合と判定 ── ok / mismatch / faint / missing / uncertain ├──▶ 排出装置(1個ずつ) ├──▶ ラインの停止の信号(同じ判定が続いたとき) ▼ 【作業者が停止の理由を見る】→ 印字確認記録 →【品質保証部の承認】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(OpenCV・PaddleOCR) | C++ と OpenCV |
| 処理エンジン | PaddleOCR の文字の読み取りのモジュール(PP-OCR の読み取りのモデルを自社の印字で追加学習) | PyTorch で学ばせた自社の読み取りのモデル |
| 処理 | OpenCV(位置合わせ・印字の濃さの測定) | scikit-image |
| 撮影 | 産業用カメラと照明(ラインの速度と包装の材質に合わせて選ぶ) | - |
| 排出と停止 | 既存の排出装置と、ラインの制御盤への停止の信号 | - |
生産計画と品目マスタには書き込みません。 読むだけで、正しい文字列を作る計算は、品目マスタの賞味期間と表示の形式に従った決まった計算です。プリンタの設定にも触れません。プリンタを検査の側から書き換えると、検査とプリンタが同じ誤りを共有します。
読み取りの中心は、PaddleOCR の文字の読み取りのモジュールです。 切り出した文字の領域の画像を文字列に直す部品で、結果には読んだ文字列の rec_text と、確からしさの rec_score が入ります。 Python では paddleocr の TextRecognition を作り、predict() に画像を渡します。PP-OCRv5 と PP-OCRv6 の読み取りのモデルは日本語を含む複数の言語を扱い、自社のデータで学ばせ直す手順も公開されています。
自社の印字で学ばせ直すのは、プリンタの文字が一般の文字と違うからです。 インクジェット式の点で組んだ数字や、熱転写式の細い文字は、印刷物の文字で学んだモデルには読みにくいことがあります。PaddleOCR の追加学習の案内では、縦の用途に合わせるとき、文字の読み取りには少なくとも5,000件のデータを用意することが勧められ、 文字の辞書は変えないことが勧められています。辞書を変えると最後の層の重みが読み込めず、より多くのデータが要るとされています。この構成の文字は数字・英字と「賞味期限」などの決まった語なので、辞書は変えずに済みます。
位置合わせは、OpenCV の matchTemplate で行います。 テンプレートの画像を入力の画像の上で滑らせて比べ、一致の度合いの画像を返す関数で、minMaxLoc で最も一致する位置を取ります。包装のフィルムに最初から刷ってある「賞味期限」の枠をテンプレートにし、 そこからの相対の位置で印字の領域を切り出します。
生成AIは使いません。 1個ずつの判定は、ラインの速度の中で決まった計算で終える必要があり、判定の理由も決まった言葉で残します。
03どうやって実装するのか
処理の起点を決める
包装がカメラの前を通ったことを、通過のセンサーで捉えて撮ります。 センサーの信号でカメラが1枚撮り、その画像を Python の処理に渡します。1個ごとに撮るので、抜き取りの間の包装もすべて見ます。
品目の切り替えは、別のきっかけとして扱います。 作業者が検査の画面で切り替えを登録すると、生産計画の次の品目の正しい文字列に切り替わります。登録が無いまま印字が変われば、1個目から mismatch が続き、止まります。 登録だけして設定を変え忘れた場合も同じです。
印字確認記録は、時刻で作ります。 切り替えの直後と1時間ごとに、それまでの判定の集計と代表の画像をまとめます。紙の記録の時点をそのまま引き継ぐので、品質保証部の承認の流れは変わりません。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 包装の画像 | 印字の面を撮った1枚、撮った時刻、ライン | 産業用カメラ |
| 生産計画 | 日、ライン、品目、製造日、予定の数量 | 生産計画の書き出し |
| 品目マスタ | 品目、賞味期間(日数)、年月表示か年月日表示か、日付の書式、ロット番号の付け方 | 品目マスタの書き出し |
| 切り替えの登録 | ライン、品目、登録した時刻と人 | 検査の画面 |
| テンプレートの画像 | 包装の種類ごとの「賞味期限」の枠の画像と、印字の領域の相対の位置 | 立ち上げのときに作る |
質を決めるのは、品目マスタの賞味期間と表示の形式です。 正しい文字列は、ここから計算で作ります。品目マスタの値が誤っていれば、正しく印字された包装をすべて mismatch で止めてしまい、 逆に印字の設定と同じ誤りがあれば、誤りを素通しします。品目マスタの値は、品質保証部が承認したものだけを使います。
年月で表示する品目は、どの月を表示するかの決め方を品目マスタに持たせます。 賞味期限の日を年月で表すときの月の決め方は、自社の表示の取り決めとして品質保証部が決めているはずです。計算の側で勝手に決めないでください。
データの取得方法を決める
生産計画と品目マスタは、それぞれの仕組みの書き出しの機能で表の形のファイルを出し、始業前と、生産計画が変わったときに読み直します。 書き出しを API で取れる仕組みなら定時に取りに行きます。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| その日のラインごとの品目と製造日 | 生産計画 | 正しい文字列の材料 |
| 賞味期間・表示の形式・ロットの付け方 | 品目マスタ | 正しい文字列の計算 |
| 包装の画像 | カメラ | 読み取りと濃さの測定 |
| 切り替えの登録 | 検査の画面 | どの品目の文字列と照らすか |
画像は、検査用の端末で処理し、外に送りません。 ラインの速度の中で判定を終える必要があり、通信の遅れや切断で判定が止まると、ラインも止まります。 クラウドの読み取りのサービスに送る作りは、この用途には向きません。
追加学習の画像は、ラインで撮ったものを使います。 立ち上げの1〜2か月は判定をせずに撮りため、その時点の生産計画から作った正しい文字列を付けます。正しく印字された包装の画像なら、正しい文字列がそのまま答えになるので、1枚ずつ文字を打ち込む必要はありません。 手で答えを付けるのは、かすれた印字や欠けた印字の画像だけです。プリンタの種類、包装の色、日付の形(年月か年月日か)ごとに偏りなく集めます。
AIへ渡す前に整形する
- 位置合わせ … テンプレートの画像で
matchTemplateを行い、一致の度合いが閾値に届かなければmissing(印字の面が撮れていない)とします - 印字の領域の切り出し … 一致した位置からの相対の位置で、賞味期限とロット番号の領域を切り出します
- 傾きの補正 … 包装が搬送の上で少し回っていることがあるので、枠の線の向きから傾きを直します
- 明るさの正規化 … フィルムの光沢や照明のむらを抑えるため、領域の中の明るさをそろえます
- 印字の濃さの測定 … 領域の中で文字と判定される画素の割合と、文字と地のコントラストを測ります
- 正しい文字列の作成 … 製造日に賞味期間を足し、品目マスタの書式で日付にし、ロット番号の付け方で組み立てます
5番目は、読み取りとは別に測ります。 読み取りのモデルは、かすれていても文脈で正しく読んでしまうことがあります。読めたから合格、とすると、店頭で人が読めない印字を通します。 濃さの数値は、良品の印字で測った範囲と比べます。
6番目の計算は、モデルに任せません。 日付の計算と書式は決まった規則で書き、月末の日付や閏年の2月、年をまたぐ賞味期限を、立ち上げのときに試験の値で確かめておきます。
3番目と4番目は、良品の範囲を作るときと同じ処理にします。 濃さの基準は、立ち上げのときに良品の画像で測った値の範囲です。基準を作ったときと判定のときで明るさの正規化が違うと、 照明が少し暗くなっただけで全部が faint になります。処理の版を記録し、変えたら基準を測り直します。
AIに処理させる
させるのは、切り出した印字の領域の文字を読み、確からしさを返すことだけです。 照合、濃さの判定、排出と停止の判断は、決まった規則で行います。
| 判定 | 決め方 | 判断できないときの扱い |
|---|---|---|
ok | 読んだ文字列が正しい文字列と一致し、確からしさと濃さが基準を満たす | - |
mismatch | 確からしさは基準を満たすが、文字列が正しい文字列と違う | - |
faint | 文字列は一致するが、濃さが良品の範囲を下回る | - |
missing | 位置合わせに失敗、または文字の画素がほとんど無い | 撮り損ねか印字なしかは区別しない |
uncertain | 確からしさが基準に届かない | 良品に入れず排出し、人が見る |
mismatch と uncertain の分かれ目が、この構成でいちばん大事な区別です。 確からしさが高いまま違う文字を読んだのは、印字そのものが違うということで、品目の切り替えの誤りを疑います。確からしさが低いのは、印字が崩れているか、撮り方が悪いということです。対応する人と手順が違います。
| させないこと | 理由 |
|---|---|
| 正しい文字列の計算 | 品目マスタと決まった規則で作る |
| 確からしさの低い読み取りの補正 | 正しい文字列に寄せて読むと、誤りが消える |
| 出荷の可否の判断 | 排出した包装の扱いは品質保証部が決める |
| プリンタの設定の書き換え | 検査とプリンタが同じ誤りを共有する |
| 停止の解除 | 作業者が原因を確かめてから解除する |
2行目がいちばん起きやすい失敗です。 読み取りの結果を正しい文字列と照らして「1文字違いなら正しい方に直す」補正を入れると、本当に1文字違って印字された包装が ok になります。 補正は一切入れません。
指示内容を固定する
この構成は生成AIを使わないので、プロンプトの代わりに、読み取りの設定と判定の規則を書いておきます。
【読み取り】
- paddleocr.TextRecognition(自社の印字で追加学習した PP-OCR の読み取りのモデル)
- 入力:切り出した領域の画像(賞味期限・ロット番号の2つ)
- 出力:rec_text(文字列)、rec_score(確からしさ)
- 文字の辞書は変えない。追加学習の画像は、プリンタの種類ごとに集める
【正しい文字列】
- 賞味期限の日 = 製造日 + 賞味期間(日数)
- 表示の形式 = 品目マスタの値(年月 / 年月日)
- 年月表示の月の決め方 = 品目マスタの値(品質保証部が決めたもの)
- ロット番号 = 品目マスタの付け方(例:工場の記号 + 製造日 + ラインの記号)
【判定の規則】
- missing : 位置合わせの一致の度合い < 0.70、または文字の画素の割合 < 良品の下限の 30%
- uncertain: rec_score < 0.90(文字列が一致していても)
- mismatch : rec_score ≧ 0.90 かつ 文字列 ≠ 正しい文字列(補正しない)
- faint : 文字列 = 正しい文字列 かつ 濃さ < 良品の範囲の下限
- ok : 上のどれにも当たらない
【排出と停止】
- ok 以外は1個ずつ排出する
- mismatch が連続 3 個 → 停止の信号(切り替えの誤りを疑う)
- faint または uncertain が直近 50 個のうち 10 個 → 停止の信号(ヘッドの汚れを疑う)
- missing が連続 5 個 → 停止の信号(カメラ・照明・搬送を疑う)
「文字列が一致していても uncertain」を書いておかないと、確からしさの低い一致が ok になります。 確からしさが低いのに一致したのは、たまたまかもしれません。一致したかどうかより先に、確からしさで分けます。
閾値の数字は、立ち上げのときに自社の画像で決め直します。 上の数字は形を示すための例です。良品の画像と、わざとかすれさせた印字・前の品目の印字の画像を集め、 ok の取りこぼしと見逃しの両方を数えてから決めます。
出力形式を固定する
包装1個ごとに、次の形のJSONを残します。
{
"line": "",
"captured_at": "",
"product_code": "",
"expected": { "best_before": "2027.04", "lot": "A0412K3" },
"read": {
"best_before": { "text": "", "score": 0 },
"lot": { "text": "", "score": 0 }
},
"print_density": { "ink_ratio": 0, "contrast": 0 },
"align_score": 0,
"verdict": "ok | mismatch | faint | missing | uncertain",
"action": "pass | reject | reject_and_stop",
"image_path": "",
"model_version": ""
}
1つ目の理由は、expected と read を並べて残せることです。 何と照らし、何と読んだかが1件ごとに残るので、mismatch で止まったときに、作業者は画面でどの文字が違うかを見られます。 品目の切り替えの誤りなら、日付の全体が違います。
2つ目は、score と print_density を分けて持てることです。 かすれは濃さに、崩れは確からしさに出ます。ヘッドの汚れが進むと、まず濃さが下がり、次に確からしさが下がります。 両方を時系列で見ると、止まる前に清掃の時期が分かります。
3つ目は、action を判定と分けていることです。 同じ faint でも、1個だけなら排出、続けば停止です。判定はAIの読み取りと規則で、処置は規則だけで決まります。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 生産計画 | 書き出しの読み取り | 日・ライン・品目・製造日 |
| 品目マスタ | 書き出しの読み取り | 賞味期間・表示の形式・ロットの付け方 |
| 通過のセンサーとカメラ | 撮影のきっかけの信号と画像の受け取り | 包装1個ごとの画像 |
| 排出装置 | 既存の排出の入力への信号 | ok 以外の包装を外す |
| ラインの制御盤 | 既存の停止の入力への信号 | 同じ判定が続いたときに止める |
| 印字確認記録 | 表の書き出し | 時点ごとの集計と代表の画像 |
排出と停止は、既存の装置の入力に信号を渡すだけです。 制御盤の中の手順は変えず、停止の解除は作業者が盤の側で行います。 検査の側から再開させる経路は作りません。
検査の端末が止まったときは、ラインも止める側に倒します。 検査が動いていない間に流れた包装は、誰も見ていない包装になります。検査の端末から一定の間隔で「動いている」という信号を出し、途切れたら制御盤の側で止まるように組みます。
人が確認する
人が見るのは、停止したときと、排出された包装と、時点ごとの記録です。 ok の包装の画像を人が見ることはしません。全数を人が見る設計にすると、第10章の20.0時間には収まりません。
- 停止したら、理由の種類を先に見る …
mismatchの連続ならプリンタの設定と生産計画を照らします。faintとuncertainならヘッドの清掃、missingならカメラと照明と搬送を見ます - 排出された包装の画像を見る … 本当に印字が悪いのか、撮り方が悪いのかを見分けます
- 停止の前に流れた包装の範囲を決める …
mismatchで止まったときは、直前の切り替えの時刻からの包装をすべて見直す対象にします - 記録を承認する … 品質保証部が、時点ごとの集計と排出・停止の履歴を確かめます
3番目を省かないでください。 mismatch が3個続いて止まったのなら、その前の包装も同じ誤りの可能性があります。排出された3個だけを外して再開すると、検査の前に流れた分が残ります。 検査の前に流れた分とは、カメラより上流で印字されたがまだカメラを通っていない包装と、検査の端末の起動前に流れた包装です。
停止の原因と処置は、作業者が画面の決まった選択肢から選んで残します。 「ヘッドの清掃」「設定の直し」「照明の調整」などです。自由な文章にすると、同じ原因が人によって違う言葉で書かれ、 どの原因が多いかを数えられません。
目標は、1,200件をならして1件1分です。 時点ごとの記録は画面で集計を確かめて承認するだけで、時間がかかるのは停止と排出の対応です。 それが多い月は、ヘッドの清掃の周期か、閾値を見直します。
例外に対処する
| 起きること | 対応 |
|---|---|
| 品目マスタに賞味期間が無い品目 | 正しい文字列が作れない。その品目の生産を始めさせず、品質保証部へ |
| 生産計画と違う品目を作ることになった | 生産計画を直してから切り替えを登録する。検査の画面だけで品目を変えない |
| 新しい包装の種類で位置合わせができない | テンプレートを作るまで、従来の抜き取りの目視に戻す |
| 包装の材質の光沢で文字が飛ぶ | 照明の角度と偏光を見直す。閾値を下げて通さない |
| 検査の端末が止まった | 動いている信号が途切れ、制御盤の側でラインが止まる |
| プリンタのインクやリボンを替えた直後 | 濃さの基準を確かめ直すまで、faint の連続の閾値を一時的に下げない |
| 読み取りのモデルを学ばせ直した | 前の版と同じ試験の画像で比べ、見逃しが増えていないときだけ切り替える |
| 停止の後、作業者が原因を特定できない | 品質保証部に連絡し、原因が分かるまで再開しない |
| カメラのレンズや照明の覆いが粉や湯気で汚れる | 全ラインで同時ではなく1ラインだけ faint が増える。清掃の周期を決め、記録に残す |
| 生産計画の読み直しの途中で切り替えが登録された | 読み直しが終わるまで切り替えを受け付けず、画面に待ちの表示を出す |
上から2行目が、運用の最初にいちばん起きます。 急な品目の変更で、生産計画を直す前に包装を始めると、正しい印字なのにすべて mismatch で止まります。 止まったからといって検査の画面で品目を直す運用にすると、生産計画と検査の両方を同じ人が変えることになります。
記録を残す
- 包装1個ごとの判定のJSON(
expected、read、print_density、verdict、action) ok以外の包装の画像と、時点ごとのokの代表の画像- 切り替えの登録の記録(ライン・品目・時刻・登録した人)
- 停止の記録(理由の種類、停止と再開の時刻、作業者が行った処置)
- 時点ごとの印字確認記録と、品質保証部の承認
- 読み取りのモデルの版と、学ばせた画像の件数、試験の画像での見逃しの数
- 品目マスタ・生産計画を読んだ時刻と、そのときの値
最後の行で「そのときの値」を残すのは、品目マスタが後から直ることがあるためです。 賞味期間を直した後に過去の判定を見直すとき、当時の正しい文字列が何だったかが残っていないと、どの包装が誤りだったかを決められません。
04実装レベルの3段階
半自動化で、①と②の大半が消えます。 ただし、正しい文字列を作業者が検査の画面に入れる形だと、プリンタと検査に同じ人が同じ値を入れることになり、 切り替えの誤りは捕まりません。 本格構成で、1件1分になります。 本記事の想定はこの段階です。正しい文字列が生産計画から作られ、記録が自動で作られます。 差が大きいのは、③の記入と押印が、画面での承認に変わるからです。 段階を飛ばさないでください。 半自動化を1〜2か月回すと、包装の種類ごとの位置合わせの失敗と、プリンタごとの濃さのばらつきが先に分かります。ここを詰めないまま停止をつなぐと、誤った停止でラインが止まり続けます。
05工数削減シミュレーション
導入後 1,200件 × 1分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 菓子・レトルト食品・調味料・飲料、洗剤などの日用品を、複数の包装ラインで1日に何度も品目を切り替えて作る工場。賞味期限とロット番号をインクジェットや熱転写のプリンタで包装に印字し、その確認を作業者の抜き取りの目視と記録用紙で行っている場合。印字の誤りによる回収や出荷止めを一度でも経験し、全数の確認に切り替えたい場合。生産計画と品目マスタから、その日の各ラインの品目と製造日を取り出せる場合。
- 品目の切り替えがほとんど無く、1日中同じ印字が続くライン(切り替え時の初品の確認で足りる)。印字をラベルの発行機で行い、発行のデータそのものを照合できる場合(画像を読まずにデータで突き合わせる)。ラインの速度が非常に速く、包装1個ごとに撮影と判定を終える時間が取れない場合。なお、出荷の可否、回収の要否、表示の内容が法令に合っているかの判断は、この構成では代替できません。
07最小構成で試す方法
- 1つのラインで、品目の切り替えをはさむ1日分の包装から、200個を取り出す
- 印字の面をスマートフォンで真上から撮る(数個は、わざとかすれさせた印字と前の品目の印字を混ぜる)
- Python で PaddleOCR の読み取りのモジュールに画像を渡し、文字列と確からしさを出す
- 生産計画から作った正しい文字列と照らし、一致と不一致を表にする
- 作業者の目視の判定と並べる
最初に確かめるのは、追加学習をしないモデルで、自社のプリンタの文字がどれだけ読めるかです。 ここで読めない文字が多ければ、追加学習の画像を集めるところから始めます。
| 出てきた内容 | 判断 |
|---|---|
| 正しい印字はほぼ一致し、前の品目の印字は不一致になった | カメラと照明を据え付けて、ラインで試す |
| 特定の数字(6と8、0とDなど)を取り違える | 追加学習が要る。 その文字の画像を多めに集める |
| かすれた印字も一致になった | 想定どおり。濃さの測定を別に組む |
3行目が出ても、構成は有効です。 読み取りのモデルが文脈で読み切ってしまうことを確かめた、ということです。濃さの判定を読み取りから切り離す理由が、自社の画像で分かります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 前の包装との比較で判定し、切り替えの誤りを素通しする | 正しい文字列を生産計画と品目マスタから作る |
| 読み取りを正しい文字列に寄せて補正する | 補正しない。 違えば mismatch |
かすれた印字を文脈で読み切って ok にする | 濃さを読み取りと別に測る |
確からしさの低い一致を ok にする | 一致より先に確からしさで uncertain に分ける |
| 年月表示の月の決め方を計算の側で決める | 品目マスタに品質保証部が決めた値を持たせる |
| 光沢で文字が白く飛ぶ | 照明の角度と偏光を調整する。閾値で通さない |
| 検査の端末が止まっても、ラインが動き続ける | 動いている信号が途切れたら制御盤で止める |
mismatch で止まり、排出した数個だけで再開する | 直前の切り替えからの包装を見直す |
| 誤った停止が多く、現場が検査を切る | 半自動化の段階で閾値を詰めてから停止をつなぐ |
| モデルを学ばせ直したら特定の数字を見逃す | 同じ試験の画像で前の版と比べてから切り替える |
上の2行が、この構成の失敗のほとんどです。 どちらも「何と照らすか」の誤りです。照らす相手を画像の外に置き、読んだ結果に手を加えないことで、誤った印字が誤ったまま記録されます。
7行目と9行目も、同じくらい早く効いてきます。 検査は、止められる仕組みとして信頼されて初めて使われます。誤った停止が続くと検査が切られ、止まるべきときに止まらないと検査が信頼されません。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 包装の画像、生産計画(品目・製造日・数量)、品目マスタ(賞味期間・表示の形式)、作業者の登録と処置の記録です。個人の顧客の情報は扱いません。
- 表示の内容の正しさは、品質保証部が決める … この構成が照らすのは、品目マスタから作った文字列と印字が同じかどうかです。品目マスタの賞味期間や表示の形式が法令や自社の基準に合っているかは、品質保証部が決めます
- 検査が止まったときに、ラインが流れ続けない設計にする … 検査の端末の停止を、印字の確認の空白にしないでください
- 停止の解除と出荷の判断を、検査の側に持たせない … 解除は作業者が原因を確かめてから、排出した包装の扱いは品質保証部が決めます
- 画像を工場の外に出さない … 包装の画像には、未発売の品目の包装やロットの付け方が写ります。検査用の端末と社内の保存先で完結させます
- 記録の改ざんを防ぐ … 印字確認記録は、品質の監査で見られる記録です。判定のJSONと承認の記録は、後から書き換えられない保存先に置きます
- 品目マスタの変更の権限を絞る … 賞味期間の値を変えられる人が多いと、検査の基準そのものが誤ります
誤りが起きた場合のリスクは、誤った印字を出荷することと、正しい印字でラインを止めることの2つです。 前者は照らす相手を画像の側に置くと起き、後者は撮影の条件と閾値を詰めないと起きます。前者は設計で、後者は半自動化の段階の調整で防ぎます。
10まず何から始めるか
1週目:品目マスタを確かめる
品質保証部と、全品目の賞味期間、年月表示か年月日表示か、年月表示の月の決め方、ロット番号の付け方を確かめ、品目マスタに持たせます。ここが正しい文字列の土台です。
2週目:最小構成で読めるかを見る
1つのラインで200個を撮り、PaddleOCR の読み取りのモジュールで読ませます。自社のプリンタの文字で取り違える文字と、かすれた印字が一致になるかを見ます。
3週目:撮影の条件を決める
設備の担当と、ラインの上でカメラと照明の位置を試し、光沢のある包装でも文字が飛ばない角度を探します。通過のセンサーの位置も決めます。
4週目:追加学習の画像を集め始める
据え付けたカメラで画像をため、正しい文字列を付けます。わざとかすれさせた印字と、前の品目の印字も、試験の画像として残します。
2か月目: 全数の読み取りと排出を動かし、停止は作業者が判断する半自動化で回します。閾値を詰め、誤った排出と見逃しを数えます。3か月目以降: 生産計画からの正しい文字列の自動の作成と、連続の判定での停止、印字確認記録の自動の作成を足して、1件3分が何分になったかを実測します。4ラインすべてで、切り替えの誤りが1個目で止まり、品質保証部が画面の記録で承認できるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
文字の読み取りのモジュールが切り出した文字の領域の画像を文字列に直すこと。結果に rec_text と rec_score(確からしさ)が入ること。Python では TextRecognition を作り predict() に画像を渡すこと。PP-OCRv5・PP-OCRv6 の読み取りのモデルが日本語を含む複数の言語を扱うこと。自社のデータで学ばせ直す手順(tools/train.py 等)が示されていること | PaddleOCR: Text Recognition Module | 2026-10-12 |
| 追加学習で、辞書を変えない場合に文字の読み取りのデータを少なくとも5,000件用意することが勧められること。辞書を変えると最後の層の重みが読み込めず、辞書は変えないことが勧められること | PaddleOCR: Model Fine-tuning | 2026-10-12 |
cv.matchTemplate() がテンプレートの画像を入力の画像の上で滑らせて比べ、一致の度合いの画像を返すこと。cv.minMaxLoc() で最も一致する位置を取ること。比べ方が6種類あること | OpenCV: Template Matching(チュートリアルの原文) | 2026-10-12 |
| 一般用加工食品の消費期限又は賞味期限は年月日の順で表示すること。製造又は加工の日から賞味期限までの期間が3か月を超える場合は、年月の順の表示で代えることができること(食品表示基準第3条の表) | e-Gov 法令API: 食品表示基準 | 2026-10-12 |
表示の内容と期限の設定、排出した製品の扱い、回収の要否は、品質保証部と自社の表示の取り決めで判断してください。 本記事は製品と官公庁の公開資料で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1276)についてのご相談はこちらから。
