msdd’s blog

deep learning勉強中。プログラム関連のこと書きます。

EasyOCRを使って楽々OCR!画像から文字を取り出してみる

はじめに

PythonのGithub Trendingを見ていたら、EasyOCRというリポジトリを見つけました。 名前にEasyとついていたので、簡単にOCRできるならやってみようということで、試しに動かしてみました。

OCRとは

Wikipediaによると、

光学文字認識(こうがくもじにんしき、Optical character recognition)は、活字の文書の画像(通常イメージスキャナーで取り込まれる)を文字コードの列に変換するソフトウェアである。

とあります。 看板やノートの写真から文字の部分を読み取ってくれるようなソフトのことです。

EasyOCRとは

様々な言語を読み取ることが出来るOCRです。2020年7月7日では、スター数は1.1kでした。2020年7月15日にもう一度見てみると、5.5kまで増えていました。すごい!

このEasyOCRは、日本語、英語、中国語など、40以上の言語をサポートしています。Pythonで書かれていて、内部では、Deep learningライブラリのPyTorchも使われているようです。

githubのリンクは、https://github.com/JaidedAI/EasyOCRで、 ライセンスはApache License 2.0です。

使ってみる

使ってみました。

インストール

まずはeasyocrをインストール。

pip install easyocr

サンプルで試す

OCRにかける画像を用意します

EasyOCRに入っていたサンプルの画像を使ってみます。

f:id:msdd:20200715190536p:plain

メインのコード部分は、下のような感じです。 readerで引数に日本語のjaと英語のenを指定します。 readtextメソッドで引数に画像のパスを与えることで 結果が返ってきます。

import easyocr
reader = easyocr.Reader(['ja','en'])
result=reader.readtext("/path/to/image")
print(result)

結果は、文字部分を囲んだ矩形の4頂点、文字、confidentのリストが得られます。confidentは、よくわかっていません。 確信度?信頼度?テキストを予測したその予測テキストが当たってる確率的なものだと思っています。今度調べます。

下がサンプルに適用してみた時の結果です。

[([[71, 49], [489, 49], [489, 159], [71, 159]], 'ポ<捨て禁止!', 0.6339447498321533), ([[95, 149], [461, 149], [461, 235], [95, 235]], 'NOLITTER', 0.32493865489959717), ([[80, 232], [475, 232], [475, 288], [80, 288]], '清潔できれいな港区を', 0.9784268140792847), ([[109, 289], [437, 289], [437, 333], [109, 333]], '港 区 MINATO CITY', 0.18788912892341614)]

試しに、上の結果の一つ目を見てみると、 矩形の頂点の座標xyが4つで、リストに格納されている([[71, 49], [489, 49], [489, 159], [71, 159]])。次にテキスト('ポ<捨て禁止!')。最後の値がconfident(0.6339447498321533)です。

([[71, 49], [489, 49], [489, 159], [71, 159]], 'ポ<捨て禁止!', 0.6339447498321533)

これを画像上に表示してみると、 下のようになります。

結構いい感じで文字の場所と認識が出来ていますね。 まぁサンプルなので。 "イ"が"<"に間違われているのが気になります。。。

f:id:msdd:20200715190551p:plain

他の画像で試す

画像は、いらすとやのものを使わせてもらいました。 文字が入った画像を探しやすかったので。

confidentは詳しくは見ていません。 ぱっと見では、間違っているのはconfidentが低いものが多いです。

横書き

金魚すくいの画像で試してみました。 この画像は、文字が横に並んでいます。

元画像と結果画像は下にあります。

矩形はうまい具合に文字全体を囲んでいますね。 文字の認識は、ひらがなの"く"が不等号の"<"になってしまっています。 このOCRのモデルは、不等号が好きみたいですね。

f:id:msdd:20200715190604p:plain

f:id:msdd:20200715190614p:plain

縦書き

残暑お見舞いの画像で試してみました。

"残"と他の文字の矩形が別々になっています。 識別を見ても、大きく囲まれた部分は"・"と識別されている ことから、縦書きの判別ができないみたいです。

f:id:msdd:20200715190626p:plain

f:id:msdd:20200715190634p:plain

斜めに配置された文字

有給申請書の画像で試してみました。 この画像は、斜め

矩形はうまい具合に文字全体を囲んでいますね。

f:id:msdd:20200715190648p:plain

f:id:msdd:20200715190655p:plain

文字いっぱい

スタッフ急募の広告画像です。 文字いっぱいあります。

カタカナの文字の認識が弱そうです。 "スタッフ"や"アットホーム"の部分を間違えて 判別しています。

f:id:msdd:20200715190707p:plain

f:id:msdd:20200715190716p:plain

円状に配置された文字

ダルマ画像で試してみました。 この画像では、文字が円状に配置されています。 これは、矩形で判定するのは難しそうなので、 試してみました。

ゆるいカーブ状に配置されている"明けまして"の部分は最後の"て"の部分以外はうまく読み取れていますね。 上側のカーブも読み取れないと思っていました。

下側の部分はさすがにうまく認識はしてくれませんでしたが、 囲む部分はうまく囲っている印象です。

f:id:msdd:20200715190725p:plain

f:id:msdd:20200715190729p:plain

点状の文字

ドット状の文字で"THANK YOU"と文字が書かれている画像です。 試してみましたが、何も認識しませんでした。矩形自体が検出されませんでした。 フォントなど関係あるかもしれないです。

f:id:msdd:20200715190746p:plain

f:id:msdd:20200715190755p:plain

まとめ

EasyOCRを使って、色々な画像で試してみました。 EasyOCRは、すごく少ないコードでOCRできるので、使いやすかったです。 精度はまだまだ改善余地があると感じました。

テキスト部分の矩形はうまく囲えて、 認識に失敗しているようなものが見られました。 横書きの文字は、うまく認識できているものがありましたが、縦書きが全く認識できていませんでした。 カタカナの認識も弱そうという印象です。

コード置き場

使たコードです

https://gist.github.com/3sdd/a5045740b208cc1b06bb1841d91de5bb

【個人開発】News Historyのアップデート

簡単に昔のニュースを探して見れるようなサイトを目指して、 News Historyを作っています。

www.msdd.info

アップデートしました。 主に、記事の読み込みと、記事をタグで絞り込みを出来るようにしました。 その他にも、修正しました。

アップデート

下のようなことをしました。

  • ページ遷移のアニメーション追加
  • 表示くずれの解決
  • カレンダーの作り直し
  • 記事の読み込み
  • タグで絞り込み機能追加
  • Twitterの埋め込みページへのリンク追加

ページ遷移のアニメーション追加

ページ遷移アニメーション追加しました。

ページ遷移なし

f:id:msdd:20200713120237g:plain

ページ遷移あり

f:id:msdd:20200713120256g:plain

ページ遷移のアニメーションが有り無しでは、滑らかさが違いますね。 待たされている感じが少ないです。 ちょっと読み込み遅れても、ごまかせそうです。

作り方は、ここのものを真似して作りました。 vue.jsのtransition機能を使っています。transitionとCSSの設定をしたらアニメーションが付きました。ほんの少しの設定で付けられるので、とても簡単です。 仕組みはよくわかってません。

表示くずれの解決

