2016年12月アーカイブ

自家製アプコン

| コメント(0) | トラックバック(0)

通称アプコン、アップスキャンコンバーター。

DVD 時代の画像は SD、今はハイビジョン。まぁ単純に解像度が違います。そして、DVD 時代の作品には名作が多い!今が少ないかどうかは別にして・・・・

で、まぁ DVD で出てた作品がBDで出るものもぽつぽつ増えてきたんですが、自前でなんとかならんの?とおもってたら、やってらっしゃる方が!

よっし、私もやってみよ。ってことで試してみました。

元画像がこれ

img1236_org.jpgそして、これを拡大したのがこれ

img1236_up.jpgサムネイルだけでは良くわからんと思うので、拡大してみてみてください。ほんとうに綺麗に拡大されてます。神奈様の後ろに立ち上ってる雲のディテールを比べてみてください。もともと大きい画像があったのを縮小したんですよ。と言われて納得できる画質です。まぁ、そういうコンセプトで作られたソフトなんですけどね。

で、これを動画として再構築したのがこのサンプル

名作、京アニの AIR のエンディングの1シーン、羽を生やした神奈様が大空を飛んでいくシーンで、当時は度肝を抜かれるものすごい綺麗な映像でした。そのシーンをアップスキャンコンバートしたものです。皆さん、この作品は DVD 持ってますよね?見比べてみてください。

これを作るための大まかな流れとしてはこんな感じ

  1. 動画をフレームごとに静止画に分解する。このとき、インターレス解除を忘れずに
  2. waifu2x というツールを使って、全静止画を縦横2倍に拡大する
  3. 拡大した画像を MotionMPEG として動画に再構成する
  4. とりまわしが良いように、H264 でエンコードする

とまぁ、この辺の内容も先の unsuitan さんの日記と同じです。

何が違うか?

  • オンプレの FreeBSD でやった
  • waifu2x でノイズ除去をかけないようにした

まず、FreeBSD でこれをやるには?
Ports から multimedia/ffmpeg と、graphics/waifu2x-converter-cpp をインストールします。
環境構築としてはこれだけ。

あとは、Shell でゴリゴリやります。

# mkdir jpg

# mkdir upconv

# ffmpeg -i AIR.mkv -acodec copy -map 0:1 AIR.ogg

# ffmpeg -i AIR.mkv -f ffmetadata AIR_meta.txt

# ffmpeg -i AIR.mkv -deinterlace -f image2 -qscale 0 jpg/img%05d.jpg

# cd jpg

# ls > ../list.txt

# cd ..

# foreach i ( `cat list.txt` )

foreach? waifu2x-converter-cpp -m scale -i jpg/$i -o upconv/$i

foreach? end

# ffmpeg -r 29.97 -i upconv/img%05d.jpg -i AIR.ogg -vcodec mjpeg -qscale 0 -acodec copy AIR_up.avi

# ffmpeg -i AIR_up.avi -i AIR_meta.txt -map_metadata 1 -codec copy AIR_up_meta.avi

# ffmepg -i AIR_up_meta.avi -vcodec libx254 -aspect 16:9 AIR_up.mkv

ffmpeg のオプションについては適宜ぐぐってください

ポイントとしては、

  • インターレス解除は必須
  • waifu2x のノイズ除去は必要に応じて
  • アスペクト比設定は忘れずに

インターレス解除はやらないと見てられません。これはこっち方面に手出したことある人なら説明不要でしょう。

ノイズ除去は要検討事項です。waifu2xのノイズ除去は、JPEG化の量子化ノイズを除去するためのものなので、DVDソースのような十分にビットレートが確保されたデータをJPEG化した場合、意味があるのかが微妙です。AIRの動画について言えば、ノイズ除去をかけると絵がぬっぺりします。セル時代のアニメだったら効果あるかもしれないですが、デジタル製作時代だとむしろ悪影響かもしれません。
処理対象としたい作品のOPだけとか、短い映像を取り出して作品ごとにノイズ除去レベルを決めたほうがいいんじゃないかなと思います。

