2024/05/02 画像処理界隈における「標準画像」

最近、研究上の必要から Python を用いた画像処理技術の習得に励んでいる。 私は中学生の頃から趣味で C 言語プログラミングに勤しんできたが、画像処理には触れてこなかった。 Python の基本的な部分は習得したので、実際の研究上の処理を行いながら画像の扱いを学んでいる次第である。 主にインターネット上で情報収集しながら学ぶにあたり驚くのは、 こうした分野の技術的情報をウェブ上などで公開している人々の社会問題への意識の低さである。 典型的なのが Lenna と呼ばれる女性の画像をサンプル画像として掲示している人の多さである。

Lenna の画像については Wikipedia などに経緯がまとめられている。 この画像は、もともと 1972 年の『プレイボーイ』誌に掲載された女性の画像であったらしい。 これを学会発表の際にサンプル画像として使用した者がいたのだが、 これが陰影や平坦領域など様々な要素が含まれているためにテスト画像として優秀だとして、 他の人々もテストに使い始めたのだという。 なおプレイボーイといのは、女性の性的な姿態を特異とする写真雑誌である。 テスト画像として広く使われた写真そのものは、それほど卑猥なものではないが、 出展が猥褻雑誌であることは間違いない。

そもそも、そうした猥褻な写真をテスト画像に使うこと自体、品性を疑う。 さらに、元々が写真雑誌なのだから、著作権上、および肖像権上の問題も生じる。 プレイボーイ社も、この写真を使うことについて明示的な許諾はしていない。 それにもかかわらず、平然と、この画像を使って画像処理方法を説明しているウェブサイトは非常に多い。

さすがに近年では Lenna の画像が使われる頻度は下がっているいようであるが、2010 年代までは しばしば使われていたようである。 現在でも、ウェブサイト上で公然とこの画像を「標準画像」として紹介している大学教員も存在するのは驚きである。


2024/04/29 畳み込みニューラルネットワーク

深層学習の分野で用いられる「畳み込みニューラルネットワーク (Convolutional Neural Network; CNN)」 と呼ばれる手法がある。 これは手書き文字の認識や画像処理などのパターン認識に広く使われている手法である。 これのバリエーションの一つに U-Net と呼ばれるものもあり、これを原型とする手法が 放射線医学分野における画像の機械認識に広く使われている。

ところが、この CNN について、「なぜ、それで、それができるのか」という部分を 理解して使っている人は少ないように思われる。 「よくわからないが、それでできると先人が報告してくれたので、マネしたらできた」という程度の理解で 扱っている者が、この分野には多いのではないか。 実際、インターネット上の文献にせよ、書籍として出版された文献にせよ、 CNN についてデタラメな記載が非常に多い。

たとえば CNN の代表として LeNet-5 (Y. Lecun et al., Proc. IEEE 86, 2278-2324 (1998)) を考える。これは手書き文字の画像について、何の数字が描かれているのかを判別するモデルである。 これについて「畳み込み層やプーリング層によって、描かれている図形の特徴が抽出され、 一方で『それがどこに描かれているのか』という位置情報は曖昧化する」というような記載をしばしばみかける。 これを書いている人々は、たぶん、計算内容を数学的にも定性的にも理解していないだけでなく、 自分が書いている内容が正しいかどうか数値的検証すら行わずに記事を書いているのであろう。

畳み込み層やプーリング層の計算内容を考えれば、数学的観点からいって、 「図形の特徴だけを抜き出す」だの「位置の情報が曖昧化する」だのといった働きがあるとは思われない。 実際、LeNet-5 を使って数値的に検証してみると、そのような処理は行われていないことを容易に確認できる。 このあたりについて東北大学の田中が簡潔なメモ ( 1, 2, 3 ) を公開しているので、興味がある人は読まれるとよい。

何を言いたいかというと、他人の言うことを鵜呑みにせず自分の頭で考え理解する、という基本的なことを できていない者が、この分野には少なくない、ということである。


2024/04/24 修正

昨日の記事の一部に表現の不正確な部分があったため、修正した。


2024/04/23 不動産投資 (2)

結局のところ、不動産投資の是非は次のような簡単な計算で評価すればよい。

