当前位置:网站首页>[deep learning] [original] let yolov6-0.1.0 support the txt reading dataset mode of yolov5
[deep learning] [original] let yolov6-0.1.0 support the txt reading dataset mode of yolov5
2022-07-05 16:29:00 【FL1623863129】
Meituan gave a yolov6 The framework looks very good at present , Because I didn't come out for long , Many are not perfect . Today, I specially trained my data set and found that this framework can only be placed according to this pattern :
custom_dataset
├── images
│ ├── train
│ │ ├── train0.jpg
│ │ └── train1.jpg
│ ├── val
│ │ ├── val0.jpg
│ │ └── val1.jpg
│ └── test
│ ├── test0.jpg
│ └── test1.jpg
└── labels
├── train
│ ├── train0.txt
│ └── train1.txt
├── val
│ ├── val0.txt
│ └── val1.txt
└── test
├── test0.txt
└── test1.txtAnd I prefer yolov5 The pattern of , Of course yolov5 It also supports the above placement mode .
images-
1.jpg
2.jpg
......
labels-
1.txt
2.txt
.......
Then put the split data set txt Inside
train.txt
/home/fut/data/images/1.jpg
/home/fut/data/images/2.jpg
....
val.txt
/home/fut/data/images/6.jpg
/home/fut/data/images/7.jpg
....
Configure in the configuration file :
train: myproj/config/train.txt
val: myproj/config/val.txt
nc: 2
# whether it is coco dataset, only coco dataset should be set to True.
is_coco: False
# class names
names: ['dog','cat']So you don't have to cut four folders at a time . Don't talk much, start changing the code , We turn on YOLOv6-0.1.0/yolov6/data/datasets.py modify
def get_imgs_labels(self, img_dir): This function loads the mode . Here is the modified complete code of this function
def get_imgs_labels(self, img_dir):
NUM_THREADS = min(8, os.cpu_count())
if os.path.isdir(img_dir):
valid_img_record = osp.join(
osp.dirname(img_dir), "." + osp.basename(img_dir) + ".json"
)
img_paths = glob.glob(osp.join(img_dir, "*"), recursive=True)
img_paths = sorted(
p for p in img_paths if p.split(".")[-1].lower() in IMG_FORMATS
)
assert img_paths, f"No images found in {img_dir}."
else:
with open(img_dir,'r') as f:
img_paths = f.read().rstrip('\n').split('\n')
valid_img_record = os.path.dirname(img_dir)+os.sep+'.'+osp.basename(img_dir)[:-4] + ".json"
img_hash = self.get_hash(img_paths)
if osp.exists(valid_img_record):
with open(valid_img_record, "r") as f:
cache_info = json.load(f)
if "image_hash" in cache_info and cache_info["image_hash"] == img_hash:
img_info = cache_info["information"]
else:
self.check_images = True
else:
self.check_images = True
# check images
if self.check_images and self.main_process:
img_info = {}
nc, msgs = 0, [] # number corrupt, messages
LOGGER.info(
f"{self.task}: Checking formats of images with {NUM_THREADS} process(es): "
)
with Pool(NUM_THREADS) as pool:
pbar = tqdm(
pool.imap(TrainValDataset.check_image, img_paths),
total=len(img_paths),
)
for img_path, shape_per_img, nc_per_img, msg in pbar:
if nc_per_img == 0: # not corrupted
img_info[img_path] = {"shape": shape_per_img}
nc += nc_per_img
if msg:
msgs.append(msg)
pbar.desc = f"{nc} image(s) corrupted"
pbar.close()
if msgs:
LOGGER.info("\n".join(msgs))
cache_info = {"information": img_info, "image_hash": img_hash}
# save valid image paths.
with open(valid_img_record, "w") as f:
json.dump(cache_info, f)
# # check and load anns
# label_dir = osp.join(
# osp.dirname(osp.dirname(img_dir)), "coco", osp.basename(img_dir)
# )
# assert osp.exists(label_dir), f"{label_dir} is an invalid directory path!"
img_paths = list(img_info.keys())
label_dir = os.path.dirname(img_paths[0]).replace('images', 'labels')
label_paths = sorted(
osp.join(label_dir, osp.splitext(osp.basename(p))[0] + ".txt")
for p in img_paths
)
label_hash = self.get_hash(label_paths)
if "label_hash" not in cache_info or cache_info["label_hash"] != label_hash:
self.check_labels = True
if self.check_labels:
cache_info["label_hash"] = label_hash
nm, nf, ne, nc, msgs = 0, 0, 0, 0, [] # number corrupt, messages
LOGGER.info(
f"{self.task}: Checking formats of labels with {NUM_THREADS} process(es): "
)
with Pool(NUM_THREADS) as pool:
pbar = pool.imap(
TrainValDataset.check_label_files, zip(img_paths, label_paths)
)
pbar = tqdm(pbar, total=len(label_paths)) if self.main_process else pbar
for (
img_path,
labels_per_file,
nc_per_file,
nm_per_file,
nf_per_file,
ne_per_file,
msg,
) in pbar:
if nc_per_file == 0:
img_info[img_path]["labels"] = labels_per_file
else:
img_info.pop(img_path)
nc += nc_per_file
nm += nm_per_file
nf += nf_per_file
ne += ne_per_file
if msg:
msgs.append(msg)
if self.main_process:
pbar.desc = f"{nf} label(s) found, {nm} label(s) missing, {ne} label(s) empty, {nc} invalid label files"
if self.main_process:
pbar.close()
with open(valid_img_record, "w") as f:
json.dump(cache_info, f)
if msgs:
LOGGER.info("\n".join(msgs))
if nf == 0:
LOGGER.warning(
f"WARNING: No labels found in {osp.dirname(self.img_paths[0])}. "
)
if self.task.lower() == "val":
if self.data_dict.get("is_coco", False): # use original json file when evaluating on coco dataset.
assert osp.exists(self.data_dict["anno_path"]), "Eval on coco dataset must provide valid path of the annotation file in config file: data/coco.yaml"
else:
assert (
self.class_names
), "Class names is required when converting labels to coco format for evaluating."
save_dir = osp.join(osp.dirname(osp.dirname(img_dir)), "annotations")
if not osp.exists(save_dir):
os.mkdir(save_dir)
save_path = osp.join(
save_dir, "instances_" + osp.basename(img_dir) + ".json"
)
TrainValDataset.generate_coco_format_labels(
img_info, self.class_names, save_path
)
img_paths, labels = list(
zip(
*[
(
img_path,
np.array(info["labels"], dtype=np.float32)
if info["labels"]
else np.zeros((0, 5), dtype=np.float32),
)
for img_path, info in img_info.items()
]
)
)
self.img_info = img_info
LOGGER.info(
f"{self.task}: Final numbers of valid images: {len(img_paths)}/ labels: {len(labels)}. "
)
return img_paths, labels
边栏推荐
- The visual experience has been comprehensively upgraded, and Howell group and Intel Evo 3.0 have jointly accelerated the reform of the PC industry
- 2020-2022 two-year anniversary of creation
- Single merchant v4.4 has the same original intention and strength!
- 抽象类中子类与父类
- 降本40%!Redis多租户集群的容器化实践
- What is the difference between EDI license and ICP business license
- 单商户 V4.4,初心未变,实力依旧!
- Single merchant v4.4 has the same original intention and strength!
- Flet教程之 11 Row组件在水平数组中显示其子项的控件 基础入门(教程含源码)
- Boost the development of digital economy and consolidate the base of digital talents - the digital talent competition was successfully held in Kunming
猜你喜欢

