IBM WatsonのVisual Recognitionで画像認識する(Curl)


Visual Recognitionとは?

Visual RecognitionはIBM社のWatsonが提供する画像認識機能です。

以下は、公式ページの説明です。

Visual RecognitionはWatsonの画像認識機能です。すぐにお使いいただけるようにWatsonが既に学習をしており、画像・映像フレームに写った複数のものや、情景を分析・認識することができます。また、機械学習によりWatsonに独自の学習をさせることもできます。すでに、自社製品の認識・分類や、製造ラインにおける欠陥検出といった多種多様なお客様の業務で、高い精度の画像認識を少ない画像枚数による短時間の機械学習で実現しています。さらに、日本語・英語を含む多数の言語で認識結果を返すことができます。

https://www.ibm.com/watson/jp-ja/developercloud/visual-recognition.html


公式ページにもあるように、事前学習済みのため、サービス利用するために、アカウントを作成すれば、すぐに利用できるようです。(制限があるが無料で利用可能)


Visual Recognitionで画像認識する

アカウントを作成し、APIキーを取得したら、classifyメソッドを利用して画像認識を行います。

画像識別するフルーツの画像

https://watson-developer-cloud.github.io/doc-tutorial-downloads/visual-recognition/fruitbowl.jpg


classify curl 画像URL指定 サンプルコード


#!/bin/bash

# api key
api_key="API KEYを設定する"
# service end_point
end_point="https://api.us-south.visual-recognition.watson.cloud.ibm.com"
method="v3/classify"
url="$end_point/$method"

# フルーツの画像
image_url="https://watson-developer-cloud.github.io/doc-tutorial-downloads/visual-recognition/fruitbowl.jpg"

# Visual Recognitionのclassifyへ送信
curl -u "apikey:$api_key" \
    "$url?url=$image_url&version=2018-03-19&Accept-Language=ja"

Visual RecognitionのclassifyメソッドへCurlを使ってGETします。アカウントを作成後に取得したAPIキー、画像のURLを指定します。

※今回はサンプルで利用されているフルーツの画像を利用。

classify 実行結果(JSON)


{
    "images": [
        {
            "classifiers": [
                {
                    "classifier_id": "default",
                    "name": "default",
                    "classes": [
                        {
                            "class": "バナナ",
                            "score": 0.562,
                            "type_hierarchy": "/果実/バナナ"
                        },
                        {
                            "class": "果実",
                            "score": 0.788
                        },
                        {
                            "class": "規定食 (食品)",
                            "score": 0.528,
                            "type_hierarchy": "/食物/規定食 (食品)"
                        },
                        {
                            "class": "食物",
                            "score": 0.528
                        },
                        {
                            "class": "ハネデュー",
                            "score": 0.5,
                            "type_hierarchy": "/果実/メロン/ハネデュー"
                        },
                        {
                            "class": "メロン",
                            "score": 0.501
                        },
                        {
                            "class": "オリーブ色",
                            "score": 0.973
                        },
                        {
                            "class": "レモン・イエロー (色)",
                            "score": 0.789
                        }
                    ]
                }
            ],
            "source_url": "https://watson-developer-cloud.github.io/doc-tutorial-downloads/visual-recognition/fruitbowl.jpg",
            "resolved_url": "https://watson-developer-cloud.github.io/doc-tutorial-downloads/visual-recognition/fruitbowl.jpg"
        }
    ],
    "images_processed": 1,
    "custom_classes": 0
}


結果は、JSON形式で返却されます。”class”にバナナ、果実、メロン、 オリーブ色などクラス名が、”score”に0~1の範囲で プロパティの信頼スコアが返却されます。スコアが高いほど、クラスが画像に描かれている可能性が高くなります。


classify curl ローカル画像指定 サンプルコード


#!/bin/bash

# api key
api_key="API KEYを指定する"
# service end_point
end_point="https://api.us-south.visual-recognition.watson.cloud.ibm.com"
method="v3/classify"
url="$end_point/$method"

# 画像のパス
image_path="img/fruitbowl.jpg"

# Visual Recognitionのclassifyへ送信
curl -X POST \
    -u "apikey:$api_key" \
    -F "images_file=@$image_path" \
    -F "threshold=0.6" \
    "$url?version=2018-03-19&Accept-Language=ja"


ローカル画像を利用するには、POSTを指定して、@ファイル名でローカル画像のパスを指定します。”threshold”で返却する閾値を指定します。上記の例だと、0.6以上のもののみ取得。

classify 実行結果(JSON)

