Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the 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 6114

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the easy-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 6114

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the urvanov-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 6114

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the breadcrumb-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 6114

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the advanced-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 6114

Notice: 関数 _load_textdomain_just_in_time が誤って呼び出されました。lancr ドメインの翻訳の読み込みが早すぎました。これは通常、プラグインまたはテーマの一部のコードが早すぎるタイミングで実行されていることを示しています。翻訳は init アクション以降で読み込む必要があります。 詳しくは WordPress のデバッグをご覧ください。 (このメッセージはバージョン 6.7.0 で追加されました) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114

Warning: Cannot modify header information - headers already sent by (output started at /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php:6114) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-content/plugins/all-in-one-seo-pack/app/Common/Meta/Robots.php on line 87

Warning: Cannot modify header information - headers already sent by (output started at /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php:6114) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/feed-rss2.php on line 8
Python | 診療放射線技師がPythonをはじめました。 http://radiology-technologist.info 診療放射線技師のPython日記。解析等で使えるコードを作成、アップしていきたいと思っています。その他いろいろ Sat, 18 May 2024 18:24:57 +0000 ja hourly 1 https://wordpress.org/?v=6.7.1 https://i0.wp.com/radiology-technologist.info/wp-content/uploads/2018/09/cropped-logo5.png?fit=32%2C32 Python | 診療放射線技師がPythonをはじめました。 http://radiology-technologist.info 32 32 164362728 cx-Freeze input()でエラーが・・その対策 http://radiology-technologist.info/post-1945 Sat, 18 May 2024 18:19:58 +0000 http://radiology-technologist.info/?p=1945 cx-Freezeを用いてexe化をした際にエラー […]

The post cx-Freeze input()でエラーが・・その対策 first appeared on 診療放射線技師がPythonをはじめました。.]]>
cx-Freezeを用いてexe化をした際にエラーが出てしまった件


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

に変更するだけ。


広告
HP Directplus -HP公式オンラインストア-

baseとは

変更した設定のbaseとはアプリケーションの種類の設定になるようです。

‘Win32GUI’

GUIアプリケーションを用いたものとなり、コンソールは使用できないようになるそうです。


None

コンソールアプリケーション

という事になるそうです。


どなたかの役にたてば幸いです。

もしよろしければ、「いいね」押してくださいね。

広告
上新電機 パソコン買取サービス
The post cx-Freeze input()でエラーが・・その対策 first appeared on 診療放射線技師がPythonをはじめました。.]]>
1945
pythonからエクセルにデータを入力 http://radiology-technologist.info/post-1893 Mon, 02 Jan 2023 13:41:39 +0000 http://radiology-technologist.info/?p=1893 pythonで解析を行ったものをエクセルに出力した […]

The post pythonからエクセルにデータを入力 first appeared on 診療放射線技師がPythonをはじめました。.]]>
pythonで解析を行ったものをエクセルに出力したい事ってありますよね。

今回は、pythonからエクセルにデータ出力をする方法を紹介します。


エクセルを扱うライブラリー xlwings

pythonからエクセルを操作するライブラリー、私は初めpywin32を使ってみたのですが問題が起こったときに調べようとしてもなかなかいい情報が得られない。という事で、今ではxlwingsを使っています。

そこで、今回はxlwingsを紹介します。


広告
デル株式会社

インストール

インストールはいたって簡単

コマンドプロンプトを立ち上げて、

pip install xlwings

もしくは

conda install xlwings

これだけです。仮想環境を構築している方は、仮想環境をアクティベートしてから行ってください。

なお、anacondaのベース環境を使っている方はanacondaに含まれているらしいのでインストールの必要はないようです。


広告
HP Directplus -HP公式オンラインストア-

使い方

使い方はすごくシンプルです。

エクセルを立ち上げる

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


2次元のリストを入力する場合 横方向に入力

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)


2次元のリストを入力する場合 縦方向に入力

