Article

AI画像認識システム事例:製品検品を自動化し品質向上を実現

高田晃太郎
AI画像認識システム事例:製品検品を自動化し品質向上を実現

製造業では不良コストが売上の5〜15%に達するとされるが、調査によっては**5〜30%のレンジが報告されており、品質検査の精度とスループットは収益に直結する中核機能だ¹。海外調査では、コンピュータビジョンを含むAIの現場適用で歩留まりが10〜20%**改善した報告があり²、公開事例では外観検査AIにより過検出を大幅に削減(最大級の改善を示す事例もある)したケースが複数報告されている³⁴。主要レポートを読み解くと、現場適用の成否はアルゴリズムの優劣だけではなく、照明と撮像の一貫性、データ収集・ラベリングの運用、そしてFP(偽陽性)/FN(偽陰性)を事業KPIに接続する設計に左右されることが見えてくる⁵。

本稿では、CTOやエンジニアリーダーが意思決定できるように、画像認識による検品自動化の全体像、代表的なアーキテクチャ、実装の最小構成コード、KPI設計とROIの考え方、運用で詰まりやすい論点を一貫して整理する。単なる技術デモでは終わらせず、ラインへの統合と再現性のある改善サイクルに焦点を当てる。

AI検品の全体像と効果:何が変わり、どこで儲かるか

AI検品の本質は、欠陥の有無を確率として推定し、合否の判断をしきい値で確定させるプロセスを、安定した撮像条件のもとで高速に回し続ける運用だ。研究・レビューでは、深層学習を用いた外観検査モデルが従来のルールベースを上回る精度を示す傾向が整理されており⁷、適切なデータセット整備と照明最適化ができたラインでは、偽陽性の削減とタクトタイムの短縮が同時に達成されている¹¹。公開事例の中には、教師なしに近い異常検知で「良品のみ学習」し(AE=オートエンコーダやDRAEM系など)、未知欠陥への感度を高めるアプローチで成果を出す企業もある⁶⁸¹²。

代表的な構成での運用例としては、照明の角度や偏光で反射を抑え、ResNet系の分類器を微調整しつつ、良品中心の異常検知を併用する流れがある。公開事例やレビューの範囲でも、過検出の抑制とスループット維持(あるいは改善)を両立した報告は珍しくない²³⁴⁷¹¹。投資回収(ROI)は工程・規模によって幅があるが、初期のライン適用で数カ月〜1年程度を目標に設計されることが多いとされる²⁵。重要なのは、個別の数値を目標値として「事例移植」するのではなく、自社のKPIとコスト構造に合う閾値・運用をデータで再設計する姿勢だ。

効果の源泉は三つに整理できる。第一に過検出削減による再検・手直し工数の直接削減、第二に不良流出の抑制によるクレーム・サプライチェーンの逆流コストの回避、第三に検査工程のタクト短縮による全体のスループット向上だ。これらは歩留まりやDPMO(百万個当たり不良数)といった品質KPIに直結するため、モデルの精度指標は必ず事業KPIに接続して意思決定すべきである¹⁹。

アーキテクチャと実装要点:現実解としての設計図

現実解のアーキテクチャは、撮像サブシステム、前処理・推論、合否判断・ライン制御、そしてデータ収集・学習基盤で構成される。ネットワーク帯域やレイテンシ制約がある製造現場では、推論はエッジ優先が定石だ¹⁰。GPUやVPUを備えた産業用PCにモデルをデプロイし、学習と評価はクラウドで行うハイブリッドが運用しやすい。撮像は照明の再現性が最優先で、拡散光と同軸落射、偏光、NDフィルタの組み合わせで表面反射を抑えると前処理が安定する¹¹。レンズの被写界深度とカメラのトリガ方式は、PLCやエンコーダと同期させてブレを排除する。

前処理はOpenCVでの正規化やガンマ補正、幾何補正が基本となる。分類・検出・セグメンテーションのいずれを選ぶかは欠陥の形態と合否基準によるが、未知欠陥が多い場合はパッチ単位の異常検知(例えばAEやDRAEM系、あるいは単純な良品分布のモデリング)を併用すると保守性が高い⁶¹²。推論の一貫性を確保するため、学習時の前処理パイプラインをそのままエッジに移植し、バージョンを固定することが重要だ¹³。

OpenCV前処理の最小例:照明ばらつきの平滑化

import cv2
import numpy as np

def preprocess(img_bgr: np.ndarray) -> np.ndarray:
    gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)
    blur = cv2.GaussianBlur(gray, (0, 0), sigmaX=1.2)
    norm = cv2.divide(gray, blur, scale=255)  # 照明ムラ補正
    norm = cv2.normalize(norm, None, 0, 255, cv2.NORM_MINMAX)
    eq = cv2.equalizeHist(norm)
    return eq

