Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

contact_detectionのdebug windowで表示するものについて #74

Closed
3 tasks done
koukemo opened this issue Feb 28, 2023 · 3 comments · Fixed by #75 or #77
Closed
3 tasks done

contact_detectionのdebug windowで表示するものについて #74

koukemo opened this issue Feb 28, 2023 · 3 comments · Fixed by #75 or #77
Assignees
Labels
enhancement New feature or request

Comments

@koukemo
Copy link
Member

koukemo commented Feb 28, 2023

contact_detectionノードのdebug windowについて

コードの該当箇所


node_contact_detection.py 122-

ソースコード
if self.is_debug_mode:
            height, width = color_img.shape[:2]

            if not hasattr(self, 'action_list'):
                self.action_list = []
                black_img = np.zeros_like(color_img)
                for i in range(4):
                    self.action_list.append(cv2.resize(black_img.copy(), (width // 2, height // 2)))

            # すべての人物領域を書く
            for person in people.pose_key_points_list:
                bounding_box = person.bounding_box
                left = np.clip(int(bounding_box.x), 0, width - 1)
                top = np.clip(int(bounding_box.y), 0, height - 1)
                right = np.clip(int(bounding_box.x + bounding_box.width), 0, width - 1)
                bottom = np.clip(int(bounding_box.y + bounding_box.height), 0, height - 1)

                # 対象の手首の位置
                pixel_point = person.point_data[self.LEFT_HAND_INDEX].pixel_point
                x = np.clip(int(pixel_point.x), 0, width - 1)
                y = np.clip(int(pixel_point.y), 0, height - 1)
                cv2.circle(color_img, (x, y), 5, (255, 0, 0), thickness=-1)
                pixel_point = person.point_data[self.RIGHT_HAND_INDEX].pixel_point
                x = np.clip(int(pixel_point.x), 0, width - 1)
                y = np.clip(int(pixel_point.y), 0, height - 1)
                cv2.circle(color_img, (x, y), 5, (255, 0, 0), thickness=-1)

                cv2.rectangle(color_img, (left, top), (right, bottom), (255, 0, 0), thickness=3)
                text_w, text_h = cv2.getTextSize(f'ID : {re.sub(".*_", "", person.people_id)}',
                                                 cv2.FONT_HERSHEY_PLAIN, 1.5, 2)[0]
                cv2.rectangle(color_img, (left, top), (left + text_w, top - text_h), (255, 0, 0), -1)
                cv2.putText(color_img, f'ID : {re.sub(".*_", "", person.people_id)}', (left, top),
                            cv2.FONT_HERSHEY_PLAIN, 1.5, (255, 255, 255), thickness=2)

            # すべての物体領域を書く
            for tracked_object in object_list.tracked_object_list:
                bounding_box = tracked_object.bounding_box
                left = np.clip(int(bounding_box.x), 0, width - 1)
                top = np.clip(int(bounding_box.y), 0, height - 1)
                right = np.clip(int(bounding_box.x + bounding_box.width), 0, width - 1)
                bottom = np.clip(int(bounding_box.y + bounding_box.height), 0, height - 1)

                cv2.rectangle(color_img, (left, top), (right, bottom), (0, 128, 255), thickness=3)
                cv2.putText(color_img, f'ID : {re.sub(".*_", "", tracked_object.object_id)}', (left, top),
                            cv2.FONT_HERSHEY_PLAIN, 1.5, (0, 128, 255), thickness=2)

            for hand, object_item in result_list:
                person, _, index = hand
                tracked_object, _ = object_item

                action = ContactActionEnum.from_tracked_object_action_enum(
                    TrackedObjectActionEnum.value_of(tracked_object.action)
                )

                is_not_touch = action != ContactActionEnum.TOUCH

                color = self.get_color_from_action(action)

                # 対象の手首の位置
                pixel_point = person.point_data[index].pixel_point
                x = np.clip(int(pixel_point.x), 0, width - 1)
                y = np.clip(int(pixel_point.y), 0, height - 1)
                cv2.putText(color_img, f'Action : {action.value}', (x - 40, y - 10), cv2.FONT_HERSHEY_PLAIN, 1.5, color,
                            thickness=2)

            if len(result_list) > 0:
                cv2.putText(color_img, 'Detected', (0, 10), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 255))

            color_img = self.print_fps(color_img)
            # cv2.imshow('color', color_img)

            if is_not_touch:
                # cv2.imshow(f'{people.header.stamp.sec}.{people.header.stamp.nanosec}', color_img)
                self.action_list[self.action_index] = cv2.resize(color_img.copy(), (width // 2, height // 2))
                self.action_index = (self.action_index + 1) % 4
            tile_img = cv2.hconcat([color_img,
                                    cv2.vconcat([cv2.hconcat([self.action_list[0], self.action_list[1]]),
                                                 cv2.hconcat([self.action_list[2], self.action_list[3]])])])
            cv2.namedWindow('contact_detection', cv2.WINDOW_NORMAL)
            cv2.imshow('contact_detection', tile_img)

            cv2.waitKey(1)
        else:
            print(f'[{datetime.datetime.now()}] fps : {self.fps}', end='\r')

現在の表示内容


左側ウインドウ : 単一フレームごとの検知結果をcolor_imgに重ねて表示(動画)

  • 人物(people_trackingノードに基づく) :

    • 手首への表示
      • 左手首の表示
      • 右手首の表示
    • 人物全体を囲うBounding Box
    • people_idのテキスト表示
  • 物体(object_trackingノードに基づく) :

    • 物体を囲むBounding Box
    • object_idのテキスト表示
  • イベント :

    • action(bring-in, take-out, touch)のテキスト表示
    • bring-in, take-out時の「Detected」のテキスト表示
  • 共通 :

    • frameカウントの表示
    • FPSの表示

右側ウインドウ : 検知結果の静止画(左ウインドウでイベントが発生した際のコピー, 最大4枚まで表示)

考えうる課題


  1. 物体に関してobject_trackingノードから受け取った情報をすべて表示していることから, contact_detectionノードにおいてbring_in, take_outが出力されない場合がある #48 → 原因1によって本ノードにてbring-in, take-outを検出していないにも関わらず, bounding boxは表示されるため紛らわしい(object_trackingで保存されるBounding Box情報は単一フレームだけではなく, 取りこぼしがないため?)

  2. 右側ウインドウでは, 左側ウインドウでBounding Boxやテキスト表示をしたものをそのままコピーしているため, その時に持ち込まれた物体が既にある物体と同じような表示になってしまい, あまり目立たない

  3. 右側ウインドウについて, どの画像が最新の情報かわかりにくい

  4. 誤検知に際しての意図しない表示
    4-1. 間違ったbring-inが発生し, 物体が表示しない位置にBounding Boxが表示される, また滞在し続ける
    4-2. ある物体と別の物体のBounding Boxが近い場合(カメラ視点で物体Aの奥に物体Bが存在する等), 持ち去った物体では無い方の物体のBounding Boxが消えてしまう

解決案


4に関しては, 検知処理ロジックを修正すべき

また, 1に関して左側ウインドウは*_trackingノードからの情報を用いることで,
継続して人物や特に問題となる物体のBounding Boxを提示することができているが,
本ノードでは物体の滞在情報を有していないため, 新たに物体情報を保持する部分を作らない限り, 同等の機能を実現できない。現状できるのは以下のとおり。
→ (従来手法) 物体・人物のBounding Boxを囲い続けることができるが, 特に物体に関して本ノードでBring-Inは検知していないがBounding Boxが出現する。
→ (変更可能) contact_detectionで作成した部分のみを用いることで, 検出結果を描画できるもののこれは瞬間的なものであり, 平常時はpeople_tracking同様に人物を囲うBounding Boxしか表示できない。

今回は, 従来手法に乗っ取り, 右側ウインドウの静止画部分で本ノードにてBring-In, Take-outを検知できたものを提示するようにする。

2, 3に関しては対応可能

以下対応内容のリスト


  • 右側ウインドウでは, 本ノードでbring-in, take-outを検出した場合のみ静止画の提示を行う
  • 右側ウインドウにおいて, bring-in, take-outの対象となる物体のみにBounding Boxを提示する。
  • 右側ウインドウの最新イベントについて外側を枠線で囲む
@koukemo koukemo added the enhancement New feature or request label Feb 28, 2023
@koukemo koukemo self-assigned this Feb 28, 2023
@koukemo
Copy link
Member Author

koukemo commented Feb 28, 2023

表示変更前
before_sharp75_2023-02-28

表示変更後

  • 右側4枚の内, 最新のものに枠線(ピンク)
  • 右側では, bring-in, take-outの対象となる物体のみを囲う(オレンジ)
  • 画像にはないが, contact_detectionでbring-in, take-outとならなかったものは除外
    after_sharp75_2023-02-28

@koukemo
Copy link
Member Author

koukemo commented Mar 1, 2023

追加課題

  • 右側ウインドウにてBring-in, Take-outの文字が見にくいため, 背景色を付け拡大する
  • 右側ウインドウにて検知物体が小さく分かりにくいため, 拡大表示をする

@koukemo koukemo reopened this Mar 1, 2023
@koukemo
Copy link
Member Author

koukemo commented Mar 1, 2023

追加課題の変更後

  • 右側ウインドウ > actionの強調
  • 右側ウインドウ > 検知物体の左上への表示

contact_debug_window_2023-03-01

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment