ハシカケ-実現したいことから学べるプログラミングサイトプログラミングを実現したいことから逆算して学べるサイトです。VisionAPIで画像解析する記事を書いたのですが、今回はその続きで解析した画像の説明を使ってファイル名を自動でリネームするというプログラムです。これがあれば複数枚の画像に一気に適切な名前をAIを利用して自動でつけることが可能になります↓ですので、自分でリネームする手間を省けます。完成したプログラムのソースコードを貼っておきます。フォルダ中の画像をAI解析し、ファイルのリネームを行います。画像の解析には、Microsoftの画像解析AIを用いて行います。APIというサービスで画像を解析します。APIは画像の分類や説明を行うことができたり、手書き文字を認識することもできます。VisionのAPIキーを事前に取得する必要があります。visionのAPIキーを取得する方法を参考に準備しておいてください。ソースコードの書き換えこのプログラムでは、ソースコードにサブスクリプションキーを書き加える必要があります。cv_demo.pyをメモ帳などで開き、ソースコードの12行目を書き換えましょう。"aaa"この”aaa”の部分を、ご自身のサブスクリプションキーに書き換えて、同じ名前で上書き保存してください。imgフォルダに解析したいJPEG画像を入れておく今回のプログラムでは、imgという名前のフォルダにあるJPEG画像ファイルがリネームされます。imgという名前のフォルダを予めcv_demo.pyと同じ場所に作成して、解析したい画像ファイルを入れておく必要があります。APIの制限により1度に処理できる画像の枚数は16枚までなので、フォルダ内の画像ファイルは16枚以内に抑えておきましょう。requestsライブラリのインストール今回のプログラムでは、requestsという外部ライブラリが必要です。requestsを実行してインストールを済ませておいてください。ソースコードの詳細な解説ではここからソースコードの詳細な解説に移りたいと思います。timecv_demo.pyを動かすために必要となる、4つのライブラリをimportします。requestsrequestsはHTTP通信を通してWebページの情報を取得するための外部ライブラリです。以前に書いたPythonでスクレイピングした時の解説も参考にしてください。globglobはフォルダ内のファイルパス名を取得するための標準ライブラリです。globモジュールについては以前に書いたこちらの解説を読むと理解できると思います。ososはファイルやパスの名前を操作するためのモジュールです。以前の解説も参考になります。timetimeは時間に関する情報を扱うための標準ライブラリです。具体的には、現在時刻の表示や経過時間を測定したり、2つの時間の時間差を算出したりできます。APIで画像を解析するには、サーバーにアクセスする必要があります。サーバーにアクセスするために必要なサーバーのURLとサブスクリプションキーを指定します。APIを使用するのに必要なサブスクリプションキーを指定しています。今回は例として、サブスクリプションキーを”aaa”としています。aaaの部分は必ずご自身が取得したサブスクリプションキーの値に変更しておいてください。visionのAPIキーを取得する方法を参考に取得してから、ソースコードのサブスクリプションキーの値を変更してください。subscription_keysubscription_keyに正しいAPIキーがちゃんと設定されているかチェックしています。間違ったサブスクリプションキーを入れてしまったら、エラーメッセージが出るようになっています。"analyze"アクセスしたいAPIの住所であるURLを設定しています。このURLの事を「エンドポイント」と呼びます。このエンドポイントは“https://westcentralus.api.cognitive.microsoft.com/vision/v2.0/”のままにしておいて下さい。'.jpg')この部分はdef文によって、file_renameという関数を定義しています。‘.jpgの形にリネームしています。細かく解説していきます。文に続く処理を行っていきます。ここは繰り返し処理になります。len(list_1)で、list_1に入っているオブジェクトの要素数を取得します。len()は、文字列の文字数やリストの要素数を取得できる関数です。range(len(list_1))で、0から「len(list_1)-1」までの値が格納されたリストを作成します。1」までの値が格納されたリストを作成する関数です。引数2)の形で引数1のファイル名を、引数2のファイル名に変更します。‘.jpgに変更されています。ここまでの処理が、file_renameという関数名で扱われます。response.json()def文によって、ms_computer_vision_apiという関数を定義します。APIで解析して、解析結果のデータを受け取る関数です。API呼び出しに必要なリクエストヘッダーを準備します。'Ocp-Apim-Subscription-Key'では、サブスクリプションキーを指定します。'Content-Type'には、「メディアタイプが不特定形式」という意味の'application/octet-stream'というMIMEタイプが指定されています。MIMEタイプが何か分からない方は下記の説明が分かりやすく解説してあります。「このファイルは、こんな種類のファイルですよ」な情報がMIMEタイプです。ホームページを表示するとき、ホームページのファイルが置いてあるコンピュータ(Webサーバ)からホームページを見るときに使うソフト(Webブラウザ)に対して、ホームページのファイルが渡されます。このとき、ホームページのファイルには「このファイルは、こんな種類のファイルですよ」な情報がくっついています。「HTMLファイルですよ」や「画像です」などです。APIに渡すパラメーターを指定します。APIの解析から得たい画像の情報の種類を指定します。parametersを参照して下さい。v2.0今回は「画像の説明(=Description)」のテキストを画像ファイル名のリネームに使用したいので'Description'と指定しました。Color'のようにカンマで区切って指定します。'rb')第1引数のfilepathに指定されているJPEG画像ファイルをオープンしています。オープンしたファイルオブジェクトが変数imgに代入されます。第2引数の'rb'は、リードバイナリというオープンモードを示しています。1文字目の「r」はreadの頭文字で、ファイルを読み取り形式でオープンするという意味になります。書き込み形式でオープンする場合は、writeの「w」になります。2文字目の「b」はバイナリモードという意味です。これが付いてない場合はテキストモードでオープンするという意味になります。今回はテキストファイルではなく画像ファイルを扱うので「r」の後ろに「b」を付けます。img.read()リードバイナリモードでオープンした画像ファイルオブジェクトを読み込み、変数img_byteに格納しています。APIにリクエストを送信し、返ってきた解析結果を変数responseに格納しています。4つの引数については、それぞれ以下のように指定されています。APIのURLdata=解析したいJPEG画像ファイルheaders=リクエストヘッダーparams=解析させたい情報種別27行目:response.raise_for_status()APIから返ってきたレスポンスにエラーがないかチェックしています。エラーがあればエラーメッセージを出力した後にプログラムが強制終了するようになっています。response.json()response.json()でAPIから返ってきたレスポンスをJSON形式に変換しています。変換されたJSON形式のデータは、ms_computer_vision_api関数の呼び出し元(36行目)に渡されます。"__main__":このPythonプログラムが直接実行されているかを判定しています。cv_demo.pyを直接実行した場合、__name__には”__main__”という値が代入されるようになっています。この場合のみ、if文がTrueとなるので、この下に続く処理が実行されます。glob.glob('./img/*')imgフォルダにあるファイルパス名を全て取得しリストにしたものを、image_fileという変数に格納します。[]vision_file_nameという名前の空のリストを準備します。time.time()システムの時刻を取得して変数startに格納しています。これがプログラムの実行開始時刻になります。プログラムの終了時に表示する「実行にかかった時間」を算出するのに使います。range(len(image_file)):range(len(image_file))は、0から「image_fileの要素数-1」までの値が格納されたリスト。このリストの値をfor文で1つずつ変数iに取り出し、image_fileのインデックスとして使います。ms_computer_vision_api(image_file[i])ms_computer_vision_api関数を呼び出して、image_file[i]の解析処理を実行します。APIから返ってきた解析結果を、json_dataという変数に格納しています。json_data['description']['captions'][0]['text']JSON形式で取得したデータは第1・第2階層が辞書形式になってますのでjson_data['description']['captions']で第1キーが’description’、第2キーが’captions’でアクセスします。第3階層は要素が1つだけのリスト形式になってますのでjson_data['description']['captions'][0]でインデックスが0の要素にアクセスします。第4階層は再び辞書形式になってますのでjson_data['description']['captions'][0]['text']で目的の要素のキーである’text’を指定して解析結果のテキストを取り出し、変数file_nameに格納します。39行目:vision_file_name.append(file_name)32行目で作成したvision_file_nameリストに、変数file_nameを追加します。'_')解析結果から取り出したテキストには、単語と単語の間にスペースが入っています。ファイル名に空白(スペース)があると、エラーが生じやすくなってしまいます。スペースが文字としての空白なのか、コマンドの区切りなのか、区別がつかないからです。空白をアンダーバーに置き換えてエラーを回避しています。range(len(vision_file_name)):range(len(vision_file_name))は、0から「vision_file_nameリストの要素数-1」までの値が格納されたリスト。このリストの値をfor文で1つずつ変数iに取り出し、vision_file_nameのインデックスとして使います。'_')によって、空白をアンダーバーに置き換えます。よって、vision_file_name[i]にある空白がアンダーバーに置き換えられます。置き換えられた後の値が、vision_file_name[i]に代入されます。vision_file_name)file_rename関数を呼び出し、image_fileとvision_file_nameを引数にしてリネーム処理を実行します。具体的には、imgフォルダにある全ての画像ファイルを、以下のような名前にリネームします。"[sec]")最後に、このプログラムの処理にかかった時間を出力します。startは以下のようになるので、経過時間を算出できます。プログラムの開始時刻そして、この計算結果をformat関数で"elapsed_time:{}"の{}部分に埋め込みます。VisionのAPIキーの取得の方法を解説していきます。このAPIキーを取得すると、画像認識AIを用いて画像に自動で名前を付けたりすることが可能になります。「Pythonをインストールしたはいいけれど、ライブラリをまともに使ったことがない。本記事は、こんな悩みを持ったPython初学者のための内容です。そもそもライブラリとは、...PythonPythonのモジュールの使い方。本記事では、そんなあなたにモジュールの機能・使い方を丁寧に解説します。本記事は、こんな悩みを解決する内容です。「制御構文」は、記述することでプログラムの動きをコントロールする構文です...PythonPythonのprint関数の使い方まとめprint関数は数値や文字列をコマンドライン上に表示するための関数です。プログラミングをする上で、画面へ結果を出力することは最も重要な操作の一つ。「print関数」はその最も基本的な方法でありながら、かなり応用的な場面まで幅広く...Python【記事の編集が楽に!】Pythonで複数のテキスト記事の見出しタグやリストタグを一括で置換してくれるプログラム今回のPythonスクリプトは複数記事の見出しとリストタグの一括整形ツールになります。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。ハシカケとは?Hashikakeハシカケは、改善したい、効率化したいなどの実現したいことからプログラミングを学ぶことができるサイトです。ハシカケ-実現したいことから学べるプログラミングサイト.ホーム検索トップサイドバーハシカケとは?Hashikakeハシカケは、改善したい、効率化したいなどの実現したいことからプログラミングを学ぶことができるサイトです。変換後のテキストで画像ファイルをリネームプログラムの最後に経過時間を出力タイトルとURLをコピーしました。