IBM、ナスカ台地とその周辺部で143点の新たな地上絵を発見
今日は、画像処理で利用するデータクレンジングについて学んでいきましょう。
まずは、IBMが11月15日にプレスリリースした以下の記事からどうぞ。
ナスカ台地とその周辺部で143点の新たな地上絵を発見
~ IBMのAI(人工知能)技術で地上絵の全体像把握を目指す ~
山形大学の坂井正人教授(文化人類学・アンデス考古学)らの研究グループは、南米ペルーのナスカ台地とその周辺部で新たに人や動物などの具象的な地上絵142点を発見しました。2018年までに実施された現地調査と高解像度三次元画像のデータ解析などにより発見したもので、主にナスカ台地の西部に分布します。紀元前100年~紀元300年頃に描かれたと考えられます。また、2018年〜2019年に実施された日本IBMとの共同での実証実験においては、高解像度な空撮写真等の大容量のデータを高速に処理できるAIサーバーIBM® Power System AC922上に構築されたディープ・ラーニング・プラットフォームIBM Watson Machine Learning Community Edition(旧名:IBM PowerAI)でAIモデルを開発し、新たな地上絵1点を発見しました。
山形大学は、2004年から坂井教授を中心にユネスコの世界文化遺産「ナスカの地上絵」研究に取り組み、数多くの地上絵を発見するとともに、保護活動を推進してきました。しかしながら、地上絵の分布調査は未だ充分ではなく、市街地の拡大に伴って、破壊が進み、社会問題となっています。このたび、日本IBMとの共同での実証実験を踏まえて、リモートセンシングとAIを研究してきたIBMワトソン研究所と共同研究を実施するために学術協定を締結しました。今後は、同社の3次元時空間データを高速かつ効率的に解析するAIプラットフォームである「IBM PAIRS Geoscope(以下IBM PAIRS)」を活用することで、地上絵の分布状況の把握を進め、現地調査に基づいた分布図を作成する予定です。これにより、ナスカの地上絵の全体像を把握し、研究を加速させるとともに、世界遺産ナスカの地上絵の保護活動への貢献が期待されます。
情報元:
IBM ニュースルーム - 2019-11-15 ナスカ台地とその周辺部で143点の新たな地上絵を発見 - Japan
【解説】データクレンジング
データクレンジングとは
『重複や欠損データなどを取り除いて、データの精度を高めること』のことを指します。
ディープラーニングの手順
ディープラーニング(とくに、教師あり学習)は、主に以下の手順で行います。
- データ収集
- データクレンジング
- 学習
- 評価
- 実装
データベースやExcelファイル等で保存されているデータをそのまま使えることは、まずありません。正しく学習できるように、前処理をしなくてはなりません。データの収集とデータクレンジングで8割以上の時間を要するといわれるくらい、データサイエンティストにとって地道で重要な仕事になります。また、サービス形態としてリアルタイム処理が必要な場合は、データ収集やデータクレンジングに時間をかけられないので業務やデータベースを変更する必要が生じたりするので、クレンジングの知識は重要となります。
画像処理で利用するデータクレンジングの種類
データクレンジングの方法は、多数ありますが、ここでは、画像処理に特化すると以下のような手法があります。
- トリミング・・・画像の一部を切り取る。不要な箇所を取り除き、必要なところだけを抜き出して処理したい場合に利用します。
- リサイズ・・・画像の大きさを変更する。通常学習するためのモデルには、インプットが同じ大きさである必要があるため利用します。
- マスキング・・・特定の色の画像を取り出す。特定の画像を検索したり、不要な画像を排除したりする場合に利用します。
- ノイズの除去・・・荒い画像をスムーズに変えたり、ゴミのようなものが点々とあるような画像からそれらを取り除く。
- 膨張・収縮処理・・・膨張・収縮することでノイズを除去する。
データクレンジングの実装
データクレンジングをPythonで実装する方法を紹介します。。
- トリミング
import cv2
# 画像読み込み
img = cv2.imread("AAA.jpg")
# img[上部 : 下部, 左側 : 右側]を取り出し
img_cut = img[10 : 150, 10: 50]
- リサイズ
import cv2
# 画像読み込み
img = cv2.imread("AAA.jpg")
# cv2.resize(画像データ, (リサイズ後の幅, リサイズ後の高さ))
img_resize = cv3.resize(img,10, 10)
- マスキング
import cv2
# 画像読み込み
img = cv2.imread("AAA.jpg")
# マスク用画像(0:グレースケール画像)
mask = cv2.imread("mask.png", 0)
# マスク用画像を、同じサイズにリサイズ
mask = cv2.resize(mask, (img.shape[1], img.shape[0]))
# マスキング
img_masked = cv2.bitwise_and(img, img, mask = mask)
- ノイズの除去
import cv2
# 画像読み込み
img = cv2.imread("AAA.jpg")
# ノイズ除去
img_Noise_cancel = cv2.fastNlMeansDenoisingColored(img)
- 膨張・収縮処理
import cv2
import numpy as np
# 画像読み込み(グレースケールで読み込み)
img = cv2.imread("AAA.jpg",0)
# 二値画像に変換
retval, img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# フィルタの定義
filt = np.array([[0, 1, 0], [1, 0, 1], [0, 1, 0]], np.uint8)
# 膨張
cv2.dilate(img, filt)
# 収縮
cv2.erode(img, filt)