Open GENZITSU opened 2 years ago
車両に搭載したカメラで撮影した画像からインフラ設備の錆を検出するシステムがNTTから発表
いかのような車両で
以下のようなパイプラインで推論をかけている
以下が定量評価と定性評価。
やけに高い精度であるのは、分子分母が画像単位で集計されているから。
各構造物のsegmentationまでやってるので、すごいコストかけたんだろうなあと思ったら以下のような記載が
この画像認識AIは、実地で取得した合計数万枚のインフラ設備と発生した錆の画像を学習させており、対象を特定の設備に限定することなく、複数のインフラ管理者で活用できる。
NTTの本気さが伺える...
TF-IDFを文章全体に出現する単語wの分布と対象文章に出現する単語wの分布のKLに相当するという考察。
そのような意味合いがあるのは面白い。TF-IDFがいまもstrongなベースラインである背景なのかもしれない。
SNSで教えてもらったが、このような定式化方法もあるとのこと
情報検索は、クエリ q に対し、もっとも適合する文書 d_opt を求めるタスクです。つまり、q が与えられたとき、文書 d が出現する確率 p(d|q) の最大化問題と解釈できます。 d_opt = argmax P(d|q)
以下のコンテンツを用いて学習を進めて見事合格したとのこと
・「ディープラーニングを支える技術 - 『正解』を導くメカニズム[技術基礎] 」 →機械学習、深層学習の用語やパラメータ、計算式についてわかりやすく、詳しく解説しているので超お勧めです。
・「Kindle : AWS Certified Machine Learning Specialty Best Practice Exam Japanese 」 →試験範囲の各セクション(1.データエンジニアリング、2.探索的データ分析、3.モデリング、4.機械学習の実装とその運用)毎に問題をまとめており、勉強が進めやすい。他の対策問題集だと、出題範囲からランダムに問題が出るため、勉強しづらい。
機械学習のバックグラウンドがある人にとってはハードルが下がるのかもしれないので狙っていきたい。
英国の個人情報保護監督機関(ICO)は5月23日、Clearview AIがインターネットやSNSから、200億枚以上の画像を違法に採取して、グローバルな顔認識データベースを作成したと発表した。ICOは、警察や法執行機関を含む顧客らが同社のデータベースを利用していると述べている。
Clearview AIは、すでに英国でのサービスを中止しているが、ICOは、同社のデータベースに「かなりの量の英国居住者のデータ」が含まれていると述べている。
ICOは、Clearview AIが個人の同意を得ずにデータを収集して無期限に保持しており、英国の複数の法律に違反していると述べた。同機関はClearview AIに940万ドル(約12億円)の罰金の支払いを命じ、英国居住者のデータの削除と運用の停止を求めている。
インターネット上に公開されているからと言って無邪気に学習データに利用してしまうと、著作権やらプライバシーの侵害につながってしまうことがあるので、実務では当然そこらへんをちゃんと確認した上で利用しないといけない。。
2022年5月に公開された不均衡データ分類を行う際の対策方法がまとめられたページ。
サンプリングアプローチ, コストアプローチ, アンサンブルアプローチ, その他という分類で、約70本の論文がまとめられている。
メモ
数枚の正常画像だけで異常箇所を高精度に検出できる技術が東芝から発表された。 今回の技術はICIAP2022という学会で5/25に発表される予定とのこと。
以下技術概要
画像を用いた異常検知の手法は一般的には以下の要な手法が用いられ、
画像枚数が少ない設定ではImagenetなどで事前学習したモデルから導出される特徴量を用いた手法が用いられることがあるが、これらの手法では対象物を同じような画角で撮影することが前提となっている。
今回の手法では、正常画像中の分散を算出したした異常マップから割り引く形で、この問題の解決を行っている。
まだ論文のリンクが見つかっていないので、会議での発表後に詳細を追っていきたい。
pytorchでの学習時にクラウドストレージなどからのデータを読み込みサポートするWebDatasetの解説とパフォーマンス実験を行っている記事。 WebDatasetを用いたデータの読み込み方法が具体的に記載されていて勉強になる。
WebDatasetは以下のような代表的なデータセットロードシナリオに対して、小規模なデータサイズからペタバイト単位のデータサイズまでを統一的に扱えるインターフェースを提供している
(1) オンメモリ (2) ローカルディスク (3) Web/ファイルサーバー (4) クラウドストレージ (5) 高速分散ストレージシステム
tensorflowにもTFRecordなるものがあるが、WebDatasetではPOSIX tar形式のファイルも読み込めるのが特徴的で、pure pythonで実装されているので依存性も少ない。
# from https://zenn.dev/turing/articles/petabyte_webdataset
import torch
import webdataset as wds
url = "/tmp/publaynet_000000.tar" or url = "/tmp/publaynet_{000000..000009}.tar"
# ローカルファイルパスをセットします.
dataset = wds.WebDataset(url)
# データパイプラインの定義(デコード、タプル化).
dataset = dataset.decode("rgb").to_tuple("png", "json")
# データを取得します.
image, json = next(iter(dataset))
print(image.shape, image.dtype, type(json)) # (794, 610, 3) float32 <class 'dict'>
前処理などのパイプラインは以下のように記述できる
# from https://zenn.dev/turing/articles/petabyte_webdataset
def preprocess(sample):
image, json = sample
try:
label = json["annotations"][0]["category_id"]
except Exception:
label = 0
return image, label
dataset = dataset.map(preprocess)
from random import randrange
def get_patches(source):
for sample in source:
image, label = sample
# サンプリングされた画像のheight/widthを取得します.
h, w = image.shape[:2]
for _ in range(16):
y, x = randrange(h - 256), randrange(w - 256)
patch = image[y : y + 256, x : x + 256]
yield (patch, label)
dataset = dataset.compose(get_patches)
dataset = dataset.shuffle(10000) # バッファーサイズ=10000でシャッフルします.
あとはこれをDataLoaderに渡してやればいつものように学習が可能
以下のようにurl部分を変えるだけで良い。そして学習前にデータセットを落としておく必要はなく、ストリーミングで取得してくれるので、ローカルストレージを圧迫させなくて済む。
# from https://zenn.dev/turing/articles/petabyte_webdataset
import torch
import webdataset as wds
url = "http://storage.googleapis.com/nvdata-publaynet/publaynet-train-{000000..000009}.tar"
dataset = wds.WebDataset(url)
dataset = dataset.decode("rgb").to_tuple("png", "json")
dataset = dataset.map(preprocess)
dataset = dataset.compose(get_patches)
dataset = dataset.shuffle(10000)
dataloader = torch.utils.data.DataLoader(dataset, batch_size=64, num_workers=4)
images, labels = next(iter(dataloader))
print(images.shape, labels.shape) # torch.Size([64, 256, 256, 3]) torch.Size([64])
S3からオブジェクトをバイトストーリムとして読み出す方法とS3バケットをファイルシステムとしてマウントする方法が有望とされている。(SageMakerパイプモードを利用する手もあるらしい)
S3からオブジェクトをバイトストーリムとして読み出す方法はWebDatasetのurl_openerをs3用にオーバーライドすることで利用可能になる
# from https://zenn.dev/turing/articles/petabyte_webdataset
import io
import re
import boto3
client = boto3.client(
"s3",
aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"],
aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"]
)
def get_stream(path):
stream = io.BytesIO()
_, bucket, key, _ = re.split("s3://(.*?)/(.*)$", path)
client.download_fileobj(bucket, key, byte_io)
stream.seek(0)
return stream
def url_opener(data, handler=reraise_exeption, **kwd):
for sample in data:
url = sample["url"]
try:
stream = get_stream(url)
sample.update(stream=stream)
yield sample
except Exception as e:
e.args = e.args + (url,)
if handler(e):
continue
else:
break
# url_openerをオーバーライドします.
wds.tariterators.url_opener = url_opener
urls = [f"s3://<path of dataset>/publaynet_{i:06d}.tar" for i in range(10)]
dataset = wds.WebDataset(urls)
S3バケットをファイルシステムとしてマウントする方法は専用のライブラリを用いた上で、url_openerをオーバーライドすることで利用可能
# from https://zenn.dev/turing/articles/petabyte_webdataset
# 注: はじめにstart methodをspawnにする必要があります.
torch.multiprocessing.set_start_method("spawn")
import s3fs
fs = s3fs.S3FileSystem(
key=os.environ["AWS_ACCESS_KEY_ID"],
secret=os.environ["AWS_SECRET_ACCESS_KEY"]
)
def url_opener(data, handler=reraise_exeption, **kwd):
for sample in data:
url = sample["url"]
try:
stream = fs.open(url.replace("s3://", ""), mode="rb")
sample.update(stream=stream)
except Exception as e:
e.args = e.args + (url,)
if handler(e):
continue
else:
break
# url_openerをオーバーライドします.
wds.tarietators.url_opener = url_opener
urls = [f"s3://<path of dataset>/publaynet_{i:06d}.tar" for i in range(10)]
dataset = wds.WebDataset(urls)
ローカルストレージから直接読み出してくるのが最も早いが、webから引っ張ってくる方法とs3から引っ張ってくる方法もかなり良い。
学習データの枚数が増えていくにつれて、ローカルストレージを大きくする必要があったり、データの移動時間が長くなってきたりする問題を緩和するための手法として勉強になった。
あんまり軽いモデルだとデータ転送の時間がボトルネックになりそうだが、ビデオ系が入力であればpre_fetch機能などを使うことでデータの読み込みとモデル学習にかかる時間をうまくやりくりできそう。
表題の通り
下記のモデルごとにpaper / github / weightsがまとめられている。
ありがたい。
CPUでDNNモデルを高速推論できるフレームワークの紹介とパフォーマンス測定を行っている記事。
AIテスト環境で使用しているAWSのインスタンスは、m5.largeやc5.largeのようなIntelのXeonプロセッサを搭載したもの Xeonプロセッサは、AVX512(Intel Advanced Vector Extensions 512)というSIMD命令に対応しており、512bit長のレジスタ上に並べられた数値群に対して並列演算を行う事で高速に計算処理ができる
DNNモデルの計算処理は大半がCNNによる積和演算(MAC:Multiply-ACcumulate operation)になりますが、昨今のAVX512ではDL boostのようなINT8の積和演算専用の命令セットが用意される等してAI処理を高速に処理できるようになってきています(なお、今回の記事ではINT8量子化まではしなかったため、DL Boostは使われていません)。
AVX512の命令セットを使えば高速にAI推論処理を実行できる事になりますが、これらの命令セットを使用して高速推論を実行できる推論エンジンが存在しているので、それらを使う事で直接SIMD命令を使ったコーディングをするような必要はありません。
代表的なフレームワークは下記4つ
MSが開発しているこの手のツールでは一番有名なフレームワーク。
tensorflowやpytorchがONNXへの変換をサポートしているほか、使用可能な言語もpython, java, c++, Rustなど多岐に渡る。
さらにWASMやWebGLを用いたブラウザ推論をサポートするonnx-runtim-webというものも存在する
Intelが開発している推論エンジンで、AVX512に対応したCPUやIntel製のGPU, VPU(*1), FPGA上で高速に動作する。
ONNXから型式のファイルを読み込むことで使用可能になる。
言語としてはPython C/C++, rustなどがサポートされている。
Neural Magic社が開発しているIntel CPU上で動作する推論エンジン。
モデルのsparse化を行った上で、各CPUコアの並列演算を深さ方向に実行する方法を取ることで、CPUの大きなキャッシュを生かすことで、高速推論を可能にするとのこと (詳しくはこちら)
DeepSparseをより高速に用いるためにはpruningとquantizationといった再学習が必要になるが、なくてもonnxより速くなったりするらしい。
対応言語はPythonとC++のみで、実行環境もLinuxのみとなっている。
ちなみにDeepSparseもonnx形式のファイルから推論が可能とのこと
Apachが開発している推論エンジンで、pytorchやtensorflwoなどの様々なDLフレームワークで書かれたモデルをデバイスごとにコンパイル/最適化することで高速推論を可能にする。
対応言語はPython, C++に加えてGo, Javaなど多岐にわたる
ただしチューニングには一癖あるらしい。
測定用プログラムはPythonで実装を行いました。使ったモジュールのバージョンはそれぞれPyTorchがv1.10.1、ONNX Runtimeがv1.11.0、OpenVINOが2021.4.689、DeepSparseが0.11.2となっています。
測定環境にはAWSのc5.largeインスタンス(物理コア数1)を使用しました。
ウォームアップ用に5回推論処理を行い、その後50回推論処理を実行してその平均時間を測定しています。
ONNXも早いのだが、deepsparse, openvinoもかなり早いという結果に
またCPUコア数が増えることで推論速度がさらに向上することも確認
推論エンジンを用いた最適化だけでここまで速度が変わるのはすごい。
とりあえずONNX形式にしておいて、それでも物足りない時にOpenVINOやDeepSparseを用いてみるというのが良さそう。
“スマホのマイクでこっそり盗聴”を妨害する技術 静かな音で会話内容を改ざん
自動音声認識機による盗聴を人間は気づかないような微弱な音でリアルタイムで妨害する技術がコロンビア大学から発表された。
提案手法ではリアルタイムな妨害を行うために、入力系列から数秒先の発話に対して最も効果的なadversarial attackを仕掛けるようにモデルを訓練したとのこと。
モデルの構造などは以下、確かにこれは早そう
この妨害方法を用いた定量評価が以下 DeepSpeechに対してはwhiteboxの設定で、adversarial attackの方法を学習した上で攻撃を仕掛けて、WAV2VECに対してはblack box設定で特段学習せずに突っ込んでいる。
Language modelを乗り越えて攻撃成功しているところがすごい。
実際の部屋で攻撃した結果も載せており、white noizeよりも明らかに認識間違いが上昇していることがわかる。
コメント
adversarial exampleが社会の役に立つ稀有な例。数秒先の発話に対するadversarial attackを作るという発想が素晴らしい。
出典