(一年あたりの収益期待値) = (期待される一年あたりの家賃収入) - (利息その他の必要経費) - (一年あたりの不動産価値の下落額)

なお、家賃収入は物件が古くなるにつれて安くなるであろうこと、空室リスクがあること、 必要経費には経年劣化に伴う修繕費などの他に登記費用などの初期費用も含まれることに注意を要する。

投資を勧誘する業者は、この簡単な式で評価すると赤字になってしまうので、この式を必死に否定し、 減価償却云々を持ち出して「書類上は赤字にするが、実際に支出するわけではない」などと詭弁を弄するのである。 念のために説明しておくが、減価償却費というのは、資産の価値が年々低下していく分について 「毎年、少しずつ損失を出している」として経理上処理する項目のことである。 たとえば 1000 万円で買ったマンションを 25 年で償却するとすれば、毎年 40 万円支出している扱いにするのである。

仮に実際の市場価値の低下が年 30 万円であり、 一方、家賃収入からローンの利息その他諸経費を除いた残りが年 30 万円であったとしよう。 ふつうに考えれば、資産の減少分と収入が同額であるから、損得なし、ということになる。 しかし市場価格の低下は客観的評価が難しいので、税務上は、これを減価償却費として取り扱う。 前述のように減価償却費 40 万円を計上した場合、税務上は 30 万円の収入に対し 40 万円の損失を出しているのだから、 マンション経営全体では 10 万円だけ「帳簿上の損失」が生じていることになる。 つまり帳簿上、所得が 10 万円少なく評価される。 仮に所得税率が 20% であるならば、毎年 2 万円だけ税金が安くなるので、確定申告することで、その分が還付される。 これを利用して、勧誘業者は、不動産投資で利益が出るかのようにみせかけるのである。

むろん、これは正しくない。 上述の例について、たとえば 10 年後に 700 万円でマンションを売却したとしよう。 このとき、経理上は 600 万円の価値しかない物件を 700 万円で売却したのであるから、 100 万円の所得があった、ということになる。 所得税が 20% であるとすれば、20 万円の所得税が課されるので、先に得た毎年 2 万円の「得」は帳消しになる。 むしろ、売却した年にまとまった収益があることで、累進課税の具合によっては、税率が上がって損になる恐れもある。

あたりまえのことだが、上述の式でキチンと利益が出るなら、 そのようなビジネスを私や諸君に紹介するのではなく、彼ら自身が実践すればよいのである。 あるいは、銀行は我々に貸し付けるのではなく、不動産部門の子会社で運用すればよいのである。 それをしないということは、つまり、そういうことなのである。

繰り返しになるが、ローンを組んでまでマンション経営することの利点は「脱税がバレにくい」という点にしかない。


2024/04/22 不動産投資 (1)

不動産投資の話をしておこう。 世の中には、小金を持っていそうな相手に対して不動産投資をもちかける業者がいる。 私のところにも、最近はようやく減ったが、以前は頻繁にそうした業者からの営業電話がかかってきた。 私は実際には対した資産を持っていないのだが、医師ではあるから、 その種の名簿屋から入手した情報に基づいて営業電話をかけてきたものと思われる。 私は、そのような資産運用に全く興味がなかったのだが、 一体、どういうビジネスモデルを彼らが提案するのかという点にだけは興味があったので、 時間のあるときには彼らの営業トークにつきあっていた。 念のために述べておくが、私は常に電話の冒頭で「興味ございません」と言って断わっている。 断わっているにもかかわらず、彼らが強引に営業トークを展開するのである。 つまり、私が悪戯で彼らの時間を浪費させているわけではない。

その種の不動産投資業者の勧誘内容は、だいたい共通しており、以下のような具合である。 少ない頭金で、銀行のローンを活用し、基本的にはワンルームマンションを購入する。 それを賃貸に出すことで家賃収入を得ることができ、それをローンの返済に当てる。 家賃収入がローン返済額よりも月 2,000 円程度高いモデルを示す業者もいるが、 たいていは、家賃収入よりはローン返済額のほうが高い。 しかしマンション経営をすることで、ローンの利息や、マンションの減価償却費、その他 経営に必要な経費を考慮することで書類上赤字にすれば、確定申告で税金の一部が戻ってくる。 これにより正味では利益が出る、というような説明をする業者もいるが、 そうではなく将来の年金のようなものとして考えていただきたい、というような説明をする業者もいる。

