2018年3月30日金曜日

在Python 3中使用YOLOv2

YOLOv2Joseph Redmon提出的针对YOLO算法不足的改版本,作者使用了一系列的方法原来的YOLO多目标检测框架行了改,在保持原有速度的优势之下,精度上得以提升,此外作者提出了一种目检测训练方法,通过这种方法YOLO9000可以同COCOImageNet数据集中训练训练后的模型可以实现多达9000种物体的实时检测

Paperhttps://arxiv.org/abs/1612.08242
Github
https://github.com/pjreddie/darknet
Website
https://pjreddie.com/darknet/yolo

作者YOLO算法设计了独有的深度学框架darknet,因此没有提供Python的接口。在实验中,我找到了两种在Python 3中使用YOLOv2的方法。

第一种:darknet添加Python接口

Githubhttps://github.com/SidHard/py-yolo2

该项目使用了原始的darknet,需要使用cmake重新编译,因此在Linux上使用更方便一些。

首先从git上下载该项
git clone https://github.com/SidHard/py-yolo2.git
cmake生成
cmake .. && make
最后yolo.py测试项目,相的网络结.cfg文件保存在cfg文件中,权值.weight文件放在根目下,些可以从darknet的官方网站上下使用。

第二种:使用keras

Githubhttps://github.com/allanzelener/YAD2K

该项目使用了kerastensorflow-gpu,因此可以在任何使用框架的境下运行,我在自己的程序中使用的种方法。

首先下源文件并且配置境,可以使用anaconda境或者在全局安装。

git clone https://github.com/allanzelener/yad2k.git
cd yad2k
 
# [Option 1] To replicate the conda environment:
conda env create -f environment.yml
source activate yad2k
# [Option 2] Install everything globaly.
pip install numpy
 
pip install tensorflow-gpu  # CPU-only: conda install -c conda-forge tensorflow
pip install keras # Possibly older release: conda install keras

快速开始

  • Darknet官方下modelofficial YOLO website.
    wget http://pjreddie.com/media/files/yolo.weights
  • Darknet YOLO_v2 model转换为Keras model.
    ./yad2k.py cfg/yolo.cfg yolo.weights model_data/yolo.h5
  • 测试图片位于 images/文件.
    ./test_yolo.py model_data/yolo.h5

最后test_yolo就可以行网,在images/out/文件里可以看到行效果。

dog.jpg

eagle.jpg

giraffe.jpg

horses.jpg

了方便模型用于测试视频片,我demo做了修改,相比原来的测试,能直接移植到目中去,象化的程序也更易于修改,代如下

#! /usr/bin/env python
"""Run a YOLO_v2 style detection model on test images."""
import cv2
import os
import time
import numpy as np
from keras import backend as K
from keras.models import load_model
 
