@sato-kisa (kisa Sato)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

「空を検知し、雨天を判定する方法」を助力お願いします!

解決したいこと

画像処理の OpenCV , 機械学習の TensorFlow で雨天の判定を行えるシステムを開発しています。現在までにできているのは、晴天と曇天を判定するCNN分類器だけ。目指しているシステムの全容は、以下にまとめたとおりです。

開発環境

 ・Google Colaboratory
 (・VSCode )
 ・python 3.7.2
 ・openCV 4.1.2
 ・TensorFlow 2.7.0

システム

 曇天と雨天を区別したい。
 まず画像Aを入力し、建物や人などの不純物を除外して空の部分を認識する。次にその部分から、トリミングした画像Bを(何らかの方法)で雨天と判定する。

質問したいこと)
 ① 建物や地面が写っている部分を検知し、代役の色を代入する方法
 ② 「空」を検知する方法
 ③ 画像の平均色を求める方法

自分で試したこと

 グレースケール変換。色相回転。明度や彩度、コントラストの調整。
 白と黒の二値化。色のヒストグラム。円形にトリミングする。

成功していないこと)
 雲を検知するプログラムの作成。
 曇天と雨天を判別するCNN分類器。
 建物やその他、空に関係ない物体の検知と消去。

助けて欲しいです。よろしくお願いします。

1 likes

力技で全部やってのけたWeatherNet1というものを探して見つけたので勉強がてら読んでみました.

まず,sato-kisaさんがやっていることに関して重要な言及がありました

For example, object detection algorithms must perform well in fog and glare as well as in clear conditions, in order to be reliable.

日本語訳は

例えば、物体検出のアルゴリズムは、晴天時だけでなく、霧やまぶしさの中でも高い性能を発揮しなければ、信頼性が得られません。

です.

①建物や地面が写っている部分を検知

の項をロバスト性の高い検出方法を用いなければ,次の「②空を検知する」という要件を始められそうにありません.

本論文ではそういった建物や地面を除去することを考えずに,CNNに全て任せる力技スタイルで実装されています.しかし最終的には全ての項で90%以上の精度で叩き出しているので,sato-kisaさんはこれを超えることを目的として,画像の前処理に建物や地面を除去しようと考えているものだと思ってこの質問への回答とします.

論文概要

WeatherNetは,1枚の画像から4つのResNet50を用いてそれぞれの予測項目を出力できるネットワークになっています.

スクリーンショット 2022-02-11 16.00.19.png

集大成ですね.それぞれのネットワークの名前と識別できるものは

Network Detects
NightNet dawn/dusk, day and night-time
GlareNet source (sun or artificial light)
PrecipitationNet clear/rainy/snowy
FogNet fog happens

としています.各Netの出力はラベルですが,元画像と一緒に見たものをFigure 7から抜粋してきました.

Fig7.png

今回の要件にフィットするような内容だと思います.
左が日中雨天時(+霧)で,右が日中視界良好であると判断されています.後者はよく見ると曇天ですね.

ここで,今回ResNetで良い結果が出たとされる理由として,本論文では

They can be categorised as perception models, ax explained by Ibrahim et al. (2020), that require an understanding of the overall scene while extracting nuanced features for each class. Therefore, the challenge is to find a CNN architecture that is deep enough to extract these subtle features without overfitting to the details of each scene, which may include features that do not belong to weather or visual conditions.

日本語訳は

これらは、Ibrahimら(2020)が説明するように、シーン全体の理解を必要としながら、クラスごとにニュアンスのある特徴を抽出する知覚モデルに分類される。したがって、課題は、天候や視覚条件に属さない特徴を含む可能性のある各シーンの詳細にオーバーフィットすることなく、これらの微妙な特徴を抽出するのに十分な深さを持つCNNアーキテクチャを見つけることである。

と言われています.最初に力技とは言ったものの,ResNetは天候や視覚条件に属さない特徴,まさにsato-kisaさんが除去しようとしている建物や道路などの特徴をみることなく,天候や視覚条件という微妙な特徴を抽出するのに適していたということです.

