最近、labelImg でラベル付けされた画像ファイルをスクリーニングしたときに、トレーニングできないラベルのない画像が多数あることがわかりました。そのため、既存のラベル ファイル名に基づいて同じ名前の画像をフィルタリングするプログラムを作成しました。
'''
Description:
version: 1.0.0
Author: yuanruiyi
Date: Thu, 23 Feb 2023 09:57:00
LastEditors: yuanruiyi
LastEditTime: Thu, 23 Feb 2023 09:57:00
todo: 筛选图片中有对应标签文件名的图片
'''
# 使用方法:python fileFilter.py path1 path2 path3
# -path1 被筛选文件夹
# -path2 对照文件夹
# -path3 保存文件夹
import os
import glob
import sys
from rich.progress import track
import cv2
def dirlist(path, allfile):
filelist = os.listdir(path)
for filename in filelist:
filepath = os.path.join(path, filename)
if os.path.isdir(filepath):
dirlist(filepath, allfile)
else:
allfile.append(filepath)
return allfile
folderPath1 = sys.argv[1]
filePath1 = []
fileName1 = []
fileType1 = ""
dirlist(folderPath1, filePath1)
print("被筛选文件夹:" + folderPath1)
folderPath2 = sys.argv[2]
filePath2 = []
fileName2 = []
fileType2 = ""
dirlist(folderPath2, filePath2)
print("对照文件夹:" + folderPath2)
folderPath3 = sys.argv[3]
print("保存文件夹:" + folderPath3)
#遍历所有文件,获取文件名称(不含后缀)
for item in filePath1:
fileName1.append(os.path.basename(item).split('.')[0])
for item in filePath2:
fileName2.append(os.path.basename(item).split('.')[0])
##遍历被筛选文件夹,转存与对照文件夹中同名的文件
for item2 in track(fileName2):
for item1 in fileName1:
if item1 == item2:
path_in = str(folderPath1) + item1 +".jpg"
img = cv2.imread(str(path_in))
# 显示当前图片
# cv2.imshow("temp",img)
# cv2.waitKey(1)
path_out = str(folderPath3) + item1 + ".jpg"
print(path_out)
cv2.imwrite(path_out, img)
この関数の一般的なアイデアについては、この人のブログを参照してください: Filtering of Files with Duplicate Names
フィルタリング部分については、このブログの方法を参照してください:サフィックスなしのファイル名を取得する
注:通常の操作には、リッチ ライブラリと cv2 ライブラリをインストールする必要があります。
このブログ投稿が役に立った場合は、github ( fileFilter )にアクセスして小さな星を付けてください~