だいたい彼らの説明は曖昧で漠然としており、理解しがたい。 法律や経済に詳しくない人のために後述するが、減価償却費やら何やらで「書類上赤字」になっているなら、 実際に赤字になっているはずであって、全体として利益を得られるはずはない。 マンション投資などせず、全額をを銀行に預けておく方がマシなはずなのである。 だから彼らの説明は何かが嘘なのであるが、どこが嘘であるのかは、なかなか掴めなかった。 そこで粘り強く、何回も彼らと話をして、ようやく、彼らの提示するビジネスモデルを理解することができた。

要するに脱税なのである。 たとえば諸君が大阪にマンションを買ったとする。 また、あるとき、たとえば京都や大阪に遊びに行ったとする。 ここで、実際には単に遊びに行っただけであったとしても、 これを大阪の不動産業者との商談だったことにして、交通費を経費計上して確定申告するのである。 むろん、本来であれば実際に商談していない交通費は経費として認められないのだが、 税務署も忙しいから、そのような細かい点をイチイチ調べないらしい。 そのようにして、細かな経費を計上すれば、もともと高額の所得税を納めている人の場合、 「節税」することによって正味の利益を得ることができるのである。

このシステムをようやく理解した私は、電話をかけてきた業者に 「実際には使っていない経費を、使ったことにして確定申告するのは、違法な脱税ですよね?」と非難した。 すると、相手は「いえ、キチンと認められています。大丈夫です。」と強弁した。 脱税をそそのかしておきながら、ずいぶんとフテブテしい奴である。 そこで私は「私が税務署職員や検察官であったとしても、同じことを言うのですか」と問うてみた。 すると、相手は「ええ、キチンと認められていますから」などと言う。 私は「あ、言っちゃうんだ」と思わず漏らし、困惑した。 そして相手は脱税が合法であると主張し続けるので、とうとう私は 「それは違法であって、認められていませんからね!」と語気を強めた。 すると、とうとう相手は「あ。。。じゃぁ、この話、やめましょうか。」と言ったので、 「ええ、やめましょう」と言って電話を切った。


2024/04/19 多層パーセプトロンモデル (2)

昨日の話の続きである。 多層パーセプトロンモデルは、英語では MultiLayer Perceptron であり、MLP と略されることが多い。 各々のパーセプトロンが別の複数のパーセプトロンから入力を受け、 また別の複数のパーセプトロンに出力を提供する姿を「神経回路の構造に類似している」などと表現されることもある。 このような「神経回路に似ている」計算モデルを「ニューラルネットワーク」と呼ぶこともあるが、 適切な表現ではなかろう。 本当の神経細胞内における興奮の伝導は、いわゆる全か無かの法則に従っていると信じられている。 また入力部分については複数のシナプスから非線形で複雑な制御を受けている。 いわゆるニューラルネットワークは、本当の神経細胞に比べると、非常に単純な態様で情報を処理しているのである。

それはさておき、多層パーセプトロンモデルでは、入力される値の相互関係は考慮されない。 黒地に白い数字が書かれているい画像の例で考えよう。 各ピクセルは、0 から 255 の範囲の数値によって「白さ」が表現されているものとし、0 を黒、255 を完全な白、とする。 多層パーセプトロンモデルでは、あるピクセルの値と、隣のピクセルの値の相関は考慮されない。 その上で、各ピクセルの値と書かれている数字との相関を学習する。 たとえば「『3』と書かれている場合には、座標 (5, 20) のピクセルは白であることが多い」といった具合である。 ノードの数が多い複雑な多層パーセプトロンモデルになると、この学習内容も複雑になり 「『3』と書かれている場合には、座標 (5, 20) の値と座標 (3, 8) の値を足したものから 座標 (9, 12) の値を 3 倍したものを引いたら小さな値であることが多い」といった具合になってくる。 ともあれ、各座標の値を何倍かして足したり引いたりした結果をみて、書かれている数字との相関を「学習」するのである。