おかげで建物や道路などを除去することなく,クリア(晴れ|曇天),雨,雪を識別するPrecipitationNetの最終的な精度は93.2%,F1スコアは0.947ととても高い値を出すことができています.

WeatherNetを超える

以上を踏まえて各項目を考えたいと思います.

 ① 建物や地面が写っている部分を検知し、代役の色を代入する方法
 ② 「空」を検知する方法
 ③ 画像の平均色を求める方法

①と②

ResNetは全体の雰囲気を察するということで,部分的な検出は今回の要件には適なさそうです.
領域を検出するならやはりMask Region CNNですね,物体検出は有名どころとしてYOLOなどがありますが,これは矩形で検出するので今回の要件には適さないと考える場合に,Mask R-CNNを使うといいと思います.

ピクセル単位で領域を検出してくれるので,最終的には空以外を除去するという考えよりも,空の領域だけを検出した方が良いと考えるのがスマートそうです.一石二鳥ですね.

ピクセル単位で空の領域を抽出した後は,そのピクセルの情報を,天候を判定するネットワークに入力する画像のマスクとして使ってあげれば,後はネットワークが学習してくれそうですので,「代役の色を代入する」という部分も特に実装せずここでクリアできると考えられます.

図にするなら

になるのでしょうか.

OpenCVではマスク画像を使って画像の特定の領域だけを抽出することもできますが,どうしても代役の色を代入するなら,代入したいピクセル座標を(x,y)として

import cv2

img = cv2.imread('sample.png')
img[x, y] = [0, 0, 0]

とかをやれば黒が挿入されるはずです.

残念ながら最初に言及したロバスト性の高い手法のうち,機械学習を用いないパターンは私には思いつきませんでした.ましてやWeatherNetが叩き出した精度を超えるならなおさらです.WeatherNetでは明け方や夕方の赤い空でも判別することができており,単純に空の色や雲の色を考えるだけで超えることは出来なさそうです.

③画像の平均色を求める方法

画像の平均色を求めるのは一番簡単ですね,OpenCVなら

import cv2

img = cv2.imread('sample.jpg')
print(img.mean())

で済みます.imgnumpy.ndarrayですので,そのままnumpy.ndarrayに実装されているmean()が使えます.

まとめ

  • 天候判定のうちクリア/雨/雪の3分類は既にある(そして高精度).
  • 雰囲気を察するResNetが適していそう.さらには建物等を除去する必要もなさそう.
  • 建物や道路を除去するという考え or 空を抽出するという考えをMask R-CNNで実装できそう.

曇天と雨天の識別は,晴天と雨天よりもはるかに特徴量として差が小さいので,余計なものを省きたいとう設計思想は間違っていなさそうなのですが,雨粒が建物等によって見えやすい状態になったりして精度が上がりそうな反面,雨天後の道路上の水たまりを認識して曇天時に雨天と判断してしまいそうなので,情報の取捨選択の理由が必要になりそうです.
また,このぐらいの実装要件であればちゃんと調べたら他の論文も出てきそうです.今回はクリアと雨雪の判定でしたが,普通にあると思いますのでそちらを探されてみるのも一手です.

余談ですが,「システム」とは「個々の要素が相互に影響しあいながら、全体として機能するまとまりや仕組み2」のことです,一般的には図で示すことが多いですね,sato-kisaさんの実装したいシステムも図示していただけるとわかりやすいです.

やはり文章は添えるだけのスタイルがいいと感じます.

  1. Mohamed R Ibrahim, James Haworth, T. Cheng, "WeatherNet: Recognising Weather and Visual Conditions from Street-Level Images Using Deep Residual Learning," International Journal of Geo-Information 8(12):549, DOI:10.3390/ijgi8120549, November 2019

  2. https://e-words.jp/w/%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0.html

2Like

Your answer might help someone💌