Starkware: to build ZK "universe"

单商户 V4.4,初心未变,实力依旧!

Research and development efficiency measurement index composition and efficiency measurement methodology

今日睡眠质量记录79分

Convert obj set to entity set

abstract关键字和哪些关键字会发生冲突呢

Win11提示无法安全下载软件怎么办?Win11无法安全下载软件

Domestic API management artifact used by the company

vant tabbar遮挡内容的解决方式

Parameter type setting error during batch update in project SQL
随机推荐
Migrate /home partition
Obj resolves to a set
降本40%!Redis多租户集群的容器化实践
Dare not buy thinking
不敢买的思考
怎样在电脑上设置路由器的WiFi密码
List uses stream flow to add according to the number of certain attributes of the element
Seaborn draws 11 histograms
Batch update in the project
Find the root of the following equation by chord cutting method, f (x) =x^3-5x^2+16x-80=0
Cs231n notes (top) - applicable to 0 Foundation
[echart] resize lodash 实现窗口缩放时图表自适应
Is it safe for Guotai Junan to open an account online
StarkWare:欲构建ZK“宇宙”
Exception com alibaba. fastjson. JSONException: not match : - =
Intel 13th generation Raptor Lake processor information exposure: more cores, larger cache
详解SQL中Groupings Sets 语句的功能和底层实现逻辑
EDI许可证和ICP经营性证有什么区别
给自己打打气
【漏洞预警】CVE-2022-26134 Confluence 远程代码执行漏洞POC验证与修复过程