H.264学习建议(zz)

本文档提供了H.264视频压缩标准的学习指南,分为三个阶段:基础知识准备、代码阅读理解及深入研究实践。建议初学者首先掌握核心概念与文献,随后结合测试模型深入代码,最终选定专题进行深入研究。
H.264学习建议(zz)
分三个阶段学习
1、第一个阶段:
学习H.264,首先要把最基本最必要的资料拿在手里。这些资料包括:标准文档+测试模型+经典文章,在本FTP中能找到。首先看 《H.264_MPEG-4 Part 10 White Paper》(本群的FTP中在“H.264相关论文"经典文章”目录中),看完之后再看《Video coding using the H.264 MPEG-4 AVC compression standard》(本群的FTP中在“H.264相关论文"经典文章”目录中)和《Halsted.Press.H.264.And.MPEG- 4.Video.Compression.Video.Coding.For.Next.Generation.Multimedia.eBook- LiB》(本群的FTP中在“H.264相关论文"经典文章”目录中,据说已经被翻译成中文,即本文最后提到的三本讲H264的中文书籍中的第一本),然 后可以抽空看《Overview of the H.264_AVC Video Coding Standard.pdf》(本群的FTP中在“H.264相关论文"经典文章”目录中)。这几篇文章看完后,你应该对H.264的整体框架有个比较深入 的了解了。前三篇文章可能需要花费你两~三周的时间(对于我这样的笨蛋好像是要这么长时间的。如果你碰巧用了比这个时间还长的时间,那并不说明你比我更 笨,只能说明你肯定天天陪MM聊天去了。呵呵~~~),最后一篇文章是《Overview and Introduction to the Fidelity Range Extensions》,该文的价值主要在于对H.264的第四个档次 high profile 做了介绍,前面的文章都没有涉及该档次。
2、第二阶段:
然后你就可以看代码了。这个时候你最常用的工具就是标准文档和测试模型(建议使用JM86)。看代码也有讲究。并不是像我开始那样看得那么仔 细,结果后来才知道远没有这个必要。正如peter李说的:看代码也要先从整体框架入手。先搞懂H.264的整体框架在代码里是怎么分布的,一个功能模块 的前伸模块和后继模块是什么。也就是搞清楚整个代码流程。这个阶段对标准文档的使用可能很少。如果你使用的测试模型是JM,那么有一个好处:JVT的会议 文件JVT-N008r1里面对编解码的所有参数做了详细介绍,这个文件对大家很有用处,建议大家找到它(本群的FTP中在“H.264其他资料”目录 里)。JVT-N008r1是这个文件的档案号,而该文件的标题是:H.264_MPEG-4 AVC Reference Software Manual
3、第三阶段:
然后你找到一个自己感兴趣的切入点,开始以此为中心研究这个问题。你研究问题的时候应该是联系测试模型来研究,这个时候你就需要仔细看代码中对 这个问题的实现了。这个阶段我绝对支持你一行行代码跟踪,一个参数一个参数地跟踪。而代码中不懂的地方可能需要查标准。这时你再来看标准文档就有了针对 性。也因为能将标准文档和代码对应起来,从而看标准文档也不觉得有太大困难,也能明白标准文档说的是什么问题,在测试模型中是如何通过代码实现的。在这个 阶段中,会牵连到很多H.264的相关知识,这样通过以点带线,以线带面。你会对H.264的内容认识越来越多。而你也就找到了自己的方向,最终走上了缔 造中国人的H.264的光辉大道,呵呵~~~
==========【注意事项】==========
1、切忌将代码和标准文档独立开看,否则,你的困难会很大(当然可能是因为我太笨了,对于“甜菜”的你可能无论怎样都能应用自如。呵呵~~~)。
2、对于刚开始接触H.264的人,切忌直接看代码和标准,哪怕是将标准和代码结合起来看,你也会不太顺利。换句话说:在没有了解H.264整体框架之前,你最好什么都不要做。
3、你千万不要觉得自己参加讨论,以及帮助别人找答案(当然是在你觉得别人问的问题你似曾相识的时候)是一个浪费时间的过程。因为你参加讨论,特别是你帮别人找答案的时候,很多你似是而非的问题却能够得到一个更深刻的认识。
4、学问,学问,即要问也要学。不要养成自己的依赖思想。其实你在自己查资料的过程中,也会学到很多东西。比如会知道某个问题在哪篇文章里能找到答案,或者收集到更多相关问题的有价值的文章……而且自己查到的到底比别人告诉的印象深刻。
5、读代码要讲究方法。码中有很多变量,不要一开始就去看头文件,想把里面所有变量都弄清楚是什么
直接从 main 函数开始读 c 文件就可以了。遇到不懂的变量再去查头文件,如果头文件里没有说明,自己又理解不了的问其他人——不要养成依赖性。
 
PS :我所知道的三本讲H264的中文书籍
1、《H.264和MPEG-4视频压缩》:欧阳合(我看的英文原版,翻译过来的应该也不错)
2、《新一代视频压缩编码标准—H.264/AVC》:毕厚杰(书中有较多错误,但仍然值得买,建议只做参考)
3、《小波编码与网络视频传输》:沈兰荪,卓力 (个人觉得不错,有关于 high profile 的介绍)

