non vorrei lavorare

昔はおもにプログラミングやガジェット系、今は?

Blenderで初めてのアドオンを作るまで ~その2~

おはようございます。次男は寝る際は、その後はおむつにして寝かしてます。一度は成功したものの、その後、朝起きると、おむつにしっかりおしっこを出してます。長男の際も、しばらくはかかったので、気長に構えてます。@kjunichiです。

背景

第3回:3月26日(日)Blender勉強会(UE4よちよち勉強会_スピンオフ)@HDE(渋谷) : ATNDというBlenderの勉強会に参加。

当日作ったコードをプラグイン化して、レンダリング画像をPOSTしてTensorflowで画像分類するサンプルを Webサービス化したURLに投げ、結果を表示するという一連の処理を実現しようとしている。

Blenderに入っているPythonで画像をPOSTする

前回の記事レンダリングした画像をJPEG形式で取得することが出来るようになった

また、「Tensorflowのclassify_image.pyをWebアプリ化した」の記事で画像をPOSTすれば、Tensorflow(classify_image.py)の処理結果を返すWebサービスの実装も完了している。

という事で、今回は、Blenderからレンダリングした画像をこのWebサービスにPOSTしてみる。

import bpy
import urllib.request
import os

imagepath=os.path.abspath("/tmp/kjunichi.jpg")
bpy.data.scenes["Scene"].render.filepath = imagepath
bpy.data.scenes["Scene"].render.image_settings.file_format='JPEG'
bpy.ops.render.render( write_still=True )

with open(imagepath,"rb") as f:
    image=f.read()

target_url = "http://localhost:8000"
request = urllib.request.Request(target_url, data=image, method="POST")

with urllib.request.urlopen(request) as response:
        response_body = response.read() #.decode("utf-8")
        
print(response_body)

動作画面

f:id:kjw_junichi:20170428062704p:plain

今後の課題

関連記事

2年後の記事

シェルスクリプトのかわりにPythonでマルチプラットフォームで動かそうとして学んだこと

おはようございます。長男は最近どんどん手がかからずお兄さんになってきてくれてますが、爪を噛む癖が治りません。長男の爪を切った記憶がないです。この癖が心配な@kjunichiです。

背景

シェルスクリプトだとWindows環境で動かせないからPythonベースでgit cloneして 特定のハッシュのコミットを取出し、ファイルにあらかじめ用意してあるパッチを当てるという 一連の処理をやってみた。

以下の内容は、Python3をターゲットにしている。

Python3以降での外部コマンドの実行

まぁ、たいていのスクリプト言語では外部コマンドの実行をサポートしているはずと、調べて、 Python3系では

import subprocess

subprocess.call(["git","clone","https://github.com/tensorflow/models.git"])

といった感じで出来ることが分かりました。過去にはosモジュールを使った方法だったようですが、このsubprocessモジュールを使うのはこちらの

qiita.com

のコメント欄で知りました。

躓いたところ

cpコマンドがWindowsにはない

Windows上ではgit cloneして、VS Codeでファイルを編集することが大半で、 たまに家族の写真をコピーしたりといった操作は、エクスプローラーで行っていた為、 cpコマンドが無いことをすっかり忘れていた。

対応内容

PythonAPIでファイルのコピーを行った。

shutilモジュールのcopyfileを使うと実現できる。

import shutil

src_path =  os.path.abspath("models/tutorials/image/imagenet/classify_image.py")
dest_path = os.path.abspath("./classify_image_web.py")

shutil.copyfile(src_path, dest_path)

Pythonでの実装のため、os.path.abspathにより、Windowsのパスも/で記述でき、 おかげで、Windows用のパスの表記を別に記述することなく、スマートに実現できました。

WindowsのpatchコマンドはCR+LFを期待している

WindowsでPatchコマンドがエラーになる

前提として、chocolateyでpatchコマンドをインストールしている。

これはPythonには関係ないが、非Windows系のプラットフォームで作製して、 動作確認して、Windowsにいざ持ってきてハマりそうなところだと思うので 挙げた。

Windows版のpatchコマンドは改行コードをCR+LFを要求している。 しかし、非Windowsな環境で作製したpatchファイルは当然のLFのみの 改行となっている。

この為、非Windows環境で作ったpatchファイルをそのままWindows環境に持ってくると エラーとなり、patchが適用できない。

バイナリーオプションをpatchコマンドに適用することでこれを回避できた。

subprocess.call(["patch", "--binary","-u", "classify_image_web.py", "patch"])

関連記事

chocolateyでインストールしたあとの話

おはようございます。次男が夜も普通のパンツで寝れるように、おむつにおしっこを漏らさないように訓練中の@kjunichiです。

chocolateyで入れたモノたちを更新する

choco upgrade all -y

一発ではダメでした。

一部、オプションをつけて入れたパッケージは再度オプションを指定してアップグレードする 必要がある模様。

 choco upgrade openssh -params "/SSHServerFeature /SSHServerPort:20022"

さらに

Inkscapeはいったんアンインストールして入れる必要があった。

github.com

 choco uninstall inkscape
 choco install inkscape -y

何を入れたか忘れた場合

以下のコマンドで、Chocolateyで何を入れていたかを調べることができる。

 choco list -lo

関連記事

10年前の記事

2年前の記事