この記事には次の内容が含まれています。
1. データのクリーニングと並べ替え (特定の解像度データが要件を満たしていないため、削除を選択し、OpenCV でのサイズ変更方法を選択します)
2. データセット形式変換スクリプトコードを記述する
3. 考えられる問題
目次
序文:
タスクの背景
現在, 超高速レーン検出アルゴリズムがトレーニングに使用されています. このアルゴリズム自体は、トレーニングに culane データ セットと tusimple データ セットを使用します. コード データローダーの configs 部分は、これら 2 つのデータ セットの読み取り方法を提供しますが、したがって、アルゴリズムをデータ セット形式変換タスクから分離することが決定されました。つまり、アルゴリズムはデータ セットを tusimple 形式で読み取り、他のすべてのデータ セットを Tusimple 形式に変換します。カーブレーン データ セットは、次のいずれかになります。少数の曲線データ セットでは、曲線データがデータ全体の 60% 以上を占めるため、モデルは曲線をより適切に認識し、複数のシナリオでの認識能力を向上させることができます。
Ultra-Fast-Lane-Detection (超高速車線認識アルゴリズム) GitHub リンク
基本的な環境
- 無料18.04
- IDE:vscode
- サーバ:
提示:以下是本篇文章正文内容,下面案例可供参考
1. タスク
Windows ファイル エクスプローラーを使用して、トレインのデータ量とカーブレーン データ セットの有効な部分をカウントします。異なる解像度の画像の数と割合は次のとおりです。必要な入力画像は 1280×720 であるため、1570 倍の画像は次のとおりです
。 660を削除する必要があります
2. プロセス分析
1 つのアイデア
まず、カーブレーン データ セット内の画像とラベルを tusimple 形式に変換し、次にサイズを変更します。プロセス中に、変換前に解像度要件を満たさない画像を直接削除することを選択できます。
2 必要性
1. 1570*660 のデータを直接リサイズすると画像サイズの歪みが発生し、対応するラベル ファイル内の json がドット形式になるため、ラベル ファイルの処理が困難になります
。データクリーニングの重要性は明らかに自明です
数据清洗:数据清洗是指发现并纠正数据文件中可识别的错误的最后一道程序,包括检查数据一致性,处理无效值和缺失值等。
3 実装
3.1 少量のデータを使って実験する
まず、カーブレーン データ セットで、20 枚の 2560 × 1440 画像、2 枚の 1560 × 660 画像、1 枚の 1280 × 720 画像とそれらに対応するラベルを選択し、それらを 2 つの異なるフォルダーに配置します (カーブレーン データ セットもこの方法で処理されます)。
3.2 2 つの主要なポイント
- 画像のサイズを変更するときは、そのラベル ファイルも一緒にサイズ変更する必要があります。そうしないと、画像のサイズを変更するだけでは役に立たず、モデルが渡された場合にトレーニングできません。サイズ変更にさまざまなソフトウェアを使用することはお勧めできません。どのサイズ変更メソッドを使用しているかがわかりません。このソフトウェアは PNG 画像形式のラベルを認識できない可能性があり、「ファイルが存在しません」というメッセージが表示されます。
- 解像度1570*660の画像を削除します データ自体の解像度分布が非常に綺麗なので、トラバーサル法で画像かどうかを判断します 幅1570または高さ660であれば削除し
width
ますheight
直接。
3.3 スキーム
ファイナライズ: 形式に変換するときに削除し、歪みを防ぐためにサイズを変更します。
コードの一部:
(1) 必要な解像度を満たしていない画像を削除する
for each_bmp in files:#遍历图片,进行筛选
each_bmp_root =os.path.join(dir,each_bmp)#得到每个图片路径
img = Image.open(each_bmp_root)#打开每个图片
width = img.size[0]#获取图像的宽
if width == 1570:#判断图片的宽为1570直接删除其本身及其label
if os.path.exists(each_bmp_root):
os.remove(each_bmp_root)
else:
print("The file does not exist")
lablename= each_bmp.split("/")[-1]
lablename = lablename.split(".")[0]
# print(each_bmp_root)
labelpath = os.path.join(mLabelPath,lablename)
print(labelpath+'.lines.json')
if os.path.exists(labelpath+'.lines.json'):
os.remove(labelpath+'.lines.json')#remove的用法 chmod +x *可执行权限问题
else:
print("The file does not exist")
print(each_bmp + ' ' + lablename+'.lines.json' + " deletefinished")
(2)リサイズ後の画像を保存
mPath = os.path.join(mSavePath, "20.jpg")#保存图片
img = cv.resize(img,(1280,720))
cv.imwrite(mPath,img) #openCV保存
mString += mPath + " "
mPath = os.path.join(mSavePath, "20.png")#保存标签
img_gray = cv.resize(img_gray,(1280,720))
cv.imwrite(mPath,img_gray)
3.4 問題解決
- サイズ変更方法はどのように選択すればよいですか?
(1) OpenCVパッケージのリサイズメソッドを使用する
画像のサイズ変更とは、高さまたは幅だけ、またはその両方の寸法を変更することを意味します。画像のサイズを比例的に変更することもできます。
構文:
関数プロトタイプ
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
パラメータ:
パラメータ | 説明 |
---|---|
送信元 | 【必須】オリジナル画像 |
サイズ | [必須] 出力画像の必要なサイズ |
FX | [オプション] 横軸に沿ったスケール係数 |
年度 | [オプション] 縦軸に沿ったスケール係数 |
補間 | [オプション] 補間方法 |
[オプション] 補間方法
多くの補間方法があります。
cv.インター | 補間法 |
---|---|
cv.INTER_NEAREST | 最近傍補間 |
cv.INTER_LINEAR | 双一次補間 |
cv.INTER_CUBIC | 双一次補間 |
cv.INTER_AREA | ピクセル領域の関係を使用したリサンプリング。モアレのない結果が得られるため、画像の間引きに最適な方法となります。ただし、画像をズームすると、INTER_NEARESTメソッドのようになります |
通常、ズームアウトには cv.INTER_AREA を使用し、スケーリングには cv.INTER_CUBIC (低速) と cv.INTER_LINEAR (より良い結果を得るために高速) を使用します。デフォルトでは、すべてのスケーリングで cv.INTER_LINEAR が使用されます。
(2) PILパッケージのリサイズメソッドを使用する
Pillow パッケージのサイズ変更関数のパラメーターには 4 つの補間方法があります。
PIL.イメージ関数 |
---|
ピル.イメージ.ニアレスト |
PIL.Image.BILINEAR |
PIL.Image.BICUBIC |
PIL.画像.アンチエイリアス |
画像を処理するときは、最初から最後まで画像処理モジュール (すべて OpenCv、または Pillow または matplotlib) を使用するようにします。OpenCv で画像を開いたり、画像をトリミングしたり、Pillow やその他の操作を使用したりしないことが最善です。予期しないエラーが発生します。
- vscodeでリモートサーバーに接続した際の操作ログを設定から見るにはどうすればよいですか?
次のパラメータを VSCode の設定ファイル settings.json に追加します。
"remote.SSH.showLoginTerminal": true,
実際にデータを処理する場合、一般にデータ量が比較的多いため、データが処理されたかどうか、切断時間などを確認するためにサーバーの切断を防ぐためにこの行を追加します。ブロガーは試していないため、必要ありません
- 削除関数は使用します
(1) ファイルを削除する
ファイルを削除するには、os モジュールをインポートし、os.remove() 関数を実行する必要があります。
eg:
import os
if os.path.exists("demofile.txt"):
os.remove("demofile.txt")
else:
print("This file no found!")
(2) フォルダを削除する
Remove 関数はフォルダーを直接削除できません。この関数を使用してフォルダーを削除すると、エラーが報告されます。
この関数は本質的にファイルを削除するわけではないため、remove はイテレーターのポインターを削除するために前方に移動し、削除されていない要素を配置するだけです。リンクされたリストの先頭にあり、新しいスーパーテール値を指す反復子を返します。Remove() 関数はメンバーではないため、リンクされたリストの長さを調整することはできません。Remove() 関数は実際の削除ではないため、要素を実際に削除するには、erase() 関数または Resize() 関数を使用できます。使用方法は次のとおりです。
eg:
string str1 = "Text with some spaces";
str1.erase(std::remove(str1.begin(), str1.end(), ' '), str1.end()); // "Textwithsomespaces"
フォルダー全体を削除するには、os.rmdir() メソッドを使用します。
eg:
#只能删除空文件夹
import os
os.rmdir("folder")
- サーバー側の実行エラー: 'path' という名前のモジュールがありません:
sudo apt install path
- サーバー側の実行エラー:「matplotlib」という名前のモジュールがありません:
pip install matplotlib
要約する
コードがローカル実験データテストに合格した後、サーバー側でデータ処理が実行され、20,000 枚の画像から 1570*660 の解像度が削除されます (約 6 分かかります)。フォーマットには約 65 分かかります。
参考リンク:
- labelme でマークされた画像と JSON ファイルのサイズを変更します。
- 画像とラベルの同時変更を含む、Pytorch データの強化
- 画像セグメンテーションにおけるデータセット処理の大きな落とし穴! !!
- Python は Image を使用して画像のサイズを変更し、保存します
- Python スクリプト - データセットの取得: 画像のクローリング、無効な画像の削除、統一された解像度、マークされた json と png の抽出
- Python 画像のサイズ変更() メソッドの概要
- Python-写真をバッチフィルターする-不要な画像を削除する
- ディープラーニング VOC データセット画像のサイズ変更
- OpenCV画像スケーリング・リサイズの各種補間方法の比較