YOLOV5およびPYQT5に基づくスマート建設現場検出システム

1. 背景

        スマート建設現場検査システムは、コンピュータービジョンと人工知能技術を使用してインテリジェントな監視と管理を行うシステムです。このシステムは、YOLOv5 ターゲット検出アルゴリズムと PYQT5 グラフィカル ユーザー インターフェイス ライブラリに基づいて、建設現場の人物、物体、その他のターゲットのリアルタイム監視と識別を実現し、対応する警報機能と管理機能を提供します。

        従来の建設現場管理では、建設現場の安全と秩序を確保するための検査や監視に多くの人手が必要となることがよくありました。しかし、この方法では監視範囲が狭い、監視効率が低い、見逃しやすいなどの問題があります。建設現場監視のインテリジェンスレベルと効率を向上させるために、コンピュータービジョンと人工知能に基づくスマート建設現場検査システムが登場しました。

        YOLOv5 は、画像内の複数のターゲットを効率的に検出し、その位置とカテゴリの情報を提供できる、深層学習ベースのターゲット検出アルゴリズムです。従来のターゲット検出アルゴリズムと比較して、YOLOv5 は高い精度とリアルタイム パフォーマンスを備えています。

        PYQT5 は、直感的で使いやすいユーザー インターフェイスの開発に使用できる豊富なグラフィカル インターフェイス コンポーネントと機能を提供する Python GUI プログラミング ツールキットです。スマート建設現場検出システムでは、PYQT5 を使用してシステムのユーザー インターフェイスを簡単に構築できるため、ユーザーは監視結果を直感的に確認し、システムの構成と管理を行うことができます。

        YOLOV5+PYQT5 に基づくスマート建設現場検出システムは、カメラを使用して建設現場のリアルタイムビデオストリームをキャプチャし、ターゲット検出アルゴリズムを通じてビデオを分析および処理します。このシステムは、作業者が安全ヘルメット、防護服を着用しているかどうか、および安全規制に準拠したその他の行動を行っているかどうかを識別および検出できます。違反が検出されると、システムは適切なタイミングでアラームを発し、潜在的なセキュリティ インシデントを回避するための措置を講じるよう関連担当者に思い出させます。

 2. 課題と動機 

        YOLOv5 および PyQt5 に基づくスマート建設現場検出システムは、建設現場の安全管理と事故防止のためのリアルタイムのターゲット検出および監視機能を提供できます。ただし、このシステムにはいくつかの課題と動機にも直面しています。

(1) 課題:

1. データセットの取得: 効率的なスマート建設現場検出システムを構築するには、ターゲット検出モデルをトレーニングするために大量のラベル付き画像データが必要です。しかし、建設現場は多様性と複雑さがあるため、大規模な建設現場の画像データを取得してラベルを付けるのは困難な作業となる場合があります。

2. 複雑なシーン: 建設現場、鉱山、その他の自然環境は複雑で変化しやすく、多くの人がいるため、オクルージョン、照明の変化、背景の干渉などの問題が発生する可能性があり、精度と安定性が課題となります。ターゲット検出アルゴリズムの説明。

3. リアルタイム要件: スマート建設現場検出システムは、建設現場の安全上の問題をリアルタイムで監視し、時間内に対応する必要があります。したがって、アルゴリズムとシステムは、精度を確保しながら効率的なリアルタイム処理能力を備えている必要があります。

4. ハードウェアとリソースの制限: リアルタイムのターゲット検出と監視を実現するには、システムに十分なコンピューティング リソースと適切なハードウェア デバイスが必要です。大規模な現場環境にシステムを導入する場合、コストと技術的な制約に直面します。

5. システム統合: YOLOv5 と PyQt5 を完全なスマート建設現場検査システムに統合するには、綿密な開発とデバッグ作業が必要になる場合があります。これには、オブジェクト検出アルゴリズムとインターフェイス設計およびユーザー インタラクションを組み合わせて、システムの安定性と機能の完全性を確保することが含まれます。

(2) モチベーション

