2019-07-26

公衆浴場の照明の明るさについて

公衆浴場の照明や明るさについての規定が気になったので調べてみました。

明治時代より前、公衆浴場には、石榴口というものがありました。そこは高さ90cmのところにあり、人々はその石榴口をくぐって通っていました。その石榴口は浴室のお湯をさまさないようにするために設置されていました。その頃の銭湯は、湯気抜きがなかったので、湯気がたまり、外の光が差し込んでも薄暗かったようです。また、お湯に浸かってから体を洗う風習があったため、風呂の水はだいぶ汚れていたようです。浴室の薄暗さも、水の汚れをごまかすのには都合がよかったようです。

現在では、下記のようにして厚生労働省が照明について指定してありますが、これは単純に暗いと危ないからで、水質については、水質検査や水の入れ替え、掃除の義務によって担保しているのでしょう。





2019-07-24

アルカリ温泉に炭酸泉を注入している人工温泉について疑問があったので問い合わせた

ときどき、天然アルカリ温泉に炭酸を注入している温浴施設を見かけ、そのたび疑問に思っていた。通常、炭酸泉は弱酸性になるのだが、アルカリ温泉にどれだけ注入するんどろうか、と。飽和させるまで注入するなら、pHも弱酸性に傾くだろうし、けっこうな量が必要になるのではないか。また、アルカリ温泉が皮膚表面のペプチド結合を分解することで発生する特有のぬるぬる感は犠牲になるのではないか、と。

多くの温浴施設の炭酸泉を施工しているカルボリッチ社に電話で問い合わせて訪ねたところ、

- pH~8ぐらいの弱アルカリであれば対応している。炭酸を注入することでpH~5ほどの弱酸性に下げる。
- アルカリ温泉のぬるぬる感は消える
- 中性の水に炭酸を注入するときと比べて、そこまで使用量が増えるわけでもない。

とのことでした。疑問はすべて解決しました。

このあたりの理論計算が気になりますね!


参考
温泉の化学
http://www.asahi-net.or.jp/~ue3t-cb/bbs/special/sience_of_hotspring/sience_of_hotspring_5-5-1.htm

2019-07-07

飲食店への商品持ち込みを批判する人への反論

持ち込み商品の反対意見について反反論がある。持ち込み商品については、それはマナー違反だからと言う人が多い。商品を持ち込んでいる客がいると、注意したところでバイト代の上がらないバイト、給料の上がらない正社員は注意をし、さらに周りの客でも注意をする人がいる。彼らにその理由を聞くと、「ルールだから。」、「お店の食べ物や飲み物にお金を払わないと、お店の売上が上がらないから。」、「持ち込み商品で食中毒になった場合、お店に責任追及されうるから。」、「居酒屋の代金は席代ではなく、内装や家賃や材料費や人件費に対するものだから。」といった答えが返ってくる。このことについて少し考えたい。

念の為言っておくと、私は日頃持ち込まないが(いちいち飲食物を持ち歩いていない)、先日、飲み会のラストオーダー後に居酒屋でカバンに入っていたナッツを開封して食べていたら、店員や客の中に怒る人がいたので、疑問に思った次第である。また、あと一口で飲み終わるビールや飲み物を店内に持ち込んで、残りを店内で飲み、もしくは最後の数口を飲み終わり、店員に捨ててもらうこともこれまであったが、これはマナー違反にあたるのであろうか。申し訳なさそうに飲み終わればマナーを守ったことになるのだろうか。

私が批判を受けたときのように、ラストオーダーが終わって残り30分間で退店しないといけない居酒屋で、コンビニから持ってきたお菓子を食べたらどうなるのだろうか?喉が乾いた人がペットボトルの水をカバンから取り出して開封して飲むのはいけないのか?すでに注文はできないし、頼まなくとも退店時間までいるとし、持ち込み商品は衛生面で問題がないなら(その確証を店側が持つことは困難だが)、さきほどの反論のほとんどは通用しない。

ここで、さらに別の質問を考える。「赤ちゃんがいる場合の離乳食、哺乳瓶の持ち込み」は許されるのだろうか?これは許されるという人が大半であり、飲食店サイドも、子供向けのお皿やスプーンを用意する。では、大人の持ち込みと赤ちゃんの持ち込みは何が違ってくるのだろう。

また、「アレルギー対応食をお願いしたが断られた場合」も同様である。入った店で「アレルギーなのでそばとは別の窯でうどんを茹でてほしい」と頼み、断られた場合、持ち込みはいけないのだろうか。一人で入店したなら退店すればよいが、たとえば60人で入店した場合、その一人はどうなるだろうか――ただし、これは若干想定しづらい思考実験であるが。