問題なのは、この「座標」を多層パーセプトロンモデルでは位置として扱っておらず、 単なる通し番号、識別のための記号としてしか取り扱っていない点である。 たとえば、座標 (3, 5), (3, 6), (3, 7), (3, 8) がいずれも白であるならば、人間の感覚からすれば これは直線 (正確にいえば線分) のようにみえるであろう。 しかし多層パーセプトロンモデルでは、これらが互いに隣接する点であるという情報を用いず、 単に異なる 4 個の点が白い、というだけの情報として処理を行う。 図形としての認識を行っていないのである。

その結果、何が起こるか。 たとえば「6」と書かれた画像があったとしよう。 この画像を 1 ピクセルだけ右に平行移動させたとする。 人間の眼では、両者はほとんど同じ画像にみえるだろうし、いずれも「6」と判読できるに違いない。 ところが多層パーセプトロンモデルの観点では、この平行移動により 「これまで白かったピクセルが黒くなった」「これまで黒かったピクセルが白くなった」という変化が 多数生じるため、「かなり違う画像になった」と認識することになる。

要約すると、多層パーセプションモデルは、画像のどのあたりが白くてどのあたりが黒いか、という情報だけを 用いており、図形としての認識を欠いている。 このため、単純な多層パーセプションモデルでは、画像に回転や平行移動などの変形が加わると 全く別の画像と認識してしまい、両者の異同を判断することができない。


2024/04/18 多層パーセプトロンモデル (1)

医学の話は保留して、深層学習の話をしよう。 インターネット上には深層学習について「わかりやすく」解説した文書が多数公開されているが、 それらの著者が、いったい、どれほど正しく理解した上で記載しているのかは疑わしい。 おそらく、表面的な使い方だけを習得して、内容は他人が書いた文章を受け売りしている者が多いのではないか。 というのも、本当に理解しようとすれば当然に湧くであろう疑問に対して言及していない例が非常に多いのである。 そのような浅い理解で適切に扱えるほど深層学習は簡単なものではない。

多層パーセプトロンモデルについては 東海林智也氏による解説 が簡潔で明快である。 ただし、東海林氏の解説は数学が苦手な人には難解であろうから、私が補足しよう。

まず前提として、このモデルへの入力は有限個の数値として与えられているものとする。 1 個の数値は「入力層 input layer」において 1 個の「パーセプトロン」に入力される。 パーセプトロンは「ノード」などと呼ばれることもある。 「層」というのは、いくつかのパーセプトロンを集めたもののことである。 入力層の各パーセプトロンは、入力された値を a 倍して b を 加える、という操作を行い、出力する。 a や b の値は任意であるが、これらをうまい具合に調整する作業を「学習」と呼んでいる。

入力層の次には何層かの「隠れ層 hidden layer」が置かれる。 層の数はいくつでも構わないし、各層に含まれるパーセプトロンの数も任意である。 通常、隠れ層の全てのパーセプトロンは、直前の層に含まれる全てのパーセプトロンの出力を 入力として受け取る。 たとえば、入力層に 128 個、最初の隠れ層に 512 個のパーセプトロンが含まれているとすれば、 入力層のパーセプトロンは各々 512 個の隠れ層パーセプトロンに出力を送るし、 また隠れ層の各パーセプトロンは入力層から 128 個の入力を受け取ることになる。 そして隠れ層パーセプトロンは、それらの入力に対して線型な計算を行い、出力する。 線型というのは、各入力値を何倍かして、さらに定数を加える、という意味である。 この「何倍か」というのは、入力ごとに異なる。 すなわち、あるパーセプトロンから受けた入力は 3 倍し、 別のパーセプトロンから受けた入力は 0.1 倍する、といった具合である。 繰り返すが、この「何倍するか」の値を調整するのが「学習」である。

なお、各々のパーセプトロンが前段の全てのパーセプトロンから入力を受け取る状態にあるものを「全結合層」と呼ぶ。 多層パーセプトロンモデルは全ての層が全結合層であるのが通常であるが、本質的には、これは必須ではないだろう。 ただし、全結合層にしないことに利点があるとは思われない。