from yad2k.models.keras_yolo import yolo_eval, yolo_head
 
 
class YOLO(object):
    def __init__(self):
        self.model_path = 'model_data/yolo.h5'
        self.anchors_path = 'model_data/yolo_anchors.txt'
        self.classes_path = 'model_data/coco_classes.txt'
        self.score = 0.3
        self.iou = 0.5
 
        self.class_names = self._get_class()
        self.anchors = self._get_anchors()
        self.sess = K.get_session()
        self.boxes, self.scores, self.classes = self.generate()
 
    def _get_class(self):
        classes_path = os.path.expanduser(self.classes_path)
        with open(classes_path) as f:
            class_names = f.readlines()
        class_names = [c.strip() for c in class_names]
        return class_names
 
    def _get_anchors(self):
        anchors_path = os.path.expanduser(self.anchors_path)
        with open(anchors_path) as f:
            anchors = f.readline()
            anchors = [float(x) for x in anchors.split(',')]
            anchors = np.array(anchors).reshape(-1, 2)
        return anchors
 
    def generate(self):
        model_path = os.path.expanduser(self.model_path)
        assert model_path.endswith('.h5'), 'Keras model must be a .h5 file.'
 
        self.yolo_model = load_model(model_path)
 
        # Verify model, anchors, and classes are compatible
        num_classes = len(self.class_names)
        num_anchors = len(self.anchors)
        # TODO: Assumes dim ordering is channel last
        model_output_channels = self.yolo_model.layers[-1].output_shape[-1]
        assert model_output_channels == num_anchors * (num_classes + 5), \
            'Mismatch between model and given anchor and class sizes'
        print('{} model, anchors, and classes loaded.'.format(model_path))
 
        # Check if model is fully convolutional, assuming channel last order.
        self.model_image_size = self.yolo_model.layers[0].input_shape[1:3]
        self.is_fixed_size = self.model_image_size != (None, None)
 
        # Generate output tensor targets for filtered bounding boxes.
        # TODO: Wrap these backend operations with Keras layers.
        yolo_outputs = yolo_head(self.yolo_model.output, self.anchors, len(self.class_names))
        self.input_image_shape = K.placeholder(shape=(2, ))
        boxes, scores, classes = yolo_eval(yolo_outputs, self.input_image_shape, score_threshold=self.score, iou_threshold=self.iou)
        return boxes, scores, classes
 
    def detect_image(self, image):
        start = time.time()
        y, x, _ = image.shape
 
        if self.is_fixed_size:  # TODO: When resizing we can use minibatch input.
            resized_image = cv2.resize(image, tuple(reversed(self.model_image_size)), interpolation=cv2.INTER_CUBIC)
            image_data = np.array(resized_image, dtype='float32')
        else:
            image_data = np.array(image, dtype='float32')
 
        image_data /= 255.
        image_data = np.expand_dims(image_data, 0# Add batch dimension.
 
        out_boxes, out_scores, out_classes = self.sess.run(
            [self.boxes, self.scores, self.classes],
            feed_dict={
                self.yolo_model.input: image_data,
                self.input_image_shape: [image.shape[0], image.shape[1]],
                K.learning_phase(): 0
            })
        print('Found {} boxes for {}'.format(len(out_boxes), 'img'))
 
        for i, c in reversed(list(enumerate(out_classes))):
            predicted_class = self.class_names[c]
            box = out_boxes[i]
            score = out_scores[i]
 
            label = '{} {:.2f}'.format(predicted_class, score)
            top, left, bottom, right = box
            top = max(0, np.floor(top + 0.5).astype('int32'))
            left = max(0, np.floor(left + 0.5).astype('int32'))
            bottom = min(y, np.floor(bottom + 0.5).astype('int32'))
            right = min(x, np.floor(right + 0.5).astype('int32'))
            print(label, (left, top), (right, bottom))
 
            cv2.rectangle(image, (left, top), (right, bottom), (255, 0, 0), 2)
            cv2.putText(image, label, (left, int(top - 4)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1, cv2.LINE_AA)
        end = time.time()
        print(end - start)
        return image
 
    def close_session(self):
        self.sess.close()
 
 
def detect_vedio(video, yolo):
    camera = cv2.VideoCapture(video)
    cv2.namedWindow("detection", cv2.WINDOW_NORMAL)
    while True:
        res, frame = camera.read()
 
        if not res:
            break
 
        image = yolo.detect_image(frame)
        cv2.imshow("detection", image)
        if cv2.waitKey(110) & 0xff == 27:
                break
    yolo.close_session()
 
 
def detect_img(img, yolo):
    image = cv2.imread(img)
    r_image = yolo.detect_image(image)
    cv2.namedWindow("detection")
    while True:
        cv2.imshow("detection", r_image)
        if cv2.waitKey(110) & 0xff == 27:
                break
    yolo.close_session()
 
 
if __name__ == '__main__':
    yolo = YOLO()
    img = 'E:\Documents\Downloads\YAD2K-master\YAD2K-master\images\horses.jpg'
    video = 'E:\Documents\Documents\python\Traffic\data\person.avi'  
    detect_img(img, yolo)
    detect_vedio(video, yolo)



作者:洛荷
接:https://www.jianshu.com/p/3e77cefeb49b
�碓矗�简书
著作权归作者所有。业转载请联系作者得授,非商业转载请注明出

 

車輪型にトランスフォームするクモ型ロボット「BionicWheelBot」

シェア

 

物件監視にIoT、不正駐車など通知へ

 

 

https://img-s-msn-com.akamaized.net/tenant/amp/entityid/AAvgpIn.img?h=312&w=624&m=6&q=60&o=f&l=f

 

世の中にはクモが大嫌いな人が多いですが、もし回転して追っかけてくるクモが現れたらどうでしょう。もう恐怖で腰が抜けちゃいますよね。Festoが開発したクモ型ロボットBionicWheelBotは、まさにそんなホラー的存在になりつつあります。

でも今はまだメカメカしくてカッコ良さ勝る感じで、実用性もありそうなんです。ちょっとプロモーション動画をご覧いただきたいのですが……冒頭に走って前宙する本物のクモが登場するので、苦手な方はご注意ください。

Hannover Messe 2018」で発表されたというこちらの動画。実際にクルクル転がるクモいたなんてご存知でした? これはモロッコにいる「モロッカン・フリック・フラック・スパイダー(学名Cepennus rechenbergi)」で、「BionicWheelBot」はそのクモから着想しているんです。でもその動きは複雑なので、脚をタイヤのように丸く畳めるロボットにしたのです。自ら地を蹴って進めるのがイカしてますよね。

こちらは8本脚ですが、過去には『攻殻機動隊』に登場するタチコマのコスプレをして話題になった6本脚ロボHEXAもありました。多脚型ロボは過酷な状況下でも進んでいけるメリットがある反面、その歩みが遅いんですよね。しかしその課題はロボット全体が車輪にトランスフォームすることでも解決できることを証明しています(タチコマは脚の先っぽに車輪を搭載)。

操作はというと、タブレット端末で行なうようです。しかしこれ、ラジコンおもちゃにして遊んでみたいです。

 

スマホ密輸84億円 ドローンでワイヤ張り巻き取り

 中国広東省深センの税関当局などは29日までに、ドローン(小型無人機)を使って中国大陸と香港の境界を越えてワイヤを張り、大量のスマートフォンを密輸したとして、中国人ら26人を拘束したと発表した。密輸額は5億元(約84億円)にのぼる。新技術を使った忍者のような手口に、驚きの声が上がっている。

 中国メディアによると、容疑者らは2017年後半、深夜から早朝5時ごろにかけ、深セン市羅湖区の高層マンションの部屋からドローンを飛ばして、数十メートル離れた香港の小屋との間を2本のワイヤでつないだ。米アップルのスマホ「iPhone(アイフォーン)」など約10台を入れた袋を香港側でワイヤにくくりつけ、深セン側に設置した巻き取り機でワイヤごとたぐり寄せる方法で、スマホを回収していたなどの疑い。スマホは数十秒で深セン側に届き、一晩で最大1万5000台が運べたという。

 中国は世界有数のドローン開発・製造大国で、17年には290万台を生産。離島への宅配便など広く活用されている。密輸事件について、中国のインターネット上では「科学技術は生活も犯罪も変えるのか」などの書き込みが相次いだ。

スパコンで8億年かかる計算を1秒で解く富士通の「デジタルアニーラ」

 富士通株式会社は23日、「デジタルアニーラ」に関する技術説明会を開催した。デジタルアニーラは量子現象に着想を得てイジング模型を解くことに特化したデジタル回路で、組み合わせ最適化問題を高速に解くことができるハードウェア。あくまで従来型コンピュータの技術を使ったもので、量子コンピュータではない。だが、新しいアーキテクチャのコンピュータであり、規模・結合数・精度のバランスと安定動作で実社会の問題に適用できるものだとしている。

 解説したのは富士通株式会社 AI基盤事業本部 本部長代理(4月以降はAIサービス事業本部本部長)の東圭三氏と、株式会社富士通研究所コンピュータシステム研究所次世代コンピュータシステムプロジェクト主任研究員の竹本一矢氏。

富士通株式会社AI基盤事業本部本部長代理の東圭三氏
株式会社富士通研究所コンピュータシステム研究所次世代コンピュータシステムプロジェクト主任研究員の竹本一矢氏

 東氏は最初に「毎週のようにアニーリング技術、量子コンピュータ技術に関する発表が行なわれている」と紹介し、各社による量子ゲート方式やアニーリングマシンによる発表をざっと振り返った。富士通は2017年11月に量子コンピュータのアプリ開発で、Accenture、Allianzと共同で1Qbit(1QB Information Technologies Inc.)に出資している。

 脳型や量子コンピュータなど新しいコンピュータアーキテクチャが模索されている背景には、ムーアの法則と微細化の限界が想定されていることがある。デジタルアニーラはその1つで、既存のデジタル回路技術を使って量子コンピューティングマシンのような振る舞いを模擬することで、組み合わせ最適化問題など従来型アプローチでは難しい問題を解こうという試みだ。

最近のアニーリング/量子コンピュータ関連の動向
新アーキテクチャの模索

デジタル回路で量子過程の利点を活かす発想

 量子コンピューティングには「量子ゲート方式(量子回路方式)」と「イジングマシン方式」の2種類がある。量子ゲート方式はIBMやGoogleなどが研究開発中で、暗号解読などへの適用が期待されている。後者のうちアニーリング方式の量子コンピュータとしてはいち早く商用化したD-waveのサービスが有名だ。

 いっぽう、富士通のデジタルアニーラは「量子ではなく従来のデジタル回路でアニーリングマシンがやっていることを実現したもの」(東氏)。産業界への適用が進んでいるのはアニーリング方式だとし、量子ゲート方式のコンピュータが実産業、企業に適用されるには、まだまだ時間がかかるとの見方を示した。

 アニーリングとは「焼きなまし」のことだ。材料をゆっくり冷却する過程で、内部のひずみが取り除かれ、安定した状態に落ち着いていく過程のことだ。時間はかかるが最終的にはエネルギー的に安定な状態に落ち着く。アニーリングアプローチはその物理過程をコンピューティングに活用しようとしている。

 たとえば従来手法でパズルを解こうと思ったら総当たりでやっていたのに対し、アニーリングは、それとは違い、確率探索を行ない、コスト関数の評価値が最小あるいは最大にする方式で問題を解く。

各社の取り組み
アニーリングとは焼きなましのこと

 本物の量子コンピュータは量子ビットを用いて、1と0の重ね合わせを表現する。デジタルアニーラはデジタル回路なので、1と0の状態を重ね合わせで表現することはできない。そこで、乱数発生器を使って1と0の揺らぎのような状態を表現する。

 また最適解ではないがコスト関数がある程度低いところに落ち着きそうになっても、ある確率で高いところへの移動も許すような仕組みをアーキテクチャに組み込んでいる。こういった工夫によって、デジタル回路を用いながらも、量子過程ならではの並列化や高速化の仕組みを実現しているところが特徴だ。

 なおこれらはあくまで厳密な制御によって成り立っている。とにかくイジング模型のかたちに問題を定式化できれば、デジタルアニーラで高速に解くことができる。

 東氏は、四角い箱にピースを入れていくパズルにたとえて強みを解説した。通常のやり方では四角い箱にピースを逐次入れていき、ダメならまた全部やりなおす。いっぽうデジタルアニーラの場合は、パズルのピースを全部入れてしまい、揺らしながらだんだん落ち着かせ、納まるかたちを見つける。変なかたちに納まってしまったら、また大きく揺らしてやりなおす。本当の最適解は見つからないかもしれないが、近似解は見つかる。そういうやり方をとることで、とりあえず高速で答えを見つける場合に有用だと述べた。

 量子コンピューティングについてさまざまなリサーチをしていくなかで、顧客目線で見ると、顧客は必ずしも量子コンピューティング自体を求めているのではなく、あくまで組み合わせ最適化問題を高速に解くこと自体を求めていることが多いことがわかり、このような発想のアーキテクチャが生まれたという。

用途は創薬、投資ポートフォリオ、物流、パーソナライズ広告など

 組み合わせ最適化問題の代表例が、セールスマンが都市を訪問して巡回するときの最短ルートを見つける「巡回セールスマン問題」だ。5都市程度なら120通り程度なので簡単だが、20都市だと234京通り、30都市だと1京×1京通りと、総当たりだとスパコンでも8億年かかる。これがデジタルアニーラ、アニーリングアプローチだと最適に近いルートを1秒以内に見つけることができる。

 具体的には、まず問題を0と1の状態をとる格子点からなるイジングモデルで表現する。丸と丸のあいだは都市間の距離を与える。各行、各列に1は1つだけの状態をとるように計算させる。

巡回セールスマン問題

 ほかにも組み合わせ最適化問題には、分子構造を比較しなければならない創薬、投資先を組み合わせる投資ポートフォリオ、物流、パーソナライズ広告などのアプリケーションがある。何をどう組み合わせて配分すればいいかという課題に用いることができる。

さまざまな組合わせ最適化問題
分子の類似性検索への応用例。実際にはもっと巨大な分子で行なう

 創薬においては、従来手法では高速化のために分子の部分的特徴を抽出して比較検索していたが、分子全体をまるごと検索できるという。たとえば新薬候補のスクリーニングなどに用いることができる。

分子類似性×デジタルアニーラ

 金融については、Quantum-inspired hierarchical risk parity(QHRP)という方式があり、シャープレシオが60%向上したという。投資先の相関関係をグループ化して、ツリーを作成。安定して収益が上げられる組み合わせを選び出すことができる。1,000社程度の組み合わせを一気に選びだすことができるとのことだ。

投資ポートフォリオ×デジタルアニーラ

 倉庫物流に関しては、富士通の関連会社で、サーバーなど富士通の主力製品を製造している株式会社富士通ITプロダクツの倉庫で実際に使われている例を示した。ピックアップ手順の最短ルートを見出し、最大30%歩行距離を縮め、また3,000種類の部品間の相関関係を見出し、レイアウトを最適化すると、月あたりの移動距離を45%短縮することができた。

 人員配置(シフト)の最適化にも用いることができる。モデルケースで試算すると、作業員5名分の工数を確保することができた。たとえば「AさんとBさんは一緒にならないように」といった人間関係を配慮した例外的な処理を入れたりするようなケースでも、デジタルアニーラは力を発揮するという。

倉庫部品のピックアップ手順最適化
部品配置、棚レイアウトの最適化も可能
富士通ITプロダクツで実際に使われているとのこと
人員シフトの最適化例

富士通デジタルアニーラの優位性

 東氏は「富士通デジタルアニーラは1,024bit規模でビット間全結合。ビット間結合精度は65,536階調。デジタル回路なので常温で動作可能、2018年度には規模、精度ともに拡張予定で、デジタル回路なので拡張は比較的容易だ」と実社会で適用するうえでの優位性をアピールした。制約が少ないためアプリケーションが組んだ問題をそのまま適用することもでき、他社の量子コンピューティング技術に比べても現実的な問題を解くには強みがあるという見方を示した。

 たとえば巡回セールスマン問題、ナップザック問題、数独など、それぞれ2次元、1次元、3次元にマッピングして解いていく問題であっても、ビット数が何ビットあるか、お互いにビットがつながっているか、結合精度などが、実問題に適用する上では重要であり、「大きな実際の問題も解きやすい」という。

現実社会の問題に適用できるのはデジタルアニーラだけだという
アニーリングマシンの比較
実問題に適用できるビット数、全結合、結合精度をアピール

正式提供は2018年度春から

 デジタルアニーラは正式提供開始は2018年度の春を予定。1QBitによるミドルウェアと組み合わせたかたちで、クラウドサービスとして提供される。演算させるために諸問題をイジングモデルに定式化する部分が1QBitのミドルウェアの役割。利用金額は公開されなかったが、金額にも十分見合うものだという。現時点で一番引き合いが多いのは新素材と創薬。ついで金融系とのこと。

 また経済産業省の「未踏プロジェクト」の、2018年度からはじまる次世代計算機をテーマにした「未踏ターゲット」では、アニーリングマシンを活用する人材を育成しようとしている。富士通はそこに参画し、開発環境としてデジタルアニーラを提供する。カナダのトロント大学にも新しい研究拠点を開設し、スマート交通、ネットワーク、医療、金融と4つの共同研究を進める。

 富士通はデジタルアニーラ、スパコン京などのHPC、ディープラーニング向けの専用プロセッサ「DLU」の3つで顧客の事業拡大に貢献していきたいと述べた。この3つはハードウェア的には川崎工場の一角で固まって開発されており、知見、人材、ノウハウなどが互いにシェアされて、一緒になってハードウェアを開発しているという。ただ、ソフトウェア的にはまだまだ融合していないが、東氏は「今後、融合、相互利用が期待できる。われわれもそこに注力していきたい」と語った。

1QBit社のミドルウェアと組み合わせて提供される。下の写真のラック内に収まっているのがデジタルアニーラの回路をおさめたサーバー
経産省/IPAの未踏事業にも提供
トロントにも研究拠点を新設。研究を進める
デジタルアニーラ、HPC、ディープラーニングの3つの技術を提供

 今後のビジネスについては、顧客の問題のなかに「イジング模型に適用可能な領域が見つかりはじめている」と述べた。ただし「顧客の課題から組み合わせ最適化問題を抽出するところが一番難しい」が、「それをうまく引き出せれば、あとは数式かできるエンジニアがいる。チューニングして、デジタルアニーラに投げるためのノウハウは蓄積しはじめているので、そこはカバーできる」と自信を見せた。