1. 建設現場の安全管理: スマート建設現場検出システムは、安全ヘルメットの未着用、危険エリアへの侵入など、建設現場の潜在的な安全上の危険を監視し、適時に警報を発したり、対応する予防策を講じたりするのに役立ちます。事故の可能性を低減するための対策を講じ、建設現場の安全性と管理レベルを向上させます。

2. 作業効率の向上:従来の建設現場検査には多くの人的資源と時間が必要でしたが、スマート建設現場検査システムは対象物を自動的に検出して監視できるため、手動検査の作業負荷が軽減されます。建設現場の状況や安全状況をリアルタイムにフィードバックすることで、管理者がタイムリーに問題点を発見し、対応策を講じることができ、作業効率と管理効果が向上します。

3. データ分析と統計: スマート建設現場検出システムは、人員密度、作業活動、安全違反などの建設現場のデータを収集および分析し、現場管理者に現場を最適化するための貴重な情報と統計レポートを提供します。管理と意思決定。

4. 遠隔監視と管理:スマート建設現場検出システムは遠隔監視と管理機能を実現し、建設現場管理者がインターネットを通じて遠隔からシステムにアクセスして制御できるようにします。これにより、いつでもどこでも建設現場の状況を監視し、建設現場の状況を常に把握し、必要な管理とスケジュールを実行できるため、建設現場のリアルタイムの監視と管理能力が向上します。

        要約すると、YOLOv5 と PyQt5 に基づくスマート建設現場検査システムは、リアルタイム性、精度、効率性の要件を備えており、現場の安全管理と作業効率を向上させ、データ分析と統計のサポートを提供することを目的としています。ただし、これらの目標には、データセットの取得、複雑なシナリオ、リアルタイム要件などの課題も克服する必要があります。

3. インターフェースと機能

(1) pyqt5 ビルドインターフェース

 (2) 機能紹介

1. システムを実行して北京時間をリアルタイムで表示します。

2. ユーザーは、ヘルメット検出、火災検出、反射ベスト検出の 3 つのモデルを選択できます。

3. ユーザーは信頼レベルと IOU を調整できます。Confidence: 予測結果の信頼性を示します; iou: ターゲット検出、セマンティック セグメンテーション、インスタンス セグメンテーションなどのタスクにおいて、予測結果と実際のアノテーションの間の重複の程度を測定するために使用されます。

4. プロンプト領域: アラーム時間、アラームの種類、人数、その他の情報を表示するために使用されます。

5. ユーザーは、画像検出、ビデオ検出、カメラ検出の 3 つの方法を選択できます。インターフェースの左側に元の写真またはビデオが表示され、右側に検出結果が表示されます。

6. 検出が完了したら、右上隅の「ダウンロード」ボタンをクリックして検出画像を保存するか、下の「アラームデータダウンロード」ボタンをクリックしてデータ情報を保存できます。

4、メインコード 

(1) スイッチ検出モデル

def selectionChanged(self, index):
    select_weight = self.comboBox.itemText(index)
    print('selected weight:', select_weight)
    if select_weight == '安全帽检测':
            self.model = torch.hub.load("./", "custom", path="runs/train/exp3/weights/helmet_head_person_s.pt",
                                        source="local")  # 加载安全帽检测模型
            self.weight = "det_helmet"
    if select_weight == '反光背心检测':
            self.model = torch.hub.load("./", "custom", path="runs/train/reflect_clothes.pt",
                                        source="local")  # 加载反光背心检测模型
            self.weight = "det_reflect_clothes"
    if select_weight == '火灾检测':
            self.model = torch.hub.load("./", "custom", path="runs/train/det_fire.pt",
                                        source="local")  # 加载火情检测模型
            self.weight = "det_fire"

 (2) 画像検出

def image_pred(self, file_path):
    results = self.model(file_path)  # 加载模型检测
    # print("model信息:", self.model)
    image = results.render()[0]
    # 调用检测结果
    self.judge(results)
    return convert2QImage(image)  # 转换图片格式