{
    "images": [
        {
            "classifiers": [
                {
                    "classifier_id": "default",
                    "name": "default",
                    "classes": [
                        {
                            "class": "果実",
                            "score": 0.788
                        },
                        {
                            "class": "オリーブ色",
                            "score": 0.973
                        },
                        {
                            "class": "レモン・イエロー (色)",
                            "score": 0.789
                        }
                    ]
                }
            ],
            "image": "fruitbowl.jpg"
        }
    ],
    "images_processed": 1,
    "custom_classes": 0
}

WEBのURLで画像を指定した場合と同様の結果が取得できました。ただし、今回は”threshold”で0.6を指定したため、0.6以上のスコアの分類しか取得していません。


感想

アカウント作成から利用まで、すごく簡単でした。zip画像を送ると独自モデルも利用できるようなので、次はそちらを利用しみたいと思います。他にも人、犬、猫なども分類してみました。

以下、猫、犬の結果例です。

猫の画像の実行結果(サンプル)

{
    "images": [
        {
            "classifiers": [
                {
                    "classifier_id": "default",
                    "name": "default",
                    "classes": [
                        {
                            "class": "ネコ",
                            "score": 1,
                            "type_hierarchy": "/動物/哺乳類/肉食動物/ネコ"
                        },
                        {
                            "class": "肉食動物",
                            "score": 0.989
                        },
                        {
                            "class": "哺乳類",
                            "score": 0.989
                        },
                        {
                            "class": "動物",
                            "score": 0.989
                        },
                        {
                            "class": "ベージュ色",
                            "score": 0.991
                        }
                    ]
                }
            ],
            "image": "cat_1.jpg"
        }
    ],
    "images_processed": 1,
    "custom_classes": 0
}

犬の画像の実行結果(サンプル)

{
    "images": [
        {
            "classifiers": [
                {
                    "classifier_id": "default",
                    "name": "default",
                    "classes": [
                        {
                            "class": "シベリアン・ハスキー",
                            "score": 0.875,
                            "type_hierarchy": "/動物/飼い慣らされた動物/犬/シベリアン・ハスキー"
                        },
                        {
                            "class": "犬",
                            "score": 0.987
                        },
                        {
                            "class": "飼い慣らされた動物",
                            "score": 0.987
                        },
                        {
                            "class": "動物",
                            "score": 0.987
                        },
                        {
                            "class": "エスキモー・ドッグ",
                            "score": 0.865,
                            "type_hierarchy": "/動物/飼い慣らされた動物/犬/エスキモー・ドッグ"
                        },
                        {
                            "class": "アジュール (色)",
                            "score": 0.903
                        },
                        {
                            "class": "灰白色",
                            "score": 0.867
                        }
                    ]
                }
            ],
            "image": "husky1.jpg"
        }
    ],
    "images_processed": 1,
    "custom_classes": 0
}

Python ディレクトリの存在チェックして、存在しなければ作成する

よく使うので、メモ。

Pythonでディレクトリの存在チェックして、存在しなければ作成する

ディレクトリの存在チェックと作成するサンプルコード

import os

SAMPLE_DIR = "sample"

if not os.path.exists(SAMPLE_DIR):
    # ディレクトリが存在しない場合、ディレクトリを作成する
    os.makedirs(SAMPLE_DIR)

os.path.exists関数にディレクトリのパスを渡します。ディレクトリが存在する場合は、True。存在しない場合は、Falseが返却されます。

os.makedirs関数にディレクトリのパスを渡してディレクトリを作成します。

※上記の記述はファイルが存在した場合も、Trueとなります。

長めのサンプルコード

import os

SAMPLE_DIR = "sample2"


# 存在チェック
if os.path.isdir(SAMPLE_DIR):
    print("ディレクトリが存在します")
else:
    print("ディレクトリが存在しません")

# ディレクトリがない場合、作成する
if not os.path.exists(SAMPLE_DIR):
    print("ディレクトリを作成します")
    os.makedirs(SAMPLE_DIR)

# 存在チェック
if os.path.isdir(SAMPLE_DIR):
    print("ディレクトリが存在します")
else:
    print("ディレクトリが存在しません")


長めのサンプルコードでは、ディレクトリの存在チェックにos.path.isdirを利用しています。この関数を利用すれば、ファイルの場合はFalseが帰ってきます。

実行例

>>python check_exists_dir.py

ディレクトリが存在しません
ディレクトリを作成します
ディレクトリが存在します

WordPressでカテゴリー毎の投稿を一覧表示するショートコードを作成する

WordPressの固定ページに指定したカテゴリーidの投稿リストを表示するショートコードです。

functions.phpへ以下のコードを追加して、ショートコードを定義します。

カテゴリー毎の投稿を一覧表示するショートコード

// 投稿を取得する
// num_p:表示数
// id:カテゴリーID
// 

