Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
外観検査用画像前処理の_コツをコード解説付きで。/20220810_CDLE_LT
Search
ITO Akihiro
August 10, 2022
Technology
0
10
外観検査用画像前処理の_コツをコード解説付きで。/20220810_CDLE_LT
2022年 JDLA 合格者の会/CDLE LT
--
外観検査用画像前処理の_コツをコード解説付きで。
ITO Akihiro
August 10, 2022
Tweet
Share
More Decks by ITO Akihiro
See All by ITO Akihiro
「重鎮問題」について(軽めに)
akit37
0
40
Software + Hardware = Fun++
akit37
0
17
基本的に "リモートしかない" ワーク/20231128_KBS_LT
akit37
0
14
3つの先端技術が コミュニティ軸で融合した話。/20230615_CMCMeetup
akit37
0
12
Bootleg_越境してみたときのアウェイ感。/20230328_CMCMeetup
akit37
0
19
始まりは2017年のG検定。/20221026_AITable
akit37
0
10
kintone知能化計画/20220902_kintone_and_JPStripes
akit37
0
18
サブスク課金に銀行振込を追加してみた。その①/20220713_JPStripes
akit37
0
17
CDLE LT会「お試しプログラミング forとifとfunction()」/20200930_CDLE_LT
akit37
0
11
Other Decks in Technology
See All in Technology
Accessibility Inspectorを活用した アプリのアクセシビリティ向上方法
hinakko
0
180
ABWGのRe:Cap!
hm5ug
1
120
商品レコメンドでのexplicit negative feedbackの活用
alpicola
1
350
Visual StudioとかIDE関連小ネタ話
kosmosebi
1
370
Cloudflareで実現する AIエージェント ワークフロー基盤
kmd09
0
290
EMConf JP の楽しみ方 / How to enjoy EMConf JP
pauli
2
150
DMMブックスへのTipKit導入
ttyi2
1
110
デジタルアイデンティティ技術 認可・ID連携・認証 応用 / 20250114-OIDF-J-EduWG-TechSWG
oidfj
2
670
2024年活動報告会(人材育成推進WG・ビジネスサブWG) / 20250114-OIDF-J-EduWG-BizSWG
oidfj
0
220
My small contributions - Fujiwara Tech Conference 2025
ijin
0
1.4k
機械学習を「社会実装」するということ 2025年版 / Social Implementation of Machine Learning 2025 Version
moepy_stats
5
1k
GeometryReaderやスクロールを用いた表現と紐解き方
fumiyasac0921
0
100
Featured
See All Featured
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Building Adaptive Systems
keathley
38
2.4k
Fireside Chat
paigeccino
34
3.1k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
19
2.3k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
7k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
173
51k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.5k
The Cult of Friendly URLs
andyhume
78
6.1k
Code Reviewing Like a Champion
maltzj
521
39k
A Modern Web Designer's Workflow
chriscoyier
693
190k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.2k
Transcript
外観検査用画像前処理の コツをコード解説付きで。 2022.8 合格者の会2022/CDLE LT Akihiro ITO
モチベーション • 高性能な異常検知モデル「PaDiM」を簡単に使えるようにしたい。 ◦ PaDiM:https://arxiv.org/pdf/2011.08785.pdf • 動作環境として、connectome.design社開発のmetabase®を利用する。 データを放り込むだけで、どの程度検知できるか試せるように。 • 撮像したデータをPaDiMの入力に合わせるための前処理が意外と面倒。
→ 汎用的な前処理を作ろう!
FYI:Overview of PaDiM • 2020年11月に発表された、不良品検知を行 う機械学習モデル。 • 正常品のみの画像から再学習不要で不良 品検知が実装可能。 •
不良品検知のデータセットである MVTec AD でSOTAを達成。 出展:https://arxiv.org/pdf/2011.08785.pdf
FYI:Overview of MVTec AD • 2019年6月に公開されたデータセット。 • 15のカテゴリーに分類され、工業製品や農 作物の画像。 •
欠陥領域のセグメンテーションデータも含ま れる。 出展:https://www.mvtec.com/company/research/datasets/mvtec-ad
今回のターゲット画像。 • コンソメキューブの包み方の外観検査。 • Good / Bad の2値分類。 • 入力画像は、ベルトコンベア上を流れてくる
対象を撮像するため、画像ファイル内での位 置が不定。 → PaDiMで使える画像にする。
前処理でやること。 1. 物体が画像の中心に配置された、 224 x 224 pxのカラーpngファイルを作る。 2. 精度確認用の、224 x
224 pxのモノクロ2値pngファイルを作る。 3. 各ディレクトリ(=フォルダと同義)への振り分け ※今回は、時間の関係で ”1”のみ紹介。
どう処理するか? 1. 物体を検出して切り出す。 → 最新のDETRを使用 DETR:DEtection Transformer 2020年に発表されたTransformerを使った物体検出手法。 ※FasterRCNNも試したが、DETRの方が精度がよかった。 2.
PaDiMで使えるように、画像のサイズを揃え、画像の中心に 物体を配置する。
全体の処理構造 result = step1_DetectAndCrop.prePadim_step1(searchpath, indir, outdir_step1) if result == 0:
print("Error! Step1. No File Saved to: ", outdir_step1) return False result = step2_Align.prePadim_step2(searchpath2, outdir_step1, outdir_step2, args.bgcolor) if result == 0: [エラー処理] • 途中結果を確認しやすい&再利用しや すい単位でステップを分割する。 ◦ Step1:DETRを使って画像の中から物 体を検出し、画像を切り出す。 ◦ Step2:正しく検出と切り出しができない 画像は捨てて、すべて同じサイズに揃 える。 • ステップごとに必ず処理結果を判定し、 エラー処理を入れること。
ディレクトリ構造の処理のコツ parser = argparse.ArgumentParser() parser.add_argument('-d', '--data_path', type=str) parser.add_argument('-s', '--save_path', type=str)
cwd = os.getcwd() targetdir_in = os.path.join(args.data_path, args.target) targetdir_out = os.path.join(args.save_path, args.target) • 入出力ディレクトリ名は、引数として受け 取れるようにした方が良い。 • 上位の構造に依存しないよう、 Current Working Directory を最上位として処理する。 → フルパス入れちゃダメ。 • パスを組み立てる時は、文字列結合で はなく、 os.path.join() を使う。 → “/”入力の有無を問わないように。
ディレクトリ構造全体から対象ファイルを探すコツ # 各種定義 filetype = “.png” wildcard = “/**/*” searchpath
= os.path.join(indir, wildcard + filetype) if len(glob.glob(searchpath, recursive=True)) == 0: print("Error! Step1. File Not Found in: ", searchpath) return False else: [実際の処理] • 特定の数字や文字列( マジックナンバー) をソースコードの途中に埋め込まず、まと めて定義する。 • パスに、“ /**/* ”を含めると、配下のディ レクトリ階層すべてから、対象ファイルを 検出できる。 • 「対象ファルが一つも見つからない場合」 のエラー処理を必ず入れること。
簡易化のため、うまく検出できなかった画像は諦める! [画像を開いてサイズを配列に入れるループ処理 ]: size_mean = np.mean(image_size_array, axis=0) size_std = np.std(image_size_array,
axis=0) size_limit_low = size_mean - size_std size_limit_high = size_mean + size_std if limit_low_w <= img.width and img.width <= limit_high_w and limit_low_h <= img.height and img.height < limit_high_h: [実際の処理] • 検出と切り出しに失敗した画像は、画 像サイズが異なる。 • 平均と分散から、作成すべき基本画像 サイズを求める。 • 画像サイズから平均と標準偏差を計算 し、外れ値となる画像を除く。
同じ背景色・サイズの画像に揃える。 background_color=(0,0,0) if bgcolor == 'white': background_color=(255,255,255) [画像を開くループ処理 ]: img_new
= Image.new(img.mode, box_size, background_color) left = int((box_wh - img.width) // 2) top = int((box_wh - img.height) // 2) img_new.paste(img, (left, top)) img_new.save(os.path.join(outdirname, os.path.basename(file))) • 基本画像の背景色を引数から受け取 る。(背景は、黒か白でよいはず) • 基本画像を生成し、元の画像をその中 心に貼り付ける。
これで、入力画像から学習用画像が生成される。
まとめ • 今回の例 ◦ ファイル数:4 ◦ ソースコードの行数:約250行(空行含む) • AIのサンプルコードは、パスやファイル名なども含め特定の文字列が直接書き込まれてい たり、画像サイズや形式も限定されている場合が多い。
• 実務利用に向けて汎用的に使えるようにするためには、課題に合わせて修正する箇所が 極力少なくなるように作り込む必要がある。 • また例えば、 ”for i in range(10):” のようにいわゆるマジックナンバーが埋め込まれてい るとコードの解読や修正に手間がかかるので、必ず定義すること。 epoch = 10 for i in range(epoch):
ソースコードは、美しく。