all-in-one-seo-pack
domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init
action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114easy-fancybox
domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init
action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114urvanov-syntax-highlighter
domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init
action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114breadcrumb-navxt
domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init
action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114advanced-ads
domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init
action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114lancr
ドメインの翻訳の読み込みが早すぎました。これは通常、プラグインまたはテーマの一部のコードが早すぎるタイミングで実行されていることを示しています。翻訳は init
アクション以降で読み込む必要があります。 詳しくは WordPress のデバッグをご覧ください。 (このメッセージはバージョン 6.7.0 で追加されました) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114
exe化した際にはエラーは出ていなかったのですが、実際exeファイルを実行すると以下のエラーが発生
RuntimeError: input(): lost sys.stdin というエラーは、Pythonのinput()関数が実行されるときに標準入力が利用できないことが原因のようです。
ということで、簡潔に言うと
setup.pyで以下の部分を修正します。
import sys from cx_Freeze import setup, Executable build_exe_options = { # 取り込みたいパッケージ "packages": ["pydicom","fileselect"], # 除外したいパッケージ "excludes": ["matplotlib","numpy","seaborn","opencv-python"], } base = None if sys.platform == "win32": base = "Win32GUI" #←ここをNoneに変更 #base = None setup( # アプリの名前 name="Application Name", version="0.1", # アプリの説明 description="explanation", options={ "build_exe": build_exe_options, }, executables=[ Executable( # 実行ファイル名を記載します。 script="filename.py", base=base, ), ], )
13行目の base = “Win32GUI”を
base = None
に変更するだけ。
変更した設定のbaseとはアプリケーションの種類の設定になるようです。
‘Win32GUI’
GUIアプリケーションを用いたものとなり、コンソールは使用できないようになるそうです。
None
コンソールアプリケーション
という事になるそうです。
どなたかの役にたてば幸いです。
もしよろしければ、「いいね」押してくださいね。
The post cx-Freeze input()でエラーが・・その対策 first appeared on 診療放射線技師がPythonをはじめました。.]]>今回は、pythonからエクセルにデータ出力をする方法を紹介します。
pythonからエクセルを操作するライブラリー、私は初めpywin32を使ってみたのですが問題が起こったときに調べようとしてもなかなかいい情報が得られない。という事で、今ではxlwingsを使っています。
そこで、今回はxlwingsを紹介します。
インストールはいたって簡単
コマンドプロンプトを立ち上げて、
pip install xlwings
もしくは
conda install xlwings
これだけです。仮想環境を構築している方は、仮想環境をアクティベートしてから行ってください。
なお、anacondaのベース環境を使っている方はanacondaに含まれているらしいのでインストールの必要はないようです。
使い方はすごくシンプルです。
import xlwings as xw wb = xw.Book()
この2行だけでエクセルが立ち上がってくれます。
そうしたら、シートを指定し、セルを指定してあげます。
そこにどの値を入力するかを指定してあげるだけです。
import xlwings as xw wb = xw.Book() sht = xw.sheets[0] sht.range("A1").value = 'TEST_A1' sht.range("C5").value = 'TEST_C5'
続いて、リストを一気に入力してみます。
import xlwings as xw coment =['slice1', 'slice2', 'slice3', 'slice4', 'slice5', 'slice6'] wb = xw.Book() sht = xw.sheets[0] sht.range("A1").value = coment
今度は、縦方向に入力してみます。
optionsで指定をします。
import xlwings as xw coment =['slice1', 'slice2', 'slice3', 'slice4', 'slice5', 'slice6'] wb = xw.Book() sht = xw.sheets[0] sht.range("A1").options(transpose=True).value = coment
for文を使って入力していくのが簡単です。
その際に、オプションとしてoffsetを用います。
import xlwings as xw coment =[['slice1_1', 'slice1_2', 'slice1_3', 'slice1_4', 'slice1_5', 'slice1_6'], ['slice2_1', 'slice2_2', 'slice2_3', 'slice2_4', 'slice2_5', 'slice2_6'], ['slice3_1', 'slice3_2', 'slice3_3', 'slice3_4', 'slice3_5', 'slice3_6'], ['slice4_1', 'slice4_2', 'slice4_3', 'slice4_4', 'slice4_5', 'slice4_6'], ['slice5_1', 'slice5_2', 'slice5_3', 'slice5_4', 'slice5_5', 'slice5_6']] wb = xw.Book() sht = xw.sheets[0] for i in range(len(coment)): sht.range("A1").offset(i, 0).value = coment[i]
offsetは基準セルから以下の様に(縦、横)で指定します。
(-1,-1) | (-1,0) | (-1,1) |
(0,-1) | 基準セル | (0,1) |
(1,-1) | (1,0) | (1,1) |
今度は、縦方向に入力していきます。
import xlwings as xw coment =[['slice1_1', 'slice1_2', 'slice1_3', 'slice1_4', 'slice1_5', 'slice1_6'], ['slice2_1', 'slice2_2', 'slice2_3', 'slice2_4', 'slice2_5', 'slice2_6'], ['slice3_1', 'slice3_2', 'slice3_3', 'slice3_4', 'slice3_5', 'slice3_6'], ['slice4_1', 'slice4_2', 'slice4_3', 'slice4_4', 'slice4_5', 'slice4_6'], ['slice5_1', 'slice5_2', 'slice5_3', 'slice5_4', 'slice5_5', 'slice5_6']] wb = xw.Book() sht = xw.sheets[0] for i in range(len(coment)): sht.range("A1").options(transpose=True).offset(0, i).value = coment[i]
以上、pythonからエクセルに入力する方法でした。
以下、xlwingのドキュメントです。
https://docs.xlwings.org/ja/latest/index.html
例えば、前立腺を抽出するセグメンテーションをしたい場合は、学習画像として、元画像と、前立腺だけを抽出した(下の画像右側)のような画像を作成しなければいけません。
ワークステーションを使えばできるのですが、業務終了後に職場に残ってこの作業、やりたくないですよね。自分なら、家で酒でも飲みながら音楽をかけて作業。を望みます。
なので、今回は、この画像を作成するコードを組んでいきます。
最終的なコードは以下となります。
import numpy as np import cv2 import pydicom import matplotlib.pyplot as plt from matplotlib.patches import Circle def on_motion(event): global contour, fig, ax1 if event.button == 1 : contour.append([int(event.xdata), int(event.ydata)]) ax1.add_patch(Circle((event.xdata, event.ydata), 0.1, color='r')) fig.canvas.draw() def on_button_release(event): global contour, mask, ax2 cv2.fillConvexPoly(mask, np.array(contour), color=255, lineType=cv2.LINE_AA) ax2.imshow(mask, cmap='bone') fig.canvas.draw() def main(): global contour, fig, ax1, ax2, mask dcm = pydicom.dcmread('009_IMG11') img = dcm.pixel_array mask = np.zeros_like(img, dtype=np.uint8) ww, wl = dcm[0x0028, 0x1051].value, dcm[0x0028, 0x1050].value ww_l, ww_h = wl - ww // 2, wl + ww // 2 contour= [] fig = plt.figure(figsize=(10, 5)) ax1,ax2 = fig.add_subplot(1, 2, 1), fig.add_subplot(1, 2, 2) ax1.imshow(img, cmap='bone', vmin=ww_l, vmax=ww_h) fig.canvas.mpl_connect('button_release_event', on_button_release) fig.canvas.mpl_connect('motion_notify_event', on_motion) plt.show() if __name__ == "__main__": main()
コードの流れとしては
といった流れになっていきます。
上記コードで
DICOM画像の表示はmain関数内
DICOM画像で領域抽出は「on_motion」関数
マスク画像に領域を描出は「on_button_release」関数
で指定しています。
領域抽出は、DICOM画像上で抽出する領域をなぞっていくことでその座標を、リストに登録していきます。
ここでは、numpyの配列としてではなく、リストとして扱っていきます。
numpy配列として、2次元データに2次元データをひとつづつ追加していこうとするとちょっと厄介なことが起こるので。。。。。(詳細はいつか記事にしたいと思っています)
リストとして扱っていけば、純粋にappendで追加していけます。
追加する際に、整数型として追加していきます。
contour.append([int(event.xdata), int(event.ydata)])
また、なぞった位置をDICOM画像上に表示しておきたいので
ax1.add_patch(Circle((event.xdata, event.ydata), 0.1, color=’r’))
で画像上にプロットして
fig.canvas.draw()
で画像を再描出しています。
なぞった座標のリストを別の画像上に描出します。
上記コードの32行目
mask = np.zeros_like(img, dtype=np.uint8)
でマスク画像用の配列をデータ0で作成しています。
配列の型は、マイナスデータなしの8bit画像です。なので階調は0~255となります。
先ほどなぞって登録したリストをmask上に描出します。
この機能は、openCVを使います。
cv2.fillConvexPoly(mask, np.array(contour), color=255, lineType=cv2.LINE_AA)
この関数は矩形を描出し、その中を塗りつぶします。
ここで先ほどの座標データを使うのですが、受けるデータはnumpy配列で整数型しか受けてくれません。
なので、リストに登録する際にint型を指定して追加していました。
そのリストをnumpy配列に変換するのは
np.array(contour)
としてあげるだけでnumpy配列として扱ってくれます。非常に便利です。
で、3番目の引数で255の値を指定してあげます。もし、RGBで指定するのであれば(0,0,0)等で指定してあげれば大丈夫です。ただ、その際にはmask配列作成時にRGBとして配列を作成することを忘れないようにしてください。
これで、先ほどなぞった座標内を255の値として登録することが出来ました。
後は、画像表示して確認です。
いかがですか?このコードだけでは何枚もの教師画像を作成するのは大変ですが、根幹となるコードはできました。
このコードがどなたかの役に立てば幸いです。
The post 画像セグメンテーションに必要な教師データ作成ツールを組んでみた first appeared on 診療放射線技師がPythonをはじめました。.]]>今回は、私が作成したプログラムを後輩に与えた時、後輩のパソコンではマウスコントロールを使って画像を切り替えることができなかったときの事を書きます。
後輩から
「先輩、マウスホイールを回しても画像が切り替わらないんです」
なんて言われて、
「何を言っているの。俺のパソコンではきちんと動いているよ。」
コードは、メールにて送っており、どこも変更していないとのこと。
「だったら、エラーコードは?」
「エラーも出ていません」
なんで~~。その時は、学会も近かったのでとりあえず、複数の画像を読み込まないように変更をかけて何とか凌ぎました。
学会終了後は、そのまま時が過ぎて何事もなかったかのように時が過ぎていきました。
で、最近新しいプログラムを作成し自分のパソコンから職場のパソコンに移植しました。
あれ??マウスホイールを回しても画像が変わらない。
matplotlibの拡大縮小のボタンをクリックしてからマウスホイールを回して、クリックすると画像が切り替わる。なんで~~~。
とりあえず、動くは動くけど遅いし手間がかかる~~~。
原因は、matplotlibのバックエンドなるもの。
確認方法は以下の一文をコードを書き込みバックエンドを確認
print(matplotlib.get_backend())
今回は、動かないPCでは ”QtAgg” でした。
なので、
import文を記載しているところに
matplotlib.use(‘TkAgg’)
と記載することで解決しました。
対応策としては、matplotlibの設定ファイルを変更することでも対応できるらしいのですが、
やはり明示的に記載しておく方が間違いないかなと思います。
なお、詳細は以下のサイトにありますので、興味ある方はご覧になってください。
The post えっ?なんで?matplotlibでマウスコントロールが使えない。。。 first appeared on 診療放射線技師がPythonをはじめました。.]]>今回は、その環境でのスピードを検証してみました。
今回、検証したプログラムは現在研究で使用しているものでコードをアップすることはできないのですが、Dicom画像をシリーズで読込、マウスホイールで画像を変更でき、画像をクリックした部分をseabornを用いて表示するというプログラムです。
画像表示領域は4カ所で
上段2段はmatplotlibで表示した元画像。
下段2画像はseabornによる拡大画像です。
で、速度検証した状況は
画像をクリックしてseaborn表示をしている状態で、画像を変更していきます。
seabornって図形の表示が綺麗に作成されていて、表示速度にはあまり注力していないらしく画像表示が遅いんですよね。。。。(私のコードが悪いんだと思いますが・・・・)
コードはコピーして使用していますので、同一。
画像も同一のものを用いています。
いかがでしょうか?
Version3.7では平均0.45秒かかっているものが、Version3.11では0.35秒と約0.1秒短縮されています。
0.1秒。それだけ?と思われるかもしれませんが、体感的には実感できます。
画像表示に0.45秒って、結構ストレスを感じます。
0.35秒に短縮されて
「結構早くなったな」
と思えます。
皆さんも、試してみてください。
The post V3.11で速度を検証してみた。 first appeared on 診療放射線技師がPythonをはじめました。.]]>今回は、その3.11バージョンで仮想環境を構築していきます。
さあ、処理速度が高速化したPython3.11で仮想環境を構築しよう!!と
コマンドプロンプトを立ち上げて
conda create -n v311 python=3.11
なんて打ち込んだんですが
python3.11が無いって・・・・
まあ、そりゃそうですよね。前回はPython3.11をインストールしただけで、condaのパッケージとしてインストールしたわけではないのでcondaで仮想環境は作成できませんよね・・・・・
condaでpython3.11で仮想環境構築できるかななんて思って、conda navigaterをアップデートしたんですがバージョンは3.10までしかありませんでした。。。
まあ3.11のバージョンはまだベータ版なのでconda対応じゃないのも納得。
ということで、condaを使わずに仮想環境を構築したいと思います。
Python単体での仮想環境構築となります。
まずは、どこにルートディレクトリを作成するかですが
PythonのプロジェクトはPycharmのルートディレクトリにすることにしました。
なので、デフォルトであれば以下のフォルダになります。
C:\Users\ユーザー名\PycharmProjects
に仮想環境を構築します。
まずはそこの「v311」の名前でフォルダを作成しました。
コマンドプロンプトを立ち上げてルートディレクトリに移動します。
cd C:\Users\ユーザー名\PycharmProjects\v311
いざ、仮想環境を構築。以下のコマンドを打ち込むと
python -m venv env
あれれ・・・エラーが発生しました。。。。
フォルダを見てみると「env」の名前でフォルダが作成されていたので、まあいいかと進むことに。
さあ、仮想環境をアクティベーションしよう!!
C:\Users\ユーザー名\PycharmProjects\v311\env\Scripts\
内の「activate.bat」を選択して~~~
無い。。。。さっきのエラーは
‘-Im’, ‘ensurepip’, ‘–upgrade’, ‘–default-pip’ などが無いというエラーというエラーなのか。。。
確かに、
C:\Users\ユーザー名\PycharmProjects\v311\env\Lib\site-packages
の中には何もありません。。。。
出来上がった「env」のフォルダを削除して再度仮想環境を構築します。
今回は、pip無しで仮想環境を構築します。
再度、コマンドプロンプトを立ち上げて
cd C:\Users\ユーザー名\PycharmProjects\v311
python -m venv –without -pip env
と打ち込むことでエラーも出ずに仮想環境が出来上がりました。
で、再度以下のディレクトリーに移動します。
C:\Users\ユーザー名\PycharmProjects\v311\env\Scripts\
今回は、「activate.bat」がありました。
そのファイルを指定することで仮想環境をアクティベーションできます。
(activateのファイルではなくactivate.batを選択)
アクティベーションが完了しました。
しかし、pipが無いので何もライブラリーをインストールすることができません。
それではpipをインストールします。
以下のサイトにアクセスします。
https://bootstrap.pypa.io/get-pip.py
Ctrlキーと「A」ですべてを選択します。
テキストファイル作成してペーストしファイル名を「get-pip.py」として保存します。
ファイルを
C:\Users\ユーザー名\PycharmProjects\v311\env\Scripts\
に移動しておきます。
コマンドプロンプトで
C:\Users\ユーザー名\PycharmProjects\v311\env\Scripts\
に移動し以下のコマンドを打ちます。
python get-pip.py
上記のようになればpipのインストールは完了です。
念のため、「site-packages」も確認
きちんと、インストールが完了していることが確認できました。
The post Python3.11で仮想環境構築 first appeared on 診療放射線技師がPythonをはじめました。.]]>以前、作成したプログラムをある医師に提供したところ、そのプログラムを使って学会発表をしていただけたようで、その発表をした医師にそのプログラムを使ってみたいという問い合わせがあったそうです。
しかし、私の作成したプログラムはあまり快適に動いてくれていません。
で、C++にて作りなおそうかと思ったのですが、Python3.11が以前よりもパフォーマンスがアップしたとの事で一度そっちを試してみようと思い、今回インストールしてみました。
(ちなみに、私はC++使えません・・・・・)
まずはダウンロード。以下のリンクからダウンロードします
https://www.python.org/downloads/
赤枠のボタンを押してダウンロード。
インストールは、ダウンロードしたファイルをクリックすれば開始されます。
下の「Add python.exe to Path」にチェックを入れておきましょう。
そして「Install Now」をクリック
「Add python.exe to Path」できちんとPathが通っているか確認します。
コマンドプロンプトでも確認してみましょう
コマンドプロンプトを立ち上げて
python -V
と打つと
問題なく認識しました。
ちなみに、インストール先は
C:\Users\ユーザー名\AppData\Local\Programs\Python
となります。
matplotlibを使ってカラー表示をする際、既存のカラーマップでは満足がいかないことがあると思います。
そんな時は自作でカラーマップを作ってしまおうというのが今回の企画です。
カラーマップ表示するには、どの値からどの値までを、どの様な区切りで表示するか考えます。
その後、その区切りをどの色で表示するか決めます。
今回は0~99までの値を10区切りで、色を
[ black , lightgrey , darkorange , gole , chartreuse , palegreen , mediumspringgreen , paleturquoise , steelblue , navy ]
上記10色で表示してみたいと思います。
matplotlibのカラー表示はここで確認できます。
今回はseabornのヒートマップを用いて確認をしてみます。
ちなみに、seabornはデータの可視化をmatplotlibよりも強力にサポートしてくれるライブラリーです。
今回提示するヒートマップもseabornならではの機能です。
seabornはmatplotlibと違うライブラリーかと思われるかもしれませんが、実は内部ではmatplotlibが動いているらしいです。
もちろん、カラーマップの設定はmatplotlibでも利用できますのでご安心を。
色を指定します。先ほども提示しましたが再度掲示します。
cmap = ListedColormap( [ 'black' , 'lightgrey' , 'darkorange' , 'gold' , 'chartreuse' , 'palegreen' , 'mediumspringgreen' , 'paleturquoise' , 'steelblue' , 'navy' ])
ここで注意していただきたいので色の名前はシングルコーテーション「 ‘ 」で囲う必要があります。
それでは、コードを提示します。
import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap, BoundaryNorm import seaborn as sns arr = np.arange(100) arr = arr.reshape([10,10]) print(arr) fig=plt.figure(figsize=(5, 5)) ax1 = fig.add_subplot(1,1,1) ax1.axes.xaxis.set_visible(False), ax1.axes.yaxis.set_visible(False) ax1.spines['bottom'].set_visible(False), ax1.spines['top'].set_visible(False) ax1.spines['right'].set_visible(False), ax1.spines['left'].set_visible(False) cmap = ListedColormap( [ 'black' , 'lightgrey' , 'darkorange' , 'gold' , 'chartreuse' , 'palegreen' , 'mediumspringgreen' , 'paleturquoise' , 'steelblue' , 'navy' ]) norm = BoundaryNorm(bounds, cmap.N) ax1 = sns.heatmap(arr, annot=True, cbar=True, cmap=cmap) plt.show()
きちんと10間隔で設定した色通りに表示されています。
等間隔で色を変えたい場合はこれでいいのですが、例えば40~60の間だけ色を変えたい場合はこれではうまくいきません。
ある領域だけ色を変えたい場合はまず色分けする領域を指定する必要があります。
30~70の間だけを5づつ色を付けたい場合、まず色の指定範囲を以下のように設定します。
bounds = [0, 30, 35, 40, 45, 50, 55, 60, 65, 70, 100]
ただ、これだけだと範囲と色の組み合わせができていません。
なので「BoundaryNorm」という関数を使って紐づけしてあげます。
norm = BoundaryNorm(bounds, cmap.N)
ちなみに、cmapの後の「 .N 」とはboundsとcmapに対応させる意味があるらしいです。これが無いとエラーになります。
そして、これを画像設定axの中に組み込んでいきます。
ax1 = sns.heatmap(arr, annot=True, cbar=True, cmap=cmap, norm=norm)
コード全体としては
import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap, BoundaryNorm import seaborn as sns arr = np.arange(100) arr = arr.reshape([10,10]) print(arr) fig=plt.figure(figsize=(5, 5)) ax1 = fig.add_subplot(1,1,1) ax1.axes.xaxis.set_visible(False), ax1.axes.yaxis.set_visible(False) ax1.spines['bottom'].set_visible(False), ax1.spines['top'].set_visible(False) ax1.spines['right'].set_visible(False), ax1.spines['left'].set_visible(False) cmap = ListedColormap( [ 'black' , 'lightgrey' , 'darkorange' , 'gold' , 'chartreuse' , 'palegreen' , 'mediumspringgreen' , 'paleturquoise' , 'steelblue' , 'navy' ]) bounds = [0, 30, 35, 40, 45, 50, 55, 60, 65, 70, 100] norm = BoundaryNorm(bounds, cmap.N) ax1 = sns.heatmap(arr, annot=True, cbar=True, cmap=cmap, norm=norm) plt.show()
ax1 = sns.heatmap(arr, annot=True, cbar=True, cmap=cmap, norm=norm)
の部分を以下に変更すれば完了です。
ax1.imshow(arr, cmap=cmap, norm=norm)
なお、matplotlibで値を表示する機能は標準ではないと思われますので、もし値を表示したい方はseabornを用いた方が簡便でいいかと思われます。
お疲れ様でした。
shape_optimizer failed
が出てしまっていたのでその対策を紹介していきます。
エラーの内容は以下となっていました。
2021-11-21 15:21:51.149144: E tensorflow/core/grappler/optimizers/meta_optimizer.cc:502] shape_optimizer failed: Invalid argument: Subshape must have computed start >= end since stride is negative, but is 0 and 2 (computed from start 0 and end 9223372036854775807 over shape with rank 2 and stride-1)
2021-11-21 15:21:51.192474: E tensorflow/core/grappler/optimizers/meta_optimizer.cc:502] remapper failed: Invalid argument: Subshape must have computed start >= end since stride is negative, but is 0 and 2 (computed from start 0 and end 9223372036854775807 over shape with rank 2 and stride-1)
2021-11-21 15:21:51.353338: E tensorflow/core/grappler/optimizers/meta_optimizer.cc:502] layout failed: Invalid argument: Subshape must have computed start >= end since stride is negative, but is 0 and 2 (computed from start 0 and end 9223372036854775807 over shape with rank 2 and stride-1)
2021-11-21 15:21:51.593370: E tensorflow/core/grappler/optimizers/meta_optimizer.cc:502] shape_optimizer failed: Invalid argument: Subshape must have computed start >= end since stride is negative, but is 0 and 2 (computed from start 0 and end 9223372036854775807 over shape with rank 2 and stride-1)
2021-11-21 15:21:51.627088: E tensorflow/core/grappler/optimizers/meta_optimizer.cc:502] remapper failed: Invalid argument: Subshape must have computed start >= end since stride is negative, but is 0 and 2 (computed from start 0 and end 9223372036854775807 over shape with rank 2 and stride-1)
上記エラーコードの2行目から3行目をグーグル先生に翻訳してもらうと
無効な引数:ストライドが負であるため、サブシェイプは開始> =終了を計算する必要がありますが、0と2です(ランク2とストライド-1のシェイプに対して開始0と終了9223372036854775807から計算されます)
ん~~よくわかりません。
スタックオーバーフローに回答が書いてありました。
なにやら、yolo3/model.pyに編集を加える必要があるようです。
140~141行目、以下のコードを
box_xy = (K.sigmoid(feats[..., :2]) + grid) / K.cast(grid_shape[::-1], K.dtype(feats)) box_wh = K.exp(feats[..., 2:4]) * anchors_tensor / K.cast(input_shape[::-1], K.dtype(feats))
以下のコードに書き換えると解消します。
box_xy = (K.sigmoid(feats[..., :2]) + grid) / K.cast(grid_shape[...,::-1], K.dtype(feats)) box_wh = K.exp(feats[..., 2:4]) * anchors_tensor / K.cast(input_shape[...,::-1], K.dtype(feats))
お試しあれ。
The post yolo v3 : shape_optimizer failedエラーの対策 first appeared on 診療放射線技師がPythonをはじめました。.]]>さて、今回は畳み込みフィルタをやってみたので記事にしていきます。
お恥ずかしい話、1,2年ぐらい前までよく分かっていませんでした・・・・・
深層学習を勉強するようになってやっと少しずつ理解できるようになってきました。。。。
学生時代、きちんと勉強していなかった事を後悔しています。
それでは本題に入っていきます。
フィルタはカーネルといわれる配列で指定していきます。
3×3や、5×5といった縦横同一サイズのカーネルで指定していきます。
カーネルの種類は無数にあります。
ただ、カーネルの設定次第で鮮鋭化であったり平滑化であったり、エッジ検出であったりといろいろとできます。
その目的とする効果によってカーネルの組み方が変わってきます。
例えば、鮮鋭化であれば隣り合うピクセルの差が大きければ、くっきりとした画像になります。
その為、以下のように中心に接する値にマイナスの値を設定してあげれば鮮鋭化することができます。
例えば、1次元で試してみましょう。元の配列3,3,5,7,5,3,3という配列があり
それにー1,4,ー1というカーネルを掛け合わせてみると下の様な結果になります。
上記結果をグラフとして表示してみると、下の図の黄色のグラフになり、鮮鋭化されているのが分かります。
逆に、平滑化であれば
の様にしてあげれば平滑化、いわゆる少しボケたような画像が出来上がります。
なおフィルタの値は合計で1を超えると明るめの画像となり、1以下であれば暗めの画像になってしまいます。
先の鮮鋭化のフィルタでは1を超えてしまっているので全体的に信号が高くなっています。逆に平滑化のフィルタでは1より小さくなっているので信号は元の青いグラフより低くなっています。
以下では、鮮鋭化フィルタで合計を1にした場合です。平均すると元の値とほぼ変わりません
上記説明では中心から上下左右の4近傍のフィルタで説明しましたが
その他に、上下左右と斜めにも値を入れた8近傍フィルタもあります。
それでは実際のコードです。今回はopenCVを用いて行います。
cv2.filter2D(元画像の配列, -1, kernel)
で畳み込みフィルタができます。
なお、引数に関してはこれ以外にももう少しあるようです。気になる方はgoogle先生にお尋ねください。
今回、私が試してみたコードが以下になります。
import numpy as np import pydicom import matplotlib.pyplot as plt import cv2 def main(): filenames = "MR000002" dcm = pydicom.dcmread(filenames) window_center , window_width = dcm[0x0028,0x1050].value, dcm[0x0028,0x1051].value ww_low, ww_high = int(window_center) - int(window_width) // 2, int(window_center) + int(window_width) // 2 pix_arr = dcm.pixel_array pix_arr_fil1 = dcm.pixel_array pix_arr_fil2 = dcm.pixel_array mag1, k1 = 9, -1 mag2, k2, k0 = 5, -1, 0 kernel8 = np.array([[k1, k1, k1], [k1, mag1, k1], [k1, k1, k1]]) print(kernel8) kernel4 = np.array([[k0, k2, k0], [k2, mag2, k2], [k0, k2, k0]]) print(kernel4) pix_arr_fil1 = cv2.filter2D(pix_arr_fil1, -1, kernel8) pix_arr_fil2 = cv2.filter2D(pix_arr_fil2, -1, kernel4) fig = plt.figure(figsize=(18, 7)) ax1 = fig.add_subplot(1, 3, 1) ax2 = fig.add_subplot(1, 3, 2) ax3 = fig.add_subplot(1, 3, 3) plt.subplots_adjust(left=0, right=1, bottom=0, top=1, wspace=0.02, hspace=0.005) ax1.axes.xaxis.set_visible(False), ax1.axes.yaxis.set_visible(False) ax2.axes.xaxis.set_visible(False), ax2.axes.yaxis.set_visible(False) ax3.axes.xaxis.set_visible(False), ax3.axes.yaxis.set_visible(False) ax1.imshow(pix_arr, cmap='bone', vmin=ww_low, vmax=ww_high) ax2.imshow(pix_arr_fil1, cmap='bone', vmin=ww_low, vmax=ww_high) ax3.imshow(pix_arr_fil2, cmap='bone', vmin=ww_low, vmax=ww_high) plt.show() if __name__ == '__main__': main()
24~26行目に8近傍のカーネル
30~32行目に4近傍のカーネルを設定してあります。
なおカーネルの値はそれぞれ、21行目と22行目で設定できるようにしています。
鮮鋭化フィルタ (画像をクリックすると拡大します)
平滑化フィルタ (画像をクリックすると拡大します)
平滑化フィルタはこの画像ではわかりずらいかもしれませんね。興味のある方は他の画像で試してみてください。