Pythonでブログの広告が目立つかどうか「動的」に評価する方法

  • このエントリーをはてなブックマークに追加

前回はサリエンシーマップを使って画像に対する「目立ち度」を評価しましたが、ブログの読者はページをスクロールしたりするため動的に評価する方法も有効です。ここでは動的にブログのページを評価する方法の例を紹介します。

こんにちは。wat(@watlablog)です。
動画の処理を覚えたので、どんどん処理をしていきましょう!ここではブログの広告が目立つかどうかを動的に評価します

サリエンシーマップの概要と動画に適用するメリット

サリエンシーマップの過去記事

サリエンシーとは、顕著性を意味する言葉であり、過去「Pythonでサリエンシーマップを作成!人の視線の行き場を可視化」で説明したように、画像の中で目立つ場所はどこか、を客観的に調べることができる画像処理手法です。

もし「サリエンシーとは何かよくわからない!」という方は是非上の記事を読んでみて下さい。サリエンシーについての内容の他に、Pythonでsaliency関数を使う時に必要なパッケージの記載もあります。

そして、「Pythonでブログの広告が目立つかどうか検証してみた」という記事では、サリエンシーマップブログの広告に適用tいう1つの応用例について説明しました。

今回の記事はこれらの内容を踏まえた上でさらに一歩先へ行きます!

動画のサリエンシーを評価すればより現実の状況に近づく

過去記事は全て「ある画像に対するサリエンシー評価」を説明していますが、皆さんはブログのページを見る時に、全く動かないページを見ているのでしょうか?

スクロールしたり、ページ移動したり色々するよね?

そう、ブログの読者さんは僕も含めてページをスクロールしたり、リンクをクリックしたり、目次からジャンプしたり…とにかく人によってアクションは様々です

目立つ場所があっても、スクロールしている最中にはその部分は移動し、また別の目立つ部分が登場する等、現実は動いています。

つまり実際に人が画面操作している最中の場面を動画にして、その動画に対してサリエンシーマップを適用すればより現実に即した評価ができるというワケです。

では早速動画に対するサリエンシー評価をする方法を紹介します!

動画に対するサリエンシー評価で広告が目立つか動的に検証する方法

準備するもの

スマホで撮影した動画

今回はiPhoneで撮影したmp4形式の動画をサンプルに使用します。

iPhoneでは、設定→コントロールセンター→コントロールをカスタマイズ→画面収録、という手順で画面収録機能をコントロールセンターに追加することができます。

この画面収録機能を使えば簡単にスマホ閲覧中の動画を保存することができます。

今回は以下の当ブログ閲覧時の動画に対してサリエンシー処理をしていきます。

まずは実行結果を確認!

コードを説明する前に、どんな処理結果になるかを確認しましょう。

以下の動画は先ほどのサンプル動画に対してサリエンシー評価を適用した結果です。画像をマップで表示しているわけではなく、動画の各場面に対して最も目立つ場所を1つの〇で示した結果にしてみました(これはお好みでしょうか?)。

結果、広告や画像、アイコンと、客観的な評価においてもこれらは目立つことがわかりました。

一部h2見出し等にも〇印が行っていたので、見出しにも目を惹く効果が期待できるということでしょうか。

あまり長い文章を詰め込み過ぎると、読者の視線が滞ってしまいそうですね。
読者の目を飽きさせないために、適宜見出しや画像、アイコンを挿入するのは有効な手段かも知れません。

Pythonコード

全コード

今回のコードはちょっと長いですが、それぞれの詳細を説明する前に、まずは全コードを載せます。

説明:画像のどの領域が最も明るいか調べる関数

まずは作成したdef brightness関数について説明します。

以下の図のようにこの関数では、サリエンシーディテクション後の画像に対して領域走査を行い、領域毎の平均輝度値を元画像にマッピングして輝度を粗くしています。粗くした画像の中で最も輝度の高い部分をlatestとして保持しておき、全ての領域走査終了後にlatestの輝度値を持つ領域の座標px, pyを返すというのが目的です。

def brightness

輝度を粗くするのは、サリエンシーディテクション後そのままの画像だと、たった1ピクセルでも輝度値の高い部分があるとそこを検知してしまうため、感度を落とすためにこの処理をしています。

領域走査の詳細は「Python/OpenCVで画像内の領域を縦横に走査する方法」を参照して下さい。

説明:動画を読み込み1フレームずつ画像処理をする関数

次にm_slice関数を説明します。この関数が今回のメインですが、基本的な構造は「Python/OpenCVで動画から静止画を間引いて抽出する方法」で使用しているm_slice関数と同じです。

間引いて抽出した画像を静止画として保存していた部分を、画像処理を施してvideoという動画として再構築して行くところに違いがあります。

また、新たに動画を作成するため、fps(動画の再生速度)を取得しています。この関数はフレームを間引いて処理することができるように作っていますので、cv2.VideoWriterではfpsとstepの関係式を入れています。

動画はmp4で作っていますが、フォーマットはfourccで指定しています。fourccとは、four-character codeの略で、データフォーマットを識別する4byteの文字列の並びです。

画像処理はサリエンシーディテクションですが、サリエンシーマップを使って動画を作るのではなく、cv2.circleで元動画に円を描画するという処理にしています。

画像処理を施した画像からvideo.writeで保存していっています。

まとめ

このページではこれまで習得した画像処理や動画の取り扱い方法を使って、人がスマホでブログページをスクロールした動画ファイルの中でどこが目立つかを検出してみました。

コードの大部分は過去の記事で作成したものをほぼそのまま使っています。
以下に過去記事へのリンクを再掲しますので、是非見てみて下さい。

Pythonでサリエンシーマップを作成!人の視線の行き場を可視化」では画像の中でどこが目立つかを計算するサリエンシーディテクションについての説明をしています。

Pythonでブログの広告が目立つかどうか検証してみた」ではサリエンシーディテクションをブログのページに適用してみた結果とコードを載せています。但し、内容は単一の画像に対する処理のみです。

Python/OpenCVで画像内の領域を縦横に走査する方法」では画像の中に小領域を設定して操作する方法を紹介しました。本ページで使っている平均値更新処理の部分です。

Python/OpenCVで動画から静止画を間引いて抽出する方法」では動画ファイルの取り扱い方法を紹介しています。本ページのフレーム抽出処理の基礎です。

ついに動画に対して科学技術計算を適用できるようになりました!これは様々なことに応用できそうですね!

Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメント

コメントを残す

*