最後にアスペクト比。もうDVD時代のことなんて、私もすっかり忘れててハマったんですが、DVD に 16:9 の動画を収録するときは、「4:3 で動画を収録して、再生時に適宜 16:9 で表示してね」という方式です。なので、DVD動画をそのままアプコンして動画化すると、縦長映像になってしまいます。
なので、動画コンテナに 16:9 ですよという情報を付加してコンテナファイルを完成させます。

Thinkpadのタッチパッド

| コメント(0) | トラックバック(0)

要らないものの代表と言っていい、Thinkpadのタッチパッド。

なんでThinkpad使うのか?と問われれば、もはやサポートもあてにならない、保守マニュアルもいつ消されるかわからない。Lenovoに堕ちてしまったThinkpadにとってのメリットって、トラックポイントくらいしかないわけですよ。なんでスライドパットなんかつけるの??

でだ、まぁ、市場的に付けざるをえないんでしょうな。そんなスライドパット、当然のように無効化して使うわけです。コントロールパネルの「マウス」の設定から無効化するわけですよ。

Mouse.png

あ、そうそう、「マウス」ダイアログに「トラックポイント」タブもしくは、「UltraNav」タブがないときは、いったんスライドパッドを有効化してやるとタブが現れるようです。Thikpad T42 を再セットアップしたときに遭遇した問題でした。

で、本題にもどって無効化の話

Lenovoのサイトを見ると、

休止/スリープモードからの起動、再開、またはWindowsに入ります。 タッチパッドは自動的に有効になります。上記の手順を繰り返して無効にします。

こんな記述が。
休止から復帰したら、タッチパッドを再有効化って、何かんがえてそんな設定にしたんだか。Thinkpad T60 の話です。

ちうわけで、もうBIOSからばっさりヤるしかない。

DSCN0151.JPG.jpegDSCN0150.JPG.jpegBIOS画面に入って、[config]-[Keyboard/Mouse]-[Touch Pad]で無効化してやりましょう。

UPSバッテリーの寿命

| コメント(0) | トラックバック(0)

UPSを使ってると、必ず出会うのがバッテリ交換。

環境温度にもよるそうですが、UPSメーカによると3から5年程度で寿命を迎えるのが一般的だそうです。

でまぁ、うちのサーバ系でもUPSが稼働してるんですが、そのうち1台で1年半ほど前に警告がでて交換しました。まぁ、これで当分は大丈夫だろ・・・と思ってたんですが、またしても交換警告が。しかも今回は2台連続で。1台は稼働開始から3年ほどたったUPSなんで、まぁ妥当っちゃぁ妥当なんですが、もう一台が1年半前に交換したUPS。
えぇー?なんで・・・・?

ちうわけで、調べてみることにしました。

ぐぐってみると、バッテリー寿命は電池の内部抵抗を見てるとか。というわけで、こんな装置をつくってみました。

DSCN0153.JPG.jpeg

DSCN0154.JPG.jpeg

制御系にRaspberry PIを利用して、電池からの放電制御と電流・電圧測定を行います。
負荷は、バッテリーを直結しておおよそ1Aが流れるくらい、すなわち10Ωくらいの抵抗。で、この抵抗がめっちゃめちゃ発熱するので、金属板に熱伝導シールで貼り付けてあります。

これでどーするかというと、

  1. 負荷出力OFF状態で、バッテリの開放電圧を測定
  2. 負荷出力をONに遷移させて、バッテリの両端電圧と電流を測定
  3. 開放電圧と、ON時電圧・電流からバッテリの内部抵抗を計算
  4. 負荷出力をONにしたまま、一定時間おきに電圧・電流値を測定
  5. 電圧が11Vに達した時点で負荷出力をOFFし、時間を計測
  6. 記録した電流・電圧からAh値を計算

まぁ、やってることは、ぜーんぜん大したことなくて、手動でもできるんですが、Pythonスクリプトでやったら楽だなってことで、PI にやってもらいます。

でまぁ、測定結果はこんな感じ

Ah 内部抵抗
オムロン 新品バッテリ

6.15

