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
Software + Hardware = Fun++
akit37
0
12
基本的に "リモートしかない" ワーク/20231128_KBS_LT
akit37
0
11
3つの先端技術が コミュニティ軸で融合した話。/20230615_CMCMeetup
akit37
0
9
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
14
CDLE LT会「お試しプログラミング forとifとfunction()」/20200930_CDLE_LT
akit37
0
10
AI、何から始めたらいい?/20200205_AIMeetup
akit37
0
7
Other Decks in Technology
See All in Technology
20241120_JAWS_東京_ランチタイムLT#17_AWS認定全冠の先へ
tsumita
2
250
マルチプロダクトな開発組織で 「開発生産性」に向き合うために試みたこと / Improving Multi-Product Dev Productivity
sugamasao
1
300
ISUCONに強くなるかもしれない日々の過ごしかた/Findy ISUCON 2024-11-14
fujiwara3
8
870
データプロダクトの定義からはじめる、データコントラクト駆動なデータ基盤
chanyou0311
2
310
社内で最大の技術的負債のリファクタリングに取り組んだお話し
kidooonn
1
550
障害対応指揮の意思決定と情報共有における価値観 / Waroom Meetup #2
arthur1
5
470
エンジニア人生の拡張性を高める 「探索型キャリア設計」の提案
tenshoku_draft
1
120
テストコード品質を高めるためにMutation Testingライブラリ・Strykerを実戦導入してみた話
ysknsid25
7
2.6k
Amazon CloudWatch Network Monitor のススメ
yuki_ink
1
200
Introduction to Works of ML Engineer in LY Corporation
lycorp_recruit_jp
0
120
Platform Engineering for Software Developers and Architects
syntasso
1
520
Lambdaと地方とコミュニティ
miu_crescent
2
370
Featured
See All Featured
A Tale of Four Properties
chriscoyier
156
23k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
250
21k
Facilitating Awesome Meetings
lara
50
6.1k
The Invisible Side of Design
smashingmag
298
50k
BBQ
matthewcrist
85
9.3k
Making the Leap to Tech Lead
cromwellryan
133
8.9k
Building Better People: How to give real-time feedback that sticks.
wjessup
364
19k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
410
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Bash Introduction
62gerente
608
210k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.8k
Statistics for Hackers
jakevdp
796
220k
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):
ソースコードは、美しく。