さて、飲食店への持ち込み禁止について、もっとも説得力のある判例は、以下の事件ではなかろうか。


2016年12月23日に茨城県の飲食店で、常連客が自宅で調理し持ち込んだクマ肉のローストに旋毛虫という寄生虫が付着しており、これが原因で食べた人に発熱や発疹の症状が出るという事件がありニュースになっていました。このケースで、保健所はその飲食店を営業停止処分にしています。(http://inshokujuku.jp/howto_mochikomi/)


この事件は、持ち込み禁止にする説得力はある。

法的に見ても、持ち込みは違法ではないし、一部の店舗では持ち込みを許可しているが、持ち込みを禁止することも適法であると言える。ただ、だいたいの場合はケースバイケースであり、場合によっては不法退去罪や、損害賠償もありうるだろう。そして、飲食物の持ち込みを批判する人のうちで、ここまで考えて批判している人もなかなかいないのだろう。

U字型の歯ブラシっていいんですか?

こういったプロダクトって実際のところどうなのでしょうか?
https://www.amazon.co.jp/dp/B07Q4P1T21
https://www.amazon.com/dp/B07F9JP75T


2019-07-04

matplotlibでsubplotsとimshowを組み合わせた場合に、axの余白を消す方法

import matplotlib.pyplot as plt

ax = [plt.subplot(2,2,i+1) for i in range(4)]

for a in ax:
    a.set_xticklabels([])
    a.set_yticklabels([])
    a.set_aspect('equal')

plt.subplots_adjust(wspace=0, hspace=0)
equalは画像サイズにaxを合わせるパラメータ。ほかにautoがあり、autoの場合は画像が拡大縮小されてaxのサイズに合う。equalのとき、水平方向の余白が簡単に消せない。


そこで、
plt.subplots_adjust(wspace=0, hspace=0)
とあるところを、
fig.subplots_adjust(wspace=0, hspace=0)
としてやるとよい。
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(8,8)) # Notice the equal aspect ratio
ax = [fig.add_subplot(2,2,i+1) for i in range(4)]

for a in ax:
    a.set_xticklabels([])
    a.set_yticklabels([])
    a.set_aspect('equal')

fig.subplots_adjust(wspace=0, hspace=0)


参考文献
https://matplotlib.org/2.1.0/api/_as_gen/matplotlib.pyplot.imshow.html
https://stackoverflow.com/questions/20057260/how-to-remove-gaps-between-subplots-in-matplotlib

2019-07-03

Matplotlibの描画を指定ピクセルで保存する際に余白を消す

今回やりたかったこと、
以下の画像のように、顔画像にランドマークをつける。サイズ変更なし。




ランドマークの検出にはこちらを用いた。


検出されたランドマークのポイントを折れ線でつなげる必要があったが、折れ線はmatplotlibのfigureを使うのが手軽である。しかし、matplotlibのfigureを保存する際には、余白が伴う。余白を消すには、この行が必要であった。


plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, 
            hspace = 0, wspace = 0)


以下に全ソースコードを載せた。


import collections

import imageio
import matplotlib as mpl
import matplotlib.pyplot as plt
from skimage import io
import numpy as np

import face_alignment

fa = face_alignment.FaceAlignment(face_alignment.LandmarksType._3D, device='cpu', flip_input=True)

try:
    input_img = io.imread('../test/assets/aflw-test.jpg')
except FileNotFoundError:
    input_img = io.imread('test/assets/aflw-test.jpg')
print('INPUT', input_img.shape)  # (450, 450, 3)
preds = fa.get_landmarks(input_img)[-1]

# 2D-Plot
plot_style = dict(marker='None',
                  markersize=4,
                  linestyle='-',
                  lw=2)

pred_type = collections.namedtuple('prediction_type', ['slice', 'color'])
pred_types = {'face': pred_type(slice(0, 17), (0.682, 0.780, 0.909, 0.5)),
              'eyebrow1': pred_type(slice(17, 22), (1.0, 0.498, 0.055, 0.4)),
              'eyebrow2': pred_type(slice(22, 27), (1.0, 0.498, 0.055, 0.4)),
              'nose': pred_type(slice(27, 31), (0.345, 0.239, 0.443, 0.4)),
              'nostril': pred_type(slice(31, 36), (0.345, 0.239, 0.443, 0.4)),
              'eye1': pred_type(slice(36, 42), (0.596, 0.875, 0.541, 0.3)),
              'eye2': pred_type(slice(42, 48), (0.596, 0.875, 0.541, 0.3)),
              'lips': pred_type(slice(48, 60), (0.596, 0.875, 0.541, 0.3)),
              'teeth': pred_type(slice(60, 68), (0.596, 0.875, 0.541, 0.4))
              }
