カテゴリー: 行動学

  • 物体認識を使った新しい行動解析ツール”YORU”とは一体なんなのか

    物体認識を使った新しい行動解析ツール”YORU”とは一体なんなのか

    2024年11月にbioRxivにこれまでの行動解析ツールとは異なる手法を使ったYORUという行動解析ツールについて発表されました。
    今回はそのツールについてどのようなツールなのかを解説していきたいと思います。

    YORUのプレプリント

    YORUのドキュメント

    YORUとは

    YORUとは深層学習を使った動物の行動解析ツールです。

    YORUのサイトより引用


    これまでもDeepLabCutSLEAPといった深層学習を使ったツールは多く公開されています。
    これらのツールは深層学習と用いて動物の体の部位をトラッキング、そして姿勢推定を行うツールです。(ここではトラッキングツールと呼びます。)

    姿勢を推定することによって、動物がどのような姿勢をしているのかを明らかにし、行動解析を行います。

    これに対して、YORUは物体認識というアルゴリズムを用いて行動を認識します。
    簡潔には、身体部位のトラッキング等は行わず、動物の行動している様子から行動を直接定義します。

    人がりんごやみかんを見分けるときに、形や色といったことを情報に見分けていると思います。
    物体認識では物体を分類することに長けているため、こういった見た目によるものの見分けを行います。

    これを動物の行動解析に用いることで、動物の行動をその見た目から分類します。
    YORUのツール内では、これを行動オブジェクト(Behavior object)と呼んでいます。

    トラッキングツールでは行動は点と線で認識され、YORUでは行動をボックスで囲われるように解析されます。

    物体認識による行動定義のメリット

    物体認識による行動のメリットとしては

    ・個体数が増えてもエラーが出にくい

    ・動物の向きに影響されにくい

    ・解析速度が速い

    ・トラッキングでは捉えにくい行動(マウスがうずくまるといったような行動)を捉えられる

    といったことが考えられます。

    トラッキングツールの弱点である、複数個体の行動解析を簡単に、かつ解析コストをかなり抑えて解析することが可能です。
    さらに、身体部位の位置情報による行動定義が困難な行動も簡単に解析可能です。

    例えば、手をあける、閉じるという行動を考えてみましょう。
    トラッキングツールであればカメラで指先をトラッキングして閉じている、開いているを定義すると思いますが、手を閉じたときに指先が見えなくなると、トラッキングできず、位置情報を正確に計算できなくなります。

    しかし、物体認識であれば手がひらいた状態と閉じた状態の手の形を見ているので、一部が見えなくなっても正確に捉えることが可能です。

    個体数増加に強いという理由に関しても、トラッキングツールであれば個体数が増えると、身体部位がどの個体なのかを割り振って、正確に各個体の行動をとらえなければなりませんが、YORUであれば各個体の形状のみで解析するため、個体の識別や各個体への割り振りを行う必要がありません。

    解析速度も速いため、リアルタイム解析が可能であり、ある行動をしたときに装置制御を行うといったことも可能であり、行動実験の自動化を行うことができます。

    物体認識による行動定義のデメリット

    もちろんデメリットもあり、

    ・一連の行動は捉えることができない

    ・個体識別は行えない

    ・未知の行動を捉えることはできない

    ・見た目でわかりにくい行動は捉えられない

    ・定義した行動の詳細がわからない

    といったことがあります。
    これらのデメリットは逆にトラッキングツールの強みとしても挙げられるところであり、どちらが優れているというよりは、メリット・デメリットをお互いに補完し合っているような感じです。

    そのため、実験者は状況に応じた適切な手法を選ぶ必要があります。

    YORUは何がすごいのか

    さて、YORUの根本に使われている物体認識による行動解析のメリット・デメリットを述べましたが、YORUは一体何がすごいのでしょうか。

    全てGUI化されている

    YORUではプログラミングを行うことなく、行動解析を行うことが可能です。

    これはDeepLabCutやSLEAPなどのツールも同様であり、生物学者にとってこれらの解析を使うための一助となります。

    デザイン


    YORUのデザインはこれまでのツールと違い、かなり研究ツールっぽくはない感じがします。

    リアルタイム解析を導入している

    YORUではこれまでのツールでは珍しく、リアルタイム解析のGUIが完備されています。

    リアルタイム解析のシステムを作るのはプログラミングがある程度できればそこまで問題ではありませんが、そうでないとかなりハードルが高いです。

    ただ、YORUでは全てプログラミングなしで、リアルタイム解析、さらには外部トリガーまでを行うことが可能になっています。

    多様な実験装置に適応可能である点

    リアルタイム解析の最も高いハードルとして、自身の実験系の装置を動かすコードとこれらの解析をどのように組み合わせるのかというのがあります。

    YORUではプラグインシステムを導入しており、外部装置を制御するプログラムを選ぶことができます。

    つまり、自身のシステムにあったプラグインを選択すれば良いのです。

    また、プラグインは自作することも可能であり、自身の装置の制御プログラムをプラグインにすることで簡単にYORUのリアルタイム解析と合致させることができます。

    これは他のツールにはない、かなり使いやすいシステムとなっています。

    最後に

    YORUは発表されたてで、まだまだ使いにくい点・ドキュメントの不足が目立ちます。

    しかし、これからこれらが整備されていくことによって、どのように使われていくのか非常に楽しみです。

  • 人生で初めて論文を書いた (体験談)

    研究者にとって論文を書くというのは、とても重要なことであり、研究を世に報告するための作業です。

    論文を書く作業は想像以上に時間がかかり、地味であり、根気のいる作業です。
    だからこそ、最初に自分で書いた論文は自分の中でも印象深いものになります。

    僕自身も、M1で指導教員の指導のもと、一から自分で論文を書くことを経験しました。
    分野にもよりますが、生物学の分野において、修士の学生で、自分で論文の文章を書くことは非常に珍しいことです。
    そもそも論文すら出ないというのが普通ですから。

    レアな経験をさせてもらったことに感謝するとともに、その時の気持ちを忘れないために体験をここに綴りたいと思います。

    論文を書くタイムスパン

    生物学の分野では、論文を書こうと思ってから、実際に論文が掲載されるまでに大体一年かかります。
    論文の形式や規模感にもよりけりですが、化学や工学の分野と大きく異なるのは、論文の内容の多さだと体感しています。

    物質の発見やタンパク質の発見とは異なり、僕が研究している神経行動学という分野は、「この神経がこの行動にこの様に関わっている」というように証明するため、図の数(一つの図の中にグラフが複数あります。)が5を超えることはザラにあります。

    だからこそ、それだけのデータを集め、論文を書き、出版されるまでには他の分野以上に時間がかかると言われています。

    論文投稿までにかかる大体のステップを下に書きます。

    • 原稿を書く(1ヶ月~1年以上)    原稿を書くのはさまざまなことが起こりうるため、実際に順調に行かないことも多々あります。
    • 原稿を人に見てもらう(1ヶ月~3ヶ月)    あったりなかったりですが、お世話になっているその研究には関わっていない人に、読んで内容がわかるかを見てもらう。
    • 英語の校正(約1ヶ月)
    • 論文投稿!!!(Submission) (2日~4ヶ月以上)    リジェクトは2日で帰ってきたりすることもあり、逆にレビューに回ると数ヶ月音沙汰ないこともあるそうです。
    • リバイス対応 (1ヶ月~6ヶ月)    レビュワーからコメントをもらい、足りないデータや内容の修正を行い、再度ジャーナルに送り直します。リビジョンはメジャーリビジョンとマイナーリビジョンとあり、論文の大きな構成が変わる様なことを言われることも多々あります。
    • アクセプト!!!(Accept)    リバイスの対応ができ、ジャーナルからOKが出たら無事アクセプトとなります。ここまで行ったらやっと成果として認められます。
    • 論文掲載に向け体裁を整える(1週間~1ヶ月)   論文がネットや雑誌に掲載されるための体裁の整えなどの最後の仕上げ作業になります。
    • 論文の出版、プレスリリースの作成などなど、、、、    アクセプト後は色々なことがどんどん起こり、忙しくなります。

    論文を書いて、ボタンを押せば出版されるわけではなく、論文はさまざまな人に評価され、論文が論理的に正しいかを第三者の目で見て、認められ、世の中に出版されます。

    僕の体験談

    まず初めに、出版された論文がこちらです。

    4年生で卒論発表を行ったあと、2月の終わり頃に指導教員から論文を書きましょうと提案されました。

    そして、3月から論文を書き始め、12月にジャーナル誌のiScienceに投稿、4月に正式にアクセプトされました。
    論文を書こうとなってからちょうど一年ほど経って出版されるという、非常に順調な論文投稿でした。

    論文を書こうと言われた3月は非常に嬉しく、なるべく早く書いてやろうと意気込んでいました。
    ただ、書いてきてくださいと言われるが、どの様に書けばいいのか全くわからず、とりあえず論文を調べて見様見真似で自分の内容を書いていきました。

    しかし、僕は英語が苦手であるのも相まって、わからないから修正してください。と言われながら修正を続けました。
    ここで、修正したものを送ってくるわけではなくて、ここがわからないから書き直してくださいと言われたのは、当時は本当に辛く、教えてくれよと思う経験でしたが、今となっては自分で書き方を調べて、考えたからこそ、今に生かされているなと感じました。

    先生から言われたのは、研究者を目指すのであれば今後論文を書く機会はいっぱいあり、その時に書けなくなるので、自分で書いてください。と言われました。

    ただやはりきついものはキツく、夏頃はご飯も食べられず、胃腸が弱りきっていました。
    (個人的に文章書くだけなのに、なんでストレスなんだろうって疑問に思うぐらい不思議ですが、体には応えていたみたいですね。)

    なんでここまで辛いのかというと、論文を書いている期間は基本的には実験をやらずに論文を書くことに集中しています。
    ただ、学会があったり、授業や私生活など多くのことが押し寄せてきます。

    論文でうまく行っていないし、実験も進んでないので何も今はしていないのではないかと思えてきます。特に周りが進んでると。。。
    半年に一回あるラボの進捗報告会でも一人だけ全くの進捗がないことの焦り。

    そして、極め付けは誰にも相談できないという環境でした。
    M1で論文を書くというのはイレギュラーであり、他の人からしたら羨ましいことです。
    だからこそ、論文の話題で相談できる相手が研究室におらず、研究に携わっていない人には、文章を書くだけだしと思われるため、理解されずで一人ぼっちでやらなければならないという感覚になりました。

    9月ごろ、どうしても辛くプログラムベースの研究を気晴らしにちょっと進めており、国際学会に出すようの小さい論文を書いていました。
    それが僕的に結構いい気晴らしであり、研究が進まないという不安が軽減されるとともに、小さい論文なので論文も書きやすく、自分の成長を感じられたとともに成功体験という意味で自信になりました。

    そしてそんなこんだで、10月ぐらいには大体の原稿を書き終えました。
    そこで、提出だと思っていたら、先生から
    「他の先生にも見てもらいましょうか!」と言われ、
    「ええええ!!!!????終わりじゃないの????」
    と思ったことは今でも記憶に残っています。

    見てもらった先生からは、非常に的確なアドバイスをいただき、論文が非常に良くなりました。
    論文原稿を人に読んでもらうというのは、非常に重要なプロセスなんだなと体感し、それは論文だけでなく、研究全般に言えることだなと体感しました。

    そして、12月に最初の提出(Initial Submission)をiScienceにしました。

    iScienceは論文雑誌としては、すっごいランクの高いところではないですが、でもランクが決して低いわけではなく、博士論文なども掲載されるぐらいとてもいいジャーナルです。

    僕的には挑戦の枠組みとしてiSicenceを選択しており、7:3で通らない:通る と考えていました。
    なので、リジェクトの連絡を待っていたら、全然連絡が来ず、一週間後ぐらいにレビューに回った報告を受け、非常に嬉しく思ったのと同時に驚きでした。
    指導教員も驚きだった様です。

    そして、レビューのコメントに答えた後、提出し、細かい修正後、正式にアクセプトされました。
    提出後は結構流れに沿う感じで、すんなりといきました。

    個人的には、最初の提出の段階が一番テンションが上がり、かつ達成感のある瞬間でした。

    論文を書くという工程をいかに自分が安易な考えを持っていたのかを実感するとともに、論文を書くという作業はその後の研究の非常にいい経験になることを感じました。

    研究者になりたいのならばまず論文を書け!と言われる所以は、成果などではなく、論文を書くという工程が、自身の研究論理立てて、先を見越し、論文を書くという視点を持って進めていくことの重要性を教えてくれました。

    さまざまなことを学んだ経験であり、自分の研究者人生の最初として、とてもいい経験ができたと思います。

    また後日どの様に論文を書いていったかという、より実務に特化した内容もブログで更新していけたらなと考えているので、楽しみにしておいてください。

  • なぜハエが研究に使われているの?

    モデル生物とは

    研究でよく使われる生物というとみなさんマウスやモルモットが思い浮かぶと思います。
    薬の効能を調べたり、構造を調べたりするのにこれらの動物で検証してから、実際の臨床実験に移行するというイメージだと思います。

    そのイメージは間違ってはいないのですが、他にも研究で使われる生物はたくさんいます。
    メダカ、ゼブラフィッシュ、線虫、大腸菌、酵母、キイロショウジョウバエ、アフリカツメガエル、シロイズナズナ、カイコなどなど。。。。
    これらの生物はモデル生物と呼ばれており、様々な研究が行われています。

    モデル生物とは、その生物を徹底的にみんなで調べることによってその生物を知り尽くし、他の生物に共通する部分や原理の理解を行おうという生物たちです。

    キイロショウジョウバエとは

    このラインナップを見て意外な生物がいくつかいると思いますが、その中でもキイロショウジョウバエはかなり異質だと思います。
    え?ハエ???あの家に出てくるやつ???

    そうです!
    キイロショウジョウバエの学名はDrosophila melanogasterです。
    様々なノーベル賞の研究に関わっており、広く研究に使われています。

    ハエの研究者が集まる日本ショウジョウバエ研究会(JDRC)をはじめ、アメリカやヨーロッパ、アジアなどでもハエの研究の学会があり、さらにはショウジョウバエの神経系のフォーカスしているNeuroFlyやNeurobiology of Drosophilaなど世界規模で研究が行われています。

    ハエの研究のメリットは
    ・中枢神経系を持っていること
    ・遺伝学ツールの豊富さ
    ・バランサー染色体の存在
    ・世代時間が短いこと
    ・飼育のしやすさ
    ・決まった行動パターンを示す

    などなど、たくさん挙げられます。
    世界中の研究者がキイロショウジョウバエという対象を研究することによって、大量のデータベースが作られており、脳では神経細胞と神経細胞のつながりのネットワークほとんど全てわかっています。

    ここまでくると、研究でやることないのでは?と思われるかもしれませんが、確かに神経の繋がりはわかっていますが、それがどのような機能を持っているかはわかっていないことが多いです。

    さらには、免疫系や発生などのパターンに関しても、そこにどのような分子が関わっているのかなど、わかっていない問題が大量にあります。

    ここまでやって何になるの?と思うかもしれませんが、ここまでやるからこそ、生物に普遍的な原理を見つけ出したりすることができるのです!
    これがモデル生物です。

    そして、これらの機構は薬の開発や安全な遺伝子組み換えなどに応用することができます。

    ショウジョウバエ研究の歴史

    1901年になんか有名な人(チャールズ・W・ウッドワース氏)がある人(ウィリアム・アーネスト・キャッスル氏)に遺伝学の材料として勧めたのが始まりとされてるらしいです。
    理由としては、大量飼育が簡単にできるから。とのことです。

    その後、トーマス・ハント・モーガン氏がショウジョウバエを使った遺伝学の研究で有名になります。突然変異体の発見や、遺伝子が染色体状にあることを証明したことなど、遺伝学に大きな影響をもたらしました。

    その後、発生に大きな影響を与えるホメオティック遺伝子の発見が重要な発見として挙げられます。
    さらに、時計遺伝子の発見にも大きな影響を及ぼしました。

    大量に飼育でき、昆虫であり、変異体を簡単に作成できるという利点は他の生物にないメリットであり、だからこそ遺伝学の研究の材料として非常に秀逸なものでした。

    現在では、GAL4/UASシステムの応用、バランサー染色体などが作られ、多様なツールも整備されてきています。

    追加話

    ショウジョウバエの研究をしている研究室では、バイアルと呼ばれる直径3センチ、縦が10センチぐらいの円柱で飼育しています。
    そして、そのバイアルが大量に置かれている飼育部屋と呼ばれる部屋が大体あります。

    ハエが汚いのでは?と思う方もいると思いますが、餌は酵母の入ったゼリーのようなものであり、生肉等をあげているわけではないので、菌が増えるといったことはありません。

    生命力は割と強く、比較的簡単に飼育できます。
    だからこそ、長く研究されてきているのでしょう。

    解剖等をするときは、実体顕微鏡を使って、ピンセットで手作業で行います。
    長さが2.5mmぐらいのハエをピンセットで解剖します。

    行動実験もすることができ、工夫の凝らされた装置で様々に研究が行われています。

    また、ハエの素晴らしいところは世界のいくつかの場所にストックセンターがあり、そこにはどこかの研究室で制作した特定の遺伝子操作を施したハエがたくさん飼育されている場所があり、そこから欲しい系統を手に入れることができます。

    なので、自分自身でハエの系統を作る必要がなく、すぐに実験を開始することができます。
    (自分で遺伝子を操作しようとすると3ヶ月以上はかかります。)
    まさに、巨人の肩の上に立つですね。

    ショウジョウバエの研究を始めると、他の生物の研究ができなくなると生物学者は言っており、ショウジョウバエは研究に適している生物であることを物語っています。

  • PWM出力を使ってパルス波の周波数, Duty比を変更する [Arduino UNO]

    PWM出力を使ってパルス波の周波数, Duty比を変更する [Arduino UNO]

    PWM出力とは

    PWMとはpulse width modulationの略で、パルス幅変調と日本語では言います。
    波長のデューティー比(Duty cycle)を変えることによって、変調を行う方法です。

    詳しくは前回の記事で説明されています。

    ArduinoのPWM出力

    Arduino UNOではATmega328と呼ばれるMicrochip社のマイコンをメインチップとして使っています。
    Arduinoのプログラムを考える上で、深みにハマっていくとマイコンのデータシートを見ていかなければならなくなりますので、一回見てみると面白いかと思います。(事実今がそう)

    Arduinoには三つのタイマー(Timer/Counter)があります。
    このタイマーはArduinoプログラムの時間に関係しています。
    delay()やtone()などの関数はこのタイマーを使って計測されています。

    Timer/CounterPin番号ビット数役割PWM周波数
    Timer05, 68 bitArduinoの時間を管理
    delay(), millis(), micros()など
    977 Hz
    Timer19, 1016 bitServoライブラリなど490 Hz
    TImer23, 118 bittone()など490 Hz

    今回このタイマーをいじることでPWMの出力を変えるということをします。
    ちなみに、応用するとタイマーの根本を変えるので、delay()などの関数もいい感じに変えたりすることができたりするかも?(どちらかというと影響を受けて狂ったりすることの方が多そう)

    TImer0は基本的にシステム全体に関わることが多いので、TImer1を使用することをお勧めします。

    参考になるサイト集
    https://playground.arduino.cc/Main/TimerPWMCheatsheet/
    https://www.arduino.cc/en/Tutorial/SecretsOfArduinoPWM
    https://atooshi-note.com/arduino-1hz-pwm/
    http://blog.kts.jp.net/arduino-pwm-change-freq/
    http://garretlab.web.fc2.com/arduino/inside/hardware/arduino/avr/cores/arduino/wiring_analog.c/analogWrite.html

    プログラムの概要

     プログラムの全体の方針として、Arduinoのタイマーをレジスタの設定を変えることで自由にPWM出力の周波数を変更することができるようにします。

    目的としては、低い周波数を出力できるようにしたく、10 Hzを出力できるようなプログラムにします。

    今回は10番ピンにLEDを繋いで、その光の周波数、Duty比を自由に変更できるようにするプログラムを作成します。
    10番ピンなので、TImer1を使用します。

    プログラムコード

    //レジスタの設定を変えるためのもの
    #include <avr/io.h>
    int PWMPin = 10;
    
    //関数の定義
    //frq:周波数 (1Hz~指定できる)
    //duty:指定したいduty比
    void HzWrite(int frq, float duty) { 
    
        // モード指定
      TCCR1A = 0b00100001;
      TCCR1B = 0b00010100; //分周比256を用いる
    
      // TOP値指定
      OCR1A = (unsigned int)(31250 / frq);
    
      // Duty比指定
      OCR1B = (unsigned int)(31250 / frq * duty);
    }
    
    
    void setup() {
      pinMode(PWMPin, OUTPUT);
    }
    
    void loop() {
      HzWrite(10, 0.5);
      delay(5000);
      digitalWrite(PWMPin, LOW);
      delay(5000);
    
    }

    プログラムの説明

    まず、レジスタの設定を変えるために、<avr/io.h>をインクルードします。

    #include <avr/io.h>

    次に、delay()と一緒に使って、10 Hzの出力を5秒ごとに繰り返すという関数を作るため、HzWriteという関数を指定します。カッコ内には周波数、Duty比を指定できるようにします。

    void HzWrite(int frq, float duty) { 
    
    }

    次にモードの指定です、。
    今回使うレジスタはTCCR1A/TCCR1Bです。(TCCR: Timer/Counter Control Register)
    ここで1というのはTImer1を示しており、Timer2を使いたければTCCR2A/TCCR2Bを使います。

    PWM周波数を〇〇Hzとして設定するには、TOP値を自分で指定する必要があります。
    TOP値が大きければ大きいほど出力される周波数は低くなります。
    今回は10 Hzで例を取っているので、16MHzというシステムクロックと比べると非常に遅いので、大きなTOP値と分周を指定する必要がある。よって、なるべく大きいTimer1を使用します。


    Timer0, 2の8 bitではTOP値の最大値は255(2^8 – 1)であり、Timer1の16 bitでは65535(2^16 – 1)となる
    (最大値が-1となるのは、0~255もしくは0~65535となるため、数字の数が2^xになるが、最大値は-1しなければならない。)

    システム的には、TOP値までカウンタをインクリメント(0, 1, 2, と数えていく)し、OCRxA/OCRxB(xはカウンタ番号、カウンタについて2つの出力ピンA, Bが割り当てられている。)と一致した時にピンの出力を変化させる(LOW→HIGHのように)。そして、カウンタがTOP値まで到達すると今度は0までデクリメント(65535, 65534, 65533と上から数えていく)し、インクリメントの時と同様にOCRxA/OCRxBと一致した時にピンの出力を変化させます。

    Arduino UNOではこのカウンタのインクリメントするスピードは分周比の設定を変えることによって、ある程度変えることができます。(ある程度とは、1/8/64/256/1024 の中から選択できるということ)
    分周比は周波数を分周(周波数を1/n倍すること)するときの比(n)です。
    つまり、1000 Hzを分周比10で分周すると100 Hzになります。

    ちなみに、分周比1ではArduino UNO(ATmega328)のシステム動作クロックである16MHzで操作します。

    つまり、TOP値とOCRxA/OCRxBの値、分周比を変えることによって、自由に出力の変換点を変えることができます。

    今回は10Hzを指定したいので余裕を持って分周比256で行います。
    1カウントする時間は、Unoなら16MHzなので1 / 16MHz = 62.5ns(分周1)
    分周比を256にすると、TOPまでカウントした際には62.5ns x 256 x 65535 = 1.04856 secなので、1 Hzを指定できるようになる。

    今回このプログラムでは1 Hz ~ 31250 Hzまでの周波数を作り出すことができる。
    しかし、31250に近づくにつれてDuty比の指定ができなくなっていきます。
    Duty比を細かく設定したい際には300 Hz程度までしか作成することができません。

    このプログラムでは分周比の設定を変更することで、自分の使用用途にあった周波数帯を作れるようなプログラムを作ることができます。

    TCCRaA/TCCR1Bには何を指定するのかを書きます。
    ここら辺の細かいところはなんか難しいので、データシートを使って、なんとなく指定していきましょう。

    今回は2進数で示しているので、最初に0bがついています。TCCR1AではCOM1A1, COM1A0, COM1B, 無指定, 無指定, WGM11, WGM10 を 1 か 0 で設定します。
    TCCR1B には それぞれ、無指定(ICNC1), 無指定(ICES1), 無指定, WGM13, WGM12, CS12, CS11, CS10 を設定します。

    TCCR1Aの指定(ATmega328データシートより)
    TCCR1Bの指定(ATmega328データシートより)

    まず、今回はModeはPWMモードがPhase Correct and Frequency Correct であるMode9を指定する。
    今回TOP値OCR1Aに指定する。

    モードの指定(ATmega328データシートより)

    よって、WGM13 / WGM12 / WGM11 / WGM10 はそれぞれ、1,0,0,1 

    出力の指定(ATmega328データシートより)

    COM1B0 / COM1B0 は 0, 0 が 無出力、0, 1 が トグル動作 (一致時の出力を反転)、
    1, 0 は カウンタ がOCR1A/B – TOP間 にある場合 LOW、0 – OCR1A/B間 は HIGH となるよう出力、
    1, 1 は1, 0 の逆です。

    今回は周波数をOUTPUTのLEDをLOWとHIGHで変えるため、1B0 / COM1B0 は1, 0の値を指定します。

    スケッチを書く際にわかりやすいので 1, 0 を選択します。

    分周比の指定(ATmega328データシートより)

    今回分周比は256を指定するため、CS12/CS11/CS10は1, 0, 0を指定する。

    まとめると、以下のようになる。

    TCCR1A = 0b00100001;
    TCCR1B = 0b00010010;

    次にOCR1AとOCR1Bを設定し、周波数とDuty比を指定したもので出力してもらうように指定します。

      // TOP値指定
      OCR1A = (unsigned int)(31250 / frq);
    
      // Duty比指定
      OCR1B = (unsigned int)(31250 / frq * duty);

    今回Phase and Frequency Correct PWMを用いる際には、インクリメントしディクリメントすることから、出力される周波数は以下のように示すことができます。

    周波数frq = IC の動作周波数 / (分周比 * TOP値 * 2)

    逆にTOP値を指定するときは

    TOP値 = IC の動作周波数 / (分周比 x frq x 2)

    今回Arduino UNOで分周比256とした際には

    TOP値 = OCR1A = 16,000,000 / (256 x frq x 2) = 31250 / frq

    LOWとHIGHが入れ替わるタイミングはOCR1A/OCR1B = Duty比としたいため、

    OCR1B = 31250 / frq x duty

    オーバーフローを防ぐため、Unsigned intを指定している。

    出力のメインはこちら

    void setup() {
      pinMode(PWMPin, OUTPUT);
    }
    
    void loop() {
      HzWrite(10, 0.5);
      delay(5000);
      digitalWrite(PWMPin, LOW);
      delay(5000);
    
    }

    PWMPinつまり10ピンをOUTPUTで指定し、HzWrite()で周波数とDuty比を指定する。
    delay()でまった後に、digitalWrite(PWMPin, LOW)で出力をなくし、delay()する。

    以上がプログラムの全貌と解説です。

    後書き

    PWM出力の周波数を変更する方法のブログに関して、Arduinoで検索するよりも、AVRとか、ATmega328, 328Pなどのように検索した方が多く出てきました。

    今回はざっくりとしたブログでしたが、より深く知りたい人は調べてみてください。

  • Python Video Annotatorインストール方法

    Python Video Annotatorインストール方法

    Python Video Annotatorとは

    Python Video Annotatorとは、撮影した動画を解析、動画内のイベントを時系列的にノートすることができるアプリケーションです。

    神経科学や行動学の研究者が、動物の動画を撮影し、その動物たちの行動を解析、定量するためなどに利用することができます。
    例として、マウスの行動を記録する際に、舌を出す、尻尾を振る、耳を動かすなど、記録したい行動があったとします。
    それが、動画のいつ起こっていて、どれぐらいの時間継続しているのか。
    毎度動画を見て、エクセルに記録するのだと、定義した行動が多いとあまりに大変です。
    こういったツールを用いることで、動画にノートとして記録し、時間情報やイベント情報を取り出すことができます。

    元々、動物の行動を記録するアプリケーションとして、VCodeと呼ばれるオープンソースのソフトがありました。
    しかし、現在のパソコンのOSに対応していないという問題がありました。

    Python Video Annotatorでは、最新のPCに対応し、必要な機能は残しつつ、さらに外部のセンサー情報(圧力計など)やDeepLabCutなどの行動定量ツールと組み合わせることができ、非常に研究を行う人にとって有用なツールとなっています。

    インストール方法

    ホームページにインストール方法は詳しく書かれていますが、僕のパソコンではうまく入れることができませんでした。(多分そのままインストールしたら、元々インストールされているパッケージとの相性が悪かったのかもしれません。)
    そこで、GitHubのサイトに記載されている、Anacondaを使って仮想環境を構築、インストールするという方法を行いました。

    言葉で言うと難しそうですが、やることは非常に簡単です。
    現在(2021年10月20日地点)では最新のmacOS(Big Sur 11.6)には対応していないらしく、近日中に改善されると思われます。
    なので、今回はWindowsを例にとって説明します。

    ただ、macOSでもAnacondaを入れて、condaコマンドを使えるようにしてからは基本的には操作は一緒なので、使えるようになったら参考にしてください。(詳しくは前回の記事より)

    Anacondaをインストールし、Anaconda promptを開きます。
    そして、仮想環境を作成し、仮想環境をアクティベートしましょう。

    conda create -n videoannotator python=3.6
    conda activate videoannotator

    その後、必要なパッケージをインストールします。

    pip install opencv-python-headless pyqt5==5.14.1 pyqtwebengine==5.14.0

    その後、python Video Annotatorをインストールします。

    pip install python-video-annotator

    色々処理が終わったらインストール完了です。

    起動するときは、仮想環境をアクティベートしてから、実行します。

    conda activate videoannotator
    start-video-annotator

    これでソフトが起動したら完了です。