# 使い方
# img = cv2.imread('sample.png')
# x = preprocess(img)

PyTorchでのファインチューニング:分類による合否判定

import torch
from torch import nn
from torchvision import models, transforms
from torch.utils.data import DataLoader, Dataset
from PIL import Image

class FolderDataset(Dataset):
    def __init__(self, paths, labels, tfm):
        self.paths = paths
        self.labels = labels
        self.tfm = tfm
    def __len__(self):
        return len(self.paths)
    def __getitem__(self, i):
        img = Image.open(self.paths[i]).convert('RGB')
        return self.tfm(img), torch.tensor(self.labels[i], dtype=torch.long)

tfm = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ColorJitter(0.1, 0.1, 0.1, 0.05),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406],[0.229, 0.224, 0.225])
])

model = models.resnet18(weights=models.ResNet18_Weights.IMAGENET1K_V1)
model.fc = nn.Linear(model.fc.in_features, 2)
model = model.cuda()

opt = torch.optim.AdamW(model.parameters(), lr=3e-4, weight_decay=1e-4)
crit = nn.CrossEntropyLoss(weight=torch.tensor([1.0, 3.0]).cuda())  # 不良クラス重み付け

for epoch in range(10):
    model.train()
    for x, y in train_loader:  # 事前に定義
        x, y = x.cuda(), y.cuda()
        opt.zero_grad()
        logits = model(x)
        loss = crit(logits, y)
        loss.backward()
        nn.utils.clip_grad_norm_(model.parameters(), 1.0)
        opt.step()

分類はシンプルで高速だが、局所欠陥の説明性が弱い。欠陥位置の説明責任が必要な場合は、YOLOv8やSegment Anything等と組み合わせてヒートマップやマスクを提示すると、現場の受容性が高まる¹⁵¹⁶。なお、ここで用いているResNet系は画像認識の標準的アーキテクチャであり、多くの産業検査でもベースラインとして採用されている¹⁴。

ONNXエクスポートとTensorRT推論:エッジ最適化

import torch

model.eval()
dummy = torch.randn(1, 3, 224, 224).cuda()
torch.onnx.export(
    model, dummy, "model.onnx", opset_version=17, input_names=["input"], output_names=["logits"],
    dynamic_axes={"input": {0: "batch"}, "logits": {0: "batch"}}
)
import onnxruntime as ort
import numpy as np

so = ort.SessionOptions()
so.intra_op_num_threads = 1
sess = ort.InferenceSession(
    "model.onnx",
    providers=["TensorrtExecutionProvider", "CUDAExecutionProvider", "CPUExecutionProvider"],
    sess_options=so
)

def infer(batch_np: np.ndarray):
    return sess.run(["logits"], {"input": batch_np})[0]

上記のミニマル構成でも、エッジ端末で1枚あたり10〜20msのレイテンシを現実的に達成できる¹⁸¹⁹。重要なのは、学習時のパイプラインと推論時の前処理を完全一致させ、同一の正規化とリサイズを適用することだ。ズレは即座に精度劣化として跳ね返る¹³¹⁸。

RESTエンドポイントでライン連携:合否を即時返却

from fastapi import FastAPI, UploadFile
import numpy as np
import cv2
import uvicorn

app = FastAPI()

def softmax(logits):
    x = logits - logits.max(axis=1, keepdims=True)
    e = np.exp(x)
    return e / e.sum(axis=1, keepdims=True)

@app.post("/judge")
async def judge(file: UploadFile):
    data = await file.read()
    npimg = np.frombuffer(data, np.uint8)
    img = cv2.imdecode(npimg, cv2.IMREAD_COLOR)
    x = preprocess(img)
    x = cv2.resize(x, (224, 224))
    x = np.stack([x, x, x], axis=2).astype(np.float32) / 255.0
    x = (x - np.array([0.485,0.456,0.406])) / np.array([0.229,0.224,0.225])
    x = np.transpose(x, (2,0,1))[None, ...]
    logits = infer(x)
    prob = float(softmax(logits)[0,1])
    return {"ok": prob < 0.35, "prob_defect": prob}

# if __name__ == "__main__":
#     uvicorn.run(app, host="0.0.0.0", port=8000)

RESTやgRPCなどの軽量APIでライン制御系と連携すると、既存システムへの組み込みが容易になる。しきい値(ここでは0.35)はコスト最小化の観点でロットごとに再評価していくのが安全だ²⁰²¹。

KPI設計と評価:精度を事業に翻訳する