例) ショートコード使用1

[p_list id=8]

HTML編集で記載します。[get_p_list]でショートコードを指定し、引数として[id]の”8″を渡しています。カテゴリーIDが8の投稿リストを表示します。

例)ショートコード使用2

 [p_list id=8 num_p=3]

上記は、カテゴリーidの”8″の投稿取得して、投稿3つを表示します。

例) 実際の表示

PostgreSQL pg_ctlコマンドで起動、停止、起動確認する Windows

PostgreSQLをpg_ctlコマンドで起動する

# PostgreSQLをpg_ctlコマンドで起動する
pg_ctl start -D "C:\Program Files\PostgreSQL\11\data"

※データベースクラスタディレクトリ(”C:\Program Files\PostgreSQL\11\data”) は、環境に併せて変更する

※また、コマンドプロンプトを管理者として実行する必要があります


PostgreSQLをpg_ctlコマンドで停止する

#  PostgreSQLをpg_ctlコマンドで停止する
pg_ctl stop -D "C:\Program Files\PostgreSQL\11\data"


PostgreSQLをpg_ctlコマンドで起動確認する

# PostgreSQLをpg_ctlコマンドで起動確認する 
pg_ctl status -D "C:\Program Files\PostgreSQL\11\data"


起動コマンドの実行結果 例


サーバの起動完了を待っています....2019-11-27 02:23:00.130 JST [4728] LOG:  IPv6アドレス"::"、ポート5432で待ち受けています
2019-11-27 02:23:00.130 JST [4728] LOG:  IPv4アドレス"0.0.0.0"、ポート5432で待ち受けています
2019-11-27 02:23:00.149 JST [4728] LOG:  ログ出力をログ収集プロセスにリダイレクトしています
2019-11-27 02:23:00.149 JST [4728] ヒント:  ここからのログ出力はディレクトリ"log"に現れます。
完了
サーバ起動完了


停止コマンドの実行結果 例


サーバ停止処理の完了を待っています....完了
サーバは停止しました


起動確認コマンドの実行結果 例

pg_ctl: サーバが動作中です(PID: 4728)

pg_ctl: サーバが動作していません

Bash(shell)の条件判定でandとorを使う

-aでANDを指定する

# true AND true
[ 2 -eq 2 -a 3 -eq 3 ];
echo "[ true AND true ] = [$?]"
# return [0]

# true AND false
[ 2 -eq 2 -a 3 -eq 4 ];
echo "[ true AND false ] = [$?]"
# return [1]


-oでORを指定する

# true OR false
[ 2 -eq 2 -o 3 -eq 4 ];
echo "[ true OR false ] = [$?]"
# return [0]

# false OR false
[ 2 -eq 5 -o 3 -eq 4 ];
echo "[ false OR false ] = [$?]"
# return [1]


&&でANDを指定する

# && (AND)
[ 2 -eq 2 ] && [ 3 -eq 3 ]; echo $?
# return [0]

[[ 2 -eq 2 && 3 -eq 4 ]]; echo $?
# return [1]


||でORを指定する

# || (OR)
[ 2 -eq 2 ] || [ 3 -eq 3 ]; echo $?
# return [0]

[[ 2 -eq 5 || 3 -eq 4 ]]; echo $?
# return [1]

Bash(shell)でパラメータ(引数)の必須チェックをする

パラメータ(引数)の数を表示する

# 引数の数を表示する
echo "引数の数は $# です"


パラメータ(引数)の数をチェックする

# 引数の数が2つかチェックする
if [ "$#" -eq 2 ]; then
  echo "引数の数は 2 です"
else
  echo "引数の数は 2 以外の $# です"
fi


パラメータ(引数)が空かチェックする(必須チェック)

# パラメータ1が空文字か判定
if [ -z "$1" ]; then
    echo "パラメータ1は、空文字です。"
else
    echo "パラメータ1は、空文字ではありません。入力文字は $1"
fi

# パラメータ2が空文字か判定
if [ -s "$2" ]; then
    echo "パラメータ2は、空文字です。"
else
    echo "パラメータ2は、空文字ではありません。入力文字は $2"
fi


バラメータ(引数)が数値のみかチェックする(数値型チェック)

if [[ $1 =~ ^[0-9]+$ ]]; then
  echo "パラメータ1は、数値のみです。"
else
  echo "パラメータ1は、数値以外の文字が含まれています。"
fi

Bash(shell)でディレクトリ・ファイルの存在チェックをする

ファイルの存在チェック

if [ -f "sample.txt" ]; then
    echo 'file exist'
else
    echo 'file not exist'
fi

ディレクトリの存在チェック

if [ -d "sample_dir" ]; then
    echo 'dir exist'