今度は、縦方向に入力していきます。

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]


広告
BTOパソコン・パソコン関連商品がお買い得!パソコン工房のセール

終わり

以上、pythonからエクセルに入力する方法でした。

以下、xlwingのドキュメントです。

https://docs.xlwings.org/ja/latest/index.html


広告
上新電機 パソコン買取サービス
The post pythonからエクセルにデータを入力 first appeared on 診療放射線技師がPythonをはじめました。.]]>
1893
画像セグメンテーションに必要な教師データ作成ツールを組んでみた http://radiology-technologist.info/post-1884 Fri, 16 Dec 2022 09:02:29 +0000 http://radiology-technologist.info/?p=1884 深層学習をやってみようと思った時に、やはり学習デー […]

The post 画像セグメンテーションに必要な教師データ作成ツールを組んでみた first appeared on 診療放射線技師がPythonをはじめました。.]]>
深層学習をやってみようと思った時に、やはり学習データは必要になってきますが画像セグメンテーションをやろうと思った時には、その対象物を囲んだ画像データを作成する必要があります。

例えば、前立腺を抽出するセグメンテーションをしたい場合は、学習画像として、元画像と、前立腺だけを抽出した(下の画像右側)のような画像を作成しなければいけません。

ワークステーションを使えばできるのですが、業務終了後に職場に残ってこの作業、やりたくないですよね。自分なら、家で酒でも飲みながら音楽をかけて作業。を望みます。

なので、今回は、この画像を作成するコードを組んでいきます。


コード

最終的なコードは以下となります。

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画像の表示
    • マスク画像の作成(DICOM画像と同一の画像サイズで符号なしの8bit画像)
  • DICOM画像で領域指定(右クリックを押したままマウス移動)
    • マウスを移動させることでその座標をリストに追加していく
    • マウスを離すことで領域抽出完了
  • マスク画像に領域を描出

といった流れになっていきます。

上記コードで

DICOM画像の表示はmain関数内

DICOM画像で領域抽出は「on_motion」関数

マスク画像に領域を描出は「on_button_release」関数

で指定しています。


広告
HP Directplus -HP公式オンラインストア-

領域抽出

領域抽出は、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()

で画像を再描出しています。

広告
BTOパソコン・パソコン関連商品がお買い得!パソコン工房のセール

マスク画像に領域を描出 cv2.fillConvexPoly

なぞった座標のリストを別の画像上に描出します。

上記コードの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をはじめました。.]]>
1884
えっ?なんで?matplotlibでマウスコントロールが使えない。。。 http://radiology-technologist.info/post-1847 Thu, 08 Dec 2022 22:50:36 +0000 http://radiology-technologist.info/?p=1847 こんにちは。でめきんです。 今回は、私が作成したプ […]

The post えっ?なんで?matplotlibでマウスコントロールが使えない。。。 first appeared on 診療放射線技師がPythonをはじめました。.]]>
こんにちは。でめきんです。

今回は、私が作成したプログラムを後輩に与えた時、後輩のパソコンではマウスコントロールを使って画像を切り替えることができなかったときの事を書きます。

まさか、そんなことはないでしょ~。

後輩から

「先輩、マウスホイールを回しても画像が切り替わらないんです」

なんて言われて、

「何を言っているの。俺のパソコンではきちんと動いているよ。」

コードは、メールにて送っており、どこも変更していないとのこと。

「だったら、エラーコードは?」

「エラーも出ていません」

なんで~~。その時は、学会も近かったのでとりあえず、複数の画像を読み込まないように変更をかけて何とか凌ぎました。

学会終了後は、そのまま時が過ぎて何事もなかったかのように時が過ぎていきました。


広告
デル株式会社

あれ?ほんとだ動かない

で、最近新しいプログラムを作成し自分のパソコンから職場のパソコンに移植しました。

あれ??マウスホイールを回しても画像が変わらない。