AIモデルの指標は、現場の品質KPIに翻訳して語られなければ意思決定の役に立たない。混同行列の精度や再現率は、実務では不良流出(FN)と過検出(FP)という二つのコストに変換される。偽陰性は市場クレームやリコールのリスクを高めるため高くつく。一方、偽陽性は再検や手直し、廃棄という形で作業コストと廃棄コストを増やす。したがって、しきい値は単純なF1最大化ではなく、事業コスト最小化の観点から決めると合理的だ²⁰。

たとえば毎分120点を処理するラインで、検査レイテンシの予算が50ms以内、過検出率上限を2%、流出率上限を50ppmと定義したとする。この場合、推論のバッチングは極小に留め、I/Oを非同期化し、モデルサイズはエッジGPUのキャッシュに収まるよう調整する。精度評価はロットごとのAQLに沿って抜き取り検査を併用し、混同行列をロット粒度で追うと傾向変化を検知しやすい²¹。シーズンや原材料ロットによるドメインシフトを想定し、月次で再評価しきい値を微調整する運用が安全だ²²²⁴。

説明性の観点では、Grad-CAMなどの可視化を現場UIに組み込むと、現場担当者の納得感が大きく高まる²3。合否の根拠が見える化されることで、作業者の微調整や上流工程へのフィードバックが具体化する。モデルの自信度とヒートマップを一緒に提示し、しきい値近傍のケースは自動で保留に回すと、曖昧領域が人に集約され、学習用のハードネガティブとしても活用できる。

移行と運用:MLOps for Visionの現場解

PoC止まりを避ける鍵は、データとモデルのライフサイクルを最初から運用設計に組み込むことだ。学習データは時系列とロット情報を保持し、いつの現場条件で撮影されたかを追跡可能にする。ラベルはルールブックと逸脱管理をセットにして、判定の揺らぎを最小化する。現場でのドメインシフトは必ず起こるため、影響を早期に検知するためのデータドリフトと性能監視を仕組み化しておく¹³²⁴。推論ログにはスコア分布としきい値近傍のヒットを記録しておくと、再学習の優先順位が付けやすい。

安全なリリース手法としては、シャドーデプロイで既存検査と並走させ、一定期間の混同行列を比較してから本番切替を行うとよい²⁵。現場の停止リスクを抑えるには、フェイルオープン/フェイルクローズの方針を製品安全基準に合わせて決め、エッジ端末が落ちた時のフォールバックを定義しておく²⁶。モデル更新はバージョン固定、ロールバック可能、データセットのスナップショットとセットで管理する。CI/CDには、前処理のハッシュとモデルのシグネチャ検証を含めると不整合が防げる¹³。

ROIについては、投資額をエッジ端末、カメラ・照明、学習基盤、開発・運用要員に分解し、効果は再検工数、不良流出コスト、スループットの増加分で積み上げる。一般的には、エッジ端末と撮像更新を含む初期投資が数百万円〜数千万円規模でも、過検出の削減とタクト短縮の積み上げで一年以内の回収を目指せるケースがある²⁵。スケール時は、同一アーキテクチャの水平展開と、モデル共通化による学習コストの逓減が効いてくる⁵。

ケーススタディの示唆:公開事例と内部ナレッジの交差

公開事例では、外観検査AIにより過検出を大幅に削減し、検査精度とスピードを同時に引き上げた報告がある。たとえばNVIDIAのパートナー事例では、画像検査ソフトウェアが偽陽性を抑える運用上の鍵として閾値設計と継続学習を挙げ、現場導入後に数週間単位で学習データを更新して精度を積み上げたとされる⁴。筆者の経験でも、導入初期はしきい値管理とUIの設計がボトルネックになりがちで、現場の再現性あるオペレーションに落とすには、モデルの説明性と保留フローの設計が鍵を握った。技術的には難しくなくとも、品質責任の所在を明確にし、意思決定プロセスにデータを組み込むと、現場の心理的安全性が高まり、改善が加速する。

まとめ:小さく始め、早く学び、広く展開する

画像認識による検品自動化は、モデルの精度競争ではなく、現場条件とKPIに合致した運用設計の勝負だ。撮像の一貫性を確立し、学習と推論のパイプラインを一致させ、精度指標を事業コストに翻訳する。この三拍子がそろうと、偽陽性の削減と不良流出の抑止が同時に進み、スループットの改善が利益に直結する。まずは一つの製品・一つの欠陥モードに絞り、シャドー運用でデータとKPIを集める。数週間で学習・評価・改善のサイクルを回し、合意できるしきい値とUIを固めたら、同アーキテクチャで横展開するのが近道だ。

