Fast-Reid シリーズ記事ディレクトリ
序文
以前のfast-reid トレーニングでは、 Fast-Reid フレームワークを使用して、独自のアプリケーション シナリオでモデルをトレーニングしました。トレーニング戦略は、多数のオープンソース reid データ セットを統合し、独自のデータと合わせて合計 30W 以上のデータをトレーニングすることでした。
コードはオープンソースです:
Yolov5-Deepsort-Fastreid
yolov5-deepsort-pedestrian-counting
1.yolov5 + ディープソート
yolov5 を使用して歩行者検出とディープソートによる追跡を実現することで、オクルージョンの場合のリード モデルの誤認をより適切に防ぐことができます。
検出アルゴリズムや追跡アルゴリズムの置き換えを容易にするために、yolov5 とディープソートをそれぞれクラスにカプセル化しました。これらは自分のプロジェクトに簡単に埋め込むことができます。
deepsorの表現抽出モデルをfastreidで学習させたreidモデルに置き換えました。追跡パフォーマンスを向上させることができます。
詳細は以下のperson_search_reid.pyのコード(例)をご覧ください。
class yolo_reid():
def __init__(self, cfg, args, path):
self.args = args
self.video_path = path
use_cuda = args.use_cuda and torch.cuda.is_available()
if not use_cuda:
warnings.warn("Running in cpu mode which maybe very slow!", UserWarning)
# Person_detect行人检测类
self.person_detect = Person_detect(self.args, self.video_path)
# deepsort 类
self.deepsort = build_tracker(cfg, args.sort, use_cuda=use_cuda)
imgsz = check_img_size(args.img_size, s=32) # self.model.stride.max()) # check img_size
self.dataset = LoadImages(self.video_path, img_size=imgsz)
self.query_feat = np.load(args.query)
self.names = np.load(args.names)
def deep_sort(self):
idx_frame = 0
results = []
for video_path, img, ori_img, vid_cap in self.dataset:
idx_frame += 1
t1 = time_synchronized()
# yolo detection
bbox_xywh, cls_conf, cls_ids, xy = self.person_detect.detect(video_path, img, ori_img, vid_cap)
# do tracking # features:reid模型输出512dim特征
outputs, features = self.deepsort.update(bbox_xywh, cls_conf, ori_img)
print(len(outputs), len(bbox_xywh), features.shape)
2. 歩行者カウント
ちなみに、yolov5 + deepsortは歩行者カウント機能を実現しており、以下のようにカメラに映っている人の総数をカウントし、カスタムの黄色の線を横切る歩行者をカウントします。
詳細はperson_count.pyコードを参照してください。
2.リード抽出機能
歩行者の再識別は顔認識と同様であり、ファーストコンタクトは顔を歩行者に置き換えて認識すると考えることができる。
1. 識別する必要がある歩行者の最下位バンクをインターセプトします
2. 特徴の比較を容易にし、対応する名前を識別できるように、person_bank.py を実行して歩行者の特徴と名前を保存します。
# features:reid模型输出512dim特征
person_cossim = cosine_similarity(features, self.query_feat)
max_idx = np.argmax(person_cossim, axis=1)
maximum = np.max(person_cossim, axis=1)
max_idx[maximum < 0.6] = -1
score = maximum
reid_results = max_idx
draw_person(ori_img, xy, reid_results, self.names) # draw_person name
次の図は、下部ライブラリの歩行者 a1111 と b22222 を識別します。未認識はなしです
要約する
シーンが複雑でなく、オクルージョンがない場合でも、認識精度は可能です。グラフィックス カードを使用してリアルタイムで実行することもできます。次のステップは、ビジネス ロジックの観点から追跡と再識別の組み合わせを最適化し、計算量を削減し、認識パフォーマンスを向上させることです。興味のある学生が良い方法を持っている場合は、私とコミュニケーションをとることを歓迎します、ありがとう!