スマホで見た時に表示が崩れていたので修正しました。 UIライブラリは、Vuetifyを使っています。 VuetifyはBootstreapと同じように、グリッドを使って、 レイアウトをします。 前回は、小さい画面でのグリッドの設定をしていなかったため、スマホで表示が崩れていました。

グリッドの説明はここをみました。rowmdcolsを設定して、 画面サイズが違う場合でもきちんと表示出来るようにしました。

崩れているレイアウト

f:id:msdd:20200713120318p:plain

直した後のレイアウト

f:id:msdd:20200713120420p:plain

他にも崩れている所が有りそうなので、少しずつ直していきます。

カレンダーの作り直し

こちらも、カレンダーをスマホで見た時に崩れていたので、 作り直しました。

少し縦長になってしまっているので、もう少し修正した方がいいかな と思っています。

崩れているカレンダー

f:id:msdd:20200713120503p:plain

直したカレンダー

f:id:msdd:20200713120510p:plain

記事の読み込み

前のものは、多くある記事の最初の15記事だけ表示するようにしていたのですが、今回は、スクロールして最後まで行くと、さらに表示するようにしました。

f:id:msdd:20200713120520g:plain

問題点があり、スクロールして読み込みすると、読み込みした部分のTwitter埋め込みが後から 表示され、スクロール位置が勝手に移動しておかしくなるようになってしまいました。

タグで絞り込み機能追加

タグの絞り込み機能付けました。

f:id:msdd:20200713120540g:plain

記事をタグを使って絞り込んで、探すことが出来ます。 前回の記事で書いた通り、タグ自体が自動で付けているので、 少し雑なタグになっています。

タグを改善していけば、もっと簡単に探したい記事を探せるようになる と考えているので、もっと改善していきます。

Twitterの埋め込みページへのリンク追加

最後に、記事を埋め込めるようにTwitterの埋め込みリンクへのアクセスボタンを付けてみました。

f:id:msdd:20200713120627p:plain

ブログとかで参照したい時に、埋め込みが欲しいと思い付けました。 ボタンを押すと埋め込みをコピーできるページへ飛ぶので、そこから埋め込みをコピーします。

TwitterのURLで埋め込む方法を採用している所もあるので、 次はURLコピーのボタンも付けようと思います。

今後

今後やることです。

  • タグの種類増やす
  • ツイートURLをコピーするボタン追加
  • スクロールして読み込み時に重くなるのを解消
  • デザイン頑張る

をしていきたいと考えています。 デザインは全然できないので、Cocoda!で勉強中です。

どんどん改善していくので、ぜひ使ってみてください!

過去のニュース見れるサイト作りました【個人開発】

過去のニュース見れるサイト作りました

前から欲しなぁと思っていた日付からニュースを検索出来るサイト を試しに作ってみました。 まだまだ粗削りですが、とりあえずは動くようになったので公開してみました。 News Historyという名前です。

https://newshistory.info/

f:id:msdd:20200706215810p:plain
News Historyホーム

今後どんどんブラッシュアップしていきます。

作るモチベーション

作るモチベーションとしては、 コロナの振り返り記事書きたいなと思った事からでした。

一月から新型の肺炎が出てきたというところから、あっという間にコロナが世界中に広がりました。 そして、半年が過ぎて、その間に、ダイアモンドプリンセスのことや、外出自粛など、 色々な事が起こりました。

覚えていることを時系列順に書いていこうかなと思ったのですが、 色々な出来事があり、どっちの出来事が先にあったのか覚えていないことも多かったです。 そこで、日付順にニュースを見ていくことで、起こった出来事の順番通りに書けると思い、 日付でニュースを検索出来るサイトを作りました。

サイトの機能

作るサイトで欲しい機能としては、

  1. 日付を選んで、その日にあったニュースが見れる(作った)
  2. タグを付けて絞り込み(まだ出来ていない)

のようなことが出来たらいいなと思い作っています。 始めは1番目の日付選択でニュースを見れる機能だけを考えていましたが、 コロナ関連のニュースを絞り込みが出来たら記事が探しやすくなりそうとの思いから、 タグを付けて絞り込む機能も付けようとしています。

現在は、日付を選んでニュースを見れますが、 タグでの絞り込み機能はまだ出来てません。 これから作っていきます。

タグ付けの問題点

タグで絞り込みをする時に使う、タグを作っていく上で いくつか悩む部分があったので、書いておきます。

タグを作る上での問題点として、

  • タグ付け作業の負担が大きい
  • タグ自体の決め方

を考えていました。

1つ目は、タグ付け作業を人の手でしようとすると膨大な作業量になりそうな点です。 一日のNHKのtwitterのニュース量を見ると、200件あるときもあり、人手でタグ付けをすると かなりの労力が必要になると感じました。 そこで、タグの付け漏らしがあると思いますが、自動でテキスト中からキーワードを抽出して タグを付ける方法にしてみました。記事の書いてある内容によってはキーワードに引っかからずに、 タグがつかないことが考えられます。 試しに使ってみてダメそうならまた考えます。

2つ目は、どのようなタグを付けていくかです。 これは、今も迷っています。 新型コロナやCovid-19のような同じ言葉をどうするか? 日本と東京の関係のように、日本に東京は含まれているような時はどうするか? と色々考えてしまいます。 今の段階では、シンプルに、自分でタグを決めて、そのタグをキーワードにして、検索することでタグにする形にしています。 いい方法が思いついたら変更するかもしれません。

今後のやること

今後のやることです。

  • バグ修正
  • タグで絞り込み機能
  • デザイン頑張る
  • スマホ対応

さいごに

ニュース振り返りサイトNews History使ってくれると嬉しいです。 感想もくれるとうれしいです。

PyTorchのflaskでのデプロイチュートリアルをする時に出たエラーの解決法

はじめに

PyTorchのデプロイチュートリアルを読んでいて、 Flaskのコマンドを実行する時に、実行できなかったので その解決法を残しておきます。

問題の箇所

使っていた環境はWindows10,anaconda powershell promptを使っていました。

動かなかった箇所は、下のような環境変数を設定している所でした。 このままでは、どうやらwindowsでは動かないらしく、

$ FLASK_ENV=development FLASK_APP=app.py flask run

実行してみると、下のようなエラーが出ました。 Flaskの環境変数がセットできなかったようです。

