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


2019-06-24

東京都港区でスケートボードに乗っていたら警察に「パーク内だけで乗ってください」と注意を受けたことに疑問を呈する

浜松町の日曜日の夜10時ごろ、うどんを食べに行こうと思い、ペニーボード で歩道をクルージングしていたところ、同じ歩道を後ろから自転車に乗ってきた警察官に「ボードは囲われたパークしか乗ってはいけません。降りてください。」と注意を受けました。警官は注意を終えるとしたり顔ですぐさま去ってしまいましたが、この一件について疑問に思うところが多いです。間違ったことを言った警官には、謝罪をしていただくか、説明責任を果たしてほしいです。そのような、制服の威を借り、一方的に力を振りかざす警官を制止し粛清するようなシステムが乏しいということは、市民の脅威です。

- オフィス街の日曜日の夜で、目抜き通りでもなく、駅前でもない。歩道も車道も交通量が少なかった
- スケートボードは「交通量の多くない場所で乗ること」と道交法には記載がある
- スケートボードをパーク内に制限するような条例は東京都にも港区にもなく、道交法に従う (参考資料)
- 注意をした警官は自転車用レーンがあるにも関わらず歩道を走っていた
- スケートボードでは、トリックを決めたり、高速でクルージングしていたわけでもなく、むしろうどん屋が閉店していたことで行き場を失くして徐行していた


近年、スケートボードの迷惑行為で書類送検にあった事件では、渋谷センター街や栄の交通量の多いところで迷惑行為をしていたことが問題となってきました。今回のケースとは違うものであり、ましてパーク内に制限されるというのもおかしな話です。


参考資料
スケートボード利用についての区の対応・考え方について


注意を受けた場所は写真右側(Google Map)。車道の両端には自転車レーンがあるのがわかる。

2019-06-23

Microsoft Excel for Mac (Office 365) でPDF保存時にセルの枠線を消す。

Page Layout -> Print titles -> Page setupからGridlinesのチェックボックスを外せばよいです(ViewのGuidelinesのチェックボックスを外してもPDF保存時には適用されないです)。こんなことですが一時間ほどハマりました。

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

持ち込み商品の反対意見について反反論がある。持ち込み商品については、それはマナー違反だからと言う人が多い。商品を持ち込んでいる客がいると、注意したところでバイト代の上がらないバイト、給料の上がらない正社員は注意をし、さらに周りの客でも注意をする人がいる。彼らにその理由を聞くと、「...