Nefrockの日記 2023-11-27T14:30:09+09:00 nefrock Hatena::Blog hatenablog://blog/10257846132702518865 インターン2023 参加報告 Bluetoothアプリ開発編 hatenablog://entry/6801883189053384371 2023-11-27T14:30:09+09:00 2023-11-27T14:30:09+09:00 はじめに はじめまして、nefrockの2023年度インターンシップに参加した東京工業大学修士1年の森合です。 今回は、私がインターンシップで担当させていただいたBluetoothを用いた文字列送信システムについて、その内容を紹介させていただきます。 はじめに インターンのテーマ 実装方針 AndroidスマートフォンのBluetoothキーボード化 日本語の送信 UI 実装物 Bluetooth接続部 送信機能部 実装中にぶつかった問題点と解決策 再接続について 送信機能の不安定性 謝辞 インターンのテーマ Nefrockでは「EdgeOCR」というハイスピードで文字を読み込むことのできるア… <h4 id="はじめに">はじめに</h4> <p><span style="font-style: normal; font-variant-caps: normal; font-weight: 400; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; caret-color: #454545; color: #454545; font-family: Poppins, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', Helvetica, Arial, 'Hiragino Kaku Gothic Pro', Meiryo, sans-serif; font-size: medium; letter-spacing: 1.28px; background-color: #ffffff; float: none; display: inline !important;">はじめまして、nefrockの2023年度インターンシップに参加した東京工業大学修士1年の森合です。</span></p> <p>今回は、私が<span style="font-style: normal; font-variant-caps: normal; font-weight: 400; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; caret-color: #454545; color: #454545; font-family: Poppins, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', Helvetica, Arial, 'Hiragino Kaku Gothic Pro', Meiryo, sans-serif; font-size: medium; letter-spacing: 1.28px; background-color: #ffffff; float: none; display: inline !important;">インターンシップで</span>担当させていただいたBluetoothを用いた文字列送信システムについて、その内容を紹介させていただきます。</p> <p> </p> <ul class="table-of-contents"> <li><a href="#はじめに">はじめに</a></li> <li><a href="#インターンのテーマ">インターンのテーマ</a></li> <li><a href="#実装方針">実装方針</a><ul> <li><a href="#AndroidスマートフォンのBluetoothキーボード化">AndroidスマートフォンのBluetoothキーボード化</a></li> <li><a href="#日本語の送信">日本語の送信</a></li> <li><a href="#UI">UI</a></li> </ul> </li> <li><a href="#実装物">実装物</a><ul> <li><a href="#Bluetooth接続部">Bluetooth接続部</a></li> <li><a href="#送信機能部">送信機能部</a></li> </ul> </li> <li><a href="#実装中にぶつかった問題点と解決策">実装中にぶつかった問題点と解決策</a><ul> <li><a href="#再接続について">再接続について</a></li> <li><a href="#送信機能の不安定性">送信機能の不安定性</a></li> </ul> </li> <li><a href="#謝辞">謝辞</a></li> </ul> <h4 id="インターンのテーマ">インターンのテーマ</h4> <p style="font-style: normal; font-variant-caps: normal; font-weight: 400; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; caret-color: #454545; color: #454545; font-family: Poppins, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', Helvetica, Arial, 'Hiragino Kaku Gothic Pro', Meiryo, sans-serif; letter-spacing: 1.28px;">Nefrockでは「EdgeOCR」というハイスピードで文字を読み込むことのできるアプリケーションを開発・提供しています。こちらは、スマートフォン上でOCRモデルを直接推論させることで高速な文字読み取りを実現するものになっています。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Fedge-ocr.com" title="EdgeOCR by Nefrock" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="http://edge-ocr.com"> </a></cite></p> <p><cite class="hatena-citation"><a href="http://edge-ocr.com">edge-ocr.com</a></cite></p> <p>この「EdgeOCR」で読み取った文字列を、パソコンなどの別の端末上に送信するのが今回の開発の目的となっています。今回のインターンではこの送信のための手段としてBluetoothのキーボード機能に着目しました。Bluetoothは、さまざまなOS、機器に対応する汎用的な通信規格であり、さらにキーボード機能であれば受信側の機器に特別な準備を施すことなく簡単に利用できます。実際、現場では「EdgeOCR」の読み取り結果を直接Excelなどに入力したいというモチベーションがあり、Bluetoothキーボードでの送信はこのような問題を解決する最も手軽な手段の一つとなります。</p> <p>今回のインターンでは、このBluetoothキーボード送信を既存の「EdgeOCR」アプリケーションの拡張機能のような形で実装することを担当しました。</p> <h4 id="実装方針">実装方針</h4> <h5 id="AndroidスマートフォンのBluetoothキーボード化">AndroidスマートフォンのBluetoothキーボード化</h5> <p>まずはAndroidスマートフォンをBluetoothキーボード化する方法を探す必要があります。これについては、私がインターンに着手した時点ですでにチューターの方がサンプルコードを探してセットアップまで済ませて下さいました。</p> <p>Bluetoothは用途毎に異なるプロファイルが定義されており、AndroidのBluetooth APIではこれらのプロファイルの操作がサポートされています。今回の場合では、HID(<span style="font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; caret-color: #333333; color: #333333; font-family: 'Noto Sans JP', sans-serif; font-size: 15px; text-align: left; background-color: #fdfdfd; float: none; display: inline !important;">Human Interface Device</span>)のプロファイルを用いることで、スマートフォンからホスト側のコンピューターにキーボードのキーを押す、離すといった操作をコードとして送信することができます。</p> <h5 id="日本語の送信">日本語の送信</h5> <p>Bluetoothキーボードで送信を行う関係上、直接入力ができるのはアルファベットや数字、いくつかの記号だけです。ご存知の通り、日本語をキーボードで入力する際には一般的に予測変換を用いる必要があり、Androidからこの予測変換を自動制御するのはBluetooth通信だけでは不可能です。しかしながら社長様より、この問題を解決しうる情報を提供していただきました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2Fnanbuwks%2Fitems%2Fa791f99ff7773d1313b6" title="HID キーボードから Unicode で日本語を入力する - Qiita" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://qiita.com/nanbuwks/items/a791f99ff7773d1313b6">qiita.com</a></cite></p> <p>このQiita記事に従い、WindowsのIMEを有効にした状態で「Unicodeの16進数表記+f5キー+任意のアルファベット+backspace」を送信すると、確かに任意の文字が入力できることが分かりました。また後日の調査にて同様のUnicode入力がMacの場合でも少し操作を変えることで実現できることもわかりました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2Ftoracatman%2Fitems%2F9f609a22b5ad43a4fc4a" title="コードポイントからUnicode文字を入力する方法 (Windows、Mac、Linux) - Qiita" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://qiita.com/toracatman/items/9f609a22b5ad43a4fc4a">qiita.com</a></cite></p> <p>今回の実装では、WindowsとMacの場合のUnicode入力をサポートすることにしました。</p> <h5 id="UI">UI</h5> <p>基本は「EdgeOCR」のAndroid向けデモアプリのUIを踏襲することになります。</p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="デモアプリのUI"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/r/ryo_mori_A1/20231026/20231026155713.png" width="220" height="480" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">デモアプリのUI</figcaption> </figure> <p>デモアプリでは、上記のように認識した文字列に合うようにオーバーレイボックスが表示されるような実装が施されています。最初の時点では、このオーバーレイボックスをタップした時に、その文字列を送信する構成を考えました。しかし、この構成の場合、誤タップで文字列が送信されてしまった時に修正のためにbackspaceを押す手間がかかります。また、Unicode入力のために送信するキーコードはOSごとに分ける必要があります。以上のことから、タップと送信の間にもうワンステップ手順を挟んだ方が良いという結論に至りました。</p> <h4 id="実装物">実装物</h4> <figure class="figure-image figure-image-fotolife mceNonEditable" title="実装物のトップ画面"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/r/ryo_mori_A1/20231026/20231026182705.png" width="220" height="480" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">実装アプリケーションのトップ画面</figcaption> </figure> <h5 id="Bluetooth接続部">Bluetooth接続部</h5> <p>最初の接続時と2回目の接続時で接続方法を分けました</p> <p>・最初の接続時</p> <p>トップ画面のStartボタンを押すとBluetoothの外部からの接続の許可を求めるホップアップが表示され、アプリケーション内部でHIDプロファイルのオブジェクトが立ち上がります。この状態でホストコンピュータ側からBluetooth接続を行うことで、Bluetooth HIDでの接続が確立します。</p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="外部からのデバイスの発見の許可を求めるホップアップ"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/r/ryo_mori_A1/20231026/20231026183609.png" width="220" height="480" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">外部からのデバイスの発見の許可を求めるホップアップ</figcaption> </figure> <p> </p> <p>接続に成功すると、画面上部に接続されたデバイス名が表示されます。この状態でCAMERAボタンを押すことでメインのOCR+文字列送信の機能を利用できます。</p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="接続済みを知らせるテキスト"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/r/ryo_mori_A1/20231026/20231026183732.png" width="220" height="480" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">接続済みを知らせるテキスト</figcaption> </figure> <p>・2回目の接続時</p> <p>再接続時には、android側から接続を行えるように、RESTARTというボタンを追加で設置しました。このボタンを押すと再接続用の画面が表示され、利用しているAndroidにペアリングされたBluetooth機器がリストで表示されます。そのリストから接続したい機器を選択してタップするとAndroid側からHIDプロファイルでの接続のリクエストが出されます。そうして接続が確立すると送信機能画面に自動で遷移します。</p> <h5 id="送信機能部">送信機能部</h5> <p>メインの送信機能部分は次のような仕上がりになりました</p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="イメージ図"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/r/ryo_mori_A1/20231026/20231026173339.png" width="220" height="480" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">メイン機能のUI部</figcaption> </figure> <p>今回のアプリケーションでは、カメラ画面の上部にテキストボックスを用意し、そこにタップされた文字列を一度挿入し、送信自体は別のボタンで行うようにしました。</p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="画面中に複数文字列が存在していても、タップでそれぞれを登録可能"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/r/ryo_mori_A1/20231026/20231026173915.png" width="220" height="480" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">タップすると、その文字列がテキストボックスにセットされる</figcaption> </figure> <p>送信のボタンは基本の送信ボタンとOS別のボタンの3種用意しました。基本の送信ボタンは、小文字・大文字・数字などの基本のキーボード入力で送れる文字だけを直接送信するようになっています。OS別のボタンでは前章で紹介したようなUnicode入力を行うことができます。</p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="実際にWindowsにUnicode入力を行った際の図"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/r/ryo_mori_A1/20231026/20231026174844.gif" width="220" height="480" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">カメラの向こうのWindowsにUnicode入力を行う</figcaption> </figure> <p>また画面の下部には上下左右キーとbackspaceキーに対応するボタンを配置しました。これは文字列をExcelなどの表編集ソフトに入力する際にスマートフォンの画面だけで操作が完結できるように配置しています。</p> <p> </p> <h4 id="実装中にぶつかった問題点と解決策">実装中にぶつかった問題点と解決策</h4> <h5 id="再接続について">再接続について</h5> <p>上記の通り、今回の実装物では、初回と2回目以降でbluetooth接続の手法を分けました。そもそも今回利用したHIDプロファイルは、事前に確立したAndroidとWindowsの接続に後乗りする形で利用することはできず、初めからHIDプロファイルに従って接続を行う必要がありました。なので上記で示したような手順を踏んで接続行うのですが、困ったことに一度すでにペアリングされた状態でWindowsから接続の試行を行う手段がありませんでした。調べたところによると、windowsでは一度ペアリングされたHID機器はBluetoothをオンにすると再接続の処理が自動で行われるそうなのですが、今回アプリケーションではAndroidを無理やりHIDとして認識させたからかこの再接続がうまく行われませんでした。</p> <p>そこで、Bluetooth HIDのAPIの機能を用いてAndroid側からホスト側に接続する機能を増設することになりました。Bluetooth HIDのAPIでは、ホスト側のBDアドレスさえ知っていれば、能動的な接続が可能です。今回の場合では、Android OSに保存されたペアリング機器の情報からBDアドレスを取得することで、能動的な接続を行なっています。</p> <h5 id="送信機能の不安定性">送信機能の不安定性</h5> <p>文字列送信機能を実装した当初、適切な文字が送信されない事態が多々発生しました。最初はパケロスのようなbluetooth側の問題によって生じた問題ではないかと疑い、調査を行なっていたのですがのちに、その原因は全く別のものであることが発覚しました。</p> <p>今回のアプリでは、文字列の送信を行う際、一度送信すべきコードをキューに貯め、別スレッドからキューに貯めたコードを送信するようになっています。このスレッドでは、一つのコードが送信されてから次のコードが送信されるまでの間に10ミリ秒ほどのディレイをとることで受信側がパンクを起こさないようにする工夫が取られていました。しかしながら、このスレッドがコードの不備により複数立ち上がってしまっており、結果としてディレイの意味をなさなくなってしまっていたことがわかりました。これが前述の不安定挙動の原因でした。</p> <p>この件は、自身の実装物が不具合を起こした時はまずは自身のミスを徹底的に洗うべきという強い教訓になりました。</p> <h4 id="謝辞">謝辞</h4> <p>今回のインターンに際しまして、Android開発初心者の私にAndroid studioのセットアップから手取り足取り教えてくださり、Bluetooth HIDの初期セットアップまでしてくださったチューター様、Unicode入力についての情報をはじめとして様々なアドバイス、情報提供をしてくださった社長および社員・関係者の皆様方の皆様方に深く感謝を申し上げます</p> <p>開発初心者の私が今回の開発インターンを完遂できたのは、皆様が私を暖かく迎えてくださり(なんと昼食まで皆様にめちゃくちゃ奢っていただきました!)、お忙しい中でさまざまなサポートをしてくださったおかげです。重ね重ね感謝を申し上げます。</p> <p>一ヶ月間、すごく楽しいインターンでした!!</p> <p> </p> <p> </p> ryo_mori_A1 Internship 2023: Benchmarking EdgeOCR on Android hatenablog://entry/6801883189060751284 2023-11-22T17:08:55+09:00 2023-11-22T17:08:55+09:00 Introduction As a first-year international student at Tokyo Tech, my pursuit of an internship led me to discover Nefrock, through a list of companies contracted with Tokyo Tech. Nefrock was 5 minutes away so I figured I would go with my CV in person. That must have left an impression, because after … <p><strong>Introduction</strong></p> <p><span style="font-weight: 400;">As a first-year international student at Tokyo Tech, my pursuit of an internship led me to discover Nefrock, through a list of companies contracted with Tokyo Tech. Nefrock was 5 minutes away so I figured I would go with my CV in person. That must have left an impression, because after a couple interviews I was accepted for an internship.</span></p> <p> </p> <p><span style="font-weight: 400;">At Nefrock, I was assigned to work on the EdgeOCR project. EdgeOCR is a library that facilitates reading text with Latin and Japanese letters from a camera feed in real time (Optical Character Recognition), and is mainly designed to be run on mobile devices (on the “Edge”). To achieve this, it uses two separate types of AI (neural networks): The first determines where on the current frame text is visible (detection), while the second AI then reads the text at those locations (recognition). Using the EdgeOCR SDK, users can easily build applications to read, for example, expiration dates on food packaging.</span></p> <p> </p> <p><span style="font-weight: 400;">An important part of EdgeOCR is its real time performance. My task at Nefrock was to create a benchmark suite for the library to continuously monitor the performance during its future development. Using benchmarks, bottlenecks in performance can be determined, and possible performance degradation due to new code updates can be detected.</span></p> <p> </p> <p><strong>Benchmarking</strong></p> <p><span style="font-weight: 400;">Micro benchmarks are the easiest kind of benchmark to code, and as such were a good opportunity to study the structure of the EdgeOCR library. Micro benchmarks measure the runtime duration of individual functions in isolation. This kind of benchmarking is fairly common, and mature open-source libraries exist to make this task easier. I picked google-benchmark, which I first had to learn how to use, but it quickly allowed me to write benchmarks of functions from image pre-processing to the post-processing of neural network output.</span></p> <p> </p> <p><span style="font-weight: 400;">With the most important functions measured, and a better understanding of how the library works, the next goal was to simulate the actual use case of the library: Running the full text recognition pipeline on a continuous stream of images. For this, I came up with a simulation that feeds images to the library at a fixed frame rate of about 30fps. I achieved this by skipping frames if processing of the previous frame was not yet finished. This mimics the behavior of a phone camera.</span></p> <p><span style="font-weight: 400;">One restriction was that I was asked to make as few modifications to the library as possible.</span></p> <p><span style="font-weight: 400;">Due to this restriction, I chose  </span><strong>Perf</strong><span style="font-weight: 400;"> to profile the execution of this simulation. Perf is a Linux command that uses so-called performance counters to sample processes. It will sample the program thousands of times per second, and allows us to track which library function was executed at any given time during the execution, including its call stack.</span></p> <p> </p> <p><span style="font-weight: 400;">By default, it will output a list that will look something like the following:</span></p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/d/derpda/20231122/20231122104030.png" width="1200" height="671" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p><span style="font-weight: 400;">This one dimensional list is hard to interpret, and thus not very useful. Flame Graphs are a common visualization tool for this kind of data. They better represent the hierarchical nature of the call stacks, and allow detection of bottlenecks at a glance.</span></p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/d/derpda/20231122/20231122112832.png" width="1200" height="666" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p><span style="font-weight: 400;">Using the default options when running perf, I found that in both the list and the flame graph many functions were only represented by a number (a pointer), and not by their actual name. This means that debug symbols were not properly associated with the functions. The problem resides in the fact that the stack that stores the call graph information was not large enough. Indeed, by increasing or decreasing this stack we can observe the share of the unknown fluctuate. Setting a proper size with a command line argument largely fixed this problem.</span></p> <p><span style="font-weight: 400;">Aside from this issue, we can see that most of the time is spent inside the forward (neural network invocation) functions, which is to be expected. The careful reader may notice that the stack containing the text recognition invocation is listed separately from the “main” function. Recognition work is actually done asynchronously on separate threads, and in perf this leads to them not showing up as part of the “main” function invocation. Recognition is run asynchronously to allow for more frequent execution of the detection network, which in turn allows for smoother tracking of detected text across frames. Certain optimizations in EdgeOCR depend on this tracking.</span></p> <p> </p> <p><strong>Profiling on Android</strong></p> <p><span style="font-weight: 400;">The actual target devices for the EdgeOCR library are Android phones. However, so far all benchmarks were only run on a regular computer. The reason is that Android phones generally use Arm processors, requiring cross-compilation, and are also generally harder to use during development due to restrictive permissions (for example, execution permissions are only available in select folders like `/data/local/tmp`). </span></p> <p><span style="font-weight: 400;">The cross-compilation problem was luckily rather easy to solve since a setup for cross-compilation of the library for Android phones was already in place. Adding the simulation compilation to this setup took little effort. However, when executing the simulation, the frames would refuse to load. It turns out that OpenCV cannot load video files on Android, and I had to resort to extracting the individual frames to image files, and loading them separately.</span></p> <p><span style="font-weight: 400;">Another problem is that `perf` itself is not available on Android. Luckily there is a near drop-in replacement called `simpleperf`, which was another reason I chose `perf` in the first place. When processing the profiling data gathered on the phone, I discovered that debug symbols were not available and the flame graph would contain only “unknown” functions. There are scripts which allow gathering of the necessary debug symbol data in a form that the flame graph creation scripts can read. While this did work quite well, I sadly did not have time to write scripts to automate this process before the internship period ended.</span></p> <p><br /><br /></p> <p><strong>The Remaining Tasks</strong></p> <p><span style="font-weight: 400;">Aside from completing the scripts to automate the creation of the flame graph from the execution on the phone, making this benchmarking process a part of the CI/CD pipeline of the EdgeOCR library is a significant task. Ideally, the benchmarks could be run on a set of Android phones automatically whenever changes are made, and a warning could be given if performance degrades due to these changes.</span></p> <p> </p> <p><strong>Thanks</strong></p> <p><span style="font-weight: 400;">I would like to thank Peter for recommending me for this internship even though I was not fluent in Japanese and for helping me throughout the internship. I would also like to thank Nefrock CEO Toshiyuki and his team for recruiting me, for their warm welcome, and for allowing me to have a flexible schedule.</span></p> <p><span style="font-weight: 400;">Thank you for this month spent together.</span></p> <p><br /><br /></p> derpda インターン2022 参加報告 そのに hatenablog://entry/4207112889935054127 2022-11-25T08:30:30+09:00 2023-05-23T15:04:41+09:00 はじめに みなさんこんにちは!NefrockのWEBシステム開発コースでインターンシップに参加した,東京工業大学の小澤真実です. 大学では機械学習と創薬について研究しているのですが,インターンシップでは「社内システムを管理するWEBアプリケーション開発」という全く異なる分野で参加させていただきました.今回の記事ではその内容について紹介したいと思います. はじめに インターンのテーマ 担当箇所 実装物 モデルの一覧表示画面 Compositeモデル新規登録画面 ダイアログ まとめ 振り返ってみて 謝辞 インターンのテーマ Nefrockでは「Edge-OCR」というハイスピードで文字を読み込むこ… <h3 id="はじめに">はじめに</h3> <p>みなさんこんにちは!NefrockのWEBシステム開発コースでインターンシップに参加した,東京工業大学の小澤真実です.</p> <p>大学では機械学習と創薬について研究しているのですが,インターンシップでは「社内システムを管理するWEBアプリケーション開発」という全く異なる分野で参加させていただきました.今回の記事ではその内容について紹介したいと思います.</p> <p> </p> <ul class="table-of-contents"> <li><a href="#はじめに">はじめに</a></li> <li><a href="#インターンのテーマ">インターンのテーマ</a></li> <li><a href="#担当箇所">担当箇所</a></li> <li><a href="#実装物">実装物</a><ul> <li><a href="#モデルの一覧表示画面">モデルの一覧表示画面</a></li> <li><a href="#Compositeモデル新規登録画面">Compositeモデル新規登録画面</a></li> <li><a href="#ダイアログ">ダイアログ</a></li> </ul> </li> <li><a href="#まとめ">まとめ</a></li> <li><a href="#振り返ってみて">振り返ってみて</a></li> <li><a href="#謝辞">謝辞</a></li> </ul> <p> </p> <h3 id="インターンのテーマ">インターンのテーマ</h3> <p>Nefrockでは「Edge-OCR」というハイスピードで文字を読み込むことのできるアプリケーションを開発・提供しています.</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fedge-ocr.com%2F" title="Edge-OCR" class="embed-card embed-webcard" scrolling="no" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy" frameborder="0"></iframe><cite class="hatena-citation"><a href="https://edge-ocr.com/">edge-ocr.com</a></cite></p> <p>今回のインターンシップでは,このEdge-OCRを利用する顧客・画像認識モデルの管理を社内で容易に行えるシステムを開発することが目的となっていました.</p> <p>具体的には,</p> <ul> <li>顧客がどういう条件でEdge-OCRを利用できるのかどうかなどの顧客情報</li> <li>どんなタイプのモデルがあるのかなどのモデル情報</li> </ul> <p>などの管理が必要でした.</p> <p>これらの情報を,直接データベースに手を加えるのではなく,管理システムを通して管理・編集を行えるようにすることがインターンシップのテーマでした.</p> <p>実装には,フレームワークとしてFlutterを,バックエンドとしてFirebaseを利用しました.</p> <p> </p> <h3 id="担当箇所">担当箇所</h3> <p>本インターンには私を含めた2名が参加していたため,上記の二つの要件を担当箇所を分担して実装を行いました.</p> <p>このうち,私は「どんなタイプのモデルがあるのかなどのモデルについての情報」を管理する方を担当しました.</p> <p>Edge-OCRでは「Detectorモデル」「Recognizerモデル」と呼ばれる機械学習モデルを組み合わせて画像認識を行っており,用途に合わせてDetectorモデル1つとRecognizerモデル1つ以上からなる「Compositeモデル」を作成して運用する形になっているため,具体的にはこれら3つのモデルの管理を行っていました.</p> <h3 id="実装物">実装物</h3> <p>私が実装したシステムはざっくりいうと,こんな感じになっています.各画面の仕様及び利用した技術は以下で個別に紹介します.</p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="システムの構成"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/M/MaMiO/20221122/20221122131523.png" width="1200" height="1053" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">システムの構成</figcaption> </figure> <p><a id="モデルの一覧表示画面"></a></p> <h4 id="モデルの一覧表示画面">モデルの一覧表示画面</h4> <p>作成した画面はこのようになっています.</p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="Compositeモデルの一覧表示"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/M/MaMiO/20221122/20221122125551.png" width="1200" height="711" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">Compositeモデルの一覧表示</figcaption> </figure> <p><br /><br /></p> <p>大まかな実装内容としては,</p> <ul> <li>Compositeモデルの名前・利用されているDetectorモデルの名前・利用されているRecognizerモデルの名前を一覧表示する</li> <li>一覧上にある Compositeモデルを削除する</li> <li>Detector/Recognizerモデルのパラメータを閲覧・編集できる</li> </ul> <p>の3つが挙げられます.</p> <p>2つ目の「一覧上にある Compositeモデルを削除する」というのは,モデルの名前の左横にあるゴミ箱ボタンを押すことで実装しています.</p> <p>3つ目の「Detector/Recognizerモデルのパラメータを閲覧・編集できる」という部分は,それぞれ編集したいモデルをクリックすると下のようなダイアログが現れるのでそこから直接閲覧及び編集が行えます.</p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="ダイアログ"> <div class="images-row mceNonEditable"> <div class="images-row-item"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/M/MaMiO/20221122/20221122130108.png" width="1200" height="846" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></div> <div class="images-row-item"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/M/MaMiO/20221122/20221122130103.png" width="1200" height="901" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></div> </div> <figcaption class="mceEditable">ダイアログ</figcaption> </figure> <p>実装が難しかった部分としては,UI的に「1つ以上」という固定でない数を持つRecognizerモデルの情報をどのように表示するか?というところでした.</p> <p>最終的には,一覧表示ではRecognizerモデルは一つ目しか表示されないようにしたものの,それを押下したときに他のRecognizerモデルの名前のプルダウンを表示するよう実装することで,どのRecognizerモデルの情報を見たいのか選べるようにして解決しました.</p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="Recognizerモデルを押下した時のプルダウン"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/M/MaMiO/20221109/20221109151806.png" loading="lazy" title="" class="hatena-fotolife" itemprop="image" width="1200" height="445" /></p> <figcaption class="mceEditable">Recognizerモデルを押下した時のプルダウン</figcaption> </figure> <h4 id="Compositeモデル新規登録画面">Compositeモデル新規登録画面</h4> <p>作成した画面はこのようになっています.</p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="Compositeモデルの作成画面"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/M/MaMiO/20221122/20221122125904.png" width="800" height="276" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">Compositeモデルの作成画面</figcaption> </figure> <p><br /><br /></p> <p>大まかな実装内容としては,</p> <ul> <li>Compositeモデルの新規作成ができる</li> <li>Detectorモデルの新規作成ができる</li> <li>Recognizerモデルの新規作成ができる</li> </ul> <p>の3点になります.</p> <p> </p> <p>Compositeモデル自体は,どんな名前か・どのDetectorモデル/Recognizerモデルを利用するのかという情報を与えてやれば作成が可能ですが,「どのDetectorモデル/Recognizerモデルを利用するのか」は既存モデルを利用するのか新規作成するのかでまた挙動が変わります.</p> <p>そのため,今回は既存のモデルを選択する「Selectボタン」と,モデルを新規作成して選択する「Create Newボタン」をそれぞれ用意しました.</p> <p>Create Newボタンを押下するとそれぞれのモデルの新規作成ダイアログが表示されるようにしました.(これは<a href="#モデルの一覧表示画面">モデルの一覧表示画面</a>で紹介したモデル編集ダイアログと共通のコードを利用しています.)</p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="ダイア"> <div class="images-row mceNonEditable"> <div class="images-row-item"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/M/MaMiO/20221122/20221122130455.png" width="1200" height="958" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></div> <div class="images-row-item"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/M/MaMiO/20221122/20221122130500.png" width="1200" height="1022" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></div> </div> <figcaption class="mceEditable">新規作成ダイアログ</figcaption> </figure> <p> </p> <p>大変だったこととしては,ここでも可変長のRecognizerモデルを選択するときのわかりやすさをどう実装するかに悩まされました.</p> <p>最終的には「Selectボタン」を押下すると次のように既存モデルの名前とチェックボックスが出るようにし,チェックをつけたモデルが利用されるようにしました.</p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="Recognizerモデル選択"> <div class="images-row mceNonEditable"> <div class="images-row-item"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/M/MaMiO/20221109/20221109154224.png" loading="lazy" title="" class="hatena-fotolife" itemprop="image" width="1136" height="798" /></div> <div class="images-row-item"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/M/MaMiO/20221109/20221109154227.png" loading="lazy" title="" class="hatena-fotolife" itemprop="image" width="1200" height="137" /></div> </div> <figcaption class="mceEditable">Recognizerモデル選択</figcaption> </figure> <h4 id="ダイアログ">ダイアログ</h4> <p>これまでにも紹介していたため画像は省略しますが,Detector/Recognizerモデルの作成にあたってはダイアログ画面を利用していました.</p> <p>このダイアログ画面では,特にDetectorモデルの「class」関連のパラメータ設定を行う部分が特に大変でした.(また?と思われるかもしれませんが,)このclass関連のパラメータは1つ以上の可変長パラメータになっているため,登録画面をそれに合わせて動的に作成する必要があり,そこに悩まされました.</p> <p>最終的には,入力フィールドを増やしたり減らしたりできるウィジェットを新規に定義し,それを埋め込むことで解決しました.(実際はメンターを務めてくださったPeterさんがほとんど実装してくださりました.本当にありがとうございました.)</p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="addでフィールド追加,ゴミ箱ボタンで削除"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/M/MaMiO/20221109/20221109155046.png" loading="lazy" title="" class="hatena-fotolife" itemprop="image" width="972" height="330" /></p> <figcaption class="mceEditable">addでフィールド追加,ゴミ箱ボタンで削除</figcaption> </figure> <h3 id="まとめ">まとめ</h3> <p>今回のインターンでは,FlutterとFirebaseを利用してEdge-OCRのモデルを管理するシステムの開発を行い,その成果をここにまとめました.</p> <p> </p> <h3 id="振り返ってみて">振り返ってみて</h3> <p>私は自分で動くものを作ることへの憧れや興味はあるものの,WEBアプリケーション開発自体は昔授業でチーム開発(という名のプロへの頼りきり)でしか行ったことがなく,なかなか手を出せずにいた分野でした.</p> <p>そんな中で今回Nefrockさんのインターン募集を見つけ,これはチャンスだ!と思い応募しました.</p> <p>実務経験どころか個人での開発経験もほぼゼロの状態からのスタートで,どんなに迷惑をかけるだろうかと恐れ慄きながら始めたインターンでしたが,最終日を迎えた今としては「もっと早くここでインターンしたかった〜!」と思うばかりです.</p> <p>例えば,今回のインターンで初めて丁寧なコードレビューというものをしてもらったのですが,自分が書いたコードが「なぜ悪いのか」「どう直すべきなのか」を考える良い経験になり,今後開発者として本当に役立つことを学ばせていただきました.</p> <p>そのほか,インターン期間中は本当によく面倒を見ていただいて,初歩の初歩(VSCodeの使い方・便利なMacの設定・チーム開発でのGitHubの使い方・etc)から教えていただけて,今までなあなあにしていた部分でも成長を感じることができました.</p> <p>私は今回本当に開発初心者として参加させていただいたため,基本の「き」から学ばせていただきました.なので私のような初心者にも本当におすすめなのはもちろん,インターン内容自体はインターン生の希望や能力に応じてさまざまなものがあると思うので,もっと高度なことがしたい・開発経験をもっと積みたいという方にも自信を持ってお薦めできるインターンでした.</p> <p> </p> <h3 id="謝辞">謝辞</h3> <p>今回のインターンシップでメンターを務めてくださったPeterさんに心から感謝申し上げます.開発経験がないどころかまともにショートカットキーすら使っていないような初心者インターン生でも懇切丁寧に指導し,気にかかけていただいいたことが本当にありがたかったです.</p> <p>また,いちインターン生にも温かく接してくださり,さまざまなことを助けてくださったNefrock社員の皆様に心から感謝いたします.皆様の心遣いで非常に楽しく成長を感じられる場となり,本当に良い経験をさせていただけたと思っております.</p> <p>そしてNefrockビルの皆様と,同じくインターンに参加していた積田さん,皆様のおかげで本当に楽しく過ごすことができました.また,毎週楽しい催しを開いてくださってありがとうございました.</p> <p>一ヶ月間大変お世話になりました.楽しかったです.</p> MaMiO インターン2022 参加報告 そのいち hatenablog://entry/4207112889932456524 2022-11-22T11:14:23+09:00 2023-05-23T15:05:27+09:00 はじめまして、nefrockのWebシステム開発コースでインターンシップに参加した東京工業大学の積田です。今回のインターンシップでは、ハイスピード文字読み取り「Edge-OCR」を今後運用する上で必要になる社内の顧客管理システムの開発を行いました。edge-ocr.com インターンのテーマ 担当箇所 実装物 顧客の一覧表示画面 顧客の詳細画面 併せて変わった画面 まとめ 振り返ってみて 謝辞 インターンのテーマ Edge-OCRを利用する顧客の情報を容易に管理がしたい、というnefrockの方々の要望のもと、要求に沿った社内用システムを完成させることが主な目的でした。というのも、Edge-O… <p>はじめまして、nefrockのWebシステム開発コースでインターンシップに参加した東京工業大学の積田です。</p><p>今回のインターンシップでは、ハイスピード文字読み取り「Edge-OCR」を今後運用する上で必要になる社内の顧客管理システムの開発を行いました。</p><p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fedge-ocr.com%2F" title="EdgeOCR by Nefrock" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://edge-ocr.com/">edge-ocr.com</a></cite><br /> </p> <ul class="table-of-contents"> <li><a href="#インターンのテーマ">インターンのテーマ</a></li> <li><a href="#担当箇所">担当箇所</a></li> <li><a href="#実装物">実装物</a><ul> <li><a href="#顧客の一覧表示画面">顧客の一覧表示画面</a></li> <li><a href="#顧客の詳細画面">顧客の詳細画面</a></li> <li><a href="#併せて変わった画面">併せて変わった画面</a></li> </ul> </li> <li><a href="#まとめ">まとめ</a></li> <li><a href="#振り返ってみて">振り返ってみて</a></li> <li><a href="#謝辞">謝辞</a></li> </ul> <div class="section"> <h4 id="インターンのテーマ">インターンのテーマ</h4> <p>Edge-OCRを利用する顧客の情報を容易に管理がしたい、というnefrockの方々の要望のもと、要求に沿った社内用システムを完成させることが主な目的でした。</p><p>というのも、Edge-OCRは毎日の利用可能台数を契約した上で顧客に運用してもらうという方針のため、各顧客の運用情報等を管理できるシステムが必要になっていました。</p> <figure class="figure-image figure-image-fotolife" title="システム概要"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/buna-simeji/20221031/20221031170940.png" width="511" height="315" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>システム概要</figcaption></figure><p>顧客が契約したライセンスには具体的に「どれほどの台数が使えるか」「どの期間で利用可能か」「ライセンスは有効かどうか」などの情報が含まれています。</p><p>こういった顧客に紐付いたライセンス情報も含めて閲覧、編集などができる社内用の仕組み作りがテーマになりました。</p><p>元々顧客情報をFlutterとFirebaseを用いて管理していたことから、社内システムの開発もフレームワークとしてFlutterを、バックエンドはFirebaseを利用しました。</p> </div> <div class="section"> <h4 id="担当箇所">担当箇所</h4> <p>本インターンには同期間にもう一人参加していたため、開発を分担することになりました。私は上記テーマの内、ライセンスを含めた顧客情報の一覧と詳細表示の部分を担当しました。</p> </div> <div class="section"> <h4 id="実装物">実装物</h4> <p>インターンでは以下のように表示される画面を実装しました。</p> <figure class="figure-image figure-image-fotolife" title="実装した画面"><div class="images-row mceNonEditable"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/buna-simeji/20221031/20221031171931.png" width="1200" height="1198" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/buna-simeji/20221031/20221031171929.png" width="988" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></div><figcaption>実装した画面</figcaption></figure><p>左が顧客の一覧表示画面で、右が顧客の詳細画面になります。</p> <div class="section"> <h5 id="顧客の一覧表示画面">顧客の一覧表示画面</h5> <p>実装したものとして、</p> <ul> <li>会社名・代表者名・Emailを一覧で表示する</li> <li>会社名・代表者名・Emailの中から選んで検索ができる</li> <li>デフォルトで有効なライセンスを所持したユーザーを表示し、無効なライセンスを所持するユーザーの表示・非表示を選択できる</li> <li>該当の列をクリックすると詳細ページに移動できる</li> </ul><p>以上の機能があります。</p><br /> <p>画面の小さいスマートフォンで見た際にも詰まった表示にならない方がいい、という意見をいただいたため画面幅に応じて表示の仕方を変えるような工夫も行いました。</p> <figure class="figure-image figure-image-fotolife" title="カード表示の一覧"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/buna-simeji/20221031/20221031172655.png" width="719" height="1200" loading="lazy" title="" class="hatena-fotolife" style="width:200px" itemprop="image"></span><figcaption>カード表示の一覧</figcaption></figure> </div> <div class="section"> <h5 id="顧客の詳細画面">顧客の詳細画面</h5> <p>こちらで実装したものとしては、</p> <ul> <li>顧客の情報を表示する</li> <li>顧客が所持するライセンスの情報を表示</li> <li>顧客が所持するライセンスの情報を編集できる</li> <li>顧客のライセンスの有効・無効化ができる</li> <li>ライセンスの使用量と使用可能量を可視化できる</li> </ul><p>の5つです。</p><p>所持するライセンスの表示と編集に関しては、画面遷移なしで情報を変更できるようにしました。ライセンスの有効期間はDatePickerを用いてカレンダーから変更できたり、ライセンス数は編集マークをクリックすることでTextFileldが表れ、値を変更できるようになっています。</p><p>個人的に実装が楽しかったのはライセンスの使用量を可視化するグラフの部分で、Firestoreにある情報を日付によるソートや検索を繰り返してなんとかまとめることに成功しました。</p><p>特に実際にライセンスを使用した量(オレンジの線)はEdge-OCRの実際の運用時で生成されるデータから作成しているため、より社内システムとして現実味がある楽しい部分でした。</p><br /> <p><span style="font-size: 80%">ローディングに時間がかかると感じたため、暇つぶしに紙吹雪も出せるようにしました</span></p> <figure class="figure-image figure-image-fotolife" title="紙吹雪"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/buna-simeji/20221031/20221031174458.gif" width="467" height="269" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>紙吹雪</figcaption></figure> </div> <div class="section"> <h5 id="併せて変わった画面">併せて変わった画面</h5> <p>ライセンスの情報は開発当初、ライセンス数しか管理されていなかったところ、他にユーザーの有効・無効を切り替えられる機能や有効期間を見られるようにしてほしいと要望の追加がありました。</p><p>それに伴い、新しく顧客のアカウントを追加する時にも有効期間を設定できるように変更を加えました。<br /> <center><br /> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/buna-simeji/20221031/20221031175020.png" width="1200" height="939" loading="lazy" title="" class="hatena-fotolife" style="width:440px" itemprop="image"></span><br /> </center></p><p>非常に細かい部分ですが、タブ移動に適応した入力フォームの作成にかなりの時間がかかりました。<br /> Start/End Date of Licenseはクリック時にDatePickerが開く都合上、元々必ずマウス操作が要求される部分でした。それでは入力がしづらいとなり、FocusNodeなどの利用を何度も試行錯誤し、タブ移動でも開け、キャンセルや入力の有無に応じて次の入力に進むようなUIを完成させることができました。</p> </div> </div> <div class="section"> <h4 id="まとめ">まとめ</h4> <p>今回のインターンでは、Flutter / Firebaseを利用して今後運用されるEdge-OCRの顧客情報を管理する社内システムを作成しました。<br /> その中でも特に顧客とそのライセンスに関わる部分の実装を担当いたしました。<br /> <br /> </p> </div> <div class="section"> <h4 id="振り返ってみて">振り返ってみて</h4> <p>私はインターンを申し込む当時、「実務による開発経験」が全くなく、実際の運用に値するものを開発してみたい!という気持ちで今回のインターンに申し込みました。</p><p>また、フロントエンド側に興味の方向が向いていたため、UI部分も相談しつつ作れる環境であるといいなとも思っていました。</p><br /> <p>実際に1ヶ月開発をして、求めていた以上のものまでできた!というのが正直な感想です。</p><p>実際に利用する社内の方々が常にフィードバックをくれる環境で開発ができるため、「どうすれば使いやすいのか」を常に考え、進化させながら各ページの作成に取り掛かることができました。</p><p>また、入念にコードレビューをしていただけたため、今後の機能拡張に対応できるようなリファクタリングやその考え方までも教えていただくことができました。講義やハッカソンなどでは、時間の制限からなかなか丁寧にできないリファクタリングを、レビューありきでじっくり行うという贅沢すぎる経験ができました。</p><p>またそれだけにとどまらず、普段手探りで学んでいたgitやエディタのより良い扱い方までも教えていただくことになり、インターン中毎日が成長の日々でした。<br /> 特に今まで恐怖の対象であったforce pushもrebaseも扱えるようになったことが本当に嬉しいです。</p><p>もっと早くここでインターンをさせて貰えていれば、と心の底から思うほど開発者として良い経験をさせてもらいました。</p><p>自分の腕に自信がある人はもちろん、実務経験ってものをしてみたいけど実力が不安だ、と思う人こそぜひ参加してほしいインターンだと思います。<br /> <br /> </p> </div> <div class="section"> <h4 id="謝辞">謝辞</h4> <p>今回のインターンでメンターをしていただいたPeterさんに心から感謝します。<br /> FlutterもDartもFirebaseも初心者だった私に対して、大変丁寧にレビューをしてくださりありがとうございました。好意的なフィードバックも大変励みになりました。<br /> 社内システムの一部を先んじて実装していただき、困っている時に手を差し伸べてくださった岩崎さんに感謝いたします。全くの0から手探りで開発を進める必要がないと知って得られた安心感は今でも忘れません。<br /> また、インターン参加に対して非常に暖かく迎え入れてくださった株式会社ネフロックの皆様に心から感謝いたします。<br /> 最後に、Nefrockビルの皆様、定期的に楽しい会を開いてくださりありがとうございました。1ヶ月間、本当に楽しかったです。</p> </div> buna-simeji コナンくんのアレを作る技術 その2 hatenablog://entry/13574176438018841871 2021-11-26T14:54:39+09:00 2021-11-26T14:54:39+09:00 FPGAって、なに? FPGAプログラミング 高位合成によるFPGAプログラミング おわりに みんなさん、こんにちは!Nefrockの長期インターン生Peterです! 去年3月もここで報告したように、Nefrockではただいま「リアルタイムで声質を変換するハードウェア KUROFUNE」を開発しています。 前の記事ではNefrockの@shiwazaki1がそれを「FPGA上になんとか実装したい」と述べましたけど、今回の記事でまさにその実装について書きたいと思います! FPGAって、なに? FPGAとは、「Field Programmable Gate Array」の略称です。つまり「現場で組… <ul class="table-of-contents"> <li><a href="#FPGAってなに">FPGAって、なに?</a><ul> <li><a href="#FPGAプログラミング">FPGAプログラミング</a></li> <li><a href="#高位合成によるFPGAプログラミング">高位合成によるFPGAプログラミング</a></li> <li><a href="#おわりに">おわりに</a></li> </ul> </li> </ul> <p>みんなさん、こんにちは!Nefrockの長期インターン生Peterです!</p> <p>去年3月も<a href="https://blog.nefrock.com/entry/2020/03/17/171730">ここで報告した</a>ように、Nefrockではただいま「リアルタイムで声質を変換するハードウェア KUROFUNE」を開発しています。 前の記事ではNefrockの<a href="https://twitter.com/siwazaki1">@shiwazaki1</a>がそれを「FPGA上に<strong>なんとか</strong>実装したい」と述べましたけど、今回の記事でまさにその実装について書きたいと思います!</p> <h2 id="FPGAってなに">FPGAって、なに?</h2> <p><a href="https://ja.wikipedia.org/wiki/FPGA">FPGA</a>とは、「Field Programmable Gate Array」の略称です。つまり「現場で組み替えられる論理回路」という意味になります。「現場」は、この件の場合Nefrockのことで、「論理回路」は計算機という認識で問題ないでしょう。 計算機としての立場は、一般的なパソコンにも入っているCPUと、<a href="https://ja.wikipedia.org/wiki/ASIC">ASIC</a>という専用ICの間です。 自動車業界で使用されるASICと比べて消費電力の効率がやや悪いが、開発コストが低いです。FPGAはCPUみたいに容易にいろんなソフトが使えないが、逆に計算効率が高いです。以下の図もご確認ください。</p> <p><img src="https://bto.applied.ne.jp/img/solution2/item_fpga1.png" alt="fpga_compare" /> <em>Source: <a href="https://bto.applied.ne.jp/img/solution2/item_fpga1.png">https://bto.applied.ne.jp/img/solution2/item_fpga1.png</a></em></p> <p>コナンくんのアレといえば、つまり携帯できるリアルタイムの音声変換機ですので、FPGAには最適なアプリケーションです。</p> <h3 id="FPGAプログラミング">FPGAプログラミング</h3> <p>組替可能とはいっても、実際にどういうふうに組み替えるでしょうか? 普段はVHDLやVerilog-HDLなどのHDLでハードウェアを細かく記述し、FPGAメーカが提供する専用ツール(Xilinx社の場合Vivado)がそれを実際のハードウェア構造に翻訳してくれます。出力されるバイナリはCDやDVDを焼くようにFPGAに簡単焼けます。</p> <p>実際にVHDLで書かれたコードを見てみると、なかなか読みづらく複雑なプログラムを組むにはあまり向いている言語ではないことに気づかずにはいられないでしょう。以下のプログラムは、簡単なカウンターの実装で、enable, clk, resetなどハードウェア専門知識がないと知らないようなものが入ってたり、全体的に分かりにくい感じです。</p> <pre class="code" data-lang="" data-unlink>entity counter is port ( cout :out std_logic_vector (7 downto 0); enable :in std_logic; clk :in std_logic; reset :in std_logic ); end entity; architecture rtl of counter is signal count :std_logic_vector (7 downto 0); begin process (clk, reset) begin if (reset = &#39;1&#39;) then count &lt;= (others=&gt;&#39;0&#39;); elsif (rising_edge(clk)) then if (enable = &#39;1&#39;) then count &lt;= count + 1; end if; end if; end process; cout &lt;= count; end architecture;</pre> <p>それと比べて同じ機能をC/C++で書くと下記になります。</p> <pre class="code" data-lang="" data-unlink>int counter(bool reset=false) { static int count = 0; if (reset) count = 0; else count += 1; return count; }</pre> <p>長さだけでみても全然違いますし、プログラミングに慣れていない方もおそらく何が起きているか見当がつくでしょう。 FPGAのプログラムもC/C++でかければいいのになぁ、、と思うのは、さすがに我々だけでなく、FPGAメーカもこのニーズに気づいています。 ちなみにFPGAメーカと言っても、ほとんどXilinx (マーケットシェア~50%) とIntel (40%) しかありません。 今回はXilinxのFPGAを使っているので、以下の話はIntelのFPGA開発に当てはまらない場合もあります。</p> <h3 id="高位合成によるFPGAプログラミング">高位合成によるFPGAプログラミング</h3> <p>VHDL・Verilog-HDLでFPGAのプログラムを書くのは大変で、専門知識が必要です。FPGAをより多くの人に使ってもらうように、XilinxがVitis HLSというツールを提供してくれます。 Vitisは製品名で、HLSとはHigh Level Synthesis(高位合成)という意味です。Vitis HLSはC/C++で書かれたプログラムをHDL(VHDL・Verilog-HDL)に翻訳してくれます。 そのHDL表現から上述のVivadoの流れで更にバイナリが生成出来ます。「高位」というのは、人間にとって「より分かりやすい」、しかし機械にとっては「分かりにくい」という意味です。 よく知られている例でいうと、アセンブリは低位で、Pythonなどは高位の言語です。</p> <p>つまりVitis HLSなら上の簡単なカウンターの実装がそのまま使えます。素晴らしいです! もちろんHDLで細かく調整し効率のより良いプログラムも書けますし、高位合成では使えない機能もあります。 しかし最近HLSの技術が進んでいて、WaveNetの実装も可能でした。</p> <h3 id="おわりに">おわりに</h3> <p>WaveNetが実装できましたと言いましたが、実は単純にC/C++で書いてすぐFPGAで動いてくれた訳ではありません。 高位合成でもある程度FPGAに向けた書き方をしないと効率の良いハードウェアにならず、何ならVivadoがそもそもバイナリ生成に失敗することも多いです。 量子化、dataflow、回路の再利用などCPU向けの開発では考えなくてもいいようなものが沢山あって、また今度の記事で紹介したいと思います!</p> derpda ラズパイでおうちハック hatenablog://entry/13574176438026927159 2021-11-09T11:30:00+09:00 2021-11-09T11:15:17+09:00 導入 材料 スマート化する家電 主な手順 赤外線送受信回路の作成 エアコンのリモコンの信号を記録 記録 送信 Philips Hueの操作を確認 homebridgeサーバーの構築 まとめ センサの拡張 ハードウェアの充実 多段階調整 導入 Nefrockでアルバイトをしている,ビルの2Fシェアハウス在住の渋谷樹弥です. 最近,スマートホームというワードを耳にするようになりました. スマートホームとは,リモート操作に対応した家電をgoogle homeなどのハブと接続することで,スマホ操作や音声で照明をON/OFFさせたり,電子的に家の鍵を開け締めさせたりするものです. 普通の家電は,壁のスイ… <ul class="table-of-contents"> <li><a href="#導入">導入</a><ul> <li><a href="#材料">材料</a></li> <li><a href="#スマート化する家電">スマート化する家電</a></li> <li><a href="#主な手順">主な手順</a></li> </ul> </li> <li><a href="#赤外線送受信回路の作成">赤外線送受信回路の作成</a><ul> <li><a href="#エアコンのリモコンの信号を記録">エアコンのリモコンの信号を記録</a><ul> <li><a href="#記録">記録</a></li> <li><a href="#送信">送信</a></li> </ul> </li> </ul> </li> <li><a href="#Philips-Hueの操作を確認">Philips Hueの操作を確認</a></li> <li><a href="#homebridgeサーバーの構築">homebridgeサーバーの構築</a></li> <li><a href="#まとめ">まとめ</a><ul> <li><a href="#センサの拡張">センサの拡張</a></li> <li><a href="#ハードウェアの充実">ハードウェアの充実</a></li> <li><a href="#多段階調整">多段階調整</a></li> </ul> </li> </ul> <h2 id="導入">導入</h2> <p>Nefrockでアルバイトをしている,ビルの2Fシェアハウス在住の渋谷樹弥です.</p> <p>最近,スマートホームというワードを耳にするようになりました.</p> <p>スマートホームとは,リモート操作に対応した家電をgoogle homeなどのハブと接続することで,スマホ操作や音声で照明をON/OFFさせたり,電子的に家の鍵を開け締めさせたりするものです.</p> <p>普通の家電は,壁のスイッチやリモコンで操作するため,常に持ってるスマホから全部コントロールできるようになればとても便利そうです.</p> <p>しかし,こういった製品はかゆいところに手が届かないことがあり,各機能をもっと細かく調整できればもっと便利になるのに,と思ったことはありませんか?</p> <p>そこで,今回はラズパイを使ってスマートフォンから家電を操作する環境を構築する方法をこの記事にまとめました.</p> <p>ラズパイ上にAppleのHomekitを模擬するhomebridgeというサービスを常駐させ,iPhoneのhomeアプリやsiriからLED照明とエアコンをスマホから操作できるようしています.</p> <h4 id="材料">材料</h4> <p>・ラズパイ3B+(なんでも良いが,無線LANモジュール付き推奨)</p> <p>・ブレボ</p> <p>・赤外線LED,受信モジュール</p> <p>・抵抗,ジャンパ</p> <h4 id="スマート化する家電">スマート化する家電</h4> <p>・Philips Hue スマートライト+ブリッジ</p> <p>・家庭用エアコン</p> <p> </p> <h4 id="主な手順">主な手順</h4> <p>・赤外線送受信回路の作成,</p> <p>・エアコンのリモコンの信号を記録</p> <p>・Philips Hueの操作を確認</p> <p>・家電を操作するスクリプトを作成</p> <p>・ラズパイ上にhomebridge(appleのhomeで操作可能なサーバーアプリケーション)を構築</p> <p>・siriや画面のスイッチで家電を操作できるようにすることを確認</p> <p> </p> <h2 id="赤外線送受信回路の作成">赤外線送受信回路の作成</h2> <figure class="figure-image figure-image-fotolife mceNonEditable" title="ブレボ上に組んだエアコン操作用回路"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/shibushibuya/20211027/20211027203003.jpg" alt="f:id:shibushibuya:20211027203003j:plain" width="1024" height="768" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">ブレボ上に組んだエアコン操作用回路</figcaption> </figure> <p>エアコンは,リモコンから発信された赤外線LEDの点滅により一方的に情報を受け取ります.</p> <p>一般的に,赤外線LEDは搬送波と呼ばれる38kHzの高速な点滅が一定時間続く(ビット0)か消灯(ビット0)かで表されるビットを並べて情報伝達を行います.</p> <p><a href="https://akizukidenshi.com/catalog/g/gI-04659/">赤外線受信モジュール</a>は,38kHzの搬送波で変調された信号のみをピックアップして元の0/1の信号を出力するので,それをラズパイのIOにそのまま入力します.</p> <p>赤外線LEDはラズパイのIOでは電流が小さくて光量が足りないため,トランジスタで増幅します.</p> <p>ブレッドボードにこんな回路を組みました(10Ω抵抗でLEDをオーバードライブしているので,定格にする場合は30Ωに変える).</p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="赤外線送受信回路図"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/shibushibuya/20211027/20211027205049.jpg" alt="f:id:shibushibuya:20211027205049j:plain" width="1200" height="784" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">赤外線送受信回路図</figcaption> </figure> <h3 id="エアコンのリモコンの信号を記録">エアコンのリモコンの信号を記録</h3> <p> </p> <p><a href="https://github.com/MikiyaShibuya/RoomControl/blob/master/irrp.py">このスクリプト*</a>を使ってリモコンの信号を記録・送信します.</p> <p>※ オリジナルのirrp.pyには,エアコンなど長い信号を記録できても送信できないバグがあるので,通信コードを分割してエラーを修正した</p> <p> </p> <h4 id="記録">記録</h4> <p>今回は18pinを入力に使っているので,-gに18を指定します.</p> <p>例えば,26度設定のエアコンの信号を記録するときはこんな感じのコマンドを打ちます.</p> <p style="margin: 0 0 1.5em 0; padding: 1em; border: 1px solid #e4e4e4; background: #f8f8f8; border-radius: 2px;">python3 irrp.py -r -g18 -f codes aircon:26 --no-confirm --post 130</p> <p> </p> <h4 id="送信">送信</h4> <p>先程記録した信号でエアコンを操作できることをチェックします.</p> <p>17pinを出力に使っているので,-g17がついています.</p> <p style="margin: 0 0 1.5em 0; padding: 1em; border: 1px solid #e4e4e4; background: #f8f8f8; border-radius: 2px;">python3 irrp.py -p -g17 -f codes aircon:26</p> <p> </p> <p>操作できない場合,回路を確認したり,赤外線が出ているかをスマホなどのカメラでチェックしたりしてください.</p> <p>ラズパイのクロック設定が不適切だと,搬送波の周波数が19kHzになってる可能性があるので,<a href="https://www.indoorcorgielec.com/resources/raspberry-pi/python-pigpio-infrared/#send-failure">このサイト</a>に従ってクロックを修正してみてください(これを特定するのに1日かかった).</p> <p> </p> <p> </p> <h2 id="Philips-Hueの操作を確認">Philips Hueの操作を確認</h2> <p>Philips Hueのスマートライトをラズパイから操作可能なことを確認します.</p> <p>このスマートライトはHTTPベースのAPIが用意されており,ブリッジのIPアドレスにHTTPのPUTを送ることで操作ができるなど,ハックしやすいです.</p> <p><a href="https://github.com/MikiyaShibuya/RoomControl/blob/master/hue_client.py">リクエストを送るスクリプト</a>を組んで</p> <p style="margin: 0 0 1.5em 0; padding: 1em; border: 1px solid #e4e4e4; background: #f8f8f8; border-radius: 2px;">python3 hue_client.py -i 1 -u [ユーザー名が書かれたファイル]</p> <p>このようにコマンドで操作できることが確認できればOKです.</p> <p> </p> <p>API用のユーザー名とはブリッジから与えられるランダムな文字列で,一度生成したらそのブリッジでは同じものを使い続けることができます.</p> <p>今回は-uオプションで与えられたファイルの中身を読み込んでユーザー名をスクリプトに教えるようになっています.</p> <p>ユーザー名の取得方法は<a href="https://www.lanches.co.jp/blog/2021">こちら</a>などを参照ください.</p> <p> </p> <h2 id="homebridgeサーバーの構築">homebridgeサーバーの構築</h2> <p><a href="https://github.com/senyoltw/homebridge-cmd">こちら</a>のリポジトリのプログラムを使います.</p> <p>動作にnodeが必要なので,適当にインストールします.</p> <p>aptのサーバーにあるnodeのバージョンが古いという話ですが,今回は問題なかったので詳しく調べてません.</p> <p style="margin: 0 0 1.5em 0; padding: 1em; border: 1px solid #e4e4e4; background: #f8f8f8; border-radius: 2px;">sudo apt update<br />sudo apt install -y nodejs npm</p> <p> </p> <p>続けてnpmにhomebridgeをインストールします.</p> <p>ホストが送る司令に対してコマンドを実行したいので,homebridge-cmdも必要です.</p> <p style="margin: 0 0 1.5em 0; padding: 1em; border: 1px solid #e4e4e4; background: #f8f8f8; border-radius: 2px;">sudo npm install -g homebridge<br />sudo npm install -g homebridge-cmd</p> <p> </p> <p>homebridgeをサービスとして常駐させるための<a href="https://github.com/MikiyaShibuya/RoomControl/blob/master/homebridge.service">コンフィグ</a>を/etc/systemd/system内に配置します.</p> <p> </p> <p style="margin: 0 0 1.5em 0; padding: 1em; border: 1px solid #e4e4e4; background: #f8f8f8; border-radius: 2px;">sudo systemctl enable homebridge.service<br />sudo systemctl start homebridge.service</p> <p>で起動するはず.</p> <p> </p> <p>homebridge自体の挙動を制御するコンフィグ<a href="https://github.com/MikiyaShibuya/RoomControl/blob/master/config.json">~/homebridge/config.json</a>を作成します.</p> <p>公式のサンプルを元に,主としてaccesoriesタグの中をいじってあります.</p> <p>"accesory": "CMD" でhomebridge-cmdへの記述である事を指定し,</p> <p>name, on_cmd, off_cmdでアプリに表示する名前やスイッチ操作をどう受け付けるかを決められます.</p> <p>今回のライトとエアコンの様に複数のスイッチを定義することもできます.</p> <p> </p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="エアコンをONにする様子"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/shibushibuya/20211103/20211103225027.jpg" alt="f:id:shibushibuya:20211103225027j:plain" width="1182" height="665" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">エアコンをONにする様子</figcaption> </figure> <figure class="figure-image figure-image-fotolife mceNonEditable" title="電気をON,OFFする様子"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/shibushibuya/20211103/20211103225207.jpg" alt="f:id:shibushibuya:20211103225207j:plain" width="1182" height="665" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">電気をON,OFFする様子</figcaption> </figure> <p> </p> <h2 id="まとめ">まとめ</h2> <p>今回はラズパイでライトやエアコンのON/OFFの操作をするスマートホーム環境を立ち上げ,スマートフォンと実際に連携が可能なことがわかりました.</p> <p>しかしながら,これだけではまだ市販のブリッジと比べてできることが同等か少し劣る程度にとどまっています.</p> <p>今後は操作対象の家電やセンサーを充実させて機能をもりもり盛っていきたいと考えています!<span style="color: #d8d8d8;">(続編あるかも)</span></p> <h4 id="センサの拡張">センサの拡張</h4> <p>・寝ているか起きているかをカメラで検出</p> <p>・人感センサーで入退室を検出</p> <h4 id="ハードウェアの充実">ハードウェアの充実</h4> <p>・カーテンを決まった時間に開け閉めしたい</p> <h4 id="多段階調整">多段階調整</h4> <p>・まだON/OFFの制御しかできないが,将来的にはライトの明るさなどを段階的に調整可能にしたい</p> shibushibuya インターン2021 参加報告 hatenablog://entry/13574176438022741891 2021-10-22T13:52:36+09:00 2021-11-05T17:12:41+09:00 FPGA基板と開発環境 はじめに 初めまして、nefrockのFPGAコースでインターンシップに参加した東京工業大学の池守和槻です. 大学ではプログラミング言語の研究をしており、特に型システムと型推論の研究をしています. 今回のインターンシップでは、ハードウェア記述言語を用いたFPGA開発とLattice Semiconductor社のFPGA (iCEstick iCE40HX1K) の実機調査というテーマで開発と調査を行いました. はじめに インターンのテーマ内容について 実装物の概要 コマンド送信アプリの概要 コマンドの仕様 GUIアプリの概観 BRAMの不安定な挙動 ピンアサインの変更… <p><figure class="figure-image figure-image-fotolife" title="FPGA基板と開発環境"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/f/fgoto/20211105/20211105171157.jpg" alt="f:id:fgoto:20211105171157j:plain" width="901" height="748" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>FPGA基板と開発環境</figcaption></figure></p> <h2 id="はじめに">はじめに</h2> <p>初めまして、nefrockのFPGAコースでインターンシップに参加した東京工業大学の池守和槻です. 大学ではプログラミング言語の研究をしており、特に型システムと型推論の研究をしています.</p> <p>今回のインターンシップでは、ハードウェア記述言語を用いたFPGA開発とLattice Semiconductor社のFPGA (iCEstick iCE40HX1K) の実機調査というテーマで開発と調査を行いました.</p> <ul class="table-of-contents"> <li><a href="#はじめに">はじめに</a></li> <li><a href="#インターンのテーマ内容について">インターンのテーマ内容について</a></li> <li><a href="#実装物の概要">実装物の概要</a></li> <li><a href="#コマンド送信アプリの概要">コマンド送信アプリの概要</a><ul> <li><a href="#コマンドの仕様">コマンドの仕様</a></li> <li><a href="#GUIアプリの概観">GUIアプリの概観</a></li> </ul> </li> <li><a href="#BRAMの不安定な挙動">BRAMの不安定な挙動</a></li> <li><a href="#ピンアサインの変更による振る舞いの変化">ピンアサインの変更による振る舞いの変化</a></li> <li><a href="#まとめ">まとめ</a></li> <li><a href="#インターンを振り返ってみて">インターンを振り返ってみて</a></li> <li><a href="#謝辞">謝辞</a></li> </ul> <h2 id="インターンのテーマ内容について">インターンのテーマ内容について</h2> <p>今回のインターンで開発・調査したFPGAボードはLattice Semiconductor社から販売されているiCEstick (iCE40 HX1K)です.サイズとしてはUSBより一回り大きいぐらいのとてもコンパクトなFPGAボードです.<br /> Lattice Semicondutor社はアメリカに本社を置くFPGAボードの開発を行う半導体会社で、販売されているFPGAボードは小型で低消費電力が特徴です.</p> <p>iCEstick (iCE40 HX1K) の実機調査はメンターのごとぅーさんが作った音源ICの RTL (以下、音源IC) とPCのやり取りを行う部分を開発し、その都度開発ツールや注意点などのノウハウをまとめていく方針で進めました. インターンでの開発・調査の流れは大まかに以下のように進めました.</p> <ul> <li>iCEstickでLチカプログラムを動作させ、開発の一連の流れとLatticeのソフトウェアの使用方法を確認</li> <li>音源ICの仕様を理解し、FPGA側のデータの受信部分を作成</li> <li>PC側のデータの送信アプリを作成</li> <li>iCEstickの音源ICと通信部分の動作確認</li> </ul> <h2 id="実装物の概要">実装物の概要</h2> <p>インターンでは画像の点線の部分のモジュールをVerilogで実装しました. <figure class="figure-image figure-image-fotolife" title="モジュールの概観図"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/f/fgoto/20211015/20211015145900.png" alt="f:id:fgoto:20211015145900p:plain" width="1200" height="675" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>モジュールの概観図</figcaption></figure></p> <p>それぞれのモジュールについて簡単に説明します.</p> <ul> <li>uart_rx.v: PCからUARTで送られた8bitのデータを受信し、8bitのバスにして出力するモジュール</li> <li>decoder.v: 受信したデータがどのコマンドかをデコードするモジュール</li> <li>addr_counter.v: メモリアドレスをインクリメントするモジュール</li> <li>reg_ram.v: 8bit * 16本のレジスタアレイ(RAMの代替として使用、理由は後述)</li> </ul> <h2 id="コマンド送信アプリの概要">コマンド送信アプリの概要</h2> <p>さらに、今回のインターンではPCからiCEstick HX1Kへ設定データを送るためのコマンドの仕様と、コマンドを送信するための簡単なGUIアプリも作成しました.</p> <h3 id="コマンドの仕様">コマンドの仕様</h3> <p>音源ICから音を発生させるためのコマンドとして、以下の5種類を定義しました.</p> <ul> <li>start : コマンド送信の開始を知らせる</li> <li>end : コマンド送信の終了を知らせる</li> <li>set_ch : 各チャンネルの周波数と音量、エンベロープの有無を設定する</li> <li>set_no : ノイズの周波数を設定する</li> <li>set_env : エンベロープの周波数と形を設定する</li> <li>wait : 指定された時間だけコマンドの送信を停止する</li> </ul> <p>例えば、1KHzの音で音量が100の音を出力させたい場合は以下のように記述します.</p> <pre class="code" data-lang="" data-unlink>start set_ch a, 1000, 100, 0 set_mix 01, 00, 00 end</pre> <h3 id="GUIアプリの概観">GUIアプリの概観</h3> <p>GUIアプリでは、二種類の方法でコマンドをiCEstick (iCE40 HX1K)に送信することができます.<br /> まず一つ目が、GUI上で周波数などの各種の設定をして、一つの音の設定をコマンド列として送信する方法です.<br /> 二つ目に、あらかじめコマンドが記述されたテキストファイルを読み込んで、複数の音のコマンド列を送信する方法です. 二つ目の方法は、曲を演奏させたい場合を考慮して実装しました.<br /> 例えば、ゼルダのハイラル平原のテーマ曲を音源ICに演奏させたい場合、waitコマンド や set_chコマンド などを組み合わせたコマンド列が記述されたファイルを読み込むことで演奏させることが可能です.</p> <p><figure class="figure-image figure-image-fotolife" title="コマンド送信アプリの概観"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/f/fgoto/20211015/20211015145846.png" alt="f:id:fgoto:20211015145846p:plain" width="1200" height="675" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>コマンド送信アプリの概観</figcaption></figure></p> <h2 id="BRAMの不安定な挙動">BRAMの不安定な挙動</h2> <p>実装したVerilogコードを内蔵のBRAMを用いてiCEstick (iCE40 HX1K)にプログラムを書き込むとBRAMが不安定な挙動を示しました.<br /> iCEstick (iCE40 HX1K)のメモリの仕様書によると読み出しはアドレスがセットされてから、1clock遅れてデータが出力されます.<br /> つまり、以下のようなタイミングチャートが期待される挙動です.<br /> <figure class="figure-image figure-image-fotolife" title="仕様書のタイミングチャート"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/f/fgoto/20211015/20211015145909.png" alt="f:id:fgoto:20211015145909p:plain" width="390" height="117" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>仕様書のタイミングチャート</figcaption></figure></p> <p>しかし、ロジックアナライザで計測された波形ではアドレスセットと同時にメモリからデータが読み出されていました. つまり、以下のようなタイミングチャートになります.<br /> <figure class="figure-image figure-image-fotolife" title="実際に計測された波形でのタイミングチャート"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/f/fgoto/20211015/20211015145918.png" alt="f:id:fgoto:20211015145918p:plain" width="390" height="117" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>実際に計測された波形でのタイミングチャート</figcaption></figure></p> <p>さらに、これを踏まえてコードを変更すると仕様書の通りにメモリから1clock遅れてデータが出てくるという堂々巡りの状態に陥りました.<br /> したがって、内蔵のBRAMの使用は避けて8bit*16本のレジスタアレイをBRAMの代替として使用することにしました.</p> <h2 id="ピンアサインの変更による振る舞いの変化">ピンアサインの変更による振る舞いの変化</h2> <p>メモリ以外にも出力のピンアサインを変更すると出力の挙動が変化するという問題にも直面しました.</p> <p>1KHzの音が正しく出力されていて、内部配線の出力を見るためにピンアサインを変更すると1KHzの音が出力されなくなるというケースがありました. 最低限、音を正しく出力させるためにピンアサインを変更して正しく出力される組み合わせを探しましたが、どのピンアサインでも何かしらのコマンドが正しく動作しませんでした. (エンベロープは動作するけど、ノイズが動作しない..., etc..)</p> <p>原因としては、論理合成時の最適化によって内部配線が消失しているのではと考えました. メモリの不安定な挙動に対処するためにレジスタアレイを使用したので、ロジックセルの使用率が(957/1280)と高くなっていました. ロジックセルの使用率が高いので、論理合成ツールが不要と判断した内部配線を積極的に削除しているとようです.</p> <p>そこで、レジスタアレイの本数を16本から8本に減らし、論理合成ツールの設定を変更することで解決しました.</p> <p>また、論理合成ツールはデフォルトのSymplify ProからLattice Synthesis Engine(LSE)に変更し、Resource SharingとRemove Duplicate Registerというオプションを無効化しました.</p> <p>そうすると、音源モジュールが正しく動作するようになりました.</p> <h2 id="まとめ">まとめ</h2> <p>今回のインターンでは、Lattice Semicondutor社のFPGAボード iCEstick (iCE40 HX1K)にPCとの通信モジュールを開発し、PCからやり取りできる音源ICモジュールを実装しました.<br /> また、実装の際に得られたソフトウェアの使い方や注意点を資料にまとめました.<br /> 作成した音源モジュールはインターンの終了日前日の夜に正しく動作するようになりました. (本当によかった...)</p> <h2 id="インターンを振り返ってみて">インターンを振り返ってみて</h2> <p>僕はFPGAに興味はあるけど実際にはやったことはない状態で今回のインターンに申し込みました. 申し込みをした理由はいくつかありますが、最も大きな理由の一つは何か物理的にものを作り動かすのは面白そうだと思ったからです.</p> <p>僕は普段ソフトウェアの開発をしているときに自分の作ったものが動くのを物理的にみたいと思うことがたびたびありました.<br /> じゃあ、ラズパイでもやればいいじゃないかと思われる人がいるかもしれません.<br /> しかし、ラズパイはすでにCPUが搭載されOSが動作します.<br /> また、ラズパイを用いたデバイスの実装はソフトウェア開発の域を完全には脱しきれていないようにも思っていました.<br /> Pythonで色々できてしまう.<br /> そこでVerilogなどのハードウェア記述言語を用いて、回路を自由にプログラムできるFPGAに興味を持ちました.</p> <p>インターン中のFPGA開発は慣れていない部分が多くごとぅーさんに助けてもらいながらでしたが、とても楽しかったです.特に音源モジュールがインターンの終了日の前日に動作したときは嬉しかったです.</p> <p>音源モジュールはインターン終了日の前日の夜に正しく動作するようになったので、 この原稿も当初は「動きませんでした.残念です...」と書いていました.</p> <p>今回のインターンを経て、FPGAボードを購入して自作CPUを動作させたいなと考えています.</p> <p>個人的な感想ですが、普段はソフトウェアをやっているけれども自分のプログラムを物理的に動作させてみたいと思っている人にはぜひ参加して欲しいインターンだと思います.</p> <h2 id="謝辞">謝辞</h2> <p>まず、今回のインターンでメンターをして頂いたごとぅーさんに心から感謝します.<br /> ハードウェアの素人がいきなりインターンに来たにもかかわらず、大変丁寧に教えていただきました.<br /> また、インターンの参加に対して温かく受け入れてくださった株式会社ネフロックの社員の皆様に心から感謝します.<br /> 最後に、楽しい催しを開いてくださったNefrockビルの皆様にも心から感謝します.</p> fgoto Xilinx Kria K26 SOM 拡張基板の設計 その3 hatenablog://entry/13574176438017481705 2021-10-05T11:37:33+09:00 2021-10-05T11:38:40+09:00 設計した K26 拡張基板 (左: 表面、右: 裏面) こんにちは! ネフロックでハードウェアを担当している ごとぅー です。 前回のブログでは K26 SOM についてをお話させていただきました。 いよいよ今回は設計した K26 SOM の拡張基板について少しお話いたします。 電源周り 電源の種類 電源入力 電源シーケンス ペリフェラル コンフィギュレーション周り PSペリフェラル PLペリフェラル おわりに 電源周り SOMの電源周りの接続は下記の図になっています。 SOM 電源周り接続図 電源の種類 前回も言った通り SOM の動作に最低限必要な電源は VCC_SOM(+5V) だけです… <p><figure class="figure-image figure-image-fotolife" title="設計した K26 拡張基板 (左: 表面、右: 裏面)"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/f/fgoto/20211004/20211004132409.jpg" alt="f:id:fgoto:20211004132409j:plain" width="1200" height="900" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>設計した K26 拡張基板 (左: 表面、右: 裏面)</figcaption></figure></p> <p>こんにちは! ネフロックでハードウェアを担当している ごとぅー です。<br /> <a href="https://blog.nefrock.com/entry/2021/09/24/200247">前回のブログ</a>では K26 SOM についてをお話させていただきました。<br /> いよいよ今回は設計した K26 SOM の拡張基板について少しお話いたします。</p> <ul class="table-of-contents"> <li><a href="#電源周り">電源周り</a><ul> <li><a href="#電源の種類">電源の種類</a></li> <li><a href="#電源入力">電源入力</a></li> <li><a href="#電源シーケンス">電源シーケンス</a></li> </ul> </li> <li><a href="#ペリフェラル">ペリフェラル</a><ul> <li><a href="#コンフィギュレーション周り">コンフィギュレーション周り</a></li> <li><a href="#PSペリフェラル">PSペリフェラル</a></li> <li><a href="#PLペリフェラル">PLペリフェラル</a></li> </ul> </li> <li><a href="#おわりに">おわりに</a></li> </ul> <h1 id="電源周り">電源周り</h1> <p>SOMの電源周りの接続は下記の図になっています。 <figure class="figure-image figure-image-fotolife" title="SOM 電源周り接続図"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/f/fgoto/20211002/20211002220336.png" alt="f:id:fgoto:20211002220336p:plain" width="1177" height="456" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>SOM 電源周り接続図</figcaption></figure></p> <h2 id="電源の種類">電源の種類</h2> <p>前回も言った通り SOM の動作に最低限必要な電源は VCC_SOM(+5V) だけですが、 今回はコンフィギュレーション周りとペリフェラルのため下記の電源を実装しています。</p> <ul> <li>VCC_SOM:+5V (Switching)</li> <li>コンフィギュレーション、PSペリフェラル: +1.8V (Switching)</li> <li>PSペリフェラル:+3.3V (Switching)</li> <li>PL-IOバンク :+1.8V (Switching)</li> <li>PLペリフェラル:+1.8V (LDO)</li> <li>PLペリフェラル:+3.3V (LDO)</li> </ul> <p>VCC_SOMから Core, PLL, PS 用電源が生成されるため、データシートによれば最大電流4Aで最大ノイズが 50mVpp 以下の電源を準備する必要があります。今回は KV260 の回路図を参考に同等の同期整流型のスイッチング電源を採用しました。</p> <p>JTAG と SD でのコンフィギュレーション用と、PSペリフェラルのために +1.8V と +3.3V 、PL-IOバンク用に +1.8V をマルチ出力の同期整流型のスイッチング電源で生成しています。 そして PLペリフェラルの Audio Codec IC 用に +1.8V と +3.3V をリニアレギュレータ電源ICで生成しています。</p> <p>今回 VCC_SOM以外の上記の電源を5chマルチ出力電源ICを使うことにより回路面積を縮小しています。</p> <h2 id="電源入力">電源入力</h2> <p>今回の拡張基板のポイントの一つが、電源入力にUSB-PDを採用したことです。<br /> KV260では12VのACアダプター入力になっていますが、ACアダプターだと同じジャック経でも電圧や電流容量が異なり回路を壊してしまうことがあります。 USB-PD の機能である Power Data Object (PDO) の仕組みを使うことで、電圧と電流の仕様がお互いに一致したときだけ拡張基板に電源が供給されるようにしました。 またエッジシチュエーションを想定しているので、USB-PD であればモバイルバッテリーでも動作できます。</p> <p>またパワーオンには単純なスライドスイッチを採用せず パワーオン/オフ コントローラー IC を用いることにより、小型のプッシュスイッチでオン/オフができるのと、システム側からパワーオフすることができる設計にしました。</p> <h2 id="電源シーケンス">電源シーケンス</h2> <p>データシートをもとに下記のパワーオンシーケンスを設計しています。</p> <ol> <li>USB-PDに電源入力をする</li> <li>パワーオン/オフ コントローラー のプッシュスイッチを押す</li> <li>パワーオン/オフ コントローラー が VCC_SOM の電源ICをイネーブルにする</li> <li>VCC_SOM の電源IC のパワーグッド がアサートされ、SOM の PWROFF_C2M_L をネゲートする</li> <li>SOM の VCCO_EN_PS と VCCO_EN_PL がアサートされ、ペリフェラル電源の +1.8V と +3.3V をイネーブルにする</li> <li>ペリフェラル電源のすべてのパワーグッドがアサートされたら、SOM の PS_POR_L をネゲートして SOM をブートする</li> </ol> <h1 id="ペリフェラル">ペリフェラル</h1> <p>SOMのペリフェラルの接続は下記の図になっています。 <figure class="figure-image figure-image-fotolife" title="SOM ペリフェラル周り接続図"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/f/fgoto/20211002/20211002221303.png" alt="f:id:fgoto:20211002221303p:plain" width="1134" height="570" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>SOM ペリフェラル周り接続図</figcaption></figure></p> <h2 id="コンフィギュレーション周り">コンフィギュレーション周り</h2> <p>KV260では基本的にXilinxのチュートリアルをベースに使う想定?なので Boot Mode は SOM 内蔵の QSPI でのブート固定になっています。<br /> 今回の拡張基板も最終的には SOM 内蔵の QSPI か eMMC でのブートを想定しているものの、開発段階では使いにくいため他のブードモードも選べるようにMODE ピンにDIPスイッチを実装して JTAG/SD でのブートもできるようにしました。</p> <h2 id="PSペリフェラル">PSペリフェラル</h2> <p>KV260 にはカメラ画像の処理ができるようにPS側にカメラや USB3.0、映像出力のインターフェースが実装されています。<br /> 今回は音声処理をメインで行うため、それらのインターフェースは基板サイズも消費電力も大きくなるので削除し、代わりにBT/Wi-Fiモジュールを実装しました。<br /> また ZYNQ や Linux のデバックができるように USB-Serial (UART) は残してあります。<br /> SOM は DDR や QSPI、eMMC などのメモリデバイスがすでに実装済みなので、PSペリフェラルの設計はかなり楽でした。</p> <h2 id="PLペリフェラル">PLペリフェラル</h2> <p>私も KV260 の実物を見るまでわからなかったのですが、KV260 の SOM の SOM240_2 コネクタは実装されておらず、KV260 側もコネクタは実装されていません。KV260 は FPGA をアクセラレーターとして使うことを想定しているため PL の外部I/Oしかアサインされていない SOM240_2 コネクタはコスト削減のため削除されたのかもしれません。<del>(KV260評価ボードより SOM 単体のほうが価格が高いので、KV260 を買って SOM 単体を取り外して使われるのを防ぐため?) </del></p> <p>ただ SOM240_1 コネクタにもPLの外部I/Oが一部アサインされており、今回の用途ではこのピン数で間に合うため設計した拡張基板も SOM240_2 は未使用となっています。</p> <p>今回の用途が「音声処理をする」なのでPL側にはオーディオコーデック IC を実装しています。オーディオコーデック IC でマイク等からのアナログ入力をAD変換してFPGAに入力し FPGA でその信号を処理して再び オーディオコーデック IC に戻しDA変換を行いヘッドホンなどに出力します。<br /> 今回は オーディオコーデック IC に使うクロックの発振器も実装し、PL側のクロック入力専用ピンにアサインしました。</p> <h1 id="おわりに">おわりに</h1> <p>今回は Xilinx Kria K26 SOM とその拡張基板の設計について3回に分けてお話しました。<br /> SOM は新発売のデバイスで Xilinx のオフィシャルドキュメント以外の情報がなかったので設計中は動作するか心配でしたが、なんとか改修などなく動作させることができました。<br /> SOMを使用したことにより、従来のFPGA基板の設計で必要な、電源、メモリ、コンフィギュレーションなどの設計をかなり軽減することができるだけでなく、基板サイズや基板層数、部品点数などが抑えられコスト的にもメリットを感じられました。</p> <p>3回に渡りこの記事を読んでいただいた皆様どうもありがとうございました。 引き続きハードウェアに関しての記事もアップしていきますので、今後ともよろしくおねがいします!</p> fgoto Xilinx Kria K26 SOM 拡張基板の設計 その2 hatenablog://entry/13574176438014456640 2021-09-24T20:02:47+09:00 2021-09-24T20:02:47+09:00 Xilinx Kria KV260 ビジョン AI スターターキット こんにちは! ネフロックでハードウェアを担当している ごとぅー です。 前回のブログでは K26 SOM 拡張基板の概要をお話させていただきましたが、概要だったため内容がちょっと薄かったかと思います。 今回は Xilinx Kria K26 SOM の技術的なことについてもう少しお話いたします。 K26 SOM について K26 SOM のドキュメント K26 SOM のインターフェース サイドバンド信号 パワーマネジメント信号 PSのI/O PLのI/O まとめ K26 SOM について 前回もお話した通り今回の基板の目的… <p><figure class="figure-image figure-image-fotolife" title="Kria KV260 ビジョン AI スターターキット"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/f/fgoto/20210924/20210924171301.jpg" alt="f:id:fgoto:20210924171301j:plain" width="1200" height="1000" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Xilinx Kria KV260 ビジョン AI スターターキット</figcaption></figure></p> <p>こんにちは! ネフロックでハードウェアを担当している ごとぅー です。<br /> <a href="https://blog.nefrock.com/entry/2021/09/17/230206">前回のブログ</a>では K26 SOM 拡張基板の概要をお話させていただきましたが、概要だったため内容がちょっと薄かったかと思います。<br /> 今回は Xilinx Kria K26 SOM の技術的なことについてもう少しお話いたします。</p> <ul class="table-of-contents"> <li><a href="#K26-SOM-について">K26 SOM について</a></li> <li><a href="#K26-SOM-のドキュメント">K26 SOM のドキュメント</a></li> <li><a href="#K26-SOM-のインターフェース">K26 SOM のインターフェース</a><ul> <li><a href="#サイドバンド信号">サイドバンド信号</a></li> <li><a href="#パワーマネジメント信号">パワーマネジメント信号</a></li> <li><a href="#PSのIO">PSのI/O</a></li> <li><a href="#PLのIO">PLのI/O</a></li> </ul> </li> <li><a href="#まとめ">まとめ</a></li> </ul> <h1 id="K26-SOM-について">K26 SOM について</h1> <p>前回もお話した通り今回の基板の目的は Kria K26 SOM を使って「エッジシチュエーションでリアルタイムにAIで音声処理をする」ということでした。</p> <p>K26 SOM は Xilinx が今まで発売していたFPGAデバイス単体とは異なり、FPGAとその周辺部品を一つのバッケージにした System On Module (SOM) という全く新しいデバイスになっています。</p> <p>したがってまず大前提として K26 SOM がちゃんと動作するように設計しなければならないので、K26 SOM についてある程度理解する必要があります。</p> <h1 id="K26-SOM-のドキュメント">K26 SOM のドキュメント</h1> <p>K26 SOMは初めて使うデバイスなので、拡張基板の設計開始前に下記のドキュメントを読んでおきました。</p> <ul> <li>Kria SOM Carrier Card Design Guide <a href="https://www.xilinx.com/support/documentation/user_guides/som/ug1091-carrier-card-design.pdf">(UG1091)</a></li> <li>Kria K26 SOM Data Sheet <a href="https://www.xilinx.com/support/documentation/data_sheets/ds987-k26-som.pdf">(DS987)</a></li> <li>KV260 ML Starter Kit Carrier Card <a href="https://www.xilinx.com/products/som/kria/kv260-vision-starter-kit.html#documentation">回路図</a></li> </ul> <h1 id="K26-SOM-のインターフェース">K26 SOM のインターフェース</h1> <p>K26 SOMは SO240_1 と SOM240_2 の2つのB2Bコネクタで拡張基板と接続するように設計されています。<br /> SOM240_1コネクタ側には主にSOMの動作に必要な サイドバンド信号 と パワーマネジメント信号 そして PSのI/O がアサインされています。SOM240_2コネクタ側には PLの外部I/O とその電源入力がアサインされています。</p> <p>したがってPLの外部I/Oを使わないのであればSOM240_2コネクタ側のピン接続は不要になります。 KV260 でもSOM240_2側のPL I/Oは使わない設計になっているため、拡張基板にも付属するK26 SOMにもコネクタは実装されていません。 <figure class="figure-image figure-image-fotolife" title="KV260 拡張基板 (片方のコネクタは未実装)"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/f/fgoto/20210924/20210924191456.jpg" alt="f:id:fgoto:20210924191456j:plain" width="960" height="720" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>KV260 拡張基板 (片方のコネクタは未実装)</figcaption></figure></p> <h3 id="サイドバンド信号">サイドバンド信号</h3> <p>この信号には電源、プロセッサ、およびコンフィギュレーション信号から構成されています。</p> <p>まずは電源ですが、SOMの動作だけ考えれば最低限必要な電源は VCC_SOM(+5V) だけです。 SOMは内部で VCC_SOM から FPGA の CORE、PLL、PS用電源のほか、DDRメモリ、QSPI、eMMC の電源も生成します。<br /> ただしコンフィグレーションで JTAG や SD などを使う場合は電源(1.8V)が必要なり、PLの外部I/Oを使う場合もそこのバンク電源が必要になります。</p> <p>通常FPGA基板を設計するときにはFPGA の CORE や PLL 等に対して、それぞれ大電流かつノイズの少ない電源を設計する必要がありますが SOM ではそれらの電源が内部で生成されるため拡張基板が設計しやすくなっています。</p> <p>JTAG と PS_MODE に関してはどちらもSOM内部で+1.8Vにプルアップされているため、必要に応じてコネクタやスイッチに割り当てます。 PS_SRST_C2M_L は SOM Zynq MPSoC の PS_SRST_B信号で通常デバッグ時に使用します。 PS_POR_L はHighにアサートするとブートプロセスが開始するので、すべての電源が安定した段階でアサートします。</p> <h3 id="パワーマネジメント信号">パワーマネジメント信号</h3> <p>SOMのパワーマネジメント信号には下記があり、詳細は<a href="https://www.xilinx.com/support/documentation/data_sheets/ds987-k26-som.pdf">データシート</a>を参照してもらえばよいのですが僕の雑な説明をしておきます。</p> <ul> <li>PWROFF_C2M_L: SOMの電源シャットダウン信号で、LOWにするとSOMの電源OFFシーケンスが走りシャットダウンする。</li> <li>PWRGD_LPD_M2C: SOMのPSの低電力ドメイン (LPD) の電源ステータスを示す。</li> <li>PWRGD_FPD_M2C: SOMのPSのフル電力ドメイン (FPD) の電源ステータスを示す。</li> <li>PWRGD_PL_M2C: SOMのPLの電源ステータスを示す。</li> <li>VCCOEN_PS_M2C: SOM電源システムからPSペリフェラルの電源オンが可能であることを示す。</li> <li>VCCOEN_PL_M2C: SOM電源システムからPLペリフェラルの電源オンが可能であることを示す。</li> </ul> <h3 id="PSのIO">PSのI/O</h3> <p>PS I/Oには500/501/502の3つのバンクがありますが、バンク500はSOM内部ですべて使われていて バンク501の一部もパワーマネジメント機能として使われているのでよく確認してから使用する必要があります。</p> <p>ただKV260にはPS周りで一般的によく使われるインターフェース(SD/USB/DP/HDMI/MIPI/Ethernet等)がほぼ揃っているため、拡張基板を新規設計する場合必要に応じてそこから踏襲すればよいと思います。</p> <p>またPS I/Oはすべて+1.8Vで電源はSOM内部で生成されるので供給する必要はなく、DDRメモリも実装されているので、拡張基板側で設計する必要ありません。</p> <p>以上のことから SOMのPS周りも設計しやすくなっています。</p> <h3 id="PLのIO">PLのI/O</h3> <p>PLのI/Oには高性能I/O(HPIO)バンクと高密度I/O(HDIO)バンクとGTHトランシーバーがあります。 KV260ではSOM240_1側のHDIOにPMOD(+3.3V)がアサインされていてますが、 SOM240_2側のPS I/Oは一切使っていないので拡張基板を新規設計する場合すべてユーザーが使用することができます。<br /> ただし使うバンク毎に電源が必要でHDIOのI/O電圧は1.2~3.3Vに対して、HPIOのI/O電圧は1.0~1.8Vなので注意が必要です。</p> <h1 id="まとめ">まとめ</h1> <p>今回はK26 SOMの簡単な説明になってしまいましたが、 K26 SOMには FPGA ボードに最低限必要なペリフェラルが実装済みなので、 拡張基板の設計において結構な工数削減ができるほか、基板層数や部品数の削減、 等長配線やインピーダンスマッチングなども減らすことができるため基板の価格も抑えることができそうです。<br /> また KV260 にはPS周りのインターフェースが一通り実装されているので非常に参考になります。</p> <p>今回の記事の K26 SOM や KV260 について間違えていることも書いてあるかもしれませんので、詳細についてはXilinxのデータートを参照してください。</p> <p>次回はいよいよ今回設計したK26 SOM 拡張基板の中身についてお話したいと思います!</p> fgoto Xilinx Kria K26 SOM 拡張基板の設計 その1 hatenablog://entry/13574176438012715250 2021-09-17T23:02:06+09:00 2021-09-18T22:50:25+09:00 K26 SOM 拡張基板の写真 イントロダクション こんにちは! ネフロックでハードウェアを担当している ごとぅー です。 ネフロックで以前から行っている FPGA を使ったプロジェクト(KUROFUNE)は、 今まで Xilinx のアクセラレータカードや評価用FPGA基板を使ってきましたが、 いよいよ本番に近いハードウェアを検討する段階になってきました! そんな矢先、Xilinx から Kria K26 System on Module(SOM) が発表され、 まさにAI搭載FPGAのエッジソリューションを企む僕らが求めていたデバイスであることが判明しました。 そこで評価基板である KV2… <p><figure class="figure-image figure-image-fotolife" title="K26 SOM 拡張基板の写真"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/f/fgoto/20210917/20210917210832.jpg" alt="f:id:fgoto:20210917210832j:plain" width="720" height="537" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>K26 SOM 拡張基板の写真</figcaption></figure></p> <h3>イントロダクション</h3> <p>こんにちは! ネフロックでハードウェアを担当している ごとぅー です。<br /> ネフロックで以前から行っている FPGA を使ったプロジェクト(KUROFUNE)は、 今まで Xilinx のアクセラレータカードや評価用FPGA基板を使ってきましたが、 いよいよ本番に近いハードウェアを検討する段階になってきました!</p> <p>そんな矢先、Xilinx から Kria K26 System on Module(SOM) が発表され、 まさにAI搭載FPGAのエッジソリューションを企む僕らが求めていたデバイスであることが判明しました。</p> <p>そこで評価基板である KV260 を速攻で発注、なんとか7月に入手することができました。</p> <p>SOM の評価を行う一方で、KV260 は評価基板なので僕らの想定しているアプリケーションでは ハードウェア的に取り回しが悪く機能も少し不足しているのでSOMの拡張基板を新規に設計しました。</p> <p>先日ついに基板が上がって来ましたので、このブロクで少し概要を紹介したいと思います!</p> <h3>拡張基板の概要</h3> <p>まずやりたいことは「リアルタイムにAIで音声処理をする」になります。 そしてエッジシチュエーション想定なので、</p> <ul> <li><p>コンパクト</p></li> <li><p>低消費電力</p></li> <li><p>モバイルバッテリー駆動可能</p></li> </ul> <p>これらを考慮してSOMのリファレンス・デザインである KV260 をベースに設計を行い、 その結果今回のSOM基板は下記のようなブロック図になりました。<br /> <figure class="figure-image figure-image-fotolife" title="K26 SOM 拡張基板 ブロック図"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/f/fgoto/20210917/20210917195020.png" alt="f:id:fgoto:20210917195020p:plain" width="811" height="325" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>K26 SOM 拡張基板 ブロック図</figcaption></figure></p> <p>ブロック図を見てもらえばおわかりの通り KV260 から単純に周辺のインターフェースを取っ払った感じではありますが…ポイントとしては、</p> <ul> <li><p>アナログオーディオ入出力機能の実装</p></li> <li><p>外部通信をワイヤレスにするためBT/Wi-Fiモジュールを実装</p></li> <li><p>極力不要なインターフェースは削除</p></li> <li><p>電源入力をUSB-PDにしてモバイルバッテリー対応</p></li> </ul> <p>などとなっています。</p> <p>なお拡張基板の写真には KV260 用 SOM を取り急ぎ取り付けていますが、実際には単体購入した K26 SOM を搭載します。</p> <p>次回は拡張基板をもう少し詳細にお話する予定なのでお楽しみに!</p> fgoto ネフロックで特許を取りました② 〜画像生成技術〜  hatenablog://entry/26006613773867269 2021-06-10T08:52:08+09:00 2021-06-10T08:52:08+09:00 前回は、ネフロックで初めて特許を取得した、掛けているメガネを映像から消して別のメガネをバーチャル試着できる「眼鏡試着支援装置」について書きました。 では、一体どうやって眼鏡を消したのか??? 今回は、ネフロックにとって2つ目の特許、この装置での眼鏡消しにも活用している「画像処理技術」について書いていきます。 ■発明の背景 ■発明の概要 ■ポイント ■この発明により期待できること ■実用中の事例 ■おわりに ■発明の背景 従来の画像生成技術では、ある状態Aの画像から別の状態Bの画像を生成するには、状態Aと状態Bのペアとなる画像データを用意し、その相関関係を学習することによってモデルを生成する方法… <p><a href="https://blog.nefrock.com/entry/2021/05/20/105357">前回</a>は、ネフロックで初めて特許を取得した、掛けているメガネを映像から消して別のメガネをバーチャル試着できる「眼鏡試着支援装置」について書きました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fblog.nefrock.com%2Fentry%2F2021%2F05%2F20%2F105357" title="ネフロックで特許を取りました① 〜眼鏡試着支援装置〜  - Nefrockの日記" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"></cite></p> <p> </p> <p><strong>では、一体どうやって眼鏡を消したのか???</strong></p> <p> </p> <p>今回は、ネフロックにとって2つ目の特許、この装置での眼鏡消しにも活用している「画像処理技術」について書いていきます。</p> <p> </p> <ul class="table-of-contents"> <li><a href="#発明の背景">■発明の背景</a></li> <li><a href="#発明の概要">■発明の概要</a></li> <li><a href="#ポイント">■ポイント</a></li> <li><a href="#この発明により期待できること">■この発明により期待できること</a></li> <li><a href="#実用中の事例">■実用中の事例</a></li> <li><a href="#おわりに">■おわりに</a></li> </ul> <p> </p> <h4 id="発明の背景"><strong>■発明の背景</strong></h4> <p>従来の画像生成技術では、ある状態Aの画像から別の状態Bの画像を生成するには、状態Aと状態Bのペアとなる画像データを用意し、その相関関係を学習することによってモデルを生成する方法が知られていました。</p> <p>しかしそれが人間のような生体画像の場合、例えばメガネを掛けている人の画像から掛けていない人の画像を生成したい場合などにおいて、現実には前述の手法を実践するのは困難でした。なぜなら、ペアとなる画像というのは、顔の位置や向きなどメガネ以外の部分は完全に一致している必要があるからです。そのようなデータを用意するのは物理的に不可能に近く、またそういったデータセットも当時存在しませんでした。</p> <p>そのため、実際にビジネスにおいて実用化しようとすると、この適切なデータを用意することが難しい場合が意外と多く、現実にはなかなか実用化が進まないという課題がありました。</p> <p> </p> <p>(ちなみに、先ほどのメガネの例では、画像生成技術以外にも、メガネを掛けた人物のメガネ部分を検出してマスクで覆うことによってメガネを見えなくする、という手法も海外で提案されています。しかし、これにはメガネごとに複雑な演算を必要とし、試着をするたびに多くのステップをユーザーが踏まなければならないため、この手法もまた実用化するのは現実的でありませんでした。)</p> <p> </p> <p>そこでネフロックでは、そういった課題を解決できる、独自の構成による画像生成エンジンを開発しました。</p> <p> </p> <h4 id="発明の概要"><strong>■発明の概要</strong></h4> <p><strong><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;">①学習用の教師データを生成するフェーズと、②1で生成した教師データを用いて学習するフェーズと、③前記2で学習した学習済モデルを用いて実際の実用場面で推論を行う推論フェーズから、構成される画像出力方法。</span></strong></p> <p> </p> <p><strong>▶ ①教師データ生成フェーズ</strong></p> <p>本物のメガネあり画像からメガネなし画像を生成する「生成部(Generator)」と、その生成したメガネなし画像と別の本物のメガネなし画像をまぜて、生成か本物かを判定する「識別部(Discriminator)」にて構成されています。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20210608/20210608143247.png" alt="f:id:s_akiko:20210608143247p:plain" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p><strong>▶ ②学習フェーズ</strong></p> <p>①で本物であると識別された本物のメガネあり画像と生成されたメガネなし画像をペアの教師データとして、相関関係を学習することによってニューラルネットワークの学習モデルを生成する「学習部」にて構成されています。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20210608/20210608143046.png" alt="f:id:s_akiko:20210608143046p:plain" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p><strong>▶ ③推論フェーズ</strong></p> <p>②でできた学習済みのニューラルネットワークモデルを用いて、新たな本物のメガネあり画像から、メガネなし画像を生成する「出力部」にて構成されています。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20210608/20210608143050.png" alt="f:id:s_akiko:20210608143050p:plain" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <ul style="margin: 5px 0px 12px; list-style: none; padding: 12px 12px 12px 33px; border: 0px; outline: 0px; font-size: 14px; vertical-align: baseline; background: #ededed; clear: both; border-radius: 3px; color: #3b3b3b; font-family: 'Hiragino Kaku Gothic ProN', 'Hiragino Sans', Meiryo, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px;"> <li style="list-style-type: disc; word-break: break-all; margin-bottom: 7px;">【発明の名称】画像出力装置及び画像出力方法</li> <li style="list-style-type: disc; word-break: break-all; margin-bottom: 7px;">【特許番号】 特許第6856965号</li> <li style="list-style-type: disc; word-break: break-all; margin-bottom: 7px;">【特許権者】 株式会社ネフロック</li> <li style="list-style-type: disc; word-break: break-all; margin-bottom: 0px;">【公開情報】 <br /><a href="https://www.j-platpat.inpit.go.jp/c1800/PU/JP-6856965/773091865428D1BD19EE5D7E0A4EF02AF962C59404F861709519976AEC85EE9D/15/ja">https://www.j-platpat.inpit.go.jp/c1800/PU/JP-6856965/773091865428D1BD19EE5D7E0A4EF02AF962C59404F861709519976AEC85EE9D/15/ja</a></li> </ul> <p>    </p> <h4 id="ポイント"><strong>■ポイント</strong></h4> <p>1) 教師データを生成するフェーズを組み込むことによって、学習に適したペア画像を生成できるため、適切な学習用データが取得できないというこれまでの問題を解決することができます。</p> <p>2) フェーズ①の段階で実は既に、ある状態の画像から別の状態の画像が生成できるようになっているとお気付きかもしれません。しかし、これを学習モデルとはせずにあくまで生成された画像を教師データとして用い、②の学習フェーズで再度別の種類のネットワークを用いて学習させるという、独自のダブル学習構造にすることで安定性を高めています。これにより、実用化に適したクオリティでの画像生成を実現しています。</p> <p> </p> <h4 id="この発明により期待できること"><strong>■この発明により期待できること</strong></h4> <p>この技術は、ある画像から別の画像への生成に関連した幅広い応用が可能です。<br />これまで適切な学習用データを準備するのが難しかった用途においては特に、事業化への大きな助けになると考えられます。<br /><br />▷人物画像における応用例<br />アクセサリや衣類などの装飾品の有り/無し、メイクの前/後、髪型変更の前/後、整形の前/後、ダイエットの前/後、ある人物の現在/過去/未来など<br /><br />▷物品や風景画像における応用例<br />ある物品の傷の有/無、ある物品の正常/異常、ある風景の季節A/季節Bなど<br /><br />▷その他<br />ある人や物の実在画像/イラスト/CG/アバターなど</p> <p> </p> <h4 id="実用中の事例"><strong>■実用中の事例</strong></h4> <p>この技術は、前回ご紹介したもう一つの特許と同様、「MEGANE on MEGANE(メガネオンメガネ)」というサービスとして、JINS渋谷パルコ店に導入されています。</p> <p>ぜひ、店頭で体験してみてください!!</p> <p><iframe width="560" height="315" src="https://www.youtube.com/embed/mkeLK1Suqtw?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" id="widget2"></iframe><cite class="hatena-citation"></cite></p> <h4 id="おわりに">■おわりに</h4> <p> ネフロックの特許について、2回に渡ってご紹介いたしました。<br />実はこれらの特許は、ネフロックとして初の国際特許も目指して進めているところです。海外市場への展開も積極的に行っていきたいと考えています。</p> <p> </p> <p>当技術にご興味をお持ちいただけましたら、<br />info@nefrock.com までお問い合わせくださいませ。<br />アイディア交換だけからでも、ぜひお気軽にご連絡ください。</p> <p><a href="https://nefrock.com/">https://nefrock.com/</a></p> <p> </p> s_akiko ネフロックで特許を取りました① 〜眼鏡試着支援装置〜  hatenablog://entry/26006613764884182 2021-05-20T10:53:57+09:00 2021-06-01T11:37:50+09:00 久しぶりに更新します。 ブログを振り返ると、#STAYHOMEの記事をたくさんの方に読んでいただいたのが1年前。先の見えにくい状況は変わっていませんが、そんな中でもネフロックはあれから1年色々な挑戦をすることができました。 夏にはNEDOのAI事業に採択が決まり、秋にはネフロックビルでのアートプロジェクトの開催、他にも海外プロジェクトのスタートや複数のサービスリリース、そして特許の取得や初の駅広告展開など、新しいチャレンジが多くありました。 その中で今日は、ネフロックが取得した2つの特許について、書いてみたいと思います。(全2回)第1回は記念すべきネフロック初!の特許、「眼鏡試着支援装置」につ… <p>久しぶりに更新します。 </p> <p>ブログを振り返ると、#STAYHOMEの記事をたくさんの方に読んでいただいたのが1年前。先の見えにくい状況は変わっていませんが、そんな中でもネフロックはあれから1年色々な挑戦をすることができました。</p> <p> 夏には<a href="https://blog.nefrock.com/entry/2020/08/11/191810">NEDOのAI事業に採択</a>が決まり、秋にはネフロックビルでの<a href="https://prtimes.jp/main/html/rd/p/000000008.000051421.html">アートプロジェクトの開催</a>、他にも海外プロジェクトのスタートや複数のサービスリリース、そして特許の取得や初の駅広告展開など、新しいチャレンジが多くありました。</p> <p> </p> <p>その中で今日は、ネフロックが取得した2つの特許について、<br />書いてみたいと思います。(全2回)<br />第1回は記念すべきネフロック初!の特許、「眼鏡試着支援装置」についてです。</p> <p> </p> <ul class="table-of-contents"> <li><a href="#発明の概要">■発明の概要</a></li> <li><a href="#発明の背景">■発明の背景</a></li> <li><a href="#こだわったこと">■こだわったこと</a></li> <li><a href="#この発明により期待できること">■この発明により期待できること</a></li> <li><a href="#実用中の事例">■実用中の事例</a></li> <li><a href="#"> </a></li> <li><a href="#おわりに">■おわりに</a></li> </ul> <p> </p> <h4 id="発明の概要"><strong>■発明の概要</strong></h4> <p><strong>メガネをかけたまま他のメガネを試着できる「バーチャルメガネ試着装置」</strong><br />メガネを着用した状態で画面の前に立ち、新たに着用したいメガネを指定すると、着用中のメガネだけが画面上から消え、新たに着用したいメガネを装着した姿が表示されるプログラム・装置。 </p> <p> </p> <p><strong>STEP1:自分のメガネを掛けたまま、ディスプレイの前に立つ。</strong></p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20210518/20210518160033.png" alt="f:id:s_akiko:20210518160033p:plain" title="" class="hatena-fotolife" itemprop="image" width="502" /></p> <p> </p> <p><strong>STEP2:ディープラーニングを用いた映像処理技術により、</strong><br /><strong>      実際はかけているメガネが映像上から消去される。</strong></p> <div class="images-row mceNonEditable"> <div class="images-row-item"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20210518/20210518160104.png" alt="f:id:s_akiko:20210518160104p:plain" title="" class="hatena-fotolife" itemprop="image" /></div> <div class="images-row-item"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20210518/20210518160110.png" alt="f:id:s_akiko:20210518160110p:plain" title="" class="hatena-fotolife" itemprop="image" /></div> </div> <p> </p> <p><strong>STEP3:3Dデータ化された他のメガネをバーチャル試着することができる。</strong><br /><strong>    ※ 実際は自分のメガネを掛けたままなので、試着姿がはっきり見える</strong></p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20210518/20210518160114.png" alt="f:id:s_akiko:20210518160114p:plain" title="" class="hatena-fotolife" itemprop="image" width="502" /></p> <p> </p> <ul style="margin: 5px 0px 12px; list-style: none; padding: 12px 12px 12px 33px; border: 0px; outline: 0px; font-size: 14px; vertical-align: baseline; background: #ededed; clear: both; border-radius: 3px; color: #3b3b3b; font-family: 'Hiragino Kaku Gothic ProN', 'Hiragino Sans', Meiryo, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px;"> <li style="list-style-type: disc; word-break: break-all; margin-bottom: 7px;">【発明の名称】眼鏡試着支援装置およびプログラム</li> <li style="list-style-type: disc; word-break: break-all; margin-bottom: 7px;">【特許番号】 特許第6813839号</li> <li style="list-style-type: disc; word-break: break-all; margin-bottom: 7px;">【特許権者】 株式会社ネフロック・株式会社カザック</li> <li style="list-style-type: disc; word-break: break-all; margin-bottom: 0px;">【公開情報】 <a href="https://www.j-platpat.inpit.go.jp/c1800/PU/JP-6813839/3DDC0AC66CFD966D692126FB45CC3D42E05AE4D7FD6592887C2866843D71A5CE/15/ja" target="_blank" rel="nofollow ugc noopener" style="color: #358cda; text-decoration: none; background-color: transparent; outline: none;">https://www.j-platpat.inpit.go.jp/c1800/PU/JP-6813839/3DDC0AC66CFD966D692126FB45CC3D42E05AE4D7FD6592887C2866843D71A5CE/15/ja</a></li> </ul> <p>   </p> <h4 id="発明の背景"><strong>■発明の背景</strong></h4> <p>突然ですが、<br /><strong>「メガネを試着するとき、 実は自分の姿がよく見えない 」</strong><br />と、困ったことはありませんか?</p> <p>これは度付きのメガネを着けている人にとっては、当たり前のように存在する悩みでした。店頭に並んだメガネには度数が入っていないため、鏡に写った自分の姿がよく見えないのです。店頭でもSNSでも頻繁に話題になりニーズが明らかにありながら、長年解決されなかった問題でした。</p> <p> </p> <p>そこで私達は、<br /><strong>「度付きの自分のメガネを着けたまま、別のメガネをバーチャル試着できないか?」</strong><br />と考えました。</p> <p> </p> <p>そして発明したのが、<span style="text-decoration: underline;">独自の画像処理によって着用中のメガネをリアルタイムで映像から消し、その上から他のメガネを3Dバーチャル試着することを可能にした、世界初のプログラム・装置</span>です。これによって、視力を落とすことなくスマートに試着することが可能になりました。</p> <p> </p> <h4 id="こだわったこと"><strong>■こだわったこと</strong></h4> <p>最もこだわったのはユーザー体験です。</p> <p>「メガネを着けたまま、他のメガネをバーチャル試着する」というアイディアが完成し、具体的な方法を検討する段階でも、ユーザー視点を重視しました。この段階では、技術的な要素から組み立てたくなるところですが、技術視点での最適と、ユーザー視点での最適は全く異なる可能性があります。</p> <p>例えば下図左のように設計すれば、開発はしやすくなるものの、ユーザーにとっては使いにくくなってしまいます。下図右のようにつくりたい体験をイメージした上で、<br />「じゃあ、メガネを外さずに実現するにはどうすれば良いか?」<br />を検討していきました。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20210519/20210519101253.png" alt="f:id:s_akiko:20210519101253p:plain" title="" class="hatena-fotolife" itemprop="image" width="580" /></p> <p> </p> <h4 id="この発明により期待できること"><strong>■この発明により期待できること</strong></h4> <p><span style="text-decoration: underline;">①ファッション・美容など幅広い業界での活用</span><br />この技術はメガネだけでなく、ユーザーの身に付けるものや身体の一部に関することへの応用が可能です。例えば、洋服や和服の試着、化粧品の試用やメイク方法の提案、整形方法の検討、髪型髪色の変更などに活用することができます。<br /><br /><span style="text-decoration: underline;">②コロナ感染拡大防止を考慮した新しい試着のあり方</span><br />現在、COVID-19に伴う意識や行動の変化により、ユーザーにとっては試着への心理ハードルが上がり、販売員にとっては消毒等の作業負荷が加わってしまっている状況ではないでしょうか。バーチャルフィッティングの導入は、両者のストレスを軽減する新しい試着のあり方として期待できると考えています。</p> <p><br />これまでのバーチャルフィッティング技術では、着用しているものが見えている状態でその上に画像を合成したり、アバターを生成して試着させたりという方法が主流でした。</p> <p>この技術では、リアルタイムに映像から特定の物体を取り除き、その上からバーチャル試着をすることができるため、本当の試着に近い、より自然なユーザー体験を提供できることが強みです。</p> <p> </p> <h4 id="実用中の事例"><strong>■実用中の事例</strong></h4> <p>この技術は、「MEGANE on MEGANE(メガネオンメガネ)」というサービスとして、JINS渋谷パルコ店に導入されています。</p> <p>ぜひ、店頭で体験してみてください!!<br /><br /></p> <p>▽先日、所JAPANで紹介されました!<br /><span style="text-decoration: line-through; font-size: 80%;">※ メガネオンメガネは動画の34:56頃</span><br /><span style="text-decoration: line-through; font-size: 80%;">※ 公開期間は5月24日(月)22:00までとのこと</span></p> <p><span style="text-decoration: line-through;"><a href="https://tver.jp/corner/f0074291">https://tver.jp/corner/f0074291</a></span></p> <p>【5/25追記】</p> <p>上記の公開期間が終了したので、代わりにこちらの動画を貼っておきます。</p> <p><iframe width="560" height="315" src="https://www.youtube.com/embed/mkeLK1Suqtw?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe><cite class="hatena-citation"></cite></p> <h4 id=""> </h4> <h4 id="おわりに">■おわりに</h4> <p>さてこの眼鏡試着装置、</p> <p><strong>「じゃあ、一体どうやって眼鏡を消してるの???」</strong></p> <p>って思ってくださった方!(いますか)</p> <p><br />ありがとうございます!!<br />そこはまた別の特許として取得しましたので、次のブログでお会いしましょう!!!</p> <p> </p> <p>なお、当技術にご興味がありましたら、<br />info@nefrock.comまでお問い合わせくださいませ。<br />アイディア交換だけからでも、ぜひお気軽にご連絡ください。</p> <p><a href="https://nefrock.com/">https://nefrock.com/</a></p> <p> </p> s_akiko NEDOのAI事業に採択されました! hatenablog://entry/26006613613040991 2020-08-11T19:18:10+09:00 2020-08-11T19:18:10+09:00 こんにちは、akikoです。夏ですねー! なかなか明るいニュースのない日々が続きますが、そんな中、ネフロックに嬉しい知らせがやってきました!!! なんと、私たちの新しいプロジェクトが、 NEDOに採択されました!!! 採択通知!!!ひゃほーーい!!! 研究テーマ 今回採択されたネフロックの研究開発テーマは、「FPGAを用いたリアルタイム音声合成を行うAIチップの開発」という取り組みです。以下、プレスリリースで発表した内容より抜粋します。 研究概要 近年、音声合成技術の発展によりスマートスピーカーやボーカロイドなどが実用化され、音声処理技術への期待は高まっています。一方で、画像処理技術と比べると… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20200811/20200811180304.png" alt="f:id:s_akiko:20200811180304p:plain" title="f:id:s_akiko:20200811180304p:plain" class="hatena-fotolife" itemprop="image" width="555" /></p> <p> </p> <p>こんにちは、akikoです。夏ですねー!</p> <p>なかなか明るいニュースのない日々が続きますが、そんな中、<br />ネフロックに嬉しい知らせがやってきました!!!</p> <p> </p> <p>なんと、<br />私たちの新しいプロジェクトが、</p> <p> </p> <p><span style="font-size: 150%;"><strong>NEDOに採択されました!!!</strong></span></p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="採択通知がきた!!!"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20200804/20200804122842.png" alt="f:id:s_akiko:20200804122842p:plain" title="f:id:s_akiko:20200804122842p:plain" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">採択通知!!!ひゃほーーい!!!</figcaption> </figure> <p> </p> <h3>研究テーマ </h3> <p>今回採択されたネフロックの研究開発テーマは、<br /><span style="font-size: 130%;"><strong>「</strong></span><span style="text-decoration: underline; font-size: 130%;"><strong>FPGAを用いたリアルタイム音声合成を行うAIチップの開発</strong></span><span style="font-size: 130%;"><strong>」<br /></strong></span>という取り組みです。<br />以下、プレスリリースで発表した内容より抜粋します。</p> <div class="box2"><span style="font-size: 85%;"><strong>研究概要</strong><br /> 近年、音声合成技術の発展によりスマートスピーカーやボーカロイドなどが実用化され、音声処理技術への期待は高まっています。一方で、画像処理技術と比べるとまだ限定的な用途に留まっており、産業用途も含めた幅広い領域での活用事例には未だ乏しいとも言えます。その理由の一部として、現状の技術では厳密なリアルタイム性が実現できていないことや、確立した方法が整っておらず開発自体が難しいこと、などが考えられます。 本研究では、リアルタイムで高音質な音声合成を実現するため、FPGAを用いた音声合成AIチップを開発します。また、FPGAの持つリコンフィギュラブル性を活かし、ユーザによるカスタム開発を可能にする仕組みを設けることで、音声合成実用化の促進に貢献することを目指します。</span></div> <p><br />…という、まだ技術的に実現されていない難しい挑戦をしようとしています。<br /><br />このブログを読んでくださっていた方には分かるかもしれませんが、<br />実はこれは、今までブログで話題にしてきた<br />「FPGAを用いたAIイヤホン」のプロジェクトをベースに進化させたものです。<br /><br /><span style="font-size: 80%;"><参考>関連する過去ブログ</span><br /><span style="font-size: 80%;"> ・元々のプロジェクト背景  → <a href="https://blog.nefrock.com/entry/2020/02/10/211810" target="_blank">KUROFUNE出航</a><br /></span><span style="font-size: 80%;"> ・技術的な全体概要     → <a href="https://blog.nefrock.com/entry/2020/02/14/215238" target="_blank">明日はTsukuba Mini Maker Faire 2020<br /></a> </span><span style="font-size: 80%;">・音声処理に関するまとめ  → <a href="https://blog.nefrock.com/entry/2020/03/17/171730" target="_blank">コナンくんのアレを作る技術</a><br /> ・FPGAに関するまとめ    → <a href="https://blog.nefrock.com/entry/2020/03/07/212205" target="_blank">FPGAのおはなし</a></span></p> <p> </p> <h3>国家事業に採択 </h3> <p>そして今回採択していただいたのは、<br /><strong>国立研究開発法人新エネルギー・産業技術総合開発機構(NEDO)</strong>が実施する、<br /><strong>「<span style="text-decoration: underline;">AIチップ開発加速のためのイノベーション推進事業</span>」</strong>という、<br />経産省予算の<strong>国家事業</strong>です。<br />以下、NEDOが公開している事業概要より抜粋します。</p> <div class="box2"><span style="font-size: 85%;"><strong>事業概要</strong><br />IoT社会の到来により、急増した情報の高度な利活用を促進するには、ネットワークの末端(エッジ)で情報処理を行うことが不可欠であり、エッジにおいて効率的に情報処理を行うためのAIチップの開発が求められている。 本事業では、AIチップに関するアイディア実用化に向けた研究開発を支援するとともに、AIチップ開発を加速するために整備した設計検証拠点で開発を実施し、AIチップ開発スキームにおける設計、検証をシームレスに実施する ことで、革新的なアイディアの実現を加速する研究開発を進め、世界における存在感を再び獲得することを目指す。</span></div> <p><br />…という、AIチップにテーマを絞った難易度の高い事業に、今回思い切って手を挙げました。</p> <p>採択いただき、これから資金面や環境面等のサポートを受けながら研究を進めていきます。ちなみに環境面では、同じくこのAIチップ事業の一環で産総研と東京大学が共同構築している<a href="https://ai-chip-design-center.org/AIDC_Web22/" target="_blank">「AIチップ設計拠点 AI Chip Design Center (AIDC) 」</a>を私たちも活用させていただく予定で、これも楽しみです!</p> <p> </p> <h3> 意気込み</h3> <p>強力なサポートを得て、現在ネフロックに気合いがみなぎっています。(大きな話になって、内心は若干震えているとかいないとか)</p> <p>今後また公開できる範囲で、研究開発の状況などレポートできればと思います。<br />どうかあたたかい応援よろしくお願いします。<br />がんばるぞーー</p> <p> </p> <p>※プレスリリースも出しました</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fprtimes.jp%2Fmain%2Fhtml%2Frd%2Fp%2F000000004.000051421.html" title="東工大発ベンチャーの株式会社ネフロック、NEDO公募「AIチップ開発加速のためのイノベーション推進事業」へ採択決定" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://prtimes.jp/main/html/rd/p/000000004.000051421.html">prtimes.jp</a></cite></p> s_akiko #STAYHOME 2 大人も子供も遊べるネフロックのAI hatenablog://entry/26006613565696330 2020-05-13T17:31:51+09:00 2020-08-05T11:48:54+09:00 メガネレコメンデーションAIを使って遊ぼう! <p>前回の記事では、<a href="https://blog.nefrock.com/entry/2020/04/27/114035" target="_blank">子ども向けの無料コンテンツ</a>についてまとめ、反響をいただきました。STAYHOME継続中ということで、今回はネフロックが技術提供しているAIサービス「JINS BRAIN」を使って、大人も子供もお家で楽しめる遊びを紹介したいと思います。</p> <p> </p> <ul class="table-of-contents"> <li><a href="#JINS-BRAINとは">■ JINS BRAINとは</a></li> <li><a href="#公式な遊びかた自分に似合うメガネは">■ 公式な遊びかた「自分に似合うメガネは?」</a></li> <li><a href="#非公式な遊びかた気になるアノ人に似合うメガネは">■ 非公式な遊びかた「気になるアノ人に似合うメガネは?」</a></li> <li><a href="#似合い度判定AIの仕組み">■ 似合い度判定AIの仕組み</a></li> <li><a href="#さいごに新技術のPRです">■ さいごに、新技術のPRです。</a></li> </ul> <h4 id="JINS-BRAINとは">■ <span style="text-decoration: underline;">JINS BRAINとは</span></h4> <p>JINS BRAINは、AIを用いたメガネのレコメンデーションサービスです。</p> <p><strong> ・オンラインでメガネのバーチャル試着ができる</strong><br /><strong> ・試着したメガネがどのくらい似合っているかAIが判定してくれる</strong></p> <p>というもので、メガネのJINSのオンラインストア・公式アプリ・店頭で活用されています。<br /><br /></p> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="JINS BRAIN | JINS - 眼鏡(メガネ・めがね)" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fbrain.jins.com%2F" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"></cite></p> <p> </p> <p>さっそく遊びかたをご紹介します!<br />普段メガネを使っている人も、メガネとはまったく無縁の人も、誰でも遊べます!!</p> <p> </p> <hr style="border: 0; border-top: 1px dotted gray;" /> <p> </p> <h4 id="公式な遊びかた自分に似合うメガネは"><strong>■ </strong><span style="text-decoration: underline;"><strong>公式な遊びかた「自分に似合うメガネは?」</strong></span></h4> <p> シンプルにこのサービスを体験していただくだけなのですが、普段メガネを使う人も使わない人も、意外な発見があってけっこう面白いです。<br /><br /></p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="「えっ、自分こんなメガネ似合うんだ?!」"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20200512/20200512124307.jpg" alt="f:id:s_akiko:20200512124307j:plain" title="f:id:s_akiko:20200512124307j:plain" class="hatena-fotolife" itemprop="image" /></p> <figcaption>「えっ、自分こんなメガネ似合うんだ?!」</figcaption> </figure> <p> 使い方</p> <p>1.<a href="https://brain.jins.com/" target="_blank">JINS BRAIN</a> のサイトにいく</p> <p>2.PCやスマホのカメラで自分を撮影 or 写真ファイルをアップロード</p> <p>3.ガイドに従ってサイズや瞳孔の位置を調整</p> <p>4.気になるメガネを選択</p> <p>5.メガネの似合い度が判定される!<br />  →詳しくは、この記事後半の<a href="#似合い度判定AIの仕組み">似合い度判定AIの仕組み</a>までジャンプ</p> <p> </p> <p> </p> <h4 id="非公式な遊びかた気になるアノ人に似合うメガネは">■ <span style="text-decoration: underline;">非公式な遊びかた「気になるアノ人に似合うメガネは?」</span></h4> <p>下の画像でもうお分かりでしょうか笑。<br />そうです!このサービスをうまく使えば、気になるあの人やこの人に似合うメガネを探すこともできてしまうんです!!!<br /><br /></p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="個人的に優勝はゴッホ!…かゴリラ"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20200513/20200513124822.png" alt="f:id:s_akiko:20200513124822p:plain" title="f:id:s_akiko:20200513124822p:plain" class="hatena-fotolife" itemprop="image" /></p> <figcaption>個人的に優勝はゴッホ!…かゴリラ</figcaption> </figure> <p><br /><br /></p> <p> </p> <p> </p> <p>使い方はさっきと同じです。</p> <p>1.<a href="https://brain.jins.com/" target="_blank">JINS BRAIN</a> のサイトにいく</p> <p>2.メガネを掛けさせたい人(?!)の写真ファイルをアップロード</p> <p>3.ガイドに従ってサイズや瞳孔の位置を調整</p> <p>4.気になるメガネを選択</p> <p>5.メガネの似合い度が判定される!(画像によってはされません)</p> <p><span style="font-size: 80%;">※ メガネ選択ページの左上にある「PD」という欄を使ってメガネの大きさ調整もできます。(PD=左右の瞳孔の距離で、長く設定するとその分メガネが小さくなり、短くするとその分メガネが大きくなる)</span><br /> </p> <p>お断りしますが、これはもちろん本来の使い方ではありません。<br />このために開発したものではないので技術的保証もできません。<br />(画像によっては顔として認知されなかったり、謎の点数が出たりするかもしれません)<br />あくまで今回、STAYHOME中の個人のおうち遊びの1つとして紹介しますので、自己責任のもとで楽しんでくださいね!</p> <div class="box2"><注意事項です><br />※もちろんですが、誰かのプライバシーを侵害したり、公開して著作権・肖像権を侵害してはいけません。(上記の画像は、すべて著作権フリーのパブリックドメインの画像を利用しています。)<br /> ※このサービスを利用して作った画像の商業利用もできません。</div> <p> </p> <h4 id="似合い度判定AIの仕組み">■ <span style="text-decoration: underline;">似合い度判定AIの仕組み</span></h4> <p>では、一体どういう仕組みでメガネの似合い度を判定しているのか???<br />ということで、できるだけ平易に説明してみたいと思います。</p> <p> </p> <p>JINS BRAINは、ディープラーニングという手法を用いて大量のデータを学習することにより、メガネの似合い度判定を実現しています。<br /><br />ここで、<strong>何をもって似合う・似合わないの根拠とするのか?</strong>という疑問が出てきます。メガネが似合うかどうかは定性的であり、厳密な正解がありません。</p> <p> </p> <p>今回私たちは、「いつも店頭で接客をしているJINSスタッフのリアルな評価」を根拠としました。そこで全国から<strong>約3,000名のJINSスタッフが参加し、60,000枚に及ぶ顔画像を評価</strong>することで教師データ(学習するための例題と答え)を作成し、ネフロック独自のエンジンに学習させました。</p> <p> </p> <p>これによって、まるで店頭スタッフのように評価してくれるAIが生まれました。<br />さらに男性スタッフと女性スタッフでは評価の傾向に差が出ていることが分かったため、男性スタッフ型の判断をしてくれるJINS MANと、女性スタッフ型の判断をしてくれるJINS WOMANの2タイプのJINSオリジナルAIが誕生しました。</p> <p> </p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="JINS BRAIN のAIの仕組み"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20200512/20200512165726.png" alt="f:id:s_akiko:20200512165726p:plain" title="f:id:s_akiko:20200512165726p:plain" class="hatena-fotolife" itemprop="image" /></p> <figcaption>JINS BRAIN のAIの仕組み</figcaption> </figure> <p> </p> <h4 id="さいごに新技術のPRです">■ <span style="text-decoration: underline;">さいごに、新技術のPRです。</span></h4> <p>ところで、<br /><strong>店頭でメガネを試着するとき、似合っているか見えなくて困ったことはありませんか??</strong></p> <p><span style="font-size: 80%;">※メガネを掛けていない方のために補足すると、店頭のサンプル眼鏡には度が入っていないため、<br />試着して鏡を覗いても自分の姿がよく見えない場合があるのです。</span></p> <p>JINS BRAINに続く取り組みとして、ネフロックでは新たにその悩みを解決する技術を開発し、現在JINS渋谷パルコ店に導入されています。<br />それがこちらです。</p> <p> </p> <p><strong>「MEGANE on MEGANE」</strong></p> <p><strong>独自開発の画像生成・変換・除去エンジンを用いた世界初のAI技術により、<br />着けているメガネをリアルタイムで映像から消し、その上からバーチャル試着できるサービス</strong></p> <p><iframe class="embed-card embed-webcard" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" title="[世界初]メガネをかけたまま、メガネを試着できる「MEGANE on MEGANE(メガネオンメガネ )」を「JINS渋谷パルコ店」でサービス運用開始" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fprtimes.jp%2Fmain%2Fhtml%2Frd%2Fp%2F000000001.000051421.html" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"></cite></p> <p> </p> <p>ネフロックではこれからも、世の中を楽しくするようなアイディアを実現していきたいと思います。他にAI関連では音声処理プロジェクトの記事などもまとめていますので、もしご覧いただけたら嬉しいです。→→ <a href="https://blog.nefrock.com/entry/2020/03/17/171730" target="_blank">記事:コナンくんのアレを作る技術</a></p> <p><br />それでは身体には十分お気をつけて、引き続きおうち時間を過ごしていきましょう〜!</p> <p> </p> <p> </p> <p> </p> s_akiko 【追記】#STAYHOME 子ども向け無料コンテンツまとめ hatenablog://entry/26006613556587463 2020-04-27T11:40:35+09:00 2020-05-13T19:35:56+09:00 頑張るパパママへ向けて、おうち時間に役立つ「子供向け無料コンテンツ」をまとめました。 幼児・小学校低学年・小学校高学年別に、子供の興味や成長につながるようなコンテンツを中心にピックアップしています。 <p> <b>・5/7(木)追記:リストを更新しました。</b><br>  ※約100→約170個に増え、追加分はNEWマークが付いています。</p> <p><p> <b>・5/13(水)追記:AI技術を使ったおうち遊びを公開しました。</b><br>  ※大人も子供も楽しめます。ぜひ遊んでみてください!<br></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fblog.nefrock.com%2Fentry%2F2020%2F05%2F13%2F173151" title="#STAYHOME 2 大人も子供も遊べるネフロックのAI - Nefrockの日記" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://blog.nefrock.com/entry/2020/05/13/173151">blog.nefrock.com</a></cite></p> <p> </p> <p><span style="font-size: 50%"><span style="color: #999999">- - - - - - - - - - - - - - - - - - - - - - - -  </span></span> <br> <br></p> <p>大変な状況が続いていますが、無事にお過ごしでしょうか。<br> <p> 先の見えない中で、 ネフロックとしても何か少しでも役立てることがないか考えました。ネフロックの持つ技術で云々と検討したりもしましたが、時間を掛けるよりとにかく今すぐ使える何か!と、タイトルの通り「子供向けの無料コンテンツ」をまとめてみました。</p></p> <p>いつものネフロックとはだいぶカラーの違うテーマですが、あえて今日はネフロッカー(一部でそんな呼び方があるらしい)ではなく、リモートワーク中のパパママワーカー的な視点でいきたいと思います。</p> <p>今、世の中のパパさんママさんに結構共通するのではと思う気持ち↓ <div class="box2"> <p><span style="font-size: 90%"><b> ・今すぐ使える子ども向けのコンテンツが知りたい<br> ・できれば子どもの興味や成長につながるものだと良い<br> ・正直子どもだけでも集中して過ごしてくれる内容だと尚良い<br> ・無料だったらさらに良い<br> ・けど調べている時間の余裕がない!!!<br></b> </p></span> </div> <p> でもなかなかこれにピッタリはまる十分なものが見当たらなかったので、こちらの独断と偏見でまとめました。 とりあえず<s>100個以上は</s>集まったので公開します。※5/7現在約170個</p></p> <p><iframe width=800 height=500 src="https://docs.google.com/spreadsheets/d/e/2PACX-1vTDJbZoXEdx7zD9NQDl7Nbf9yb4bmRRJEs7QJ8uUaYHGe_lX7H8xtDMBQvxoXyww9P_wzoRAYD8DJUZ/pubhtml?widget=true&amp;headers=false"></iframe></p> <p>※ カテゴリー区分も、年齢区分も、こちらの完全な独断で分類していますのでご容赦ください。<br> ※ 表の下部の「幼児」「低学年」「高学年」をクリックすると、その区分でソートされたものに切り替わります。<br> ※スプレッドシートの閲覧も<a href="https://docs.google.com/spreadsheets/d/1KjGQ509ZEuETuoAk4x-rXgPcmJbSVql6jFlG87LkYQM/edit?usp=sharing" target="_blank">こちら</a>から可能です。<br> ※スマホで見にくい方は<a href="https://drive.google.com/open?id=1FLgtAuzZ4MnBP29S6g-ni_Ygt7R9TcnS" target="_blank">PDF版</a>も置いておきます。</p> <p><p> 走らせつつ、もっと良いまとめ方があれば変えていきます。<br> コンテンツも随時また増やしていくつもりです。<br> お子さまのいらっしゃる方に自由にシェアして使っていただければ幸いです。 </p></p> <p>それでは、どうかくれぐれもお身体を大事にお過ごしください。<br></p> s_akiko コナンくんのアレを作る技術 hatenablog://entry/26006613534044178 2020-03-17T17:17:30+09:00 2020-03-17T17:17:30+09:00 皆さんおはようございます、ネフロックの@siwazaki1 です。 ネフロックではただいま絶賛「リアルタイムで声質を変換するハードウェア KUROFUNE」 を開発中です。 KUROFUNE は FPGA を搭載したイヤホンで、FPGA 部分で声質を変換する処理を行います。 今回はこの声質を変換するアルゴリズムについてのブログを書きたいと思います。 といっても、自分は特に音声処理に関して詳しいわけではないので、声質変換に関して広く浅く調査したことを記録もかねてつらつら書きたいと思ってます。 ディープラーニング到来 突然ですが、いま音声処理に大きなブレイクスルーがおきてます。 @hiho_kar… <p>皆さんおはようございます、ネフロックの<a href="https://twitter.com/siwazaki1">@siwazaki1</a> です。</p> <p>ネフロックではただいま絶賛「リアルタイムで声質を変換するハードウェア KUROFUNE」 を開発中です。 KUROFUNE は FPGA を搭載したイヤホンで、FPGA 部分で声質を変換する処理を行います。 今回はこの声質を変換するアルゴリズムについてのブログを書きたいと思います。</p> <p>といっても、自分は特に音声処理に関して詳しいわけではないので、声質変換に関して広く浅く調査したことを記録もかねてつらつら書きたいと思ってます。</p> <h2>ディープラーニング到来</h2> <p>突然ですが、いま音声処理に大きなブレイクスルーがおきてます。</p> <p><a href="https://twitter.com/hiho_karuta">@hiho_karuta</a>さんのこのツイートの合成音声を聞いてみてください。 <blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ディープラーニングめっちゃ頑張って、とうとう色んな人の声になれる声変換ができた🎉🎉🎉<br><br>売りポイントは3つ。<br>・クオリティが良い<br>・誰でも色んな人(100人)の声になれる<br>・歌声もいける<br><br>下のデモは、自分の声を、他の10人の声に変換した音声。<br>(最初に僕の声が流れる。以降は変換音声。) <a href="https://t.co/b2nrzdHOjs">pic.twitter.com/b2nrzdHOjs</a></p>&mdash; ヒホ(ヒロシバ)🗑️ (@hiho_karuta) <a href="https://twitter.com/hiho_karuta/status/1228266474709512194?ref_src=twsrc%5Etfw">2020年2月14日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 自分の声を他の10人の声に変換していますが、よくあるありがちな機械的な音声と比較して 物凄い自然に聞こえます。</p> <p>またこの「AI きりたん」というソフトは物凄い自然な声で歌ってくれます。 <blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">『AIきりたん賛歌』作詞作曲猫鍋<br>時代は進みますね。楽譜を投げ込めば自動で歌ってくれるこの便利さは革命級。<br><br>人間らしさもあって、これは面白い。<a href="https://twitter.com/hashtag/AI%E3%81%8D%E3%82%8A%E3%81%9F%E3%82%93?src=hash&amp;ref_src=twsrc%5Etfw">#AIきりたん</a> <a href="https://t.co/B8uSG28Roc">pic.twitter.com/B8uSG28Roc</a></p>&mdash; 猫鍋奨励会 (@naitoutougarasi) <a href="https://twitter.com/naitoutougarasi/status/1231928606512701440?ref_src=twsrc%5Etfw">2020年2月24日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> AIきりたんは、NEUTRINOという<a href="https://twitter.com/shachi_krtn">@shachi_krtn</a>さんが開発した、 AIを使って歌わせる東北きりたん音声合成ソフトウェアです。</p> <p>楽曲データをmusicxmlというフォーマットで書き出し、その情報をもとに今まできりたんが歌ってきた曲を参考に歌う(ボコーダーで音声化する)ソフトです。</p> <p>これらの新しめの音声処理に共通して使用されているのが、やはりというか、やっぱりというか、ディープラーニングです。 画像処理の分野でブレークスルーをもたらしたディープラーニングが数年前から音声処理にもやってきたわけです。</p> <h2>声質変換とは?</h2> <p>声質変換とは「音声を別の個人あるいはキャラクターの音声に変換する手法」で、これについては次の DeNA の方のスライドがわかりやすかったです。</p> <p><figure class="figure-image figure-image-fotolife" title="([https://www.slideshare.net/kentarotachibana1/ss-94259438:title]より引用)"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/n/nefrock-nefrock-nefrock/20200317/20200317102448.png" alt="f:id:nefrock-nefrock-nefrock:20200317102448p:plain" title="f:id:nefrock-nefrock-nefrock:20200317102448p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption><a href="https://www.slideshare.net/kentarotachibana1/ss-94259438">&#x58F0;&#x8CEA;&#x5909;&#x63DB;&#x306E;&#x6982;&#x8981;&#x3068;&#x6700;&#x65B0;&#x624B;&#x6CD5;&#x306E;&#x7D39;&#x4ECB;</a>より引用</figcaption></figure></p> <p>人の声というのは、3 つの要素</p> <ul> <li>声の高さ(F0)</li> <li>声質(スペクトル包絡)</li> <li>かすれ具合(AP)</li> </ul> <p>で構成されていて、声質変換は上記のうち主に声質を変換する処理です。 声質変換の手法は変換対象の人数や、学習に用いるデータの種類によって細かく分類されます。</p> <h2>変換対象による分類</h2> <p>変換元、変換先が単数なのか複数なのかによる分類です。主に3つに分かれます。</p> <ul> <li><p><b>one-to-one</b> ある特定の人の声を、ある特定の人の声に変換する。e.g. のび太くんの声をドラえもんの声に変換</p></li> <li><p><b>many-to-one</b> 複数の人の声を、ある特定の人の声に変換する。e.g. のび太くんとしずかちゃんの声をドラえもんの声に変換</p></li> <li><p><b>many-to-many</b> 複数の人の声を、複数の人の声に変換する。e.g. のび太くんの声をドラえもんの声に変換し、しずかちゃんの声はのび太くんの声に変換</p></li> </ul> <p>さらにあらかじめ学習データにない人の声を変換するzero shotの変換などもあります。</p> <h2>学習データによる分類</h2> <p>学習に使用するデータによっても2つに大別されます。</p> <ul> <li><b>パラレルデータ</b> 全ての人が同一の文を読んでいる音声が必要</li> <li><b>ノンパラレルデータ</b> なんの文でもいいので、各人の音声データがあればいい</li> </ul> <p>パラレルデータは入手しづらいですが学習が比較的容易で、ノンパラレルデータはその逆で、手に入りやすいですが学習が難しい傾向にあります。</p> <h2>声質変換の手法</h2> <p>上記の分類に基づいて、自分が調べて良さげだった手法を表にまとめました。</p> <table> <thead> <tr> <th> </th> <th> パラレルデータ </th> <th> ノンパラレルデータ </th> </tr> </thead> <tbody> <tr> <td>one-to-one </td> <td>たくさんあるので割愛</td> <td><a href="http://www.kecl.ntt.co.jp/people/kaneko.takuhiro/projects/cyclegan-vc/">CycleGAN-VC</a></td> </tr> <tr> <td>many-to-one </td> <td>NNだとない?</td> <td><a href="https://github.com/andabi/deep-voice-conversion">Deep Voice Conversion</a></td> </tr> <tr> <td>many-to-many</td> <td>NNだとない?</td> <td><a href="https://github.com/auspicious3000/autovc">AutoVC</a>、<a href="https://github.com/hujinsen/StarGAN-Voice-Conversion">StarGAN-VC</a></td> </tr> </tbody> </table> <p>ニューラルネット(NN)を使った手法だと、パラレルデータよりノンパラレルデータを使用した手法の方が多かったです。 大量のデータが必要なディープラーニングでは、パラレルデータを用いるのは難しいのかもしれません。</p> <h2>試作してみた</h2> <p>調べただけではあれなので、まずはFPGAではなく、PC上で声質変換をやってみました。</p> <p>KUROFUNE では任意の人の声をあるターゲットに変換したいので、上の分類でいくとmany-to-one、もしくはmany-to-manyの手法をノンパラレルなデータを用いて学習させたいです。</p> <p>ただいきなりそれらを作るのは大変なので、今回は one-to-one でノンパラレルなデータで学習するCycleGAN-VCを実装してみました。 CycleGAN-VCの詳細は上記リンクを見ていただければと思いますが、参考までに、音声の生成を行うGeneratorのネットワーク構造は結構シンプルでこんな感じです。</p> <p><figure class="figure-image figure-image-fotolife" title="[CycleGAN-VC](http://www.kecl.ntt.co.jp/people/kaneko.takuhiro/projects/cyclegan-vc/)より引用"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/n/nefrock-nefrock-nefrock/20200317/20200317133046.png" alt="f:id:nefrock-nefrock-nefrock:20200317133046p:plain" title="f:id:nefrock-nefrock-nefrock:20200317133046p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption><a href="http://www.kecl.ntt.co.jp/people/kaneko.takuhiro/projects/cyclegan-vc/">CycleGAN-VC</a>より引用</figcaption></figure></p> <p>この手法を使って自分の声を、ある有名人の方の声に変換してみました。</p> <p>変換前の声がこれで、</p> <iframe width="100%" height="100" scrolling="no" frameborder="no" allow="autoplay" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/777453859&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true&visual=true"></iframe> <p>この声を変換した声がこれです。</p> <iframe width="100%" height="100" scrolling="no" frameborder="no" allow="autoplay" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/777453937&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true&visual=true"></iframe> <p>みなさん、誰の声に変換したかわかったでしょうか?</p> <p>この声はなかなかうまいこと変換できたと思っているのですが、長文や雑音が入った音声だとまだまだ品質的に改善の余地がありました。</p> <h2>今後の予定</h2> <p><a href="https://github.com/auspicious3000/autovc">AutoVC</a>などmany-to-oneの手法について調査をしていきたいと思います。</p> <p>また、ボコーダーとして<a href="https://arxiv.org/pdf/1609.03499.pdf">WaveNet</a>、もしくはその高速化した<a href="https://github.com/NVIDIA/waveglow">WaveGlow</a>や<a href="https://arxiv.org/abs/1711.10433">Parallel WaveNet</a> を使う予定なので、これらをFPGA上に<b>なんとか</b>実装したいと思ってます。</p> <p>いやーまだまだやることいっぱいあるぞー</p> <p>なにか進展があればまたブログに書きます</p> nefrock-nefrock-nefrock FPGAのおはなし hatenablog://entry/26006613531025605 2020-03-07T21:22:05+09:00 2020-03-07T21:22:05+09:00 こんにちは!Nefrockでハードウェアエンジニアをやっている ごとぅー です。 今回初めてブロクを書かせていただきます。 先月Nefrockでは Tsukuba Mini Maker Faire 2020 (TMMF2020) に参加して、 前の日記 でもお話した Suika-Board と KUROFUNE の2つを出展してきました。 自分たちのプロダクトにどのような反応があるのか結構不安でしたが、 多くの方々に好評をいただきまして、改めて僕たちのやる気もみなぎってきました! その一方でKUROFUNEの技術的特徴であるFPGAに関してやはり認知度が低かったので、 今回はそのFPGAについ… <p><figure class="figure-image figure-image-fotolife" title=""><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/f/fgoto/20200307/20200307185742.jpg" alt="f:id:fgoto:20200307185742j:plain" title="f:id:fgoto:20200307185742j:plain" class="hatena-fotolife" itemprop="image"></span><figcaption></figcaption></figure></p> <p>こんにちは!Nefrockでハードウェアエンジニアをやっている ごとぅー です。</p> <p>今回初めてブロクを書かせていただきます。</p> <p>先月Nefrockでは Tsukuba Mini Maker Faire 2020 (TMMF2020) に参加して、 <a href="https://blog.nefrock.com/entry/2020/02/14/215238">前の日記</a> でもお話した Suika-Board と KUROFUNE の2つを出展してきました。</p> <p>自分たちのプロダクトにどのような反応があるのか結構不安でしたが、 多くの方々に好評をいただきまして、改めて僕たちのやる気もみなぎってきました!</p> <p>その一方でKUROFUNEの技術的特徴であるFPGAに関してやはり認知度が低かったので、 今回はそのFPGAについてのお話をします。</p> <h2>目次</h2> <ol> <li><a href="#anchor1">FPGAのなかみ</a></li> <li><a href="#anchor2">出番がないFPGA</a></li> <li><a href="#anchor3">FPGAどこにいるの?</a></li> <li><a href="#anchor4">ハードルが多いFPGA</a></li> <li><a href="#anchor5">FPGAの可能性</a></li> <li><a href="#anchor6">おわりに</a></li> </ol> <p><a id="anchor1"></a></p> <h3>FPGAのなかみ</h3> <p>半導体デバイスには大きく分けて2種類あります。</p> <ul> <li>ディクスリート</li> <li>集積回路 (IC)</li> </ul> <p><br/> さらに集積回路には以下のような種類があります。</p> <ul> <li>汎用ロジックIC</li> <li>ASIC</li> <li>CPU (MPU)</li> <li>FPGA</li> </ul> <p><br/> 汎用ロジックICは、論理回路の構成素子(論理素子)を機能ごとにパッケージ化した小規模なICで、 AND・OR・フリップフロップ・マルチプレクサーなど多くの種類があります。</p> <p>歴史はとても古いですが、論理回路の構成要素なので単体でもまだまだ現役で様々な電子回路に使われています。</p> <p><br/> ASICは、アプリケーションごとに専用にカスタマイズされたICのことで、ある決まった処理や演算を高速かつ低消費電力で行うなどに特化しています。</p> <p>ただ現在はASICといっても非常に多くの種類があり汎用性が高いものが数多くあります。</p> <p><br/> CPUは、ユーザーが命令を与えることで汎用的な制御や演算ができるICで、命令を組み合わせることで様々な処理を行うことができます。</p> <p>ソフトウェアも最終的にはCPUの命令に変換され、CPUがその命令に従って動作することでその機能を実現しています。</p> <p><br/> そしてFPGAは、ASICやCPUとは違い固定されたシステムアーキテクチャーを持っておらず、データバス・命令・レジスタマップなどは存在しません。</p> <p>その代わりに、たくさんの論理素子・汎用的な計算回路・Static-RAMとそれらを自由に接続できる配線で構成されたICになっています。</p> <p>そしてFPGAの容量内であれば、ほぼすべてのデジタル論理回路を作ることができます。</p> <p>例えばANDやORなどの論理素子やMP3エンコーダーやJEPGデコーダー、64bit-CPUでさえもFPGAの中に作ることができます。</p> <p><a id="anchor2"></a></p> <h3>出番がないFPGA</h3> <p>前の説明から汎用性(何にでも使える)の順番は下記のようになっていると思います。</p> <p><strong>汎用ロジックIC = FPGA > CPU > ASIC</strong></p> <p>汎用性が高いほど単純な機能になっていきますので、複雑な機能を作るためには多くの数や種類が必要となります。</p> <p>ですので同じ目的を達成するのに汎用ロジックICを使った場合とASICを使った場合を比べると、機能が複雑であればあるほどASICを使った方が簡単になります。</p> <p>もちろん目的にあったASICが必要にはなりますが、近頃は汎用性の高い様々なASICがあるのでだいたい見つかります。</p> <p>そしてASICを制御するCPUがあれば、後はソフトウェアで対応可能となります。(もちろんCPUのソフトウェア開発や通信するのにパソコンも必要にはなります。)</p> <p>信号処理などはハードウェアよりもソフトウェアで行ったほうが、柔軟な設計もできるし開発時間もコスト抑えられることが多いです。</p> <p>汎用ロジックICのみで作ろうとしたら、まず論理設計が大変で、次にたくさんの種類と数のICを用意して、とどめに複雑で膨大な配線作業が待ち構えています。</p> <p>そんなわけで多くの目的でASICとCPUがあればことが済んでしまうのです。</p> <p><a id="anchor3"></a></p> <h3>FPGAどこにいるの?</h3> <p>ではFPGAが実際どのように使われているのでしょうか。</p> <p>僕が今まで見たことのある例を挙げたいと思います。</p> <p><br/> <strong>ASIC開発をする場合</strong></p> <p>新しいASICを開発する場合、まずFPGAで同等の回路を構成して検証を行い、そのあと本番の半導体での設計になります。</p> <p><br/> <strong>ASICの代わりとして使う場合</strong></p> <p>ASICの開発には数千万~数億円かつ半年~1年以上の時間も必要になることもあるので、利益になる販売数量が見込めなかったり設計期間を短縮したい場合などは、機能を入れたFPGAをそのまま使用したり販売したりすることがあります。</p> <p>また小型のFPGA (PLD)を汎用ロジックICの代わりに使うこともあります。</p> <p><br/> <strong>目的にあったASICがない場合</strong></p> <p>特に研究開発などでは所望のASICが存在しないことも多く、そのような場合にはFPGAが使われることがあります。</p> <p>新規デバイスの駆動信号生成や、大量のASICの同時制御・データ取得など、動作時間や精度、I/O数の制約などでCPUやASICでは実現が難しい場合でも、大量のGPIOを同時かつ正確に制御することができるFPGAであれば実現可能です。</p> <p>またFPGAは書き換え可能なことも研究開発の用途として向いています。</p> <p><a id="anchor4"></a></p> <h3>ハードルが多いFPGA</h3> <p>FPGAはデジタル論理回路的に何でもできるポテンシャルを持っていますが、中身は汎用ロジックICの集合体なのでできることは結局のところ中身を設計する人の技術力で決まります。</p> <p>そして技術力以外にもFPGAを使うためには数々のハードルを越える必要があります。</p> <p><br/> <strong>HDL問題</strong></p> <p>FPGAの開発は、汎用ロジックICとは異なり論理素子を選んだり配線したりする物理的な作業はなく、ハードウェア記述言語(HDL)と呼ばれるプログラミング言語に似たものを使って回路を記述するのが主流です。</p> <p>HDLの文法などは比較的簡単ではありますがハードウェアを意識した設計を行う必要があるので回路的な知識も必要となります。</p> <p>またレジスターやワイヤー、クロックなどのHDL特有の概念や同時並行的な動作記述は一般的なプログラミング言語にはあまりありません。</p> <p><br/> <strong>ツール使いにくい問題</strong></p> <p>HDL記述されたコードは、開発ツールを用いてコンパイル(FPGAの場合は論理合成・配置配線と呼ばれる変換)を行い回路情報に置き換わります。</p> <p>配置配線に関してはFPGAのデバイス構造が分からないとできませんので、FPGAメーカーが出している開発ツールを使う必要があります。</p> <p>開発ツールは高機能で論理合成・配置配線の機能以外にシミュレーター、タイミング解析、消費電力解析、IPコア管理など様々なツールも統合されていて使いこなすのが難しく、ツール自体の容量も大きい上にインストールするマシンの要求スペックも高く動作も結構重くなっています。</p> <p>さらにHDLのシミュレーションやコンパイル(特に配置配線)にかかる時間は一般的なプログラミング言語のコンパイルと比較すると非常に長く数分~数時間かかる場合もあります。</p> <p><br/> <strong>Lチカ後問題</strong></p> <p>そして <a href="https://blog.nefrock.com/entry/2020/02/14/215238">前の日記</a> でもありましたが、LEDを点滅させた後に何をして良いのか分からない問題がここでも出てきます。</p> <p>とくにFPGAは汎用性が非常に高いのでこの問題はすぐに発生し、FPGAボードがタンスの肥やしになりやすいです。</p> <p>さらに上述したように CPU + ASIC でやりたいことの多くができてしまうので、わざわざFPGAを大変な思いをしてまで使うのが微妙になってしまうことも多くあります。</p> <p><a id="anchor5"></a></p> <h3>FPGAの可能性</h3> <p>以上のことからFPGAは企業や研究機関などで大規模かつハイレベルな使い方をされるケースが多く、ちょっとした興味や趣味として個人で使うにはなかなか大変なデバイスになっています。</p> <p>しかしながら、決まったアーキテクチャを持たないFPGAはユーザーがハードウェアレベルで柔軟に回路を設計することができるので、CPUやGPUなどが持っているハードウェア的なボトルネックを回避し、目的に合った最適な設計が可能になります。</p> <p>さらに近年では主流であったHDLでの設計がC言語やC++などの高級言語でも設計できる高位合成(HLS)と呼ばれる技術も一般化しつつあったり、CPUとFPGAを一つのパッケージにしたICなども出てきました。</p> <p>このような動向により従来FPGAを使っていたハードウェアエンジニアだけではなく、ソフトウェアエンジニアなどからも注目されています。</p> <p>ですので今後ますますFPGAがさまざまなところで活用されていくと思います。</p> <p><a id="anchor6"></a></p> <h3>おわりに</h3> <p>このようにFPGAは、使うのが難しいけどすごい可能性を秘めているという、なんともエンジニア魂をくすぐってくるデバイスです。</p> <p><strong>つまりNefrockが使わないわけがありません!</strong></p> <p>そしてKUROFUNEがこのFPGAの可能性を活用するプロダクトとなっています。</p> <p>ですので今後もぜひ注目してもらえるとうれしいです。</p> <p>どうもありがとうございました。</p> fgoto 明日はTskuba Mini Maker Faire 2020 hatenablog://entry/26006613511973571 2020-02-14T21:52:38+09:00 2020-02-14T21:52:38+09:00 皆さんこんばんは、Nefrockのつるつるです明日は待ちに待ったTsukuba Mini Maker Faire 2020(以下TMMF2020)ですね。ネフロックは2つのプロダクトを持ってTMMF2020に参加します。 今社内は明日の準備でバタバタしているのですが、そんなバタバタしているメンバーを横目にこの記事を書いています。どきどき。 前回の記事でもプロダクトの説明がありましたが、今回はもう少し開発に至った経緯や技術的なあれそれについて書きたいと思います。 まずはじめに、今回展示するプロダクトの内容は一旦置いといて、なぜ開発に至った経緯の前提となるお話しを書かせてもらいたいと思いますが、若… <p>皆さんこんばんは、Nefrockのつるつるです<br />明日は待ちに待ったTsukuba Mini Maker Faire 2020(以下TMMF2020)ですね。<br />ネフロックは2つのプロダクトを持ってTMMF2020に参加します。</p> <p> </p> <p>今社内は明日の準備でバタバタしているのですが、そんなバタバタしているメンバーを横目にこの記事を書いています。どきどき。</p> <p> </p> <p>前回の記事でもプロダクトの説明がありましたが、今回はもう少し開発に至った経緯や技術的なあれそれについて書きたいと思います。 </p> <p> </p> <p>まずはじめに、今回展示するプロダクトの内容は一旦置いといて、なぜ開発に至った経緯の前提となるお話しを書かせてもらいたいと思いますが、若干長いので読むのめんどい人は「何を出展するのか」まで飛ばしちゃってください笑 </p> <ul class="table-of-contents"> <li><a href="#汎用ハードウェアと専用ハードウェア">汎用ハードウェアと専用ハードウェア</a></li> <li><a href="#カスタマイズという観点で見てみると">カスタマイズという観点で見てみると</a></li> <li><a href="#Lチカ後問題">Lチカ後問題</a></li> <li><a href="#じゃあどうすれば">じゃあどうすれば</a></li> <li><a href="#何を出展するのか">何を出展するのか</a></li> <li><a href="#プロダクト1-Suika-Board">プロダクト1. Suika-Board</a></li> <li><a href="#Suika-Boardの技術的特徴">Suika-Boardの技術的特徴</a></li> <li><a href="#プロダクト2-KUROFUNE">プロダクト2. KUROFUNE</a></li> <li><a href="#KUROFUNEの技術的特徴">KUROFUNEの技術的特徴</a></li> <li><a href="#まとめ">まとめ</a></li> </ul> <h3 id="汎用ハードウェアと専用ハードウェア">汎用ハードウェアと専用ハードウェア</h3> <p>特に定義があるわけではないのですが、ハードウェアを大きく2個に分類すると、機能に汎用性があり色々な用途に使える汎用ハードウェアと、機能が特化されている専用ハードウェアにわけることができるかと思います。</p> <p> </p> <p>汎用ハードウェアの例としてRaspberry PiやArduino、ちょっとマニアックになるとFPGA搭載ボードなんかがあります。</p> <p> </p> <p>汎用ハードウェアはその名の通り汎用なので、特定の用途を想定しているわけではなく、どのような用途に用いるかをユーザーに委ねているのが特徴です。</p> <p> </p> <p>例えばArduinoなんかは、GPIOに対する電流のオンオフや、センサーの値を読み取るためのポートを用意していますが、具体的にどのような用途で使うかは使用者に委ねられます。</p> <p> </p> <p>Arduinoで適当に検索をすると、Arduinoに圧力センサーつないで便利なツールを作ってみたよーとか、ユーザが勝手に用途を考えて使っている記事がたくさん出てくるかと思います。 </p> <p> </p> <p>一方専用ハードウェアは、機能がある特定の用途に限定されており、ユーザーが好き勝手にカスタマイズすることは難しいですが、機能が特化されているぶん特定の用途ではしっかりと機能を果たしてくれます。</p> <p> </p> <p>例えば冷蔵庫なんかは食べ物冷やすことに特化した専用ハードウェアの良い例ですね。</p> <h3 id="カスタマイズという観点で見てみると">カスタマイズという観点で見てみると</h3> <p>カスタマイズという観点で見てみると、専用ハードウェアは完全に用途が固定されており、カスタマイズが行われる前提で作られていません。分解して機構を理解して改造すればカスタマイズをすることはできますが、壊しちゃう可能性もあるし、そもそも素人にはハードルが高いので敷居が高いですよね。 </p> <p> </p> <p>汎用ハードウェアは先にも述べましたが、ユーザーに使用用途を委ねており、勝手にカスタマイズされることを前提としており、GPIO等のシステムとやり取りするためのインターフェースを備えています。</p> <p> </p> <p>これらのインターフェースを用いてLチカ(LEDを繋いで点灯させること)させてみたり、センサーをつないでセンシングしてみたり、簡単にカスタマイズすることができます。</p> <h3 id="Lチカ後問題">Lチカ後問題</h3> <p>上記の話しから行くと、カスタマイズしたハードウェアを作りたいなら汎用ハードウェア買って作れば良いのではと思うかもしれません。</p> <p>しかし、汎用ハードウェアをカスタマイズしてみようと思ったは良いが「Lチカ後問題」(後述)に遭遇して興味を失ってしまっている人々が多いように思えます。 </p> <p> </p> <p>Lチカ後問題というのは僕が勝手に名付けている問題なのですが、簡単に言ってしまうと、入門書を買ってきてLチカしたりセンサーからデータを取った後に何をして良いのかわからなくなってしまう問題です。 </p> <p>具体的に言うと</p> <ol> <li>入門書を読んだ後、面白いものを作ろうと思ったものの何を作れば良いのか思い浮かばない</li> <li>市販のセンサーやアクチュエーターだけでは表現の限界があるので、自作の外部接続デバイス作りたいけど素人にはムズすぎワロタ</li> </ol> <p>といった理由でつまずいてしまう問題です。</p> <p> </p> <p>つまずいてしまった結果汎用ハードウェアがタンスの肥やしになってしまうのです。(自分も良くやりました...)</p> <p>ちょっと前までIoT!ラズパイ!Arduino!と騒いでいて、最近そういう話をしないなあというエンジニアがもし周りにいたら、部屋に遊びに行った時にでも本棚の本の隙間を確認してみてください。ホコリを被ったラズパイ先生が鎮座しているかもしれません :-)</p> <h3 id="じゃあどうすれば">じゃあどうすれば</h3> <p>先の1,2に問題を解決するために、それぞれ以下のような設計のハードウェアを用意すれば良いのではと考えました。</p> <ol> <li>使うシーンをある程度限定したハードウェア設計にする</li> <li>改造するためのインターフェースをあらかじめ用意する</li> </ol> <p>1の「使うシーンをある程度限定したハードウェア設計」になぜするかという、ハードウェアの使う状況を限定することによってアイデアを出やすくすることを狙いとしています。</p> <p> </p> <p>例えば木の棒で何かして遊ぼうぜーというより、バットで何かして遊ぼうぜーの方が、何して遊ぼうかなのイメージが湧きやすいですよね?? (若干微妙ですがあまり良い例が思いつきませんでした、、)</p> <p> </p> <p>2の「改造するためのインターフェースを予め用意する」のは、予め汎用ハードウェアが有していたようなインターフェースを保持することにより、簡単にカスタマイズできるようにしちゃいましょうということです。</p> <p> </p> <p>要するに汎用ハードと専用ハードの良いとこ取りのハードウェアを作れば、色々解決できるのでは!という発想です。</p> <h3 id="何を出展するのか">何を出展するのか</h3> <p>イントロがめちゃ長くなってしまいましたが、今回展示するプロダクトは上記思想を組み込んだプロダクト達になります。</p> <p>それでは早速プロダクトの紹介をしたいと思います!</p> <h3 id="プロダクト1-Suika-Board">プロダクト1. Suika-Board</h3> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/ttsurumi/20200214/20200214205941.png" alt="f:id:ttsurumi:20200214205941p:plain" title="f:id:ttsurumi:20200214205941p:plain" class="hatena-fotolife" itemprop="image" /></p> <p class="p1"><span class="s1">Suika-Boardはクラフトビールを楽しく飲むためにネフロックの叡智を結集して開発された</span><span class="s2">パーティーグッズ</span><span class="s1">です。</span></p> <p class="p1"><span class="s1">このデバイスはビール瓶の傾きを検知し、ビールを飲み干すと音楽と光を放ち、パーティーの盛り上げに貢献します。</span></p> <h3 id="Suika-Boardの技術的特徴">Suika-Boardの技術的特徴</h3> <p>Suika-Boardの目玉の特徴は</p> <ul> <li><span class="s1">ビールにはまるスイカ柄の電子回路基板</span></li> <li><span class="s1">Arduino互換 &lt;= </span>ArduinoIDEから自由にプログラミングできる!</li> <li><span class="s1">単3電池2本</span><span class="s2">で駆動</span></li> </ul> <p>にあります。</p> <p>先に述べた</p> <ul> <li>「使うシーンをある程度限定したハードウェア設計」</li> <li>「改造するためのインターフェースをあらかじめ用意する」</li> </ul> <p>を満たしているのがわかるかと思います。 </p> <p>文字だけだとイマイチ想像がつかないと思いますが、実はこのデバイス去年開催した会社のパーティーで披露しており、その時の様子を参加者がtwitterで投稿してくれていたので貼ってみます。</p> <blockquote class="twitter-tweet"> <p dir="ltr" lang="ja">今年もヤバいネフロック創立記念パーティ、今年は参加者全員に一気飲みデヴァイスを配布。<br />知る限り東京で一番技術で遊んでる会社 <a href="https://twitter.com/hashtag/nefrock?src=hash&amp;ref_src=twsrc%5Etfw">#nefrock</a> <a href="https://t.co/jFPuONGYI3">pic.twitter.com/jFPuONGYI3</a></p> — 歩く気象庁 (@Mekajiki) <a href="https://twitter.com/Mekajiki/status/1172488983072231432?ref_src=twsrc%5Etfw">September 13, 2019</a></blockquote> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> <p>Suika-Boardのもう少し踏み込んだ技術的詳細は、以下に回路図やらマニュアルが公開してあるのでもし興味があればみてやってください!</p> <p><a href="https://github.com/nefrock/suika-board-sdk">https://github.com/nefrock/suika-board-sdk</a></p> <p> </p> <h3 id="プロダクト2-KUROFUNE">プロダクト2. KUROFUNE</h3> <p>KUROFUNEは入力した音声をリアルタイムに特定の音声に変換するハードウェアです。</p> <p>KUROFUNEのユースケースや概要については<a href="https://blog.nefrock.com/entry/2020/02/10/211810">前回の記事</a>にて書かせてもらいましたので、今回は技術について触りだけ書かせてもらいます。</p> <h3 id="KUROFUNEの技術的特徴">KUROFUNEの技術的特徴</h3> <p>KUROFUNEの最大の技術的特徴はFPGAを用いているところにあります。</p> <p>なぜFPGAを用いているかというと、KUROFUNEの機能である音声の変換にはデバイスの特性上リアルタイム性の担保が要求されます(動画を見ていて音声だけ1秒遅れて流れてきたら気持ち悪くなっちゃいますよね)。</p> <p>このリアルタイム性の担保を実現するために、FPGAを用いたハードウェアの開発を行っています。</p> <p>以下は今回開発しているハードウェアのブロックダイアグラムになります。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/ttsurumi/20200214/20200214193114.png" alt="f:id:ttsurumi:20200214193114p:plain" title="f:id:ttsurumi:20200214193114p:plain" class="hatena-fotolife" itemprop="image" /></p> <p>図を見たら大体やっていることはわかると思いますが、Line-Inから来た音声を</p> <ul> <li>音声入力=&gt;AD変換=&gt;FFT=&gt;音声変換=&gt;逆FFT=&gt;DA変換=&gt;音声出力</li> </ul> <p>のように処理しています。(DDR3へのパスは設定値の読み込み等で用いています)</p> <p>この音声変換部分をユーザーが自由に開発(もしくは誰かの開発した音声変換をインストール)することにより、カスタマイズして使ってもらおうというのがこのハードウェアのコンセプトです。まだ実現はできていないのですが、この音声変換部分にNeuralNetworkを差し込むことによって、より高度な音声変換処理をしようと企んでいます。</p> <p> </p> <h3 id="まとめ">まとめ</h3> <p>ということで長々と書いてしまいましたが、2月14・15のTMMF2020にて、KUROFUNEとSuika-Boardの展示を行っています。興味ある人は是非遊びに遊びにきてね!</p> <p>(なんとSuika-Boardの販売もしています!)</p> ttsurumi KUROFUNE 出航 hatenablog://entry/26006613506542580 2020-02-10T21:18:10+09:00 2020-02-10T21:18:10+09:00 こんにちは、akikoです。 今回から新プロジェクトKUROFUNEの紹介をしていきます。初回はざっくり概要についてです。 ※プロジェクト立ち上げのきっかけは、OKRを導入した話↓ blog.nefrock.com 何をつくる? ネフロックで昨年4月に立ち上がったプロジェクトKUROFUNEでは、ある新製品のリリースを目指しています。 つくっているのは、こちら。 リコンフィギュラブルAIイヤホン 最初の試作機 もし、周りの声を好きなように変換できる妄想耳があったら? もし、好きな音だけが増幅される地獄耳があったら? 自分の思いついたアイディアで、音声処理を作って遊べるヒアラブルガジェットを開発… <p>こんにちは、akikoです。</p> <p>今回から新プロジェクトKUROFUNEの紹介をしていきます。初回はざっくり概要についてです。</p> <p>※プロジェクト立ち上げのきっかけは、OKRを導入した話↓ <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fblog.nefrock.com%2Fentry%2F2020%2F01%2F23%2F205225" title="OKR始めて1年。失敗したこと得られたこと。 - Nefrockの日記" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://blog.nefrock.com/entry/2020/01/23/205225">blog.nefrock.com</a></cite></p> <p><br></p> <h4>何をつくる?</h4> <p>ネフロックで昨年4月に立ち上がったプロジェクトKUROFUNEでは、ある新製品のリリースを目指しています。<br> つくっているのは、こちら。</p> <p><br> <span style="font-size: 130%"><strong><u>リコンフィギュラブルAIイヤホン</u></strong></span></p> <p><figure class="figure-image figure-image-fotolife" title="最初の試作機"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20200206/20200206152234.jpg" alt="FPGA, &#x30A4;&#x30E4;&#x30DB;&#x30F3;" title="f:id:s_akiko:20200206152234j:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>最初の試作機</figcaption></figure></p> <div class="box2"> <p><span style="font-size: 90%"> <b>もし、周りの声を好きなように変換できる妄想耳があったら?<br> もし、好きな音だけが増幅される地獄耳があったら?<br> 自分の思いついたアイディアで、音声処理を作って遊べるヒアラブルガジェットを開発しました。<br> 音声処理はFPGAに実装されるので、何度でも書き替えが可能。 HDLで記述したり、ニューラルネットで学習させたモデルを載せたり、他の人の作ったアルゴリズムで遊ぶこともできる、Maker向けの本格おもちゃです。</b></p></span> </div> <p><p> イメージ湧くでしょうか?<br> 要素がモリっとしているので下記にまとめておきます。</p> <ul> <li><i>コンセプト:ユーザが自分で改造して楽しめる</li> <li>商品:AI搭載のイヤホン</li> <li>ハードウェア:FPGA+CPU</li> <li>主要ターゲット:エンジニアやものづくり好きな人たち</li> <li>遊びかた:<br> ・音声処理を自分の好きなように実装できる。<br> ・HDLで記述したりニューラルネットワークのモデルを載せたりできる<br> ・それらはFPGAに実装するので何度でも書き換えることができる。</i></li> </ul> <h4>背景</h4> <p>なぜこういうテーマにしたかというと、一言でいえば「ネフロックらしいものをつくりたかったから」です。 そこで、何を開発するか考えるのに、まず以下の2点を決めました。</p> <ol> <li>自分たち自身が楽しめるものであること</li> <li>自分たちだから作れるものであること</li> </ol> <p>そこから、<br> <b>「エンジニアが改造して楽しめるAI×ハードのガジェット」</b><br> というコンセプトが決まり、<br></p> <p>最終的に、<br> <b>「FPGAを用いたリコンフィギュラブルなAI搭載イヤホン」</b><br> に決まりました。</p> <p><br></p> <h4>使いかたの例</h4> <p><p>では一体これ何に使うの?と言いますと、それは使う人のアイディア次第でいくらでも楽しめるのですが、たとえばこんな使いかたがあるかもしれません。</p> 左側が通常時、右側がこのイヤホンを装着したときのイメージです。 <br> <br></p> <p><b>例1:人の声がロボットに!!</b><br> 周囲の音声をすべて、ロボット音声にするなどのエフェクトをかけて楽しめるかもしれません。 <figure class="figure-image figure-image-fotolife" title="あふれ出るミライ感(?)"><div class="images-row mceNonEditable"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20200210/20200210144955.png" alt="f:id:s_akiko:20200210144955p:plain" title="f:id:s_akiko:20200210144955p:plain" class="hatena-fotolife" itemprop="image"></span> → <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20200210/20200210144959.png" alt="f:id:s_akiko:20200210144959p:plain" title="f:id:s_akiko:20200210144959p:plain" class="hatena-fotolife" itemprop="image"></span></div><figcaption>あふれ出るミライ感(?)</figcaption></figure></p> <p><br> <b>例2: 推しメンの声だけ増幅!!</b><br> コンサートで、自分の好きなメンバーの声だけ大きく聴こえるように増幅して楽しめるかもしれません。</p> <p><figure class="figure-image figure-image-fotolife" title="最高やん"><div class="images-row mceNonEditable"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20200210/20200210145020.png" alt="f:id:s_akiko:20200210145020p:plain" title="f:id:s_akiko:20200210145020p:plain" class="hatena-fotolife" itemprop="image"></span> → <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20200210/20200210145037.png" alt="f:id:s_akiko:20200210145037p:plain" title="f:id:s_akiko:20200210145037p:plain" class="hatena-fotolife" itemprop="image"></span></div><figcaption>最高やん</figcaption></figure></p> <p><br> <b>例3:教室にマツ○・デラックス?!</b><br> 講義中の先生の声を、好きな誰かの声に変換して楽しめるかもしれません。 <figure class="figure-image figure-image-fotolife" title="より集中できる!!...のかな..."><div class="images-row mceNonEditable"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20200210/20200210145041.png" alt="f:id:s_akiko:20200210145041p:plain" title="f:id:s_akiko:20200210145041p:plain" class="hatena-fotolife" itemprop="image"></span> → <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20200210/20200210145049.png" alt="f:id:s_akiko:20200210145049p:plain" title="f:id:s_akiko:20200210145049p:plain" class="hatena-fotolife" itemprop="image"></span></div><figcaption>より集中できる!!...のかな...</figcaption></figure> <br> ※以上あくまでもイメージです。</p> <p><br></p> <h4>今後の進め方</h4> <p>今回のプロジェクトでは、今までにないくらいの本気度を出していきたいと考えています。そのため今回は、初めてだらけの以下の3つのアクションを起こしていきますよ〜</p> <p><br></p> <h5>①特許をとる!!</h5> <p>なんと本件実は既に、ネフロック単独初の<br> <span style="font-size: 150%">特許出願中</span>です!!!</p> <p><br></p> <h5>②ものづくり系の展示会にでる!!</h5> <p>今月2/15・16のTsukuba Mini Maker Faire に出展します!!これがKUROFUNEの初お披露目となります。<br> 時間があればぜひ遊びに来てくださいね!</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Ftwitter.com%2Ftmmf_jp" title="Tsukuba Mini Maker Faire (@tmmf_jp) | Twitter" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://twitter.com/tmmf_jp">twitter.com</a></cite></p> <p><br></p> <h5>③クラファンをやる!!</h5> <p>もう少し色々目処が立ってきたら、ネフロック初のクラウドファンディングもやってみるつもりです!その際は告知しますのでぜひ広めていただけると嬉しいです。</p> <p><br> <p> 次回からはいよいよ、KUROFUNEの技術的な話を少しずつしていきたいと思います!<br> ありがとうございました。<p/></p> s_akiko BLE動くまで帰れません hatenablog://entry/26006613504332022 2020-01-30T21:18:48+09:00 2020-01-30T21:18:48+09:00 NefrockでWeb系の仕事をしている澤田といいます。 AI x ハードを標榜してやまない弊社でBLE熱が高まったので、その煽りを受けて、「YOU, BLEアプリ作っちゃいなYO」となったので、BLEなんぞ、組み込みなんぞ、という状態の中、ひとまずBLEのサンプルを手頃なモジュールで動かしてみました。 Nordic謹製のBLESDKのインストールとIDEのインストールしてサンプルプロジェクトファイルをbuild&runして、お手隙のモジュール上でBLEサンプルプログラムが動作させてなんとか家に無事帰ることができた、という話です。 今回のターゲットモジュール なんか動かしたいんですけどーって雑… <p>NefrockでWeb系の仕事をしている澤田といいます。</p> <p>AI x ハードを標榜してやまない弊社でBLE熱が高まったので、その煽りを受けて、「YOU, BLEアプリ作っちゃいなYO」となったので、BLEなんぞ、組み込みなんぞ、という状態の中、ひとまずBLEのサンプルを手頃なモジュールで動かしてみました。  </p> <p>Nordic謹製のBLESDKのインストールとIDEのインストールしてサンプルプロジェクトファイルをbuild&amp;runして、お手隙のモジュール上でBLEサンプルプログラムが動作させてなんとか家に無事帰ることができた、という話です。 </p> <h4>今回のターゲットモジュール</h4> <p>なんか動かしたいんですけどーって雑に後藤さん<a href="#f-d1d4db65" name="fn-d1d4db65" title="ゴリゴリのHWエンジニア">*1</a>に聞いたら、下のモジュールを貸してくれました。 <figure class="figure-image figure-image-fotolife" title="RedBearLab製。古くてもう手に入らないらしい"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/h/hetakan/20200129/20200129204648.jpg" alt="f:id:hetakan:20200129204648j:plain" title="f:id:hetakan:20200129204648j:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>RedBearLab BLE Nano v2.0。かわいい。古くてもう手に入らないらしい</figcaption></figure></p> <p>上部モジュールにはnRF52832というチップが載っていて、もちろんbluetoothも載ってます。</p> <h3>BLE対応SDKのダウンロード   </h3> <p>上のnRF52832に対応しているNordic社製のBLE対応SDKをダウンロードしておきます。<br /> <a href="https://www.nordicsemi.com/Products/Low-power-short-range-wireless/nRF52832/Download">https://www.nordicsemi.com/Products/Low-power-short-range-wireless/nRF52832/Download</a> から以下のzipをダウンロードしました:  </p> <ul> <li>s112nrf52701.zip</li> <li>nRF5SDK160098a08e2.zip</li> </ul> <p>今回はnRF5SDK160098a08e2.zipだけを使うのでこれを適当なディレクトリに展開しておきます。</p> <h3>IDEのインストール</h3> <p>IDEとしてSegger Embeded Studio for ARM(以下、SES)をノリで選びました。 自分の開発PCはMacなので、 <a href="https://www.segger.com/downloads/embedded-studio/">https://www.segger.com/downloads/embedded-studio/</a> からEmbedded Studio for ARM, macOSをv4.42で選択しダウンロードし、インストール。</p> <p>Freeplanでアクティベーションコードを入力しました。 </p> <h3>サンプルコードを動かしたい</h3> <p>IDEは入れたはいいけど、どう動かすんだろう?<br /> あぁ今日は帰れないぞー?と頭を抱えていると、<br /> 社長から「Stay calm」と<a href="https://www.nordicsemi.com/Software-and-tools/Development-Tools/Segger-Embedded-Studio/Get-Started#infotabs">このリンク</a>を授けられました。(第一情報大事)</p> <p>読み漁っていると、どうたどり着いたのか忘れたのですが、公式がyoutubeで<a href="https://www.youtube.com/watch?v=o_H1USWAM18">サンプルの動かし方を説明している</a>のを発見しました。</p> <p>でもWindows用なんだよなぁ、と流して見ていると、先ほどのSDKのexamplesの中にプロジェクトファイル(拡張子が.emProjectのもの)をダブルクリックすれば勝手にIDEが開いてくれることが判明。まじか。</p> <p>動画の通りに.emProjectファイルのものをダブルクリックするとプロジェクトがSES上で開く。おー。</p> <h3>ビルド、書き込み</h3> <p>予めPCのUSBスロットに先ほどのターゲットを挿しておきます。</p> <p>SESのメニューの「Build」メニューから「Build and Run」を実行すると、 SESでクロスコンパイルやターゲットモジュールへの書き込みをしてくれました!</p> <p>果たして、うまくいったのか。。?<br /> ということで、手元のAndroid端末でnRF ConnectというNordic社製のアプリを使ってデバイスを探してみると。。。</p> <p><figure class="figure-image figure-image-fotolife" title="Nordic_HRMというやつ。"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/h/hetakan/20200129/20200129214135.jpg" alt="f:id:hetakan:20200129214135j:plain" title="f:id:hetakan:20200129214135j:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>Nordic_HRMというやつ。</figcaption></figure></p> <p>あった! 帰れる!!! <br />  </p> <h3>感想</h3> <p>大したことは本当にしてないのですが、サンプルは動いたので、<br /> 次は自分でSES上で書いたLチカプログラムをビルドして動かしたり、<br /> SDKのBLEサンプル弄ったりしてみたいと思います。  </p> <h3>参考資料</h3> <p><a href="https://www.nordicsemi.com/Software-and-tools/Development-Tools/Segger-Embedded-Studio/Get-Started#infotabs">https://www.nordicsemi.com/Software-and-tools/Development-Tools/Segger-Embedded-Studio/Get-Started#infotabs</a> <a href="https://qiita.com/KentaHarada/items/341a0d5c9571da3aaf32">https://qiita.com/KentaHarada/items/341a0d5c9571da3aaf32</a> <a href="https://www.youtube.com/watch?v=o_H1USWAM18">https://www.youtube.com/watch?v=o_H1USWAM18</a></p> <div class="footnote"> <p class="footnote"><a href="#fn-d1d4db65" name="f-d1d4db65" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">ゴリゴリのHWエンジニア</span></p> </div> hetakan OKR始めて1年。失敗したこと得られたこと。 hatenablog://entry/26006613501040686 2020-01-23T20:52:25+09:00 2020-01-23T20:52:25+09:00 ブログをご無沙汰しているうちに、もう2020年。 ネフロックでは新年の目標を決め、このブログもこれからは心を入れ替えて皆で進めていきます。今日はそんな、ネフロックの目標設定についてまとめてみます。 OKR導入してみた 補足:OKRとは? トライアル開始 本導入 失敗したこと 失敗①:やっぱりフォーカスが大事 失敗②:目標は立てっぱなしにしない 失敗③:OKRと既存業務の共存が難しい 得られたこと 良い変化 プロジェクト公開(予告) OKR導入してみた 今からちょうど1年前。 創業8期目も終盤に差し掛かった新年のある日、私たちは考えました。なんとなく楽しく仕事をして、それなりにやって来たけど、そ… <p>ブログをご無沙汰しているうちに、もう2020年。<br> ネフロックでは新年の目標を決め、このブログもこれからは心を入れ替えて皆で進めていきます。<br>今日はそんな、ネフロックの目標設定についてまとめてみます。</p> <ul class="table-of-contents"> <li><a href="#OKR導入してみた">OKR導入してみた</a><ul> <li><a href="#補足OKRとは">補足:OKRとは?</a></li> <li><a href="#トライアル開始">トライアル開始</a></li> <li><a href="#本導入">本導入</a></li> </ul> </li> <li><a href="#失敗したこと">失敗したこと</a><ul> <li><a href="#失敗やっぱりフォーカスが大事">失敗①:やっぱりフォーカスが大事</a></li> <li><a href="#失敗目標は立てっぱなしにしない">失敗②:目標は立てっぱなしにしない</a></li> <li><a href="#失敗OKRと既存業務の共存が難しい">失敗③:OKRと既存業務の共存が難しい</a></li> </ul> </li> <li><a href="#得られたこと">得られたこと</a><ul> <li><a href="#良い変化">良い変化</a></li> <li><a href="#プロジェクト公開予告">プロジェクト公開(予告)</a></li> </ul> </li> </ul> <h1 id="OKR導入してみた">OKR導入してみた</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20200115/20200115121959.png" alt="OKR, KPI, MBO" title="f:id:s_akiko:20200115121959p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>今からちょうど1年前。<br/> 創業8期目も終盤に差し掛かった新年のある日、私たちは考えました。なんとなく楽しく仕事をして、それなりにやって来たけど、そろそろ真面目に大きなことしてみようか?</p> <p>そこで決めたのが"OKR"の導入でした。色々な方法論の中からOKRを選んだのは、①「成長」のための手法で、私たちの目的に合うこと、②Googleをはじめとするテック系企業での導入が多いためフィットしそうなこと、が大きな理由です。</p> <h4 id="補足OKRとは">補足:OKRとは?</h4> <p>目標設定・目標管理のフレームワークとして、GoogleやFacebookの事例で注目を浴び、色々なところで取り上げられているので詳細は割愛しますが、社内ではこんなメモを使って説明しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20200122/20200122235130.png" alt="f:id:s_akiko:20200122235130p:plain:w400" title="f:id:s_akiko:20200122235130p:plain:w400" class="hatena-fotolife" style="width:400px" itemprop="image"></span></p> <p>社内で主に参考にした本です。 <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B07B2R1ZDL/hatena-blog-22/"><img src="https://images-fe.ssl-images-amazon.com/images/I/512xkUh8Y8L._SL160_.jpg" class="hatena-asin-detail-image" alt="OKR(オーケーアール)" title="OKR(オーケーアール)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B07B2R1ZDL/hatena-blog-22/">OKR(オーケーアール)</a></p><ul><li><span class="hatena-asin-detail-label">作者:</span><a href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%B9%A5%C6%A5%A3%A1%BC%A5%CA%A1%A6%A5%A6%A5%A9%A5%C9%A5%AD%A1%BC" class="keyword">クリスティーナ・ウォドキー</a></li><li><span class="hatena-asin-detail-label">出版社/メーカー:</span> 日経BP</li><li><span class="hatena-asin-detail-label">発売日:</span> 2018/03/15</li><li><span class="hatena-asin-detail-label">メディア:</span> Kindle版</li></ul></div><div class="hatena-asin-detail-foot"></div></div></p> <h4 id="トライアル開始">トライアル開始</h4> <p>本格的に導入する前に、まずはマネジメントチームで3ヶ月間のトライアルを行いました。このときのOKRは、大事な項目の全部盛り。OKRにおいて「フォーカス」が重要であることは、本や事例を読んで頭では知っていましたが、どんな種類・大きさ・難易度の目標にフォーカスすると効果的なのか、感覚的には分かりませんでした。そこで初回は、目標を絞って失敗するより盛り込みすぎて失敗するくらいでいこうと決めました。</p> <h4 id="本導入">本導入</h4> <p>1月~3月のトライアルを経て、2019年4月の新年度。社内で説明会を行い、全員参加で本格スタートしました。今回はトライアルでの反省を踏まえ(※後述)、全く新しいプロジェクトを立ち上げ、そのプロジェクトについてOKRで目標設定・管理することにしました。</p> <p><br></p> <p>そして現在、最初のトライアルから数えて1年が経ちましたので、私たちの通過してきた失敗を中心にまとめてみたいと思います。</p> <h1 id="失敗したこと">失敗したこと</h1> <h4 id="失敗やっぱりフォーカスが大事">失敗①:やっぱりフォーカスが大事</h4> <p>トライアル時には前述の通り、盛り込みすぎを承知の上で始めましたが、実際やって身に沁みたことは以下の点です。</p> <ul> <li>多すぎると、そもそも覚えきれない。覚えていない目標にワクワクできない。</li> <li>多すぎると、それぞれの60~70%達成を目指すのではなく、60~70%の項目をやればOKという感じになってきて、3割程の項目が途中で空気になる。</li> <li>多すぎると、項目の粒感が揃いにくい。挑戦的な目標と現実的すぎる目標、抽象的な目標とToDoレベルの目標が混ざり合い、やることがブレる。</li> </ul> <p><u><次回への教訓>:<b>新しい目標1つ</b>にフォーカスする </u></p> <ul> <li>次回は1つのOKRにしぼる</li> <li>今取り組んでいることの成長よりも、新しい挑戦に向いていることが分かったので、全く新しい目標を設定する<br></li> </ul> <p>⇒この教訓により、本導入時は1つのOKRにしました。</p> <h4 id="失敗目標は立てっぱなしにしない">失敗②:目標は立てっぱなしにしない</h4> <p>本導入後の大きな失敗は、目標と実体がズレてきたときに、途中で修正をしなかったことです。</p> <ul> <li>3ヶ月での目標を設定いざ始めると難しくてスケジュールがはまらなくなったが、修正しなかったため、いくつかのKRが形骸化してしまった。</li> <li>そのため段々とKRの達成度や優先度の話をしなくなり、mtgが事務報告的になってしまった。</li> <li>結局3ヶ月を過ぎてもズルズルとOKRを延長し、検証しないまま来てしまった。</li> </ul> <p><u><次回への教訓>:目標は必要に応じて修正。達成できなくても決めた期間で必ず検証。 </u></p> <h4 id="失敗OKRと既存業務の共存が難しい">失敗③:OKRと既存業務の共存が難しい</h4> <p>トライアル時も本導入時も頭を悩ませたのはこの点です。今後もまだまだトライ&エラーが必要そうです。</p> <ul> <li>トライアルでは既存業務もすべて盛り込んで雑然とした。※失敗①</li> <li>本導入時はOKRを新プロジェクト1本に絞り、通常の週次mtgも廃止してOKRのmtgのみに→既存業務が見えなくなった。(OKRの健全性指標として、既存業務の健全性の確認も入れたが不十分だった)</li> <li>そこで、OKRと合わせて業務報告も行うようにしたところ、今度は普通の週次mtgになってしまった。</li> </ul> <p><u><次回への仮説>:次は試しに、会社全体の長期的Oを設定し、その下に既存の改革と新プロジェクト遂行のOKRを共存させる方向。</u></p> <p><p>※ゆる募:良い方法がある方はぜひ教えてください!</p> <h1 id="得られたこと">得られたこと</h1> <h4 id="良い変化">良い変化</h4> <p><p>色々な失敗を経ながらも、導入の手応えは感じていました。OKRは運用が重要ということで、当初はKRの達成度や今週の優先事項の共有を行っており、下記のような良い変化が起こりました。途中でOKRmtgのあり方が曖昧になってしまったので、新年からは再度工夫して取り組んでいく予定です。</p></p> <ul> <li><p>「目標の達成に何が必要か」という視点で今週のToDoを決めるため、目の前のことに追われるのではなく、重要なことを優先できた。</p></li> <li><p>全員の取組み・困ったこと・優先項目を共有するので、自然にサポートしあえた。</p></li> <li><p>自分たち自身で決めた大きな目標に向かうことは、チームの大きなエネルギーになった。<br> (※ただし目標設定の段階で納得しワクワクしていることが重要)</p></li> </ul> <h4 id="プロジェクト公開予告">プロジェクト公開(予告)</h4> <p><p>最後に、OKRとして4月から取組んでいる新プロジェクトの中身ですが、ようやく形になりそうです。時間が掛かりましたが、ここまで進んで来られたのはOKRを導入した成果だと思います。<br> プロジェクトコードは"KUROFUNE"。ネフロックの社名の由来である黒船<a href="#f-3750ab65" name="fn-3750ab65" title="「日本のテクノロジーを世界へ」という創業時の想いから、黒船を逆から読みそこにRock感を足してネフロックと名付けました。">*1</a>から名付けました。</p> <p>実はなんと、このプロジェクトで、来月筑波で開催されるmini Maker Faireに出展してきますーー!!!そんなKUROFUNEについて、来月から徐々に発信していきます!</p> 以上、ありがとうございました。 <figure class="figure-image figure-image-fotolife" title="KUROFUNE"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20200123/20200123131805.jpg" alt="f:id:s_akiko:20200123131805j:plain:w400" title="f:id:s_akiko:20200123131805j:plain:w400" class="hatena-fotolife" style="width:400px" itemprop="image"></span><figcaption>KUROFUNE</figcaption></figure></p> <div class="footnote"> <p class="footnote"><a href="#fn-3750ab65" name="f-3750ab65" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">「日本のテクノロジーを世界へ」という創業時の想いから、黒船を逆から読みそこにRock感を足してネフロックと名付けました。</span></p> </div> s_akiko What is オモシロイ? hatenablog://entry/17680117127009219042 2019-04-08T19:01:20+09:00 2019-04-23T10:56:04+09:00 こんばんは!akikoです。 突然ですが、大人になってからどんなときに「オモシロイ」と感じますか? さまざまな答えがあると思いますが、私たちNefrockにとってのオモシロイとは、ハードルの高いことや新しいことにあえてチャレンジすること、かもしれません。 今日は、そんなNefrockが大切にしている、勉強会についてお話します。 「74」 勉強会、なぜやるのか?[1] ネフロックマインド 勉強会、なぜやるのか?[2] ネフロックの夢 どんなことをやっているのか? 第77回で平成を締める! 「74」 Nefrock Lab Ookayama 74。 これは、2016年5月から今日までに3年弱の間に… <p>こんばんは!akikoです。</p> <p>突然ですが、大人になってからどんなときに「オモシロイ」と感じますか?</p> <p>さまざまな答えがあると思いますが、私たちNefrockにとってのオモシロイとは、ハードルの高いことや新しいことにあえてチャレンジすること、かもしれません。</p> <p>今日は、そんなNefrockが大切にしている、勉強会についてお話します。</p> <p><br /></p> <ul class="table-of-contents"> <li><a href="#74">「74」</a></li> <li><a href="#勉強会なぜやるのか1ネフロックマインド">勉強会、なぜやるのか?[1] ネフロックマインド</a></li> <li><a href="#勉強会なぜやるのか2ネフロックの夢">勉強会、なぜやるのか?[2] ネフロックの夢</a></li> <li><a href="#どんなことをやっているのか">どんなことをやっているのか?</a></li> <li><a href="#第77回で平成を締める">第77回で平成を締める!</a></li> </ul> <h4 id="74">「74」</h4> <p><figure class="figure-image figure-image-fotolife" title="Nefrock Lab Ookayama"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20190404/20190404132916.png" alt="f:id:s_akiko:20190404132916p:plain" title="f:id:s_akiko:20190404132916p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>Nefrock Lab Ookayama</figcaption></figure></p> <p>74。<br/> これは、2016年5月から今日までに3年弱の間に開催したNefrock勉強会の数です。<br/> 大岡山にある弊社ビルNefrock Lab Ookayamaにて、さまざまなジャンルの専門家を呼んだり、皆で実際に手を動かしてみたり、豊富なテーマで、誰でも自由に参加できる会を開催しています。</p> <p><figure class="figure-image figure-image-fotolife" title="(左)ファミコン開発入門   (中央)ジャグリングあれこれ   (右)計算プラレール概論"><div class="images-row mceNonEditable"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20190406/20190406171831.png" alt="&#x30D5;&#x30A1;&#x30DF;&#x30B3;&#x30F3;, &#x52C9;&#x5F37;&#x4F1A;" title="f:id:s_akiko:20190406171831p:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20190406/20190406171825.png" alt="&#x30B8;&#x30E3;&#x30B0;&#x30EA;&#x30F3;&#x30B0;, &#x52C9;&#x5F37;&#x4F1A;" title="f:id:s_akiko:20190406171825p:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20190406/20190406171841.png" alt="&#x30D7;&#x30E9;&#x30EC;&#x30FC;&#x30EB;, &#x52C9;&#x5F37;&#x4F1A;" title="f:id:s_akiko:20190406171841p:plain" class="hatena-fotolife" itemprop="image"></span></div><figcaption>(左)ファミコン開発入門   (中央)ジャグリングあれこれ   (右)計算プラレール概論</figcaption></figure></p> <p>他にもこれまでこんなテーマで開催してきました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fnefrock%2Fbenkyokai" title="nefrock/benkyokai" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://github.com/nefrock/benkyokai">github.com</a></cite></p> <h4 id="勉強会なぜやるのか1ネフロックマインド">勉強会、なぜやるのか?[1] ネフロックマインド</h4> <p>Nefrockの人間は、オモシロイことが大好き。</p> <p>社に唯一のルールがあるとしたら、「自分たち自身がテクノロジーを全力で楽しむ」こと。<br/> その好奇心は業務内に留まらず、おもしろいと思うことがあれば、それが自然と勉強会の開催につながっていきます。</p> <p>では、私たちにとってのおもしろい・楽しいとは何なのか。私たちの大事にしているネフロックマインドをご紹介します。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20190408/20190408185348.png" alt="&#x30CD;&#x30D5;&#x30ED;&#x30C3;&#x30AF;&#x30DE;&#x30A4;&#x30F3;&#x30C9;" title="f:id:s_akiko:20190408185348p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><br /></p> <p>では、なぜそれをオープンにやっているのか。 <br /> <br /></p> <h4 id="勉強会なぜやるのか2ネフロックの夢">勉強会、なぜやるのか?[2] ネフロックの夢</h4> <p><br /> Nefrockには夢があります。 <br /> <br /> <b>世界屈指のテクノロジーを誇る大学、東工大があるここ大岡山を、<br/> 世界屈指のテクノロジーが生まれる街にしたい。 </b></p> <p>つまり、大岡山をシリコンバレーのようにしたいと夢見ています。</p> <p>そのため、大学・街・企業が一体となって知的創造を行っていく場として、<br/> 2015年にテクノロジービルディング "Nefrock Lab Ookayama" を建てました。<br/> Nefrockのオフィスはこのビルの1階に構えています。</p> <p>このNefrock Lab Ookayamaの使命の一つとして、 学生、現役のエンジニア、近隣の人々が交流できるイベントや勉強会を定期的に開催しているのです。 ここから新たなアイディアや人材が生まれることを目指し、知的創造の場と機会をつくるインキュベーターの役目を果たせればと考えています。</p> <p><br /> <br /></p> <h4 id="どんなことをやっているのか">どんなことをやっているのか?</h4> <p>先ほどのネフロックマインドをもとに、勉強会は大きく分けて2つの視点をベースにしています。</p> <p><b>①エンジニアとしての知見を深めたいか?広げたいか?<br/> ②新しい知識や出会いからインプットしたいか?自分の持つものをアウトプットしたいか?</b></p> <p>それらを軸に、勉強会のテーマはおよそ下図のように分類できます。</p> <p><br /></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20190408/20190408103353.png" alt="f:id:s_akiko:20190408103353p:plain" title="f:id:s_akiko:20190408103353p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>実際のテーマはこれらの領域をまたがることも多いですが、大事な視点はこんな感じです。ポピュラーなもくもく会などを今のところ開催していないのは、こんな背景だからですね。</p> <p><br /> <br /></p> <h4 id="第77回で平成を締める">第77回で平成を締める!</h4> <p>令和まで残り1ヶ月を切りましたが、少なくともそれまでにあと3回は勉強会を予定しているので、記念すべき?77回を以て平成を走り切ることができそうです。<br/> 今後の予定は下記の通り。</p> <p><br /></p> <ol> <li><p><b>4/10(水)ハードウェア勉強会</b><br/> 全7回の<a href="https://nefrock.connpass.com/event/126392/">FPGAのハンズオン勉強会</a>最終回。後日ブログにて公開いたします!!<br/> 今後も水曜日をベースにハードウェア系勉強会を開催していきます!<br /><br /></p></li> <li><p><b>4/12(金)宇宙アイディアソン</b><br/> 衛星データプラットフォームTellusを触りながら、楽しい活用方法を考えるアイディアソンを開催します。どなたでも参加者募集中です!<br/> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fnefrock.connpass.com%2Fevent%2F124697%2F" title="Nefrock勉強会in大岡山「宇宙アイディアソン」 (2019/04/12 19:00〜)" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://nefrock.connpass.com/event/124697/">nefrock.connpass.com</a></cite> <br /></p></li> <li><p><b>4/26(金)VR関連勉強会</b>(タイトル未定)<br/> VR関連の勉強会を予定しております。<br/> 詳細はtwitter<a href="https://twitter.com/nefrock_inc">@nefrock_inc</a>をフォローするか、<br/> connpassの<a href="https://nefrock.connpass.com/">Nefrockグループ</a>にご登録いただくと、発信して参ります!</p></li> </ol> <p><br /></p> <hr /> <p><br /></p> <p>Nefrock勉強会なら、きっと自分の「オモシロイ」が見つかるはず。<br/> これからもどんどん続けて参りますので、<a href="https://twitter.com/nefrock_inc">twitter</a>や<a href="https://nefrock.connpass.com/">connpass</a>をぜひチェックしてご参加ください。今後はこちらのブログでレポートも掲載していきます。<br/> ありがとうございました ^ ^</p> <p><a href="https://twitter.com/nefrock_inc?ref_src=twsrc%5Etfw" class="twitter-follow-button" data-show-count="false">Follow @nefrock_inc</a><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p> <p><br /> <br /></p> s_akiko 大岡山エレキランド 〜Nefrockがハードウェア専用部屋を作る理由〜 hatenablog://entry/17680117126981876026 2019-03-11T18:28:45+09:00 2019-04-08T19:17:41+09:00 こんにちは。Nefrockで企画・マーケティングを担当しているakikoです。 このテックブログで唯一の非エンジニアの私からは、具体的な技術の話ではなく、なぜそれをやるのか(WHY)・どのようにやるのか(HOW)、などの視点から情報をお伝えしてまいります。 さて、最近Nefrockでは、自社ビルの中にハードウェア専用の部屋をつくり始めましたので、今回はその様子についてお伝えします。 Nefrock Lab Ookayamaの4階 ■ [WHY] なぜつくるのか? ■ [HOW] どうやって?① リトル秋葉原をつくる ■ [HOW] どうやって?② 超リアルタイムコミュニケーションの実現 ■ [… <p>こんにちは。Nefrockで企画・マーケティングを担当しているakikoです。<br/> このテックブログで唯一の非エンジニアの私からは、具体的な技術の話ではなく、なぜそれをやるのか(WHY)・どのようにやるのか(HOW)、などの視点から情報をお伝えしてまいります。</p> <p>さて、最近Nefrockでは、自社ビルの中にハードウェア専用の部屋をつくり始めましたので、今回はその様子についてお伝えします。</p> <p><figure class="figure-image figure-image-fotolife" title="Nefrock Lab Ookayamaの4階"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/n/nefrock/20190219/20190219151642.png" alt="f:id:nefrock:20190219151642p:plain" title="f:id:nefrock:20190219151642p:plain" class="hatena-fotolife" itemprop="image"></span><figcaption>Nefrock Lab Ookayamaの4階</figcaption></figure></p> <ul class="table-of-contents"> <li><a href="#-WHY-なぜつくるのか">■ [WHY] なぜつくるのか?</a></li> <li><a href="#-HOW-どうやってリトル秋葉原をつくる">■ [HOW] どうやって?① リトル秋葉原をつくる</a></li> <li><a href="#-HOW-どうやって超リアルタイムコミュニケーションの実現">■ [HOW] どうやって?② 超リアルタイムコミュニケーションの実現</a></li> <li><a href="#-HOW-どうやってエンジニアのクリエイティビティを刺激する顔認識音響システム">■ [HOW] どうやって?③ エンジニアのクリエイティビティを刺激する顔認識音響システム?</a></li> <li><a href="#さいごに">■さいごに</a></li> </ul> <p><br /> <br /></p> <h4 id="-WHY-なぜつくるのか">■ [WHY] なぜつくるのか?</h4> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/n/nefrock/20190226/20190226143612.jpg" alt="f:id:nefrock:20190226143612j:plain:h350" title="f:id:nefrock:20190226143612j:plain:h350" class="hatena-fotolife" style="height:350px" itemprop="image"></span></p> <p><br /> 今回、ハードウェア開発専用の部屋をつくる第一目的は、<br/> プロダクト開発のすべての工程を一気通貫で、自前で出来るようにすることです。</p> <p>一般的には下左図のように、どこかの工程を、外注する・または社内他部署に依頼する、というフローが多いと思います。しかし、開発期間が長くなったり、コミュニケーションギャップが発生したり、という状況が起こりがちではないでしょうか。</p> <p>Nefrockでは今回、ハードウェア周りの環境を一気に整えることで、すべての工程を自前で行えるようになります。これによって、質(開発クオリティ)とスピード(機動力)を同時に担保していきます。</p> <p><br /></p> <div class="images-row mceNonEditable"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20190306/20190306123432.png" alt="f:id:s_akiko:20190306123432p:plain" title="f:id:s_akiko:20190306123432p:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20190306/20190306123438.png" alt="f:id:s_akiko:20190306123438p:plain" title="f:id:s_akiko:20190306123438p:plain" class="hatena-fotolife" itemprop="image"></span></div> <p><br /> ・・・と大層なことを書きましたが、実は</p> <p><strong> 「ぜんぶ自分たちの手でつくりたい!」 </strong>という<strong> Nefrockエンジニアのロマンの実現 </strong></p> <p>でもあるのです。<br/> そんなエンジニアのロマンと遊び心をいっぱい詰め込んで、エンジニアのテーマパークのようにしようという気持ちを込め、この部屋を ”大岡山エレキランド” と名付けてしまった次第です。</p> <p><br /> <br /></p> <p>それでは、具体的な器材を紹介します。</p> <p><br /></p> <p><figure class="figure-image figure-image-fotolife" title="レーザーカッター(約100時間?!を費やした自作裏話はいずれ公開してもらおうと思います)"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20190306/20190306135754.gif" alt="&#x30EC;&#x30FC;&#x30B6;&#x30FC;&#x30AB;&#x30C3;&#x30BF;&#x30FC;" title="f:id:s_akiko:20190306135754g:plain:w400" class="hatena-fotolife" style="width:400px" itemprop="image"></span><figcaption>レーザーカッター(約100時間?!を費やした自作裏話はいずれ公開してもらおうと思います)</figcaption></figure></p> <p><br /></p> <p><figure class="figure-image figure-image-fotolife" title="ロジックアナライザー付オシロスコープ・安定化電源"><div class="images-row mceNonEditable"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20190306/20190306123528.jpg" alt="&#x30ED;&#x30B8;&#x30C3;&#x30AF;&#x30A2;&#x30CA;&#x30E9;&#x30A4;&#x30B6;&#x30FC;&#x3000;&#x30AA;&#x30B7;&#x30ED;&#x30B9;&#x30B3;&#x30FC;&#x30D7;" title="f:id:s_akiko:20190306123528j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20190306/20190306125936.jpg" alt="&#x5B89;&#x5B9A;&#x5316;&#x96FB;&#x6E90;" title="f:id:s_akiko:20190306125936j:plain" class="hatena-fotolife" itemprop="image"></span></div><figcaption>ロジックアナライザー付オシロスコープ・安定化電源</figcaption></figure></p> <p><br /></p> <p><figure class="figure-image figure-image-fotolife" title="ハンダステーション・改造リフロー炉"><div class="images-row mceNonEditable"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20190306/20190306123742.jpg" alt="&#x30CF;&#x30F3;&#x30C0;&#x3000;&#x30CF;&#x30F3;&#x30C0;&#x30B9;&#x30C6;&#x30FC;&#x30B7;&#x30E7;&#x30F3;" title="f:id:s_akiko:20190306123742j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20190306/20190306123535.jpg" alt="&#x30EA;&#x30D5;&#x30ED;&#x30FC;&#x7089;" title="f:id:s_akiko:20190306123535j:plain" class="hatena-fotolife" itemprop="image"></span></div><figcaption>ハンダステーション・改造リフロー炉</figcaption></figure></p> <p><br /></p> <p><figure class="figure-image figure-image-fotolife" title="3Dプリンター・インパクトドライバー(←カッコイイとはしゃぐエンジニア達と、い、色合いがいいねと答える私)"><div class="images-row mceNonEditable"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20190306/20190306130250.jpg" alt="3D&#x30D7;&#x30EA;&#x30F3;&#x30BF;&#x30FC;" title="f:id:s_akiko:20190306130250j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20190306/20190306132248.jpg" alt="&#x30A4;&#x30F3;&#x30D1;&#x30AF;&#x30C8;&#x30C9;&#x30E9;&#x30A4;&#x30D0;&#x30FC;&#x3000;BOSCH" title="f:id:s_akiko:20190306132248j:plain" class="hatena-fotolife" itemprop="image"></span></div><figcaption>3Dプリンター・インパクトドライバー(カッコイイとはしゃぐエンジニア達と笑ってごまかす私)</figcaption></figure></p> <p><br /></p> <p>今後他にも、CNCなどが導入予定です。</p> <p>さて、これらによって、自前でほとんどの工程が行える、スマートな開発環境が整いました。<br/> でも、部屋をつくり器材を揃えて、それで終了ではありません。クオリティと機動力を担保するため、まだまだ工夫をしています。</p> <p>ここからは、"どうやってクオリティと機動力を担保するのか?" について書いていきます。 <br /> <br /></p> <h4 id="-HOW-どうやってリトル秋葉原をつくる">■ [HOW] どうやって?① リトル秋葉原をつくる</h4> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/n/nefrock/20190226/20190226142738.jpg" alt="f:id:nefrock:20190226142738j:plain:w500" title="f:id:nefrock:20190226142738j:plain:w500" class="hatena-fotolife" style="width:500px" itemprop="image"></span></p> <p><br /> 「あー、○○がない!仕入れなきゃ・・・」<br/> 開発中あるあるでしょうか。ここには最初から一通りの部品が揃っています。<br/> イメージはリトル秋葉原。<br/> だから、わざわざ秋葉原へ出向かなくても、<strong> 『思いついたらすぐ試作!』 </strong>が可能になるのです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20190306/20190306142639.jpg" alt="f:id:s_akiko:20190306142639j:plain:w400" title="f:id:s_akiko:20190306142639j:plain:w400" class="hatena-fotolife" style="width:400px" itemprop="image"></span></p> <p><br /></p> <h4 id="-HOW-どうやって超リアルタイムコミュニケーションの実現">■ [HOW] どうやって?② 超リアルタイムコミュニケーションの実現</h4> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/n/nefrock/20190226/20190226132525.jpg" alt="f:id:nefrock:20190226132525j:plain:w500" title="f:id:nefrock:20190226132525j:plain:w500" class="hatena-fotolife" style="width:500px" itemprop="image"></span></p> <p><br /> クオリティと機動力を担保する一番大事な要素は、やっぱり「人」だと思います。</p> <p>Nefrockには部署という考え方はありません。一人一人に専門性・得意分野があり、それをプロジェクトごとに有機的に組み合わせてチームをつくるという方法を採っています。<br/> (このあたりは、いずれ別の記事でお話できたらと思います。)</p> <p>しかし、いくらチームで開発するとはいえ、ハードウェアエンジニアの部屋が物理的に離れていては、結局コミュニケーションロスが生じる可能性が高まります。</p> <p>頻繁に打ち合わせをする?slackでつながっているから大丈夫?<br/> 高い成果を目指すチームに必要なことは何なのでしょう。</p> <p><br /> 私たちの答えは、<strong> 「雑談できるチームは強い」 </strong>です。 <br /> <br /></p> <p>思ったときに思ったことを誰もが心理的障壁なく口に出せる。<br/> それがいつものNefrockのワークスタイルでもあります。誰かの雑談から、いつの間にか開発アイディアへつながっていくことも珍しくありません。(もちろんそのまま雑談していることも・・笑)</p> <p><br /></p> <p>Googleが成功するチームの要素として導き出した”心理的安全性”に近いんじゃ…なーんて思ったり <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Frework.withgoogle.com%2Fguides%2Funderstanding-team-effectiveness%2Fsteps%2Fintroduction%2F" title="re:Work - Guide: Understand team effectiveness" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://rework.withgoogle.com/guides/understanding-team-effectiveness/steps/introduction/">rework.withgoogle.com</a></cite></p> <p><br /></p> <p>そこで今まで通り、いつでも誰でもフラットにコミュニケーションが取れる環境を継続するために、</p> <ol> <li><p>まず、4階の基地と1階のオフィスを大きなディスプレイでつなぎます。</p></li> <li><p>そして、継続したコミュニケーションの維持に一番重要な、ノンストレス・完全リアルタイム!!を実現するスペシャルな通信環境を計画しています。</p></li> </ol> <p><br /></p> <p><figure class="figure-image figure-image-fotolife" title="完全リアルタイムな通信環境の実現"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20190306/20190306144449.png" alt="" title="f:id:s_akiko:20190306144449p:plain:w200" class="hatena-fotolife" style="width:200px" itemprop="image"></span><figcaption>完全リアルタイムな通信環境の実現</figcaption></figure></p> <p><br /></p> <h4 id="-HOW-どうやってエンジニアのクリエイティビティを刺激する顔認識音響システム">■ [HOW] どうやって?③ エンジニアのクリエイティビティを刺激する顔認識音響システム?</h4> <p>最後に、忘れてはいけない大事な要素は、エンジニアの気持ちが上がり、クリエイティビティが刺激される環境づくりです。 これはまだ構想段階なので、イメージだけ。</p> <p><figure class="figure-image figure-image-fotolife" title="こんな作業場はいかがでしょうか?"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20190306/20190306123452.png" alt="&#x9854;&#x8A8D;&#x8B58;&#x3000;&#x6307;&#x5411;&#x6027;&#x30B9;&#x30D4;&#x30FC;&#x30AB;&#x30FC;" title="f:id:s_akiko:20190306123452p:plain:w400" class="hatena-fotolife" style="width:400px" itemprop="image"></span><figcaption>こんな作業場はいかがでしょうか?</figcaption></figure></p> <p>カメラ付きのスピーカーがエンジニアそれぞれを認識して追跡し、一人一人の気分に合った音楽を、その人だけに聴こえるように提供する、そんな環境をいずれ創るかも?!しれません。<br/> もし実現した暁には、音響マニアのエンジニアに記事にしてもらおうと思います。</p> <p><br /> <br /></p> <h4 id="さいごに">■さいごに</h4> <p>以上のコンセプトで部屋作りを進めており、エンジニア達は1つ1つの機材を設置するごとに新発見やエピソードが増えていく日々を過ごしています。今後の予定は下記の通りです。</p> <ol> <li>3月中の完成を目指します。</li> <li>4月にはお披露目イベントを開催し、ハードウェアエンジニアの方を中心にご招待できればと思います。<br/>  (※もしご興味ある方は、DMお願いします。)</li> <li>完成レポートを公開します。</li> </ol> <p>ありがとうございました。</p> <p>akiko</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s_akiko/20190408/20190408191405.png" alt="f:id:s_akiko:20190408191405p:plain" title="f:id:s_akiko:20190408191405p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><br /></p> <p><a href="https://twitter.com/nefrock_inc?ref_src=twsrc%5Etfw" class="twitter-follow-button" data-show-count="false">Follow @nefrock_inc</a><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p> s_akiko Nefrockエンジニアブログはじめます hatenablog://entry/17680117126967598438 2019-03-11T18:28:24+09:00 2019-03-11T19:22:56+09:00 ■Nefrockとは? 『テクノロジーで世の中をもっと楽しくする』 というビジョンのもと、ソフトウェア・ハードウェアの研究開発を行なっている会社です。 私たちのモットーは、 エンジニア自身がテクノロジーを全力で楽しむ こと。 最近のメインテーマは、AI×ハードウェアです。 そんなNefrockでの開発話や、Nefrock Lab Ookayama*で開催している勉強会の話など、 エンジニアリングまわりの話を書いていきたいと思います。 Nefrock ■Nefrock Lab Ookayamaとは? Nefrock Lab Ookayamaは、Nefrockが2015年に大岡山に設立したテクノロ… <p><img src="https://user-images.githubusercontent.com/46802126/52159114-2e6f7980-26e3-11e9-8f58-3f48092fd926.png" alt="Nefrock" /></p> <h2>■Nefrockとは?</h2> <p><b>『テク<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CE%A5%ED">ノロ</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B8%A1%BC">ジー</a>で世の中をもっと楽しくする』</b></p> <p>というビジョンのもと、ソフトウェア・ハードウェアの研究開発を行なっている会社です。<br/> 私たちのモットーは、<u> エンジニア自身がテク<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CE%A5%ED">ノロ</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B8%A1%BC">ジー</a>を全力で楽しむ </u>こと。<br/> 最近のメインテーマは、AI×ハードウェアです。<br/> そんなNefrockでの開発話や、Nefrock Lab Ookayama*で開催している勉強会の話など、 エンジニアリングまわりの話を書いていきたいと思います。</p> <p><a href="https://nefrock.com/">Nefrock</a></p> <h2>■Nefrock Lab Ookayamaとは?</h2> <p>Nefrock Lab Ookayamaは、Nefrockが2015年に大岡山に設立したテク<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CE%A5%ED">ノロ</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B8%A1%BC">ジー</a>ビルディングです。ここには学生や社会人など、会社や職種を超えた様々な人達が住んでおり、技術イベントや交流会を定期的に開催しています。 <br/> 隔週金曜日は勉強会を開催。 毎回、1人の発表者が自分のやっていることや興味のある技術について話します。 ここでの内容も書いていきたいと思います。(過去の発表タイトルは<a href="https://github.com/nefrock/benkyokai">コチラ</a>)</p> <p><a href="http://nefrocklab.io/">Nefrock Lab Ookayama</a></p> <p><br /> <br /></p> nefrock