def open_image(self):
    print("点击了检测图片")
    self.textBrowser.clear()  # 清除textBrowser文本框的文字
    self.timer.stop()  # 停止计时
    file_path = QFileDialog.getOpenFileName(self, directory="./data/images", filter="*.jpg;*.png;*.jpeg")  # 选择图片
    if file_path[0]:
         file_path = file_path[0]
         self.input.setPixmap(QPixmap(file_path))  # 显示原始图片
         qimage = self.image_pred(file_path)  # 调用图片检测
         self.input.setPixmap(QPixmap(file_path))
         self.output.setPixmap(QPixmap.fromImage(qimage))  # 显示检测结果图片
         self.result_image_path = file_path

(3) 映像検出

def video_pred(self):
    ret, frame = self.video.read()
    if not ret:  # 未读取视频,停止计时(使用计时器,在pyqt5中实时更新视频图片)
         self.timer.stop()
    else:
         frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)  # 转换每一帧图像的格式
         self.input.setPixmap(QPixmap.fromImage(convert2QImage(frame)))  # 播放原始视频

         self.results = self.model(frame)  # 加载检测模型
         image = self.results.render()[0]
         # qimage = self.video_pred(frame)
    self.output.setPixmap(QPixmap.fromImage(convert2QImage(image)))  # 播放检测后视频
    return self.judge(self.results)  # 判断检测结果

def open_video(self):
    print("点击了视频检测")
    file_path = QFileDialog.getOpenFileName(self, directory="./data", filter="*.mp4")  # 选择视频
    if file_path[0]:
       file_path = file_path[0]
       self.video = cv2.VideoCapture(file_path)  # 加载视频
       self.timer.start()  # 计时器开始计时

 (4) カメラ検出

def open_camera(self):
    print("点击了摄像头检测")
    self.video = cv2.VideoCapture(0)  # 调用笔记本摄像头(在实际项目里,通过调用不同区域的联网摄像头来实时检测工地)
    self.timer.start()

(5) アラームの種類を決定する

def judge(self, result):
    alarm = None
    person_count = 0
    helmet_count = 0
    preds = result.pandas().xyxy[0]
    # 获取当前时间
    self.current_time = datetime.now()
    formatted_datetime = self.current_time.strftime("%Y-%m-%d %H:%M:%S")
    # print(formatted_datetime)
    labels = preds.values
    # 安全帽检测报警
    if self.weight == 'det_helmet':
        for label in labels:
            # print("lab:", label)
            if label[6] == 'person':
                person_count += 1
            if label[6] == 'helmet':
                helmet_count += 1
        print("person:", person_count)
        print("helmet:", helmet_count)
        self.textBrowser.append(f"人数为:{person_count}")
        self.textBrowser.append(f"头盔个数为:{helmet_count}")
        if helmet_count < person_count:
            print("没佩戴头盔!")
            alarm = "没佩戴头盔!"

     # 反光背心检测报警 label为1
     if self.weight == 'det_reflect_clothes':
         for label in labels:
             if label[6] != 'reflective_clothes':
                 print("检测到没穿戴反光背心!")
                 alarm = "没穿戴反光背心!"

     # 明火检测报警
     if self.weight == 'det_fire':
         for label in labels:
             if label[6] == 'fire':
                 print("检测到火焰!")
                 alarm = "检测到火焰!"

     # 提示板显示
     self.textBrowser.append(formatted_datetime)
     self.textBrowser.append(f"警告:{alarm}")
     # 记录报警
     if alarm is not None:
         return self.record(alarm)

(追記:実は反射ベスト検出では人数を検出する機能も追加できますが、反射ベスト検出モデルは作者が訓練していないため人物をマークしません。)

(6) アラームの時刻と種類を記録する

def record(self, type):  # 记录报警时间和类型
    with open('Attendance.csv', 'r+') as f:
    myDatalist = f.readlines()  # 读取文件中所有的行
    List = []
    for line in myDatalist:
         entry = line.split(',')
         List.append(entry[0])
         current_time = datetime.now()  # 获取当前时间
         dtString = current_time.strftime("%Y-%m-%d %H:%M:%S")  # 将日期时间格式化成字符串
         f.writelines(f'{type},{dtString}')  # 写入报警类型和时间
         f.write('\n')
         alarm_thread = threading.Thread(target=self.sound_alarm) #警报声响
         alarm_thread.start()