次の一手として、既存カメラの前処理と小型モデルのエッジ推論から始めるのが現実的だ。関連する技術背景や詳細は、エッジ最適化の観点をまとめたエッジ推論の実践ガイド、モデル更新と監視を扱うMLOps for Vision、最適化フレームワーク比較のONNX/TensorRT活用法、導入ロードマップの製造業のAI検査事例集を参照してほしい。あなたのラインで最初にテコが効くのはどこか。今日のテスト設計が、明日の歩留まりを左右する。

参考文献

  1. Institute of Industrial and Systems Engineers (IISE). The cost of poor quality can range from 5% to 30% of sales. https://iise.org/Print/?Site=Main&id=22118
  2. Capgemini. AI in Manufacturing (2019). https://www.capgemini.com/wp-content/uploads/2019/03/AI-in-Manufacturing_POV.pdf
  3. オムロン ソリューション事例:画像検査×AIの活用による過検出抑制と品質向上. https://www.fa.omron.co.jp/solution/case/our_003/
  4. NVIDIA Developer Blog. Automatic Defect Inspection Using the NVIDIA End-to-End Deep Learning Platform. https://developer.nvidia.com/blog/automatic-defect-inspection-using-the-nvidia-end-to-end-deep-learning-platform/
  5. McKinsey. The state of AI in 2022—and a half-decade in review. https://www.mckinsey.com/capabilities/quantumblack/our-insights/the-state-of-ai-in-2022-and-a-half-decade-in-review
  6. Journal of Imaging (MDPI). Review of Un/Self-supervised Anomaly Detection for Industrial Visual Inspection, 10(5):111. https://www.mdpi.com/2313-433X/10/5/111
  7. Applied Sciences (MDPI). A Review of Industrial Surface Defect Detection Techniques in Deep Learning. https://www.mdpi.com/2076-3417/11/4/1753
  8. Zavrtanik, V.; Kristan, M.; Skocaj, D. DRAEM: A Discriminatively Trained Reconstruction Embedding for Surface Anomaly Detection (ICCV 2021). https://arxiv.org/abs/2108.07610
  9. ASQ. Cost of Quality (CoQ) / Cost of Poor Quality (CoPQ). https://asq.org/quality-resources/cost-of-quality
  10. NVIDIA DeepStream SDK. Real-time AI applications at the edge. https://developer.nvidia.com/deepstream-sdk
  11. KEYENCE. 照明の基礎と選定ガイド(マシンビジョン). https://www.keyence.co.jp/ss/products/vision/vision-basics/lighting.jsp
  12. Bergmann, P. et al. MVTec AD — A Comprehensive Real-World Dataset for Unsupervised Anomaly Detection (CVPR 2019). https://arxiv.org/abs/1909.05235
  13. Sculley, D. et al. Hidden Technical Debt in Machine Learning Systems (NIPS 2015). https://papers.nips.cc/paper_files/paper/2015/hash/86df7dcfd896fcaf2674f757a2463eba-Abstract.html
  14. He, K. et al. Deep Residual Learning for Image Recognition (CVPR 2016). https://arxiv.org/abs/1512.03385
  15. Kirillov, A. et al. Segment Anything (2023). https://arxiv.org/abs/2304.02643
  16. Ultralytics. YOLOv8 Docs. https://docs.ultralytics.com/
  17. PyTorch Docs. Exporting a model from PyTorch to ONNX. https://pytorch.org/docs/stable/onnx.html
  18. NVIDIA. TensorRT Developer Guide. https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html
  19. NVIDIA. TensorRT Best Practices and Performance Guide. https://docs.nvidia.com/deeplearning/tensorrt/best-practices/index.html
  20. Elkan, C. The Foundations of Cost-Sensitive Learning (IJCAI 2001). https://cseweb.ucsd.edu/~elkan/
  21. ISO 2859-1: Sampling procedures for inspection by attributes — Part 1. https://www.iso.org/standard/11427.html
  22. Journal of Intelligent Manufacturing (Springer). Data drift and domain shift in manufacturing analytics (2025). https://link.springer.com/article/10.1007/s10845-025-02569-6
  23. Selvaraju, R. R. et al. Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization (ICCV 2017). https://arxiv.org/abs/1610.02391
  24. Gama, J. et al. A Survey on Concept Drift Adaptation (ACM Computing Surveys 2014). https://dl.acm.org/doi/10.1145/2523813
  25. Google. Rules of ML: Best Practices for ML Engineering(Shadow/Canary運用の推奨). https://developers.google.com/machine-learning/guides/rules-of-ml
  26. IEC 61508: Functional safety of electrical/electronic/programmable electronic safety-related systems. https://webstore.iec.ch/publication/5510