fig, ax = plt.subplots(facecolor='w', figsize=(4.50, 4.50), dpi=100, frameon=False)  # (450, 450) pixels
fig.tight_layout(pad=0)
ax.imshow(np.ones(shape=input_img.shape)) # Without filling in white, drawn image is enlarged and upside-down
#ax.imshow(input_img)

for pred_type in pred_types.values():
    ax.plot(preds[pred_type.slice, 0],
            preds[pred_type.slice, 1],
            color=pred_type.color, **plot_style)

ax.axis('off')
plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, 
            hspace = 0, wspace = 0)
#plt.margins(0,0)
#plt.gca().xaxis.set_major_locator(mpl.ticker.NullLocator())
#plt.gca().yaxis.set_major_locator(mpl.ticker.NullLocator())

# Save figure
plt.savefig('land.jpg', dpi=100, pad_inches=0)

# Translate figure into array and save it
fig.canvas.draw()
X = np.array(fig.canvas.renderer._renderer)[:,:,:-1]
print(X.shape)
imageio.imwrite('canfas.jpg', X)

2019-07-02

How far are we from solving the 2D & 3D Face Alignment problem? (and a dataset of 230,000 3D facial landmarks) についてランドマークとクラスの対応調べ

How far are we from solving the 2D & 3D Face Alignment problem?
という論文を筆者が公開していたが、そのランドマークとクラス(目や口)の対応が不明だったので調べた。デフォルトでSFDを使っているらしいが、SFDの論文を調べても対応がわからなかった。
そこで、pythonによる実装を実際に試して調べた。


fa = face_alignment.FaceAlignment(face_alignment.LandmarksType._2D, flip_input=False)
preds = fa.get_landmarks(image_or_path)


で返されるarrayについて、
predsは検出された顔の数のサイズのarray。今回はモナリザの画像を使って試した。
preds[0]は68個のランドマークの座標を持つ。


0-16: 顎のライン
17-21: 右眉 (こちらから見て左)
22-26: 左眉 (こちらから見て右)
27-35: 鼻
36-41: 右目 (こちらから見て左)
42-47: 左目 (こちらから見て右)
48-59: 口の周辺
60-67: 口の内側






from skimage import io
from PIL import Image
import numpy as np
import face_alignment
from matplotlib import pyplot as plt

fa = face_alignment.FaceAlignment(face_alignment.LandmarksType._2D, flip_input=False, device='cpu')

input = io.imread('mona.jpg')
preds = fa.get_landmarks(input)

fig, ax = plt.subplots(figsize=(8,6), dpi=80, facecolor='w')
fig.tight_layout()
plt.gca().set_aspect('equal', adjustable='box')
ax.scatter(preds[0][:, 0], 270-preds[0][:, 1])
ax.scatter([0, 210, 0, 210], [0, 0, 270, 270], c='w')
for ix, (w, h) in enumerate(preds[0]):
    w, h = int(w), int(h)
    ax.annotate(str(ix), (w, 270-h))
plt.show()



追記
examples/detect_landmarks_in_image.py のソースコード中に答えがありました。

pred_types = {'face': pred_type(slice(0, 17), (0.682, 0.780, 0.909, 0.5)),
              'eyebrow1': pred_type(slice(17, 22), (1.0, 0.498, 0.055, 0.4)),
              'eyebrow2': pred_type(slice(22, 27), (1.0, 0.498, 0.055, 0.4)),
              'nose': pred_type(slice(27, 31), (0.345, 0.239, 0.443, 0.4)),
              'nostril': pred_type(slice(31, 36), (0.345, 0.239, 0.443, 0.4)),
              'eye1': pred_type(slice(36, 42), (0.596, 0.875, 0.541, 0.3)),
              'eye2': pred_type(slice(42, 48), (0.596, 0.875, 0.541, 0.3)),
              'lips': pred_type(slice(48, 60), (0.596, 0.875, 0.541, 0.3)),
              'teeth': pred_type(slice(60, 68), (0.596, 0.875, 0.541, 0.4))
              }


食事制限のためのサラダチキンといきなりステーキ

値段とタンパク質について、セブンイレブンのサラダチキン(プレーン)といきなりステーキのワイルドステーキ300gを、それぞれ100gあたりで比較した。 サラダチキン, 185円, 21.7g ステーキ, 820円, 22.97g 値段の大きな違いのわりにタンパク質には大き...