隠れ層を何層か経たのちに、「出力層 output layer」が置かれる。 出力層に含まれるパーセプトロンの数は、そのモデルで何をしたいかによって決まる。 たとえば 0 から 9 までの数字、つまり 10 通りのパターンを判別したいのであれば、 出力層には 10 個のパーセプトロンを含めるのがわかりやすい。 「3」と書かれた画像を入力した時には 3 番目のパーセプトロンが大きな値を出力し、 他のパーセプトロンは小さな値を出力する、といった具合に学習できれば便利である。 何が書かれているかわからない画像を入力し、仮に 8 番目のパーセプトロンが大きな値を出力すれば、 書かれていた数字は「8」であろう、と推定できよう。 問題は、そのような学習がはたして可能なのか、という点である。

長くなってきたので、続きは次回にしよう。


2024/04/16 PyTorch 2.4 on NetBSD 10.0

研究上、深層学習 (deep learning) の技術を習得する必要が生じた。 これはデータ処理上、時として有力な手法であるが、しばしば処理内容が black box 化するので、 扱いには慎重になるべきであろう。 世間では「人工知能 (artificial intelligence; AI)」として近年もてはやされている技術と密接な関係にある。 ただし何をもって「人工知能」と呼ぶかは曖昧であるし、現在の機械学習による情報処理は あくまでパターン認識に過ぎず、知能と呼べる代物ではない。 それにもかかわらず、これを知能として宣伝する専門家も多く、 また、素人の中には機械が知能を持って考え始めたかのように錯覚している人もいるようである。

それはさておき、深層学習を学ぶ環境として PyTorch が便利である。 これを使った入門メモを Uta 氏が 書いているので、これに倣って深層学習に触れてみよう。

と、思ったのだが、PyTorch が公式にサポートしているのは Linux, Windows, MacOS のみであり、 私が使っている NetBSD はサポート外である。 NetBSD の pkgsrc にも PyTorch は含まれていないようである。 しかしソースをみる限りでは、なんだか NetBSD でも動きそうな気がする。 そこで、公式サイトの手引きに従って、Linux でソースからビルドするのと同じ要領でインストールを試みた。

環境変数に "CFLAGS=-D__NetBSD__" を加えることで、PyTorch に含まれる一部のプログラムは NetBSD に対応されるようなので、これを設定しておく。 無論、それでも多量のエラーが吐かれるので、適宜パッチを作成した。 もし私と同じようなことをしようとしている人がいたら、参考になるかもしれないので、 一応、そのパッチをここに置いておこう。 ただし、私は PyTorch や NetBSD を知り尽くした上でパッチを作成したわけではないので、 これが適切に動くかどうかは、知らぬ。 特に Scalar_test.cpp に対しては、よくわからないのでエラーを吐く場所をコメントアウトする、 という乱暴な対処を行ったので、どこかで不具合が生じそうな気がする。

以下は 2024.04.17 追記

昨日アップロードしたパッチでは、実行時に "operating system is not supported in cpuinfo" というエラーが不必要に表示される。 動作には問題ないのだが、邪魔なので、このエラーメッセージを表示しないように修正してパッチを更新した。 なお torchvision は import 時に "operator torchvision::nms does not exist" のエラーが出て使えない。 これを修正するだけの気力がないので、とりあえずは空いている PC に Debian 12.5 (Linux) をインストールして 計算サーバーとして、手元の NetBSD から ssh 経由で使うことにする。


2024/04/15 イラン情勢

医学や北陸医大時代の思い出を書きたいところであるが、中東情勢が緊迫しているので、本日はそちらの話をしよう。

朝日新聞などの報道によると 4 月 13 日夜から 14 日未明にかけて、イランがイスラエルに対しミサイル等を用いた攻撃を行ったらしい。 イスラエル軍が迎撃し、実際にはほとんど損害は出なかったようである。 これに対し 日本の内閣総理大臣が「こうしたエスカレーションを強く非難する」と述べたり EU 諸国も非難声明を出すなど 少なくともいわゆる西側諸国では、イランを責める意見が主流のようである。

まるでイランが紛争を煽っているかのような論調であるが、それはあまりに不公正な批判である。 イランの在シリア大使館を攻撃することによって挑発したのはイスラエルである。 それに対してはほとんど非難もせず黙認しておきながら、イランによる反撃には猛反発する西側諸国の態度は、 厚顔無恥である。 非難するならば、双方を等しく非難し、相互の自制を求めるべきである。