0.124
UPS1号機から外したバッテリ 3.37 0.152
UPS1号機から2回目に外したバッテリ 6.68 0.138
UPS2号機から外したバッテリ 5.88 0.111
6年前にUPSから外したバッテリ 0.11 0.261

長期放置したバッテリは容量スカスカになってますが、交換で外したばかりのバッテリ、 全然劣化してるように見えないんですが・・・・・・?

内部抵抗も、新品と、交換したてバッテリ2個でほとんど変わらない。

数字じゃわかりにくいので、グラフにしてみよう。

Graph.jpg右下の3個の測定点の違いが判らない・・・・・新品より容量が大きいのもあれば、内部抵抗が小さいのもある。

これ、UPSのバッテリ診断を信用していいんか・・・・?


最後におまけ。

測定スクリプトも載せておきましょう

#coding: utf-8

import io
import sys
import smbus
import time
import locale
import psycopg2
import struct
import RPi.GPIO as GPIO

bus_number  = 1
args = sys.argv
i2c_addr = 0x47

interval = 5
lowlimit = 11.0

bus = smbus.SMBus(bus_number)

def writeReg(reg_addr , data):
        bus.write_word_data(i2c_addr , reg_addr , data)

class INA226:
        vol = 0
        amp = 0

        def __init__(self):
                writeReg(0x05 ,0x000a)
                time.sleep(1)

        def readData(self):
                val = bus.read_word_data(i2c_addr , 0x02)
                val = struct.unpack(">H" , struct.pack("<H" , val))[0]
                self.vol = val * 1.25 / 1000
                val = bus.read_word_data(i2c_addr , 0x04)
                val = struct.unpack(">h" , struct.pack("<H" , val))[0]
                amp = val
                self.amp = val / 1000.0
                #print "Voltage %0.3f (V)" % (vol)
                #print "Current %0.3f (A)" % (amp)

def DBwrite():
        item = pg_con.cursor()
        item.execute("BEGIN;")
        SQL = "LOCK TABLE %s IN ACCESS EXCLUSIVE MODE;" % (table)
        item.execute(SQL)
        SQL  = "SELECT max(\"id\") FROM %s;" % (table)
        item.execute(SQL)
        itemRes = item.fetchone()
        newid = int(itemRes[0]) + 1
        SQL  = "INSERT INTO %s " % (table)
        SQL += "(\"id\" , \"date\" , \"sensor_id\" , \"voltage\" , \"current\") "
        SQL += "VALUES('%d' , now() , '%d' , " % (newid , sensor_id)
        SQL += "'%7.3f' , '%7.4f') ;" % (vol , amp)
        item.execute(SQL)
        item.execute("COMMIT;")


def setup():
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(14 , GPIO.OUT)
        GPIO.output(14 , 0)
        ina226 = INA226()

setup()
ina226 = INA226()

def InterImp():
        ina226.readData()
        volOff = ina226.vol
        GPIO.output(14,1)
        time.sleep(0.1)
        ina226.readData()
        GPIO.output(14,0)
        vol = ina226.vol
        amp = ina226.amp
        imp = (volOff - vol) / amp
        print "Open Voltage %0.3f (V)" % volOff
        print "Inter impedance %0.3f (OHM)" % imp
        time.sleep(1)

def Discharge():
        past = 0
        print "\"time\",\"Voltage\",\"Cirrent\""
        GPIO.output(14,1)
        time.sleep(0.1)
        while(1):
                ina226.readData()
                vol = ina226.vol
                amp = ina226.amp
                print "%d,%0.3f,%0.3f" % (past , vol , amp)
                if(vol < lowlimit):
                        GPIO.output(14,0)
                        print "Discharge time %d (sec)" % past
                        return;
                time.sleep(interval)
                past += interval

if __name__ == '__main__':
        InterImp()
        Discharge()

PIからの接続は、このスクリプトからリバースエンジニアリングしてください(をひ

使ってるのは、スクリプトからもわかる通り、INA226のモジュールです。このモジュールをPI から叩きたい方も、サンプルにどーぞ

このアーカイブについて

このページには、2016年12月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2016年11月です。

次のアーカイブは2017年1月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。