matplotlibの拡大縮小のボタンをクリックしてからマウスホイールを回して、クリックすると画像が切り替わる。なんで~~~。

とりあえず、動くは動くけど遅いし手間がかかる~~~。


広告
HP Directplus -HP公式オンラインストア-

原因が判明!!

原因は、matplotlibのバックエンドなるもの。

確認方法は以下の一文をコードを書き込みバックエンドを確認

print(matplotlib.get_backend())

今回は、動かないPCでは ”QtAgg” でした。

なので、

import文を記載しているところに

matplotlib.use(‘TkAgg’)

と記載することで解決しました。

対応策としては、matplotlibの設定ファイルを変更することでも対応できるらしいのですが、

やはり明示的に記載しておく方が間違いないかなと思います。

なお、詳細は以下のサイトにありますので、興味ある方はご覧になってください。

https://matplotlib.org/stable/users/explain/backends.html

広告
上新電機 パソコン買取サービス
The post えっ?なんで?matplotlibでマウスコントロールが使えない。。。 first appeared on 診療放射線技師がPythonをはじめました。.]]>
1847
V3.11で速度を検証してみた。 http://radiology-technologist.info/post-1843 Sun, 27 Nov 2022 09:26:00 +0000 http://radiology-technologist.info/?p=1843 先日、pythonの最新バージョンv3.11で仮想 […]

The post V3.11で速度を検証してみた。 first appeared on 診療放射線技師がPythonをはじめました。.]]>
先日、pythonの最新バージョンv3.11で仮想環境構築しました。

今回は、その環境でのスピードを検証してみました。


比較したプログラム

今回、検証したプログラムは現在研究で使用しているものでコードをアップすることはできないのですが、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をはじめました。.]]>
1843
Python3.11で仮想環境構築 http://radiology-technologist.info/post-1828 Thu, 24 Nov 2022 00:01:00 +0000 http://radiology-technologist.info/?p=1828 前回はPython3.11のインストールを行いまし […]

The post Python3.11で仮想環境構築 first appeared on 診療放射線技師がPythonをはじめました。.]]>
前回はPython3.11のインストールを行いました。

今回は、その3.11バージョンで仮想環境を構築していきます。

condaで仮想環境構築!?

さあ、処理速度が高速化した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

の中には何もありません。。。。


広告
HP Directplus -HP公式オンラインストア-

再度、仮想環境を構築!!

出来上がった「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が無いので何もライブラリーをインストールすることができません。


広告
BTOパソコン・パソコン関連商品がお買い得!パソコン工房のセール

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をはじめました。.]]>
1828
Python3.11をインストール http://radiology-technologist.info/post-1820 Wed, 23 Nov 2022 03:52:58 +0000 http://radiology-technologist.info/?p=1820 令和4年10月24日にPythonの最新バーション […]

The post Python3.11をインストール first appeared on 診療放射線技師がPythonをはじめました。.]]>
令和4年10月24日にPythonの最新バーション3.11がリリースされました。

以前、作成したプログラムをある医師に提供したところ、そのプログラムを使って学会発表をしていただけたようで、その発表をした医師にそのプログラムを使ってみたいという問い合わせがあったそうです。

しかし、私の作成したプログラムはあまり快適に動いてくれていません。

で、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

となります。


広告
上新電機 パソコン買取サービス
The post Python3.11をインストール first appeared on 診療放射線技師がPythonをはじめました。.]]>
1820
matplotlib 自作カラーマップを作る方法 http://radiology-technologist.info/post-951 Thu, 25 Nov 2021 12:30:26 +0000 http://radiology-technologist.info/?p=951 こんにちは、でめきんです。 matplotlibを […]

The post matplotlib 自作カラーマップを作る方法 first appeared on 診療放射線技師がPythonをはじめました。.]]>
こんにちは、でめきんです。

matplotlibを使ってカラー表示をする際、既存のカラーマップでは満足がいかないことがあると思います。