以前にも書いたが、イスラエル軍によるパレスチナ自治区侵攻についても同様の偏った批判が日本では目立つ。 ハマスによるイスラエルへの攻撃に端を発する紛争、などとする論説がみられるが、 それはイスラエルが建国を宣言して以来、継続的に行ってきたパレスチナ弾圧の歴史を無視した不正な批判である。 ハマスがイスラエルで民間人に対する虐殺や性犯罪を行った、として激しく批判する人もいる。 おそらく、そうした犯罪があったのは事実であろうし、それは非難されるべきであるが、 一方で、どうしてイスラエルがパレスチナ人に対して行う虐殺や性犯罪は問題にしないのか。 どうして諸君は、イスラエル人を自分達と同格の人間として扱う一方で、 パレスチナ人を野蛮で獰猛な獣であるかのように扱うのか。 どうして諸君は、かつてスペイン人やポルトガル人が世界中で行った非道な振舞いを真似しようとするのか。


2024/04/10 NetBSD 10.0 インストールメモ

新年度に入り、新しい環境にも慣れつつある。 大学で使うコンピューターに NetBSD 10.0 をインストールしたので、備忘録としてメモを残しておこう。 なお、このコンピューターは私物ではなく備品である。 既にインストールされていた Windows を削除するのは憚られるので、NetBSD は私物の外付 SSD にインストールし、 BIOS 設定でこの外付 SSD をブート順位筆頭にした。 SSD が刺さっていれば NetBSD が起動し、 SSD を外してから電源を入れれば元の Windows が起動する、という寸法である。

NetBSD というのは、いわゆる Unix 系 OS の一つである。 コンピューターに馴染みのない人は、近年一部で流行している Linux の仲間だと思っておけばよい。 NetBSD は Linux などに比べると、昔の Unix の面影を残した OS であるように思われる。 Unix 系の OS は、カスタマイズがしやすく、慣れるとたいへん便利である。 とはいえ初心者には扱いにくいので、Windows や Macintosh などのグラフィカルな OS に慣れて育った人は、 NetBSD のようなマニアックな OS を使う前に Linux などで Unix 系の環境に馴染む方がよいだろう。

以前は環境依存のエラーなどのために NetBSD のインストールや初期設定がなかなかうまくいかず、苦労したものである。 今回も手元にあった古いノート PC へのインストールは困難で断念したが、デスクトップへのインストールは容易であった。 まず DVD から full install を行い、その後 pkg_add で以下の基本的なソフトウェアをインストールした。

zsh, vim, skk-jisyo, ibus-skk, fvwm3, ja-sazanami-ttf, wget, firefox115, firefox115-l10n, texlive-collection-langjapanese

各種設定ファイルは以前の環境から持ってくればよいのだが、今回は北陸医大で使っていたノート PC の故障などが あったため、一から書き直した。具体的には、以下のファイルを新しく用意した。 TeX 関係は未設定である。

.vimrc, zshrc, xinitrc, .fvwm/config

FVWM はカスタマイズの幅が非常に広いウィンドウマネージャーであり、自分に合った適切な設定を行えば 非常に快適なデスクトップ環境が手に入る。 私が採用した設定の要点だけ書いておこう。 まず Alt + F5 で日本語表示可能な xterm を呼ぶために

DestroyFunc StartTerminal
AddToFunc StartTerminal
+ I GotoPage 0
+ I Exec exec xterm -rv -fs 12 -fa "Sazanami Mincho" -geometry 118x26
+ I Wait xterm
+ I Next (xterm) Focus

Key F5 A C StartTerminal

とした。私は、デュアルモニタ環境において、一方のモニタにターミナルを 複数並べて主たる操作を行い、 もう一方のモニタにブラウザなどを表示する、という格好で作業することが多い。 そこで Alt + F6 で Firefox をセカンドモニタに表示するために、以下のようにした。 もっと適した設定方法もありそうな気がするが、じっくり改良することにしよう。

DestroyFunc StartFirefox
AddToFunc StartFirefox
+ I Exec exec firefox115
+ I Wait "Mozilla Firefox"
+ I Next ("Mozilla Firefox") Focus
+ I Next ("Mozilla Firefox") Move 100 0
+ I Next ("Mozilla Firefox") Maximize

Silent Key F6 A C StartFirefox


Home
Copyright (c) Francesco
Valid HTML 4.01 Transitional