研究開発の試験で撮る顕微鏡の画像から粒子・気泡・欠陥を数えて大きさの分布を出し、試料ごとの測定記録と見直す画像を出す
試作した試料の顕微鏡の画像から、粒子・気泡・欠陥を切り出して数え、大きさの分布を実寸で出します。試料ごとの測定記録と、人が見直すべき画像の一覧を出します。
- 連携・自動化
- Python
- 対象業界
- その他/医療/製造
- 対象部門
- 品質管理/研究開発
- 対象業務
- 記録・議事録作成/集計・分析
- 主な課題
- データ分析に時間がかかる/人手が足りない/属人化している
- AIで行う処理
- 画像認識
- 主な効果
- 品質標準化/属人化解消/工数削減
- 導入難易度
- ★★★★★
- 実装レベル
- 本格構成
- 費用感
- RAG・個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 担当が試料を顕微鏡で撮影し、試料番号の付いたフォルダにTIFFで保存する
- 画像解析ソフトで1枚ずつ開き、明るさのしきい値を手で合わせて対象を白黒に分ける
- くっついた粒子を手で区切り、画面の端にかかった粒子を数えるかどうかを決める
- ごみや傷を目で見て除き、粒子と気泡と欠陥を見分けて数える
- 大きさを測り、結果を表計算に書き写す
- 試料ごとに10枚前後の結果をまとめ、平均と分布を出す
- 測定記録をまとめて、試作を依頼した研究者に返す
- 人担当が試料を撮影し、試料番号と倍率の付いたフォルダにTIFFで保存する
- 自動保存をきっかけに、Python の処理が画像を読み込み、倍率から画素の大きさ(µm)を決める
- 自動画像の質(ピント、明るさのむら、白飛び)を測り、基準に届かない画像に印を付ける
- 自動しきい値で対象を切り出し、くっついた対象を分水嶺の処理で分ける
- 自動対象ごとに面積・円相当径・形の指標・明るさを測る
- 自動学習済みの分類モデルが、対象を粒子・気泡・欠陥・ごみに分け、確からしさを出す
- 自動画像ごと・試料ごとに数と大きさの分布をまとめ、見直す画像の一覧を作る
- 人担当が見直す画像を、切り出しの重ね描きで確かめ、必要なら除外か撮り直しを決める
- 人担当が試料ごとの測定記録を確かめ、研究者に返す
- 自動担当が直した分類は、次の学び直しのデータとして貯める
各工程の詳しい説明を読む
- 担当が試料を顕微鏡で撮影し、試料番号の付いたフォルダにTIFFで保存する
- 画像解析ソフトで1枚ずつ開き、明るさのしきい値を手で合わせて対象を白黒に分ける
- くっついた粒子を手で区切り、画面の端にかかった粒子を数えるかどうかを決める
- ごみや傷を目で見て除き、粒子と気泡と欠陥を見分けて数える
- 大きさを測り、結果を表計算に書き写す
- 試料ごとに10枚前後の結果をまとめ、平均と分布を出す
- 測定記録をまとめて、試作を依頼した研究者に返す
(a)しきい値と区切り方が担当に依存する。 2番目と3番目は担当の目で決まります。同じ画像でも、しきい値の位置で小さな粒子が出たり消えたりします。 担当が替わった時期から、粒子の大きさの分布が不自然に変わることがあります。
(b)数えた根拠が残らない。 測定記録に残るのは数と平均だけで、どのしきい値で、どの粒子を除いたかは残りません。 後から研究者に「この試料だけ数が多いのはなぜか」と聞かれても、確かめ直すには撮り直すか数え直すしかありません。
(c)画像の質のばらつきに気づきにくい。 ピントが少し外れた画像、照明のむらがある画像でも、担当はしきい値を合わせて数えてしまいます。数は出ますが、その数は他の画像と比べてよいものではありません。
(d)数えるのに追われて、見る時間がない。 1,200枚を5名で数えると、評価グループの時間の多くがここに取られます。試料を見て気づいたこと(凝集の形、気泡の出方の偏り)を書く時間がいちばん短くなります。
- 【人】 担当が試料を撮影し、試料番号と倍率の付いたフォルダにTIFFで保存する
- 【自動】 保存をきっかけに、Python の処理が画像を読み込み、倍率から画素の大きさ(µm)を決める
- 【自動】 画像の質(ピント、明るさのむら、白飛び)を測り、基準に届かない画像に印を付ける
- 【自動】 しきい値で対象を切り出し、くっついた対象を分水嶺の処理で分ける
- 【自動】 対象ごとに面積・円相当径・形の指標・明るさを測る
- 【自動】 学習済みの分類モデルが、対象を粒子・気泡・欠陥・ごみに分け、確からしさを出す
- 【自動】 画像ごと・試料ごとに数と大きさの分布をまとめ、見直す画像の一覧を作る
- 【人】 担当が見直す画像を、切り出しの重ね描きで確かめ、必要なら除外か撮り直しを決める
- 【人】 担当が試料ごとの測定記録を確かめ、研究者に返す
- 【自動】 担当が直した分類は、次の学び直しのデータとして貯める
8番目が、この設計の分かれ目です。人が見るのは全枚ではありません。 画像の質が基準を満たし、分類の確からしさが十分な画像は、重ね描きを一覧で流し見て終わりにします。印の付いた画像だけを開きます。 全枚を開く設計にすると、100.0時間はほとんど減りません。
2番目で倍率から画素の大きさを決めているのも、意図してのことです。 画像の目盛り(スケールバー)を読み取って実寸を出す方法もありますが、目盛りの読み取りを誤ると、すべての大きさが同じ割合でずれます。 倍率ごとに校正した値を表で持つほうが確実です。
02今回想定するシステム構成
光学顕微鏡のカメラ(TIFF、試料番号・倍率のフォルダ) │ ▼【トリガー】フォルダへの保存(数分おきに確認) Python(scikit-image) │ ① 画像の質の測定(ピント・むら・白飛び) │ ② しきい値で切り出し(threshold_otsu/threshold_local) │ ③ 分水嶺でくっついた対象を分ける(watershed) │ ④ 端にかかった対象の扱い(clear_border) │ ⑤ 対象ごとの測定(regionprops_table、spacing で実寸) ▼ Python(scikit-learn の HistGradientBoostingClassifier) │ 粒子/気泡/欠陥/ごみ と確からしさ ▼ 画像ごと・試料ごとの集計 ── 数、円相当径の分布(D10・D50・D90) │ ├──▶ 見直す画像の一覧(質の印・確からしさの低い対象) ▼ 【人が重ね描きで確かめ、測定記録を返す】 ▼ 直した分類の蓄積 ── 月1回の学び直し
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(scikit-image と scikit-learn の HistGradientBoostingClassifier) | OpenCV、MATLAB |
| データの取得元 | 顕微鏡のカメラの保存フォルダ | 顕微鏡メーカーの画像管理の仕組み |
| 通知 | 評価グループへのチャット | メール |
| 保存 | 社内のデータベースと共有フォルダ | 実験記録の仕組み |
顕微鏡にも、カメラの設定にも書き込みません。 この構成は保存された画像を読むだけです。カメラの保存形式とメタデータの入り方は機種ごとに違うため、試料番号と倍率を、フォルダ名で確実に渡せるかを最初に確かめます。
画像処理に scikit-image を選ぶ理由は、切り出しから測定までを1つの流れで書けることです。 regionprops_table は、ドキュメントでは特性の名前から値の配列への辞書を返すとされ、そのまま pandas の表にでき、対象ごとの測定値を1行ずつ記録に残せます。 また spacing で画素の間隔を渡すと、面積が画素の数ではなく画素の面積で拡大した値になります。倍率ごとの校正値をここに渡せば、µm で記録が出ます。
分類に HistGradientBoostingClassifier を選ぶ理由は、少ない特徴量の表から、区分ごとの確率を出せることです。 predict_proba が区分ごとの確率を返すため、いちばん高い確率が低い対象を「自信が無い」として人に回せます。 画像そのものを学ぶ深層学習の手法もありますが、評価グループが用意できるのは数千個の対象の手作業の分類で、形と明るさの数値から分けるほうが、少ない手間で始められます。
03どうやって実装するのか
処理の起点を決める
フォルダへの画像の保存を起点にします。 共有フォルダを数分おきに確かめ、新しい画像があれば処理します。試料の撮影が終わるのを待たず、1枚ずつ処理します。 撮影している間に最初の画像の質の印が返ってくれば、顕微鏡の前にいるうちに撮り直せます。
試料ごとのまとめは、そのフォルダに「撮影終了」の印のファイルが置かれた時点で行います。 枚数で判断すると、10枚の予定で12枚撮った試料が途中で締められます。印は担当が置き、置き忘れは翌朝に一覧で知らせます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 顕微鏡の画像 | TIFF、試料番号、倍率、撮影日時、撮影者 | 共有フォルダ(フォルダ名とファイル名) |
| 倍率ごとの校正値 | 倍率ごとの1画素の大きさ(µm)、校正した日 | 評価グループで管理する表 |
| 処理の設定(レシピ) | 試料の種類ごとのしきい値の方法、最小の大きさ、分水嶺の設定、画像の質の基準 | 評価グループで管理する設定のファイル |
| 分類の学習データ | 担当が手で分けた対象(粒子・気泡・欠陥・ごみ)と、その測定値 | 社内のデータベース |
質を決めるのは、2行目の校正値です。 倍率を変えたのに校正値の表が古いままだと、すべての大きさが同じ割合でずれ、誰も気づきません。 校正値には校正した日を付け、一定の期間を過ぎたら知らせます。
3行目のレシピは、試料の種類ごとに分けます。 塗料の顔料の粒子と、フィルムの気泡では、背景と対象の明るさの関係が逆のことがあります。1つの設定で全部を処理しようとすると、どちらかが必ず崩れます。
データの取得方法を決める
画像は、フォルダ名が「試料番号_倍率」の形になっている前提で読み込みます。フォルダ名から試料番号と倍率を取り出せないものは、処理せずに知らせます。 倍率の分からない画像を処理すると、実寸が出せないからです。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 画像 | 共有フォルダのTIFF | 切り出しと測定 |
| 試料番号と倍率 | フォルダ名 | 校正値とレシピの選択 |
| 校正値 | 評価グループの表 | spacing に渡す画素の大きさ |
| レシピ | 設定のファイル(版付き) | しきい値の方法、最小の大きさ |
| 試料の種類 | 試作の依頼の一覧 | レシピの選択 |
レシピは版を付けて管理し、測定記録にはその版を書きます。 しきい値の方法や最小の大きさを変えると、同じ画像でも数が変わります。版が記録に無いと、去年の試料と今年の試料の数を比べてよいかが分かりません。
AIへ渡す前に整形する
- 画像の質の測定 … ピントの指標(明るさの細かい変化の量)、明るさのむら(画像の四隅と中央の差)、白飛びの割合を測り、基準に届かない画像に印を付けます
- むらの補正 … 照明のむらが基準内でも残る場合は、背景を大きくぼかした画像で割って平らにします
- しきい値 … 背景が平らな試料は
threshold_otsu、むらが残る試料はthreshold_localを使います。どちらを使うかはレシピで決めます - 小さすぎる対象の除外 … レシピで決めた最小の大きさ(µm)より小さい対象はノイズとして除き、その大きさを測定記録に「検出の下限」として書きます
- くっついた対象の分離 … 背景からの距離を計算し、その頂点を目印にして
watershedで分けます - 端にかかった対象 …
clear_borderで、画像の端に接する対象を数から外します。外した数を記録します
3番目の使い分けには根拠があります。 ドキュメントでは、threshold_otsu は画像全体から1つのしきい値を返し、それより明るい画素を前景とみなします。threshold_local は、画素ごとに近くの範囲の重み付きの平均から定数を引いた値をしきい値にします。照明のむらがある画像に全体で1つのしきい値を当てると、画像の片側で粒子が消えます。
6番目は、分布に偏りを生みます。 大きな対象ほど画像の端にかかりやすいため、端の対象を外すと大きな対象が少なめに数えられます。 外した数を記録しておけば、偏りの大きさを後から確かめられます。視野を広く撮れる試料なら、倍率を下げて端にかかる割合を減らすほうが確実です。
AIに処理させる
この構成の「AI」は2つの部品に分かれます。 対象を切り出して測るのが scikit-image の処理、切り出した対象を種類に分けるのが分類モデルです。どちらも、試料の良し悪しは決めません。
| 部品 | させること | させないこと |
|---|---|---|
| scikit-image(切り出しと測定) | 対象の切り出し、くっついた対象の分離、面積・円相当径・形・明るさの測定 | 画像の質が基準に届かない画像の数の確定 |
| HistGradientBoostingClassifier | 対象ごとに粒子・気泡・欠陥・ごみに分け、確率を出す | 学習に無い形の対象を無理に既存の区分に入れること |
| 集計(Python) | 画像ごと・試料ごとの数と分布、見直す画像の一覧 | 試料の合否 |
分類に使う特徴量は、regionprops_table で測る値です。 面積(area)、円相当径(equivalent_diameter_area、同じ面積の円の直径)、凸包に対する画素の割合(solidity)、楕円の離心率(eccentricity、0なら円)、最大のフェレ径(feret_diameter_max)、明るさの平均と標準偏差です。気泡は丸く(離心率が小さく)、中が明るく縁が暗いことが多く、欠陥は細長いか形がいびつです。 こうした違いを、担当の手作業の分類から学ばせます。
確率がいちばん高い区分でも0.7に届かない対象は、「自信が無い」として人に回します。 0.7はレシピで決める値で、運用を始めてから見直します。画像のなかで「自信が無い」対象が多い画像は、見直す画像の一覧に載せます。
大きさの分布は、円相当径の累積で出します。 小さいほうから数えて10%・50%・90%の位置の径を D10・D50・D90 とし、試料ごとに記録します。ただし、これは画像の上の個数の分布です。 体積や重さの分布とは違うため、別の測定法の結果と比べるときはその違いを記録に書きます。
| させないこと | 理由 |
|---|---|
| 試料の合否を決める | 規格への適合は研究者と品質の担当が決める |
| 画像の質の印を無視して数を確定する | ぼけた画像の数は他の画像と比べられない |
| 学習に無い形を既存の区分に入れる | 新しい欠陥の種類が見えなくなる |
| レシピを試料ごとに自動で変える | 版が記録と合わなくなる |
指示内容を固定する
この構成では、生成AIへのプロンプトの代わりに、処理の設定(レシピ)が指示にあたります。 試料の種類ごとに次のような設定を版付きで持ちます。
{
"recipe_id": "film-bubble",
"version": "1.3",
"sample_type": "機能性フィルムの気泡と欠陥",
"threshold": { "method": "local", "block_size": 51, "offset": 0.02 },
"polarity": "dark_objects_on_bright",
"min_size_um": 2.0,
"watershed": { "min_distance_um": 3.0 },
"exclude_border": true,
"quality": { "focus_min": 120.0, "uneven_max": 0.15, "saturated_max": 0.01 },
"classifier": { "model_version": "2026-10-01", "min_proba": 0.7 }
}
処理の中心は次のとおりです。 spacing に校正値を渡して、測定値を µm で受け取ります。
from skimage import filters, measure, segmentation
import pandas as pd
um = calib[magnification] # 倍率ごとの1画素の大きさ(µm)
if recipe["threshold"]["method"] == "local":
th = filters.threshold_local(img, block_size=recipe["threshold"]["block_size"],
offset=recipe["threshold"]["offset"])
else:
th = filters.threshold_otsu(img)
mask = img < th if recipe["polarity"] == "dark_objects_on_bright" else img > th
labels = segmentation.watershed(-distance, markers, mask=mask) # 背景からの距離の頂点を目印に
labels = segmentation.clear_border(labels)
props = measure.regionprops_table(
labels, intensity_image=img, spacing=(um, um),
properties=("label", "area", "equivalent_diameter_area", "eccentricity",
"solidity", "feret_diameter_max", "intensity_mean", "intensity_std"))
df = pd.DataFrame(props)
df = df[df["equivalent_diameter_area"] >= recipe["min_size_um"]]
proba = clf.predict_proba(df[FEATURES]) # 粒子/気泡/欠陥/ごみ
polarity を設定に持つのは、対象が背景より暗いか明るいかが試料で逆になるからです。 透過の照明で撮るフィルムの気泡は暗く、反射で撮る塗膜の粒子は明るいことがあります。これを処理の中で自動判定させると、背景のほうを対象として数える画像が出ます。
min_size_um を画素ではなく µm で持つのは、倍率を変えても同じ基準にするためです。 画素で持つと、倍率を上げた画像では同じ大きさの対象が多くの画素になり、検出の下限が倍率ごとに変わります。
出力形式を固定する
次の形のJSONを、画像ごとと試料ごとに作ります。
{
"sample_id": "F-2026-1006-12",
"image": "F-2026-1006-12_x200_07.tif",
"magnification": "x200",
"um_per_px": 0.55,
"recipe": "[email protected]",
"quality": { "focus": 142.3, "uneven": 0.08, "saturated": 0.002, "pass": true },
"counts": { "particle": 0, "bubble": 18, "defect": 3, "debris": 5, "uncertain": 2 },
"border_excluded": 4,
"detection_limit_um": 2.0,
"review": { "needed": false, "reasons": [] },
"overlay": "overlay/F-2026-1006-12_x200_07.png"
}
{
"sample_id": "F-2026-1006-12",
"images_total": 10,
"images_used": 9,
"images_excluded": [{ "image": "..._03.tif", "reason": "focus" }],
"area_mm2": 2.43,
"bubble_per_mm2": 7.8,
"defect_per_mm2": 1.2,
"bubble_diameter_um": { "D10": 3.1, "D50": 6.4, "D90": 14.8 },
"recipe": "[email protected]",
"model_version": "2026-10-01",
"checked_by": "",
"checked_at": ""
}
1つ目の理由は、数と根拠を同じ記録に置けることです。 recipe、um_per_px、detection_limit_um が数と同じ行にあるので、後から「この数はどの基準で数えたか」を答えられます。
2つ目は、除外した画像を記録に残すことです。 試料の平均は images_used の画像だけで出し、外した画像と理由は images_excluded に残します。10枚撮って9枚で出した平均を、10枚の平均と区別できます。
3つ目は、overlay です。 切り出した輪郭と区分を色で重ねた画像を保存し、人が確かめるときは元の画像ではなくこれを開きます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 共有フォルダ | 定期的な確認(読み取り) | 新しい画像と「撮影終了」の印 |
| 校正値とレシピ | 表と設定のファイルの読み取り | 画素の大きさ、処理の設定 |
| 社内のデータベース | 書き込み | 対象ごとの測定値、画像ごと・試料ごとの集計 |
| 評価グループのチャット | 通知 | 画像の質の印、見直す画像の一覧 |
| 測定記録の表 | 書き出し | 試料ごとの集計(担当の確認後) |
測定記録の表へは、担当が確かめた後にだけ書き出します。 確かめる前の数が研究者に届くと、撮り直す前のぼけた画像の数で試作の判断が始まります。
人が確認する
人が開くのは、見直す画像の一覧に載った画像だけです。
- 画像の質の印を見る … ピントやむらの印が付いた画像は、撮り直すか除外するかを決めます。撮影中なら、その場で撮り直します
- 「自信が無い」対象の多い画像を見る … 重ね描きで、どの対象が迷われたかを見て、正しい区分に直します
- 数が試料の他の画像から大きく外れた画像を見る … 視野に異物が入っていないか、対象が重なりすぎていないかを確かめます
- 試料ごとの集計を確かめる … 除外した画像の数と理由を見て、測定記録として返してよいかを決めます
一覧に載らなかった画像からも、毎週ランダムに数枚を開きます。 印が付かないまま数がずれていく変化(レンズの汚れ、照明の劣化)は、一覧だけを見ていると気づけません。
目標は、1,200枚をならして1枚1分です。 一覧に載らない画像は重ね描きを流し見るだけで、一覧に載った画像に時間を使います。
例外に対処する
| 起きること | 対応 |
|---|---|
| フォルダ名から倍率が取れない | 処理せずに知らせる。実寸の無い数を出さない |
| 校正値が古い | 処理は続けるが、測定記録に「校正の期限切れ」を付ける |
| ピントが外れている | 数を確定せず、撮り直しを知らせる |
| 対象が重なりすぎて分けられない | 対象の面積の割合が基準を超えたら「重なり過多」として人に回す |
| 学習に無い形の対象が多い | 「自信が無い」として人に回す。既存の区分に入れない |
| 試料の種類のレシピが無い | 処理せずに知らせる。近いレシピで代用しない |
| 「撮影終了」の印が無い | 翌朝に一覧で知らせる |
| 処理が途中で止まる | その画像を「未処理」として残し、再実行する |
5行目の学習に無い形は、新しい種類の欠陥の可能性があります。 既存の区分に無理に入れると、試作の条件を変えたことで出た新しい欠陥が、ごみとして消えます。 担当が新しい区分を足すかどうかを決めます。
記録を残す
- 元の画像と、切り出しの重ね描きの画像
- 対象ごとの測定値(
regionprops_tableの表)と、分類の区分と確率 - 画像ごと・試料ごとの集計、レシピの版、校正値、分類モデルの版
- 画像の質の測定値と、除外した画像とその理由
- 人が直した分類の記録 … どの対象を、どの区分からどの区分へ直したか
- 担当が確かめた日時と担当者
3つ目の版の記録が、この構成でいちばん大事です。 数が試料の違いで変わったのか、数え方の違いで変わったのかを、後から切り分けられるのはこの記録だけです。
04実装レベルの3段階
半自動化で、1枚5分が2分程度になります。 切り出しと測定は自動になりますが、ごみと粒子を見分ける作業と、画像の質の確認が手作業で残ります。本格構成で1分になり、この段階が本記事の想定です。 差が大きいのは、ごみの除外と画像の質の確認が、全枚から印の付いた画像だけに絞られるからです。 段階を飛ばさないでください。 半自動化の重ね描きを1か月見ると、どの試料の種類で切り出しが崩れやすいかと、ごみの典型的な形が分かります。それを担当が分類した対象が、分類のモデルの最初の学習データになります。 試料の種類を広げるのも、1種類ずつにしてください。 塗料の粒子で本格構成が安定してから、フィルムの気泡に広げます。種類ごとにレシピと分類の学習データが要るため、同時に始めると、どの種類で崩れているのかが分からなくなります。
05工数削減シミュレーション
導入後 1,200件 × 1分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 材料・塗料・樹脂・医薬品などの研究開発で、試作した試料の顕微鏡の画像を毎月千枚単位で撮り、粒子の数と大きさ、気泡や欠陥の数を担当者が画像解析ソフトで手で数えている部門。しきい値や数え方が担当者ごとに違い、同じ画像でも人によって数がずれる場合。倍率ごとの画素の大きさが校正されていて、撮影の条件をある程度そろえられる場合。
- 画像が月に数十枚で、手で数えても負担にならない場合。粒子どうしが厚く重なり、平面の画像では一つひとつを見分けられない試料。撮影の倍率や照明が毎回ばらばらで、画素の大きさが分からない画像。なお、測った分布から試料の良し悪しや規格への適合を決める判断は、この構成では代替できません。
07最小構成で試す方法
- 過去に手で数えた試料から、30試料分の画像(300枚前後)を選ぶ(担当によって数がずれた試料を必ず含める)
- 試料の種類を1つに絞り、レシピを1つ作る
- scikit-image で切り出しと測定だけを行い、分類はせずに対象の数と円相当径の分布を出す
- 手で数えた結果と並べ、数と D50 の差を試料ごとに表にする
- 差の大きい画像を担当と一緒に重ね描きで見て、どちらの数え方が妥当かを話し合う
30試料は必ずやってください。 分類のモデルを作る前に、「処理の設定を固定すれば、手の数え方と同じくらいの数が出るのか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 数と D50 が手の結果とほぼ合う | 分類のモデルの作成に進む |
| 担当によってずれていた試料で、処理の数が担当の間に入る | 数え方の基準をそろえる効果がある。構成は有効 |
| 画像によって数が大きく外れる | 撮影の条件(ピント、照明)をそろえるのが先 |
3行目が出ることは珍しくありません。 手で数えるときは、担当がしきい値を画像ごとに合わせて、撮影のばらつきを吸収していました。処理の設定を固定すると、そのばらつきが表に出ます。 照明の条件を決め、同じ30試料を撮り直して比べてください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 画像の片側で粒子が消える | 照明のむら。むらを補正するか threshold_local を使う |
| くっついた粒子が1つに数えられる | 背景からの距離の頂点を目印に watershed で分ける |
| 1つの粒子が2つに割れる | 目印が多すぎる。目印の最小の間隔を µm で設定する |
| 大きな粒子が少なめに出る | 端にかかった対象の除外による偏り。外した数を記録し、倍率を見直す |
| 倍率を変えたら大きさがずれた | 校正値の表が古い。校正した日を付けて管理する |
| 背景を対象として数える | polarity をレシピで持ち、自動判定させない |
| ぼけた画像の数が混ざる | 画像の質を測り、基準に届かない画像の数を確定しない |
| 新しい種類の欠陥がごみに入る | 確率が低い対象は人に回す。既存の区分に無理に入れない |
| 去年の数と比べられない | レシピと分類モデルの版を記録する |
| 個数の分布を体積の分布と比べる | 画像の上の個数の分布であることを記録に書く |
| 学習データがごみに偏る | 区分ごとの対象の数をそろえて学ばせ、少ない区分は担当が追加で分ける |
| 一覧に載らない画像を誰も見ない | 毎週ランダムに数枚を開き、ずれの変化を拾う |
上の2行が、この構成の失敗のほとんどです。 どちらも数は出るので気づきにくく、手の結果と並べて初めて分かります。 最小構成で30試料を手の結果と比べる段階を、省かないでください。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 試作した試料の顕微鏡の画像、測定値、そして試作の条件と結び付いた評価の結果です。
- 画像と測定値を社外に出さない … 試作品の画像と評価の結果は、研究開発の成果そのものです。 この構成は社内のPCで動き、外部のサービスに画像を送りません
- 数え方を変えたら版を上げる … レシピのしきい値や最小の大きさを変えたら、必ず版を上げます。版を変えずに設定を変えると、過去の数との比較が誰にも気づかれずに崩れます
- 合否を処理に決めさせない … 規格に合うかどうかは、研究者と品質の担当が決めます。この構成が出すのは数と分布と根拠の画像までです
- 除外の記録を消さない … 画像を除外した理由は、測定の信頼性の根拠です。都合の悪い画像を理由なく除くことができない記録にしておきます
- 人が直した記録を残す … 分類を直した記録は、学び直しのデータであると同時に、数がどう決まったかの根拠です
誤りが起きた場合のリスクは、数え方のずれを試料の違いと読むことと、新しい欠陥を見落とすことの2つです。 前者は版と校正値の管理の漏れで起き、後者は学習に無い形を既存の区分に入れることで起きます。どちらも記録と、自信の無い対象を人に回す設計で守ります。
10まず何から始めるか
1週目:校正値の表と撮影の手順を作る
倍率ごとの1画素の大きさを校正し、校正した日を付けて表にします。 あわせて、照明とピントの合わせ方の手順を決めます。
2週目:30試料で試す
過去に手で数えた30試料の画像で、固定のレシピによる切り出しと測定を行い、手の結果と並べます。 担当によってずれていた試料で、処理の数がどこに出るかを見ます。
3週目:レシピを決める
試料の種類ごとに、しきい値の方法、最小の大きさ、polarity を決め、版を付けます。 ここが決まらないうちに仕組みを組むと、数は出るのに誰も比べられない状態になります。
4週目:フォルダから集計までをつなぐ
フォルダへの保存を起点に切り出しと測定を行い、画像ごとの数と重ね描きを出すところまで作ります。この時点では分類をせず、担当が重ね描きで対象を分け、学習データを貯めます。
2か月目: 分類のモデルと画像の質の判定を足し、見直す画像の一覧を出します。3か月目以降: 人が直した分類で学び直し、1枚5分が何分になったかを実測します。同じ試料を2人が回して同じ数が出て、版と校正値が測定記録に入るようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
label が連結した領域に番号を付けること。regionprops で area、equivalent_diameter_area(同じ面積の円の直径)、eccentricity(0なら円)、solidity(凸包に対する画素の割合)、feret_diameter_max、intensity_mean などを測れること。area が spacing で決まる画素の面積で拡大されること。spacing が各軸の画素の間隔であること。regionprops_table が特性の名前から値の配列への辞書を返し、pandas の表にできること | scikit-image: skimage.measure | 2026-10-06 |
watershed が目印から流域を満たす処理で、背景からの距離の頂点を目印にして接した対象を分ける使い方が示されていること。clear_border が画像の端に接する対象を取り除くこと | scikit-image: skimage.segmentation | 2026-10-06 |
threshold_otsu が大津の方法でしきい値を返し、それより明るい画素を前景とみなすこと。threshold_local が近くの範囲の重み付きの平均から定数を引いた値をしきい値にし、block_size が奇数の範囲の大きさであること | scikit-image: skimage.filters | 2026-10-06 |
HistGradientBoostingClassifier の predict_proba がクラスごとの確率を返すこと。categorical_features の既定が 'from_dtype' であること | scikit-learn: HistGradientBoostingClassifier | 2026-10-06 |
測った分布から試料の合否を決める基準は、研究者と品質の担当で決めてください。 本記事は製品の公開ドキュメントで確認できた範囲だけを扱っています。顕微鏡のカメラの保存形式とメタデータの入り方は機種ごとに違い、本記事では確かめていません。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0580)についてのご相談はこちらから。