(7) データのダウンロード

def Download_data(self):
    source_file_path = "Attendance.csv"  # 记录表
    save_path, _ = QFileDialog.getSaveFileName(self, "Save File", "", "CSV Files (*.csv)")
    if save_path:
        try:
            shutil.copyfile(source_file_path, save_path)
            print("File downloaded successfully!")
            self.textBrowser.append("报警数据下载成功!")
        except Exception as e:
                print("Error while downloading file:", str(e))
    else:
        print("No save path selected.")

(8) シグナルとスロット機能のバインディング

def bind_slots(self):  # 信号、槽函数绑定
    self.det_image.clicked.connect(self.open_image) #图片检测
    self.det_video.clicked.connect(self.open_video) #视频检测
    self.det_camera.clicked.connect(self.open_camera) #摄像头检测
    self.comboBox.currentIndexChanged.connect(self.selectionChanged) #模型选择
    self.dL_data.clicked.connect(self.Download_data) #下载数据
    self.download.clicked.connect(self.Download_image) #保存图片
    self.slider.valueChanged.connect(self.Conf_change) #调节置信度
    self.Iou_Slider.valueChanged.connect(self.Conf_change) #调节iou
    self.timer.timeout.connect(self.video_pred) #视频处理

5. 実験結果

 (1) 機種の選定

次に、画像検出、カメラ検出、ビデオ検出の 3 つの方法を使用して、上記 3 つのシーン モデルの認識および検出効果を検出します。

 (2) 画像検出

1. ヘルメットの検出 

2. 反射ベストの検出

3. 火炎検知 

 (3) カメラ検出

ここでは、テスト タスクを完了するためにノートブックのカメラが呼び出されます。

1. ヘルメットの検出

(追記:ここで人数が検出されない理由は、この画像は24日にテストされたもので、その時点では人数の機能が追加されていないためです。作者はモザイクを更新するのが面倒です) 

 2. 反射ベストの検出

(4) 映像検出

時間を節約するために、ここでは炎検出の実験ビデオのみを掲載します。

火炎検知

ビデオを通じて、システムは効果的に炎を検出し、警報機能を実現できますが、明らかな遅延とフリーズがあることがわかりました。これは、コンピューターのグラフィックス カード (使用した Xiaomi ノートブックの CPU、 6 時間で 120 枚の画像をトレーニングした記録)、I/O 遅延や同時処理などの問題の影響。資格のある友人は、高性能グラフィックス カードを使用したり、yolo アルゴリズム モデルを最適化して遅延を軽減したりできます。

(5) アラームデータのダウンロード

 アラームデータは以下のとおりです。

 6. まとめ

        YOLOV5 と PyQt5 に基づくインテリジェントな建設現場検出システムは、ターゲット検出アルゴリズムとインターフェイス設計を組み合わせて、建設現場環境のインテリジェントな監視と検出を実現することを目指しています。このシステムは一般的に、さまざまなシーンモデルの下で認識および検出機能を実現していますが、まだ多くの欠陥があります。たとえば、警報データ記録の処理が単純すぎるため、検出される人数や検出場所などが増加する可能性があります。また、ヘルメットを検出する場合、ヘルメットはサイズが小さく、簡単に壊れやすいため、システムは誤警報を起こしやすくなります。また、ビデオ検出中に、コンピュータ機器のグラフィックス カードの性能が不十分なため、検出処理速度が遅くなり、ビデオ フレームのフリーズや遅延が発生します。また、テストにはいくつかの欠点があり、実際の環境の複雑さが考慮されておらず、写真やビデオを検出する際には、認識率とシステム処理率を向上させるために画像の前処理を実行する必要があります。この実験は、コンピューター ビジョン コースの課題から生まれたものであり、5 月に書いた記事「人物認識とヘルメット検出」の小規模な実践的な実装プロセスでもあり、私が学んだことを応用したものとみなすことができます。

おすすめ

転載: blog.csdn.net/weixin_44686138/article/details/131253672