else
    echo 'dir not exist'
fi

ディレクトリが存在しなかったら作成する


DIR_PATH="sample_dir"

if [ ! -d "$DIR_PATH" ]; then
    mkdir -p $DIR_PATH
fi

[ ] -f オプション

ファイルが存在する場合、True。存在しない場合、False。

[ ] -d オプション

ディレクトリが存在する場合、True。存在しない場合、False。

WordPressのコピーライトを変更する twenty nineteen

このブログでも利用しているWordPressのデフォルトテーマである twenty nineteenのフッターにあるコピーライトを変更します。

変更前のコピーライト


変更後のコピーライト


コピーライトの変更方法

フッターの表示内容はサーバーのWordPressのテーマが格納されているフォルダ内の
“wp-content/themes/twentyseventeen/template-parts/footer”フォルダにある
“site-info.php”ファイル
で定義されています。

変更前のコード

<?php
/**
 * Displays footer site info
 *
 * @package WordPress
 * @subpackage Twenty_Seventeen
 * @since 1.0
 * @version 1.0
 */

?>
<div class="site-info">
	<?php
	if ( function_exists( 'the_privacy_policy_link' ) ) {
		the_privacy_policy_link( '', '<span role="separator" aria-hidden="true"></span>' );
	}
	?>
	<a href="<?php echo esc_url( __( 'https://wordpress.org/', 'twentyseventeen' ) ); ?>" class="imprint">
		<?php printf( __( 'Proudly powered by %s', 'twentyseventeen' ), 'WordPress' ); ?>
	</a>
</div><!-- .site-info -->


変更後のコード

<?php
/**
 * Displays footer site info
 *
 * @package WordPress
 * @subpackage Twenty_Seventeen
 * @since 1.0
 * @version 1.0
 */

?>
<div class="site-info">
	<?php
	if ( function_exists( 'the_privacy_policy_link' ) ) {
		the_privacy_policy_link( '', '<span role="separator" aria-hidden="true"></span>' );
	}
	?>
	<p>©2019 <a href="<?php echo site_url(); ?>"><?php echo bloginfo('name'); ?></a></p>
</div><!-- .site-info -->


具体的な変更箇所

変更前の一番下を除外して、下から3行を削除します。

<a href="<?php echo esc_url( __( 'https://wordpress.org/', 'twentyseventeen' ) ); ?>" class="imprint">
    <?php printf( __( 'Proudly powered by %s', 'twentyseventeen' ), 'WordPress' ); ?>
</a>

下記の一行に変更します。

<p>©2019 <a href="<?php echo site_url(); ?>"><?php echo bloginfo('name'); ?></a></p>

Googleで検索する期間や画像・動画を指定する

URLにパラメータを付与することで、サイトの最近更新、登録期間を指定した検索や動画、画像といった種類を指定した状態で検索ができます。

最近1年間のデータを検索する(日本)

https://google.co.jp/search?hl=ja&source=lnt&tbs=qdr:y&pws=0


最近1年間のデータを検索する(アメリカ)

https://google.com/search?hl=en&source=lnt&tbs=qdr:y&pws=0


最近1年間の画像を検索する(日本)

https://google.co.jp/search?hl=ja&source=lnms&tbm=isch&tbs=qdr:y

最近1年間の画像を検索する(アメリカ)

https://google.com/search?hl=en&source=lnms&tbm=isch&tbs=qdr:y&gws_rd=cr&pws=0


最近1年間の動画を検索する(日本)

https://google.co.jp/search?hl=ja&tbm=vid&source=lnt&tbs=qdr:y

最近1ヶ月の動画を検索する(日本)

https://google.co.jp/search?hl=ja&tbm=vid&source=lnt&tbs=qdr:m


日本からアメリカのGoogle.comを英語で検索する

単純にGoogle.comをURLに入力するだけでは、上手く検索できないです。

日本からアメリカのGoogleを英語で検索するURL

https://google.com?gl=us&hl=en&gws_rd=cr&pws=0

※上記URLは、ブックマークが可能です



日本からイギリスのGoogleを英語で検索するURL

https://google.co.uk?gl=gb&hl=en&gws_rd=cr&pws=0


日本から香港(中国版Googleはない)のGoogleを検索するURL

https://google.com.hk/?gl=hk&gws_rd=cr&pws=0


なぜURLに”google.com”を入力するだけでは駄目なのか?

日本からパラメータなしでgoogle.comへアクセスした場合、一見Google.comからアメリカの検索ができてるようにみえますが、 日本のGoogle検索エンジンに対して日本語のアクセスを行うことになります(おそらく)。パラメータで国と言語を指定することで海外のGoogleへ海外の言語でアクセス可能になります。