转载于:https://www.cnblogs.com/chio/archive/2008/10/13/1310372.html

修改上述错误import os import sys import time import glob import numpy as np import torch import utils import logging import argparse import torch.nn as nn import torch.utils import torch.nn.functional as F import torchvision.datasets as dset import torch.backends.cudnn as cudnn from torch.autograd import Variable from model_search import Network from architect import Architect parser = argparse.ArgumentParser("cifar") parser.add_argument('--data', type=str, default='/data/datasets/cifar-10', help='location of the data corpus') parser.add_argument('--set', type=str, default='cifar10', help='location of the data corpus') parser.add_argument('--batch_size', type=int, default=64, help='batch size') parser.add_argument('--learning_rate', type=float, default=0.025, help='init learning rate') parser.add_argument('--learning_rate_min', type=float, default=0.0, help='min learning rate') parser.add_argument('--momentum', type=float, default=0.9, help='momentum') parser.add_argument('--weight_decay', type=float, default=3e-4, help='weight decay') parser.add_argument('--report_freq', type=float, default=50, help='report frequency') parser.add_argument('--gpu', type=int, default=0, help='gpu device id') parser.add_argument('--epochs', type=int, default=80, help='num of training epochs') parser.add_argument('--init_channels', type=int, default=16, help='num of init channels') parser.add_argument('--layers', type=int, default=8, help='total number of layers') parser.add_argument('--model_path', type=str, default='saved_models', help='path to save the model') parser.add_argument('--cutout', action='store_true', default=False, help='use cutout') parser.add_argument('--cutout_length', type=int, default=16, help='cutout length') parser.add_argument('--drop_path_prob', type=float, default=0.3, help='drop path probability') parser.add_argument('--save', type=str, default='EXP', help='experiment name') parser.add_argument('--seed', type=int, default=2, help='random seed') parser.add_argument('--grad_clip', type=float, default=5, help='gradient clipping') parser.add_argument('--train_portion', type=float, default=0.5, help='portion of training data') parser.add_argument('--unrolled', action='store_true', default=False, help='use one-step unrolled validation loss') parser.add_argument('--arch_learning_rate', type=float, default=6e-4, help='learning rate for arch encoding') parser.add_argument('--arch_weight_decay', type=float, default=1e-3, help='weight decay for arch encoding') args = parser.parse_args() args.save = 'search-{}-{}'.format(args.save, time.strftime("%Y%m%d-%H%M%S")) utils.create_exp_dir(args.save, scripts_to_save=glob.glob('*.py')) log_format = '%(asctime)s %(message)s' logging.basicConfig(stream=sys.stdout, level=logging.INFO, format=log_format, datefmt='%m/%d %I:%M:%S %p') fh = logging.FileHandler(os.path.join(args.save, 'log.txt')) fh.setFormatter(logging.Formatter(log_format)) logging.getLogger().addHandler(fh) CIFAR_CLASSES = 10 if args.set=='cifar100': CIFAR_CLASSES = 100 def main(): if not torch.cuda.is_available(): logging.info('no gpu device available') sys.exit(1) np.random.seed(args.seed) torch.cuda.set_device(args.gpu) cudnn.benchmark = True torch.manual_seed(args.seed) cudnn.enabled=True torch.cuda.manual_seed(args.seed) logging.info('gpu device = %d' % args.gpu) logging.info("args = %s", args) criterion = nn.CrossEntropyLoss() criterion = criterion.cuda() model = Network(args.init_channels, CIFAR_CLASSES, args.layers, criterion) model = model.cuda() 'model = torch.nn.DataParallel(model, device_ids=[0, 1, 2])' logging.info("param size = %fMB", utils.count_parameters_in_MB(model)) optimizer = torch.optim.SGD( model.parameters(), args.learning_rate, momentum=args.momentum, weight_decay=args.weight_decay) arch_optimizer = torch.optim.Adam([model.alphas], lr=args.arch_learning_rate, betas=(0.9, 0.999), weight_decay=args.arch_weight_decay) train_transform, valid_transform = utils._data_transforms_cifar10(args) if args.set=='cifar100': train_data = dset.CIFAR100(root=args.data, train=True, download=True, transform=train_transform) else: train_data = dset.CIFAR10(root=args.data, train=True, download=True, transform=train_transform) num_train = len(train_data) indices = list(range(num_train)) split = int(np.floor(args.train_portion * num_train)) train_queue = torch.utils.data.DataLoader( train_data, batch_size=args.batch_size, sampler=torch.utils.data.sampler.SubsetRandomSampler(indices[:split]), pin_memory=True, num_workers=0) valid_queue = torch.utils.data.DataLoader( train_data, batch_size=args.batch_size, sampler=torch.utils.data.sampler.SubsetRandomSampler(indices[split:num_train]), pin_memory=True, num_workers=0) scheduler = torch.optim.lr_scheduler.CosineAnnealingLR( optimizer, float(args.epochs), eta_min=args.learning_rate_min) architect = Architect(model, args) for epoch in range(args.epochs): scheduler.step() lr = scheduler.get_lr()[0] logging.info('epoch %d lr %e', epoch, lr) alpha = model.alphas train_acc, train_obj, alpha_grad_sum, weight_grad_sum, zz_grad_sum = train( train_queue, valid_queue, model, architect, criterion, optimizer, lr, arch_optimizer) genotype = model.genotype(alpha_grad_sum) logging.info('genotype = %s', genotype) # training logging.info('train_acc %f', train_acc) # validation valid_acc, valid_obj = infer(valid_queue, model, criterion, epoch) logging.info('valid_acc %f', valid_acc) utils.save(model, os.path.join(args.save, 'weights.pt')) """ def train(train_queue, valid_queue, model, architect, criterion, optimizer, lr,epoch): objs = utils.AvgrageMeter() top1 = utils.AvgrageMeter() top5 = utils.AvgrageMeter() for step, (input, target) in enumerate(train_queue): model.train() n = input.size(0) input = Variable(input, requires_grad=False).cuda() target = Variable(target, requires_grad=False).cuda() input_search, target_search = next(iter(valid_queue)) input_search = Variable(input_search, requires_grad=False).cuda() target_search = Variable(target_search, requires_grad=False).cuda() if epoch>=15: architect.step(input, target, input_search, target_search, lr, optimizer, unrolled=args.unrolled) optimizer.zero_grad() logits = model(input) loss = criterion(logits, target) loss.backward() nn.utils.clip_grad_norm(model.parameters(), args.grad_clip) optimizer.step() prec1, prec5 = utils.accuracy(logits, target, topk=(1, 5)) objs.update(loss.item(), n) top1.update(prec1.item(), n) top5.update(prec5.item(), n) if step % args.report_freq == 0: logging.info('train %03d %e %f %f', step, objs.avg, top1.avg, top5.avg) return top1.avg, objs.avg """ def train(train_queue, valid_queue, model, architect, criterion, optimizer, lr, arch_optimizer): objs = utils.AvgrageMeter() top1 = utils.AvgrageMeter() top5 = utils.AvgrageMeter() Loss = utils.AvgrageMeter() arch_grads_sum = torch.zeros_like(model.alphas).cuda() weight_grads_sum = torch.zeros_like(model.weights).cuda() zz_grads_sum = torch.zeros_like(model.c).cuda() for step, (input, target) in enumerate(train_queue): model.train() n = input.size(0) input = input.cuda(non_blocking=True) target = target.cuda(non_blocking=True) if not args.single_level: try: input_search, target_search = next(valid_queue_iter) except: valid_queue_iter = iter(valid_queue) input_search, target_search = next(valid_queue_iter) input_search = input_search.cuda() target_search = target_search.cuda(non_blocking=True) arch_optimizer.zero_grad() logits = model(input_search) loss = criterion(logits, target_search) model.weights.retain_grad() Loss.update(loss.data.item(), n) loss.backward() sum_grad(model, arch_grads_sum, weight_grads_sum, zz_grads_sum) arch_optimizer.step() model.alphas.grad.zero_() model.weights.grad.zero_() optimizer.zero_grad() logits = model(input) loss = criterion(logits, target) model.weights.retain_grad() loss.backward() if args.single_level: sum_grad(model, arch_grads_sum, weight_grads_sum, zz_grads_sum) nn.utils.clip_grad_norm_(model.parameters(), args.grad_clip) optimizer.step() model.alphas.grad.zero_() model.weights.grad.zero_() prec1, prec5 = utils.accuracy(logits, target, topk=(1, 5)) objs.update(loss.data.item(), n) top1.update(prec1.data.item(), n) top5.update(prec5.data.item(), n) if step % args.report_freq == 0: logging.info('train %03d %e %f %f', step, objs.avg, top1.avg, top5.avg) return top1.avg, objs.avg, arch_grads_sum, weight_grads_sum, zz_grads_sum def infer(valid_queue, model, criterion, epoch): objs = utils.AvgrageMeter() top1 = utils.AvgrageMeter() top5 = utils.AvgrageMeter() model.eval() for step, (input, target) in enumerate(valid_queue): input = Variable(input, volatile=True).cuda() target = Variable(target, volatile=True).cuda() logits = model(input) loss = criterion(logits, target) prec1, prec5 = utils.accuracy(logits, target, topk=(1, 5)) n = input.size(0) objs.update(loss.item(), n) top1.update(prec1.item(), n) top5.update(prec5.item(), n) if step % args.report_freq == 0: logging.info('valid %03d %e %f %f', step, objs.avg, top1.avg, top5.avg) return top1.avg, objs.avg def sum_grad(model, arch_grads_sum, weight_grads_sum, zz_grads_sum): arch_grads_sum += torch.abs(model.alphas.grad) weight_grads_sum += torch.abs(model.weights.grad) zz_grads_sum += torch.abs(model.weights.grad - torch.sum(model.c.grad, dim=-1, keepdim=True)) if __name__ == '__main__': main()
05-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值