$ : 用語 '$' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前
が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。
発生場所 行:1 文字:1
+ $ FLASK_ENV=development FLASK_APP=app.py flask run
+ ~
    + CategoryInfo          : ObjectNotFound: ($:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

解決法

実行したコマンドで調べてみると、 teratailに解決法が書いてありました。

どうやらPower Shellでは、書き方が違うらしく$env:"ENV"のようにENVに環境変数を書いていくようです。また、複数ある時は、セミコロン;で区切るようです。 なので、実行するコマンドはこんな感じになりました。

$env:FLASK_ENV="development";$env:FLASK_APP="app.py";flask run

これを実行すると、無事に動くようになり、サーバーが立ち上がりました。

【個人開発】注目して欲しい所を囲んだ画像を作れるサイト作りました

つくりました

ブログなどで、赤い四角や丸で重要な箇所を囲んでいる画像をよく見るので、 自分でも真似していこうかなと思い、そういう画像作れるサイト 「書き込み注目点」を作りました。

出来ること 下の画像のように、赤い四角や丸で、注目して欲しい所を囲んで、 その画像をダウンロードできます。

f:id:msdd:20200621225255p:plain
vercelホームページより

https://kakikomi-tyumokuten.vercel.app/

使い方

使い方は、 1. 画像を読み込み 2. 注目点を囲う 3. 画像を保存 です。

1.元画像を読み込む

まず、注目ポイントを書き込みたい画像を読み込みます。 左下の画像用見込みボタンから画像を選択すると、キャンバス部分に画像が表示されます。

f:id:msdd:20200621221008p:plain

(キャンバスのサイズの関係で、大きい画像はリサイズされます。)

2. 図形を置いて調節する

次に、注目ポイントに図形を置きます 図形は、

  • 四角
  • 矢印

の4種類で、キャンバスの下側にあるボタンを押すとキャンバス上に表示されます。

f:id:msdd:20200621221718p:plain

図形をクリックすると、コントローラーが出てくるので、大きさや位置を調節できます。

f:id:msdd:20200621215307p:plain

辺や四隅にあるコントローラーで大きさ調節、上側に伸びている少し離れたコントローラーで回転、 オブジェクトの真ん中にカーソルを合わせカーソルが変化したら移動ができます。

f:id:msdd:20200622180452g:plain

キャンバスの右側にある「オブジェクト設定」で、線の色や太さを変えることができます。 「オブジェクト一覧」のごみ箱のボタン🗑を押す、または、選択した状態でDeleteボタンを押すことで、図形を削除できます。

f:id:msdd:20200622181054p:plain

3. 画像をダウンロード

最後に右下にある、「画像を保存」ボタンを押してダウンロードします。

f:id:msdd:20200621224728p:plain

さいごに

使いにくい所とかは改善していこうかなと考えてます。 現在の改善案

  • 大きい画像はキャンバスサイズと同じ大きさでダウンロードする形になっているの(かなり不便)で、元の大きさで保存するように変更  完了
  • 画像をクリップボードにコピー  完了
  • クリップボードから画像読み込み 完了 提案ありがとうございました!

を考えてます。

ぜひ使ってみてください! 何か改善点などがあれば、お問合せフォームで送ってくれると喜びます

https://kakikomi-tyumokuten.vercel.app/

エディターのハイライトでバグの箇所がわからなかった

今日のバグ

cloud functionsを使っていて、pythonコードをデプロイしたが、SyntaxError: invalid syntaxが出た。

f:id:msdd:20200616205449p:plain

エラー内容を見ると、文字列の部分でエラーが出ていた。実際には、パスはもっと長いもの使っていた。

ret=f"public/data/{params["year"]}/"
^

間違ってないのになぁと思って、ずっとエラー原因探してた。 cloud functionsのエラー見てみると、最初の部分についているので、 前の行がおかしいのかなと思って調べてみたり、 変数が間違っているのかなと思い、パスを削って上のような ものにして実行した。しかし、まだエラー出た。

cloud functionsのデバッグ方法とかわからないので、 ずっとデプロイし続けてたが、ずっとエラー出るので、 さすがにデプロイして実行するの面倒くさくなった。 ローカルでデバッグしようと思い、少し修正してanacondaでファイルを実行した。 すると、cloud functionsと同じ行だが矢印が違う位置を指していた。

ret=f"public/data/{params["year"]}/"
                              ^

ここで、やっとエラー原因に気づいた。文字列なので""で囲むが、辞書型のparams["year"]のように、変数でも""を使っていて、その文字列の中で、""を再び使っていた事が原因だった。""が2つあることで、対応する""が自分の予想と違うことになっていた。
解決法は、'year'のように'で囲うことで解決した。

気づけなかった原因

なんで気づけなかったのかと思い、エディターを見てみると、 下の画像のようになっていた。 エディターのハイライトの色から見たら、コードが間違っていないように思えた。 文字列があり、その中にparams["year"]という変数を埋め込んでいるのが、で 理解して、問題なく書けていると思い込んでいた。

f:id:msdd:20200616205733p:plain

しかし、このエディターのハイライトの色が実はおかしかった。 ""を使ったら、最初の"からyearの前の"までが文字列の色になり、year部分が白くなってから、残りの""内が文字列の色になって欲しかった。 fstringで書いていたためだと思われる。

思ってたものは、 文字列の前からfを取ったのと同じような感じに色を付けて欲しかった。 対応する"で囲まれた中身が文字列として色がついており、文字列でない部分のyearは白く表示される。これなら、間違っていることが一目でわかる。

f:id:msdd:20200616205742p:plain

おわりに

原因がわかれば、こんな事で時間を使ってしまったのかと思うようなエラーだった。 このことで、エディターのハイライト間違えられるすぐには気づかないことを知れた。

ウェブサイト作ってみました

はじめに

ウェブサイトを作りたいと思い、ウェブサイト作成の事を調べたりして勉強していたら、 ブログが一カ月空いてしまい、久しぶりのブログになってしまった。

定期的にアウトプットしていきたいので、 定期更新できるように頑張っていきたい。

作っていたもの

作りたいサイトがあったので、ウェブサイトを作るために色々と勉強していた。 その過程で作ったものをつらつらと書いていく。

  1. デジタル時計
  2. タイマー
  3. ベクトル計算サイト
  4. Tree Text(テキストからTreeコマンドで表示した時のように変換するサイト)
  5. 犬のスライドショー
  6. Github Trending Log(過去のGithub Trendingを見れるサイト)

上のようなもを作っていた。 これらを作る前にも、ビルドとかしない、素のJavaScriptで作ったサイトもあるが、 完成せずに終わったので省く。

1. デジタル時計

url: https://3sdd.github.io/StudyWebDev/website/clock/

f:id:msdd:20200613152435p:plain

・内容
ただのデジタル時計。現在の時間を表示するだけのシンプルなサイト。 時間が表示されるだけで、他の機能は一切ない。 JavaScriptをビルドする練習のために作った。

・技術面
始めて、npmを使ったもの。npmは色々なライブラリが登録されているパッケージマネージャーで、 npm install ~というコマンドでライブラリをインストールできる。JavaScriptのライブラリの ページには、だいたい、そのライブラリをインストールするコマンドが書いてあるので、そのコマンドをコピペすれば、ライブラリをインストールできる。 npmで時間を扱うライブラリをインストールして作った。
JavaScriptもbrowserifyでビルドした。ビルドすることで、ブラウザで動かないJavaScriptコードも 動くように変換してくれる。JavaScriptは、ファイルを開けばブラウザで勝手に実行してくれて、 ビルドなどの処理はいらないと思っていたので、すこし驚きだった。

使ったもの
UI 普通のcss
フレームワーク なし
ホスティング サーバー GitHub Pages

2. タイマー

url: https://3sdd.github.io/StudyWebDev/website/timer/

f:id:msdd:20200613152450p:plain

・内容
ただのタイマーです。カウントダウンして、0になると音がなるタイマーです。

・技術面
JavaScriptのコードを圧縮するminifyを使った。 サイトをサーバーから送る時、サイズは小さい方がいいので圧縮してみた。

使ったもの
UI 普通のcss
フレームワーク なし
ホスティング サーバー GitHub Pages

3. ベクトル計算サイト

url: https://calcvec.xyz

f:id:msdd:20200613152502p:plain

・内容
2つのベクトルの足し算が計算が出来るサイト。 足し算した結果を座標上にベクトルとして表示する。 もう少し 、改善していきたいと考え中。

・技術面
vue.jsというものを使った。vue.jsは、JavaScriptフレームワークで、 簡単に入力した値などを、簡単にバインディングして、変数に格納でき便利。 最初にプロジェクトを作るときに、vue-cliを使った。vue-cliで作ることで、 ビルドなどの設定済みのプロジェクトが生成されるので、ビルド設定で時間がかかったりはしなかった。

使ったもの
UI 普通のcss
フレームワーク Vue.js
ホスティング サーバー Netlify

4. Tree Text

url: https://treetext.online/

f:id:msdd:20200613152515p:plain

・内容
フォルダー構造をテキストで表示するように変換するサービスです。

フォルダー
├─ ファイル1
└─ ファイル2

こんな感じのテキストを生成できます。

・技術面
ページ移動の設定が出来るVueRouterや、レスポンシブルデザインのフレームワークBootstrapのVue対応版のBootstrapVueを使ってみた。 きちんと一通り、サイトを作って、ドメインも取って公開したサイト。

使ったもの
UI Bootstrap Vue
ライブラリ Vue.js
ホスティング サーバー Netlify

5. 犬のスライドショー

url: https://inu-no-slideshow.web.app/

f:id:msdd:20200613152527p:plain

・内容
web1weekという企画があり、それのために作っていたサイト。 犬の画像が流れていくので、好きな画像にハートを付けていく。 ハートの合計を集めて、表示してみた。

・技術面
始めて、Nuxt.jsで開発したサイト。Nuxt.jsはvue.jsを元にしていて色々と 便利な機能とかが入っているフレームワークという認識(よくわかっていないが便利)。 firebaseというものを使って、いいねを付けたものを保存して、見れるようにしてみた。 Nuxt.jsもfirebaseも初めてで、開発が進まなくて、2週間ほどかかった。

使ったもの
UI Bootstrap Vue
フレームワーク Nuxt.js
ホスティング サーバー Firebase Hosting

6. Github Trending Log

url: https://github-trending-log.netlify.app/

f:id:msdd:20200613152541p:plain

・内容
過去のGithub Trendingのデータが見れるサイト。 データを集め始めたのが最近なので、まだあまりデータがない。 過去のGithubのトレンド情報が見たいと思い作ったサイト。 最近はやっているレポジトリがわかる。

・技術面
Nuxt.jsで作成。 UIフレームワークにはvuetifyを使用した。 デザインはよくわからないので、デフォルトのまま使用している。デザインセンスが欲しい。 データの取得、保存には、GoogleのCloud StorageとCloud Functionsを使った。

使ったもの
UI Vuetify
フレームワーク Nuxt.js
ホスティング サーバー Netlify

おわりに

以上作ったものです。 段々と、作り方がわかってきたような気がする。 サーバーも無料枠のものがあり、無料で公開できるのがうれしい。 この調子で、どんどん作って公開していきたい。

Manimのサンプルコードを読み解く

f:id:msdd:20200506165826j:plain

はじめに

前回の記事で、数学のアニメーション作成ライブラリManimをインストールして、 サンプル動画を生成してみた。  今回はそのサンプル動画を作ったスクリプトを読み解いていきたい。

www.msdd.info

サンプルスクリプトを読み解く

前回ダウンロードしたリポジトリのフォルダ内にある、example_scenes.pyがサンプルが 書かれているスクリプトである。

url : https://github.com/3b1b/manim/blob/master/example_scenes.py

コードを見てみると、最初にまず、モジュール読み込みをしている文がある。 Manimでは、manimlib.importsのファイルで様々なモジュールを読み込んでいる。 これによって、名前空間を気にせず動画を作るスクリプトを書ける。

from manimlib.imports import *

次に、前回実行したコマンドにあったSquareToCircleについて 見てみる。 コードの中では、SquareToCircleはクラスで定義されており、 Sceneを継承している。 関数として、contructを持っている。

このように動画を作る時には、Sceneクラスを継承したクラスを作って、 その中に関数construct(self)を作って、その関数内に動画でのアニメーション などを書いていくことになる。

class SquareToCircle(Scene): #Sceneクラスを継承したSquareToCircleクラスを作る
    def construct(self):
        circle = Circle() #円を作り、circle変数に割り当てる。シーン上には表示されない
        square = Square() #正方形を作りsquare変数に割り当てる。シーン上には表示されない

        # 先ほど作ったsquareに対して
        square.flip(RIGHT)#正方形を横軸(RIGHT)に対して、フリップ(一回転)させる。
        square.rotate(-3 * TAU / 8) #正方形を3/8だけ逆時計回りに回転させる。TAUは2πのこと。
        # 先ほど作ったcircleに対して
        circle.set_fill(PINK, opacity=0.5) # 円をPINK(ピンク)でopacity(透明度)を0.5に設定して塗りつぶし

        #アニメーションを再生する
        self.play(ShowCreation(square)) # squareをシーン上に生成する
        self.play(Transform(square, circle)) # squareをcircleに変形する
        self.play(FadeOut(square)) #フェードアウトさせる

def construct(self)の中身を見ていく。 まず、circlesquare変数にそれぞれ、Circle()Square()で 円と正方形を作っている。 これらは、Mobjectからの派生クラスで、派生クラスを使って、 アニメーションに登場するオブジェクト(円、正方形などの図形など)を作っていく。 さらに、生成したオブジェクトに対して、回転したり、色を塗ったりする。

その後、self.play(Animation)で引数にAnimationクラスのサブクラスを渡す ことで、順番にアニメーションが作られていく。サンプルでは、self.play()が3つあることから、 3つのアニメーションが作られ、付け加えられていく。 このself.play(Animation)は、継承元のSceneScene.play(Animation)で、 継承しているので、selfで使える。

使われているアニメーションは3つある。 1つ目ShowCreation()Mobject(オブジェクトを)をシーンに描画する。 2つ目Transform(mobject,target_mobject)は、mobjecttarget_mobjectへ変形させる。 3つ目FadeOut(mobject)はフェードアウトさる。 この3つのアニメーションでサンプルは出来ている。

まとめ

サンプルコードの中身を読み解いた。 アニメーションは、Sceneクラスを継承さいたサブクラスで作り、 そのクラスにdef construct(self)で、関数を作りその中に、 アニメーションを記述していく。 シーン内に現れるオブジェクトはMobjectを継承したクラスで、 アニメーションは、Animationを継承している。 アニメーションは、Scene.play(Aniamation)で、作ることができ、 継承しているので、self.play(Animation)で使える。 このself.play(Animation)を繋げていくことで、アニメーションを繋げて作っていく。

次は、オブジェクトやアニメーションの種類などを調べていきたい。

数学のアニメーションを作れるPythonライブラリManim

はじめに

数学のアニメーションなどを作成するライブラリとしてManimというライブラリがある。

f:id:msdd:20200505190905p:plain
Manimのロゴ(Manimより)

Manimは、pythonを使ってアニメーションを作ることができ、 3Blue1Brownでアニメーションを作るのに使われている。

例として、下の動画のアニメーションがManimで作られている。 様々なアニメーションを作れることがわかる。

今回は、このManimを動かしてみて、サンプル動画を作成してみる。

githubのリポジトリ : https://github.com/3b1b/manim

リポジトリのダウンロードと必要ライブラリのインストール

windows10で、anacondaを使ってインストールしてみる。 anacondaはインストールしてある前提である。

まず、manimのgithubリポジトリをダウンロードする。 ダウンロードの方法は、git cloneを使ったり、直接GithubからZIPでダウンロードする などの方法がある。今回は、GithubのリポジトリからZIPをダウンロードする。 Clone or donwloadから、Download ZIPを押して、リポジトリのZIPをダウンロードする。

f:id:msdd:20200505184456p:plain

ZIPファイルを解凍すると、manim-masterというフォルダーが出来ている。 さらにその中にも、manim-masterというフォルダーがあり、 その中にファイルが入っている。

f:id:msdd:20200505184506p:plain

展開が終わったら、必要なライブラリをインストールしていく。 今回は、anacondaを使い、仮想環境を作ってインストールした。 まずは、展開したフォルダーへと移動する。 cdコマンドを使って上の画像のようにファイルが置いてある所まで移動する。

cd ~/Downloads/manim-master/manim-master/

仮想環境を作り、必要なライブラリをインストールする。 environment.ymlで指定されているライブラリをインストール して仮想環境を作成した。

conda env create -f environment.yml

仮想環境を作り終わったら、仮想環境を起動する。

conda activate manim

サンプル動画作成

必要なライブラリのインストールが終わったので、試してにサンプルを動かしてみる。 サンプルファイルはenvironment.ymlが置いてあったのと同じフォルダー内にある、 example_scenes.pyである。

実行方法は、python -m manim ファイル名 クラス名で実行する。 追加でオプションを付けることができる。 下のオプションは、便利なオプションとして紹介されていたものである。 他にも、オプションがあるが、今回は使わない。

オプション 説明
-p 動画生成後に、動画プレイヤーで再生する
-l 動画の画質を低くして、動画生成を早める
python -m manim example_scenes.py SquareToCircle -p

実行してみると、./media/videosに使ったファイル名のexample_scenesというフォルダーがあり、 さらにその中に、1440p60というフォルダーが出来ている。 このフォルダーの中に、SquareToCircle.mp4と部分的な動画ファイルがpartial_movie_filesフォルダーに入っている。 生成された動画が下のもの。

オプションの-lを足して、クオリティを下げて動画を作ってみた。 実行してみると、example_scenesのフォルダーに480p15というフォルダーができて、その中に動画が入っている。 動画は、画質もfpsも落ちている。

python -m manim example_scenes.py SquareToCircle -p -l

これで、Manimに必要なライブラリをインストールして、動画を生成することが出来た。

さいごに

数学アニメーションを作成できるpythonライブラリManimをインストールして、 サンプル動画を生成してみた。 すごく簡単にアニメーション動画を作ることができる便利なライブラリだった。

次は、サンプルの中身を見ていきたい。

ライブ動画をダウンロードできるコマンド

はじめに

YoutubeやTwitchのライブ動画をダウンロードしたくなり、探して livestreamerというものを見つけた。しかし、 リポジトリ見ると、

Command-line utility that extracts streams from various services and pipes them into a video player of choice. No longer maintained, use streamlink or youtube-dl instead.

とあり、開発終了して、メンテナンスしていないとある。その代わりにstreamlinkyoutube-dlを使うようにとあった。 そこで、streamlinkを使って、ライブ動画をダウンロード出来ないかと思い、調べてみた。

f:id:msdd:20200502091351p:plain:w100

streamlinkとは

streamlinkは、コマンドラインツールで、livestreamのフォークプロジェクト。 Youtube LiveやTwitchなどのストリーム動画を動画プレイヤーで再生したり、ダウンロードしたりすることができるコマンドラインツール。

サイト  url
github https://github.com/streamlink/streamlink
ドキュメント https://streamlink.github.io/
サポートされているサイト一覧 http://docs.livestreamer.io/plugin_matrix.html#plugin-matrix

使い方

サポートされているサービスは、

  • Twitch.tv
  • YouTube.com
  • Livestream.com
  • Dailymotion.com

などが上げられている。 サポートされているサイトはここに一覧がまとめられている。

f:id:msdd:20200502091338p:plain

仮想環境作る

streamlinkをインストールする方法はいくつかあるが、 今回はanacondaで仮想環境作ってインストールした。

まず、streamlinkという名前の仮想環境を作った。

conda create -n streamlink python=3.8

仮想環境を起動。

conda activate streamlink

インストール

次に、streamlinkをインストールする。 色々なインストール方法があるが1、 今回は、pipを使う方法でインストールした。

pip install streamlink

インストールすると、コマンドstreamlinkが使えるようになっている。 バージョンを確認してみると、streamlink 1.4.1であった。

streamlink --version

streamlinkコマンドを使う

使い方は、streamlink URLで解像度を調べて、streamlink URL 解像度で動画プレイヤーが起動される。ファイルを保存する時は、streamlink URL 解像度 -o ファイル名でファイルに保存される。

streamlink URLでurlを指定することで、解像度などを取得する。

streamlink https://www.youtube.com/watch?v=coYw-eVU0Ks

結果は、下のようなものを得られて、144pから1080pまであるのがわかる。 144pと1080pはそれぞれ、最低画質と最高画質で、worstbestとついている。

[cli][info] Found matching plugin youtube for URL https://www.youtube.com/watch?v=K7r2cBYeWn8
Available streams: 144p (worst), 240p, 360p, 480p, 720p, 1080p (best)

1. 動画プレイヤーで再生

streamlink URL 画質で、実行する。画質は上で調べたものを指定する。これはbestworstとすることでも、それぞれ最低画質、最高画質を指定できる。1080pと指定した。

streamlink https://www.youtube.com/watch?v=K7r2cBYeWn8 1080p

最高画質なので、1080pの代わりに、bestでも大丈夫。

streamlink https://www.youtube.com/watch?v=K7r2cBYeWn8 best

実行すると、下のような情報が表示され、ビデオプレイヤーのVLCが起動して、ライブが映し出された。 (すでにVLCプレイヤーはダウンロードしていた。)

[cli][info] Found matching plugin youtube for URL https://www.youtube.com/watch?v=K7r2cBYeWn8
[cli][info] Available streams: 144p (worst), 240p, 360p, 480p, 720p, 1080p (best)
[cli][info] Opening stream: 1080p (hls)
[cli][info] Starting player: "C:\Program Files\VideoLAN\VLC\vlc.exe"

f:id:msdd:20200502091908p:plain
VLC画面

2. ファイルに保存

ファイルに保存するには、-o ファイル名として保存する。

streamlink https://www.youtube.com/watch?v=K7r2cBYeWn8 best -o file.ts

止めるときは、ctr+cを押したら止まった。ファイルがすでに存在する時は、 File file.ts already exists! Overwrite it? [y/N]と出てくるので、 yを入力して上書きする。

保存する時間を指定するには、--hds-durationというオプションを使って、 指定する。[HH:]MM:SSの形式。しかし、実行してみると、 指定した時間とずれたりすることもある。

下のものは、20秒間ファイルに保存するサンプル。20秒間の動画をfile20s.tsというファイル名で保存している。

streamlink https://www.youtube.com/watch?v=K7r2cBYeWn8 best -o file20s.ts --hls-duration 00:00:20

動画ファイルで.tsのファイルは知らなかったので、調べてみると、 トランスポートストリーム形式のデータらしい2。 そのままでは、再生できなかったので、mp4のファイルに変換した。 変換は、オンラインの変換サービスや、ローカルで変換したいときは、ffmpegなどを使って出来る。

オンライン変換サービスを使う時

Convertioというオンラインサービスを使い.tsから.mp4のファイルへ変換も出来る。

変換前のファイルをサイトにアップロードして、変換を押すことで、mp4へと変換してくれる。 変換後に、ダウンロードボタンを押して、ダウンロード出来る。

ffmpegを使う時

ffmpegのインストール

conda install -c menpo ffmpeg

ffmpegを使ってtsファイルをmp4ファイルへ変換。-i 入力ファイルで変換元のファイルを指定して、出力ファイルも指定して実行することで変換が開始される。 下は、入力ファイルがfile.txで出力ファイルがoutput.mp4である。

ffmpeg -i file.ts output.mp4

実行すると、出力ファイルoutput.mp4が生成された。開いて見ることも出来た。

まとめ

Youtube Liveなどのライブ動画をダウンロードできるstreamlinkを用いて、 ライブ動画をダウンロードする方法を調べた。 .tsという形式で保存出来る。しかし、よく使うmp4などの形式に変換する必要 があった。

毎日、Githubのトレンドを投稿してくれるSlackアプリを作る(1)

はじめに

毎日、SlackでGithubのトレンドを通知してくれるものが欲しかったので作っている。

今回は、ローカルでプログラムを実行すると、Githubのトレンド情報を投稿できるよう なものを作った。

作り方

1. Slackのワークスペース作った

通知するためにSlackのワークスペースを作った。

f:id:msdd:20200501181524p:plain

test用にチャンネルを作った。右側のサイドバーのチャンネルの+ボタンを押して、チャンネルを作った。 ここに投稿していく。

f:id:msdd:20200501181545p:plain

2. Slackのアプリを作る

Slack App作成

まず Slack Appを作る。このSlack Appはユーザーと似たようなことができ、権限を与えれば プログラムからSlackに書き込んだりすることができる。 これを使い、GithubのトレンドをSlackに投稿していく。

Slack Appの作り方は、Create Slack appに従って進めていった。create a slack appのボタンを押して、アプリを作成する。

f:id:msdd:20200501181602p:plain

App Nameにアプリ名(後で変更可)とどのワークスペースに追加するかを指定して、 Create Appのボタンで作成する。App NameGithubTrendingNotificationAppで、 ワークスペースは先ほど作ったワークスペースを指定した。

f:id:msdd:20200501181617p:plain

アプリの設定

Appを作った後に、アプリの基本情報が表示される。 出ない時は、アプリ一覧からアプリを選択する。 f:id:msdd:20200501181633p:plain

プログラムでSlackへの書き込みができるように権限を与える。 左側のOAuth & Permissionsをクリックして、OAuthと権限を設定するページを開く。 下側へスクロールした所にある、ScopesのBot Token ScopesのAdd an OAuth Scopeボタンを押して、chat:writeに設定する。

f:id:msdd:20200501181645p:plain

アプリをワークスペースに追加

上のスクロールして戻ると、Install App to Workspaceのボタンがあるので押して、 アプリをワークスペースに追加する。

f:id:msdd:20200501181654p:plain

確認画面が出てくるので、許可を押して追加する。

f:id:msdd:20200501181709p:plain

トークンが表示される。これを使ってbotから投稿することになる。 コピーしておく。

f:id:msdd:20200501181721p:plain

Slack画面を見てみると、Appのところに、先ほど設定したアプリが入っているのがわかる。

f:id:msdd:20200501181731p:plain

次に、先ほど作ったtestチャンネルにアプリを追加する。 testチャンネルへ行くと、アプリを追加するとあるので、 クリックする。

f:id:msdd:20200501181854p:plain

作ったアプリ(GithubTrendingNotificationApp)を追加する。

f:id:msdd:20200501181903p:plain

3. 投稿プログラムを作った

pythonを使って、slackに投稿するプログラムを書く。 slackに投稿するために、Python slackclientを使った。 Python slackclientは、pythonのバージョンが3.6以上が必要。

anacondaで新しい環境作って動かした。 pythonのバージョンは、python:3.8.2、slackclientのバージョン:2.5.0。

conda create -n slack_github_trending_notification_app -y

環境を起動。

conda activate slack_github_trending_notification_app

slackclientをインストールした。

conda install -c conda-forge slackclient

試しに投稿するプログラム

試しに、slack apiのページにあったサンプルスクリプトを少し変えて動かしてみる。 tokenは先ほど作ったtoken。 api_test.pyとして、

python api_test.py

で動かした。

from slack import WebClient
from slack.errors import SlackApiError

def main():
    channel="#test"
    token="SLACK_TOKEN"
    text="Hello slack!"
    client=WebClient(token=token)

    try:
        response=client.chat_postMessage(
            channel=channel,
            text=text
        )

        assert response["message"]["text"]==text
    except SlackApiError as e:
        assert e.response["ok"] is False
        assert e.response["error"]

        print(f"エラー: {e.response['error']}")

if __name__=="__main__":
    main()

実行してみると、きちんとSlack上にHello slack!が表示され動く動いていることが確認できた。

github trendingからデータ取得して投稿するプログラム

次に、投稿内容をGithubのトレンド情報にしたいので、トレンドを取得する コードにする。 github trending を取得する公式APIはないので、 非公式APIで取得する。

www.msdd.info

前回の記事で、使ったコードも使う。

取得時間もメッセージに入れたいが、サーバーで動かす予定なので、 タイムゾーンが違うこともあるので、UTCからJSTに変換した。 そのため、pytzをインストールした。

conda install -c anaconda pytz

プログラムは下のようなものとなった。 中身は、 githubのトレンドのプログラミング言語と期間を指定して 取得する関数get_trending_repositoriesで、トレンドを取得する。 send_trending_messagesで、取得したリポジトリの情報を一つずつ Slackに送っていくようになっている。

assert response["message"]["text"]==textを入れていると、 エラーになることが有ったので外した。

from slack import WebClient
from slack.errors import SlackApiError

import urllib.request
import json
from datetime import datetime
import pytz

token="SLACK_TOKEN"

def get_trending_repositories(language=None,since="daily",spoken_language_code=None):
    params=""
    params+="?since="+since

    if language is not None:
        params+=("&language="+language)

    if spoken_language_code is not None:
        params+=("&spoken_language_code="+spoken_language_code)

    url="https://ghapi.huchen.dev/repositories"+params

    with urllib.request.urlopen(url) as res:
        body=res.read()
        j=json.loads(body)

        return j

def send_trending_messages(channel,language,since,num_repos=None):
    repos=get_trending_repositories(language=language,since=since)
    if num_repos is not None:
        repos=repos[:num_repos]
    
    time_utc=datetime.utcnow().replace(tzinfo=pytz.utc)
    time_jst=time_utc.astimezone(pytz.timezone("Asia/Tokyo"))
    for i,repo in enumerate(repos[:num_repos]):
        text=f"*{i+1} : {repo['name']}*\ntime(jst) : {time_jst}\n"\
        f"{repo['url']}\n{repo['description']}"
        send_message_to_slack(channel,text)

def send_message_to_slack(channel,text):
    client=WebClient(token=token)

    try:
        response=client.chat_postMessage(
            channel=channel,
            text=text
        )

        # assert response["message"]["text"]==text
    except SlackApiError as e:
        assert e.response["ok"] is False
        assert e.response["error"]

        print(f"エラー: {e.response['error']}")

if __name__=="__main__":
    send_trending_messages("#test","python","daily")

このファイルに名前を付けて、実行してみると、アプリが設定したtestチャンネルに、 pythonの日ごとのGithubのトレンドを通知してくれる。 気になる点としては、通知音がかさなってうるさい。

f:id:msdd:20200501181937p:plain

これで、通知するプログラムが完成した。

SlackのAPIを使って、Githubのトレンド情報を通知する アプリがconsoleで動くようになった。 次はサーバー上で動くようにして、 毎日投稿するようにしたい。

参考サイト

Sending messages | Slack

新型コロナの防疫間無料のSpringer(シュプリンガー)の本をダウンロード

はじめに

Springerは新型コロナの防疫の間、無料で本(英語)をダウンロードできるようにしてくれている。

その本をダウンロードするスクリプトを提供している springer_free_books というリポジトリがある。それを使ってみる。

f:id:msdd:20200428184759j:plain:w700

使ってみる

anacondaで仮想環境を作って本をダウンロードしてした。

springer_free_booksという仮想環境を作った。pythonのバージョンは3.8。

conda create -n springer_free_books python=3.8

githubのリポジトリからzipを直接ダウンロードして、展開した。 展開したリポジトリのファイルをがある場所へ移動する。コマンドは各自、ダウンロードしたところへ移動するようにする。

cd ~/Downloads/springer_free_books-master/springer_free_books-master

必要なライブラリをreqirements.txtから一括インストールする。

pip install -r requirements.txt

ダウンロードスクリプトを実行する。

python main.py

プログレスバーが表示され、ダウンロード状況を表示してくれる。進行度の%、何個目の本か、 経過時間と残り時間の予測、1つダウンロードするのにかかる時間が表示されている。

f:id:msdd:20200428184743p:plain

downloadsフォルダが出来ており、中には、Behavioral ScienceComputer Scienceなどの本のカテゴリーのサブフォルダーが出来ていて、その中にpdfなどの形式で本がダウンロードされている。 エラーが出たら、Finish downloading.と出れば終わり。

途中でエラーが出ることもある。 Problem downloading: Multimedia Big Data Computing for IoT Applicationsのように、Problem downloading: + 本のタイトルの形で表示される。 https://link.springer.com/でタイトルを検索して、自分でダウンロードする必要がありそう。

実行してみると、約50分ほどで終わり、5冊ほどエラーが出ていた。ファイルサイズは15Gほどあった。 ドキュメントによると、409の英語の本をダウンロードして、14GB、4時間かかったとある。 とサイズが少し違った。

まとめ

Springerが無料で本をダウンロードできるようにしてくれている。 その本をダウンロードするスクリプトを使ってみた。 色々なジャンルの本があるので、おもしろそうなものがあれば読んでみたい。 Springerに感謝。

動画、画像などをダウンロードできるコマンド

紹介

f:id:msdd:20200427232142p:plain

You-Getを使うことで、コマンドラインで動画、音声、画像をダウンロード出来るようになります。

サイトurl : https://you-get.org/
github : https://github.com/soimort/you-get
サポートしているサイト一覧 : https://you-get.org/#supported-sites

注意

ffmpegが必要になるときもある。(youtube の1080pより高画質の時など)

使い方

you-getのインストール

インストール方法は、 サイトにoption1からoption6まで書かれている。

anacondaを使いoption1 のpipでインストールして試してみる。

conda create -n you-get python=3.8
pip install you-get

コマンドオプション 

オプションをまとめてみた物です。 もれていたり、間違ってそうなので、ドキュメントを参考に。

 オプション  説明
--info/-i 全てのクオリティやフォーマットなどを表示
--itag ダウンロードするものを選択
--no-merge/-n ダウンロードした動画を結合しない
--output-dir/-o 出力パス
--output-filename/-O ダウンロードファイル名
--http-proxy/-x proxy設定
--player/-p 動画プレイヤーやブラウザで見る (e.g. mpv, vlc, chromium)
--cookies/-c クッキー読み込み
--http-proxy/-x proxy設定
--url/-u ページからダウンロードできるurlのリストを取得する
--json 抽出されたデータの概要をjsonフォーマットで取得する

動画、ダウンロード

youtubeの動画をダウンロードしてみる。

まず、動画には、画質、クオリティ、サイズなど様々なものがはるのでその情報を見る。 先ほどインストールした、you-getコマンドを使う。--infoまたは-iで情報を見ることができる。 youtubeの動画のurl: https://www.youtube.com/watch?v=APdS9YQUWroで試す。

you-get -i 'https://www.youtube.com/watch?v=APdS9YQUWro'

情報が表示される。

site:                YouTube
title:               #StayHome 命を救うために家にいよう
streams:             # Available quality and codecs
    [ DASH ] ____________________________________
    - itag:          248
      container:     webm
      quality:       1920x1080 (1080p)
      size:          11.3 MiB (11846656 bytes)
    # download-with: you-get --itag=248 [URL]

    - itag:          137
      container:     mp4
      quality:       1920x1080 (1080p)
      size:          11.2 MiB (11770543 bytes)
    # download-with: you-get --itag=137 [URL]

    - itag:          399
      container:     mp4
      quality:       1920x1080 (1080p)
      size:          10.6 MiB (11101910 bytes)
    # download-with: you-get --itag=399 [URL]

    - itag:          398
      container:     mp4
      quality:       1280x720 (720p)
      size:          6.4 MiB (6663857 bytes)
    # download-with: you-get --itag=398 [URL]

    - itag:          247
      container:     webm
      quality:       1280x720 (720p)
      size:          5.2 MiB (5411075 bytes)
    # download-with: you-get --itag=247 [URL]

    - itag:          136
      container:     mp4
      quality:       1280x720 (720p)
      size:          4.1 MiB (4279757 bytes)
    # download-with: you-get --itag=136 [URL]

    - itag:          397
      container:     mp4
      quality:       854x480 (480p)
      size:          3.7 MiB (3835289 bytes)
    # download-with: you-get --itag=397 [URL]

    - itag:          244
      container:     webm
      quality:       854x480 (480p)
      size:          3.4 MiB (3541927 bytes)
    # download-with: you-get --itag=244 [URL]

    - itag:          135
      container:     mp4
      quality:       854x480 (480p)
      size:          2.8 MiB (2913568 bytes)
    # download-with: you-get --itag=135 [URL]

    - itag:          396
      container:     mp4
      quality:       640x360 (360p)
      size:          2.5 MiB (2597629 bytes)
    # download-with: you-get --itag=396 [URL]

    - itag:          243
      container:     webm
      quality:       640x360 (360p)
      size:          2.5 MiB (2583145 bytes)
    # download-with: you-get --itag=243 [URL]

    - itag:          134
      container:     mp4
      quality:       640x360 (360p)
      size:          2.2 MiB (2295031 bytes)
    # download-with: you-get --itag=134 [URL]

    - itag:          395
      container:     mp4
      quality:       426x240 (240p)
      size:          1.8 MiB (1878913 bytes)
    # download-with: you-get --itag=395 [URL]

    - itag:          242
      container:     webm
      quality:       426x240 (240p)
      size:          1.7 MiB (1818156 bytes)
    # download-with: you-get --itag=242 [URL]

    - itag:          133
      container:     mp4
      quality:       426x240 (240p)
      size:          1.6 MiB (1710906 bytes)
    # download-with: you-get --itag=133 [URL]

    - itag:          394
      container:     mp4
      quality:       256x144 (144p)
      size:          1.4 MiB (1467705 bytes)
    # download-with: you-get --itag=394 [URL]

    - itag:          160
      container:     mp4
      quality:       256x144 (144p)
      size:          1.4 MiB (1419477 bytes)
    # download-with: you-get --itag=160 [URL]

    - itag:          278
      container:     webm
      quality:       256x144 (144p)
      size:          1.4 MiB (1418621 bytes)
    # download-with: you-get --itag=278 [URL]

    [ DEFAULT ] _________________________________
    - itag:          22
      container:     mp4
      quality:       hd720
      size:          4.1 MiB (4275209 bytes)
    # download-with: you-get --itag=22 [URL]

    - itag:          18
      container:     mp4
      quality:       medium
    # download-with: you-get --itag=18 [URL]

動画をダウンロードするには、上の情報のitagの値を使ってコマンドに--itag=itag値を付けることでダウンロードする。付けないと、デフォルト(DEFAULT)のものが使われる。 クローズドキャプションなどは、SubRip形式の.strでダウンロードされる。

you-get 'https://www.youtube.com/watch?v=APdS9YQUWro'

ダウンロードすると、 タイトル名.ja.strタイトル名.mp4という形式でキャプションファイルと動画がダウンロードされる。

f:id:msdd:20200427232158p:plain

ポーズはctr+Cで、再開は同じコマンドを打つことで出来る。

画像ダウンロード

画像のダウンロードも同様にyou-getに画像urlを付けるだけ。

you-get https://www.python.org/static/community_logos/python-logo-master-v3-TM.png

試験的な機能で、画像サイトから画像を取得するものもある。 しかし、ドキュメントには動作は完璧からはほど遠いとある。 tumblurなどのサイトから画像をダウンロードしてくる

you-get https://javascript.tumblr.com/post/190518523862/hi-there-your-friendly-neighborhood-tumblr-web

f:id:msdd:20200427232207p:plain

その他

ほかにも、ダウンロードではなく、動画を再生したり、単語を指定してgoogle検索で最も関連のある動画をダウンロードしたり出来る。

まとめ

コマンドでyoutubeなどの動画をダウンロードする時に使えるyou-getを試してみた。クオリティを選べ、保存先、名前も変えれるので、一括ダウンロードするスクリプトなども作りやすそう。

pythonライブラリmmcvのインストールエラーの解決法

はじめに

pythonライブラリのmmcvをインストールしようとした時にエラーが出たので、 それの記録しておく。

出てきたエラー

building 'mmcv._ext' extension
error: Microsoft Visual C++ 14.0 is required. Get it with "Build Tools for Visual Studio":https://visualstudio.microsoft.com/downloads/

MMCV

github url: https://github.com/open-mmlab/mmcv

MMCVは、コンピュータビジョンの研究のためのpythonのライブラリである。

下のような機能がある。

  • ユニバーサルなIO API
  • 画像処理
  • 動画処理
  • 画像とアノテーションの視覚化
  • Utility(プログレスバー、タイマーなど)
  • さまざまなCNN

MMCVを使うには、pythonのバージョンは、3.6以上が必要とある。 しかし、windows10のマシンで、anacondaを使ってインストールしようとするとエラーが出た。

エラー解決法

mmcvをインストールしてエラーが出る

仮想環境を作って試す。 mmcv_installationという名前で、pythonのバージョンは3.8の仮想環境を作った。 p

conda create -n mmcv_installation python=3.8

仮想環境立ち上げる。

conda activate mmcv_installation

mmcvをインストールするコマンドをうつ。

pip install mmcv

インストールが始まるが、途中でエラーが出て止まってしまった。

ERROR: Command errored out with exit status 1:

赤文字でバーとエラーが出てくる。

f:id:msdd:20200427135545p:plain

解決法

下側のエラーに下のように書かれているのが出て来る。 どうやらVisual C++ 14.0がいるらしい。リンク付で表示されているので、 リンクへ飛んでVisual C++ 14.0をインストールしに行く。

building 'mmcv._ext' extension
error: Microsoft Visual C++ 14.0 is required. Get it with "Build Tools for Visual Studio": https://visualstudio.microsoft.com/downloads/

Visual C++ 14.0をダウンロードしにいく。 ダウンロードページのすべてのダウンロードの部分に、 ある、Visual Studio 2019のツールのアコーディオンを開いて、 Build Tools for Visual Studio 2019をダウンロードする。

f:id:msdd:20200427135557p:plain

ダウンロード後に、インストールする。 続行を押す。

f:id:msdd:20200427135610p:plain

左上のc++ build toolsにチェックを入れてインストールする。

f:id:msdd:20200427135621p:plain

インストールが終わるまで待つ。 終わると、再起動が必要とでるので、再起動する。

f:id:msdd:20200427135633p:plain

再起動後に、再びインストールする。

conda activate mmcv_installation
pip install mmcv

エラーなくインストールできた。

Successfully built mmcv
Installing collected packages: mmcv
Successfully installed mmcv-0.4.4

まとめ

mmcvのインストール時にエラーが出た。 エラー内容を見てみると、Visual C++ 14.0が必要みたいだった。 Microsoftのダウンロードページからダウンロード、インストールした。 結果、エラーなくmmcvをインストールできた。

Githubのプログラミング言語の色を提供しているリポジトリ

はじめに

Githubにあるプログラミング言語の色を格納したファイルを提供しているリポジトリを見つけたので、詳しく見てみる。 github-colorsというもので、Githubのプログラミング言語の色を対応づけたjsonファイルを提供している。 加えて、スクレーピングスクリプトも公開してくれている。

github-colors

リポジトリ: https://github.com/ozh/github-colors

主なファイルは、

  • README.md
  • github-colors.py
  • colors.json

README.mdには、プログラミング言語とGithubで使われている色を見ることができる。

f:id:msdd:20200424160511p:plain

github-colors.pyは、スクレーピング用のpythonスクリプトである。 requestspyyamlが必要で、Anacondaの環境には、 conda install -c anaconda requestsconda install -c anaconda pyyamlでインストールできる。python github-colors.pyを実行すると、README.mdcolors.jsonが更新される。 ここからyamlの情報を取得して処理している。

colors.jsonには、色情報が格納されている。一部を見てみる。 キーにプログラミング言語の名前で、値にcolorurlをもつオブジェクトがある。 色は、16進数で表されている。urlをプログラミング言語のトレンドへのurlが入っている。 4Dcolorのように、色が設定されていない言語もあるようだ。

{
    "1C Enterprise": {
        "color": "#814CCC",
        "url": "https://github.com/trending?l=1C-Enterprise"
    },
    "4D": {
        "color": null,
        "url": "https://github.com/trending?l=4D"
    },
    "ABAP": {
        "color": "#E8274B",
        "url": "https://github.com/trending?l=ABAP"
    },

まとめ

Githubで使われているプログラミング言語と色の対応をまとめたgithub-colorsというリポジトリを見てみた。json形式で扱いやすそう。プログラミング言語を色分けする際の参考になると思う。