そんな時は自作でカラーマップを作ってしまおうというのが今回の企画です。


準備

カラーマップ表示するには、どの値からどの値までを、どの様な区切りで表示するか考えます。

その後、その区切りをどの色で表示するか決めます。

今回は0~99までの値を10区切りで、色を

[ black , lightgrey , darkorange , gole , chartreuse , palegreen , mediumspringgreen , paleturquoise , steelblue , navy ]

上記10色で表示してみたいと思います。

matplotlibのカラー表示はここで確認できます。



広告
デル株式会社

seaborn

今回はseabornのヒートマップを用いて確認をしてみます。

ちなみに、seabornはデータの可視化をmatplotlibよりも強力にサポートしてくれるライブラリーです。

今回提示するヒートマップもseabornならではの機能です。

seabornはmatplotlibと違うライブラリーかと思われるかもしれませんが、実は内部ではmatplotlibが動いているらしいです。

もちろん、カラーマップの設定はmatplotlibでも利用できますのでご安心を。


広告
HP Directplus -HP公式オンラインストア-

等間隔で色を付けたい場合

色を指定します。先ほども提示しましたが再度掲示します。

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の間だけ色を変えたい場合はこれではうまくいきません。


広告
BTOパソコン・パソコン関連商品がお買い得!パソコン工房のセール

等間隔ではなく、特定の区間だけ色を変えたい場合

ある領域だけ色を変えたい場合はまず色分けする領域を指定する必要があります。

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()


matplotlibではどうする?

ax1 = sns.heatmap(arr, annot=True, cbar=True, cmap=cmap, norm=norm)

の部分を以下に変更すれば完了です。

ax1.imshow(arr, cmap=cmap, norm=norm)

なお、matplotlibで値を表示する機能は標準ではないと思われますので、もし値を表示したい方はseabornを用いた方が簡便でいいかと思われます。


お疲れ様でした。

広告
上新電機 パソコン買取サービス
The post matplotlib 自作カラーマップを作る方法 first appeared on 診療放射線技師がPythonをはじめました。.]]>
951
yolo v3 : shape_optimizer failedエラーの対策 http://radiology-technologist.info/post-1663 Mon, 22 Nov 2021 11:59:44 +0000 http://radiology-technologist.info/?p=1663 現在、yolo v3を使って遊んでいるのですが、そ […]

The post yolo v3 : shape_optimizer failedエラーの対策 first appeared on 診療放射線技師がPythonをはじめました。.]]>
現在、yolo v3を使って遊んでいるのですが、そこで自前データを使って学習を行おうとすると学習が始まる直前で

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から計算されます)

ん~~よくわかりません。


広告
デル株式会社

対策

スタックオーバーフローに回答が書いてありました。

https://stackoverflow.com/questions/57558476/training-a-keras-model-yields-multiple-optimizer-errors

なにやら、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をはじめました。.]]>
1663
畳み込みフィルタを試してみた ~OpenCV~ http://radiology-technologist.info/post-1617 Sun, 07 Nov 2021 08:21:26 +0000 http://radiology-technologist.info/?p=1617 前回の記事からずいぶんと時間が経ってしまいました。 […]

The post 畳み込みフィルタを試してみた ~OpenCV~ 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近傍フィルタもあります。


広告
HP Directplus -HP公式オンラインストア-

コード

それでは実際のコードです。今回は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行目で設定できるようにしています。


広告
BTOパソコン・パソコン関連商品がお買い得!パソコン工房のセール

結果

鮮鋭化フィルタ (画像をクリックすると拡大します)


平滑化フィルタ  (画像をクリックすると拡大します)

平滑化フィルタはこの画像ではわかりずらいかもしれませんね。興味のある方は他の画像で試してみてください。


広告
上新電機 パソコン買取サービス
The post 畳み込みフィルタを試してみた ~OpenCV~ first appeared on 診療放射線技師がPythonをはじめました。.]]>
1617